From 36d9c48fd22c88c7e7966a909c7f064b1e07cc17 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 22:13:54 +0000 Subject: [PATCH] Update platform_web to 1.16.0 --- assets/AB.3bf5db93c75d99b70a26.js.map | 1 - ...99b70a26.js => AB.b42df031aa8d5bacdbad.js} | 1840 ++++++++++++++++- assets/AB.b42df031aa8d5bacdbad.js.map | 1 + ...0aa7e0c.js => app.1e08e19a0c513985b067.js} | 196 +- assets/app.1e08e19a0c513985b067.js.map | 1 + assets/app.65b73d1b748f10aa7e0c.js.map | 1 - assets/index.html | 2 +- ...b6a.js => runtime.6165dd87a822fe3fb1b3.js} | 4 +- ...ap => runtime.6165dd87a822fe3fb1b3.js.map} | 2 +- 9 files changed, 1978 insertions(+), 70 deletions(-) delete mode 100644 assets/AB.3bf5db93c75d99b70a26.js.map rename assets/{AB.3bf5db93c75d99b70a26.js => AB.b42df031aa8d5bacdbad.js} (98%) create mode 100644 assets/AB.b42df031aa8d5bacdbad.js.map rename assets/{app.65b73d1b748f10aa7e0c.js => app.1e08e19a0c513985b067.js} (99%) create mode 100644 assets/app.1e08e19a0c513985b067.js.map delete mode 100644 assets/app.65b73d1b748f10aa7e0c.js.map rename assets/{runtime.f6c897177cc61c448b6a.js => runtime.6165dd87a822fe3fb1b3.js} (99%) rename assets/{runtime.f6c897177cc61c448b6a.js.map => runtime.6165dd87a822fe3fb1b3.js.map} (99%) diff --git a/assets/AB.3bf5db93c75d99b70a26.js.map b/assets/AB.3bf5db93c75d99b70a26.js.map deleted file mode 100644 index 88210cb7..00000000 --- a/assets/AB.3bf5db93c75d99b70a26.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"AB.3bf5db93c75d99b70a26.js","mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvSiD;;AAE1B;AACK;AACI;AACI;AACW;AACM;AACc;AACtC;;AAE7B;AACA;AACA;AACyC;AACzC;;AAE8C;AAC9C;;AAEuC;;AAES;AAChD;;AAEwD;AACxD;;AAE8C;AAC9C;;AAE8C;AAC9C;;AAEqD;;AAET;AAC5C;;AAEgD;AACgC;AAChF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,8BAA8B;AACvD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B;AAC9B;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,wBAAwB,4DAAa;AACrC;AACA;;AAEA;AACA,oBAAoB,yDAAM;;AAE1B;AACA;AACA;AACA,qBAAqB,6DAAO;AAC5B,oBAAoB,gEAAM;AAC1B,0BAA0B,kEAAY;AACtC,qBAAqB,6DAAO;AAC5B,qBAAqB,6DAAO;AAC5B,oBAAoB,6DAAM;AAC1B;;AAEA;AACA,qBAAqB,uDAAO;;AAE5B;AACA,iCAAiC,iEAAa;AAC9C,iCAAiC,iEAAa;AAC9C,6BAA6B,kFAAS;AACtC,mCAAmC,yFAAe;;AAElD;AACA;AACA,sBAAsB;AACtB,2BAA2B;AAC3B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB,2DAAW;;AAEpC,wBAAwB,8DAAU;;AAElC;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,yBAAyB;AAC5F;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,oBAAoB,KAAK;AACzB;AACA,oBAAoB,KAAK;AACzB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;;AAEtB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,yBAAyB;AAC5F;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA,oBAAoB,SAAS;AAC7B;AACA,oBAAoB,iBAAiB;AACrC;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA,gCAAgC,iBAAiB;;AAEjD;AACA,UAAU,KAAK;AACf;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA,UAAU,OAAO;;AAEjB;AACA,UAAU,QAAQ,QAAQ;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA,qBAAqB;AACrB;AACA,6CAA6C;AAC7C;;AAEA;;AAEA;AACA,iBAAiB,6CAAM;AACvB,iBAAiB,6CAAM;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2BAA2B,6CAAM;AACjC,aAAa;;AAEb;AACA,UAAU;;AAEV;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA,4BAA4B,6CAAM;;AAElC;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ;AAC5B;AACA,qBAAqB;AACrB;AACA;AACA,mBAAmB,6CAAM;AACzB,UAAU;;AAEV;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ;AAC5B;AACA,qBAAqB;AACrB;AACA;AACA,mBAAmB,6CAAM;AACzB,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,wBAAwB,EAAE,wBAAwB;AAC3E;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf,kCAAkC,cAAc;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,mCAAmC,GAAG;AACtC,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf,kCAAkC,cAAc;AAChD;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,mCAAmC,GAAG;AACtC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,OAAO;AACrB,cAAc,MAAM;AACpB;AACA;AACA,MAAM,2DAAW;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,uDAAW;AACxB;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,gBAAgB,QAAQ;AACxB;AACA;AACA,aAAa,0DAAc;AAC3B;;AAEA;AACA;AACA,+BAA+B,iBAAiB,IAAI,mBAAmB;AACvE;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,aAAa,+CAAM;AACnB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,aAAa,mDAAO;AACpB;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA,oBAAoB,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,GAAG;AAClF;AACA;AACA;AACA;;AAEA;AACA,aAAa,mDAAO;AACpB;;AAEA;AACA,aAAa,qDAAS;AACtB;;AAEA;AACA,aAAa,kDAAM;AACnB;;AAEA;AACA,aAAa,uDAAW;AACxB;;AAEA;AACA,aAAa,mDAAO;AACpB;;AAEA;AACA,aAAa,oDAAQ;AACrB;;AAEA;AACA,aAAa,mDAAO;AACpB;;AAEA;AACA,aAAa,mDAAO;AACpB;;AAEA;AACA,aAAa,iDAAM;AACnB;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,aAAa,sDAAU;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,IAAI;AACvE;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wDAAwD,IAAI;AAC5D;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA,aAAa,sDAAU;AACvB;AACA;AACA,OAAO;AACP;;AAEA;AACA,aAAa,wDAAY;AACzB;AACA;;AAEA,iEAAe,SAAS,EAAC;;;;;;;;;;;;;;;;AC5jCzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,UAAU;AACV,OAAO;AACP,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ,CAAC,EAAC;;;;;;;;;;;ACzIF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,mBAAO,CAAC,sCAA2B;AACzD,gBAAgB,mBAAO,CAAC,kCAAuB;;AAE/C;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;AACA,UAAU,QAAQ;;AAElB;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA;AACA,UAAU,KAAK;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA,UAAU,KAAK;AACf;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;AACA;AACA;;AAEA;AACA,UAAU,MAAM;AAChB;AACA;AACA,yEAAyE;AACzE;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,cAAc,cAAc;AAC5B;;AAEA;AACA,UAAU,MAAM;AAChB;AACA;AACA,UAAU,MAAM;AAChB;AACA,UAAU,MAAM;AAChB;;AAEA;AACA;AACA;AACA,UAAU,IAAI;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,OAAO;AACjB,kBAAkB,WAAW;AAC7B;AACA,0BAA0B,OAAO;AACjC;;AAEA;AACA,UAAU,OAAO;AACjB,kBAAkB,aAAa;AAC/B;AACA,0BAA0B,SAAS;;AAEnC;AACA,UAAU,OAAO;AACjB,kBAAkB,kBAAkB;AACpC;AACA,0BAA0B,gBAAgB;AAC1C;;AAEA;AACA,UAAU,OAAO;AACjB,kBAAkB,qBAAqB;AACvC;AACA,0BAA0B,iBAAiB;AAC3C;;AAEA,yBAAyB,WAAW;AACpC;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,sBAAsB,QAAQ,oCAAoC,GAAG;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,QAAQ,oCAAoC,GAAG;AACxE;AACA;AACA,OAAO;AACP;AACA,UAAU,OAAO;AACjB,8BAA8B,aAAa;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,OAAO;;AAEP;AACA,UAAU,OAAO;AACjB,8BAA8B,aAAa;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,0BAA0B,QAAQ;AAClC,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe,SAAS;AACxB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,kCAAkC;AAC/D,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,UAAU;AACxB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gCAAgC,WAAW;AAC3C,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,cAAc,IAAI;AAClB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA,0CAA0C;AAC1C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,MAAM,EAAE,MAAM,EAAE,MAAM;AAC/D,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,mCAAmC;AACnC,cAAc,QAAQ;AACtB;AACA,cAAc,MAAM;AACpB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACx/BA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,mBAAO,CAAC,4CAAiC;AACrE,oBAAoB,mBAAO,CAAC,sCAA2B;;AAEvD;AACA;AACA;AACA,+BAA+B;AAC/B;;AAEA;AACA,UAAU;AACV,cAAc,aAAa;AAC3B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAO,CAAC,kCAAuB;;AAEjD;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;;AAEA;AACA,IAAI;AACJ;;AAEA;AACA,IAAI,OAAO;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,aAAa;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA,WAAW,IAAI;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,UAAU;AACV,iEAAiE;AACjE;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA,qBAAqB,iBAAiB;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA;AACA,UAAU,KAAK;AACf;;AAEA;AACA;AACA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA;AACA,UAAU,QAAQ;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAK;AACf;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU,MAAM;AAChB;;AAEA;AACA;AACA;AACA,UAAU,MAAM;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX,OAAO;AACP,UAAU,cAAc;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU,KAAK;AACf;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU,KAAK;AACf;AACA;;AAEA;AACA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA,mCAAmC,UAAU,IAAI,QAAQ,+BAA+B,2BAA2B;AACnH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;;AAEb;AACA,gBAAgB;AAChB,UAAU;AACV;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,UAAU,IAAI,QAAQ;AACvD;AACA,6CAA6C,8BAA8B;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,wBAAwB;AACtC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;;AAEvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA,oCAAoC,YAAY;AAChD;AACA;AACA;AACA;AACA;AACA,qCAAqC,6BAA6B;AAClE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,gBAAgB;;AAEhB;AACA,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;;AAEA,gBAAgB;;AAEhB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;;AAEA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,wDAAwD,OAAO;AAC/D;;AAEA;AACA;AACA;AACA,+BAA+B,GAAG,OAAO;AACzC;AACA;AACA,4BAA4B;AAC5B,yBAAyB;;AAEzB;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAA0C,SAAS;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,0CAA0C,SAAS;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,wCAAwC;AACxC;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qDAAqD;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kDAAkD;;AAElD;AACA;;AAEA;AACA,+BAA+B,+BAA+B,aAAa;;AAE3E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA,2BAA2B;AAC3B;AACA,2BAA2B;AAC3B;AACA,2BAA2B;AAC3B;AACA,2BAA2B;AAC3B;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gDAAgD,KAAK;AACrD,mDAAmD,KAAK;AACxD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA,aAAa,MAAM;AACnB;AACA,2BAA2B,QAAQ;AACnC,uBAAuB,MAAM;;AAE7B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,mCAAmC,GAAG,OAAO;AAC7C;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA,sCAAsC,GAAG,OAAO;AAChD;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C;AAC5C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,QAAQ,GAAG,OAAO;AAC5D,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA,6CAA6C,QAAQ,GAAG,OAAO;AAC/D,4BAA4B;AAC5B;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC;AACzC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;;AAEA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,gCAAgC;AAChC;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA;AACA,6BAA6B,MAAM;AACnC;AACA,mCAAmC,MAAM;AACzC;AACA,uBAAuB,OAAO;AAC9B,wBAAwB,OAAO;AAC/B,yBAAyB;AACzB;AACA,kBAAkB,eAAe,IAAI;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA,uBAAuB,aAAa,GAAG,aAAa;AACpD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,UAAU;AACV;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,qBAAqB,GAAG,wBAAwB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,mBAAmB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iDAAiD;AACjD,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,cAAc;AACd,0BAA0B;AAC1B;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;;AAEnC;AACA;AACA;AACA;;AAEA,oCAAoC;;AAEpC;;AAEA;;AAEA,+BAA+B,MAAM,kBAAkB,MAAM;AAC7D;;AAEA;AACA;AACA,iCAAiC,YAAY,kBAAkB,YAAY;AAC3E;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA,sCAAsC;;AAEtC;;AAEA;AACA,qCAAqC,MAAM;AAC3C;AACA;;AAEA,YAAY;;AAEZ;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA,UAAU;;AAEV;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oCAAoC,cAAc;;AAElD,QAAQ;;AAER;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAQ;AACR;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,2BAA2B,MAAM,GAAG,IAAI;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,MAAM,GAAG,QAAQ;AAC1D,mBAAmB;;AAEnB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,wEAAwE;AACxE;;AAEA;AACA;;AAEA;;AAEA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,uBAAuB;AACvB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B,WAAW;AACtC;AACA;AACA;AACA,aAAa;;AAEb,UAAU;;AAEV;AACA;AACA;;;;;;;;;;;AC76GA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf,yBAAyB,MAAM;AAC/B;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA;;AAEA,sBAAsB,mBAAO,CAAC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AACA;AACA;AACA,UAAU,OAAO;;AAEjB,uDAAuD;AACvD;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA,gBAAgB;AAChB,uBAAuB,SAAS;AAChC;AACA,qBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB;;AAErB;AACA,qBAAqB;;AAErB;AACA,qBAAqB;;AAErB;AACA,qBAAqB;;AAErB;AACA,qBAAqB;;AAErB;AACA;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA,cAAc,MAAM;AACpB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA,eAAe;AACf;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA,eAAe;AACf;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,yBAAyB,MAAM,OAAO,GAAG;AACzC,cAAc,UAAU;AACxB,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,GAAG;AAC7B;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA,wBAAwB,EAAE,GAAG;AAC7B;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,WAAW;AACzB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA,oDAAoD;AACpD;;AAEA;AACA,6CAA6C;AAC7C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,wCAAwC;AACxC;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,OAAO;AACrB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACxmCA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG,mBAAO,CAAC,iDAAsC;AACjD,GAAG,mBAAO,CAAC,mDAAwC;AACnD,GAAG,mBAAO,CAAC,iDAAsC;AACjD,GAAG,mBAAO,CAAC,+CAAoC;AAC/C,GAAG,mBAAO,CAAC,mDAAwC;AACnD,GAAG,mBAAO,CAAC,kDAAuC;AAClD,GAAG,mBAAO,CAAC,+CAAoC;AAC/C,GAAG,mBAAO,CAAC,+CAAoC;AAC/C,GAAG,mBAAO,CAAC,gDAAqC;AAChD,GAAG,mBAAO,CAAC,+CAAoC;AAC/C,GAAG,mBAAO,CAAC,+CAAqC;AAChD,GAAG,mBAAO,CAAC,+CAAoC;AAC/C,GAAG,mBAAO,CAAC,kDAAuC;AAClD,GAAG,mBAAO,CAAC,oDAAyC;AACpD,GAAG,mBAAO,CAAC,sDAA2C;AACtD,GAAG,mBAAO,CAAC,kDAAuC;AAClD,GAAG,mBAAO,CAAC,mDAAyC;AACpD,GAAG,mBAAO,CAAC,+CAAoC;AAC/C,GAAG,mBAAO,CAAC,kDAAuC;AAClD,GAAG,mBAAO,CAAC,sDAA2C;AACtD;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,YAAY,IAAI,WAAW,eAAe,YAAY;AACnH;AACA;AACA;AACA;AACA;;;;;;;;;;;AC7FA;;AAEA,gBAAgB,mBAAO,CAAC,kCAAuB;AAC/C,gBAAgB,mBAAO,CAAC,0BAAe;;AAEvC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,oDAAoD;AACpD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,QAAQ;AAC1B,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC9IA,kBAAkB,mBAAO,CAAC,kCAAuB;;AAEjD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,UAAU,IAAI,QAAQ,oCAAoC,EAAE;AACvF;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,qBAAqB,UAAU,IAAI,QAAQ;AAC3C;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA,gBAAgB,UAAU,GAAG,UAAU;AACvC;;AAEA;AACA;;AAEA,gBAAgB,UAAU;AAC1B;AACA;;;;;;;;;;;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,mBAAO,CAAC,kCAAuB;AAC/C;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,MAAM;AACpB,kEAAkE,WAAW;AAC7E;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,2BAA2B;AAC3B,4BAA4B;;AAE5B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,uCAAuC;AACvC,gBAAgB;AAChB;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,aAAa,GAAG,SAAS;AACxD,iCAAiC;AACjC,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,MAAM;AACpB,kEAAkE,WAAW;AAC7E;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;;;;;;;;;;;ACnPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA,WAAW,UAAU;;AAErB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B;AAC/B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,WAAW;AACX;;AAEA;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,0GAA0G,4BAA4B;AACtI;;AAEA;AACA,4GAA4G,4BAA4B;AACxI;AACA;;AAEA;AACA;AACA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA,iGAAiG,4BAA4B;;AAE7H;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA,0BAA0B,QAAQ,UAAU;AAC5C;;AAEA,6BAA6B,2BAA2B;AACxD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,MAAM;AACzB;AACA,mBAAmB,SAAS;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,cAAc;AAC7C,mBAAmB;;AAEnB;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,sBAAsB,UAAU;AAChC;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,wCAAwC,KAAK;AAC7C;AACA,wBAAwB,KAAK,GAAG,KAAK,OAAO,KAAK;AACjD,WAAW;AACX;AACA;AACA,kDAAkD,MAAM;AACxD;AACA;AACA;AACA,4BAA4B,KAAK,GAAG,KAAK,OAAO,KAAK;AACrD,4BAA4B,KAAK,GAAG,KAAK,OAAO,KAAK;AACrD;AACA,WAAW;AACX;AACA;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA,yCAAyC,KAAK,GAAG,KAAK,OAAO,KAAK;AAClE,yCAAyC,KAAK,GAAG,KAAK,OAAO,KAAK;AAClE;AACA,yCAAyC,KAAK,GAAG,KAAK,OAAO,KAAK;AAClE;AACA,WAAW;;AAEX,eAAe,cAAc;AAC7B,eAAe,KAAK;AACpB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,6BAA6B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,OAAO;AACP;;AAEA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;;AAEA;AACA;;AAEA;AACA,2CAA2C;;AAE3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC,cAAc;;AAE9C;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;;AAEA,eAAe;;AAEf,0BAA0B;AAC1B,WAAW;;AAEX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,cAAc;;AAE1C;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA,WAAW;AACX;AACA;AACA,WAAW;;AAEX;;AAEA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,aAAa;AACb;AACA;AACA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,8DAA8D;AAC9D;;AAEA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;;AAEA;AACA;AACA,gEAAgE,YAAY;AAC5E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,6BAA6B,KAAK,GAAG,KAAK,OAAO,KAAK;AACtD;AACA;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA,4BAA4B,aAAa;AACzC,4BAA4B,aAAa;AACzC;AACA,0BAA0B;AAC1B,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,KAAK,GAAG,KAAK,OAAO,KAAK;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,aAAa;AAC7B,gBAAgB,aAAa;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,YAAY;;AAEvB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,iEAAiE,GAAG;AACpE;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,aAAa;AAC7B,gBAAgB,aAAa;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,KAAK,GAAG,KAAK,OAAO,KAAK;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB;;AAEzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,oBAAoB;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,8CAA8C,KAAK;AACnD,sDAAsD,QAAQ;AAC9D,wDAAwD,aAAa;AACrE,oDAAoD,aAAa;AACjE;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,2CAA2C,KAAK;AAChD,mDAAmD,QAAQ;AAC3D,qDAAqD,aAAa;AAClE,iDAAiD,aAAa;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;;;;;;;;;;;ACz5CA,iBAAiB,mBAAO,CAAC,iCAAsB;AAC/C,mBAAmB,mBAAO,CAAC,mCAAwB;;AAEnD;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,aAAa,GAAG;;AAE5C;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA,qBAAqB,aAAa;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;;;;;;;;;;;AC/HA,oBAAoB,mBAAO,CAAC,oCAAyB;AACrD,2BAA2B,mBAAO,CAAC,2CAAgC;;AAEnE;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,aAAa,GAAG;;AAE5C;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAa;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;;;;;;;;;;ACxHA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc,mBAAO,CAAC,gCAAqB;AAC3C,gBAAgB,mBAAO,CAAC,kCAAuB;;AAE/C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA,wDAAwD;AACxD,UAAU,QAAQ;AAClB;AACA,sBAAsB,UAAU;;AAEhC;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA,UAAU,QAAQ;;AAElB;AACA;AACA;AACA,UAAU,MAAM;;AAEhB;AACA,UAAU;AACV,UAAU,MAAM;AAChB;AACA;;AAEA;AACA,UAAU,MAAM;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mDAAmD;AACnD,UAAU,QAAQ;AAClB,eAAe,SAAS,EAAE,UAAU;AACpC;AACA;AACA;AACA;;AAEA,mEAAmE;AACnE,UAAU,QAAQ;AAClB;AACA;AACA;;AAEA,+DAA+D;AAC/D,UAAU,QAAQ;AAClB;;AAEA;;AAEA;;AAEA;AACA,UAAU,MAAM;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAK;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,QAAQ;AAClB;AACA;AACA;;AAEA;AACA,UAAU,OAAO;AACjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,oBAAoB,UAAU,wCAAwC,GAAG;AACzE;AACA;AACA,wBAAwB,cAAc,gCAAgC;AACtE,aAAa;AACb;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,oBAAoB,UAAU,wCAAwC,GAAG;AACzE;AACA;AACA,wBAAwB,cAAc,gCAAgC;AACtE,aAAa;AACb;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB,6CAA6C,MAAM;AACnD,8BAA8B,OAAO;AACrC,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,gDAAgD;AAChD,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB,6CAA6C,MAAM;AACnD,8BAA8B,OAAO;AACrC,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,oBAAoB,UAAU,qCAAqC,GAAG;AACtE;AACA;AACA,wBAAwB,cAAc,gCAAgC;AACtE,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB,6CAA6C,MAAM;AACnD,8BAA8B,OAAO;AACrC,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,gDAAgD;AAChD,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,aAAa;;AAEzC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,mCAAmC,QAAQ;AAC3C;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,yCAAyC,QAAQ;AACjD;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,mCAAmC,QAAQ,GAAG,GAAG;AACjD;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,oCAAoC,QAAQ;AAC5C;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,iDAAiD,QAAQ;AACzD;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,mCAAmC,QAAQ;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,4BAA4B,OAAO;AACnC,YAAY,OAAO,UAAU,OAAO;AACpC,sCAAsC,GAAG,IAAI;;AAE7C;AACA;AACA,iDAAiD,iBAAiB;;AAElE;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,mBAAmB,EAAE,WAAW;AAChC;AACA;AACA;AACA;;AAEA,4BAA4B,OAAO;AACnC,YAAY,OAAO,UAAU,OAAO;AACpC,sCAAsC,GAAG,IAAI;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,iBAAiB;;AAElE;AACA;;AAEA;AACA;AACA,2BAA2B,UAAU,EAAE,SAAS;AAChD,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,2BAA2B,+CAA+C;AAC1E;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA,0BAA0B,MAAM;AAChC;AACA,gCAAgC,MAAM;AACtC;AACA,oBAAoB,OAAO;AAC3B,qBAAqB,OAAO;AAC5B,sBAAsB;AACtB;AACA,eAAe,eAAe,IAAI;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uHAAuH;AACvH;AACA,oBAAoB;AACpB;AACA,+CAA+C,MAAM;AACrD;;AAEA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5jCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,mBAAO,CAAC,iCAAsB;AAC7C,mBAAmB,mBAAO,CAAC,qCAA0B;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;;AAGF,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA,UAAU,OAAO;AACjB;;AAEA;AACA,UAAU,OAAO,IAAI,gBAAgB;AACrC;;AAEA;AACA,UAAU,OAAO,GAAG,iBAAiB;AACrC;;AAEA;AACA,UAAU,OAAO,GAAG,UAAU;AAC9B;;AAEA;AACA,UAAU,OAAO,IAAI,eAAe;AACpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,2BAA2B;AAC3B,WAAW;AACX;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA,6CAA6C;;AAE7C;AACA;AACA;AACA,UAAU,OAAO,IAAI,aAAa,IAAI;AACtC;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA,sBAAsB,YAAY;;AAElC;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;AACA,iCAAiC;;AAEjC;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA,qCAAqC,kBAAkB;AACvD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,0CAA0C,WAAW;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA,sCAAsC;AACtC;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,4BAA4B,SAAS;AACrC,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW;AACX;AACA;;AAEA;AACA,UAAU,OAAO;AACjB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,8DAA8D,aAAa;AAC3E;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA,+EAA+E,8BAA8B;AAC7G;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;;AAEA;;AAEA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA,gDAAgD;AAChD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,aAAa,GAAG;;AAE5C;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC3qBA;;AAEA,gBAAgB,mBAAO,CAAC,kCAAuB;AAC/C,gBAAgB,mBAAO,CAAC,0BAAe;;AAEvC,gCAAgC,mBAAO,CAAC,8DAAmD;;AAE3F;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,uBAAuB,UAAU,iDAAiD,IAAI;AACtF,oBAAoB;AACpB;AACA;AACA;AACA,OAAO;;AAEP;;AAEA,oCAAoC;AACpC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,6XAA6X,QAAQ;AACrY;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B,kBAAkB,SAAS;AAC3B,eAAe;AACf,oBAAoB,QAAQ;AAC5B,sBAAsB,QAAQ;AAC9B,sBAAsB,QAAQ;AAC9B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,kBAAkB;AACpC,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B,cAAc,YAAY;AAC1B,cAAc,MAAM;AACpB,eAAe;AACf,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,IAAI;AACrB;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB;AAClB;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3nBA;;AAEA,gBAAgB,mBAAO,CAAC,kCAAuB;AAC/C,gBAAgB,mBAAO,CAAC,0BAAe;;AAEvC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oCAAoC;AACpC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AAC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;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,uBAAuB;AACvB;AACA;AACA,0BAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA,8BAA8B;AAC9B,UAAU;;AAEV;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;;AAEA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+CAA+C;AAC/C;AACA,cAAc;AACd;;AAEA;;AAEA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA,iDAAiD;;AAEjD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,OAAO,cAAc,GAAG;AAC9C,uBAAuB,OAAO;AAC9B,uBAAuB,GAAG;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,sBAAsB,OAAO,QAAQ,GAAG;AACxC,uBAAuB,OAAO;AAC9B,uBAAuB,GAAG;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,6BAA6B,MAAM,GAAG,IAAI;AAC1C,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,qBAAqB,UAAU;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,eAAe,GAAG,QAAQ;;AAEjD;AACA;AACA;;AAEA;AACA,cAAc;AACd,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA,kBAAkB;AAClB,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,eAAe,GAAG,QAAQ;;AAEjD,4BAA4B;AAC5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;;AAEA;;AAEA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC/9CA,oBAAoB,mBAAO,CAAC,oCAAyB;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,uBAAuB;AACvB;AACA;AACA,wBAAwB;;AAExB;AACA;;AAEA;AACA;AACA;AACA,8BAA8B;AAC9B,UAAU;;AAEV;AACA;AACA;AACA,qBAAqB,MAAM;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA,kDAAkD;;AAElD;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B,OAAO,cAAc,GAAG;AACpD,6BAA6B,OAAO;AACpC,6BAA6B,GAAG;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,4BAA4B,OAAO,QAAQ,GAAG;AAC9C,6BAA6B,OAAO;AACpC,6BAA6B,GAAG;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,mCAAmC,MAAM,GAAG,IAAI;AAChD,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3yBA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA,WAAW,wCAAwC;AACnD,WAAW,4CAA4C;AACvD,WAAW,2CAA2C;AACtD,WAAW,2CAA2C;AACtD,WAAW,yCAAyC;AACpD,WAAW,2CAA2C;AACtD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;;;;;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACjHA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC;AAChC;;AAEA;AACA;AACA,sCAAsC;;AAEtC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;;AAE5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;;AAE5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;;AAE5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,OAAO,GAAG,SAAS;AAC3C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,SAAS;AACvB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,gBAAgB;;AAE/C;AACA,uBAAuB,sBAAsB,GAAG,aAAa;AAC7D;;AAEA;AACA;AACA,kCAAkC,UAAU,IAAI;AAChD;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,yBAAyB,OAAO;;AAEhC;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA,gCAAgC,WAAW,IAAI;AAC/C;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA,mCAAmC,UAAU,IAAI;AACjD;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;;;;;;;;;;;ACrVA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,QAAQ;AACf;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;;;;;;;;;;;AChKA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc,mBAAO,CAAC,8CAAmC;;AAEzD;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,0BAA0B,0BAA0B,GAAG,6BAA6B;AACpF;AACA,IAAI;AACJ,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO,MAAM;AACb;AACA;;AAEA;AACA,OAAO,SAAS;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,UAAU;AACjB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,WAAW,EAAE;AAC9C;AACA;AACA,mBAAmB,SAAS,GAAG,8CAA8C;AAC7E,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW,IAAI,QAAQ,8BAA8B,yBAAyB;AAC1G;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,cAAc;AAC7B;AACA;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA;AACA,4BAA4B,WAAW,IAAI,QAAQ,8BAA8B,yBAAyB;AAC1G;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,GAAG;AACjB,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,0BAA0B,iBAAiB,GAAG,oBAAoB;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB,GAAG,0BAA0B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;AACA,eAAe;AACf;AACA,yCAAyC;AACzC;AACA;AACA;AACA;;AAEA,0BAA0B,uBAAuB,GAAG,0BAA0B;;AAE9E;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACpcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAO,CAAC,qCAA0B;;AAEpD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,YAAY,OAAO;;AAEnB;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,yCAAyC;AACzC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA,0BAA0B,+BAA+B,GAAG,gBAAgB;;AAE5E;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,iBAAiB,IAAI,WAAW;AACzD;AACA;AACA;AACA;;;;;;;;;;;ACpWA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,sBAAsB;AACtB,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,6BAA6B,EAAE,OAAO,EAAE,OAAO,EAAE;;AAEjD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,GAAG,KAAK,EAAE;AAC9D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,GAAG,KAAK,EAAE;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,GAAG,KAAK,EAAE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,EAAE;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,EAAE;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,EAAE;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,EAAE;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,EAAE;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,EAAE;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,EAAE;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,EAAE;AACxD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE;;;;;;;;;;;AC5bnD;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,mBAAO,CAAC,8BAAmB;;AAEnD;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA6B,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;;AAE5E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,gBAAgB,YAAY,EAAE,WAAW;AACzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,MAAM;AACpB,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB;AACpB,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;;;;;;;;;;;AC7N1D;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;AACA;AACA,8BAA8B,wBAAwB,6BAA6B,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,iCAAiC,GAAG;;AAE/J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxIA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,oBAAoB,QAAQ;AAC5B;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO,gBAAgB,QAAQ;AAC9C;AACA;AACA,0BAA0B,+BAA+B,GAAG,gBAAgB;;AAE5E;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,oBAAoB,QAAQ;AAC5B;AACA,8DAA8D;AAC9D,cAAc,KAAK;AACnB;AACA;AACA,mCAAmC;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,uDAAuD,QAAQ;;AAE/D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC7RA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzIA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA,UAAU,6BAA6B;AACvC,cAAc,QAAQ;AACtB,gBAAgB,QAAQ;AACxB,eAAe,QAAQ;AACvB,wBAAwB,KAAK;;AAE7B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,UAAU;AACtC,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA,+BAA+B;AAC/B;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;;;;;;;;;;;AC5QA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;;AAEA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,iBAAiB;AAC1D;AACA;AACA;AACA;;;;;;;;;;;ACzMA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc;;AAEd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,8BAA8B;AACzC;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,WAAW,8BAA8B;AACzC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,EAAE;AAC5D;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,EAAE;AACzD;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP,gBAAgB,QAAQ,EAAE,QAAQ,EAAE,QAAQ;AAC5C;;AAEA,kCAAkC;AAClC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,MAAM;AACpC;AACA,aAAa;AACb,WAAW;AACX,QAAQ;AACR;AACA;;AAEA;AACA,sBAAsB,aAAa,EAAE,aAAa;;AAElD;AACA;AACA;AACA,sBAAsB,yBAAyB,EAAE,WAAW;AAC5D;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;;;;;;;;;;ACtYA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA,QAAQ;;AAER;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,KAAK;AACrD;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAA0C,GAAG;AAC7C;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtMA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,QAAQ;AACf;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;;AAEA;AACA;;AAEA,yBAAyB,IAAI,GAAG;AAChC;AACA;AACA,2CAA2C,EAAE;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,kCAAkC,2BAA2B;AAC7D;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;;AAEJ;AACA;;AAEA;AACA;AACA;AACA,WAAW,WAAW;AACtB,WAAW,QAAQ;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,YAAY;AACnC;AACA;AACA,OAAO;AACP;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA,OAAO;AACP;AACA;AACA,sBAAsB,YAAY;AAClC;AACA;AACA,OAAO;AACP;AACA;AACA,uBAAuB,YAAY;AACnC;AACA;AACA,OAAO;AACP;AACA;AACA,2BAA2B,YAAY;AACvC;AACA;AACA,OAAO;AACP;AACA;AACA,4BAA4B,YAAY;AACxC;AACA;AACA,OAAO;AACP;AACA;AACA,yBAAyB,YAAY;AACrC;AACA;AACA,OAAO;AACP;AACA;AACA,+BAA+B,YAAY;AAC3C;AACA;AACA,OAAO;AACP;AACA;AACA,+BAA+B,YAAY;AAC3C;AACA;AACA,OAAO;AACP;AACA;AACA,0BAA0B,YAAY;AACtC;AACA;AACA,OAAO;AACP;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA,OAAO;AACP;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA,OAAO;AACP;AACA;AACA,6BAA6B,YAAY;AACzC;AACA;AACA,OAAO;AACP,QAAQ,uEAAuE;AAC/E;AACA;AACA,gCAAgC,eAAe;AAC/C;AACA;AACA,OAAO;AACP;AACA;AACA,uCAAuC,YAAY;AACnD;AACA;AACA,OAAO;AACP;AACA;AACA,yCAAyC,YAAY;AACrD;AACA;AACA,OAAO;AACP;AACA;AACA,6BAA6B,YAAY;AACzC;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,eAAe;AAC9B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B;AAC3B,8BAA8B,IAAI;AAClC,mCAAmC,IAAI;AACvC,4BAA4B;AAC5B;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC7tBA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,mBAAO,CAAC,yDAA8C;;AAEjF;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1JA;AACA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,mBAAO,CAAC,qDAA0C;;AAEzE;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO,QAAQ;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACvIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,mBAAO,CAAC,+CAAoC;AACjE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM;AACb;AACA;AACA;;AAEA;AACA,OAAO,MAAM;AACb;AACA;;AAEA;AACA,OAAO,MAAM;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,0BAA0B;AAC1B,WAAW;;AAEX;AACA;;AAEA,0BAA0B;AAC1B,UAAU,KAAK;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,SAAS;AACnB;;AAEA;AACA,UAAU,OAAO;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,MAAM;AAChB;AACA;;AAEA;AACA;AACA;AACA,UAAU,MAAM;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,sBAAsB,sBAAsB,IAAI,oBAAoB,UAAU,UAAU,IAAI,QAAQ,+BAA+B,GAAG;AACtI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,eAAe;AACf,yBAAyB,MAAM;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,cAAc,SAAS;AACvB;AACA,eAAe,SAAS;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACzdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,qCAA0B;;AAElD;AACA,2BAA2B,QAAQ;AACnC,gCAAgC,QAAQ;AACxC,yBAAyB,QAAQ;AACjC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,cAAc,sBAAsB;AACpC,eAAe;AACf;AACA;AACA;AACA;AACA,WAAW,wBAAwB;AACnC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,2BAA2B;AAC3B,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAU,KAAK;AACf;;AAEA;AACA;;AAEA;AACA,UAAU,KAAK;AACf,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,8BAA8B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,0BAA0B,QAAQ;AAClC,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,WAAW;AACX;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,wDAAwD,SAAS;AACjE;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,SAAS;AACpF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B,WAAW,IAAI,QAAQ;AACjD;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,cAAc,SAAS;AACvB;AACA,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB,kBAAkB,aAAa;AAC/B;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,eAAe;AACf,kBAAkB,MAAM;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,cAAc,KAAK;AACnB;AACA,qCAAqC;AACrC;AACA,eAAe;AACf;AACA;AACA,wCAAwC;AACxC;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,cAAc,KAAK;AACnB;AACA,qCAAqC;AACrC;AACA,8BAA8B;AAC9B;AACA,eAAe;AACf;AACA;AACA,uCAAuC;AACvC;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,YAAY,UAAU,2BAA2B;;AAEhE,+CAA+C,cAAc;AAC7D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,qBAAqB;;AAEzE;AACA;AACA;AACA;AACA;AACA,+CAA+C,KAAK;AACpD;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB;AACzB;AACA,gBAAgB;AAChB;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;;;;;;;;;;;ACj9BA,qBAAqB,mBAAO,CAAC,+CAAoC;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA6B,QAAQ;AACrC,wBAAwB,QAAQ;AAChC,2BAA2B,QAAQ;AACnC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzDA,qBAAqB,mBAAO,CAAC,+CAAoC;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,QAAQ;;AAEf;AACA,OAAO,QAAQ;;AAEf;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrHA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;;AAEA;AACA,+BAA+B,QAAQ;AACvC,+BAA+B,QAAQ;AACvC,6BAA6B,QAAQ;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC7BA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC,wBAAwB,QAAQ;AAChC,4BAA4B,QAAQ;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxDA,qBAAqB,mBAAO,CAAC,+CAAoC;;AAEjE,qBAAqB,mBAAO,CAAC,qDAA2C;AACxE,qBAAqB,mBAAO,CAAC,sDAA2C;;AAExE;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA,mBAAmB,KAAK;AACxB,oBAAoB,OAAO;AAC3B,iBAAiB;AACjB;AACA;AACA;AACA;AACA,mBAAmB,KAAK;AACxB,iBAAiB;AACjB;AACA;AACA,OAAO;AACP;;AAEA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA,mBAAmB,KAAK;AACxB,oBAAoB,OAAO;AAC3B,iBAAiB;AACjB;AACA;AACA,eAAe;AACf,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA,0CAA0C,2BAA2B;AACrE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,kBAAkB;AAC1E;AACA;AACA;;AAEA,uCAAuC,2BAA2B;AAClE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mCAAmC,2BAA2B;AAC9D;AACA;;;;;;;;;;;AChQA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;;AAEA;AACA;AACA,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9BA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC,yBAAyB,QAAQ;AACjC,+BAA+B,QAAQ;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACnCA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;;AAEA;AACA,+BAA+B,QAAQ;AACvC,yBAAyB,QAAQ;AACjC,kCAAkC,QAAQ;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACnCA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;;AAEA;AACA,4BAA4B,QAAQ;AACpC,yBAAyB,QAAQ;AACjC,0BAA0B,QAAQ;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACjCA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;;AAEA;AACA;AACA,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9BA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;;AAEA;AACA;AACA,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AChCA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;;AAEA;AACA;AACA,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9BA,qBAAqB,mBAAO,CAAC,+CAAoC;;AAEjE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1DA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;;AAEA;AACA,gCAAgC,QAAQ;AACxC,wBAAwB,QAAQ;AAChC,2BAA2B,QAAQ;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACnEA,+BAA+B,mBAAO,CAAC,yDAA8C;;AAErF;;AAEA;AACA,oCAAoC,QAAQ;AAC5C,2BAA2B,QAAQ;AACnC,6BAA6B,QAAQ;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC3BA,qCAAqC,mBAAO,CAAC,+DAAoD;;AAEjG;AACA;AACA;;AAEA;AACA,qCAAqC,QAAQ;AAC7C,wBAAwB,QAAQ;AAChC,mCAAmC,QAAQ;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC/BA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;;AAEA;AACA,mCAAmC,QAAQ;AAC3C,wBAAwB,QAAQ;AAChC,iCAAiC,QAAQ;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC/BA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC,yBAAyB,QAAQ;AACjC,4BAA4B,QAAQ;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9CA,qBAAqB,mBAAO,CAAC,+CAAoC;;AAEjE;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,QAAQ;AACpC,qBAAqB,QAAQ;AAC7B,0BAA0B,QAAQ;AAClC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,gCAAgC;;AAEhC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzGA,qBAAqB,mBAAO,CAAC,+CAAoC;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC,wBAAwB,QAAQ;AAChC,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzDA,qBAAqB,mBAAO,CAAC,+CAAoC;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,QAAQ;AACvC,yBAAyB,QAAQ;AACjC,6BAA6B,QAAQ;AACrC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,mBAAO,CAAC,wDAA6C;;AAElF;AACA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA,OAAO,QAAQ;AACf;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;;;;;;;;;;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAO,CAAC,qCAA0B;;AAEpD;AACA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,oCAAoC;AACpC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC9JA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG,mBAAO,CAAC,sDAA2C;AACtD,GAAG,mBAAO,CAAC,kEAAwD;AACnE,GAAG,mBAAO,CAAC,4DAAiD;AAC5D,GAAG,mBAAO,CAAC,8DAAmD;AAC9D,GAAG,mBAAO,CAAC,uFAA4E;AACvF,GAAG,mBAAO,CAAC,8EAAoE;AAC/E,GAAG,mBAAO,CAAC,mFAAwE;AACnF,GAAG,mBAAO,CAAC,iFAAsE;AACjF,GAAG,mBAAO,CAAC,gEAAsD;AACjE,GAAG,mBAAO,CAAC,uEAA4D;AACvE,GAAG,mBAAO,CAAC,0EAA+D;AAC1E,GAAG,mBAAO,CAAC,mEAAwD;AACnE,GAAG,mBAAO,CAAC,iFAAsE;AACjF,GAAG,mBAAO,CAAC,iEAAsD;AACjE,GAAG,mBAAO,CAAC,2DAAgD;AAC3D,GAAG,mBAAO,CAAC,kEAAwD;AACnE,GAAG,mBAAO,CAAC,mEAAwD;AACnE,GAAG,mBAAO,CAAC,8DAAoD;AAC/D,GAAG,mBAAO,CAAC,0DAA+C;AAC1D,GAAG,mBAAO,CAAC,mEAAwD;AACnE,GAAG,mBAAO,CAAC,+DAAoD;AAC/D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,IAAI;;AAEJ;AACA;AACA,IAAI;;AAEJ;AACA;AACA,IAAI;;AAEJ;AACA;AACA,IAAI;;AAEJ;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAI;AACJ;;;;;;;;;;;ACxIA,gBAAgB,mBAAO,CAAC,wCAA6B;;AAErD;AACA;AACA;;AAEA,yCAAyC;AACzC,UAAU,KAAK;AACf;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU,WAAW;AACrB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB,cAAc;AAC9D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA,oCAAoC;AACpC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,eAAe;AAC7B;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,+BAA+B,UAAU,IAAI,IAAI;AACjD,mBAAmB;AACnB;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA,QAAQ,IAAI,kBAAkB;AAC9B;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,QAAQ,yBAAyB,MAAM;AACtD;AACA;AACA;;AAEA;AACA;AACA;AACA,uEAAuE,eAAe;AACtF;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC,iCAAiC;AAClE,6BAA6B,mBAAmB;AAChD;AACA;;AAEA;AACA;AACA;AACA;AACA,4EAA4E,eAAe;AAC3F;AACA,yCAAyC,YAAY;AACrD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,gFAAgF,IAAI;AACpF;AACA,+CAA+C,YAAY;AAC3D;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,OAAO;AACrB;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChfA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe;AACf;;AAEA;AACA,aAAa;AACb;AACA;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxGA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;AACA;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpJA;AACA,qDAAqD;AACrD,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC7IA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChKA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtKA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACvKA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChKA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA,uBAAuB,WAAW;AAClC;AACA,6CAA6C;AAC7C;AACA,cAAc,mCAAmC;AACjD;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA,UAAU;AACV;AACA;AACA;;;;;;;;;;;AC3EA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA,uBAAuB,WAAW;AAClC;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA,cAAc,mCAAmC;AACjD;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClKA;AACA,qDAAqD;AACrD,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB,WAAW;AAC9B;AACA;AACA;;;;;;;;;;;ACjEA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,sBAAsB,WAAW;AACjC;AACA;AACA,yBAAyB,mBAAmB;AAC5C;AACA;AACA,aAAa;AACb;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACjKA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF,oBAAoB,mBAAO,CAAC,gDAAqC;;AAEjE;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChJA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,OAAO;;AAEP;AACA,8BAA8B,eAAe,SAAS,WAAW,0CAA0C,IAAI;AAC/G;AACA;AACA,0CAA0C,2BAA2B;AACrE;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,sBAAsB,WAAW;AACjC;AACA,UAAU;;AAEV;AACA;AACA,uBAAuB,QAAQ,GAAG,KAAK;AACvC,yBAAyB,WAAW,gBAAgB,QAAQ;AAC5D;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ,GAAG,sBAAsB;AACrD,oBAAoB,QAAQ;AAC5B,sBAAsB,WAAW;AACjC;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,oBAAoB,kBAAkB;AACtC,2CAA2C,UAAU;AACrD;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B,kBAAkB,SAAS;AAC3B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B,kBAAkB,SAAS;AAC3B,eAAe;AACf,oBAAoB,QAAQ;AAC5B,sBAAsB,QAAQ;AAC9B,sBAAsB,QAAQ;AAC9B,oBAAoB,QAAQ;AAC5B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B,kBAAkB,SAAS;AAC3B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACpbA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF,oBAAoB,mBAAO,CAAC,wDAA6C;;AAEzE;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA,mBAAmB,KAAK;AACxB,sBAAsB,WAAW;AACjC,2BAA2B,KAAK;AAChC;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,KAAK;;AAErC;AACA;AACA,oBAAoB,KAAK;AACzB,sBAAsB,WAAW;AACjC;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACzGA;AACA,qDAAqD;AACrD,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,sBAAsB,WAAW;AACjC,UAAU;AACV;AACA;AACA;;;;;;;;;;;ACjFA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,WAAW,IAAI,WAAW;AACnD;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC3FA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe;AACf;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC3EA;AACA,qDAAqD;AACrD,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,KAAK,GAAG,SAAS;AAC3C,4BAA4B,WAAW,IAAI,aAAa,IAAI,YAAY;AACxE;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA,uBAAuB,KAAK;AAC5B,yBAAyB,WAAW,IAAI,aAAa;AACrD;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA,2EAA2E,QAAQ,6CAA6C,cAAc;AAC9I;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC9MA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,oBAAoB,GAAG,sBAAsB;AAC3E,QAAQ;AACR;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B,8BAA8B,GAAG,6BAA6B;AAC5F;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK;AAC5E;AACA;;;;;;;;;;;ACtKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,mBAAO,CAAC,qCAA0B;AAClD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,UAAU;AACV,sBAAsB,UAAU;AAChC;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,4EAA4E,cAAc;AAC1F;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,UAAU;AACnC;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA,iCAAiC,QAAQ;;AAEzC;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA,iBAAiB,gBAAgB,mBAAmB;AACpD;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACjLA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,sCAA2B;AAChD,kBAAkB,mBAAO,CAAC,yBAAc;AACxC,IAAI,OAAO,IAAI,SAAS;AACxB;AACA,iDAAiD,SAAS;AAC1D,WAAW,SAAS,0BAA0B,OAAO;;AAErD;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,mBAAO,CAAC,+CAAqC;AAC9D;;AAEA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,kBAAkB;AAChC;AACA,cAAc,WAAW;AACzB;AACA,eAAe,MAAM;AACrB;AACA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,sCAA2B;;AAEhD;AACA;AACA;AACA,eAAe,mBAAO,CAAC,0CAA+B;AACtD;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,mBAAO,CAAC,+CAAoC;AAC7D,eAAe,mBAAO,CAAC,0CAA+B;AACtD,gBAAgB,mBAAO,CAAC,0CAAgC;;AAExD;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,mBAAO,CAAC,6CAAmC;AAChE,sBAAsB,mBAAO,CAAC,+CAAoC;AAClE,oBAAoB,mBAAO,CAAC,6CAAkC;;AAE9D;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mBAAO,CAAC,yBAAc;;AAErD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mBAAO,CAAC,yBAAc;;AAErD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC;;AAEjC;;;;;;;;;;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,mBAAO,CAAC,6CAAkC;;AAE9D;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,sCAA2B;AAChD;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG,mBAAO,CAAC,8CAAmC;AAC9C,GAAG,mBAAO,CAAC,6CAAmC;AAC9C,GAAG,mBAAO,CAAC,6CAAkC;AAC7C;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,sCAA2B;AAChD,gBAAgB,mBAAO,CAAC,wBAAc;AACtC,IAAI,OAAO,IAAI,SAAS;AACxB;AACA,qDAAqD,SAAS;AAC9D,WAAW,SAAS;;AAEpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,sCAA2B;AAChD;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,QAAQ;AACR;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,sCAA2B;;AAEhD;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,GAAG,GAAG,yCAAyC;AAChE,mBAAmB,MAAM,IAAI,yCAAyC;AACtE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrFA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA,iCAAiC,QAAQ;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACnEA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE,qBAAqB,mBAAO,CAAC,qDAA2C;;AAExE;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,MAAM;AACN;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,QAAQ,GAAG,WAAW;AAC7B;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA,yBAAyB,KAAK;AAC9B,0BAA0B,OAAO;AACjC,uBAAuB;AACvB;AACA;AACA;AACA;AACA,yBAAyB,KAAK;AAC9B,uBAAuB;AACvB;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,uCAAuC,mCAAmC;AAC1E,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,sCAAsC,mCAAmC;AACzE;AACA,OAAO;;AAEP;AACA;AACA;;;;;;;;;;;ACtJA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,QAAQ;AAChC,sBAAsB,QAAQ;AAC9B,6BAA6B,QAAQ;AACrC;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACrGA,6BAA6B,mBAAO,CAAC,sDAA2C;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,QAAQ;AAC5B,2BAA2B,QAAQ;AACnC,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClFA,6BAA6B,mBAAO,CAAC,sDAA2C;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,QAAQ;AAC3B,0BAA0B,QAAQ;AAClC,wBAAwB,QAAQ;AAChC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtFA,wBAAwB,mBAAO,CAAC,iDAAsC;;AAEtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,QAAQ;AAC7B,0BAA0B,QAAQ;AAClC,0BAA0B,QAAQ;AAClC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACtIA,6BAA6B,mBAAO,CAAC,sDAA2C;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,QAAQ;AAC5B,2BAA2B,QAAQ;AACnC,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACvFA,6BAA6B,mBAAO,CAAC,sDAA2C;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,QAAQ;AAC3B,0BAA0B,QAAQ;AAClC,wBAAwB,QAAQ;AAChC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5EA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uBAAuB,QAAQ;AAC/B,yBAAyB,QAAQ;AACjC,4BAA4B,QAAQ;AACpC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,4BAA4B;;AAE5B;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA;;;;;;;;;;;AC3IA,wBAAwB,mBAAO,CAAC,iDAAsC;;AAEtE;AACA;AACA,uBAAuB;AACvB;;AAEA;AACA;AACA;AACA,0CAA0C,QAAQ;AAClD;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzEA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,QAAQ;AAC3C,uBAAuB,QAAQ;AAC/B,0CAA0C,QAAQ;AAClD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,mBAAO,CAAC,wCAA6B;;AAEpD;AACA;AACA;;AAEA;AACA,6BAA6B,QAAQ;AACrC,wBAAwB,QAAQ;AAChC,8BAA8B,QAAQ;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA,wEAAwE;AACxE,QAAQ;AACR;AACA;;AAEA;AACA,oEAAoE;AACpE,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,qCAA0B;;AAElD;AACA,oBAAoB,QAAQ;AAC5B,gCAAgC,QAAQ;AACxC,uCAAuC,QAAQ;AAC/C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,cAAc,sBAAsB;AACpC,eAAe;AACf;AACA;AACA;AACA;AACA,WAAW,wBAAwB;AACnC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,2BAA2B;AAC3B,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAU,KAAK;AACf;;AAEA;AACA;;AAEA;AACA,UAAU,KAAK;AACf,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,8BAA8B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,0BAA0B,QAAQ;AAClC,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,wDAAwD,SAAS;AACjE;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,SAAS;AACpF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,WAAW,IAAI,QAAQ;AAC3C;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,cAAc,SAAS;AACvB;AACA,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,eAAe;AACf,kBAAkB,MAAM;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,cAAc,KAAK;AACnB;AACA,qCAAqC;AACrC;AACA,eAAe;AACf;AACA;AACA,wCAAwC;AACxC;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,cAAc,KAAK;AACnB;AACA,qCAAqC;AACrC;AACA,8BAA8B;AAC9B;AACA,eAAe;AACf;AACA;AACA,uCAAuC;AACvC;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,YAAY,UAAU,2BAA2B;;AAEhE,+CAA+C,cAAc;AAC7D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,qBAAqB;;AAEzE;AACA;AACA;AACA;AACA;AACA,+CAA+C,KAAK;AACpD;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB;AACzB;AACA,gBAAgB;AAChB;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;;;;;;;;;;;AC38BA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC,uBAAuB,QAAQ;AAC/B,gCAAgC,QAAQ;AACxC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClDA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC,oCAAoC,QAAQ;AAC5C,gCAAgC,QAAQ;AACxC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC9CA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA,kBAAkB,KAAK;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,QAAQ;AAChC,mBAAmB,QAAQ;AAC3B,8BAA8B,QAAQ;AACtC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACnFA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;;AAEA;AACA,8BAA8B,QAAQ;AACtC,+BAA+B,QAAQ;AACvC,kDAAkD,QAAQ;AAC1D;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AChCA;AACA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;AACA;AACA;;AAEA;AACA,6BAA6B,QAAQ;AACrC,wBAAwB,QAAQ;AAChC,iDAAiD,QAAQ;AACzD;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9BA,wBAAwB,mBAAO,CAAC,iDAAsC;;AAEtE;AACA,sBAAsB,QAAQ;AAC9B,4BAA4B,QAAQ;AACpC,2BAA2B,QAAQ;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACvGA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;;AAEA;AACA,4BAA4B,QAAQ;AACpC,6BAA6B,QAAQ;AACrC,gDAAgD,QAAQ;AACxD;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AChCA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC,sBAAsB,QAAQ;AAC9B,+CAA+C,QAAQ;AACvD;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1DA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;AChFA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;AACA;AACA;;AAEA;AACA,0BAA0B,QAAQ;AAClC,qBAAqB,QAAQ;AAC7B,8CAA8C,QAAQ;AACtD;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtDA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;;AAEA;AACA,0BAA0B,QAAQ;AAClC,wBAAwB,QAAQ;AAChC,8CAA8C,QAAQ;AACtD;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AChCA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC,4BAA4B,QAAQ;AACpC,iCAAiC,QAAQ;AACzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,6BAA6B,WAAW,GAAG,UAAU;AACrD;;AAEA;AACA,sBAAsB,uBAAuB;AAC7C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C;AAC3C;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;ACrGA,eAAe,mBAAO,CAAC,wCAA6B;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,QAAQ;;AAEf;AACA,OAAO,QAAQ;;AAEf;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5HA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;;AAEA;AACA,wBAAwB,QAAQ;AAChC,+BAA+B,QAAQ;AACvC,2CAA2C,QAAQ;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACnCA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;AACA;;AAEA;AACA,uBAAuB,QAAQ;AAC/B,wBAAwB,QAAQ;AAChC,4BAA4B,QAAQ;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtEA,wBAAwB,mBAAO,CAAC,iDAAsC;AACtE,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE,qBAAqB,mBAAO,CAAC,qDAA2C;AACxE,qBAAqB,mBAAO,CAAC,sDAA2C;;AAExE;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA,mBAAmB,KAAK;AACxB,oBAAoB,OAAO;AAC3B,iBAAiB;AACjB;AACA;AACA;AACA;AACA,mBAAmB,KAAK;AACxB,iBAAiB;AACjB;AACA;AACA,OAAO;AACP;;AAEA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA,mBAAmB,KAAK;AACxB,oBAAoB,OAAO;AAC3B,iBAAiB;AACjB;AACA;AACA,eAAe;AACf,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,0CAA0C,2BAA2B;AACrE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,kBAAkB;AAC1E;AACA;AACA;;AAEA,uCAAuC,2BAA2B;AAClE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mCAAmC,2BAA2B;AAC9D;AACA;;;;;;;;;;;AC7OA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;;AAEA;AACA;AACA,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtCA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;;AAEA;AACA,0BAA0B,QAAQ;AAClC,yBAAyB,QAAQ;AACjC,6CAA6C,QAAQ;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzCA,eAAe,mBAAO,CAAC,wCAA6B;;AAEpD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1DA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;;AAEA;AACA,oBAAoB,QAAQ;AAC5B,+BAA+B,QAAQ;AACvC,uCAAuC,QAAQ;AAC/C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrCA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;;AAEA;AACA,yBAAyB,QAAQ;AACjC,wBAAwB,QAAQ;AAChC,yCAAyC,QAAQ;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3EA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;;AAEA;AACA,6BAA6B,QAAQ;AACrC,2BAA2B,QAAQ;AACnC,2CAA2C,QAAQ;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACnCA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC,wBAAwB,QAAQ;AAChC,iDAAiD,QAAQ;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrCA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;;AAEA;AACA,4BAA4B,QAAQ;AACpC,wBAAwB,QAAQ;AAChC,+CAA+C,QAAQ;AACvD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrCA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;;AAEA;AACA,uBAAuB,QAAQ;AAC/B,yBAAyB,QAAQ;AACjC,0CAA0C,QAAQ;AAClD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrCA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;;AAEA;AACA,wBAAwB,QAAQ;AAChC,wBAAwB,QAAQ;AAChC,uCAAuC,QAAQ;AAC/C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC9BA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA,OAAO;AACP,OAAO,qBAAqB;AAC5B;;AAEA;AACA,OAAO;AACP,OAAO,eAAe;AACtB;;AAEA;AACA,OAAO;AACP,OAAO,gBAAgB;;AAEvB;AACA,OAAO;AACP,OAAO,gBAAgB;;AAEvB;AACA,OAAO;AACP,OAAO,kBAAkB;;AAEzB;AACA,OAAO;AACP,OAAO,kBAAkB;;AAEzB;AACA,OAAO;AACP,OAAO,eAAe;AACtB;AACA;;AAEA;AACA,qBAAqB,QAAQ;AAC7B,sBAAsB,QAAQ;AAC9B,0BAA0B,QAAQ;AAClC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACjFA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,OAAO,GAAG,aAAa,GAAG,cAAc;AAC/C;AACA;AACA;AACA,UAAU;AACV;AACA,cAAc,QAAQ;AACtB,mBAAmB,QAAQ;AAC3B,iBAAiB;AACjB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA,oBAAoB,QAAQ;AAC5B,sBAAsB,QAAQ;AAC9B,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC/XA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,QAAQ;AAC7B,0BAA0B,QAAQ;AAClC,0BAA0B,QAAQ;AAClC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClEA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP,mBAAmB,YAAY;AAC/B;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP,WAAW,YAAY;AACvB;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,oCAAoC,OAAO,QAAQ;AACnD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACvFA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,QAAQ;AAC7B,qBAAqB,QAAQ;AAC7B,0BAA0B,QAAQ;AAClC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,gCAAgC;;AAEhC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACjHA,wBAAwB,mBAAO,CAAC,iDAAsC;AACtE,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,QAAQ;AAC9B,wBAAwB,QAAQ;AAChC,2BAA2B,QAAQ;AACnC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;ACjFA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,QAAQ;AAC5B,wBAAwB,QAAQ;AAChC,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC5CA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,QAAQ;AAC5B,yBAAyB,QAAQ;AACjC,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sBAAsB,gCAAgC;AACtD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B,GAAG;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;;;;;;;;;;;AClTA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE,qBAAqB,mBAAO,CAAC,sDAA2C;;AAExE;AACA;AACA;;AAEA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA,mBAAmB,KAAK;AACxB,oBAAoB,OAAO;AAC3B,iBAAiB;AACjB;AACA;AACA,eAAe;AACf,OAAO;AACP;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC,2BAA2B,QAAQ;AACnC,iCAAiC,QAAQ;AACzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,+BAA+B,2BAA2B;AAC1D,OAAO;AACP;AACA;;;;;;;;;;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,mBAAO,CAAC,iDAAsC;AACtE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,0BAA0B;AAC1B,WAAW;;AAEX;AACA;;AAEA,0BAA0B;AAC1B,UAAU,KAAK;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,sBAAsB,sBAAsB,IAAI,oBAAoB,UAAU,UAAU,IAAI,QAAQ,+BAA+B,GAAG;AACtI;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA,mBAAmB;AACnB;AACA,cAAc;AACd,0BAA0B;AAC1B;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,eAAe;AACf,yBAAyB,MAAM;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,cAAc,SAAS;AACvB;AACA,eAAe,SAAS;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACtdA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,QAAQ;AAC7B,qBAAqB,QAAQ;AAC7B,0BAA0B,QAAQ;AAClC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpGA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC,wBAAwB,QAAQ;AAChC,oCAAoC,QAAQ;AAC5C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxGA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzJA,qBAAqB,mBAAO,CAAC,8CAAmC;AAChE,wBAAwB,mBAAO,CAAC,iDAAsC;;AAEtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,QAAQ;AAC3B,gCAAgC,QAAQ;AACxC,wBAAwB,QAAQ;AAChC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClFA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP,WAAW,qBAAqB;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,iCAAiC,MAAM;AACvC;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,qCAAqC,cAAc;;AAEnD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA,4BAA4B,EAAE;AAC9B;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA,4BAA4B,EAAE;AAC9B;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;;AAEA;AACA,OAAO;;AAEP,kBAAkB,MAAM;AACxB,gCAAgC,GAAG;;AAEnC;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACrNA,eAAe,mBAAO,CAAC,wCAA6B;;AAEpD;AACA,0BAA0B,QAAQ;AAClC,gCAAgC,QAAQ;AACxC,yCAAyC,QAAQ;AACjD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACjDA,UAAU,mBAAO,CAAC,mBAAQ;;AAE1B;AACA,0BAA0B,mBAAO,CAAC,yCAA8B;;AAEhE,mBAAmB,mBAAO,CAAC,4BAAoB;AAC/C,sBAAsB,mBAAO,CAAC,4BAAiB;;AAE/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,UAAU;AAC/C;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,WAAW;AACzB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iEAAiE,UAAU;AAC3E;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yCAAyC,EAAE;AAC3C,iBAAiB;AACjB;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;;AAEA,iCAAiC;AACjC,mCAAmC,WAAW,KAAK,IAAI;AACvD,4BAA4B,eAAe;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;AChaA,UAAU,mBAAO,CAAC,mBAAQ;;AAE1B;AACA,gCAAgC,mBAAO,CAAC,+CAAoC;;AAE5E,yBAAyB,mBAAO,CAAC,kCAAuB;AACxD,sBAAsB,mBAAO,CAAC,4BAAiB;;AAE/C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5CA,kBAAkB,mBAAO,CAAC,wBAAa;;AAEvC,+BAA+B,mBAAO,CAAC,iEAAsD;;AAE7F;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,gCAAgC;AAC9C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA,uBAAuB,WAAW;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;;AAE1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,mBAAmB;;AAEnB,qEAAqE,EAAE;AACvE,+CAA+C,EAAE;;AAEjD,qEAAqE,EAAE;AACvE,8CAA8C,EAAE;;AAEhD,qEAAqE,EAAE;AACvE,+CAA+C,EAAE;;AAEjD,qEAAqE,EAAE;AACvE,+CAA+C,EAAE;;AAEjD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,0BAA0B,QAAQ;AAClC,2BAA2B;AAC3B;AACA;AACA,4BAA4B,IAAI,EAAE,UAAU;AAC5C,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC,YAAY,GAAG,IAAI;AACnD;AACA;;;;;;;;;;;AC7KA,sBAAsB,mBAAO,CAAC,4BAAiB;AAC/C,6BAA6B,mBAAO,CAAC,yCAA8B;;AAEnE;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,uBAAuB,MAAM;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,sCAAsC,EAAE;AACxC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,mCAAmC;;AAEnC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,+BAA+B,MAAM,IAAI,MAAM;AAC/C;AACA;AACA;AACA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA,uBAAuB,aAAa,GAAG,aAAa;AACpD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iDAAiD;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,4CAA4C;AAC5C;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;;AAElE;AACA;;AAEA,sCAAsC;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B,sBAAsB,GAAG,MAAM,GAAG,MAAM;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB,gCAAgC;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;;AAEA,mCAAmC;AACnC;;AAEA;AACA,gCAAgC,MAAM,kBAAkB,MAAM;AAC9D;;AAEA;AACA;AACA;AACA,sBAAsB,YAAY,kBAAkB,YAAY;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,uCAAuC;;AAEvC;AACA;AACA,uCAAuC,MAAM;AAC7C;AACA;AACA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,qCAAqC,cAAc;;AAEnD;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA,qDAAqD,0BAA0B;AAC/E;AACA;AACA;;AAEA,iCAAiC;AACjC,sCAAsC,WAAW,KAAK,IAAI;AAC1D,4BAA4B,eAAe;AAC3C;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACjlBA,uBAAuB,mBAAO,CAAC,qCAA0B;;AAEzD;AACA;AACA;AACA;AACA;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,uDAA8B;;AAEjD;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;;;;;;;;;;;ACbA,mBAAmB,mBAAO,CAAC,+BAAoB;;AAE/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iDAAiD,EAAE;AACnD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO,IAAI,sCAAsC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,+BAA+B,gDAAgD;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,uBAAuB;AACvB,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uFAAuF,qBAAqB,EAAE;AAC9G;AACA,yBAAyB;AACzB,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChRA,oBAAoB,mBAAO,CAAC,gCAAqB;;AAEjD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA,oEAAoE,GAAG;AACvE,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,MAAM;AACpB;AACA;AACA,iCAAiC;AACjC,6BAA6B,WAAW,KAAK,IAAI;AACjD,4BAA4B,eAAe;AAC3C;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C,eAAe,SAAS,QAAQ;AAC5E;AACA,OAAO;AACP;;AAEA;AACA;AACA,4CAA4C,eAAe,SAAS,QAAQ;AAC5E,OAAO;AACP;AACA;;;;;;;;;;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAO,CAAC,kCAAuB;;AAEnD;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B,mBAAmB,MAAM;AACzB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,OAAO;AAC9E;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,OAAO;AAC7C,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzGA,oBAAoB,mBAAO,CAAC,gCAAqB;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kBAAkB,QAAQ;AAC1B;AACA,uBAAuB,KAAK;AAC5B;AACA,kBAAkB,OAAO;AACzB,mBAAmB,KAAK;AACxB,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,sBAAsB;AACrD;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,uCAAuC,EAAE,GAAG,QAAQ;AACpD,gBAAgB;;AAEhB,iCAAiC;;AAEjC;AACA,4BAA4B,gBAAgB,KAAK,cAAc,GAAG;AAClE;AACA;AACA,4BAA4B;AAC5B;AACA;;AAEA;AACA,2BAA2B,OAAO;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,2BAA2B,OAAO,wBAAwB,kBAAkB;;AAE5E;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA,aAAa;AACb,OAAO;AACP;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,cAAc;AAC5B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA,oDAAoD,QAAQ,sBAAsB;AAClF;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,aAAa;AACb,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA,yCAAyC;;AAEzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sDAAsD,cAAc;;AAEpE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA,gBAAgB;;AAEhB,6BAA6B;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,6CAA6C,cAAc;;AAE3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;;AAEA;;AAEA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA,qBAAqB,QAAQ;AAC7B,yBAAyB,QAAQ;AACjC,wBAAwB,QAAQ;AAChC,yBAAyB,MAAM;AAC/B,uBAAuB,MAAM;AAC7B,qBAAqB,SAAS;AAC9B,qBAAqB,SAAS;AAC9B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,cAAc,uBAAuB;AACrC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA,aAAa;AACb,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,cAAc;AACd;AACA;AACA;AACA,gBAAgB;AAChB;AACA,OAAO;AACP;AACA;;;;;;;;;;;AChoBA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,sBAAW;;AAEnC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,cAAc;AAC5B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC/EA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,sBAAW;;AAEnC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,sBAAsB;AAC/C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;;;;;;;;;;;AC3DA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,sBAAW;;AAEnC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,cAAc;AAC5B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpEA,qBAAqB,mBAAO,CAAC,iCAAsB;;AAEnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP,KAAK;AACL;AACA;;AAEA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA,UAAU;;AAEV;AACA,UAAU,QAAQ,QAAQ;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,6CAA6C,EAAE;AAC/C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,aAAa,MAAM,OAAO,GAAG;AAC7B,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,qBAAqB;AACrB,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA6B;;AAE7B;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;;AAEb;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;;AAEA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;;AAEA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA,kDAAkD,QAAQ;AAC1D,aAAa;AACb;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA,kDAAkD,QAAQ;AAC1D,aAAa;AACb;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA,8CAA8C;AAC9C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iCAAiC;AACjC,cAAc;AACd,iCAAiC;AACjC;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA,wDAAwD;AACxD,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,yCAAyC,EAAE,iBAAiB;AAC5D;AACA,2BAA2B,yCAAyC;AACpE;AACA,aAAa,GAAG;AAChB;;AAEA,4BAA4B,OAAO;AACnC,YAAY,OAAO,UAAU,OAAO;AACpC,sCAAsC,GAAG,IAAI;;AAE7C;AACA;AACA,iDAAiD,iBAAiB;;AAElE;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,2BAA2B,yCAAyC;AACpE;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,oEAAoE,GAAG;AACvE,OAAO;;AAEP;AACA,oEAAoE,GAAG;AACvE,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;;AAEA,iCAAiC;AACjC,8BAA8B,WAAW,KAAK,IAAI;AAClD,4BAA4B,eAAe;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAyC,QAAQ;AACjD,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,MAAM;AACxB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACzxBA,iBAAiB,mBAAO,CAAC,qBAAU;AACnC,wBAAwB,mBAAO,CAAC,oCAAyB;;AAEzD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,OAAO;;AAEP;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;;AAEA;;AAEA,sBAAsB,2BAA2B;AACjD;;AAEA;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC/EA,gCAAgC,mBAAO,CAAC,4CAAiC;;AAEzE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACvEA,iBAAiB,mBAAO,CAAC,uBAAY;;AAErC;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACPA,iBAAiB,mBAAO,CAAC,uBAAY;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0BAA0B,mBAAO,CAAC,sCAA2B;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,EAAE;AACF;AACA;;AAEA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,UAAU,EAAE;AAC7C;AACA,0CAA0C,iBAAiB,GAAG,4BAA4B;AAC1F,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA,iCAAiC,UAAU,EAAE;AAC7C;AACA,mBAAmB,MAAM,GAAG,iBAAiB;;AAE7C;AACA;AACA,0BAA0B,kBAAkB;AAC5C,WAAW;AACX,0BAA0B,yBAAyB,GAAG,kBAAkB;AACxE;;AAEA;AACA;AACA,wDAAwD,kBAAkB;AAC1E;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,qBAAqB,kBAAkB;AACpD;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,qCAAqC,QAAQ;AAC7C;AACA,aAAa,qBAAqB,4BAA4B;AAC9D;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,qBAAqB,WAAW,+BAA+B;AAC/D;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,aAAa,+BAA+B;AAC5C;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;;AAEA,iCAAiC;AACjC,6BAA6B,WAAW,KAAK,IAAI;AACjD,4BAA4B,eAAe;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACjWA,sBAAsB,mBAAO,CAAC,kCAAuB;;AAErD;;AAEA;AACA;AACA;;AAEA;AACA,UAAU,OAAO;AACjB;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,aAAa;AACb,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,8CAA8C,EAAE;AAChD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO,IAAI,sCAAsC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA,4BAA4B,gDAAgD;AAC5E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,oBAAoB;AACpB,UAAU;AACV;;AAEA;AACA;AACA;;;;;;;;;;;ACtQA,mBAAmB,mBAAO,CAAC,+BAAoB;;AAE/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iDAAiD,EAAE;AACnD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO,IAAI,sCAAsC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,+BAA+B,gDAAgD;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,uBAAuB;AACvB,aAAa;AACb;AACA;AACA;AACA;AACA;;;;;;;;;;;AC9LA,0BAA0B,mBAAO,CAAC,sCAA2B;;AAE7D;;;;;;;;;;;ACFA,gCAAgC,mBAAO,CAAC,4CAAiC;;AAEzE;;;;;;;;;;;ACFA;AACA;;AAEA;AACA;AACA,UAAU,wBAAwB;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ,GAAG,WAAW;AACrC;AACA;AACA;AACA,WAAW,gCAAgC;AAC3C,WAAW,+BAA+B,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAC7E,WAAW,MAAM,yBAAyB,KAAK;AAC/C,WAAW,gCAAgC;AAC3C;AACA;;AAEA;AACA;AACA;AACA,cAAc,GAAG;AACjB;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oDAAoD,SAAS;AAC7D;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA,aAAa;;AAEb;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,eAAe;AACf;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA,UAAU,SAAS;;AAEnB;AACA,sBAAsB,gBAAgB;AACtC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChKA,0BAA0B,mBAAO,CAAC,sCAA2B;;AAE7D;;AAEA;AACA;AACA;AACA;AACA,WAAW,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,8BAA8B;AAC7D,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,KAAK;AAChB;AACA;AACA;AACA;AACA,8CAA8C,8BAA8B;AAC5E,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,uCAAuC,QAAQ;AAC/C;;AAEA;AACA,uCAAuC,QAAQ;AAC/C;;AAEA;AACA,uCAAuC;AACvC;;AAEA;;AAEA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA,+BAA+B;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA,+BAA+B,OAAO;AACtC,sCAAsC,OAAO;AAC7C,8BAA8B,OAAO;AACrC,OAAO;;AAEP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,sCAAsC,uBAAuB;AAC7D;AACA;AACA;AACA,6CAA6C;AAC7C,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,SAAS,EAAE,OAAO;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAA0B,0BAA0B,GAAG,6BAA6B;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,eAAe,GAAG,QAAQ;AACtD,gBAAgB;AAChB,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA,kCAAkC,EAAE;AACpC;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,wCAAwC;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,aAAa;AAC3B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;;;;;;;;;;;AC9nCA,sBAAsB,mBAAO,CAAC,iCAAuB;;AAErD;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mCAAmC,OAAO;AAC1C,oCAAoC,OAAO;AAC3C,sCAAsC,OAAO;;AAE7C,8BAA8B,OAAO;AACrC,+BAA+B,OAAO;AACtC,8BAA8B,OAAO;AACrC,oCAAoC,OAAO;;AAE3C,oCAAoC,OAAO;AAC3C,yCAAyC,OAAO;AAChD;AACA,eAAe,OAAO;AACtB;AACA;AACA,eAAe,OAAO;AACtB;AACA,oCAAoC,OAAO;;AAE3C,wCAAwC,OAAO;;AAE/C,qCAAqC,OAAO;;AAE5C,oCAAoC,OAAO;AAC3C,OAAO;;AAEP;AACA;;AAEA,qBAAqB;;AAErB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,MAAM;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kCAAkC,gBAAgB;AAClD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kCAAkC,iBAAiB;AACnD;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;ACvwCA;AACuC;AACvC,mBAAmB,mBAAO,CAAC,yCAA8B;;AAEzD;;AAEA,yBAAyB,mDAAO;AAChC;AACA;AACA,kBAAkB,OAAO;AACzB,oBAAoB,OAAO;AAC3B,mBAAmB,OAAO;AAC1B,OAAO;;AAEP;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,kCAAkC;AAC5D,0BAA0B,oCAAoC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA,oBAAoB;AACpB;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,eAAe,OAAO,IAAI,WAAW;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,8BAA8B;AAC9B,qCAAqC,SAAS;AAC9C,4BAA4B;AAC5B,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;;AAEA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;;AAEA,2BAA2B;AAC3B;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qDAAqD,SAAS;AAC9D;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA,6BAA6B;AAC7B,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,mBAAmB;AACjC;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,2BAA2B,cAAc;AACzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA,iEAAe,UAAU,EAAC;;;;;;;;;;;ACxmB1B;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,mBAAO,CAAC,8CAAmC;;AAE/D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,oBAAoB,OAAO;;AAE3B;AACA,YAAY;AACZ;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,kDAAkD,GAAG;AACrD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb,UAAU;;AAEV;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C,eAAe,SAAS,QAAQ;AAC5E,OAAO;AACP;;AAEA;AACA;AACA,4CAA4C,eAAe,SAAS,QAAQ;AAC5E,OAAO;AACP;;AAEA;AACA;AACA,4CAA4C,eAAe,SAAS,QAAQ;AAC5E,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,6BAA6B,KAAK;AAClC,iBAAiB,IAAI;AACrB,kBAAkB,IAAI;AACtB,oBAAoB;AACpB;AACA,eAAe,MAAM;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,0DAA0D,iBAAiB;AAC3E;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,qBAAqB,aAAa;AAClC,cAAc,KAAK;AACnB;AACA;AACA,cAAc,SAAS;AACvB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;;AAEf;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,6BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,MAAM;AACpB;AACA;AACA,iCAAiC;AACjC,uBAAuB,gBAAgB,GAAG,WAAW,KAAK,IAAI;AAC9D,4BAA4B,eAAe;AAC3C;;AAEA;AACA;AACA,yCAAyC,eAAe,SAAS,QAAQ;AACzE,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,MAAM;AACxB,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1fA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACrEA,2BAA2B,mBAAO,CAAC,qDAA0C;;AAE7E;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACnFA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B;AAC5B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AClEA,2BAA2B,mBAAO,CAAC,qDAA0C;;AAE7E;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oDAAoD,GAAG;AACvD;AACA;AACA,aAAa;AACb;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACnFA,2BAA2B,mBAAO,CAAC,qDAA0C;;AAE7E;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA,aAAa;AACb;;AAEA;;AAEA;AACA,iDAAiD;;AAEjD;AACA,gDAAgD;;AAEhD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,GAAG;AACjB,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX,6BAA6B;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,UAAU,8BAA8B,OAAO;AAC9G;AACA,aAAa;AACb;AACA;AACA,gEAAgE,oBAAoB;AACpF;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,sDAAsD,MAAM,sBAAsB,mBAAmB;AACrG;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA,oBAAoB,OAAO;AAC3B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA,yBAAyB,IAAI;;AAE7B,qBAAqB,IAAI;AACzB,iCAAiC,IAAI;AACrC;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;;AAEA,0DAA0D;AAC1D;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA,+BAA+B,UAAU;AACzC,mBAAmB;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA,aAAa;AACb,OAAO;AACP;;AAEA;AACA,gBAAgB,QAAQ,GAAG,sBAAsB;AACjD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,WAAW,UAAU,WAAW,EAAE,UAAU,EAAE,SAAS;AACzE;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,QAAQ;AACvC;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,WAAW;AACX;AACA;;AAEA;AACA,QAAQ;AACR;AACA,uDAAuD;AACvD;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,iBAAiB;AAChE;AACA;AACA;AACA;AACA;AACA,wCAAwC,iBAAiB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,GAAG;AACjB,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,8CAA8C,yBAAyB;AACvE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+CAA+C,yBAAyB;AACxE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,QAAQ;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACl9BA,wBAAwB,mBAAO,CAAC,kDAAuC;;AAEvE;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,uDAAuD;;AAEvD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,KAAK;AACtB;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;;;;;;;;;;AC/IA,4BAA4B,mBAAO,CAAC,sDAA2C;;AAE/E;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,uDAAuD;;AAEvD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,KAAK;AACtB;AACA;;AAEA;AACA,mBAAmB,uCAAuC,EAAE;AAC5D;AACA,WAAW;AACX,QAAQ;AACR,mBAAmB,mCAAmC,EAAE,mBAAmB;AAC3E;AACA;AACA;;;;;;;;;;;AClJA,yBAAyB,mBAAO,CAAC,kDAAwC;;AAEzE;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACtFA,wBAAwB,mBAAO,CAAC,kDAAuC;;AAEvE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qEAAqE,EAAE;AACvE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;;AAEzC;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,EAAE;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,EAAE;AACtD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,eAAe;AACpD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC;AACrC;AACA;AACA;;AAEA;AACA,uEAAuE,iBAAiB,qBAAqB,wBAAwB,yBAAyB,kBAAkB,qBAAqB,iBAAiB,mBAAmB,iBAAiB,EAAE,YAAY,mDAAmD,iBAAiB,iBAAiB,mBAAmB;AAChX,+BAA+B,iCAAiC;AAChE,UAAU;AACV,gEAAgE,aAAa,mBAAmB,6BAA6B,QAAQ;AACrI;AACA,UAAU;AACV;AACA,8BAA8B,YAAY,mDAAmD;AAC7F;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA,eAAe;AACf;AACA;AACA,6BAA6B,eAAe,GAAG,QAAQ,GAAG,oBAAoB;AAC9E;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA,sBAAsB,GAAG;AACzB;AACA;;;;;;;;;;;ACndA,2BAA2B,mBAAO,CAAC,qDAA0C;;AAE7E;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B;AAC5B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACnEA,yBAAyB,mBAAO,CAAC,mDAAwC;;AAEzE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,EAAE;AAC3E;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;;AAEA;AACA,oBAAoB;AACpB;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,WAAW;AACX,uBAAuB;AACvB;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mCAAmC,GAAG,OAAO;AAChE,QAAQ;AACR,mBAAmB,mCAAmC,GAAG,OAAO;AAChE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,6BAA6B,YAAY;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,UAAU;AACxC,oBAAoB,iCAAiC;AACrD;AACA;AACA;AACA;AACA,0BAA0B,YAAY;AACtC;AACA;AACA;AACA;AACA,6BAA6B,eAAe;AAC5C,QAAQ;AACR;AACA,oBAAoB,qBAAqB;AACzC;AACA,0BAA0B,YAAY;AACtC;AACA,6BAA6B,eAAe;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,gBAAgB;AAC9C;AACA,0BAA0B,YAAY;AACtC;AACA,6BAA6B,eAAe;AAC5C;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,sCAAsC,QAAQ,UAAU,gBAAgB;;AAExE,sCAAsC,QAAQ,UAAU,YAAY;;AAEpE;AACA,kEAAkE,EAAE,WAAW;AAC/E,8DAA8D,WAAW;AACzE;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB,cAAc,QAAQ;AACtB,kBAAkB,QAAQ;AAC1B,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;;AAEzC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,EAAE;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;;AAEhD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,aAAa;AACb,UAAU;AACV,QAAQ;AACR;AACA;;AAEA;AACA,kCAAkC,eAAe;AACjD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC;AACrC;AACA,6CAA6C,qBAAqB,GAAG;AACrE,QAAQ;AACR;AACA,wCAAwC;AACxC;AACA,gDAAgD;AAChD;AACA,cAAc,GAAG;AACjB;AACA;;AAEA;AACA,sDAAsD,YAAY;AAClE,0DAA0D,cAAc,SAAS,iBAAiB,EAAE,SAAS;AAC7G;;AAEA;AACA;AACA;AACA,sBAAsB,iCAAiC;AACvD;AACA;AACA;AACA;AACA;AACA,2BAA2B,aAAa,mDAAmD;AAC3F;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,2BAA2B;AAC1E;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kDAAkD,mBAAmB;AACrE;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA,sBAAsB,GAAG;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA,eAAe;AACf;AACA;AACA,6BAA6B,eAAe,GAAG,QAAQ,GAAG,oBAAoB;AAC9E;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,QAAQ;AACvC,OAAO;AACP;;AAEA;AACA;AACA,+BAA+B,QAAQ;AACvC,OAAO;AACP;AACA;;;;;;;;;;;AC/oBA,wBAAwB,mBAAO,CAAC,kDAAuC;;AAEvE;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+BAA+B;AAC/B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,MAAM;AACxB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3FA,wBAAwB,mBAAO,CAAC,kDAAuC;;AAEvE;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC;AAChC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6DAA6D,UAAU;AACvE;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kDAAkD,eAAe,IAAI;AACrE;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;AACA;AACA,oCAAoC,UAAU,kCAAkC,eAAe,UAAU,SAAS,8BAA8B,OAAO;AACvJ;AACA;AACA,aAAa;AACb;AACA;AACA,gEAAgE,oBAAoB;AACpF;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,iBAAiB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,UAAU,kCAAkC,eAAe,IAAI,MAAM,sBAAsB,iBAAiB;AAC7I;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA,yCAAyC;AACzC;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA,gDAAgD;AAChD;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR,uDAAuD,OAAO;AAC9D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;;;;;;;;;;AC9dA,4BAA4B,mBAAO,CAAC,sDAA2C;;AAE/E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,8BAA8B;AAC9B;AACA;AACA,8DAA8D;AAC9D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;ACnHA,0BAA0B,mBAAO,CAAC,oDAAyC;;AAE3E;AACA,IAAI,MAAM;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAAgC;;AAEhC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC/EA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,sBAAW;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,kDAAkD,wBAAwB,mCAAmC;AAC7G,wBAAwB,aAAa,mBAAmB,eAAe;AACvE,kDAAkD,aAAa;AAC/D;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,0GAA0G;AAC1G;AACA;AACA;AACA,gBAAgB;AAChB;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,mBAAmB;AACnB,mCAAmC,aAAa,WAAW;AAC3D,wBAAwB,aAAa,mBAAmB,eAAe;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,gBAAgB,mBAAmB,eAAe;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpWA,0BAA0B,mBAAO,CAAC,oDAAyC;;AAE3E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,KAAK;AACrD;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3JA,+BAA+B,mBAAO,CAAC,yDAA8C;;AAErF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChFA,wBAAwB,mBAAO,CAAC,kDAAuC;;AAEvE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gBAAgB,mCAAmC,GAAG,OAAO;AAC7D;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uCAAuC,eAAe;AACtD;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,mFAAmF,eAAe;AAClG;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA,yBAAyB,OAAO;AAChC,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,6BAA6B;;AAE7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA,8CAA8C;;AAE9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;;AAE5B;AACA,0BAA0B;AAC1B,8CAA8C;AAC9C;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC5cA,2BAA2B,mBAAO,CAAC,qDAA0C;AAC7E,wBAAwB,mBAAO,CAAC,kDAAuC;;AAEvE;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB,GAAG,WAAW;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sCAAsC,aAAa,6BAA6B,mBAAmB,sBAAsB;AACzH,6CAA6C;AAC7C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC7QA,yBAAyB,mBAAO,CAAC,+CAAoC;;AAErE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AChFA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,yDAAyD,GAAG;AAC5D,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,gDAAgD,yBAAyB;AACzE;AACA;AACA;AACA;;AAEA,iCAAiC;AACjC,uBAAuB,SAAS,GAAG,UAAU,KAAK,IAAI;AACtD,4BAA4B,eAAe;AAC3C;AACA;;;;;;;;;;;ACxGA,+BAA+B,mBAAO,CAAC,qDAA0C;;AAEjF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACZA,6BAA6B,mBAAO,CAAC,mDAAwC;;AAE7E,+BAA+B,mBAAO,CAAC,qCAA0B;;AAEjE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,wDAAwD,yBAAyB;AACjF;AACA;AACA;AACA;AACA;;;;;;;;;;;AClEA,mCAAmC,mBAAO,CAAC,yDAA8C;;AAEzF;AACA;AACA;;;;;;;;;;;ACJA,qCAAqC,mBAAO,CAAC,2DAAgD;;AAE7F;AACA;AACA;;;;;;;;;;;ACJA,oCAAoC,mBAAO,CAAC,0DAA+C;;AAE3F;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC5FA,mCAAmC,mBAAO,CAAC,yDAA8C;;AAEzF;AACA;AACA;;;;;;;;;;;ACJA,iCAAiC,mBAAO,CAAC,sDAA4C;;AAErF;;;;;;;;;;;ACFA,qCAAqC,mBAAO,CAAC,2DAAgD;;AAE7F;AACA;AACA;;;;;;;;;;;ACJA,kCAAkC,mBAAO,CAAC,wDAA6C;;AAEvF;AACA;AACA;;;;;;;;;;;ACJA,iCAAiC,mBAAO,CAAC,uDAA4C;;AAErF;;;;;;;;;;;ACFA,oCAAoC,mBAAO,CAAC,0DAA+C;;AAE3F;AACA;AACA;;;;;;;;;;;ACJA,kCAAkC,mBAAO,CAAC,wDAA6C;;AAEvF;AACA;AACA;;;;;;;;;;;ACJA,iCAAiC,mBAAO,CAAC,uDAA4C;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACVA,mCAAmC,mBAAO,CAAC,yDAA8C;;AAEzF;AACA;AACA;;;;;;;;;;;ACJA,qCAAqC,mBAAO,CAAC,2DAAgD;;AAE7F;AACA;AACA;;;;;;;;;;;ACJA,2CAA2C,mBAAO,CAAC,gEAAsD;;AAEzG;AACA;AACA;;;;;;;;;;;ACJA,yCAAyC,mBAAO,CAAC,+DAAoD;;AAErG;AACA;AACA;;;;;;;;;;;ACJA,oCAAoC,mBAAO,CAAC,0DAA+C;;AAE3F;AACA;AACA;AACA;AACA;AACA,iCAAiC,GAAG;AACpC;AACA;;;;;;;;;;;ACTA,8BAA8B,mBAAO,CAAC,oDAAyC;AAC/E;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzBA,6BAA6B,mBAAO,CAAC,mDAAwC;;AAE7E;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uCAAuC,GAAG;AAC1C;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AClBA,iCAAiC,mBAAO,CAAC,uDAA4C;;AAErF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uCAAuC,GAAG;AAC1C;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAO,CAAC,iDAAsC;;AAEtE;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mBAAO,CAAC,wDAA6C;;AAEpF;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;;;;;;;;;;;AC5GA,6BAA6B,mBAAO,CAAC,gEAAqD;;AAE1F;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,qDAAqD,UAAU;AAC/D;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC;AAChC,uBAAuB,kBAAkB;AACzC;AACA,OAAO,KAAK,IAAI;AAChB,4BAA4B,eAAe;AAC3C;AACA;;;;;;;;;;;AC3RA,yBAAyB,mBAAO,CAAC,4DAAiD;;AAElF;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;;;;;;;;;;ACtBA,sCAAsC,mBAAO,CAAC,yEAA8D;;AAE5G;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1EA;AACA,qDAAqD;AACrD,+BAA+B,mBAAO,CAAC,kEAAuD;;AAE9F;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,iDAAiD,IAAI;AACrD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,6DAA6D,IAAI;AACjE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,IAAI;AAC9D;AACA;AACA;AACA;AACA;AACA,yCAAyC,IAAI;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC7GA,iCAAiC,mBAAO,CAAC,oEAAyD;;AAElG;;;;;;;;;;;ACFA,sCAAsC,mBAAO,CAAC,6FAAkF;;AAEhI;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,GAAG;AACrB,+BAA+B,GAAG;AAClC,yBAAyB,GAAG;AAC5B,+BAA+B,GAAG;AAClC,uCAAuC,GAAG;AAC1C,sBAAsB,GAAG;AACzB,4BAA4B,GAAG;AAC/B,uBAAuB,GAAG;AAC1B,2BAA2B,GAAG;AAC9B,mCAAmC,GAAG;AACtC,sBAAsB,GAAG;AACzB,oCAAoC,GAAG;AACvC,4BAA4B,GAAG;AAC/B,uBAAuB,GAAG;AAC1B,4BAA4B,GAAG;AAC/B;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA,6BAA6B,2CAA2C;AACxE;AACA;AACA,8BAA8B,+BAA+B;AAC7D,OAAO;;AAEP;AACA,kBAAkB;AAClB,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,oCAAoC;AACpE,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,8CAA8C;AACvE;AACA;AACA,6BAA6B,yBAAyB;AACtD,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC5XA,8BAA8B,mBAAO,CAAC,qFAA0E;;AAEhH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,GAAG;AACrB,4BAA4B,GAAG;AAC/B,sBAAsB,GAAG;AACzB,sBAAsB,GAAG;AACzB,uBAAuB,GAAG;AAC1B,0BAA0B,GAAG;AAC7B,yBAAyB,GAAG;AAC5B,2BAA2B,GAAG;AAC9B,2BAA2B,GAAG;AAC9B,6BAA6B,GAAG;AAChC,4BAA4B,GAAG;AAC/B,4BAA4B,GAAG;AAC/B,uBAAuB,GAAG;AAC1B,0BAA0B,GAAG;AAC7B,2BAA2B,GAAG;AAC9B,0BAA0B,GAAG;AAC7B,2BAA2B,GAAG;AAC9B,6BAA6B,GAAG;AAChC,iCAAiC,GAAG;AACpC,4BAA4B,GAAG;AAC/B,4BAA4B,GAAG;AAC/B;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA,6BAA6B,2CAA2C;AACxE;AACA;AACA,8BAA8B,+BAA+B;AAC7D,OAAO;;AAEP;AACA,kBAAkB;AAClB,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,oCAAoC;AACpE,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACnaA,kCAAkC,mBAAO,CAAC,yFAA8E;;AAExH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,GAAG;AACrB,gCAAgC,GAAG;AACnC,0BAA0B,GAAG;AAC7B,2BAA2B,GAAG;AAC9B,sBAAsB,GAAG;AACzB,2BAA2B,GAAG;AAC9B,+BAA+B,GAAG;AAClC,4BAA4B,GAAG;AAC/B,8BAA8B,GAAG;AACjC,4BAA4B,GAAG;AAC/B,+BAA+B,GAAG;AAClC,+BAA+B,GAAG;AAClC,+BAA+B,GAAG;AAClC,6BAA6B,GAAG;AAChC,iCAAiC,GAAG;AACpC,mCAAmC,GAAG;AACtC,uBAAuB,GAAG;AAC1B,4BAA4B,GAAG;AAC/B,0BAA0B,GAAG;AAC7B,gCAAgC,GAAG;AACnC,iCAAiC,GAAG;AACpC,gCAAgC,GAAG;AACnC;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA,6BAA6B,2CAA2C;AACxE;AACA;AACA,8BAA8B,+BAA+B;AAC7D,OAAO;;AAEP;AACA,kBAAkB;AAClB,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oCAAoC;AACvE,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC7bA,gCAAgC,mBAAO,CAAC,uFAA4E;;AAEpH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,GAAG;AACrB,+BAA+B,GAAG;AAClC,yBAAyB,GAAG;AAC5B,2BAA2B,GAAG;AAC9B,sBAAsB,GAAG;AACzB,6BAA6B,GAAG;;AAEhC,mCAAmC,GAAG;AACtC,4BAA4B,GAAG;AAC/B,uBAAuB,GAAG;AAC1B,mCAAmC,GAAG;AACtC,gCAAgC,GAAG;AACnC,4BAA4B,GAAG;AAC/B,uBAAuB,GAAG;;AAE1B,yBAAyB,GAAG;AAC5B;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA,6BAA6B,2CAA2C;AACxE;AACA;AACA,8BAA8B,+BAA+B;AAC7D,OAAO;;AAEP;AACA,kBAAkB;AAClB,OAAO;;AAEP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV,sDAAsD;AACtD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACrVA,oBAAoB,mBAAO,CAAC,uEAA4D;;AAExF;;AAEA;AACA;AACA,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sEAAsE,KAAK;AAC3E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,OAAO;AACP;AACA,iCAAiC,OAAO;AACxC;AACA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C;AACA;AACA;AACA;AACA,wCAAwC,OAAO,OAAO,SAAS;AAC/D;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,mDAAmD,KAAK,OAAO,SAAS;AACxE;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC/EA,0BAA0B,mBAAO,CAAC,6EAAkE;;AAEpG;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,EAAE,YAAY;AACjC,UAAU;;AAEV,gCAAgC,GAAG,GAAG;AACtC;AACA;AACA;AACA;AACA,sDAAsD,MAAM;AAC5D;AACA;AACA,UAAU;AACV;AACA;AACA;;;;;;;;;;;AClCA;AACA,qDAAqD;AACrD,oDAAoD,mBAAO,CAAC,uFAA4E;;AAExI;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3BA,6BAA6B,mBAAO,CAAC,gFAAqE;;AAE1G;AACA;AACA;;AAEA;AACA;AACA;;AAEA,mDAAmD;AACnD;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5BA,sCAAsC,mBAAO,CAAC,yEAA8D;;AAE5G,oBAAoB,mBAAO,CAAC,oCAAyB;;AAErD;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,0CAA0C;AAC1C;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC7DA,uBAAuB,mBAAO,CAAC,uEAA4D;;AAE3F;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,GAAG;AACrB,sBAAsB,GAAG;AACzB,yBAAyB,GAAG;AAC5B;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,0BAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,4DAA4D,IAAI;AAChE,cAAc;AACd;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC7LA,8BAA8B,mBAAO,CAAC,iEAAsD;;AAE5F;;;;;;;;;;;ACFA,sCAAsC,mBAAO,CAAC,yEAA8D;;AAE5G;AACA;AACA;;;;;;;;;;;ACJA;AACA,qDAAqD;AACrD,sCAAsC,mBAAO,CAAC,wEAA8D;;AAE5G;AACA;AACA;;;;;;;;;;;ACNA,kCAAkC,mBAAO,CAAC,qEAA0D;;AAEpG;AACA;AACA;;;;;;;;;;;ACJA;AACA,qDAAqD;AACrD,6BAA6B,mBAAO,CAAC,gEAAqD;;AAE1F;;AAEA;;;;;;;;;;;ACNA,sCAAsC,mBAAO,CAAC,yEAA8D;;AAE5G;AACA;AACA;;;;;;;;;;;ACJA,kCAAkC,mBAAO,CAAC,qEAA0D;;AAEpG;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,mBAAO,CAAC,qCAA2B;AACpD,mBAAmB,+DAAmC;;AAEtD;;AAEA;AACA;AACA;;AAEA;AACA,+BAA+B,eAAe;AAC9C,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,uBAAuB,KAAK;AAC5B,0BAA0B,KAAK;AAC/B,wBAAwB,KAAK;AAC7B,mBAAmB,KAAK;AACxB,oBAAoB,KAAK;AACzB,uBAAuB,KAAK;AAC5B,uBAAuB,KAAK;AAC5B,oBAAoB,KAAK;AACzB;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA;;AAEA;AACA;AACA,WAAW;;AAEX;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA,iCAAiC,qBAAqB,GAAG,qBAAqB;;AAE9E,gBAAgB,GAAG,GAAG,qBAAqB;AAC3C;;AAEA;AACA;AACA;AACA,iDAAiD,IAAI;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,kBAAkB;AAClB,OAAO;;AAEP,wBAAwB,0CAA0C;;AAElE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC;AAChC,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,yCAAyC,OAAO;AAC3E,gBAAgB;;AAEhB;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,aAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,OAAO;AAChC,2BAA2B,OAAO;AAClC,0BAA0B,cAAc;AACxC,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,gDAAgD,mBAAmB;AACnE;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,gDAAgD,mBAAmB;AACnE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,GAAG;AACnB;;AAEA;AACA;AACA;AACA,0BAA0B,KAAK;AAC/B;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA,mBAAmB,kBAAkB;AACrC;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,iBAAiB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B;AAC/B;;AAEA;;AAEA;AACA;AACA,+BAA+B;AAC/B;;AAEA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iCAAiC,SAAS,IAAI,QAAQ;AACtD;AACA,4BAA4B,YAAY,SAAS,IAAI,QAAQ,GAAG;AAChE;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC10BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mBAAO,CAAC,0CAA+B;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,mBAAO,CAAC,6CAAkC;AAClE,uBAAuB,mBAAO,CAAC,+BAAqB;;AAEpD;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,kBAAkB;AAChC;AACA,cAAc,WAAW;AACzB,sBAAsB,WAAW;AACjC,eAAe,MAAM;AACrB;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA,kBAAkB,GAAG;AACrB,oBAAoB,GAAG;AACvB,qBAAqB,GAAG;AACxB;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,kBAAkB;AAChC;AACA,cAAc,WAAW;AACzB,cAAc,WAAW;AACzB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,oDAAoD;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV,yBAAyB;AACzB;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,kBAAkB;AAChC;AACA,cAAc,WAAW;AACzB,cAAc,WAAW;AACzB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA,0CAA0C;AAC1C,mCAAmC;;AAEnC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,IAAI;AACJ;;AAEA;;;;;;;;;;;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,mBAAO,CAAC,gDAAqC;;AAExE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;;;;;;;;;;;AC9EA,yBAAyB,mBAAO,CAAC,8CAAmC;;AAEpE;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,mBAAO,CAAC,6CAAkC;;AAElE;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0BAA0B,mBAAO,CAAC,+CAAoC;;AAEtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB,mBAAO,CAAC,8CAAmC;;AAEpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU,GAAG,SAAS;AAC1C,EAAE;AACF;AACA;AACA;AACA,mBAAmB,IAAI,GAAG,WAAW;AACrC,EAAE;AACF;AACA;AACA;AACA,mBAAmB,IAAI,GAAG,QAAQ;AAClC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG,IAAI;AACP,GAAG,QAAQ;AACX,GAAG;AACH;AACA;AACA;;AAEA,yBAAyB,mBAAO,CAAC,8CAAmC;;AAEpE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,mBAAO,CAAC,6CAAkC;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACnDA,mBAAmB,mBAAO,CAAC,2CAAgC;AAC3D,wBAAwB,8EAAkD;;AAE1E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sDAAsD;AACtD;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,yDAAyD,GAAG;AAC5D,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,gDAAgD,yBAAyB;AACzE;AACA;AACA;AACA;;AAEA,iCAAiC;AACjC,uBAAuB,SAAS,GAAG,UAAU,KAAK,IAAI;AACtD,4BAA4B,eAAe;AAC3C;AACA;;;;;;;;;;;ACnHA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;;AAEvF;AACA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;AACA;AACA;;;;;;;;;;;ACvBA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;;AAEvF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC3BA,2BAA2B,mBAAO,CAAC,gDAAqC;AACM;;AAE9E;AACA;;AAEiF;AACJ;;AAE7E;;AAEe;AACf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,8EAAuB;AACxC;;AAEA;AACA,+BAA+B,QAAQ;AACvC;;AAEA;AACA;AACA,mCAAmC,gFAAwB;AAC3D;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,qCAAqC,8EAAsB;;AAE3D;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,oBAAoB;AAC7D;AACA;AACA;AACA;;;;;;;;;;;AC/EA,wBAAwB,mBAAO,CAAC,6CAAkC;AAClE,6BAA6B,mBAAO,CAAC,iDAAsC;;AAE3E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,0BAA0B;AACnE;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,0BAA0B;AACnE;AACA;AACA;AACA;;;;;;;;;;;ACrNA,4BAA4B,mBAAO,CAAC,iDAAsC;AAC1E,iCAAiC,mBAAO,CAAC,qDAA0C;;AAEnF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;AChBA,2BAA2B,mBAAO,CAAC,gDAAqC;AACxE,gCAAgC,mBAAO,CAAC,oDAAyC;;AAEjF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;AChBA,qBAAqB,mBAAO,CAAC,2BAAgB;AAC7C,sCAAsC,mBAAO,CAAC,0DAA+C;;AAE7F;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AChBA,4BAA4B,mBAAO,CAAC,iDAAsC;AAC1E,iCAAiC,mBAAO,CAAC,qDAA0C;;AAEnF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;AChBA,2BAA2B,mBAAO,CAAC,gDAAqC;AACxE,gCAAgC,mBAAO,CAAC,oDAAyC;;AAEjF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;AChBA,0BAA0B,mBAAO,CAAC,+CAAoC;AACtE,+BAA+B,mBAAO,CAAC,mDAAwC;;AAE/E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,wCAAwC,yBAAyB;AACjE;AACA;;AAEA;AACA;AACA;AACA,2CAA2C,4BAA4B;AACvE;AACA;;AAEA;AACA;AACA;AACA,wCAAwC,yBAAyB;AACjE;AACA;AACA;AACA;;;;;;;;;;;ACzCA,uCAAuC,mBAAO,CAAC,4DAAiD;AAChG,4CAA4C,mBAAO,CAAC,gEAAqD;;AAEzG;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC9CuF;AACS;;AAEjF,sCAAsC,gFAA2B;AAChF;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA,iBAAiB,uFAAgC;AACjD;AACA;;;;;;;;;;;ACZA,4BAA4B,mBAAO,CAAC,iDAAsC;AAC1E,iCAAiC,mBAAO,CAAC,qDAA0C;;AAEnF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;;;;;;;;;;;;;;;;;;AC/ByE;AACS;;AAEnE,+BAA+B,yEAAoB;AAClE;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA,iBAAiB,gFAAyB;AAC1C;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AClCyE;AACS;;AAEnE,+BAA+B,yEAAoB;AAClE;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA,iBAAiB,gFAAyB;AAC1C;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClCA,2BAA2B,mBAAO,CAAC,gDAAqC;AACxE,gCAAgC,mBAAO,CAAC,oDAAyC;;AAEjF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,cAAc,QAAQ;AACtB;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1CA,yBAAyB,mBAAO,CAAC,8CAAmC;AACpE,8BAA8B,mBAAO,CAAC,kDAAuC;;AAE7E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,cAAc,QAAQ;AACtB;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;AACA;AACA;;;;;;;;;;;AC9BA,iCAAiC,mBAAO,CAAC,sDAA2C;AACpF,sCAAsC,mBAAO,CAAC,yDAA+C;;AAE7F;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,gCAAgC,mBAAO,CAAC,qDAA0C;AAClF;AACA,GAAG,qFAAyD;;AAE5D,qCAAqC,mBAAO,CAAC,yDAA8C;;AAE3F;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACrCA,+BAA+B,mBAAO,CAAC,mDAAyC;AAChF,oCAAoC,mBAAO,CAAC,wDAA6C;;AAEzF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;;AAEvF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,6BAA6B,mBAAO,CAAC,kDAAuC;AAC5E,kCAAkC,mBAAO,CAAC,sDAA2C;;AAErF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;AChBA,6BAA6B,mBAAO,CAAC,kDAAuC;AAC5E,kCAAkC,mBAAO,CAAC,sDAA2C;;AAErF;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrBA,6BAA6B,mBAAO,CAAC,iDAAuC;AAC5E,kCAAkC,mBAAO,CAAC,sDAA2C;;AAErF;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrBA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;;AAEvF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,kBAAkB;;AAElB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5CA,uBAAuB,mBAAO,CAAC,4CAAiC;AAChE,4BAA4B,mBAAO,CAAC,gDAAqC;AACzE,yBAAyB,mBAAO,CAAC,+BAAoB;AACrD,yBAAyB,mBAAO,CAAC,+BAAoB;AACrD,0BAA0B,mBAAO,CAAC,gCAAqB;AACvD,6BAA6B,mBAAO,CAAC,mCAAwB;AAC7D,iCAAiC,mBAAO,CAAC,uCAA4B;AACrE,0BAA0B,mBAAO,CAAC,gCAAqB;AACvD,uBAAuB,mBAAO,CAAC,6BAAkB;;AAEjD;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B,cAAc,UAAU;AACxB,cAAc,kBAAkB;AAChC,cAAc,kBAAkB;AAChC;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,+DAA+D;;AAE/D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B,cAAc,UAAU;AACxB,cAAc,QAAQ;AACtB;AACA,eAAe,SAAS;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B,6BAA6B,EAAE,aAAa;AACvE;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,8BAA8B,SAAS,IAAI,YAAY;AACvD;AACA,aAAa;;AAEb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,KAAK;AACtD,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iCAAiC,cAAc;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;;AAEA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACrkBA,6BAA6B,mBAAO,CAAC,kDAAuC;AAC5E,kCAAkC,mBAAO,CAAC,sDAA2C;;AAErF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,+BAA+B,mBAAO,CAAC,oDAAyC;AAChF,oCAAoC,mBAAO,CAAC,wDAA6C;;AAEzF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;AACvF;AACA,GAAG,qFAAyD;AAC5D;AACA,GAAG,sFAA0D;;AAE7D;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;AACb;AACA;AACA,qEAAqE;AACrE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACrGA,6BAA6B,mBAAO,CAAC,iDAAuC;AAC5E,kCAAkC,mBAAO,CAAC,sDAA2C;;AAErF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,iCAAiC,mBAAO,CAAC,sDAA2C;AACpF,sCAAsC,mBAAO,CAAC,0DAA+C;;AAE7F;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,2BAA2B,mBAAO,CAAC,gDAAqC;AACxE,gCAAgC,mBAAO,CAAC,mDAAyC;;AAEjF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACzCA,2BAA2B,mBAAO,CAAC,gDAAqC;AACxE,gCAAgC,mBAAO,CAAC,oDAAyC;;AAEjF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,6BAA6B,mBAAO,CAAC,kDAAuC;AAC5E,kCAAkC,mBAAO,CAAC,sDAA2C;;AAErF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,+BAA+B,mBAAO,CAAC,mDAAyC;AAChF,oCAAoC,mBAAO,CAAC,wDAA6C;;AAEzF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,qCAAqC,mBAAO,CAAC,0DAA+C;AAC5F,0CAA0C,mBAAO,CAAC,8DAAmD;;AAErG;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACdA,mCAAmC,mBAAO,CAAC,wDAA6C;AACxF,wCAAwC,mBAAO,CAAC,4DAAiD;;AAEjG;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACdA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;;AAEvF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,2BAA2B,mBAAO,CAAC,gDAAqC;AACxE,gCAAgC,mBAAO,CAAC,oDAAyC;;AAEjF;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACbwE;;AAExE,wBAAwB,mBAAO,CAAC,6CAAkC;;AAEnD;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA,iBAAiB,2EAAoB;AACrC;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA,QAAQ;AACR;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,mDAAmD,+BAA+B;AAClF;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACzCA,uBAAuB,mBAAO,CAAC,4CAAiC;AACM;AACG;AACzE;AACA,GAAG,sFAA0D;;AAE9C;AACf;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,0DAA0D;;AAE1D;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA,iBAAiB,0EAAmB;AACpC;;AAEA;AACA;AACA,mCAAmC,gFAAgB;AACnD;AACA,eAAe,QAAQ;AACvB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA;;AAE0C;;AAE3B,sCAAsC,mDAAO;AAC5D;AACA;;AAEA;AACA,yBAAyB,OAAO;AAChC,kBAAkB,OAAO;AACzB,OAAO;;AAEP;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,mCAAmC;AACpD,iBAAiB,qCAAqC;AACtD,iBAAiB,iCAAiC;AAClD,iBAAiB,mCAAmC;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,2BAA2B,2BAA2B;AACtD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA,iFAAiF,KAAK;AACtF;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC9OA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE0C;AACH;;AAEvC;;AAEe,wCAAwC,mDAAO;AAC9D;;AAEA;AACA;;AAEA;AACA,uBAAuB,OAAO;AAC9B,oBAAoB,OAAO;AAC3B,OAAO;;AAEP;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;;AAEV,4BAA4B,mDAAU;AACtC,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,cAAc;;AAE7D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;;AAEA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,iBAAiB;AACjB;AACA;AACA,aAAa;AACb,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AChPA;AACA;AACA;AACA;AACA;AACA;;AAE0C;;AAE1C;;AAEe,uDAAuD,mDAAO;AAC7E;AACA;;AAEA;AACA,uBAAuB,OAAO;AAC9B,kBAAkB,OAAO;AACzB,kBAAkB,OAAO;AACzB,OAAO;;AAEP;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA,eAAe,OAAO,IAAI,YAAY;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,aAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,wCAAwC;AACzD,iBAAiB,yCAAyC;AAC1D;AACA;AACA;AACA;AACA,iBAAiB,+BAA+B;AAChD,iBAAiB,gCAAgC;AACjD;AACA;AACA;AACA;AACA;AACA,iBAAiB,+BAA+B;AAChD,iBAAiB,gCAAgC;AACjD;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+DAA+D,wBAAwB;AACvF;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+DAA+D,wBAAwB;AACvF;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,MAAM;AACpB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yCAAyC;;AAEzC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;;;;;;;;;;;ACtkBA,wBAAwB,mBAAO,CAAC,6CAAkC;AAClE,6BAA6B,mBAAO,CAAC,iDAAsC;;AAE3E;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC9BA,yBAAyB,mBAAO,CAAC,8CAAmC;AACpE,8BAA8B,mBAAO,CAAC,kDAAuC;;AAE7E;AACA,GAAG,sFAA0D;;AAE9C;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;AACA;AACA;;;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,8EAAkD;AAC1E,mBAAmB,mBAAO,CAAC,yBAAc;AACzC,yBAAyB,mBAAO,CAAC,+BAAoB;;AAErD;AACA;;AAEA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV,sBAAsB,YAAY;AAClC;;AAEA,+CAA+C;AAC/C,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,kCAAkC,QAAQ,GAAG,MAAM,GAAG,MAAM;AAC5D;;AAEA;;AAEA;AACA,0CAA0C;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,yCAAyC,cAAc;;AAEvD;AACA;AACA;AACA;AACA;AACA;;AAEA,kDAAkD,cAAc;AAChE,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,kDAAkD,cAAc;AAChE,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kDAAkD,cAAc;AAChE,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB,kDAAkD,cAAc;AAChE,sBAAsB;AACtB;;AAEA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC/PA,wBAAwB,mBAAO,CAAC,6CAAkC;AAClE,6BAA6B,mBAAO,CAAC,iDAAsC;;AAE3E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxBA,yBAAyB,mBAAO,CAAC,8CAAmC;AACpE,8BAA8B,mBAAO,CAAC,kDAAuC;;AAE7E;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpBA,uBAAuB,mBAAO,CAAC,4CAAiC;AAChE,4BAA4B,mBAAO,CAAC,gDAAqC;;AAEzE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;AACA;AACA;;;;;;;;;;;AC5BA,uBAAuB,mBAAO,CAAC,4CAAiC;AAChE,4BAA4B,mBAAO,CAAC,gDAAqC;;AAEzE;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;;AAEvF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,uBAAuB,mBAAO,CAAC,4CAAiC;;AAEhE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC/DA,wBAAwB,mBAAO,CAAC,6CAAkC;AAClE,6BAA6B,mBAAO,CAAC,iDAAsC;;AAE3E;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;AACA;AACA;;;;;;;;;;;AC7BA,iCAAiC,mBAAO,CAAC,sDAA2C;AACpF,sCAAsC,mBAAO,CAAC,0DAA+C;;AAE7F;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpBA,4BAA4B,mBAAO,CAAC,iDAAsC;AAC1E,iCAAiC,mBAAO,CAAC,qDAA0C;;AAEnF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACpBA,sBAAsB,mBAAO,CAAC,2CAAgC;;AAE9D,2BAA2B,mBAAO,CAAC,+CAAoC;;AAEvE;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;;;;;;;;;;AC9CA,uBAAuB,mBAAO,CAAC,4CAAiC;;AAEhE,4BAA4B,mBAAO,CAAC,gDAAqC;;AAEzE;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACbA,yBAAyB,mBAAO,CAAC,8CAAmC;;AAEpE;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;;AAEA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC9BA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,oCAAoC,YAAY;AAChD;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,iBAAiB,iBAAiB;AAClC;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA,0CAA0C,aAAa;;AAEvD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kBAAkB,IAAI,SAAS,QAAQ;AACvC;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACrIA,wBAAwB,gEAAoC;AAC5D,oBAAoB,mBAAO,CAAC,8BAAmB;;AAE/C;AACA;AACA;AACA;AACA,oCAAoC,YAAY;AAChD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB,oBAAoB,UAAU;AAC9B;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,4CAA4C,IAAI;AAChD;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;;AAEtB;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA,mBAAmB;AACnB;AACA,4CAA4C,IAAI;AAChD;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;;AAEA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB;AAChB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,WAAW;AAClC;AACA,uBAAuB,UAAU;AACjC;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA,UAAU;;AAEV;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA;;AAEA,8BAA8B,cAAc;;AAE5C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,aAAa;AACb;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,0CAA0C,EAAE;AAC5C;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,uCAAuC;AACxD,iBAAiB,yCAAyC;AAC1D;AACA;AACA,iBAAiB,uCAAuC;AACxD,iBAAiB,yCAAyC;AAC1D;AACA;AACA,iBAAiB,yCAAyC;AAC1D,iBAAiB,+CAA+C;AAChE;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAmB;AAC5C,kDAAkD,OAAO,YAAY,QAAQ;AAC7E,gBAAgB;AAChB;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,0BAA0B;AACrC;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,GAAG;AACxE;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,kCAAkC,cAAc;;AAEhD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,mBAAmB,2BAA2B;AAC9C,qBAAqB,kBAAkB;AACvC;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB,WAAW,GAAG,eAAe;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;;AAEb;AACA,+BAA+B,UAAU,GAAG,WAAW,GAAG,eAAe;;AAEzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;;AAEnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,gBAAgB;;AAEhB;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,sCAAsC;AACtC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA,cAAc,qCAAqC;AACnD,UAAU;;AAEV;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sDAAsD;;AAEtD,mDAAmD;;AAEnD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6CAA6C,GAAG;AAChD;AACA;AACA,mCAAmC,SAAS;AAC5C;AACA,UAAU;AACV;AACA,sDAAsD,GAAG;AACzD;AACA;AACA,4CAA4C,cAAc;AAC1D;AACA,6CAA6C,GAAG;AAChD;AACA,6CAA6C,GAAG;AAChD,+CAA+C,GAAG;;AAElD;AACA;AACA,QAAQ;AACR,oDAAoD,iBAAiB;AACrE;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,4CAA4C,OAAO;AACnD,sCAAsC,QAAQ;AAC9C,4CAA4C,SAAS;AACrD,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,uBAAuB;AAC7C;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,4BAA4B;AAC7C;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,0BAA0B;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA,iCAAiC,GAAG;AACpC;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,2BAA2B,cAAc;AACzC;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,6CAA6C,iBAAiB;;AAE9D;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,4CAA4C,iBAAiB;;AAE7D;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,6BAA6B,+BAA+B;AAC5D,WAAW;;AAEX;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU,MAAM,MAAM,oBAAoB;AAC1C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,mBAAmB;AACnB;;AAEA;AACA,oDAAoD;;AAEpD;AACA;AACA;AACA,mBAAmB;AACnB,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0CAA0C,+BAA+B;AACzE;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;AAC5B;AACA,sBAAsB;;AAEtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;;AAEA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA,aAAa;;AAEb;AACA,4BAA4B,8BAA8B;AAC1D,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iDAAiD;AAClE;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;ACz3DgD;;AAEjC,sCAAsC,wDAAe;AACpE;AACA;AACA;AACA,qCAAqC,YAAY;AACjD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,6CAA6C;AAC7C;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gDAAgD,GAAG;AACnD;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA,0CAA0C,GAAG;AAC7C;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,eAAe,cAAc,EAAE,YAAY;AAC3C;AACA;AACA;AACA;AACA;AACA,kBAAkB,cAAc,kBAAkB,YAAY;AAC9D;AACA;AACA;AACA;AACA;AACA,kBAAkB,cAAc,cAAc,YAAY;AAC1D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,uBAAuB,mBAAmB,GAAG,OAAO;AACpD;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA,qCAAqC,OAAO;AAC5C;AACA,UAAU;AACV,kCAAkC,OAAO;AACzC;AACA,UAAU;AACV;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kCAAkC,cAAc;AAChD;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;AACb;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,+BAA+B;AAC5D;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,kBAAkB,wBAAwB,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AACrP,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB,mBAAmB;AACnB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gDAAgD,mBAAmB,GAAG,MAAM;AAC5E;AACA,mCAAmC,kCAAkC;AACrE,yBAAyB,WAAW,GAAG,qBAAqB;AAC5D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,UAAU;;AAE1C;AACA;AACA;;;;;;;;;;;AClhBA,sCAAsC,mBAAO,CAAC,4CAAiC;;AAE/E;AACA;AACA;AACA;AACA,mDAAmD,YAAY;AAC/D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,0CAA0C,uBAAuB,GAAG;AACpE;AACA,UAAU;AACV;AACA;AACA,oDAAoD,uBAAuB,GAAG;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACvDA,sCAAsC,mBAAO,CAAC,4CAAiC;;AAE/E;AACA;AACA;AACA;AACA,kDAAkD,YAAY;AAC9D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,0CAA0C,uBAAuB,GAAG;AACpE;AACA,UAAU;AACV;AACA;AACA;AACA,6CAA6C,uBAAuB,GAAG;AACvE;AACA;AACA;AACA,uDAAuD,uBAAuB,GAAG;AACjF;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACnDA,iCAAiC,mBAAO,CAAC,uCAA4B;;AAErE;AACA;AACA,+CAA+C,YAAY;AAC3D;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC7DA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,2CAA2C,YAAY;AACvD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,6BAA6B,wBAAwB;AAC9E;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACtDA,sCAAsC,mBAAO,CAAC,4CAAiC;;AAE/E;AACA;AACA;AACA;AACA,mDAAmD,YAAY;AAC/D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,0CAA0C,uBAAuB,GAAG;AACpE;AACA,UAAU;AACV;AACA;AACA,oDAAoD,uBAAuB,GAAG;AAC9E;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACtCA,sCAAsC,mBAAO,CAAC,4CAAiC;;AAE/E;AACA;AACA;AACA;AACA,kDAAkD,YAAY;AAC9D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,uBAAuB,GAAG;AAC/E;AACA;AACA,iDAAiD,uBAAuB,GAAG;AAC3E;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC7BA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,oCAAoC,YAAY;AAChD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,mDAAmD,cAAc;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,mDAAmD,cAAc;;AAEjE;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,0BAA0B;;AAE1B;;AAEA,iCAAiC;;AAEjC;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,gDAAgD,cAAc;;AAE9D;;AAEA;;AAEA;AACA,qCAAqC,cAAc;AACnD;;AAEA;AACA;AACA;;AAEA;;AAEA,gDAAgD,cAAc;;AAE9D;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;ACrTA;AACA;AACA;AACA;AAC6C;;AAE9B,8BAA8B,mDAAO;AACpD;AACA,gCAAgC,YAAY;;AAE5C;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA,uBAAuB,cAAc;AACrC,uBAAuB,QAAQ;AAC/B,uBAAuB,IAAI;AAC3B;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA,4BAA4B,cAAc;AAC1C,4BAA4B,QAAQ;AACpC,6BAA6B,IAAI;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpMA,iCAAiC,mBAAO,CAAC,uCAA4B;;AAErE;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,YAAY;AAC7D;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA,yBAAyB,aAAa;AACtC,yBAAyB,eAAe;AACxC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACtKgD;;AAEjC,+CAA+C,wDAAe;AAC7E;AACA;AACA;AACA,8CAA8C,YAAY;AAC1D;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kCAAkC,oBAAoB,OAAO,YAAY;AACzE;AACA;AACA,uBAAuB,yBAAyB;AAChD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA,oEAAoE;AACpE,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;;AAEA;AACA,iCAAiC,yBAAyB,EAAE,YAAY;AACxE;AACA;AACA;;AAEA;AACA;AACA;;AAEA,2BAA2B,wBAAwB;AACnD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,kCAAkC;AAC7D;AACA;AACA;AACA;;;;;;;;;;;AC3IA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA,mDAAmD,YAAY;;AAE/D;AACA;;AAEA;AACA,uBAAuB,eAAe;AACtC;AACA,UAAU;AACV;;AAEA;AACA,uBAAuB,eAAe;AACtC;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,+CAA+C;AAC/C;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2DAA2D,YAAY;;AAEvE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B,QAAQ,GAAG,OAAO;;AAE7C;;AAEA;AACA;AACA,4BAA4B,0BAA0B,6BAA6B,oCAAoC;AACvH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;;;;;;;;;;;AC1LgD;AACY;AACgB;AACrD;;AAER,wCAAwC,wDAAe;AACtE;AACA;AACA;AACA,uCAAuC,YAAY;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA,yDAAyD;AACzD;;AAEA;AACA;;AAEA,UAAU;AACV;AACA,oCAAoC,kEAAgB;AACpD,wCAAwC,yBAAyB;AACjE;AACA;AACA;AACA;AACA,OAAO;;AAEP,8BAA8B,gFAAkB;AAChD;AACA,0CAA0C,yBAAyB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,yBAAyB;AACrF;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,yBAAyB;AACnF;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,mDAAmD,yBAAyB;AAC5E;AACA;AACA,yCAAyC,oBAAoB;AAC7D;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB,iBAAiB;AACjB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB,uBAAuB;AACvB;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB;;AAElB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA,qCAAqC,oBAAoB,OAAO,YAAY;AAC5E;AACA;AACA,0BAA0B,yBAAyB;AACnD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA;AACA,uEAAuE;AACvE,gBAAgB;AAChB,aAAa;AACb;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,yBAAyB,EAAE,YAAY;AACtD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,QAAQ;AACR;AACA;AACA;;AAEA,2BAA2B,gCAAgC;AAC3D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA,WAAW,qDAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA,WAAW,qDAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,0BAA0B,yBAAyB;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,yBAAyB;AACjD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,yBAAyB;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AC3agD;AACjC,wCAAwC,wDAAe;AACtE;AACA;AACA;AACA,uCAAuC,YAAY;AACnD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACrDA,wBAAwB,gEAAoC;AAC5D,8BAA8B,mBAAO,CAAC,oCAAyB;AAC/D;AACA,GAAG,uFAA2D;;AAE9D;AACA;AACA;AACA;AACA,qCAAqC,YAAY;AACjD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,MAAM,EAAE,YAAY;AACnD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAM,EAAE,MAAM,EAAE,YAAY;AACtD;AACA;AACA;AACA,iCAAiC,MAAM,EAAE,MAAM,EAAE,YAAY;AAC7D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtYA,kCAAkC,mBAAO,CAAC,wCAA6B;;AAEvE;AACA;AACA;AACA;AACA,wDAAwD,YAAY;AACpE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iDAAiD,mBAAmB;AACpE;AACA,iBAAiB,EAAE,2DAA2D;;AAE9E;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACvCA,sBAAsB,mBAAO,CAAC,gCAAqB;AACnD,iCAAiC,mBAAO,CAAC,uCAA4B;;AAErE;AACA;AACA,gDAAgD,YAAY;AAC5D;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kCAAkC,8BAA8B,EAAE,YAAY;;AAE9E;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB,uEAAuE,eAAe,6BAA6B,OAAO,WAAW,UAAU,MAAM;AACrJ;;AAEA;AACA,oBAAoB;AACpB;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sDAAsD,WAAW;AACjE;;AAEA;AACA;AACA,yBAAyB;AACzB;AACA,kEAAkE,eAAe,WAAW,UAAU,cAAc,SAAS,UAAU,MAAM;AAC7I;AACA,sBAAsB;;AAEtB;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACnOA,kCAAkC,mBAAO,CAAC,wCAA6B;;AAEvE;AACA;AACA;AACA;AACA,uDAAuD,YAAY;AACnE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,YAAY;AAC9D;AACA,iBAAiB,EAAE,2DAA2D;;AAE9E;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA,uDAAuD,YAAY;AACnE;AACA,UAAU;AACV,6DAA6D,SAAS;;AAEtE;AACA;AACA;;;;;;;;;;;AC3CA,kCAAkC,mBAAO,CAAC,wCAA6B;;AAEvE;AACA;AACA;AACA;AACA,sDAAsD,YAAY;AAClE;;AAEA;AACA;AACA;AACA;;AAEA,6DAA6D;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,mBAAmB;AAClE;AACA,iBAAiB,EAAE,2DAA2D;;AAE9E;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,6DAA6D;AAC7D;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC1EA,kCAAkC,mBAAO,CAAC,wCAA6B;;AAEvE;AACA;AACA;AACA;AACA,qDAAqD,YAAY;AACjE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,mBAAmB,EAAE,WAAW;AAC9E;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA,cAAc,2BAA2B;AACzC;AACA;AACA;AACA,mCAAmC,wBAAwB,oCAAoC,wBAAwB,SAAS,KAAK,SAAS,MAAM,IAAI,UAAU,SAAS,kBAAkB;AAC7L,qBAAqB,SAAS;AAC9B;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACjEA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uCAAuC,YAAY;AACnD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA,gCAAgC;AAChC;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,4CAA4C,kBAAkB,kBAAkB;AAChF,oDAAoD,aAAa,mBAAmB,gBAAgB;;AAEpG;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA,oEAAoE;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA,mCAAmC,OAAO,yBAAyB;AACnE;AACA;;AAEA,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;;;;;;;;;;;AC1IA,kCAAkC,mBAAO,CAAC,wCAA6B;;AAEvE;AACA;AACA;AACA;AACA,oDAAoD,YAAY;AAChE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,mBAAmB,EAAE,WAAW;AAC7E;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC9BA,kCAAkC,mBAAO,CAAC,wCAA6B;;AAEvE;AACA;AACA;AACA;AACA,oDAAoD,YAAY;AAChE;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,mCAAmC,eAAe;AAClD;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,SAAS,IAAI,KAAK;AACpD;AACA,mBAAmB;;AAEnB;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;;AAEA;AACA,8GAA8G,OAAO,WAAW,IAAI,KAAK;AACzI,UAAU;;AAEV;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC5FA,sBAAsB,mBAAO,CAAC,wDAA6C;AAC3E,oBAAoB,mBAAO,CAAC,oEAAyD;AACrF,mBAAmB,mBAAO,CAAC,gDAAqC;AAChE,cAAc,mBAAO,CAAC,wCAA6B;AACnD,eAAe,mBAAO,CAAC,uBAAY;;AAEnC,uBAAuB,mBAAO,CAAC,4CAAiC;AAChE,qBAAqB,mBAAO,CAAC,yCAA+B;AAC5D,sBAAsB,mBAAO,CAAC,gCAAqB;;AAEnD,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,wCAAwC,YAAY;AACpD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,wDAAwD,MAAM,EAAE,YAAY;AAC5E;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,6CAA6C,YAAY,GAAG,WAAW;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B;;AAE/B;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;;AAE5B;AACA,yBAAyB;;AAEzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA,sBAAsB;AACtB,gBAAgB;AAChB;AACA,UAAU;;AAEV;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,gBAAgB,iBAAiB,oCAAoC;;AAErE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B,aAAa;;AAE1C;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;;AAEA;AACA;AACA,aAAa;;AAEb;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mEAAmE,uBAAuB,sBAAsB,GAAG,SAAS;;AAE5H;AACA;;AAEA;AACA;;AAEA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,gDAAgD;AAChD,iBAAiB;AACjB;;AAEA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA,4BAA4B,KAAK;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,wDAAwD;;AAExD,8EAA8E;;AAE9E;;AAEA,+CAA+C;AAC/C;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA,cAAc;AACd;;AAEA;;AAEA;AACA;AACA;;AAEA,wEAAwE;;AAExE;;AAEA,yCAAyC;AACzC;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iDAAiD,EAAE;AACnD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;;AAE/D;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB,aAAa;AACb,uBAAuB;AACvB,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;;;;;;;;;;ACr2BA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA,oDAAoD,YAAY;AAChE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,yCAAyC,QAAQ;AACjD;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,yCAAyC,QAAQ;AACjD;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,wCAAwC,QAAQ;AAChD;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA,0EAA0E;;AAE1E;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC;;AAEhC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;;;;;;;;;;;AC9OA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA,sDAAsD,YAAY;AAClE;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACdA,wBAAwB,gEAAoC;AAC5D,uBAAuB,mBAAO,CAAC,8BAAmB;AAClD,0BAA0B,mBAAO,CAAC,iCAAsB;AACxD,yBAAyB,mBAAO,CAAC,gCAAqB;AACtD,0BAA0B,mBAAO,CAAC,iCAAsB;AACxD,uBAAuB,mBAAO,CAAC,8BAAmB;;AAElD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB,aAAa,GAAG,KAAK;AAC1C;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;;AAEV;;AAEA;AACA;;AAEA,2CAA2C;AAC3C;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,iBAAiB;AAC9E;AACA,4BAA4B;AAC5B;AACA,0BAA0B;AAC1B;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb,UAAU;AACV,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sCAAsC,cAAc;AACpD;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yCAAyC,iBAAiB,KAAK;AAC/D;;AAEA;AACA;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;;AAEV;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,4CAA4C;;AAE5C;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACnkBA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,YAAY;AACpD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,uDAAuD,iBAAiB;;AAExE;AACA;AACA;AACA,UAAU;AACV;;AAEA,4CAA4C;AAC5C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA,oBAAoB,OAAO;AAC3B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAY,GAAG,UAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,eAAe,YAAY,GAAG,WAAW;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc,GAAG,SAAS;AACjD;AACA,UAAU;;AAEV;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,6BAA6B,cAAc;AAC3C;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,+DAA+D;;AAE/D;;AAEA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,kEAAkE,EAAE;AACpE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,mDAAmD,EAAE;AACrD;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;;AAEA;AACA,wBAAwB,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,mBAAmB;AACxF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kCAAkC,cAAc;AAChD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACjqBA,gCAAgC,mBAAO,CAAC,qCAA2B;AACnE,qBAAqB,mBAAO,CAAC,yCAA+B;AAC5D,0BAA0B,mBAAO,CAAC,kEAAuD;;AAEzF;;AAEA;AACA;AACA;AACA;AACA,oDAAoD,YAAY;AAChE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mEAAmE,eAAe,kBAAkB,WAAW,yBAAyB,wBAAwB,iBAAiB,oBAAoB,eAAe,+BAA+B,cAAc;AACjQ;AACA,mEAAmE,kBAAkB,uBAAuB,mBAAmB,aAAa,WAAW,qBAAqB,wBAAwB,iBAAiB,oBAAoB,eAAe,WAAW,cAAc;AACjR;;AAEA;AACA;;AAEA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA,gDAAgD,2BAA2B;AAC3E;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,2BAA2B;AAC3B;;AAEA;AACA;AACA,uDAAuD;AACvD,uDAAuD;AACvD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,qBAAqB;AACrB;;AAEA;AACA,wBAAwB,cAAc,EAAE,WAAW,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB;AAC3G;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC3LA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA,wDAAwD,YAAY;AACpE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACvHA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,qCAAqC,YAAY;AACjD,yBAAyB,cAAc;AACvC;AACA;;AAEA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,wCAAwC;AACxC;AACA,mDAAmD;AACnD;;AAEA;;AAEA;AACA;AACA,2BAA2B,WAAW,UAAU,WAAW,EAAE,UAAU;AACvE;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA,qBAAqB,WAAW,EAAE,kBAAkB,EAAE,UAAU;AAChE;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;ACpGA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA,kDAAkD,YAAY;AAC9D;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,8BAA8B;AAC3D,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC,sBAAsB;AACxD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,+BAA+B,sBAAsB;AACrD;AACA;AACA,UAAU;AACV;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrKA,gCAAgC,mBAAO,CAAC,qCAA2B;AACnE,wBAAwB,mBAAO,CAAC,2DAAgD;;AAEhF;AACA;AACA;AACA;AACA,oDAAoD,YAAY;;AAEhE;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACxBA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,YAAY;AACrD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,4BAA4B;AAC/C;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;;AAER;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,0DAA0D,kBAAkB,WAAW,yBAAyB,wBAAwB,iBAAiB,mBAAmB,gCAAgC,YAAY;AACxN;AACA,oDAAoD,wBAAwB,IAAI,uBAAuB,mBAAmB,aAAa,WAAW,yBAAyB,wBAAwB,iBAAiB,mBAAmB,IAAI,YAAY;AACvP;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,uCAAuC,cAAc;AACrD;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC3HA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA,4DAA4D,YAAY;AACxE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,gDAAgD,SAAS;AACzD;;AAEA;;AAEA;AACA,4DAA4D,eAAe,WAAW,UAAU,cAAc,OAAO,UAAU,KAAK;AACpI;AACA,gBAAgB;;AAEhB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC3FA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA,0DAA0D,YAAY;AACtE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gDAAgD,WAAW;AAC3D;;AAEA;AACA,4DAA4D,eAAe,WAAW,UAAU,cAAc,SAAS,UAAU,YAAY;AAC7I;;AAEA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;;;;;;;;;;ACzEA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA,qDAAqD,YAAY;AACjE;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,iCAAiC,cAAc,OAAO,kBAAkB;AACxE;AACA,iBAAiB,EAAE,0BAA0B;;AAE7C;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChFA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA,kDAAkD,YAAY;AAC9D;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,0DAA0D,kBAAkB,WAAW,yBAAyB,wBAAwB,iBAAiB,mBAAmB,+BAA+B,cAAc;AACzN;AACA,6DAA6D,uBAAuB,mBAAmB,aAAa,WAAW,yBAAyB,wBAAwB,iBAAiB,mBAAmB,WAAW,cAAc;AAC7O;;AAEA;;AAEA;;AAEA,0BAA0B,cAAc;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iDAAiD,SAAS;;AAE1D;AACA;AACA,8BAA8B;AAC9B;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;AC3EgD;;AAEjC,mCAAmC,wDAAe;AACjE;AACA;AACA;AACA,kCAAkC,YAAY;AAC9C;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU,UAAU,SAAS,SAAS;AACtC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,qCAAqC;AACnD;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,0BAA0B,2BAA2B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,UAAU;AACV,yBAAyB,6BAA6B;AACtD,wBAAwB;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,cAAc,iDAAiD;AAC/D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kEAAkE,kCAAkC;AACpG;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kEAAkE,kCAAkC;AACpG;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACzkBgD;AACK;AACa;AACN;;AAE7C,kCAAkC,wDAAe;AAChE;AACA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA;AACA;;AAEA,gCAAgC,KAAK;AACrC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA,yDAAyD;AACzD;;AAEA;AACA;AACA;AACA,UAAU,IAAI;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA,6BAA6B,8DAAa;AAC1C;AACA,UAAU;AACV;;AAEA,0CAA0C,kEAAsB;AAChE;AACA;AACA;AACA;;AAEA,6CAA6C,kEAAgB;AAC7D;AACA;AACA;AACA,OAAO;AACP,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,aAAa;AACb;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,UAAU,QAAQ,aAAa,aAAa,GAAG,cAAc;AAC7D;AACA;;AAEA;AACA;;AAEA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,UAAU;AACnC,sBAAsB,UAAU;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA,mBAAmB,UAAU;AAC7B;AACA,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,kCAAkC;AACpE;;AAEA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,cAAc;AACd;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,kCAAkC;AAClC,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,cAAc;AAC1D;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA,cAAc,KAAK;AACnB,mBAAmB,eAAe,UAAU;AAC5C,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mBAAmB;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA,mBAAmB;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,sBAAsB;;AAEtB;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,wCAAwC,qBAAqB;AAC7D,+BAA+B,kBAAkB,IAAI,QAAQ;AAC7D;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;;AAEpB,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,gBAAgB;AAChB,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB;AACnB,oBAAoB,wEAAwE;;AAE5F;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,mBAAmB;AACnB,WAAW;AACX,QAAQ;;AAER;;AAEA;;AAEA;AACA,mCAAmC;AACnC;AACA;AACA;;AAEA;;AAEA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uDAAuD,EAAE;AACzD;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B;AAC5B,8BAA8B;AAC9B;AACA;AACA;AACA,yBAAyB;AACzB,OAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA,4CAA4C;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,iBAAiB,KAAK;AAClE;;AAEA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sCAAsC,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,sCAAsC;AACtC;AACA;;AAEA;AACA,UAAU,OAAO;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,6CAA6C;AACnE;AACA,kDAAkD,kBAAkB;AACpE,mBAAmB,wBAAwB;AAC3C,UAAU;AACV;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,wBAAwB;AAC3C,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2CAA2C;AAC9D,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,kBAAkB;AAC5D,mBAAmB,wBAAwB;AAC3C,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2CAA2C,mBAAmB;AAC9D,mBAAmB,wBAAwB;AAC3C,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B;AAC9B;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA,gBAAgB,QAAQ,GAAG,uCAAuC;AAClE;;AAEA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA,2CAA2C,eAAe;;AAE1D;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,yCAAyC,oBAAoB;;AAE7D;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA,WAAW;AACX;AACA,iDAAiD,kBAAkB,eAAe,gBAAgB;AAClG;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV,QAAQ;AACR;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACr2EA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,kCAAkC,YAAY;AAC9C,yBAAyB,WAAW;AACpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,iBAAiB;AACjB;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,+BAA+B,kBAAkB,YAAY,gBAAgB,WAAW,eAAe;AACvG;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AClDA,wBAAwB,gEAAoC;AAC5D,wBAAwB,mBAAO,CAAC,yCAA8B;;AAE9D;AACA;AACA;AACA;AACA,mCAAmC,YAAY;AAC/C;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,gDAAgD,uBAAuB,iCAAiC;AACzH;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,4DAA4D,UAAU;AACtE;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,cAAc;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,cAAc;AACd;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,kCAAkC,SAAS;AAC3C,kCAAkC,SAAS;AAC3C,kCAAkC,SAAS;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChkBA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA,+CAA+C,YAAY;AAC3D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACxDA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA,gDAAgD,YAAY;;AAE5D,wDAAwD,KAAK;;AAE7D;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,UAAU;AACV,6BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACxEA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,iCAAiC,YAAY;AAC7C,yBAAyB,UAAU;AACnC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACnDA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,qDAAqD;AAC1E;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA,QAAQ;AACR;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,yBAAyB,gBAAgB,EAAE,SAAS,EAAE,aAAa;AACnE;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC3PA,wBAAwB,gEAAoC;;AAE5D;AACA;;AAEA;AACA;AACA;AACA;AACA,wCAAwC,YAAY;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,kCAAkC,0BAA0B,IAAI,IAAI;AACpE,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8OAGL;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA,6CAA6C,WAAW;AACxD;AACA,aAAa;;AAEb;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B,aAAa;AACvC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;AACb,UAAU;;AAEV;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,+BAA+B,0BAA0B;AACzD;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,6BAA6B,aAAa,GAAG,WAAW;AACxD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ,qCAAqC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB;AACxB;AACA,gBAAgB,qCAAqC;AACrD;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA,oDAAoD,UAAU;AAC9D;;AAEA;AACA,0CAA0C,uBAAuB;AACjE;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gBAAgB,gCAAgC;AAChD;;AAEA;AACA;AACA;AACA;AACA,OAAO,QAAQ,0CAA0C;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,qCAAqC;AAClD;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,0BAA0B,IAAI,WAAW;AACrD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,4BAA4B;AAClD;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC3sBA,wBAAwB,gEAAoC;AAC5D,yBAAyB,mBAAO,CAAC,8CAAmC;AACpE,uBAAuB,mBAAO,CAAC,4CAAiC;AAChE,sBAAsB,mBAAO,CAAC,2CAAgC;AAC9D;AACA;AACA;AACA;AACA;AACA,kCAAkC,YAAY;AAC9C,yBAAyB,WAAW;AACpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA,sBAAsB;;AAEtB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;;;;;;;;;;AC/HA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,0CAA0C,YAAY;AACtD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAqB;AACrB;;AAEA;AACA;;AAEA,qBAAqB;AACrB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;;AAEA;AACA;;AAEA,yCAAyC,aAAa;;AAEtD;;AAEA;AACA;;AAEA;;AAEA;AACA,aAAa;;AAEb;;AAEA,qBAAqB;AACrB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;;AAEA;AACA;;AAEA,kDAAkD,IAAI;;AAEtD;;AAEA;AACA;;AAEA;;AAEA;AACA,aAAa;;AAEb;;AAEA,qBAAqB;AACrB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,mBAAmB;;AAEnB;AACA;;AAEA,qBAAqB;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA,aAAa;;AAEb;AACA;;AAEA;;AAEA;AACA;AACA;AACA,+BAA+B,KAAK,GAAG,KAAK,GAAG;AAC/C;AACA,mBAAmB;AACnB;AACA,aAAa;;AAEb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sCAAsC,MAAM,GAAG,2BAA2B;AAC1E,sCAAsC,MAAM;AAC5C;;AAEA;AACA;AACA;AACA,sCAAsC,MAAM,GAAG,2BAA2B;AAC1E,sCAAsC,MAAM;AAC5C;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yCAAyC,MAAM,mBAAmB,MAAM;AACxE,0CAA0C,MAAM;AAChD;;AAEA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA,2DAA2D;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC,mBAAmB;AACnB,aAAa;;AAEb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB,GAAG,gBAAgB;AACtE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,2CAA2C,wBAAwB,GAAG,wBAAwB;;AAE9F;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA,gBAAgB;AAChB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mCAAmC;AACnC;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,kCAAkC,oBAAoB;AACtD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;;AAEhB,sCAAsC;AACtC,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,6BAA6B;;AAE7B,sBAAsB,kBAAkB;;AAExC;AACA;AACA,2BAA2B,kBAAkB,GAAG,WAAW;;AAE3D;AACA;AACA;AACA;AACA;AACA,kCAAkC,IAAI;AACtC;AACA;AACA;AACA,kCAAkC,IAAI;AACtC;AACA;AACA;AACA,iBAAiB;AACjB,cAAc;;AAEd;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,UAAU;;AAEV;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC99BA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,sCAAsC,YAAY;AAClD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,mBAAmB,IAAI;AACvB,sBAAsB,4BAA4B,EAAE,aAAa;AACjE,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA,iBAAiB,6DAA6D;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,iBAAiB;AACrE,mBAAmB;AACnB,gBAAgB;AAChB,iBAAiB;AACjB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,iCAAiC;AACjC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,sCAAsC;AACnE;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,kCAAkC,iCAAiC;AACnE;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C,aAAa,KAAK,GAAG;AAChE;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC3VA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,gCAAgC,YAAY;AAC5C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,QAAQ;AACjC;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,0BAA0B;;AAE/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA,4BAA4B;AAC5B,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA,4BAA4B;AAC5B,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,8DAA8D,UAAU,IAAI,QAAQ,kDAAkD,aAAa;AACnJ,iEAAiE;AACjE;AACA;;AAEA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;;AAEA;AACA;;AAEA;AACA;AACA,sCAAsC,iBAAiB;AACvD;;AAEA;AACA;AACA;AACA,4CAA4C,iBAAiB;AAC7D;;AAEA;AACA,sCAAsC,eAAe;AACrD;;AAEA;AACA;AACA;AACA,0CAA0C,eAAe;AACzD;;AAEA;AACA;AACA,yCAAyC,QAAQ;AACjD;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,2BAA2B,GAAG,QAAQ;AACrE;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,QAAQ;AAC9D;;AAEA;;AAEA;AACA;AACA,8CAA8C,WAAW,EAAE,SAAS,EAAE,YAAY;AAClF;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;;AAEA,4CAA4C,QAAQ;;AAEpD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,WAAW;AACX;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,wDAAwD,cAAc;;AAEtE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA,gCAAgC,OAAO;AACvC;AACA,OAAO;AACP;AACA;;;;;;;;;;;AChkBA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;ACrE6C;;AAE9B,6BAA6B,mDAAO;AACnD;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACnG8C;AACK;AACE;;AAErD;;AAEe,oCAAoC,uDAAc;AACjE;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,OAAO;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV,0CAA0C;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6BAA6B;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA,mCAAmC,OAAO;AAC1C;AACA,oCAAoC,OAAO;AAC3C;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,wBAAwB,EAAE,UAAU;AACjF,0DAA0D,wDAAwD,OAAO;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA,yBAAyB;AACzB,uBAAuB;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,wDAAwD,sBAAsB;AAC9E,2DAA2D;AAC3D,mEAAmE;AACnE;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC,0DAAgB;AACrD,qCAAqC,2DAAiB;AACtD;AACA;;AAEA;AACA;AACA,qCAAqC,0DAAgB;AACrD;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D,yCAAyC;AACzC,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;;AAEA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;;AAEA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AChY4D;;AAE5D;;AAEe,qCAAqC,8DAAqB;AACzE;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,OAAO;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,6BAA6B;AAC7B,aAAa;AACb,UAAU;;AAEV,0CAA0C;AAC1C;AACA,0CAA0C;;AAE1C;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;AAChB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,SAAS,IAAI,QAAQ;AACvD,sBAAsB;AACtB;AACA,gBAAgB;AAChB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6BAA6B;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sCAAsC,OAAO;AAC7C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;ACjKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,UAAU;AAC7B;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAO,CAAC,4BAAiB;AACG;AACiB;;AAE/D;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,gDAAgD,sEAAe;AAC/D;AACA;AACA,oBAAoB;AACpB;AACA;;AAEe,uCAAuC,uDAAc;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA,mDAAmD,mBAAmB;AACtE,UAAU;AACV;AACA;;AAEA;AACA,YAAY,mBAAmB;AAC/B;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,gCAAgC;;AAEhC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA,+CAA+C,YAAY;AAC3D,0CAA0C,eAAe;AACzD;AACA;;;;;;;;;;;;;;;;;;AClhB8C;AACiB;;AAE/D;;AAEA,8CAA8C,sEAAe;AAC7D;AACA;AACA,oBAAoB;;AAEpB;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEe,qCAAqC,uDAAc;AAClE;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK,YAAY,OAAO;AACtC,cAAc,OAAO;AACrB,cAAc,MAAM;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO,GAAG,IAAI,GAAG,iBAAiB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,oBAAoB,iBAAiB;AACrC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA,oBAAoB,KAAK,YAAY,OAAO;AAC5C,oBAAoB,OAAO;AAC3B,oBAAoB,MAAM;AAC1B;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB;AACA,cAAc,iDAAiD;AAC/D,gBAAgB,iDAAiD;AACjE,gBAAgB,iDAAiD;AACjE,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA,oBAAoB;;AAEpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB,UAAU;;AAEV;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA,aAAa,eAAe;AAC5B,aAAa;AACb;;AAEA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;;;;;;;;;;AC7WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mBAAO,CAAC,sDAA2C;;AAE9E;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA,4CAA4C;;AAE5C,gCAAgC;AAChC;AACA,oCAAoC,2BAA2B;AAC/D,OAAO;;AAEP,kCAAkC;AAClC;AACA;AACA;;AAEA,6BAA6B;;AAE7B,iCAAiC;AACjC;;AAEA,4BAA4B;;AAE5B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO,GAAG,IAAI,GAAG,iBAAiB;AACrD;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;;AAEb;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA,0BAA0B;AAC1B;AACA;;AAEA;AACA;;AAEA,0CAA0C;AAC1C;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gEAAgE;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,UAAU;;AAEV;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,yCAAyC;AACzC;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA,gCAAgC;;AAEhC;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,YAAY;AAC1B;AACA;AACA;;AAEA,+BAA+B;;AAE/B;;AAEA,4BAA4B;;AAE5B,4BAA4B;AAC5B,kDAAkD;;AAElD,sCAAsC;AACtC;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,8BAA8B,OAAO,GAAG,IAAI;AAC5C;;AAEA;AACA;AACA;AACA,uBAAuB,sBAAsB,GAAG,YAAY;AAC5D,OAAO;;AAEP,uBAAuB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,YAAY,MAAM;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB;AACA,cAAc,iDAAiD;AAC/D,gBAAgB,iDAAiD;AACjE,gBAAgB,iDAAiD;AACjE,gBAAgB;AAChB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE,2BAA2B,cAAc;AACzC,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,kBAAkB,4BAA4B;AAC3E;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,uBAAuB,OAAO;AAC9B,mBAAmB,OAAO;AAC1B,6BAA6B,OAAO;;AAEpC,oBAAoB,OAAO;AAC3B,kBAAkB,OAAO;;AAEzB,oBAAoB,OAAO;AAC3B,iBAAiB,OAAO;AACxB,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,0BAA0B,4BAA4B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,sBAAsB;AACtB;AACA,mBAAmB;AACnB;AACA,yBAAyB,4BAA4B;AACrD;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,uBAAuB,iBAAiB;AACxC;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA,UAAU;;AAEV;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA,YAAY,eAAe;AAC3B,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB,UAAU;;AAEV;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACpZA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mBAAO,CAAC,6BAAkB;AACjD,mBAAmB,mBAAO,CAAC,wBAAc;;AAEzC,2BAA2B,mBAAO,CAAC,+DAAoD;AACvF,4BAA4B,mBAAO,CAAC,wEAA6D;AACjG,4BAA4B,mBAAO,CAAC,wEAA6D;AACjG,4BAA4B,mBAAO,CAAC,wEAA6D;;AAEjG;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mBAAO,CAAC,6BAAkB;AACjD,mBAAmB,mBAAO,CAAC,wBAAc;;AAEzC,2BAA2B,mBAAO,CAAC,uEAA4D;AAC/F,sBAAsB,mBAAO,CAAC,kEAAuD;AACrF,uBAAuB,mBAAO,CAAC,mEAAwD;AACvF,uBAAuB,mBAAO,CAAC,mEAAwD;AACvF,oBAAoB,mBAAO,CAAC,+DAAqD;AACjF,kBAAkB,mBAAO,CAAC,6DAAmD;;AAE7E;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA,wCAAwC,YAAY;AACpD,yCAAyC,YAAY;AACrD,yCAAyC,YAAY;AACrD,sCAAsC,YAAY;AAClD,oCAAoC,YAAY;AAChD;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAO,CAAC,4DAAiD;;AAEjF;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,yBAAyB,KAAK;AAC9B,yBAAyB,YAAY;AACrC,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA,+BAA+B;;AAE/B;AACA;AACA;;AAEA;AACA;;AAEA;AACA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,wBAAwB;AACxB;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,mBAAO,CAAC,4DAAiD;;AAE/G;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yCAAyC;AACzC;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,yBAAyB,KAAK;AAC9B,yBAAyB,YAAY;AACrC,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;AACb,OAAO;AACP;AACA;;;;;;;;;;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,mBAAO,CAAC,4CAAiC;;AAE/E;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,mBAAO,CAAC,4CAAiC;AAC/E,uBAAuB,mBAAO,CAAC,qDAA0C;AACzE,2BAA2B,mBAAO,CAAC,uDAA4C;;AAE/E;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,8BAA8B;AAC9B;;AAEA,mCAAmC;AACnC;;AAEA,+BAA+B;;AAE/B,4BAA4B;AAC5B,+BAA+B;AAC/B;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA,eAAe,OAAO,IAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,2BAA2B,SAAS;AACpC,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA,6CAA6C;;AAE7C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;;AAElB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,+BAA+B;;AAE/B;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,yBAAyB,KAAK;AAC9B,yBAAyB,YAAY;AACrC,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,4BAA4B;;AAE5B;AACA;AACA;AACA,iBAAiB,IAAI;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,gBAAgB;;AAEhB,yCAAyC,iBAAiB,MAAM;AAChE;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB,GAAG,aAAa;AAClE;AACA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB,oBAAoB,KAAK;AACzB;AACA,uDAAuD;AACvD;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,6BAA6B,kBAAkB;AAC/C;AACA;;AAEA,gCAAgC;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,UAAU,GAAG;AACb,OAAO,GAAG;AACV;;AAEA;AACA;AACA;AACA,cAAc,KAAK,0BAA0B;AAC7C;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxhBA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;;AAEtD;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iCAAiC;;AAEjC,0BAA0B;AAC1B;AACA,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV,uBAAuB;AACvB;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;;AAEtD;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iCAAiC;;AAEjC,0BAA0B;AAC1B;AACA,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB,OAAO;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV,uBAAuB;;AAEvB;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA,OAAO;AACP;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC1JA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;AACtD,uBAAuB,mBAAO,CAAC,qDAA0C;AACzE,qBAAqB,mBAAO,CAAC,mDAAwC;;AAErE;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+BAA+B;;AAE/B,0BAA0B;AAC1B;AACA,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB,mBAAmB,OAAO;AAC1B,kBAAkB,OAAO;AACzB,+BAA+B,OAAO;AACtC,sBAAsB,OAAO;AAC7B,qBAAqB,OAAO;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,gCAAgC;AAChC,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,+BAA+B,qCAAqC,GAAG;AACvE;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;;AAEb;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D,mCAAmC;AACnC,gDAAgD,mBAAmB;AACnE,4CAA4C,iBAAiB;;AAE7D;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wBAAwB;AACjD;AACA,4BAA4B,wBAAwB;AACpD,4BAA4B,0BAA0B;AACtD,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,0BAA0B,yCAAyC;AACnE,0BAA0B,qCAAqC;AAC/D;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA,qDAAqD,oBAAoB;;AAEzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA,gDAAgD,eAAe;AAC/D;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA,UAAU;;AAEV;AACA,sCAAsC,YAAY,0CAA0C,YAAY;AACxG,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,SAAS,GAAG,eAAe;AAC9D,sCAAsC,cAAc,GAAG,SAAS,GAAG,YAAY;AAC/E,uBAAuB;AACvB,oCAAoC,eAAe;AACnD,sCAAsC,cAAc,GAAG,QAAQ;AAC/D;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,MAAM,GAAG,KAAK;AAChD,qCAAqC,SAAS,GAAG,QAAQ;AACzD,yBAAyB;AACzB,sBAAsB;AACtB;AACA,aAAa;;AAEb;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,wCAAwC,IAAI,EAAE,YAAY;;AAE1D;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,mBAAmB,KAAK;AACxB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,kCAAkC;AAClC;;AAEA;AACA,6BAA6B;AAC7B;AACA;AACA;;AAEA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,EAAE,SAAS;AAC5D;;AAEA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;ACvuBA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;;AAEtD;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iCAAiC;;AAEjC,0BAA0B;AAC1B;AACA,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B,OAAO;AACjC;;AAEA;AACA,eAAe,uDAAuD;;AAEtE;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,QAAQ;AACzC,8BAA8B;AAC9B,6BAA6B,QAAQ;AACrC,8BAA8B,OAAO;AACrC;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;ACxQA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;;AAEtD;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iCAAiC;;AAEjC,0BAA0B;AAC1B;AACA,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV,uBAAuB;;AAEvB;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC/FA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;;AAEtD;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iCAAiC;;AAEjC,0BAA0B;AAC1B;AACA,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB,OAAO;AAC5B;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV,uBAAuB;;AAEvB;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA,yBAAyB,+CAA+C;AACxE;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;;AAEtD;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA,gCAAgC;;AAEhC,0BAA0B;AAC1B;AACA,YAAY;AACZ;;AAEA,4BAA4B;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,OAAO,GAAG,IAAI,GAAG,iBAAiB;AACrD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;;AAEA;AACA,UAAU;;AAEV;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;;AAEb;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;;AAEb;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA,wCAAwC,gBAAgB;AACxD;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,2BAA2B;AAC3B,8BAA8B;AAC9B,UAAU;;AAEV;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA,wDAAwD;;AAExD;AACA;AACA;AACA,oBAAoB;AACpB;AACA,wDAAwD;AACxD;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,2CAA2C;;AAE3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,4BAA4B;AACrE,aAAa;;AAEb;AACA;AACA,iBAAiB,iDAAiD;AAClE;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,iCAAiC;AACxE,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;;AAErC;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA,+BAA+B;;AAE/B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA,4CAA4C,4BAA4B;AACxE,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,qBAAqB;AAChE;AACA;AACA;AACA;;AAEA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,qBAAqB;AAChE;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,oBAAoB;AACpB,gEAAgE;AAChE,sCAAsC;AACtC;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA,oBAAoB;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC;AAChC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D,4CAA4C;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,eAAe,WAAW;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oFAAoF;;AAEpF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC;AAClC,gCAAgC;AAChC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF;;AAEvF;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,UAAU;AACV,UAAU;AACV;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;;AAEA;AACA,oDAAoD;AACpD;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,gBAAgB;AAChB;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;;AAEA,oCAAoC;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA,OAAO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;;;AC70CA;AACA;AACA;AACA;AACA;;AAE4C;AACF;AACd;;AAE5B,iEAAe;AACf;AACA;AACA;AACA,gBAAgB,qDAAY;AAC5B;AACA,aAAa,sDAAa;AAC1B,IAAI;AACJ,UAAU,8CAAK;AACf,CAAC,EAAC;;;;;;;;;;;;;;;;ACnBF;AACA;AACA;AACA;;AAEA;;AAEA,iEAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC,EAAC;;;;;;;;;;;;;;;;ACtDF;AACA;AACA;AACA;;AAEA;;AAEA,iEAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC,EAAC;;;;;;;;;;;;;;;;ACpDF,iEAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAC;;;;;;;;;;;ACrxBF,aAAa,GAAG,IAAsD,EAAE,mBAAmB,KAAK,UAAkO,CAAC,aAAa,0BAA0B,yBAAyB,gBAAgB,UAAU,UAAU,MAAM,SAAmC,CAAC,gBAAgB,OAAC,OAAO,oBAAoB,8CAA8C,kCAAkC,YAAY,YAAY,mCAAmC,iBAAiB,gBAAgB,sBAAsB,oBAAoB,MAAM,SAAmC,CAAC,YAAY,WAAW,YAAY,SAAS,EAAE,oCAAoC,aAAa,+CAA+C,6CAA6C,+BAA+B,wBAAwB,EAAE,gBAAgB,sCAAsC,aAAa,4BA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;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU,WAAW;;AAErB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,0CAA0C;AAC9D,UAAU;AACV;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,aAAa,EAAC;;;;;;;;;;;;;;;;ACzH7B;AACA;AACA;AACA;;AAEA,cAAc,mBAAO,CAAC,6CAAkC;;AAExD;AACA;AACA,kBAAkB;AAClB;AACA;AACA,eAAe;;AAEf;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA,UAAU,WAAW;;AAErB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,uCAAuC,EAAE;AACzC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,EAAE,GAAG;AAC1B;AACA,OAAO;AACP,0CAA0C;AAC1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,EAAE,GAAG;AAC1B;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qCAAqC;AACzD,UAAU;AACV;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,OAAO;;AAEP,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,kBAAkB,EAAC;;;;;;;;;;;;;;;;;;;AC/MlC;AACA;AACA;AACA;AACA;AACA,mBAAmB,uDAA8B;AACF;AACP;AACY;AACpD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU,MAAM;AAChB;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,UAAU,KAAK;AACf;AACA;;AAEA;AACA,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,WAAW;;AAErB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,0DAAiB;AACpD;;AAEA;AACA;AACA,mCAAmC,oDAAW;AAC9C;AACA;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA,6CAA6C,MAAM;AACnD;AACA;AACA;AACA;AACA,YAAY,0DAAW;AACvB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB,KAAK;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA,0BAA0B,cAAc;AACxC;AACA,oBAAoB;AACpB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA,aAAa;AACb,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,OAAO;AACP;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,aAAa,EAAC;;;;;;;;;;;;;;;;ACthB7B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,uDAA8B;AACjD;;AAEA,YAAY,UAAU;AACtB;AACA,YAAY,eAAe;;AAE3B;;AAEA;;AAEA,eAAe,mBAAO,CAAC,uCAA6B;AACpD;;AAEA;AACA,MAAM;AACN;;AAEA;AACA;AACA,UAAU,SAAS;;AAEnB;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,KAAK;AACf;;AAEA;AACA,UAAU,SAAS;AACnB;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,cAAc,WAAW;AACzB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa,MAAM;AACnB;AACA,aAAa,OAAO,EAAE;AACtB,4CAA4C,sBAAsB;AAClE;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,gBAAgB,QAAQ,WAAW;AACpE;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mCAAmC;AACnC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,mCAAmC;AACnC,mCAAmC;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,yBAAyB;;AAEzB;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,eAAe,EAAE,WAAW;AAChE;AACA,oBAAoB;AACpB;AACA;AACA,2BAA2B,YAAY,EAAE,8BAA8B;AACvE;AACA,0BAA0B,EAAE,WAAW;AACvC;AACA;AACA;AACA;AACA,oCAAoC,eAAe,EAAE,WAAW;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C,gBAAgB;AAChB;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,WAAW,EAAC;;;;;;;;;;;;;;;;;;AC7Y3B;AACA;AACA;AACA;AACA;;AAE+C;AACP;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,iCAAiC,KAAK,iBAAiB,OAAO;AAC9D,QAAQ;AACR;AACA,uBAAuB,KAAK,EAAE,sBAAsB,GAAG,OAAO;AAC9D;AACA;AACA;AACA,KAAK;AACL,8BAA8B,KAAK,GAAG,OAAO;AAC7C;;AAEA;AACA;AACA,wBAAwB,WAAW,GAAG,IAAI;AAC1C;AACA;;AAEA;AACA,gBAAgB,mBAAmB;AACnC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA,WAAW,KAAK;AAChB;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA,gCAAgC,oDAAW;AAC3C;AACA,UAAU,SAAS;;AAEnB;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B,KAAK;AAClC,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,gBAAgB,KAAK,cAAc,GAAG;AACjF;AACA;AACA,2CAA2C;AAC3C;AACA;;AAEA;AACA,wBAAwB,0DAAW,SAAS,GAAG;AAC/C;AACA,mCAAmC,OAAO;AAC1C,yBAAyB;AACzB;AACA,wBAAwB,0DAAW,YAAY,GAAG;AAClD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,GAAG;AACjD,SAAS,0DAAW;AACpB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;AACb,UAAU;AACV,QAAQ;AACR;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA,gBAAgB,MAAM;AACtB;AACA,gBAAgB,MAAM;AACtB;AACA,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;;AAEzB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oDAAoD,OAAO;AAC3D;AACA;AACA;;AAEA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB,0DAAW,sBAAsB,iBAAiB;AACpE;AACA,kBAAkB,0DAAW;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,kBAAkB,0DAAW;AAC7B;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;;AAEA,iEAAe,iBAAiB,EAAC;;;;;;;;;;;;;;;;;AClUjC,mBAAmB,uDAA8B;;AAEJ;;AAE7C;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAU,WAAW;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wDAAY;AACxC,WAAW;AACX,4BAA4B,wDAAY;AACxC;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,aAAa,EAAC;;;;;;;;;;;;;;;;ACpD7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,uDAA8B;;AAEjD;AACA;AACA;;AAEA;AACA,UAAU,eAAe;AACzB;AACA;AACA;AACA;;AAEA;AACA,UAAU,WAAW;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oCAAoC;AACpC;AACA;AACA,OAAO;AACP;;AAEA,4BAA4B;AAC5B;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA,iEAAe,kBAAkB,EAAC;;;;;;;;;;;;;;;;;ACrElC,mBAAmB,uDAA8B;;AAER;;AAEzC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,yDAAM;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,YAAY,EAAC;;;;;;;;;;;ACtD5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C;AAC9C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;;;;;;;;;;;AClEA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;;AAEA;AACA;AACA,GAAG,mBAAO,CAAC,yBAAc;AACzB,GAAG,mBAAO,CAAC,0BAAe;AAC1B,GAAG,mBAAO,CAAC,6BAAkB;AAC7B,GAAG,mBAAO,CAAC,uBAAY;AACvB,GAAG,mBAAO,CAAC,uBAAY;AACvB,GAAG,mBAAO,CAAC,2BAAgB;AAC3B,GAAG,mBAAO,CAAC,gCAAqB;AAChC,GAAG,mBAAO,CAAC,4BAAiB;AAC5B,GAAG,8DAAkC;AACrC,GAAG,mBAAO,CAAC,yBAAc;AACzB,GAAG,mBAAO,CAAC,2BAAgB;AAC3B,GAAG,mBAAO,CAAC,yBAAc;AACzB,GAAG,wDAA4B;AAC/B,GAAG,mBAAO,CAAC,0BAAe;AAC1B,GAAG,mBAAO,CAAC,0BAAe;AAC1B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;;;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,uBAAuB,QAAQ;;AAE/B;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;;;;;;;;;;AChEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;AACA;AACA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACuD;AACxC,yCAAyC,0DAAqB;AAC7E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,cAAc,cAAc,QAAQ,+RAI7B;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,cAAc;;AAEd;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,UAAU,QAAQ;AAChC,gBAAgB,QAAQ;AACxB;AACA,6BAA6B,eAAe,IAAI,oBAAoB;AACpE;AACA,yBAAyB,mBAAmB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD,6BAA6B;AAC7B,6BAA6B,UAAU;AACvC;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,QAAQ,IAAI,2BAA2B;AAC1G;AACA;AACA;AACA,6CAA6C,QAAQ,IAAI,SAAS;AAClE,mBAAmB;AACnB;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,QAAQ,IAAI,IAAI;AAC9D,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,2BAA2B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;;;;;;;;;;;ACpVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mBAAO,CAAC,+BAAoB;AAC1D;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,OAAO,QAAQ,+RAItB;AACP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb,gBAAgB;AAChB,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA,gBAAgB,mBAAO,CAAC,gDAAqC;AAC7D;AACA,iBAAiB,IAAI;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,eAAe;AACtC,aAAa;AACb;AACA;AACA,qBAAqB,UAAU;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;;;;;;;;;;;AClCA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,uBAAuB,QAAQ;;AAE/B;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uCAAuC;AAChE;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACvHA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,uBAAuB,QAAQ;;AAE/B;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACuD;AACxC,8BAA8B,0DAAqB;AAClE;AACA;AACA;;AAEA;AACA;;AAEA,YAAY,wTAGL;AACP;AACA;AACA;;;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,iDAAiD;AACjD;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;;;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC1EA;;;;;;;;;;ACAA;;;;;;;;;;ACAA","sources":["webpack://ab_platform_web/./node_modules/moment/locale/ sync ^\\.\\/.*$","webpack://ab_platform_web/./AppBuilder/ABFactory.js","webpack://ab_platform_web/./AppBuilder/_factory_utils/Dialog.js","webpack://ab_platform_web/./AppBuilder/core/ABApplicationCore.js","webpack://ab_platform_web/./AppBuilder/core/ABApplicationMobileCore.js","webpack://ab_platform_web/./AppBuilder/core/ABDataCollectionCore.js","webpack://ab_platform_web/./AppBuilder/core/ABDefinitionCore.js","webpack://ab_platform_web/./AppBuilder/core/ABFactoryCore.js","webpack://ab_platform_web/./AppBuilder/core/ABFieldManager.js","webpack://ab_platform_web/./AppBuilder/core/ABHintCore.js","webpack://ab_platform_web/./AppBuilder/core/ABIndexCore.js","webpack://ab_platform_web/./AppBuilder/core/ABMLClassCore.js","webpack://ab_platform_web/./AppBuilder/core/ABModelCore.js","webpack://ab_platform_web/./AppBuilder/core/ABObjectApiCore.js","webpack://ab_platform_web/./AppBuilder/core/ABObjectApiNetsuiteCore.js","webpack://ab_platform_web/./AppBuilder/core/ABObjectCore.js","webpack://ab_platform_web/./AppBuilder/core/ABObjectQueryCore.js","webpack://ab_platform_web/./AppBuilder/core/ABProcessCore.js","webpack://ab_platform_web/./AppBuilder/core/ABStepCore.js","webpack://ab_platform_web/./AppBuilder/core/ABViewManagerCore.js","webpack://ab_platform_web/./AppBuilder/core/ABViewManagerMobileCore.js","webpack://ab_platform_web/./AppBuilder/core/FilterComplexCore.js","webpack://ab_platform_web/./AppBuilder/core/RowFilterCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldAutoIndexCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldBooleanCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldCalculateCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldCombineCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldConnectCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldDateCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldDateTimeCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldEmailCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldFileCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldFormulaCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldImageCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldJsonCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldListCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldLongTextCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldNumberCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldStringCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldTextFormulaCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldTreeCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldUserCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobilePageCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewCustomCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormButtonCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormCheckboxCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormConnectCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormCustomCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormDateCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormDatetimeCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormEmailCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormFileCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormFormulaCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormImageCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormItemCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormNumberCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormReadonlyCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormSelectMultipleCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormSelectSingleCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormTextboxCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewLabelCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewListCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewTimelineCore.js","webpack://ab_platform_web/./AppBuilder/core/process/ABProcessLaneCore.js","webpack://ab_platform_web/./AppBuilder/core/process/ABProcessParticipantCore.js","webpack://ab_platform_web/./AppBuilder/core/process/ABProcessTaskManager.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessElementCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessEndCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessGatewayExclusiveCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskEmailCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceAccountingBatchProcessingCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceAccountingFPCloseCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceAccountingFPYearCloseCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceAccountingJEArchiveCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceApiCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceCalculateCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceGetResetPasswordUrlCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceInsertRecordCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceQueryCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskSubProcessCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskUserApprovalCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskUserCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskUserExternalCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskUserFormCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTriggerCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTriggerLifecycleCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTriggerTimerCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLFindCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLManagerCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLRootObjectCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLRow.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLRowPluckCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLRowSaveCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLRowUpdateCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLSet.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLSetFirstCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLSetPluckCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLSetSaveCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewCSVExporterCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewCSVImporterCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewCarouselCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewChartAreaCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewChartBarCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewChartCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewChartLineCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewChartPieCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewCommentCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewConditionalContainerCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewConnectDataFilterCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewContainerCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDataFilterCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDataSelectCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDataviewCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailCheckboxCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailConnectCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailCustomCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailImageCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailItemCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailTextCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailTreeCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDocxBuilderCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormButtonCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormCheckboxCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormConnectCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormCustomCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormDatepickerCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormItemCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormJsonCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormNumberCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormReadonlyCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormSelectMultipleCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormSelectSingleCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormTextboxCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormTreeCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewGanttCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewGridCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewImageCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewKanbanCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewLabelCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewLayoutCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewListCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewMenuCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewPDFImporterCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewPageCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewPivotCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewReportsManagerCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewSchedulerCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewTabCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewTextCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewWidgetCore.js","webpack://ab_platform_web/./AppBuilder/platform/ABApplication.js","webpack://ab_platform_web/./AppBuilder/platform/ABApplicationMobile.js","webpack://ab_platform_web/./AppBuilder/platform/ABComponent.js","webpack://ab_platform_web/./AppBuilder/platform/ABDataCollection.js","webpack://ab_platform_web/./AppBuilder/platform/ABDefinition.js","webpack://ab_platform_web/./AppBuilder/platform/ABEmitter.js","webpack://ab_platform_web/./AppBuilder/platform/ABHint.js","webpack://ab_platform_web/./AppBuilder/platform/ABIndex.js","webpack://ab_platform_web/./AppBuilder/platform/ABMLClass.js","webpack://ab_platform_web/./AppBuilder/platform/ABModel.js","webpack://ab_platform_web/./AppBuilder/platform/ABModelApi.js","webpack://ab_platform_web/./AppBuilder/platform/ABModelApiNetsuite.js","webpack://ab_platform_web/./AppBuilder/platform/ABModelQuery.js","webpack://ab_platform_web/./AppBuilder/platform/ABObject.js","webpack://ab_platform_web/./AppBuilder/platform/ABObjectApi.js","webpack://ab_platform_web/./AppBuilder/platform/ABObjectApiNetsuite.js","webpack://ab_platform_web/./AppBuilder/platform/ABObjectExternal.js","webpack://ab_platform_web/./AppBuilder/platform/ABObjectImport.js","webpack://ab_platform_web/./AppBuilder/platform/ABObjectQuery.js","webpack://ab_platform_web/./AppBuilder/platform/ABProcess.js","webpack://ab_platform_web/./AppBuilder/platform/ABStep.js","webpack://ab_platform_web/./AppBuilder/platform/ABViewManager.js","webpack://ab_platform_web/./AppBuilder/platform/ABViewManagerMobile.js","webpack://ab_platform_web/./AppBuilder/platform/CSVImporter.js","webpack://ab_platform_web/./AppBuilder/platform/FilterComplex.js","webpack://ab_platform_web/./AppBuilder/platform/RowFilter.js","webpack://ab_platform_web/./AppBuilder/platform/RowUpdater.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABField.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldAutoIndex.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldBoolean.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldCalculate.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldCombine.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldConnect.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldDate.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldDateTime.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldEmail.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldFile.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldFormula.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldImage.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldJson.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldList.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldLongText.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldNumber.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldSelectivity.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldString.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldTextFormula.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldTree.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldUser.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobilePage.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileView.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewCustom.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewForm.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormButton.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormCheckbox.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormConnect.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormCustom.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormDate.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormDatetime.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormEmail.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormFile.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormFormula.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormImage.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormItem.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormNumber.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormReadonly.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormSelectMultiple.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormSelectSingle.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormTextbox.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewLabel.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewList.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewTimeline.js","webpack://ab_platform_web/./AppBuilder/platform/process/ABProcessLane.js","webpack://ab_platform_web/./AppBuilder/platform/process/ABProcessParticipant.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessElement.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessEnd.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessGatewayExclusive.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskEmail.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskService.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceAccountingBatchProcessing.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceAccountingFPClose.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceAccountingFPYearClose.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceAccountingJEArchive.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceApi.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceCalculate.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceGetResetPasswordUrl.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceInsertRecord.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceQuery.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskSubProcess.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskUser.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskUserApproval.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskUserExternal.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskUserForm.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTrigger.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTriggerLifecycle.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTriggerTimer.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQL.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLFind.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLManager.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLRootObject.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLRowPluck.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLRowSave.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLRowUpdate.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLSetFirst.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLSetPluck.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLSetSave.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABView.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewCSVExporter.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewCSVImporter.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewCarousel.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewChart.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewChartArea.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewChartBar.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewChartContainer.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewChartLine.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewChartPie.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewComment.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewConditionalContainer.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewConnectDataFilter.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewContainer.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDataFilter.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDataSelect.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDataview.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetail.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailCheckbox.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailConnect.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailCustom.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailImage.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailItem.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailText.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailTree.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDocxBuilder.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewForm.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormButton.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormCheckbox.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormConnect.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormCustom.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormDatepicker.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormItem.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormJson.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormNumber.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormReadonly.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormSelectMultiple.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormSelectSingle.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormTextbox.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormTree.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewGantt.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewGrid.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewGridPopupExport.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewGridPopupMassUpdate.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewGridPopupSortFields.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewImage.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewKanban.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewKanbanFormSidePanel.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewLabel.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewLayout.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewList.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewMenu.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewPDFImporter.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewPage.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewPivot.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewReportsManager.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewScheduler.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewTab.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewText.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewWidget.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewCSVExporterComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewCSVImporterComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewCarouselComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewChartAreaComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewChartBarComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewChartComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewChartContainerComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewChartLineComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewChartPieComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewCommentComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewConditionalContainerComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewConnectDataFilterComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewContainerComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDataFilterComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDataSelectComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDataviewComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailCheckboxComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailConnectComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailCustomComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailImageComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailItemComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailTextComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailTreeComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDocxBuilderComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormButtonComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormCheckboxComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormConnectComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormCustomComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormDatepickerComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormItemComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormJsonComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormNumberComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormReadonlyComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormSelectMultipleComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormSelectSingleComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormTextboxComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormTreeComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewGanttComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewGridComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewImageComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewKanbanComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewLabelComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewLayoutComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewListComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewMenuComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewPDFImporterComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewPivotComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewReportsManagerComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewSchedulerComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewTabComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewTextComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewProperties/ABViewProperty.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewProperties/ABViewPropertyAddPage.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewProperties/ABViewPropertyEditPage.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewProperties/ABViewPropertyFilterData.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewProperties/ABViewPropertyLinkPage.js","webpack://ab_platform_web/./AppBuilder/rules/ABViewQueryBuilderObjectFieldConditions.js","webpack://ab_platform_web/./AppBuilder/rules/ABViewRule.js","webpack://ab_platform_web/./AppBuilder/rules/ABViewRuleAction.js","webpack://ab_platform_web/./AppBuilder/rules/ABViewRuleList.js","webpack://ab_platform_web/./AppBuilder/rules/ABViewRuleListFormRecordRules.js","webpack://ab_platform_web/./AppBuilder/rules/ABViewRuleListFormSubmitRules.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormRecordRuleInsertConnected.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormRecordRuleRemoveConnected.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormRecordRuleUpdate.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormRecordRuleUpdateConnected.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormSubmitRuleClosePopup.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormSubmitRuleConfirmMessage.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormSubmitRuleEmail.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormSubmitRuleExistPage.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormSubmitRuleParentPage.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormSubmitRuleWebsite.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionObjectUpdater.js","webpack://ab_platform_web/./AppBuilder/uiSettings/config.js","webpack://ab_platform_web/./AppBuilder/uiSettings/configDesktop.js","webpack://ab_platform_web/./AppBuilder/uiSettings/configMobile.js","webpack://ab_platform_web/./AppBuilder/uiSettings/icons.js","webpack://ab_platform_web/./js/docxtemplater-image-module.v3.0.2.min.js","webpack://ab_platform_web/./js/docxtemplater.v3.0.12.min.js","webpack://ab_platform_web/./js/jszip.min.js","webpack://ab_platform_web/./resources/Account.js","webpack://ab_platform_web/./resources/Multilingual.js","webpack://ab_platform_web/./resources/Network.js","webpack://ab_platform_web/./resources/NetworkRest.js","webpack://ab_platform_web/./resources/NetworkRestSocket.js","webpack://ab_platform_web/./resources/Storage.js","webpack://ab_platform_web/./resources/StorageLocal.js","webpack://ab_platform_web/./resources/Tenant.js","webpack://ab_platform_web/./webix_custom_components/activelist.js","webpack://ab_platform_web/./webix_custom_components/countfooter.js","webpack://ab_platform_web/./webix_custom_components/customComponentManager.js","webpack://ab_platform_web/./webix_custom_components/datetimepicker.js","webpack://ab_platform_web/./webix_custom_components/editlist.js","webpack://ab_platform_web/./webix_custom_components/edittree.js","webpack://ab_platform_web/./webix_custom_components/editunitlist.js","webpack://ab_platform_web/./webix_custom_components/focusableTemplate.js","webpack://ab_platform_web/./webix_custom_components/formioBuilder.js","webpack://ab_platform_web/./webix_custom_components/formioPreview.js","webpack://ab_platform_web/./webix_custom_components/lazyComponent.js","webpack://ab_platform_web/./webix_custom_components/numbertext.js","webpack://ab_platform_web/./webix_custom_components/thaicalendar.js","webpack://ab_platform_web/./webix_custom_components/timepicker.js","webpack://ab_platform_web/./webix_custom_components/tinyMce.js","webpack://ab_platform_web/./webix_custom_components/totalfooter.js","webpack://ab_platform_web/./webix_custom_components/treesuggest.js","webpack://ab_platform_web/ignored|/home/runner/work/ab_service_web/ab_service_web/ab_platform_web/node_modules/image-size/dist/types|fs","webpack://ab_platform_web/ignored|/home/runner/work/ab_service_web/ab_service_web/ab_platform_web/node_modules/image-size/dist|fs","webpack://ab_platform_web/ignored|/home/runner/work/ab_service_web/ab_service_web/ab_platform_web/node_modules/image-size/dist|path"],"sourcesContent":["var map = {\n\t\"./af\": 19183,\n\t\"./af.js\": 19183,\n\t\"./ar\": 31035,\n\t\"./ar-dz\": 47214,\n\t\"./ar-dz.js\": 47214,\n\t\"./ar-kw\": 40830,\n\t\"./ar-kw.js\": 40830,\n\t\"./ar-ly\": 68899,\n\t\"./ar-ly.js\": 68899,\n\t\"./ar-ma\": 77258,\n\t\"./ar-ma.js\": 77258,\n\t\"./ar-ps\": 19121,\n\t\"./ar-ps.js\": 19121,\n\t\"./ar-sa\": 64096,\n\t\"./ar-sa.js\": 64096,\n\t\"./ar-tn\": 97826,\n\t\"./ar-tn.js\": 97826,\n\t\"./ar.js\": 31035,\n\t\"./az\": 20051,\n\t\"./az.js\": 20051,\n\t\"./be\": 23813,\n\t\"./be.js\": 23813,\n\t\"./bg\": 64323,\n\t\"./bg.js\": 64323,\n\t\"./bm\": 57837,\n\t\"./bm.js\": 57837,\n\t\"./bn\": 75780,\n\t\"./bn-bd\": 25959,\n\t\"./bn-bd.js\": 25959,\n\t\"./bn.js\": 75780,\n\t\"./bo\": 81451,\n\t\"./bo.js\": 81451,\n\t\"./br\": 76480,\n\t\"./br.js\": 76480,\n\t\"./bs\": 91607,\n\t\"./bs.js\": 91607,\n\t\"./ca\": 23232,\n\t\"./ca.js\": 23232,\n\t\"./cs\": 91034,\n\t\"./cs.js\": 91034,\n\t\"./cv\": 54213,\n\t\"./cv.js\": 54213,\n\t\"./cy\": 95800,\n\t\"./cy.js\": 95800,\n\t\"./da\": 40739,\n\t\"./da.js\": 40739,\n\t\"./de\": 66951,\n\t\"./de-at\": 82181,\n\t\"./de-at.js\": 82181,\n\t\"./de-ch\": 61339,\n\t\"./de-ch.js\": 61339,\n\t\"./de.js\": 66951,\n\t\"./dv\": 16938,\n\t\"./dv.js\": 16938,\n\t\"./el\": 59573,\n\t\"./el.js\": 59573,\n\t\"./en-au\": 62458,\n\t\"./en-au.js\": 62458,\n\t\"./en-ca\": 51816,\n\t\"./en-ca.js\": 51816,\n\t\"./en-gb\": 8069,\n\t\"./en-gb.js\": 8069,\n\t\"./en-ie\": 15586,\n\t\"./en-ie.js\": 15586,\n\t\"./en-il\": 60009,\n\t\"./en-il.js\": 60009,\n\t\"./en-in\": 51207,\n\t\"./en-in.js\": 51207,\n\t\"./en-nz\": 83724,\n\t\"./en-nz.js\": 83724,\n\t\"./en-sg\": 1953,\n\t\"./en-sg.js\": 1953,\n\t\"./eo\": 1292,\n\t\"./eo.js\": 1292,\n\t\"./es\": 66328,\n\t\"./es-do\": 61452,\n\t\"./es-do.js\": 61452,\n\t\"./es-mx\": 94444,\n\t\"./es-mx.js\": 94444,\n\t\"./es-us\": 81285,\n\t\"./es-us.js\": 81285,\n\t\"./es.js\": 66328,\n\t\"./et\": 7181,\n\t\"./et.js\": 7181,\n\t\"./eu\": 62830,\n\t\"./eu.js\": 62830,\n\t\"./fa\": 19565,\n\t\"./fa.js\": 19565,\n\t\"./fi\": 85541,\n\t\"./fi.js\": 85541,\n\t\"./fil\": 65661,\n\t\"./fil.js\": 65661,\n\t\"./fo\": 26087,\n\t\"./fo.js\": 26087,\n\t\"./fr\": 25396,\n\t\"./fr-ca\": 96581,\n\t\"./fr-ca.js\": 96581,\n\t\"./fr-ch\": 81294,\n\t\"./fr-ch.js\": 81294,\n\t\"./fr.js\": 25396,\n\t\"./fy\": 12533,\n\t\"./fy.js\": 12533,\n\t\"./ga\": 55796,\n\t\"./ga.js\": 55796,\n\t\"./gd\": 50847,\n\t\"./gd.js\": 50847,\n\t\"./gl\": 60439,\n\t\"./gl.js\": 60439,\n\t\"./gom-deva\": 46514,\n\t\"./gom-deva.js\": 46514,\n\t\"./gom-latn\": 66525,\n\t\"./gom-latn.js\": 66525,\n\t\"./gu\": 34232,\n\t\"./gu.js\": 34232,\n\t\"./he\": 50915,\n\t\"./he.js\": 50915,\n\t\"./hi\": 22095,\n\t\"./hi.js\": 22095,\n\t\"./hr\": 10762,\n\t\"./hr.js\": 10762,\n\t\"./hu\": 88275,\n\t\"./hu.js\": 88275,\n\t\"./hy-am\": 73094,\n\t\"./hy-am.js\": 73094,\n\t\"./id\": 27769,\n\t\"./id.js\": 27769,\n\t\"./is\": 99676,\n\t\"./is.js\": 99676,\n\t\"./it\": 74313,\n\t\"./it-ch\": 25141,\n\t\"./it-ch.js\": 25141,\n\t\"./it.js\": 74313,\n\t\"./ja\": 11985,\n\t\"./ja.js\": 11985,\n\t\"./jv\": 53908,\n\t\"./jv.js\": 53908,\n\t\"./ka\": 32808,\n\t\"./ka.js\": 32808,\n\t\"./kk\": 33930,\n\t\"./kk.js\": 33930,\n\t\"./km\": 71532,\n\t\"./km.js\": 71532,\n\t\"./kn\": 69461,\n\t\"./kn.js\": 69461,\n\t\"./ko\": 60502,\n\t\"./ko.js\": 60502,\n\t\"./ku\": 18660,\n\t\"./ku-kmr\": 58035,\n\t\"./ku-kmr.js\": 58035,\n\t\"./ku.js\": 18660,\n\t\"./ky\": 83088,\n\t\"./ky.js\": 83088,\n\t\"./lb\": 65742,\n\t\"./lb.js\": 65742,\n\t\"./lo\": 25417,\n\t\"./lo.js\": 25417,\n\t\"./lt\": 64968,\n\t\"./lt.js\": 64968,\n\t\"./lv\": 41202,\n\t\"./lv.js\": 41202,\n\t\"./me\": 34438,\n\t\"./me.js\": 34438,\n\t\"./mi\": 18498,\n\t\"./mi.js\": 18498,\n\t\"./mk\": 6744,\n\t\"./mk.js\": 6744,\n\t\"./ml\": 63949,\n\t\"./ml.js\": 63949,\n\t\"./mn\": 4459,\n\t\"./mn.js\": 4459,\n\t\"./mr\": 46679,\n\t\"./mr.js\": 46679,\n\t\"./ms\": 56960,\n\t\"./ms-my\": 47483,\n\t\"./ms-my.js\": 47483,\n\t\"./ms.js\": 56960,\n\t\"./mt\": 99989,\n\t\"./mt.js\": 99989,\n\t\"./my\": 64978,\n\t\"./my.js\": 64978,\n\t\"./nb\": 88460,\n\t\"./nb.js\": 88460,\n\t\"./ne\": 23993,\n\t\"./ne.js\": 23993,\n\t\"./nl\": 95378,\n\t\"./nl-be\": 62678,\n\t\"./nl-be.js\": 62678,\n\t\"./nl.js\": 95378,\n\t\"./nn\": 67560,\n\t\"./nn.js\": 67560,\n\t\"./oc-lnc\": 87060,\n\t\"./oc-lnc.js\": 87060,\n\t\"./pa-in\": 62187,\n\t\"./pa-in.js\": 62187,\n\t\"./pl\": 93532,\n\t\"./pl.js\": 93532,\n\t\"./pt\": 49396,\n\t\"./pt-br\": 92485,\n\t\"./pt-br.js\": 92485,\n\t\"./pt.js\": 49396,\n\t\"./ro\": 33179,\n\t\"./ro.js\": 33179,\n\t\"./ru\": 93797,\n\t\"./ru.js\": 93797,\n\t\"./sd\": 40675,\n\t\"./sd.js\": 40675,\n\t\"./se\": 59036,\n\t\"./se.js\": 59036,\n\t\"./si\": 59160,\n\t\"./si.js\": 59160,\n\t\"./sk\": 31266,\n\t\"./sk.js\": 31266,\n\t\"./sl\": 74699,\n\t\"./sl.js\": 74699,\n\t\"./sq\": 69728,\n\t\"./sq.js\": 69728,\n\t\"./sr\": 87129,\n\t\"./sr-cyrl\": 55000,\n\t\"./sr-cyrl.js\": 55000,\n\t\"./sr.js\": 87129,\n\t\"./ss\": 74346,\n\t\"./ss.js\": 74346,\n\t\"./sv\": 9877,\n\t\"./sv.js\": 9877,\n\t\"./sw\": 918,\n\t\"./sw.js\": 918,\n\t\"./ta\": 24787,\n\t\"./ta.js\": 24787,\n\t\"./te\": 6199,\n\t\"./te.js\": 6199,\n\t\"./tet\": 91851,\n\t\"./tet.js\": 91851,\n\t\"./tg\": 33881,\n\t\"./tg.js\": 33881,\n\t\"./th\": 87828,\n\t\"./th.js\": 87828,\n\t\"./tk\": 99677,\n\t\"./tk.js\": 99677,\n\t\"./tl-ph\": 29253,\n\t\"./tl-ph.js\": 29253,\n\t\"./tlh\": 95586,\n\t\"./tlh.js\": 95586,\n\t\"./tr\": 17254,\n\t\"./tr.js\": 17254,\n\t\"./tzl\": 61192,\n\t\"./tzl.js\": 61192,\n\t\"./tzm\": 69631,\n\t\"./tzm-latn\": 72841,\n\t\"./tzm-latn.js\": 72841,\n\t\"./tzm.js\": 69631,\n\t\"./ug-cn\": 71720,\n\t\"./ug-cn.js\": 71720,\n\t\"./uk\": 28048,\n\t\"./uk.js\": 28048,\n\t\"./ur\": 86751,\n\t\"./ur.js\": 86751,\n\t\"./uz\": 96343,\n\t\"./uz-latn\": 60513,\n\t\"./uz-latn.js\": 60513,\n\t\"./uz.js\": 96343,\n\t\"./vi\": 44821,\n\t\"./vi.js\": 44821,\n\t\"./x-pseudo\": 23973,\n\t\"./x-pseudo.js\": 23973,\n\t\"./yo\": 15000,\n\t\"./yo.js\": 15000,\n\t\"./zh-cn\": 43762,\n\t\"./zh-cn.js\": 43762,\n\t\"./zh-hk\": 9246,\n\t\"./zh-hk.js\": 9246,\n\t\"./zh-mo\": 41107,\n\t\"./zh-mo.js\": 41107,\n\t\"./zh-tw\": 79014,\n\t\"./zh-tw.js\": 79014\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 35358;","import ABFactoryCore from \"./core/ABFactoryCore\";\n\nimport _ from \"lodash\";\nimport moment from \"moment\";\nimport { nanoid } from \"nanoid\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport performance from \"../utils/performance\";\nimport FilterComplex from \"./platform/FilterComplex\";\nimport SortPopup from \"./platform/views/ABViewGridPopupSortFields\";\nimport Papa from \"papaparse\";\n\n//\n// Our Common Resources\n//\nimport Config from \"../config/Config.js\";\n// Config : responsible for all the configuration/settings of our instance.\n\nimport Account from \"../resources/Account.js\";\n// Account : manages the current Logged in User and Account information.\n\nimport ClassUI from \"../ui/ClassUI.js\";\n\nimport Dialog from \"./_factory_utils/Dialog.js\";\n// Dialog : common UI dialogs.\n\nimport Multilingual from \"../resources/Multilingual.js\";\n// Multilingual: our interface Labels and language options\n\nimport Network from \"../resources/Network.js\";\n// Network: our interface for communicating to our server\n\nimport Storage from \"../resources/Storage.js\";\n// Storage: manages our interface for local storage\n\nimport ABViewManager from \"./core/ABViewManagerCore\";\n\nimport Tenant from \"../resources/Tenant.js\";\n// Tenant: manages the Tenant information of the current instance\n\nimport UISettings from \"./uiSettings/config.js\";\nimport ABViewComponent from \"./platform/views/viewComponent/ABViewComponent.js\";\n// UISettings: detailed settings for our common UI elements\n\nclass ABValidator {\n constructor(AB) {\n this.AB = AB;\n this.errors = [];\n }\n\n addError(name, message) {\n this.errors.push({ name: name, message: message });\n }\n\n pass() {\n return this.errors.length == 0;\n }\n\n fail() {\n return this.errors.length > 0;\n }\n\n toValidationObject() {\n var obj = {\n error: \"E_VALIDATION\",\n invalidAttributes: {},\n };\n\n var attr = obj.invalidAttributes;\n\n this.errors.forEach((e) => {\n attr[e.name] = attr[e.name] || [];\n attr[e.name].push(e);\n });\n\n return obj;\n }\n\n updateForm(form) {\n var vObj = this.toValidationObject();\n this.AB.Validation.isFormValidationError(vObj, form);\n }\n\n updateGrid(rowID, grid) {\n var vObj = this.toValidationObject();\n this.AB.Validation.isGridValidationError(vObj, rowID, grid);\n }\n}\n\n//\n// AppBuilder Objects\n//\n\nclass ABFactory extends ABFactoryCore {\n constructor(definitions) {\n super(definitions);\n\n // Common Reference to Configuration Values\n this.Config = Config;\n\n //\n // Resources\n //\n this.Account = Account;\n this.Dialog = Dialog;\n this.Multilingual = Multilingual;\n this.Network = Network;\n this.Storage = Storage;\n this.Tenant = Tenant;\n this.Webix = webix;\n\n // Plugin Classes\n this.ClassUI = ClassUI;\n\n // additional Class definitions\n this.Class.FilterComplex = FilterComplex;\n this.Class.ABViewManager = ABViewManager;\n this.Class.SortPopup = SortPopup;\n this.Class.ABViewComponent = ABViewComponent;\n\n // Temp placeholders until Resources are implemented:\n this.Analytics = {\n log: () => {},\n logError: () => {},\n };\n this.Lock = class Lock {\n constructor() {}\n\n acquire() {\n return Promise.resolve();\n }\n release() {\n return Promise.resolve();\n }\n };\n\n this.performance = performance;\n\n this.UISettings = UISettings;\n\n this.Validation = {\n validator: () => {\n return new ABValidator(this);\n },\n\n errorSailsCleanup: function (error) {\n if (error) {\n //// if the error obj is provided by Sails response,\n //// do some clean up on the error object:\n\n // dig down to sails provided error object:\n if (\n error.error &&\n error.error == \"E_UNKNOWN\" &&\n error.raw &&\n error.raw.length > 0\n ) {\n error = error.raw[0];\n }\n\n // drill down to the embedded .err object if it exists\n if (error.err) {\n error = error.err;\n }\n\n // if this is from our server response:\n if (\n error.data &&\n error.data.error &&\n error.data.error == \"E_VALIDATION\"\n ) {\n error = error.data;\n }\n }\n\n return error;\n },\n\n /**\n * @function AB.Validation.isFormValidationError\n *\n * scans the given error to see if it is a sails' response about an invalid\n * value from one of the form elements.\n *\n * @codestart\n * var form = $$('formID');\n * var values = form.getValues();\n * model.attr(values);\n * model.save()\n * .fail(function(err){\n * if (!OP.Form.isFormValidationError(err, form)) {\n * OP.error.log('Error saving current model ()', {error:err, values:values});\n * }\n * })\n * .then(function(newData){\n *\n * });\n * @codeend\n *\n * @param {obj} error\n * the error response object\n * @param {obj} form\n * the webix form instance (or reference)\n * @return {bool}\n * true if error was about a form element.\n * false otherwise.\n */\n isFormValidationError: function (error, form) {\n var hasFocused = false;\n // {bool} have we set focus to form component?\n\n // if we have an error object:\n if (error) {\n //// if the error obj is provided by Sails response,\n //// do some clean up on the error object:\n\n error = this.errorSailsCleanup(error);\n\n //// Now process the error object\n ////\n if (\n (error.error && error.error == \"E_VALIDATION\") ||\n (error.code && error.code == \"E_VALIDATION\")\n ) {\n var attrs = error.invalidAttributes;\n if (attrs) {\n var wasForm = false;\n for (var attr in attrs) {\n // if this is a field in the form:\n if (form.elements[attr]) {\n var errors = attrs[attr];\n var msg = [];\n errors.forEach(function (err) {\n msg.push(err.message);\n });\n\n // set the invalid error message\n form.markInvalid(attr, msg.join(\", \"));\n\n // set focus to the 1st form element we mark:\n if (!hasFocused) {\n form.elements[attr].focus();\n hasFocused = true;\n }\n\n wasForm = true;\n }\n }\n\n if (wasForm) {\n return true;\n }\n }\n }\n }\n\n // if we missed updating our form with an error\n // this was not a validation error so return false\n return false;\n },\n\n /**\n * @method AB.Validation.isGridValidationError\n *\n * scans the given error to see if it is a sails' response about an invalid\n * value from one of our grid columns.\n *\n * @codestart\n * var grid = $$('myGrid');\n * model.attr(values);\n * model.save()\n * .fail(function(err){\n * if (!OP.Validation.isGridValidationError(err, editor, grid)) {\n * OP.error.log('Error saving current model ()', {error:err, values:values});\n * }\n * })\n * .then(function(newData){\n *\n * });\n * @codeend\n *\n * @param {Error} error\n * the error response object\n * @param {integer} row\n * the row id of the Grid to update.\n * @param {webix.datatable} Grid\n * the webix grid instance (or reference)\n * @return {bool}\n * true if error was about a grid column.\n * false otherwise.\n */\n isGridValidationError: function (error, row, Grid) {\n // if we have an error object:\n if (error) {\n //// if the error obj is provided by Sails response,\n //// do some clean up on the error object:\n\n error = this.errorSailsCleanup(error);\n\n //// Now process the error object\n ////\n if (\n (error.error && error.error == \"E_VALIDATION\") ||\n (error.code && error.code == \"E_VALIDATION\")\n ) {\n var attrs = error.invalidAttributes;\n if (attrs) {\n var wasGrid = false;\n for (var attr in attrs) {\n Grid.addCellCss(row, attr, \"webix_invalid\");\n Grid.addCellCss(row, attr, \"webix_invalid_cell\");\n\n var msg = [];\n attrs[attr].forEach((e) => {\n msg.push(e.message);\n });\n\n webix.alert({\n text: attr + \": \" + msg.join(\", \"),\n });\n\n wasGrid = true;\n }\n\n Grid.refresh(row);\n Grid.clearSelection();\n\n if (wasGrid) {\n return true;\n }\n }\n }\n }\n\n // if we missed updating our Grid with an error\n // this was not a validation error so return false\n return false;\n },\n };\n\n // TODO: make sure \"error\" s are handled and sent to logs\n // this.on(\"error\", ()=>{ Analytics.error })\n\n this.Definitions = {};\n // {obj} the provided interface for working with the ABDefinition table.\n // NOTE: on the web client, we simply perform web API calls to perform\n // the actions. These are defined below.\n\n this.on(\"error\", (err) => {\n // this simply prevents thrown errors if there are no listeners.\n console.error(err);\n });\n\n this._plugins = [];\n // {array} of loaded Plugin.applications.\n\n this._pendingNetworkRequests = {};\n // {hash} uuid : {Promise}\n // convert our definitionsXXXX() operations to be Relay/offline compatible.\n // if a queued operation is sent after a web browser refresh, then\n // we will NOT have a pending promise to .resolve()/.reject()\n\n this.Network.on(\"definition.create\", (context, err, fullDef) => {\n var pending = this._pendingNetworkRequests[context.uuid];\n if (err) {\n // this.error(err);\n pending?.reject(err);\n return;\n }\n\n // for immediate feedback to our UI:\n // simulate the RT update from our sockets:\n var pkt = {\n id: fullDef.id,\n data: fullDef,\n };\n this.emit(\"ab.abdefinition.create\", pkt);\n\n let newDef = this.definitionNew(fullDef);\n pending?.resolve(newDef);\n });\n\n this.Network.on(\"definition.update\", (context, err, serverDef) => {\n var pending = this._pendingNetworkRequests[context.uuid];\n if (err) {\n if (err.toString().indexOf(\"Not Found\") > -1) {\n return this.definitionCreate(context.values)\n .then(pending?.resolve)\n .catch(pending?.reject);\n }\n // log the error\n // this.error(err);\n pending?.reject(err);\n return;\n }\n\n this._definitions[context.id] = serverDef;\n\n // for immediate feedback to our UI:\n // simulate the RT update from our sockets:\n var pkt = {\n id: serverDef.id,\n data: serverDef,\n };\n this.emit(\"ab.abdefinition.update\", pkt);\n\n pending?.resolve(serverDef);\n });\n\n this.Network.on(\"definition.delete\", (context, err, serverDef) => {\n var pending = this._pendingNetworkRequests[context.uuid];\n if (err) {\n // log the error\n // this.error(err);\n pending?.reject(err);\n return;\n }\n\n delete this._definitions[context.id];\n\n // for immediate feedback to our UI:\n // simulate the RT update from our sockets:\n var pkt = {\n id: context.id,\n data: serverDef,\n };\n this.emit(\"ab.abdefinition.delete\", pkt);\n\n pending?.resolve();\n });\n\n //\n // Rules\n //\n const platformRules = {\n /**\n * @method toDate\n *\n * @param {string} dateText\n * @param {Object} options - {\n * format: \"string\",\n * ignoreTime: boolean\n * }\n * @return {Date}\n */\n toDate: (dateText = \"\", options = {}) => {\n if (!dateText) return;\n\n if (options.ignoreTime) dateText = dateText.replace(/T.*/, \"\");\n\n let result = options.format\n ? moment(dateText, options.format)\n : moment(dateText);\n\n let supportFormats = [\n \"YYYY-MM-DD\",\n \"YYYY/MM/DD\",\n \"DD/MM/YYYY\",\n \"MM/DD/YYYY\",\n \"DD-MM-YYYY\",\n \"MM-DD-YYYY\",\n ];\n\n supportFormats.forEach((format) => {\n if (!result || !result.isValid())\n result = moment(dateText, format);\n });\n\n return new Date(result);\n },\n\n /**\n * @method toDateFormat\n *\n * @param {Date} date\n * @param {Object} options - {\n * format: \"string\",\n * localeCode: \"string\"\n * }\n *\n * @return {string}\n */\n toDateFormat: (date, options) => {\n if (!date) return \"\";\n\n let momentObj = moment(date);\n\n if (options.localeCode) momentObj.locale(options.localeCode);\n\n return momentObj.format(options.format);\n },\n\n /**\n * @method subtractDate\n *\n * @param {Date} date\n * @param {number} number\n * @param {string} unit\n *\n * @return {Date}\n */\n subtractDate: (date, number, unit) => {\n return moment(date).subtract(number, unit).toDate();\n },\n\n /**\n * @method addDate\n *\n * @param {Date} date\n * @param {number} number\n * @param {string} unit\n *\n * @return {Date}\n */\n addDate: (date, number, unit) => {\n return moment(date).add(number, unit).toDate();\n },\n\n /**\n * Get today's UTC time range in \"YYYY-MM-DD HH:MM:SS\" format.\n *\n * It converts the start and end of today to UTC to keep things consistent\n * across time zones. Handy when you need to deal with dates in different regions.\n *\n * @returns {string} UTC time range for today.\n */\n\n getUTCDayTimeRange: () => {\n let now = new Date();\n let year = now.getFullYear();\n let month = now.getMonth();\n let date = now.getDate();\n let startOfDay = new Date(year, month, date, 0, 0, 0);\n let endOfDay = new Date(year, month, date, 23, 59, 59);\n\n // Convert to UTC by subtracting the timezone offset\n let startOfDayUTC = new Date(\n startOfDay.getTime() + startOfDay.getTimezoneOffset() * 60000\n );\n let endOfDayUTC = new Date(\n endOfDay.getTime() + endOfDay.getTimezoneOffset() * 60000\n );\n\n // Format the date in \"YYYY-MM-DD HH:MM:SS\" format\n let formatDate = (date) => {\n let isoString = date.toISOString();\n return `${isoString.slice(0, 10)} ${isoString.slice(11, 19)}`;\n };\n return formatDate(startOfDayUTC).concat(\n \"|\",\n formatDate(endOfDayUTC)\n );\n },\n };\n (Object.keys(platformRules) || []).forEach((k) => {\n this.rules[k] = platformRules[k];\n });\n }\n\n /**\n * init()\n * prepare the ABFactory for operation. This includes parsing the\n * definitions into useable objects, preparing the System Resources, etc.\n * @return {Promise}\n */\n async init() {\n //\n // Prepare our Resources First\n //\n var allInits = [];\n\n allInits.push(this.Account.init(this));\n allInits.push(this.Multilingual.init(this));\n allInits.push(this.Network.init(this));\n allInits.push(this.Tenant.init(this));\n\n await Promise.all(allInits);\n await this.Storage.init(this);\n var data = await this.Storage.get(\"local_settings\");\n this._localSettings = data || {};\n\n //\n // Real Time Update Handlers\n //\n\n // new ABDefinition created:\n this.on(\"ab.abdefinition.create\", (pkt) => {\n // pkt.id : definition.id\n // pkt.data : definition\n\n if (typeof pkt.data.json == \"string\") {\n try {\n pkt.data.json = JSON.parse(pkt.data.json);\n } catch (e) {\n console.log(e);\n }\n }\n this._definitions[pkt.id] = pkt.data;\n this.definitionSync(\"created\", pkt.id, pkt.data);\n });\n\n // ABDefinition updated:\n this.on(\"ab.abdefinition.update\", (pkt) => {\n // pkt.id : definition.id\n // pkt.data : definition\n if (typeof pkt.data.json == \"string\") {\n try {\n pkt.data.json = JSON.parse(pkt.data.json);\n } catch (e) {\n console.log(e);\n }\n }\n this._definitions[pkt.id] = pkt.data;\n this.definitionSync(\"updated\", pkt.id, pkt.data);\n });\n\n // ABDefinition delete:\n this.on(\"ab.abdefinition.delete\", (pkt) => {\n // pkt.id : definition.id\n // pkt.data : definition\n if (typeof pkt.data.json == \"string\") {\n try {\n pkt.data.json = JSON.parse(pkt.data.json);\n } catch (e) {\n console.log(e);\n }\n }\n delete this._definitions[pkt.id];\n this.definitionSync(\"destroyed\", pkt.id, pkt.data);\n });\n\n return super.init();\n\n // return Promise.all(allInits)\n // .then(() => {\n // // some Resources depend on the above to be .init() before they can\n // // .init() themselves.\n // return this.Storage.init(this).then(() => {\n // return this.Storage.get(\"local_settings\").then((data) => {\n // this._localSettings = data || {};\n // });\n // });\n // })\n // .then(() => {\n // //\n // // RealTime Updates of our ABDefinitions\n // //\n\n // // new ABDefinition created:\n // this.on(\"ab.abdefinition.create\", (pkt) => {\n // // pkt.id : definition.id\n // // pkt.data : definition\n\n // if (typeof pkt.data.json == \"string\") {\n // try {\n // pkt.data.json = JSON.parse(pkt.data.json);\n // } catch (e) {\n // console.log(e);\n // }\n // }\n // this._definitions[pkt.id] = pkt.data;\n // this.definitionSync(\"created\", pkt.id, pkt.data);\n // });\n\n // // ABDefinition updated:\n // this.on(\"ab.abdefinition.update\", (pkt) => {\n // // pkt.id : definition.id\n // // pkt.data : definition\n // if (typeof pkt.data.json == \"string\") {\n // try {\n // pkt.data.json = JSON.parse(pkt.data.json);\n // } catch (e) {\n // console.log(e);\n // }\n // }\n // this._definitions[pkt.id] = pkt.data;\n // this.definitionSync(\"updated\", pkt.id, pkt.data);\n // });\n\n // // ABDefinition delete:\n // this.on(\"ab.abdefinition.delete\", (pkt) => {\n // // pkt.id : definition.id\n // // pkt.data : definition\n // if (typeof pkt.data.json == \"string\") {\n // try {\n // pkt.data.json = JSON.parse(pkt.data.json);\n // } catch (e) {\n // console.log(e);\n // }\n // }\n // delete this._definitions[pkt.id];\n // this.definitionSync(\"destroyed\", pkt.id, pkt.data);\n // });\n\n // return super.init();\n // });\n }\n\n /**\n * definiitonCreate(def)\n * create a new ABDefinition\n * @param {obj} def\n * the value hash of the new definition entry\n * @return {Promise}\n * resolved with a new {ABDefinition} for the entry.\n */\n async definitionCreate(def) {\n // we will set our uuid\n if (typeof def.id == \"undefined\") {\n def.id = this.uuid();\n def.json.id = def.id;\n }\n\n return new Promise((resolve, reject) => {\n var uuid = this.uuid();\n this._pendingNetworkRequests[uuid] = { resolve, reject };\n var jobResponse = {\n key: \"definition.create\",\n context: {\n uuid,\n },\n };\n this.Network.post(\n {\n url: `/definition/create`,\n data: def,\n },\n jobResponse\n ).catch((err) => {\n var message = \"Error attempting to CREATE definitions\";\n if (err.code == \"E_NOPERM\") {\n message = \"User Doesn't have permission to CREATE definitions\";\n }\n this.notify.developer(err, {\n context: \"ABFactory.definitionCreate()\",\n message,\n def,\n });\n\n // NOTE: when using jobResponse type calls, expect that\n // handler to be handling the errors.\n // don't keep propagating them here.\n });\n });\n }\n\n /**\n * definitionDestroy(id)\n * delete an ABDefinition\n * @param {string} id\n * the uuid of the ABDefinition to delete\n * @return {Promise}\n */\n async definitionDestroy(id) {\n return new Promise((resolve, reject) => {\n var uuid = this.uuid();\n this._pendingNetworkRequests[uuid] = { resolve, reject };\n var jobResponse = {\n key: \"definition.delete\",\n context: {\n id,\n uuid,\n },\n };\n this.Network.delete(\n {\n url: `/definition/${id}`,\n },\n jobResponse\n ).catch((err) => {\n var message = \"Error attempting to DESTROY definitions\";\n if (err.code == \"E_NOPERM\") {\n message = \"User Doesn't have permission to DELETE definitions\";\n }\n this.notify.developer(err, {\n context: \"ABFactory.definitionDestroy()\",\n message,\n id,\n });\n\n // NOTE: when using jobResponse type calls, expect that\n // handler to be handling the errors.\n // don't keep propagating them here.\n });\n });\n }\n\n /**\n * definitionUpdate(id, def)\n * update an existing ABDefinition\n * @param {string} id\n * the uuid of the ABDefinition to update.\n * @param {obj} values\n * the value hash of the new definition values\n * @return {Promise}\n * resolved with a new {ABDefinition} for the entry.\n */\n async definitionUpdate(id, values) {\n return new Promise((resolve, reject) => {\n var uuid = this.uuid();\n this._pendingNetworkRequests[uuid] = { resolve, reject };\n var jobResponse = {\n key: \"definition.update\",\n context: {\n id,\n uuid,\n values,\n },\n };\n this.Network.put(\n {\n url: `/definition/${id}`,\n data: values,\n },\n jobResponse\n ).catch((err) => {\n var message = \"Error attempting to UPDATE definitions\";\n if (err.code == \"E_NOPERM\") {\n message = \"User Doesn't have permission to UPDATE definitions\";\n }\n this.notify.developer(err, {\n context: \"ABFactory.definitionUpdate()\",\n message,\n });\n\n // NOTE: when using jobResponse type calls, expect that\n // handler to be handling the errors.\n // don't keep propagating them here.\n });\n });\n }\n\n /**\n * definitionsParse()\n * include the incoming definitions into our ABFactory. These new\n * definitions will replace any existing ones with the same .id.\n * @param {array[ABDefinitioin]} defs\n * the incoming array of ABDefinitions to parse.\n * @return {Promise}\n */\n // definitionsParse(defs = []) {\n // if (!Array.isArray(defs)) {\n // defs = [defs];\n // }\n\n // // store/replace the incoming definitions\n // // 1st: insert ALL our definitions internally\n // defs.forEach((d) => {\n // this._definitions[d.id] = d;\n // });\n // // 2nd: Now we can then go through and signal the \"updates\"\n // // and the related objects can find their dependent definitions.\n // defs.forEach((d) => {\n // this.definitionSync(\"updated\", d.id, d);\n // });\n\n // return Promise.resolve();\n // }\n\n /**\n * will send alerts to a group of people. These alerts are usually about\n * configuration errors, or software problems.\n * @param {string} domain which group of people we are sending a notification to.\n * @param {Error} error An error object generated at the point of issue.\n * @param {json} info Additional related information concerning the issue.\n */\n notify(domain, error, info) {\n performance.notify(domain, error, info);\n }\n\n plugins() {\n return this._plugins;\n }\n pluginLoad(p) {\n this._plugins.push(p);\n }\n\n //\n // Utilities\n //\n alert(options) {\n this.Webix.alert(options);\n }\n\n cloneDeep(value) {\n return _.cloneDeep(value);\n }\n\n /**\n * implements the _.defaultsDeep function\n * @param {object} target\n * @param {object} source\n * @returns {object} the merged object\n */\n defaultsDeep(target, source) {\n return _.defaultsDeep(target, source);\n }\n\n error(message, ...rest) {\n var emitData = {\n message: `ABFactory[${this.Tenant.id()}]:${message.toString()}`,\n };\n\n console.error(emitData.message);\n if (message instanceof Error) {\n emitData.error = message;\n // this dumps the error.stack\n console.error(message);\n }\n\n if (rest.length > 0) {\n rest.forEach((r) => {\n if (r instanceof Error) {\n emitData.error = r;\n // this dumps the error.stack\n console.error(r);\n }\n\n if (typeof r == \"object\") {\n for (var k in r) {\n emitData[k] = r[k];\n console.error(k, r[k]);\n }\n }\n });\n }\n this.emit(\"error\", emitData);\n }\n\n jobID() {\n return nanoid();\n }\n\n Label() {\n return (...params) => {\n return this.Multilingual.label(...params);\n };\n }\n\n localSettings(key, value) {\n if (typeof value == \"undefined\") {\n // this is a getter:\n return this._localSettings[key];\n } else {\n // setting a value:\n this._localSettings[key] = value;\n return this.Storage.set(`local_settings`, this._localSettings);\n }\n }\n\n log(message, ...rest) {\n console.log(message);\n rest.forEach((r) => {\n console.log(r);\n });\n }\n\n isNil(value) {\n return _.isNil(value);\n }\n\n /**\n * @method rules.isUUID\n * evaluate a given value to see if it matches the format of a uuid\n * @param {string} key\n * @return {boolean}\n */\n isUUID(key) {\n var checker = RegExp(\n \"^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$\",\n \"i\"\n );\n return checker.test(key);\n }\n\n merge(...params) {\n return _.merge(...params);\n }\n\n orderBy(...params) {\n return _.orderBy(...params);\n }\n\n uniq(...params) {\n return _.uniq(...params);\n }\n\n kebabCase(...params) {\n return _.kebabCase(...params);\n }\n\n sumBy(...params) {\n return _.sumBy(...params);\n }\n\n meanBy(...params) {\n return _.meanBy(...params);\n }\n\n maxBy(...params) {\n return _.maxBy(...params);\n }\n\n minBy(...params) {\n return _.minBy(...params);\n }\n\n uuid() {\n return uuidv4();\n }\n\n warn(message, ...rest) {\n console.warn(message);\n rest.forEach((r) => {\n console.warn(r);\n });\n }\n\n isString(...params) {\n return _.isString(params);\n }\n\n async scriptLoad(url) {\n await new Promise((resolve, reject) => {\n var cb = () => resolve();\n // Adding the script tag to the head as suggested before\n const head = document.head;\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = url;\n\n // Then bind the event to the callback function.\n // There are several events for cross browser compatibility.\n script.onreadystatechange = cb;\n script.onload = cb;\n script.onerror = () => {\n reject(\n new Error(\n `Preloader:ScriptLoad(): Error loading script (${url})`\n )\n );\n };\n // Fire the loading\n head.appendChild(script);\n });\n }\n\n async scriptLoadAll(urls) {\n urls = urls.filter((u) => u);\n await Promise.all(urls.map((url) => this.scriptLoad(url)));\n }\n\n async cssLoad(url) {\n await new Promise((resolve, reject) => {\n const head = document.head;\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = url;\n\n link.onload = () => resolve();\n link.onerror = () => {\n reject(new Error(`Error loading CSS file (${url})`));\n };\n\n head.appendChild(link);\n });\n }\n\n async cssLoadAll(urls) {\n urls = urls.filter((u) => u);\n await Promise.all(urls.map((url) => this.cssLoad(url)));\n }\n\n csvToJson(csvData) {\n return Papa.parse(csvData, {\n header: true,\n skipEmptyLines: true,\n });\n }\n\n jsonToCsv(jsonData) {\n return Papa.unparse(jsonData);\n }\n}\n\nexport default ABFactory;\n","//\n// Dialog\n// A common set of UI dialogs to show the User.\n//\n// NOTE: IN TRANSITION: this is our previous method of handling\n// dialogs. In future, refactor to use webix directly in code.\n//\n\nexport default {\n // Instance properties\n\n // Alert\n // A dialogue that popup with a message, and requires an [ok] button press\n Alert: function (opts) {\n webix.alert({\n title:\n opts.title ||\n AB.Multilingual.label(\"opp.dialog.alert.title\", \"*Alert\"),\n text:\n opts.text ||\n opts.message ||\n AB.Multilingual.label(\n \"opp.dialog.alert.text\",\n \"*Something is wrong.\"\n ),\n ok: opts.ok || AB.Multilingual.label(\"opp.dialog.alert.ok\", \"*OK\"),\n });\n },\n\n // Confirm\n // A [Yes] [No] dialogue that pops up with a message\n Confirm: function (opts) {\n var title =\n opts.title ||\n AB.Multilingual.label(\"opp.dialog.confirm.confirmTitle\", \"* Confirm\");\n var message =\n opts.text ||\n opts.message ||\n AB.Multilingual.label(\n \"opp.dialog.confirm.confirmMsg\",\n \"* Are you sure you want to do this?\"\n );\n\n var labelYes =\n opts.labelYes ||\n opts.ok ||\n AB.Multilingual.label(\"opp.common.yes\", \"* yes\");\n var labelNo =\n opts.labelNo ||\n opts.cancel ||\n AB.Multilingual.label(\"opp.common.no\", \"* no\");\n\n // var fnYes = opts.fnYes || function () { };\n // var fnNo = opts.fnNo || function () { };\n\n webix.confirm({\n title: title,\n text: message,\n\n ok: labelYes,\n cancel: labelNo,\n\n callback: function (result) {\n if (result) {\n if (opts.fnYes) opts.fnYes();\n } else {\n if (opts.fnNo) opts.fnNo();\n }\n\n if (opts.callback) opts.callback(result);\n },\n });\n\n // bootbox.dialog({\n // title: title,\n // message: message,\n // buttons: {\n // yes: {\n // label: labelYes,\n // className: 'btn-primary',\n // callback: fnYes\n // },\n // no: {\n // label: labelNo,\n // className: 'btn-default',\n // callback: fnNo\n // }\n // }\n // });\n },\n\n // ConfirmDelete\n // A Confirm dialogue geared towards deleting items.\n // [delete] [cancel]\n ConfirmDelete: function (opts) {\n this.Confirm({\n title:\n opts.title ||\n AB.Multilingual.label(\n \"opp.dialog.confirm.deleteTitle\",\n \"* Confirm Delete\"\n ),\n ok: opts.ok || AB.Multilingual.label(\"opp.common.delete\", \"* Delete\"),\n cancel:\n opts.cancel ||\n AB.Multilingual.label(\"opp.common.cancel\", \"* Cancel\"),\n text:\n opts.text ||\n opts.message ||\n AB.Multilingual.label(\n \"opp.dialog.confirm.deleteMsg\",\n \"* Are you sure you want to delete this?\",\n [\"this\"]\n ),\n callback: function (result) {\n if (result) {\n if (opts.fnYes) opts.fnYes();\n } else {\n if (opts.fnNo) opts.fnNo();\n }\n\n if (opts.callback) opts.callback(result);\n },\n });\n },\n\n // Message\n // A simple message displayed to the user. Can time out\n Message: function (opts) {\n var message = opts.text || opts.message;\n var timeout = opts.timeout || 2000;\n\n webix.message({\n text: message,\n expire: timeout,\n });\n },\n};\n","/**\n * ABApplicationCore\n *\n * This is the core ABApplication class that manages the common operations\n * of an ABApplication across platforms.\n *\n * It's primary responsibility is to decode a given set of attributes into\n * a working instance of an ABApplication that can return instances of\n * it's defined sub objects.\n *\n * Platform Specific versions of those objects should be defined in a peer\n * directory named platform. These versions of the objects should override\n * these Core objects with platform specific methods of operation (like\n * .save()).\n *\n * Initially your target application should load your platform/ABApplication.js\n * file, which will include this file and sub class it.\n *\n * However, this file will include the remaining files from your platform/*\n * versions.\n */\n\n// webpack can handle 'require()' statements, but node can't handle import\n// so let's use require():\nconst ABViewManager = require(\"../platform/ABViewManager\");\nvar ABMLClass = require(\"../platform/ABMLClass\");\n\nfunction toBool(val) {\n if (typeof val == \"undefined\") {\n return false;\n }\n\n if (val === \"\" || val === \"false\" || val === \"0\") {\n return false;\n }\n\n if (val === \"true\" || val === \"1\") {\n return true;\n }\n\n return val;\n}\n\nmodule.exports = class ABApplicationCore extends ABMLClass {\n constructor(attributes, AB) {\n super([\"label\", \"description\"], AB);\n\n // attributes should be in format:\n // {\n // id:##,\n // json:{},\n // name:\"XYZ\"\n // }\n attributes.json = attributes.json || {};\n\n // ABApplication Attributes\n this.id = attributes.id;\n // {string} uuid\n\n this.type = attributes.type || \"application\";\n // {string} .type\n // the ABDefinition.type of this object.\n\n this.appType = attributes.appType || \"web\";\n // {string} .appType\n // the kind of Application this is. [\"web\", \"mobile\"]\n\n this.json = attributes.json;\n if (typeof this.json == \"string\") this.json = JSON.parse(this.json);\n // {obj} .json\n // the full settings of this ABApplication\n\n this.json[\"versionData\"] = attributes.json?.versionData || {\n versionNumber: \"1.0.0\",\n changeLog: {\n \"1.0.0\": {\n author: \"N/A\",\n version: \"1.0.0\",\n keepVersion: 0,\n commitMessage: \"Initial Version\",\n timestamp: new Date().toISOString(),\n },\n },\n };\n\n if (typeof this.json.versionData == \"string\")\n this.json.versionData = JSON.parse(this.json.versionData);\n // {obj} .json\n // the full version log data of this ABApplication\n\n this.name = attributes.name || this.json.name || \"\";\n // {string} .name\n // the hard coded name of this ABDefinition Object, not to be confused\n // with the .label. The .name is created at design time and is a text\n // reference for this object.\n\n this.icon = attributes.icon || \"fa-rocket\";\n // {string} .icon\n // this is a reference to a font awesome icon including the `fa-`\n // example `fa-child` should be stored for the `child` icon to be used\n // if user wants to get creative they can add more to this field following\n // these examples https://fontawesome.com/v4/examples/\n\n this.isSystemObject = toBool(attributes.isSystemObject);\n // {bool} .isSystemObject\n // is this one of the integrated System Objects used by our framework?\n // Some ABApplications and ABObjects are central to the running of the\n // AppBuilder site. They are marked with .isSystemObject = true; It\n // requires the role \"System Designer\" in order to edit/modify them.\n\n this.roleAccess = attributes.roleAccess || [];\n if (!Array.isArray(this.roleAccess)) {\n this.roleAccess = [this.roleAccess];\n }\n this.roleAccess = this.roleAccess.filter((r) => r);\n // {array}\n // the {ABSiteRole.id}s of the roles allowed to work with this\n // ABApplication. (see .isAccessManaged for more info)\n\n this.isAccessManaged = JSON.parse(attributes.isAccessManaged || false);\n // {bool} .isAccessManaged\n // does this Application imploy the more sophisticated Access\n // permissions, or the simpler Role access permissions.\n // {true} : allows an administrator to set which role can View|Edit|Delete\n // elements of an application.\n // {false}: indicates users having one of the .roleAccess values can have\n // full access to this application\n\n this.accessManagers = attributes.accessManagers;\n if (typeof this.accessManagers == \"string\")\n this.accessManagers = JSON.parse(this.accessManagers);\n // {??} .accessManagers\n // if .isAccessManaged == true, then .accessManagers contain the definitions\n // of the detailed access permissions.\n\n this.isTranslationManaged = JSON.parse(\n attributes.isTranslationManaged || false\n );\n this.translationManagers = attributes.translationManagers;\n if (typeof this.translationManagers == \"string\")\n this.translationManagers = JSON.parse(this.translationManagers);\n\n this.isTutorialManaged = JSON.parse(\n attributes.isTutorialManaged || false\n );\n this.tutorialManagers = attributes.tutorialManagers;\n if (typeof this.tutorialManagers == \"string\")\n this.tutorialManagers = JSON.parse(this.tutorialManagers);\n\n this.hintIDs = attributes.json.hintIDs || [];\n // {array} .hintIDs\n // All the {ABHint.id} values that have been pulled into this\n // ABApplication for use in it's design environment. This is how we\n // determine which {ABHint}s are included or excluded from\n // this app.\n\n this.objectIDs = attributes.json.objectIDs || [];\n // {array} .objectIDs\n // All the {ABObject.id} values that have been pulled into this\n // ABApplication for use in it's design environment. This is how we\n // determine which {ABObject}s are included or excluded from this app.\n\n this.queryIDs = attributes.json.queryIDs || [];\n // {array} .queryIDs\n // All the {ABObjectQuery.id} values that have been pulled into this\n // ABApplication for use in it's design environment. This is how we\n // determine which {ABObjectQueries}s are included or excluded from\n // this app.\n\n this.datacollectionIDs = attributes.json.datacollectionIDs || [];\n // {array} .datacollectionIDs\n // All the {ABDataCollection.id} values that have been pulled into this\n // ABApplication for use in it's design environment. This is how we\n // determine which {ABDataCollection}s are included or excluded from\n // this app.\n\n // import all our {ABViewPage}s\n let newPages = [];\n (attributes.json.pageIDs || []).forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (def) {\n newPages.push(this.pageNew(def));\n } else {\n this.emit(\n \"warning\",\n `App[${this.id}] is referenceing an unknown Page[${id}]`,\n {\n appID: this.id,\n pageID: id,\n }\n );\n // console.error(\n // `App[${this.id}] is referenceing an unknown Page[${id}]`\n // );\n }\n });\n this._pages = newPages;\n // {array} ._pages\n // an array of all the {ABViewPages} this ABApplication offers as\n // interfaces for working with our Data.\n // ABViewPages operate within the confines of an ABApplication so\n // they are created/stored/accessed from within an ABApplication\n\n (attributes.json.processIDs || []).forEach((pID) => {\n var p = this.AB.processByID(pID);\n if (!p) {\n this.emit(\n \"warning\",\n `Application is referencing an unknown process.`,\n { appID: this.id, processID: pID }\n );\n }\n });\n\n this.processIDs = attributes.json.processIDs || [];\n // {array} .processIDs\n // an array of all the {ABProcess.id}s referenced by this Application.\n\n // Object List Settings\n attributes.json.objectListSettings =\n attributes.json.objectListSettings || {};\n this.objectListSettings = this.objectListSettings || {};\n this.objectListSettings.isOpen = JSON.parse(\n attributes.json.objectListSettings.isOpen || false\n );\n this.objectListSettings.searchText =\n attributes.json.objectListSettings.searchText || \"\";\n this.objectListSettings.sortDirection =\n attributes.json.objectListSettings.sortDirection || \"asc\";\n this.objectListSettings.isGroup = JSON.parse(\n attributes.json.objectListSettings.isGroup || false\n );\n\n // let the MLClass now process the translations:\n // transition issues:\n attributes.translations =\n attributes.translations || attributes.json.translations;\n\n super.fromValues(attributes);\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n ///\n /// Instance Methods\n ///\n\n get ViewManager() {\n return ABViewManager;\n }\n\n /// ABApplication data methods\n /**\n * @method isAccessibleForRoles()\n * return true/false if this ABApplication is accessible for one of the\n * passed in ABRoles.\n * @param {array[ABRole]} roles\n * an array of {ABRole} instances.\n * @return {bool}\n */\n isAccessibleForRoles(roles) {\n var foundRole = false;\n\n // if we are on the basic Role assignments:\n if (!this.isAccessManaged) {\n (roles || []).forEach((r) => {\n if (this.roleAccess.indexOf(r.uuid || r) > -1) {\n foundRole = true;\n }\n });\n return foundRole;\n }\n\n // isAccessManaged has been set, so 2 kinds of ppl can\n // see this App\n // 1) an AccessManager\n if (parseInt(this.accessManagers.useRole)) {\n (roles || []).forEach((r) => {\n if (this.accessManagers.role.indexOf(r.uuid || r) > -1) {\n foundRole = true;\n }\n });\n }\n\n // stop here if found.\n if (foundRole) return foundRole;\n\n // 2) someone who has a role that can see one of it's pages.\n // scan each Page of this Application\n (this.pages() || []).forEach((p) => {\n // check to see if that page.isAccessibleForRoles()\n if (p.isAccessibleForRoles(roles)) {\n foundRole = true;\n }\n });\n return foundRole;\n }\n\n get isWebApp() {\n return this.appType == \"web\";\n }\n\n get isMobile() {\n return this.appType == \"mobile\";\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n // MLClass translation\n let versionData = this.json.versionData;\n\n this.json = super.toObj();\n\n this.json.name = this.name;\n\n this.json.versionData = versionData;\n\n this.json.objectIDs = this.objectIDs;\n\n this.json.objectListSettings = this.objectListSettings;\n\n this.json.hintIDs = this.hintIDs;\n\n this.json.queryIDs = this.queryIDs;\n\n this.json.datacollectionIDs = this.datacollectionIDs;\n\n this.json.pageIDs = (this._pages || []).map((p) => p.id);\n\n this.json.processIDs = this.processIDs || [];\n\n // // for each MobileApp: compile to json\n // var currApps = [];\n // this._mobileApps.forEach((app) => {\n // currApps.push(app.toObj())\n // })\n // this.json.mobileApps = currApps;\n\n return {\n id: this.id,\n type: this.type || \"application\",\n appType: this.appType || \"web\",\n name: this.name,\n icon: this.icon,\n isSystemObject: this.isSystemObject,\n json: this.json,\n roleAccess: this.roleAccess,\n translations: this.json.translations,\n isAccessManaged: this.isAccessManaged,\n isTranslationManaged: this.isTranslationManaged,\n isTutorialManaged: this.isTutorialManaged,\n accessManagers: this.accessManagers,\n translationManagers: this.translationManagers,\n tutorialManagers: this.tutorialManagers,\n };\n }\n\n ///\n /// Mobile Apps\n ///\n\n ///\n /// Datacollections\n ///\n\n // datacollectionNew(values) {\n // return new ABDataCollectionCore(values, this);\n // }\n\n datacollectionsExcluded(filter = () => true) {\n return this.AB.datacollections((o) => {\n return this.datacollectionIDs.indexOf(o.id) == -1;\n }).filter(filter);\n }\n\n datacollectionsIncluded(filter = () => true, sort) {\n // by default sort by label\n const sortFn = sort ?? ((a, b) => a.label.localeCompare(b.label));\n return this.AB.datacollections((o) => {\n return this.datacollectionIDs.indexOf(o.id) > -1;\n })\n .filter(filter)\n .sort(sortFn);\n }\n\n ///\n /// Objects\n ///\n\n objectsExcluded(filter = () => true) {\n return this.AB.objects((o) => {\n return this.objectIDs.indexOf(o.id) == -1;\n }).filter(filter);\n }\n\n objectsIncluded(filter = () => true, sort) {\n // by default sort by label\n const sortFn = sort ?? ((a, b) => a.label.localeCompare(b.label));\n return this.AB.objects((o) => {\n return this.objectIDs.indexOf(o.id) > -1;\n })\n .filter(filter)\n .sort(sortFn);\n }\n\n ///\n /// Hints\n ///\n\n hintsExcluded(filter = () => true) {\n return this.AB.hints((h) => {\n return this.hintIDs.indexOf(h.id) == -1;\n }).filter(filter);\n }\n\n hintsIncluded(filter = () => true, sort) {\n // by default sort by label\n const sortFn = sort ?? ((a, b) => a.label.localeCompare(b.label));\n return this.AB.hints((h) => {\n return this.hintIDs.indexOf(h.id) > -1;\n })\n .filter(filter)\n .sort(sortFn);\n }\n\n /**\n * @method connectedObjects()\n *\n * return an array of all the connected ABObjects for a given ABObject.\n *\n * @param {string} id\n * an ID of an ABObject\n * @return {array} array of options for webix select\n * [ {id, value}, ... ]\n */\n connectedObjects(id) {\n console.error(\n \"ABApplicationCore.connectedObjects(): who is calling this?\"\n );\n\n if (id == \"\") return [];\n\n // Determine the object from the ID\n var myObj = this.AB.objectByID(id);\n\n // Get all the connected Fields for that object\n var connectedFields = myObj.connectFields();\n // Store the related fields associatively inside their related Objects ID\n var connectedObj = {};\n connectedFields.forEach((f) => {\n connectedObj[f.settings.linkObject] = this.AB.objectByID(\n f.settings.linkObject\n );\n });\n // Look up the objects by their ID and push them in an options array\n var linkedObjects = [];\n Object.keys(connectedObj).forEach(function (key /*, index */) {\n linkedObjects.push({\n id: this[key].id,\n value: this[key].label,\n });\n }, connectedObj /* = this. inside fn */);\n\n return linkedObjects;\n }\n\n /**\n * @method connectedFields()\n * return an array of all the connected ABFields for a given ABObject\n * @param {string} currObjID\n * an ID of the current ABObject\n * @param {string} linkedObjectID\n * an ID of the linked ABObject\n * @return {array}\n * array of options for webix select\n */\n connectedFields(currObjID, linkedObjectID) {\n console.error(\"!!! Who is calling this?\");\n\n // Determine the object from the currObjID\n var myObj = this.AB.objectByID(currObjID);\n\n // Get all the connected Fields for our object that match the linkedObjectID\n var connectedFields = myObj.connectFields(\n (f) => f.settings.linkObject == linkedObjectID\n );\n // Build an arry of options for the webix select\n var linkedFields = [];\n connectedFields.forEach((f) => {\n linkedFields.push({ id: f.columnName, value: f.label });\n });\n\n return linkedFields;\n }\n\n ///\n /// Pages\n ///\n\n /**\n * @method pages()\n * return an array of all the ABViewPages for this ABApplication.\n * @param {fn} filter\n * a filter fn to return a set of ABViewPages that this fn\n * returns true for.\n * @param {boolean} deep\n * flag to search in sub pages\n * @return {array}\n * array of ABViewPages\n */\n pages(filter = () => true, deep = false) {\n var result = [];\n\n if (!this._pages || this._pages.length < 1) return result;\n\n // find into sub-pages recursively\n if (filter && deep) {\n // function searchDeep(curr) {\n // let resultsCurr = curr._pages.filter(filter);\n\n // for (let p of curr._pages) {\n // let resultsP = searchDeep(p);\n // if (resultsP.length) {\n // resultsCurr = resultsCurr.concat(resultsP);\n // }\n // }\n // // if we get here, end\n // return resultsCurr;\n // }\n\n // result = searchDeep(this);\n result = this._searchDeep(this, \"_pages\", filter);\n }\n // find root pages\n else {\n result = (this._pages || []).filter(filter);\n }\n\n return result;\n }\n\n /**\n * @method _searchDeep()\n * search each node of a tree and return all matches that pass the provided\n * filter.\n * @param {AB*} curr\n * An object that contains a tree structure.\n * @param {string} key\n * The curr[key] reference of the array of items to search\n * @param {function} filter\n * The curr[key].filter(filter) that returns true/false if a node is\n * to be included in the result.\n * @return {array}\n */\n _searchDeep(curr, key, filter) {\n let items = curr[key] ?? [];\n let resultsCurr = items.filter?.(filter) ?? [];\n\n for (let p of items) {\n let resultsP = this._searchDeep(p, key, filter);\n if (resultsP.length) {\n resultsCurr = resultsCurr.concat(resultsP);\n }\n }\n\n return resultsCurr;\n }\n\n ///\n /// Processes\n ///\n\n /**\n * @method processes()\n * return an array of all the ABProcesses for this ABApplication.\n * @param {fn} filter\n * a filter fn to return a set of ABProcesses that\n * this fn returns true for.\n * @return {array}\n * array of ABProcesses\n */\n processes(filter = () => true) {\n return this.AB.processes((p) => {\n return this.processIDs.indexOf(p.id) > -1;\n }).filter(filter);\n }\n\n hasProcess(process) {\n if (process && process.id) {\n return this.processIDs.indexOf(process.id) > -1;\n } else {\n return false;\n }\n }\n\n ///\n /// Views\n ///\n\n /**\n * @method views()\n * return an array of all the Views for this ABApplication.\n * @param {fn} filter\n * a filter fn to return a set of Views that this fn\n * returns true for.\n * @return {array}\n * array of Views\n */\n views(filter) {\n var result = [];\n var views = [];\n var pages = [];\n\n if (\n (!this._pages || this._pages.length < 1) &&\n (!this._views || this._views.length < 1)\n )\n return result;\n\n function lookDeep(view) {\n if (view._pages && view._pages.length) {\n view._pages.forEach((p) => {\n // check the page views recusively\n var pageViews = p.views(filter, true);\n // if there was a match store it\n if (pageViews && pageViews.length > 0) {\n result = pageViews;\n }\n // if no match move on to the subpages\n if (result.length < 1) {\n // loop through each subpage recursively\n var subPages = p.pages(filter, true);\n // if there was a match store it\n if (subPages && subPages.length > 0) {\n result = subPages;\n }\n if (result.length < 1) {\n lookDeep(p);\n }\n }\n });\n }\n }\n\n // look at views recursively\n if (filter) {\n // look at views recursively (views can have subviews and so on)\n if (this._views) {\n views = this._views.filter(filter);\n\n if (views.length < 1) {\n this._views.forEach((v) => {\n var subViews = v.views(filter, true);\n if (subViews && subViews.length > 0) {\n views = subViews;\n }\n });\n }\n }\n\n // if no views of the root page match now look at the sub pages and their views\n if (views.length) {\n result = views;\n } else {\n // check the first level subpages\n result = this._pages.filter(filter);\n\n // if no match check each pages views and subpages\n if (result.length < 1) {\n // looping through pages\n lookDeep(this);\n }\n }\n }\n // find all views\n else {\n // recusively gather all views on this view\n if (this._views) {\n views = this._views;\n if (views.length) {\n views.forEach((v) => {\n var subViews = v.views(() => true, true);\n if (subViews && subViews.length) {\n views = views.concat(subViews);\n }\n });\n }\n }\n\n // recursively gather all pages and their views\n if (this._pages) {\n pages = this._pages;\n if (pages.length) {\n pages.forEach((p) => {\n // grab all views on this page\n var pageViews = p.views(() => true, true);\n if (pageViews && pageViews.length) {\n views = views.concat(pageViews);\n }\n // grab all subpages on this page\n var subPages = p.pages(() => true, true);\n if (subPages && subPages.length) {\n pages = pages.concat(subPages);\n subPages.forEach((sub) => {\n var subViews = sub.views(() => true, true);\n if (subViews && subViews.length) {\n views = views.concat(subViews);\n }\n });\n }\n });\n }\n }\n\n result = result.concat(pages, views);\n }\n\n return result;\n }\n\n /**\n * @method viewAll()\n * return a list of all the {ABViewxxx} classes available.\n * @return {array} of ABView objects\n */\n viewAll(fn = () => true) {\n return this.ViewManager.allViews(fn);\n }\n\n ///\n /// Queries\n ///\n\n /**\n * queriesExcluded()\n * return a list of ABObjectQuery(s) that are not included in this\n * ABApplication.\n * @param {fn} filter\n * a filter fn to further reduce which queries to return.\n * @return {array}\n */\n queriesExcluded(filter = () => true) {\n return this.AB.queries((q) => {\n return this.queryIDs.indexOf(q.id) == -1;\n }).filter(filter);\n }\n\n /**\n * queriesIncluded()\n * return a list of ABObjectQuery(s) that are included in this\n * ABApplication.\n * @param {fn} filter\n * a filter fn to further reduce which queries to return.\n * @param {fn} [sort] function to sort by, default is .label\n * @return {array}\n */\n queriesIncluded(filter = () => true, sort) {\n // by default sort by label\n const sortFn = sort ?? ((a, b) => a.label.localeCompare(b.label));\n return this.AB.queries((q) => {\n return this.queryIDs.indexOf(q.id) > -1;\n })\n .filter(filter)\n .sort(sortFn);\n }\n\n ///\n /// Roles\n ///\n\n /**\n * @method roles()\n * return an array of all the ABRole for this ABApplication.\n * @param {fn} filter\n * a filter fn to further reduce which roles to return.\n * @return {array} array of ABRole\n */\n // roles(filter = () => true) {\n // return (this.role || []).filter(filter);\n // }\n\n /**\n * @method urlResolve()\n * given an object pointer, return the specific object referenced.\n * pointer must start with a '#', use '/' as delimiters, and either\n * reference an object's .id, or an object's .property.\n * for example:\n * #/_objects : resolves to the array of ._objects pointed to by this\n * application.\n * #/_objects/[object.id] : reolved to a specific object\n * #/_objects/[object.id]/_fields/[field.id] : resolves to a specific data field\n * refereced by object.id.\n *\n * @param {string} pointer : the string url referencing the object you want\n * to retrieve.\n * @return {obj}\n */\n urlResolve(pointer) {\n var parts = pointer.split(\"/\");\n\n var parseStep = (obj, steps) => {\n // we're done. obj is what we are looking for:\n if (steps.length == 0) {\n return obj;\n }\n\n // pull the next step key:\n var key = steps.shift();\n\n // special case, \"#\" makes sure we are talking about the\n // Application object\n if (key == \"#\") {\n return parseStep(this, steps);\n }\n\n // if obj is an [], then key should be an .id reference to\n // lookup:\n if (Array.isArray(obj)) {\n obj = obj.filter(function (o) {\n return o.id == key;\n })[0];\n return parseStep(obj, steps);\n }\n\n // otherwise obj should be an {} and key a property:\n if (obj && obj[key]) {\n return parseStep(obj[key], steps);\n }\n\n if (key == \"_objects\") {\n console.error(new Error(\"REFACTOR: old objectBy url reference:\"));\n\n // This can be gotten from our AB\n var id = steps.shift();\n return parseStep(this.AB.objectByID(id), steps);\n }\n\n // if we got here, there is an error!\n // console.error('!!! failed to lookup url:'+pointer);\n console.error(\"!!! failed to lookup url:\" + pointer);\n return null;\n };\n\n return parseStep(this, parts);\n }\n\n /**\n * @method urlPointer()\n * return the url pointer for this application.\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlPointer(acrossApp) {\n // NOTE: if we need to expand this to search across\n // applications, then add in this application.id here:\n if (acrossApp) return \"#/\" + this.id + \"/\";\n else return \"#/\";\n }\n\n /**\n * @method urlObject()\n * return the url pointer for objects in this application.\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlObject(acrossApp) {\n return this.urlPointer(acrossApp) + \"_objects/\";\n }\n\n /**\n * @method urlView()\n * return the url pointer for pages in this application.\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlPage(acrossApp) {\n return this.urlPointer(acrossApp) + \"_pages/\";\n }\n\n /**\n * @method urlQuery()\n * return the url pointer for queries in this application.\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlQuery(acrossApp) {\n return this.urlPointer(acrossApp) + \"_queries/\";\n }\n\n /**\n * @method version()\n * return the current version of this Application.\n * Version information is in format \"{Major}.{Minor}.{patch}\"\n * @return {string}\n */\n get version() {\n return this.json?.versionData?.versionNumber ?? \"0.0.0\";\n }\n\n ///\n /// Object List Settings\n ///\n get objectlistIsOpen() {\n return this.objectListSettings.isOpen;\n }\n\n set objectlistIsOpen(isOpen) {\n this.objectListSettings.isOpen = isOpen;\n }\n\n get objectlistSearchText() {\n return this.objectListSettings.searchText;\n }\n\n set objectlistSearchText(searchText) {\n this.objectListSettings.searchText = searchText;\n }\n\n get objectlistSortDirection() {\n return this.objectListSettings.sortDirection;\n }\n\n set objectlistSortDirection(sortDirection) {\n this.objectListSettings.sortDirection = sortDirection;\n }\n\n get objectlistIsGroup() {\n return this.objectListSettings.isGroup;\n }\n\n set objectlistIsGroup(isGroup) {\n this.objectListSettings.isGroup = isGroup;\n }\n\n ///\n /// Instance generators\n ///\n\n /**\n * @method pageNew()\n *\n * return an instance of a new (unsaved) ABViewPage that is tied to this\n * ABApplication.\n *\n * NOTE: this new page is not included in our this.pages until a .save()\n * is performed on the page.\n *\n * @return {ABViewPage}\n */\n pageNew(values) {\n // make sure this is an ABViewPage description\n // values.key = ABViewPageCore.common().key;\n values.key = \"page\";\n\n return this.ViewManager.newView(values, this, null);\n }\n\n /**\n * @method pageByID()\n * return pages from the given {id}\n * @param {string} id\n * the uuid of the page to return.\n * @param {bool} deep\n * should this search deep (through all our children's children)\n * @return {ABViewPage}\n */\n pageByID(id, deep = true) {\n return this.pages((f) => f.id == id, deep)[0];\n }\n\n /**\n * @method viewNew()\n *\n * return an instance of a new (unsaved) ABView.\n *\n * @return {ABView}\n */\n viewNew(values, application, parent) {\n return this.ViewManager.newView(values, application, parent);\n }\n\n ///\n /// Utilities\n ///\n\n cloneDeep(/* object */) {\n var errorDepreciated = new Error(\n \"ABApplicationCore.cloneDeep(): Depreciated! Use AB.cloneDeep() instead.\"\n );\n throw errorDepreciated;\n\n // return JSON.parse(JSON.stringify(object));\n }\n};\n","/**\n * ABApplicationMobileCore\n *\n * This is the core ABApplicationMobile class that manages the common operations\n * of a Mobile PWA ABApplication.\n */\n\n// webpack can handle 'require()' statements, but node can't handle import\n// so let's use require():\nconst ABViewManagerMobile = require(\"../platform/ABViewManagerMobile\");\nvar ABApplication = require(\"../platform/ABApplication\");\n\nmodule.exports = class ABApplicationMobileCore extends ABApplication {\n constructor(attributes, AB) {\n super(attributes, AB);\n this.appType = \"mobile\"; // Just making sure.\n this.networkType = attributes.networkType;\n\n this.pageDefault = attributes.pageDefault;\n // {uuid}\n // the {ABMobilePage}.uuid of the page that is our default Page.\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n ///\n /// Instance Methods\n ///\n\n get ViewManager() {\n return ABViewManagerMobile;\n }\n\n pageNew(def) {\n console.error(\"TODO: pageNew for ApplicationMobile\");\n return null;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var json = super.toObj();\n json.appType = \"mobile\";\n json.networkType = this.networkType;\n\n json.pageDefault = this.pageDefault;\n\n return json;\n }\n};\n","/*\n * ABDataCollection\n * Defines a set of data that other parts of the Application can work with.\n * it can point to either an ABObject, or ABObjectQuery, and can have an\n * filter, and sorts defined.\n *\n *\n *\n */\n// const ABEmitter = require(\"../platform/ABEmitter\");\nconst ABMLClass = require(\"../platform/ABMLClass\");\n\n// const ABObject = require(\"../platform/ABObject\");\n// const ABObjectQuery = require(\"../platform/ABObjectQuery\");\n// const RowFilter = require(\"../platform/RowFilter\");\n\nvar DefaultValues = {\n id: \"uuid\",\n label: \"\", // label\n object: {}, // json of ABObject\n query: {}, // json of ABObjectQuery\n settings: {\n datasourceID: \"\", // id of ABObject or ABObjectQuery\n linkDatacollectionID: \"\", // id of ABDatacollection\n linkFieldID: \"\", // id of ABField\n followDatacollectionID: \"\", // id of ABDatacollection\n objectWorkspace: {\n filterConditions: {\n // array of filters to apply to the data table\n glue: \"and\",\n rules: [],\n },\n sortFields: [], // array of columns with their sort configurations\n },\n loadAll: false,\n // preventPopulate: false, depreciating in favour of populate\n populate: true, // true/false or array of columns to populate.\n isQuery: false, // if true it is a query, otherwise it is a object.\n\n fixSelect: \"\", // _CurrentUser, _FirstRecord, _FirstRecordDefault or row id\n\n syncType: 1, // 1 (Server), 2 (Client)\n },\n};\n\nconst QueuedOperations = [];\n// {array} of operations that we want to perform but allow some space\n// between operations.\nvar _queueTimer = null;\n\nfunction runQueue() {\n // if (!_queueTimer) {\n // _queueTimer = setInterval(() => {\n // runQueue();\n // }, 20);\n // }\n if (QueuedOperations.length == 0) {\n // stop\n // clearInterval(_queueTimer);\n _queueTimer = null;\n return;\n }\n var op = QueuedOperations.shift();\n op.fn();\n _queueTimer = setTimeout(runQueue, op.timeout);\n}\nfunction queueOperation(fn, timeout = 20) {\n QueuedOperations.push({ fn, timeout });\n if (!_queueTimer) {\n runQueue();\n }\n}\n\n/**\n * @function SearchWhereCond()\n * Recursively search through the where condition and find any\n * rules that match one of the provided rules.\n * If one is found, we call the given callback with that rule.\n * @param {*} cond\n * The current condition to search through. Could be the base\n * glue logic, or an individual rule.\n * @param {array} rules\n * An array of cond.rule values to search for.\n * eg: [\"equals\", \"contains\", \"in_data_collection\"]\n * @param {fn} cb\n * A callback function to call when a matching rule is found.\n */\nfunction SearchWhereCond(cond, rules, cb) {\n if (!cond) return;\n if (cond.rules) {\n cond.rules.forEach((r) => {\n SearchWhereCond(r, rules, cb);\n });\n return;\n }\n if (rules.filter((f) => f == cond.rule).length > 0) {\n cb(cond);\n }\n}\n\nmodule.exports = class ABDataCollectionCore extends ABMLClass {\n constructor(attributes, AB) {\n super([\"label\"], AB);\n\n attributes = attributes || {};\n\n // this.application = application;\n\n this.fromValues(attributes);\n\n this.__dataCollection = this._dataCollectionNew([]);\n // {DataCollection}\n // This is a working instance of a DataCollection, not an {ABDatacCollection}\n // On web/mobile this is a webix component. So keep the creation as part of\n // the platform/ABDataCollection implementation.\n\n // Set filter value\n this.refreshFilterConditions();\n\n this.__bindComponentIds = [];\n this.__flexComponentIds = [];\n\n // refresh a data collection\n // this.init();\n\n // mark data status does not be initialized\n this._dataStatus = this.dataStatusFlag.notInitial;\n\n this.__filterCond = null;\n // {QueryCondition}\n // A passed in Query Condition for filtering our DataCollection.\n // This value is ANDed with our normal filter conditions.\n\n this.__model = null;\n // {ABModel}\n // An instance of the ABModel used for this DataCollection to\n // access data on the server.\n\n this._pendingLoadDataResolves = {\n /* jobID : {pendingResolve } */\n };\n }\n\n /**\n * contextKey()\n *\n * return a unique key that represents data from/for this type of object.\n *\n * used when creating Network jobs and needing to be notified when a job\n * is complete. We send a contextKey() to the Network job and then listen\n * for it to know when it is complete.\n * @return {string}\n */\n static contextKey() {\n return \"datacollection\";\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n this.id = values.id;\n // {string} .id\n // the uuid of this ABDataCollection Definition.\n\n this.name = values.name || null;\n // {string} .name\n // the unchanging name of this ABDataCollection\n\n this.type = values.type || \"datacollection\";\n // {string} .type\n // the type of ABDefinition this is.\n\n values.settings = values.settings || {};\n this.settings = this.settings || {};\n // {obj} .settings\n // the specific operation values for this ABDataCollection\n\n this.settings.linkDatacollectionID =\n values.settings.linkDatacollectionID ||\n DefaultValues.settings.linkDatacollectionID;\n // {string} .settings.linkDatacollectionID\n // the uuid of another ABDataCollection that provides the link/trigger\n // for filtering the values of this ABDataCollection.\n\n this.settings.linkFieldID =\n values.settings.linkFieldID || DefaultValues.settings.linkFieldID;\n // {string} .settings.linkFieldID\n // this.fieldLink is intended to be the way to connect to the column in\n // the datacollectionLink that we are following. However this field\n // is the field in this.datasource that connects to the field in\n // datacollectionLink that has the value we are linked to.\n // So, If this DC(ObjB), and our datacollectionLink (ObjA)\n // then this.fieldLink = ObjB->FieldB\n // To find the corresponding field in ObjA, we do:\n // this.fieldLink.fieldLink (ObjA->FieldA)\n\n this.settings.followDatacollectionID =\n values.settings.followDatacollectionID ||\n DefaultValues.settings.followDatacollectionID;\n // {string} .settings.followDatacollectionID\n // the uuid of another ABDataCollection that provides the follow cursor data collection\n\n this.settings.objectWorkspace = values.settings.objectWorkspace || {\n filterConditions:\n DefaultValues.settings.objectWorkspace.filterConditions,\n sortFields: DefaultValues.settings.objectWorkspace.sortFields,\n };\n // {obj} .settings.objectWorkspace\n // the default settings for what is shown in the AppBuilder's\n // DataCollection workspace\n\n this.settings.fixSelect = values.settings.fixSelect;\n\n // Convert to boolean\n this.settings.loadAll = JSON.parse(\n values.settings.loadAll || DefaultValues.settings.loadAll\n );\n // {bool} .settings.loadAll\n // do we load all the data at one time? false == load by pages.\n\n this.settings.isQuery = JSON.parse(\n values.settings.isQuery || DefaultValues.settings.isQuery\n );\n // {bool} .settings.isQuery\n // is the data source for this ABDataCollection based upon an\n // ABObjectQuery?\n\n this.settings.populate = (() => {\n // First check .populate\n if (values.settings.populate != undefined) {\n return values.settings.populate;\n // Then check legacy .preventPopulate\n } else if (\n values.settings.preventPopulate == true ||\n values.settings.preventPopulate == \"1\"\n ) {\n return false;\n } else return DefaultValues.settings.populate;\n })();\n // {bool | array} populate\n // Control whcih related connections to populate. Default, true, populates\n // all connections. False loads no connnections. Also accepts an array of\n // column names to load specefic connections.\n\n // Convert to number\n this.settings.syncType = parseInt(\n values.settings.syncType || DefaultValues.settings.syncType\n );\n // {int} .settings.syncType\n // how is the data between this ABDataCollection and it's\n // .datasource synced?\n\n // Skip CSV packing\n this.settings.skipPack = values?.settings?.skipPack ?? false;\n\n // Selected fields\n this.settings.select = values?.settings?.select ?? null;\n\n this.__datasource = null;\n // {obj} .__datasource\n // the reference to the ABObject/ABObjectQuery that this ABDataCollection\n // is based off of.\n\n this.settings.datasourceID =\n values.settings.datasourceID || DefaultValues.settings.datasourceID;\n // {string} .settings.datasourceID\n // the uuid of the .__datasource object to use\n\n // now lookup and reference the proper datasource\n if (this.settings.datasourceID) {\n // check for an ABObject\n var obj = this.AB.objectByID(this.settings.datasourceID);\n if (!obj) {\n // this must be an ABObjectQuery then ...\n obj = this.AB.queryByID(this.settings.datasourceID);\n }\n\n if (obj) {\n this.__datasource = obj;\n this.settings.isQuery = obj.type === \"query\";\n if (this.settings.isQuery) {\n if (this.__datasource.isGroup) {\n if (!this.__treeCollection)\n this.__treeCollection = this._treeCollectionNew();\n // {TreeCollection}\n // This is a webix TreeCollection (or similar)\n // keep it's implementation as part of the platform\n\n this.__isGroup = true;\n }\n }\n } else {\n console.error(\n `ABDataCollection[${this.name}][${this.id}] unable to find datasource [${this.settings.datasourceID}]`\n );\n }\n }\n\n // // Populate data source: ABObject or ABObjectQuery\n // if (values.query && values.query[0]) {\n // this.__datasource = new ABObjectQuery(\n // values.query[0],\n // this.application\n // );\n // this.settings.isQuery = true;\n\n // if (this.__datasource.isGroup) {\n // if (!this.__treeCollection)\n // this.__treeCollection = this._treeCollectionNew();\n\n // this.__isGroup = true;\n // }\n // } else if (values.object && values.object[0]) {\n // this.__datasource = new ABObject(values.object[0], this.application);\n // this.settings.isQuery = false;\n // }\n\n // let the MLClass now process the translations:\n super.fromValues(values);\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var obj = super.toObj(); // untranslate the object\n\n return {\n id: this.id,\n name: this.name || this.label,\n type: this.type || \"datacollection\",\n settings: this.AB.cloneDeep(this.settings || {}),\n translations: obj.translations,\n };\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABDatacollection with it's parent\n *\n *\n * @return {Promise}\n * .resolve( {this} )\n */\n async save() {\n if (!this.id) {\n this.label = this.label || this.name;\n }\n await super.save();\n return this;\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABDatacollection\n *\n * also remove it from our parent application\n *\n * @return {Promise}\n */\n destroy() {\n var removeFromApplications = () => {\n return new Promise((next, err) => {\n // this.AB.applications().then((apps) => {\n\n const apps = this.AB.applications();\n // NOTE: apps is a webix datacollection\n\n var allRemoves = [];\n\n var appsWithObject = apps.filter((a) => {\n return a.datacollectionsIncluded((o) => o.id == this.id);\n });\n appsWithObject.forEach((app) => {\n allRemoves.push(app.datacollectionRemove(this));\n });\n\n return Promise.all(allRemoves).then(next).catch(err);\n // });\n });\n };\n\n return Promise.resolve()\n .then(() => {\n return removeFromApplications();\n })\n .then(() => {\n return super.destroy();\n })\n .then(() => {\n this.emit(\"destroyed\");\n });\n }\n\n /**\n * @property $dc\n * return the underlying webix datacollection\n * @return {webix.datacollection}\n */\n get $dc() {\n return this.__dataCollection;\n }\n\n /**\n * @property datasource\n * return a object of this component.\n *\n * @return {ABObject|ABObjectQuery}\n */\n get datasource() {\n if (!this.__datasource) {\n if (this.id && this.name) {\n // occassionally we have blank DCs (without .id or .name)\n // and I don't want to see errors for those\n var err = new Error(\n `DataCollection[${this.name}][${this.id}] missing reference datasource`\n );\n this.AB.notify(\"builder\", err, { datacollection: this.toObj() });\n }\n return null;\n }\n var obj = this.AB.objectByID(this.__datasource.id);\n if (!obj) {\n obj = this.AB.queryByID(this.__datasource.id);\n }\n return obj;\n }\n\n /**\n * @property datasource\n * set a object to data collection\n *\n * @param {ABObject|ABObjectQuery} object\n */\n set datasource(object) {\n this.__datasource = object;\n\n this.refreshFilterConditions();\n }\n\n /**\n * @property sourceType\n * return type of source.\n *\n * @return {string} - 'object' or 'query'\n */\n get sourceType() {\n return this.settings.isQuery ? \"query\" : \"object\";\n }\n\n /**\n * @method datacollectionLink\n * return a ABDatacollection that link of this.\n *\n * @return {ABDatacollection}\n */\n get datacollectionLink() {\n if (!this.AB) return null;\n\n return this.AB.datacollectionByID(this.settings.linkDatacollectionID);\n }\n\n /**\n * @property fieldLink\n * return a ABFieldConnect field that link of this.\n *\n * @return {ABFieldConnect}\n */\n get fieldLink() {\n let object = this.datasource;\n if (!object) return null;\n\n return object.fieldByID(this.settings.linkFieldID);\n }\n\n /**\n * @property model\n * return a source model\n *\n * @return ABModel\n */\n get model() {\n if (!this.__model) {\n let object = this.datasource; // already notified\n\n this.__model = object ? object.model() : null;\n }\n return this.__model;\n }\n\n get dataStatusFlag() {\n return {\n notInitial: 0,\n initializing: 1,\n initialized: 2,\n };\n }\n\n get dataStatus() {\n return this._dataStatus;\n }\n\n get isDataInitialized() {\n return this.dataStatus == this.dataStatusFlag.initialized;\n }\n\n dataInitialized() {\n this._dataStatus = this.dataStatusFlag.initialized;\n }\n\n ///\n /// Cursor\n ///\n\n setCursor(itemId) {\n // If the static cursor is set, then this DC could not set cursor to other rows\n if (\n this.settings.fixSelect &&\n (this.settings.fixSelect != \"_FirstRecordDefault\" ||\n this.settings.fixSelect == itemId)\n )\n return;\n\n if (this.__treeCollection) {\n // set cursor of tree collection\n this.setCursorTree(itemId);\n\n // pull current row id\n let currTreeId = this.__treeCollection.getCursor();\n if (currTreeId) {\n let currTreeItem = this.__treeCollection.getItem(currTreeId);\n if (currTreeItem) itemId = currTreeItem._itemId;\n }\n }\n\n let dc = this.__dataCollection;\n if (dc) {\n // Store the old cursor id\n this.__previousCursorId = dc.getCursor();\n\n // clear cursor\n if (itemId == null) {\n dc.setCursor(null);\n }\n // If set rowId equal current cursor, it will not trigger .onAfterCursorChange event\n else if (dc.getCursor() == itemId) {\n this.emit(\"changeCursor\", this.getCursor());\n }\n // set new cursor\n else if (dc.exists(itemId)) {\n dc.setCursor(itemId);\n }\n }\n }\n\n /**\n *\n * @param {string|number} itemId - Id of item or Id of row data\n */\n setCursorTree(itemId) {\n let tc = this.__treeCollection;\n if (tc && tc.getCursor() != itemId) {\n // If it is id of tree collection, then find row id of data\n let treeCursor = tc.find({ id: itemId }, true);\n if (treeCursor) {\n tc.setCursor(itemId);\n }\n // If it is not id of tree collection, then find/set root of data\n else {\n let treeItem = tc.find({ _itemId: itemId, $parent: 0 }, true);\n if (treeItem) tc.setCursor(treeItem.id);\n else tc.setCursor(null);\n }\n }\n }\n\n getCursor(treeCursor = false) {\n // Cursor of tree collection\n if (treeCursor && this.__treeCollection) {\n let currId = this.__treeCollection.getCursor();\n if (currId) {\n let currItem = this.__treeCollection.getItem(currId);\n\n // filter current id for serialize\n this.__treeCollection.filter(\n (item) => item._itemId == currItem._itemId\n );\n\n // pull item with child items\n let currItemAndChilds =\n this.__treeCollection.serialize()[0] || null;\n\n // refresh filter\n this.refreshLinkCursor();\n\n return currItemAndChilds;\n }\n }\n\n let dc = this.__dataCollection;\n if (dc == null) return null;\n\n let currId = dc.getCursor();\n let currItem = dc.getItem(currId);\n\n return currItem;\n }\n\n getFirstRecord() {\n var dc = this.__dataCollection;\n if (dc == null) return null;\n\n var currId = dc.getFirstId();\n var currItem = dc.getItem(currId);\n\n return currItem;\n }\n\n getNextRecord(record) {\n var dc = this.__dataCollection;\n if (dc == null) return null;\n\n var currId = dc.getNextId(record.id);\n var currItem = dc.getItem(currId);\n\n return currItem;\n }\n\n /**\n * @method refreshLinkCursor\n * If the data collection is bound to another and it is the child connection\n * it finds it's parents current set cursor and then filters its data\n * based off of the cursor.\n *\n * In cases where a DC has set .loadAll, our job is to filter existing data\n * that is already loaded in the internal __dataCollection.\n *\n * Otherwise this is not the place to trigger a data refresh. We depend\n * on other mechanisms (.reloadData(), datacollection .select()) to trigger\n * an update.\n */\n refreshLinkCursor(force = false) {\n // our filter conditions need to know there was an updated cursor.\n // some of our filters are based upon our linked data.\n this.refreshFilterConditions();\n\n // NOTE: If DC does not set load all data, then it does not need to filter by the parent DC.\n // because it fetch data when the cursor of the parent DC changes.\n if (!this.settings.loadAll && !force) return;\n\n // do not set the filter unless this dc is initialized \"dataStatusFlag==2\"\n // if (this.dataStatus != this.dataStatusFlag.initialized) return;\n\n // filter the data in the data collection\n // using its parents current cursor because all the data in this child\n // data collection has been loaded and the frontend can decide what is\n // seen or not seen\n let linkCursor;\n let dvLink = this.datacollectionLink;\n if (dvLink) {\n linkCursor = dvLink.getCursor();\n }\n\n let filterData = (rowData) => {\n // This row is not loaded yet. It will be loaded when scrolling.\n if (rowData == null) return true;\n\n // if link dc cursor is null:\n // ... if there's no parent show all data\n // ... if we have a parent hide all data - address cases where user see\n // unexpected data (ns_app#318) - should this be a DC setting?\n if (!linkCursor) return dvLink ? false : true;\n else return this.isParentFilterValid(rowData);\n };\n\n if (this.__dataCollection) this.__dataCollection.filter(filterData);\n if (this.__treeCollection) this.__treeCollection.filter(filterData);\n }\n\n setStaticCursor() {\n if (this.settings.fixSelect) {\n // set cursor to the current user\n if (this.settings.fixSelect == \"_CurrentUser\") {\n var username = this.currentUserUsername();\n var userFields = this.datasource.fields((f) => f.key == \"user\");\n\n // find a row that contains the current user\n var row = this.__dataCollection.find((r) => {\n var found = false;\n\n userFields.forEach((f) => {\n if (found || r[f.columnName] == null) return;\n\n if (r[f.columnName].filter) {\n // Array - isMultiple\n found =\n r[f.columnName].filter((data) => data.id == username)\n .length > 0;\n } else if (r[f.columnName] == username) {\n found = true;\n }\n });\n\n return found;\n }, true);\n\n // set a first row of current user to cursor\n if (row) {\n this.__dataCollection.setCursor(row.id);\n\n this.setCursorTree(row.id);\n }\n } else if (\n this.settings.fixSelect == \"_FirstRecord\" ||\n this.settings.fixSelect == \"_FirstRecordDefault\"\n ) {\n // // find a row that contains the current user\n // var row = this.__dataCollection.find((r) => {\n\n // var found = false;\n // if (!found) {\n // found = true;\n // return true; // just give us the first record\n // }\n\n // }, true);\n\n // // set a first row of current user to cursor\n // if (row)\n // this.__dataCollection.setCursor(row.id);\n\n let currRowId = this.__dataCollection.getCursor();\n if (\n !currRowId ||\n (currRowId && !this.__dataCollection.exists(currRowId))\n ) {\n // If current cursor is filtered by parent DC, then select new cursor\n\n // set a first row to cursor\n let rowId = this.__dataCollection.getFirstId();\n // if (rowId) {\n this.__dataCollection.setCursor(rowId || null);\n\n // NOTE: differnece between ab_platform_web and ab_platform_pwa\n if (\n this.__dataCollection.data?.count?.() == 0 ||\n this.__dataCollection.data?.length == 0\n ) {\n this.emit(\"collectionEmpty\", {});\n }\n\n this.setCursorTree(rowId);\n // }\n }\n } else {\n this.__dataCollection.setCursor(this.settings.fixSelect);\n\n this.setCursorTree(this.settings.fixSelect);\n }\n }\n\n // Set the cursor to the first row\n if (this.isCursorFollow) {\n const rowId = this.__dataCollection.getFirstId();\n this.setCursor(rowId || null);\n this.setCursorTree(rowId || null);\n\n // If no data but the parent DC set cursor, then this should be reload data.\n const dcFollow = this.datacollectionFollow;\n if (!rowId && dcFollow?.getCursor()) {\n this.loadData();\n }\n }\n }\n\n ///\n /// Data\n ///\n\n /**\n * @method filterCondition()\n * Provide a temporary filter condition to modify the data we are returning.\n * Used by User search criterias.\n * @param {json} cond\n * A valid QueryCondition to filter the response.\n */\n filterCondition(cond = null) {\n this.__filterCond = cond;\n }\n\n init() {\n // prevent initialize many times\n if (this.initialized) return;\n this.initialized = true;\n\n if (!this.__dataCollection.___AD.onAfterCursorChange) {\n this.__dataCollection.___AD.onAfterCursorChange =\n this.__dataCollection.attachEvent(\"onAfterCursorChange\", () => {\n // debugger;\n var currData = this.getCursor();\n\n this.emit(\"changeCursor\", currData);\n });\n }\n\n // relate data functions\n let isRelated = (relateData, rowId, PK = \"id\") => {\n if (Array.isArray(relateData)) {\n return relateData.filter((v) => (v[PK] || v) == rowId).length > 0;\n } else {\n return relateData && (relateData[PK] || relateData) == rowId;\n }\n };\n\n // events\n this.on(\"ab.datacollection.create\", (data) => {\n // NOTE: UPDATing this process to add another check.\n // .isCursorFollow only invalidates the 1st half of the routine.\n // .isCursorFollow STILL needs to follow the 2nd half of the routine\n // // If this DC is following cursor for other DC, then it should not add the new item to their list.\n // if (this.isCursorFollow) return;\n\n let obj = this.datasource;\n if (!obj) return;\n\n if (!data || !data.data) return;\n\n let needAdd = false;\n let updatedVals = [];\n\n // Don't do First Step if .isCursorFollow\n if (!this.isCursorFollow) {\n // First Step\n // Does this new entry need to be part of the data we are currently\n // tracking? If so, add it.\n Promise.resolve()\n .then(() => {\n return new Promise((next, bad) => {\n // Query\n if (obj instanceof this.AB.Class.ABObjectQuery) {\n let objList =\n obj.objects((o) => o.id == data.objectId) || [];\n\n needAdd = objList.length > 0;\n\n if (!needAdd) return next();\n\n let where = {\n glue: \"or\",\n rules: [],\n };\n\n objList.forEach((o) => {\n let newDataId = data.data[`${o.PK()}`];\n if (!newDataId) return;\n\n where.rules.push({\n key: `${\n o.alias || obj.objectAlias(o.id)\n }.${o.PK()}`,\n rule: \"equals\",\n value: newDataId,\n });\n });\n\n obj.model()\n .findAll({\n where: where,\n })\n .then((newQueryData) => {\n updatedVals = newQueryData.data || [];\n updatedVals.forEach((v) => {\n delete v.id;\n });\n\n next();\n })\n .catch(bad);\n }\n // Object\n else {\n needAdd = obj.id == data.objectId;\n updatedVals = [data.data];\n next();\n }\n });\n })\n .then(() => {\n if (needAdd) {\n (updatedVals || []).forEach((updatedV) => {\n // If this DC uses a query, it pulls refreshed data from the server in the previous step,\n // so there is no need to recheck the query's filter.\n const skipDatasourceFilter =\n obj instanceof this.AB.Class.ABObjectQuery;\n\n // filter condition before add\n if (!this.isValidData(updatedV, skipDatasourceFilter))\n return;\n\n // filter the cursor of parent DC\n const dcLink = this.datacollectionLink;\n if (dcLink && !this.isParentFilterValid(updatedV))\n return;\n\n // check to see if item already exisits in data collection\n // and check to see that we are not loading the data serverside from cursor\n if (\n !this.__dataCollection.exists(\n updatedV[`${obj.PK()}`]\n ) &&\n !this.__reloadWheres\n ) {\n this.__dataCollection.add(updatedV, 0);\n this.emit(\"create\", updatedV);\n // this.__dataCollection.setCursor(rowData.id);\n } else if (\n !this.__dataCollection.exists(\n updatedV[`${obj.PK()}`]\n ) &&\n this.__reloadWheres\n ) {\n // debugger;\n if (this.isParentFilterValid(updatedV)) {\n // we track bound components and flexlayout components\n var attachedComponents =\n this.__bindComponentIds.concat(\n this.__flexComponentIds\n );\n attachedComponents.forEach((bcids) => {\n // if the reload button already exisits move on\n if ($$(bcids + \"_reloadView\")) {\n return false;\n }\n\n // find the position of the data view\n var pos = 0;\n var parent = $$(bcids).getParentView();\n if ($$(bcids).getParentView().index) {\n pos = $$(bcids)\n .getParentView()\n .index($$(bcids));\n } else if (\n $$(bcids).getParentView().getParentView()\n .index\n ) {\n // this is a data view and it is inside a\n // scroll view that is inside an accodion\n // so we need to go deeper to add the button\n parent = $$(bcids)\n .getParentView()\n .getParentView();\n pos = $$(bcids)\n .getParentView()\n .getParentView()\n .index($$(bcids).getParentView());\n }\n\n // store the datacollection so we can pass it to the button later\n var DC = this;\n // add a button that reloads the view when clicked\n if (parent.addView) {\n var L = this.AB.Label();\n parent.addView(\n {\n id: bcids + \"_reloadView\",\n view: \"button\",\n value: L(\n \"New data available. Click to reload.\"\n ),\n css: \"webix_primary webix_warn\",\n click: function (id, event) {\n DC.reloadData();\n $$(id)\n .getParentView()\n .removeView(id);\n },\n },\n pos\n );\n }\n });\n // this.emit(\"create\", updatedV);\n }\n }\n });\n\n if (\n this.__treeCollection // && this.__treeCollection.exists(updatedVals.id)\n ) {\n this.parseTreeCollection({\n data: updatedVals,\n });\n }\n }\n\n // ABObject only\n if (!(obj instanceof this.AB.Class.ABObjectQuery)) {\n // if it is a linked object\n let connectedFields = this.datasource.connectFields(\n (f) =>\n f.datasourceLink &&\n f.datasourceLink.id == data.objectId\n );\n\n // It should always be only one item for ABObject\n updatedVals = updatedVals[0];\n\n // update relation data\n if (\n updatedVals &&\n connectedFields &&\n connectedFields.length > 0\n ) {\n // various PK name\n let PK = connectedFields[0].object.PK();\n if (!updatedVals.id && PK != \"id\")\n updatedVals.id = updatedVals[PK];\n\n this.__dataCollection.find({}).forEach((d) => {\n let updateItemData = {};\n\n connectedFields.forEach((f) => {\n var updateRelateVal = {};\n if (f && f.fieldLink) {\n updateRelateVal =\n updatedVals[f.fieldLink.relationName()] ||\n {};\n }\n\n let rowRelateVal = d[f.relationName()] || {};\n\n let valIsRelated = isRelated(\n updateRelateVal,\n d.id,\n PK\n );\n\n // Relate data\n if (\n Array.isArray(rowRelateVal) &&\n rowRelateVal.filter(\n (v) =>\n v == updatedVals.id ||\n v.id == updatedVals.id ||\n v[PK] == updatedVals.id\n ).length < 1 &&\n valIsRelated\n ) {\n rowRelateVal.push(updatedVals);\n\n updateItemData[f.relationName()] =\n rowRelateVal;\n updateItemData[f.columnName] = updateItemData[\n f.relationName()\n ].map((v) => v.id || v[PK] || v);\n } else if (\n !Array.isArray(rowRelateVal) &&\n (rowRelateVal != updatedVals.id ||\n rowRelateVal.id != updatedVals.id ||\n rowRelateVal[PK] != updatedVals.id) &&\n valIsRelated\n ) {\n updateItemData[f.relationName()] = updatedVals;\n updateItemData[f.columnName] =\n updatedVals.id || updatedVals;\n }\n });\n\n // If this item needs to update\n if (Object.keys(updateItemData).length > 0) {\n this.__dataCollection.updateItem(\n d.id,\n updateItemData\n );\n\n if (this.__treeCollection)\n this.__treeCollection.updateItem(\n d.id,\n updateItemData\n );\n\n this.emit(\n \"update\",\n this.__dataCollection.getItem(d.id)\n );\n }\n });\n }\n }\n\n this.updateRelationalDataFromLinkDC(data.objectId, data.data);\n // filter link data collection's cursor\n this.refreshLinkCursor();\n this.setStaticCursor();\n });\n }\n\n // SECOND Step:\n // Try to detect if this newly created entry connects to one of the\n // values this DC is currently managing. If so, than add this value\n // to the connection.\n\n let incomingObj = this.AB.objectByID(data.objectId);\n if (!incomingObj) return;\n\n // find any of incomingObj connections that are tied to my object:\n let connectedFields = incomingObj\n .connectFields((f) => f.datasourceLink?.id == obj.id)\n .filter((f) => f); // <-- safety check, no undefined or nulls\n if (connectedFields.length == 0) return;\n\n let iPK = incomingObj.PK();\n let PK = obj.PK();\n let newData = this.AB.cloneDeep(data.data);\n\n let currCursor = this.getCursor();\n let needsRefresh = false;\n\n connectedFields.forEach((f) => {\n // pull the values in this connected fields\n let values = data.data[f.columnName]; // just need the PK\n\n if (!Array.isArray(values))\n values = [values].filter((v) => !this.AB.isNil(v));\n\n values.forEach((v) => {\n v = v[PK] || v; // just in case this was an {} and not the {uuid}\n\n // if this is one of the items we are managing\n if (this.__dataCollection.exists(v)) {\n let localField = f.fieldLink;\n if (localField) {\n let row = this.__dataCollection.getItem(v);\n let colName = localField.columnName;\n let relName = localField.relationName();\n\n if (localField.linkType() == \"many\") {\n if (!Array.isArray(row[colName])) {\n row[colName] = [row[colName]].filter(\n (r) => !this.AB.isNil(r)\n );\n }\n // if it isn't already in the array, add it\n let rval = localField.getRelationValue(newData);\n if (row[colName].indexOf(rval) == -1) {\n row[colName].push(rval);\n }\n\n if (!Array.isArray(row[relName])) {\n row[relName] = [row[relName]].filter(\n (r) => !this.AB.isNil(r)\n );\n }\n if (\n row[relName].filter((r) => r[iPK] == newData[iPK])\n .length == 0\n ) {\n row[relName].push(newData);\n }\n } else {\n row[colName] = localField.getRelationValue(newData);\n row[relName] = newData;\n }\n\n // pass updated data back into DC:\n this.__dataCollection.updateItem(v, row);\n\n if (this.__treeCollection)\n this.__treeCollection.updateItem(v, row);\n\n this.emit(\"update\", this.__dataCollection.getItem(v));\n\n // if we just updated our Current Cursor, we need to\n // let our connected DC's know to refresh.\n if (currCursor?.id == v) {\n needsRefresh = true;\n }\n }\n }\n });\n });\n\n if (needsRefresh) {\n this.emit(\"cursorStale\", null);\n }\n });\n\n this.on(\"ab.datacollection.connection-added\", (data) => {\n // This event notifies us of a specific relation being created between\n // two records. In this case the source object that was originally\n // operated on, is sent along in data.data.\n //\n // eg: if this was a `create` operation, the newly created value is\n // included in data.data.\n // eg: if this was an `update` operation, the row that was modified\n // is included.\n //\n // {json} data\n // incoming socket payload:\n // data.objectID {string}\n // the ABObject this connection is being added to\n // data.fieldID {string}\n // which connect Field in this ABObject the value is added to\n // data.rowID {string}\n // which specific row/entry this is being added to\n // data.data {json}\n // The value being added.\n //\n\n let obj = this.datasource;\n if (!obj) return;\n\n if (!data.rowID) return;\n\n // ABObject only\n if (!(obj instanceof this.AB.Class.ABObjectQuery)) {\n // if this is the object we are managing\n if (obj.id === data.objectID) {\n let field = obj.fieldByID(data.fieldID);\n if (field) {\n // figure out if we actually have the value that was changed:\n let isExists = this.__dataCollection.exists(data.rowID);\n if (isExists) {\n let newData = this.AB.cloneDeep(data.data);\n let row = this.__dataCollection.getItem(data.rowID);\n\n let colName = field.columnName;\n let relName = field.relationName();\n\n if (field.linkType() == \"many\") {\n if (!Array.isArray(row[colName])) {\n // in case row[col]:{obj} this will make sure it\n // is included as an [ {obj} ], but will also prevent\n // [ undefined ] if row[col] isn't set:\n row[colName] = [row[colName]].filter(\n (r) => !this.AB.isNil(r)\n );\n }\n row[colName].push(field.getRelationValue(newData));\n\n if (!Array.isArray(row[relName])) {\n row[relName] = [row[relName]].filter(\n (r) => !this.AB.isNil(r)\n );\n }\n row[relName].push(newData);\n } else {\n row[colName] = field.getRelationValue(newData);\n row[relName] = newData;\n }\n\n // pass updated data back into DC:\n this.__dataCollection.updateItem(data.rowID, row);\n\n if (this.__treeCollection)\n this.__treeCollection.updateItem(data.rowID, row);\n\n this.emit(\n \"update\",\n this.__dataCollection.getItem(data.rowID)\n );\n }\n }\n }\n } else if (obj instanceof this.AB.Class.ABObjectQuery) {\n // ABQuery\n\n // NOTE: that in this case, if this change is about one of the\n // objects we track, we will most likely have to reload the data\n // to make sure we are displaying proper data.\n\n // This will follow the same logic as in \"ab.datacollection.create\"\n // so instead of repeating that here, let's call our \"create\"\n // handler instead:\n\n ///// LEFT OFF HERE:\n // need to pull out the data in data.data that represents the\n // connection to data.objectId\n\n //// WAIT!!!!!!\n //// Instead, of this \"connection-added\", lets add the logic in\n //// a \"created\" handler to detect if we should add the new entry\n //// into A value we currently track.\n //// ===> This way we only have to send out \"Created\" messages\n ////\n\n let newPacket = {\n objectId: data.objectId,\n data: this.AB.cloneDeep(data.data),\n };\n this.emit(\"ab.datacollection.create\", newPacket);\n }\n });\n\n this.on(\"ab.datacollection.update\", (data) => {\n // {json} data\n // incoming socket payload:\n // data.objectId {string} uuid of the ABObject's row that was updated\n // data.data {json} the new updated value of that row entry.\n\n let obj = this.datasource;\n if (!obj) return;\n\n // updated values\n let values = data.data;\n if (!values) return;\n\n // #Johnny: removing this check. A DC that is following another cursor\n // still has a value that might need updating.\n // DC who is following cursor should update only current cursor.\n // if (\n // this.isCursorFollow &&\n // this.getCursor()?.id != (values[obj.PK()] ?? values.id)\n // ) {\n // return;\n // }\n\n let needUpdate = false;\n let skipDatasourceFilter = false;\n let isExists = false;\n let updatedIds = [];\n // {array}\n // an array of the row indexs in our DataCollection that have values\n // that need to be updated.\n\n let updatedTreeIds = [];\n let updatedVals = {};\n\n //\n // Case 1: This DC contains the value that was updated\n // In this case, we want to replace our current entry with\n // the new one passed in.\n // EX: This is a DC of Users, and the incoming Entry is a User\n // that we are already displaying.\n //\n\n // Query\n if (obj instanceof this.AB.Class.ABObjectQuery) {\n let objList = obj.objects((o) => o.id == data.objectId) || [];\n needUpdate = objList.length > 0;\n if (needUpdate) {\n // NOTE: Data needs to be updated in the query even if it doesn't match the filter conditions.\n skipDatasourceFilter =\n obj instanceof this.AB.Class.ABObjectQuery;\n\n (objList || []).forEach((o) => {\n updatedIds = updatedIds.concat(\n this.__dataCollection\n .find((item) => {\n return (\n item[\n `${this.datasource.objectAlias(\n o.id\n )}.${o.PK()}`\n ] == (values[o.PK()] || values.id)\n );\n })\n .map((o) => o.id) || []\n );\n\n // grouped queries\n if (this.__treeCollection) {\n updatedTreeIds = updatedTreeIds.concat(\n this.__treeCollection\n .find((item) => {\n return (\n item[\n `${this.datasource.objectAlias(\n o.id\n )}.${o.PK()}`\n ] == (values[o.PK()] || values.id)\n );\n })\n .map((o) => o.id) || []\n );\n }\n });\n\n isExists = updatedIds.length > 0;\n\n updatedVals = this._queryUpdateData(objList, values);\n }\n }\n // Object\n else {\n needUpdate = obj.id == data.objectId;\n if (needUpdate) {\n // various PK name\n if (!values.id && obj.PK() != \"id\") values.id = values[obj.PK()];\n\n updatedIds.push(values.id);\n\n isExists = this.__dataCollection.exists(values.id);\n updatedVals = values;\n }\n }\n\n // if it is the source object\n if (needUpdate) {\n if (isExists) {\n if (this.isValidData(updatedVals, skipDatasourceFilter)) {\n // only spread around cloned copies because some objects (I'm\n // looking at you ABFieldUser) will modify some data for local\n // usage.\n updatedVals = this.AB.cloneDeep(updatedVals);\n if (this.__dataCollection) {\n updatedIds = this.AB.uniq(updatedIds);\n updatedIds.forEach((itemId) => {\n this.__dataCollection.updateItem(itemId, updatedVals);\n });\n }\n\n if (this.__treeCollection) {\n // update data in tree\n updatedTreeIds = this.AB.uniq(updatedTreeIds);\n updatedTreeIds.forEach((itemId) => {\n this.__treeCollection.updateItem(itemId, updatedVals);\n });\n }\n\n this.emit(\"update\", updatedVals);\n\n // If the update item is current cursor, then should tell components to update.\n let currData = this.getCursor();\n if (currData?.id == updatedVals.id) {\n this.emit(\"cursorStale\", currData);\n }\n } else {\n // Johnny: Here we are simply removing the DataCollection Entries that are\n // no longer valid.\n // Just cycle through the collected updatedIds and remove them.\n let currData = this.getCursor();\n updatedIds.forEach((id) => {\n // If the item is current cursor, then the current cursor should be cleared.\n\n if (currData?.id == id) this.emit(\"cursorStale\", null);\n\n this.__dataCollection.remove(id);\n\n // NOTE: Preserve the current cursor after item removal.\n // Webix v.10.1 automatically clears the cursor when an item is removed from the collection.\n if (currData && currData.id != id) {\n this.__dataCollection.setCursor(currData.id);\n }\n\n // TODO: update tree list\n // if (this.__treeCollection) {\n // this.__treeCollection.remove(id);\n // }\n\n this.emit(\"delete\", id);\n });\n }\n }\n // filter before add new record\n else if (this.isValidData(updatedVals)) {\n // OK we have a value, that COULD be in our DC\n // before we add it, let's make sure we are not limited in our selection of items:\n if (!this.isCursorFollow && !this.settings.fixSelect) {\n // this means the updated record was not loaded yet so we are adding it to the top of the grid\n // the placement will probably change on the next load of the data\n this.__dataCollection.add(updatedVals, 0);\n\n if (this.__treeCollection)\n this.parseTreeCollection({\n data: [updatedVals],\n });\n\n this.emit(\"create\", updatedVals);\n }\n }\n }\n\n //\n // Case 2: This DC has entries that CONNECT to the updated value.\n // We need to make sure our connections, properly reflect the\n // current state of the incoming data.\n //\n // EG: This DC is a list of Roles that connect to User, and an updated\n // User is passed in.\n\n let currCursor = this.getCursor();\n let updateCursor = null;\n\n // if it is a linked object\n // look for connected fields that link to the incoming objectId\n let connectedFields = obj.connectFields(\n (f) => f.datasourceLink && f.datasourceLink.id == data.objectId\n );\n\n // update relation data\n if (\n obj instanceof this.AB.Class.ABObject &&\n connectedFields?.length > 0\n ) {\n // various PK name\n // webix datacollections require an .id value, so make sure\n // this incoming value has an .id set\n let PK = obj.PK();\n if (!values.id && PK != \"id\") values.id = values[PK];\n\n if (this.__dataCollection.count() > 0) {\n this.__dataCollection.find({}).forEach((d) => {\n let updateItemData = {\n id: d.id,\n };\n\n connectedFields.forEach((f) => {\n if (!f) return;\n\n let updateRelateVal = {};\n let rowRelateVal = d[f.relationName()] || {};\n\n if (f.fieldLink)\n updateRelateVal =\n values[f.fieldLink.relationName()] || {};\n\n // check to see if we are supposed to be related to this\n let valIsRelated = isRelated(updateRelateVal, d.id, PK);\n\n // If NO, then make sure we Unrelate data\n // if this is an array -> filter out the entry\n if (\n Array.isArray(rowRelateVal) &&\n rowRelateVal.filter(\n (v) =>\n v == values.id ||\n v.id == values.id ||\n v[PK] == values.id\n ).length > 0 &&\n !valIsRelated\n ) {\n updateItemData[f.relationName()] = rowRelateVal.filter(\n // NOTE: Special case: the incoming value.id will be .uuid\n // however in case of User Fields, v.id == username and not .uuid\n // so we put our default check to be v[PK] here to play nice\n (v) => (v[PK] || v.id || v) != values.id\n );\n updateItemData[f.columnName] = updateItemData[\n f.relationName()\n ].map((v) => v.id || v[PK] || v);\n } else if (\n // this is not an array so set link to null\n !Array.isArray(rowRelateVal) &&\n (rowRelateVal == values.id ||\n rowRelateVal.id == values.id ||\n rowRelateVal[PK] == values.id) &&\n !valIsRelated\n ) {\n updateItemData[f.relationName()] = null;\n updateItemData[f.columnName] = null;\n }\n\n // However, if we are supposed to be related => make sure we are\n // If this is an array, then add to list\n // AND YES: make sure it is cloned\n if (valIsRelated) {\n values = this.AB.cloneDeep(values);\n }\n if (Array.isArray(rowRelateVal) && valIsRelated) {\n // update relate data\n if (\n rowRelateVal.filter(\n (v) =>\n v == values.id ||\n v.id == values.id ||\n v[PK] == values.id\n ).length > 0\n ) {\n // just update the one entry in my array with the new\n // value\n rowRelateVal.forEach((v, index) => {\n if (\n v == values.id ||\n v.id == values.id ||\n v[PK] == values.id\n )\n rowRelateVal[index] = values;\n });\n }\n // add new relate\n else {\n rowRelateVal.push(values);\n }\n\n updateItemData[f.relationName()] = rowRelateVal;\n updateItemData[f.columnName] = updateItemData[\n f.relationName()\n ].map(\n (v) => f.getRelationValue(v) /*v.id || v[PK] || v*/\n );\n } else if (\n !Array.isArray(rowRelateVal) &&\n (rowRelateVal != values.id ||\n rowRelateVal.id != values.id ||\n rowRelateVal[PK] != values.id) &&\n valIsRelated\n ) {\n updateItemData[f.relationName()] = values;\n // make ConnectedField use .getRelationValue() here!\n updateItemData[f.columnName] =\n f.getRelationValue(values);\n }\n });\n\n // Refresh Formula Fields when the connected fields are populated\n if (this.settings?.populate) {\n obj.fields(\n (fld) =>\n fld &&\n fld.key == \"formula\" &&\n connectedFields.filter((conFld) => {\n return (\n conFld.id == fld.settings.field &&\n // Populate all connect fields\n (this.settings?.populate == true ||\n // Populate specific connect fields\n (Array.isArray(this.settings?.populate) &&\n this.settings?.populate.indexOf(\n conFld.id\n ) > -1))\n );\n }).length > 0\n ).forEach((formulaField) => {\n updateItemData[formulaField.columnName] =\n formulaField.format(updateItemData, true);\n });\n }\n\n // If this item needs to update\n // meaning there is > 1 key in the object (we always have .id)\n if (Object.keys(updateItemData).length > 1) {\n // normalize data before add to data collection\n // UPDATE: this should already have happened in NetworkRestSocket\n // when the initial data is received.\n\n // NOTE: We could not normalize relational data because they are not full data\n // Merge update data to exists data instead\n\n if (this.__treeCollection?.exists(d.id)) {\n const treeItem = Object.assign(\n this.__treeCollection.getItem(d.id),\n updateItemData\n );\n this.__treeCollection.updateItem(d.id, treeItem);\n }\n\n if (this.__dataCollection?.exists(d.id)) {\n const dcItem = Object.assign(\n this.__dataCollection.getItem(d.id),\n updateItemData\n );\n this.__dataCollection.updateItem(d.id, dcItem);\n this.emit(\n \"update\",\n this.__dataCollection.getItem(d.id)\n );\n if (currCursor?.id == dcItem.id) {\n updateCursor = dcItem;\n }\n }\n }\n });\n }\n }\n\n //\n // Case 3: Our DC is linked to a DC that was effected by this update.\n //\n // We will approach it from another direction, if the current DC made\n // an update to it's current Cursor, then we will emit a \"cursorStale\"\n // event, so our linked DCs will update themselves with the new value:\n if (updateCursor) {\n this.emit(\"cursorStale\", null);\n }\n // this.updateRelationalDataFromLinkDC(data.objectId, values);\n this.refreshLinkCursor();\n\n this.setStaticCursor();\n });\n\n // We are subscribing to notifications from the server that an item may be stale and needs updating\n // We will improve this later and verify that it needs updating before attempting the update on the client side\n this.on(\"ab.datacollection.stale\", (data) => {\n // debugger;\n // if we don't have a datasource or model, there is nothing we can do here:\n // Verify the datasource has the object we are listening for if not just stop here\n if (\n !this.datasource ||\n !this.model ||\n this.datasource.id != data.objectId\n ) {\n return;\n }\n\n // updated values\n var values = data.data;\n\n if (!values) return;\n\n // use the Object's defined Primary Key:\n var PK = this.model.object.PK();\n if (!values[PK]) {\n PK = \"id\";\n }\n\n // DC who is following cursor should update only current cursor.\n if (\n this.isCursorFollow &&\n this.getCursor()?.[PK] != (values[PK] ?? values?.id)\n ) {\n return;\n }\n\n if (values) {\n if (this.__dataCollection.exists(values[PK])) {\n var cond = { where: {} };\n cond.where[PK] = values[PK];\n // this data collection has the record so we need to query the server to find out what it's latest data is so we can update all instances\n this.model.staleRefresh(cond).then((res) => {\n // check to make sure there is data to work with\n if (Array.isArray(res.data) && res.data.length) {\n // debugger;\n let obj = this.datasource;\n if (!obj) return;\n // normalize data before add to data collection\n\n // UPDATE: this should already have happened in NetworkRestSocket\n // when the initial data is received.\n //var model = obj.model();\n // model.normalizeData(res.data[0]);\n\n // tell the webix data collection to update using their API with the row id (values.id) and content (res.data[0])\n if (this.__dataCollection.exists(values[PK])) {\n this.__dataCollection.updateItem(\n values[PK],\n res.data[0]\n );\n }\n\n // If the update item is current cursor, then should tell components to update.\n var currData = this.getCursor();\n if (currData?.[PK] == values[PK]) {\n this.emit(\"cursorStale\", currData);\n }\n } else {\n // If there is no data in the object then it was deleted...lets clean things up\n // If the deleted item is current cursor, then the current cursor should be cleared.\n var currId = this.getCursor();\n if (currId == values[PK]) this.emit(\"cursorStale\", null);\n\n this.__dataCollection.remove(values[PK]);\n this.emit(\"delete\", values[PK]);\n }\n });\n }\n }\n\n // filter link data collection's cursor\n this.refreshLinkCursor();\n this.setStaticCursor();\n });\n\n this.on(\"ab.datacollection.delete\", (data) => {\n // debugger;\n let obj = this.datasource;\n if (!obj) return;\n\n let deleteId = data.data;\n let needDelete = false;\n let deletedIds = [];\n let deletedTreeIds = [];\n\n // Query\n if (obj instanceof this.AB.Class.ABObjectQuery) {\n let objList = obj.objects((o) => o.id == data.objectId) || [];\n needDelete = objList.length > 0;\n if (needDelete) {\n (objList || []).forEach((o) => {\n deletedIds =\n this.__dataCollection\n .find((item) => {\n return item[`${o.alias}.${o.PK()}`] == deleteId;\n })\n .map((o) => o.id) || [];\n\n // grouped queries\n if (this.__treeCollection) {\n deletedTreeIds =\n this.__treeCollection\n .find((item) => {\n return item[`${o.alias}.${o.PK()}`] == deleteId;\n })\n .map((o) => o.id) || [];\n }\n });\n }\n }\n // Object\n else {\n needDelete = obj.id == data.objectId;\n if (needDelete) {\n deletedIds.push(deleteId);\n }\n }\n\n // if it is the source object\n if (needDelete) {\n // If the deleted item is current cursor, then the current cursor should be cleared.\n var currData = this.getCursor();\n\n deletedIds.forEach((delId) => {\n if (currData?.[obj.PK()] == delId)\n this.emit(\"cursorStale\", null);\n\n if (this.__dataCollection.exists(delId))\n this.__dataCollection.remove(delId);\n });\n\n if (this.__treeCollection) {\n deletedTreeIds.forEach((delId) => {\n if (this.__treeCollection.exists(delId))\n this.__treeCollection.remove(delId);\n });\n }\n\n if (deletedIds[0]) this.emit(\"delete\", deletedIds[0]);\n }\n\n // if it is a linked object\n let connectedFields = obj.connectFields(\n (f) => f.datasourceLink && f.datasourceLink.id == data.objectId\n );\n\n // update relation data\n if (\n obj instanceof this.AB.Class.ABObject &&\n connectedFields &&\n connectedFields.length > 0\n ) {\n // various PK name\n let PK = connectedFields[0].object.PK();\n\n this.__dataCollection.find({}).forEach((d) => {\n let updateRelateVals = {};\n\n connectedFields.forEach((f) => {\n let relateVal = d[f.relationName()];\n if (relateVal == null) return;\n\n if (\n Array.isArray(relateVal)\n // JOHNNY: for speed improvements, don't make this check:\n // just do it and that will reduce 1x through the array.\n // &&\n // relateVal.filter(\n // (v) =>\n // v == deleteId ||\n // v.id == deleteId ||\n // v[PK] == deleteId\n // ).length > 0\n ) {\n updateRelateVals[f.relationName()] = relateVal.filter(\n (v) => (v.id || v[PK] || v) != deleteId\n );\n updateRelateVals[f.columnName] = updateRelateVals[\n f.relationName()\n ].map((v) => v.id || v[PK] || v);\n } else if (\n relateVal == deleteId ||\n relateVal.id == deleteId ||\n relateVal[PK] == deleteId\n ) {\n updateRelateVals[f.relationName()] = null;\n updateRelateVals[f.columnName] = null;\n }\n });\n\n // If this item needs to update\n if (Object.keys(updateRelateVals).length > 0) {\n // normalize data before add to data collection\n\n // var model = obj.model();\n // model.normalizeData(updateRelateVals);\n\n this.__dataCollection.updateItem(d.id, updateRelateVals);\n\n if (this.__treeCollection)\n this.__treeCollection.updateItem(d.id, updateRelateVals);\n\n this.emit(\"update\", this.__dataCollection.getItem(d.id));\n }\n });\n }\n });\n\n // add listeners when cursor of link data collection is changed\n const linkDC = this.datacollectionLink;\n // if (linkDC && this.settings.loadAll) {\n if (linkDC) {\n this.eventAdd({\n emitter: linkDC,\n eventName: \"changeCursor\",\n listener: (currentCursor) => {\n // NOTE: we can clear data here to update UI display, then data will be fetched when webix.dataFeed event\n if (\n !this.settings?.loadAll &&\n linkDC.previousCursorId != null &&\n linkDC.previousCursorId != currentCursor?.id\n )\n this.clearAll();\n\n this.refreshLinkCursor();\n this.setStaticCursor();\n },\n });\n\n this.eventAdd({\n emitter: linkDC,\n eventName: \"cursorStale\",\n listener: (currentCursor) => {\n // cursorStale : the current cursor hasn't CHANGED, but the data\n // of that value has changed.\n // This is triggered by one of our socket updates that detects\n // changes to the cursor data.\n\n // if don't have .loadAll set, we'll need to update our data:\n if (!this.settings?.loadAll) {\n // What I do here depends on what my linked DC has set for\n // it's .loadConnections (shouldPopulate) value\n let dvLink = this.datacollectionLink;\n let isMyDataThere = dvLink.shouldPopulate;\n if (Array.isArray(isMyDataThere)) {\n // if this was an array: it should be an array of columnNames\n // of the dvLink that are being populated.\n\n // the column I'm interested in:\n let colName = this.fieldLink.fieldLink.columnName;\n\n // is it there?\n isMyDataThere = isMyDataThere.indexOf(colName) > -1;\n }\n if (!isMyDataThere) {\n // If it didn't populate it's data, then I can't be\n // efficient about how to update my data.\n // we'll just have to reload:\n\n // find out how many entries we have already loaded and try to\n // load at least that many again.:\n let count = 20;\n if (this.__dataCollection.count() > count)\n count = this.__dataCollection.count();\n if (this.__treeCollection?.count() > count)\n count = this.__treeCollection.count();\n\n let currCursor = this.__dataCollection.getCursor();\n this.clearAll();\n this.reloadData(0, count).then(() => {\n this.__dataCollection.setCursor(currCursor);\n this.emit(\"cursorSelect\", currCursor);\n });\n } else {\n // if the linked DC does have my data populated:\n\n // the values I currently contain can fall into 1 of 3 categories:\n // 1) A value I currently have that I need to Keep\n // 2) A value I currently have that I need to remove\n // 3) A value I don't have, but need to Add\n\n // the current value of the cursor should have the ID references\n // to what SHOULD be in my display\n\n // get the current cursor of our linked DC\n let linkCursor;\n\n if (dvLink) {\n linkCursor = dvLink.getCursor();\n }\n if (!linkCursor) {\n // if linkCursor is no longer set, then we should clear()\n this.clearAll();\n return;\n }\n\n let PK = this.datasource.PK();\n\n // lets start by assuming all the current values in cursor are #3\n // -> all the values into valuesToAdd:\n\n let colName = this.fieldLink?.fieldLink?.relationName?.();\n let valuesToAdd = {};\n let valuesIn = colName ? linkCursor[colName] || [] : [];\n if (!Array.isArray(valuesIn)) valuesIn = [valuesIn];\n valuesIn = valuesIn.filter((v) => v);\n valuesIn.forEach((v) => {\n valuesToAdd[v[PK]] = v;\n });\n\n let valuesToRemove = [];\n // step through all the values I currently have\n let currValues = this.__dataCollection.find(() => true);\n currValues.forEach((value) => {\n // if value is in valuesToAdd\n if (valuesToAdd[value[PK]]) {\n // we already have it so turns out we don't need to add\n // it after all\n delete valuesToAdd[value[PK]];\n } else {\n // the current state of the Link Cursor value doesn't have\n // this value, so we need to remove it:\n valuesToRemove.push(value[PK]);\n }\n });\n\n // now remove the items we don't want:\n this.__dataCollection.remove(valuesToRemove);\n\n // then we have to ask for the values we need to add:\n valuesToAdd = Object.keys(valuesToAdd); // convert to []\n // NOTE: .staleRefresh() is designed to handle a single requst\n // that will be compiled with other requests to be more efficient\n // so we need to make 1 .staleRefresh() at a time and then\n // compile those results into our data collection.\n let prmsAllRefreshes = [];\n let allAdds = [];\n (valuesToAdd || []).forEach((v) => {\n let cond = { where: {} };\n cond.where[PK] = v;\n // NOTE: we are using the abbreviated condition syntax here.\n\n // NOTE: staleRefresh() has some buffering capabilities\n // that combine multiple calls into 1 more efficient call:\n prmsAllRefreshes.push(\n this.model.staleRefresh(cond).then((res) => {\n // check to make sure there is data to work with\n if (Array.isArray(res.data) && res.data.length) {\n res.data.forEach((d) => {\n allAdds.push(d);\n });\n } else {\n if (res.data) {\n allAdds.push(res.data);\n }\n }\n })\n );\n });\n Promise.all(prmsAllRefreshes).then(() => {\n allAdds.forEach((d) => {\n if (this.isValidData(d)) {\n if (!this.__dataCollection.exists(d[PK])) {\n this.__dataCollection.add(d);\n }\n }\n });\n });\n }\n\n return;\n }\n\n // Otherwise, we need to refilter our data:\n this.refreshLinkCursor();\n this.setStaticCursor();\n },\n });\n }\n\n // add listeners when cursor of the followed data collection is changed\n const followDC = this.datacollectionFollow;\n if (followDC) {\n this.eventAdd({\n emitter: followDC,\n eventName: \"changeCursor\",\n listener: () => {\n const followCursor = followDC.getCursor();\n const currentCursor = this.getCursor();\n\n // If the cursor is not the new, then it should not reload.\n if (\n followCursor?.[followDC.datasource.PK()] ==\n currentCursor?.[this.datasource.PK()]\n )\n return;\n\n this.clearAll();\n this.loadData();\n },\n });\n\n this.eventAdd({\n emitter: followDC,\n eventName: \"cursorStale\",\n listener: () => {\n // cursorStale : the current cursor hasn't CHANGED, but the data\n // of that value has changed.\n // This is triggered by one of our socket updates that detects\n // changes to the cursor data.\n\n this.clearAll();\n this.loadData();\n },\n });\n }\n\n // add listeners to Datacollection that we are filtering using\n // in_data_collection conditions:\n let listFilterDCs = [];\n let [whereCond] = this.getWhereClause(0, 0);\n SearchWhereCond(\n whereCond,\n [\"in_data_collection\", \"not_in_data_collection\"],\n (rule) => {\n // value should be the ID reference to the cond DC\n let condDC = this.AB.datacollectionByID(rule.value);\n if (condDC) {\n listFilterDCs.push(condDC);\n }\n }\n );\n listFilterDCs.forEach((condDC) => {\n this.eventAdd({\n emitter: condDC,\n eventName: \"loadData\",\n listener: () => {\n // the filter by datacollection has changed values\n // so we need to reload based upon the new values\n this.clearAll();\n this.loadData();\n },\n });\n });\n }\n\n /*\n * waitForDataCollectionToInitialize()\n * there are certain situations where this datacollection shouldn't\n * load until another one has loaded. In those cases, the fn()\n * will wait for the required datacollection to emit \"initializedData\"\n * before continuing on.\n * @param {ABViewDataCollection} DC\n * the DC this datacollection depends on.\n * @returns {Promise}\n */\n async waitForDataCollectionToInitialize(DC, msg) {\n DC.init();\n\n return new Promise((resolve, reject) => {\n /* eslint-disable no-fallthrough */\n switch (DC.dataStatus) {\n // if that DC hasn't started initializing yet, start it!\n case DC.dataStatusFlag.notInitial:\n DC.loadData().catch(reject);\n // no break;\n\n // once in the process of initializing\n\n case DC.dataStatusFlag.initializing:\n /* eslint-enable no-fallthrough*/\n // listen for \"initializedData\" event from the DC\n // then we can continue.\n this.eventRemove(\"initializedData\", DC);\n this.eventAdd({\n emitter: DC,\n eventName: \"initializedData\",\n listener: () => {\n // go next\n resolve();\n },\n });\n break;\n\n // if it is already initialized, we can continue:\n case DC.dataStatusFlag.initialized:\n resolve();\n break;\n\n // just in case, if the status is not known, just continue\n default:\n resolve();\n break;\n }\n /* eslint-enable no-fallthrough */\n });\n }\n\n // /**\n // * @method whereCleanUp()\n // * Parse through the current where condition and remove any null or\n // * empty logical blocks.\n // * @param {obj} curr\n // * 1) The current where condition in ABQuery Format:\n // * {\n // * glue: [AND, OR],\n // * rules: [ {rule} ]\n // * }\n // * or 2) The current {rule} to validate\n // * {\n // * key:{string},\n // * rule:{string},\n // * vlaue:{mixed}\n // * }\n // * @return {ABQuery.where} / { Rule }\n // */\n // whereCleanUp(curr) {\n // if (curr) {\n // if (curr.glue && curr.rules) {\n // // this is a logical Block (AND, OR)\n // // we need to filter the children\n // let newValue = { glue: curr.glue, rules: [] };\n // curr.rules.forEach((r) => {\n // let cleanRule = this.whereCleanUp(r);\n // // don't add values that didn't pass\n // if (cleanRule) {\n // newValue.rules.push(cleanRule);\n // }\n // });\n\n // // if we have a non empty block, then return it:\n // if (newValue.rules.length > 0) {\n // return newValue;\n // }\n\n // // this isn't really a valid conditional, so null\n // return null;\n // }\n\n // // This is a specific rule, that isn't null so:\n // return curr;\n // }\n // return null;\n // }\n\n /**\n * @method getWhereClause()\n * Return the current where condition for the datacollection.\n * The where condition might change depending if we are following\n * another datacollection or not.\n *\n * NOTE: start and limit might be effected by some of our settings\n * so we include them here and then return those values as well.\n *\n * @param {int} start\n * @param {int} limit\n * @returns [ wheres, start, limit ]\n */\n getWhereClause(start, limit) {\n // pull filter conditions\n let wheres = this.AB.cloneDeep(\n this.settings.objectWorkspace.filterConditions ?? {}\n );\n // if we pass new wheres with a reload use them instead\n if (this.__reloadWheres) {\n wheres = this.__reloadWheres;\n }\n wheres.glue = wheres.glue || \"and\";\n wheres.rules = wheres.rules || [];\n\n const __additionalWheres = {\n glue: \"and\",\n rules: [],\n };\n\n // add the filterCond if there are rules to add\n if (this.__filterCond?.rules?.length > 0) {\n __additionalWheres.rules.push(this.__filterCond);\n }\n\n // Filter by a selected cursor of a link DC\n let linkRule = this.ruleLinkedData();\n if (!this.settings.loadAll && linkRule) {\n __additionalWheres.rules.push(linkRule);\n }\n // pull data rows following the follow data collection\n else if (this.datacollectionFollow) {\n const followCursor = this.datacollectionFollow.getCursor();\n // store the PK as a variable\n let PK = this.datasource.PK();\n // if the datacollection we are following is a query\n // add \"BASE_OBJECT.\" to the PK so we can select the\n // right value to report the cursor change to\n if (this.datacollectionFollow.settings.isQuery) {\n PK = \"BASE_OBJECT.\" + PK;\n }\n if (followCursor) {\n start = 0;\n limit = null;\n wheres = {\n glue: \"and\",\n rules: [\n {\n key: this.datasource.PK(),\n rule: \"equals\",\n value: followCursor[PK],\n },\n ],\n };\n }\n // Set no return rows\n else {\n wheres = {\n glue: \"and\",\n rules: [\n {\n key: this.datasource.PK(),\n rule: \"equals\",\n value: \"NO RESULT ROW\",\n },\n ],\n };\n }\n }\n\n // Combine setting & program filters\n if (__additionalWheres.rules.length) {\n if (wheres.rules.length) {\n __additionalWheres.rules.unshift(wheres);\n }\n wheres = __additionalWheres;\n }\n\n // Handle conditions that have in_data_collection\n // The server doesn't know the current state of the datacollections\n // running on the client, so if we are using a condition that\n // references our datacollection, we need to pass along the\n // where condition of that datacollection\n let patch = (rule) => {\n // value should be the ID reference to the cond DC\n let condDC = this.AB.datacollectionByID(rule.value);\n if (condDC) {\n let [cond] = condDC.getWhereClause(0, 0);\n if (cond) {\n // store that under .linkCond\n rule.linkCond = cond;\n }\n }\n };\n SearchWhereCond(\n wheres,\n [\"in_data_collection\", \"not_in_data_collection\"],\n patch\n );\n\n // remove any null in the .rules\n // if (wheres?.rules?.filter) wheres.rules = wheres.rules.filter((r) => r);\n if (this.datasource) {\n wheres = this.datasource.whereCleanUp(wheres);\n }\n\n return [wheres, start, limit];\n }\n\n async loadData(start, limit) {\n // mark data status is initializing\n if (this._dataStatus == this.dataStatusFlag.notInitial) {\n this._dataStatus = this.dataStatusFlag.initializing;\n this.emit(\"initializingData\", {});\n }\n\n var obj = this.datasource;\n if (obj == null) {\n this._dataStatus = this.dataStatusFlag.initialized;\n return Promise.resolve([]);\n }\n\n var model = obj.model();\n if (model == null) {\n this._dataStatus = this.dataStatusFlag.initialized;\n return Promise.resolve([]);\n }\n\n // pull the defined sort values\n var sorts = this.settings.objectWorkspace.sortFields || [];\n\n // Wait for any dependent DCs to initialize\n\n //\n // Step 1: make sure any DataCollections we are linked to are\n // initialized first. Then proceed with our initialization.\n //\n const parentDc = this.datacollectionLink ?? this.datacollectionFollow;\n // If we are linked to another datacollection then wait for it\n if (parentDc) {\n await this.waitForDataCollectionToInitialize(parentDc);\n }\n\n //\n // Step 2: if we have any filter rules that depend on other DataCollections,\n // then wait for them to be initialized first.\n // eg: \"(not_)in_data_collection\" rule filters\n // get a preWheres that will at least include our specific filter data\n // and use that to determine if we need to wait for any other DCs to load\n let [preWheres] = this.getWhereClause(start, limit);\n if (preWheres?.rules?.length) {\n const dcFilters = [];\n\n // this is a recursive search that should catch all rules\n SearchWhereCond(\n preWheres,\n [\"in_data_collection\", \"not_in_data_collection\"],\n (rule) => {\n let dv = this.AB.datacollectionByID(rule.value);\n if (dv) {\n dcFilters.push(this.waitForDataCollectionToInitialize(dv));\n }\n }\n );\n\n await Promise.all(dcFilters);\n }\n\n // NOW that any dependent DCs are initialized,\n // we can proceed with calculating our where clause for real this time\n\n let [wheres, s2, l2] = this.getWhereClause(start, limit);\n start = s2;\n limit = l2;\n\n // set query condition\n var cond = {\n where: wheres || {},\n // limit: limit || 20,\n skip: start || 0,\n sort: sorts,\n populate: this.shouldPopulate,\n };\n\n // Select specific fields\n if (this.settings?.select) cond.select = this.settings.select;\n\n // Skip CSV packing\n if (this.settings?.skipPack) cond.skipPack = this.settings.skipPack;\n\n //// NOTE: we no longer set a default limit on loadData() but\n //// require the platform.loadData() to pass in a default limit.\n if (limit != null) {\n cond.limit = limit;\n }\n\n // if settings specify loadAll, then remove the limit\n if (this.settings.loadAll && !this.isCursorFollow) {\n delete cond.limit;\n }\n\n //\n // Step 3: pull data to data collection\n // we will keep track of the resolve, reject for this\n // operation.\n // the actual resolve() should happen in the\n // .processIncomingData() after the data is processed.\n return new Promise((resolve, reject) => {\n const jobID = this.AB.jobID();\n cond.jobID = jobID;\n this._pendingLoadDataResolves[jobID] = { resolve, reject };\n this.platformFind(model, cond).catch((err) => {\n delete this._pendingLoadDataResolves[jobID];\n reject(err);\n });\n });\n }\n\n platformFind(model, cond) {\n //// Core Migration Note:\n //// the ABViewDataCollectionCore now manages data in a different way:\n //// local data vs Remote Data\n //// this will need to be updated to reflect that management:\n //// (and also explains why we refactored things into .processIncomingData())\n return model.findAll(cond).then((data) => {\n return this.processIncomingData(data);\n });\n }\n\n /**\n * @method shouldPopulate()\n * Return our populate status. We now want to query this info outside this\n * object.\n * @return {bool|Array}\n * true/false, or an array of columnNames that are being populated.\n */\n get shouldPopulate() {\n return (\n this.settings.populate ??\n (this.settings.preventPopulate ? false : true)\n );\n }\n\n /**\n * @method queuedParse()\n * This is an attempt at loading very large datasets into a Webix DC without locking up\n * the display.\n * @param {array} data\n * The data to load into the __dataCollection\n * @param {callback} cb\n * A callback to call when the data has been fully loaded.\n */\n async queuedParse(incomingData, cb) {\n const data = incomingData?.data || incomingData;\n if (!data?.length) {\n cb?.();\n return Promise.resolve();\n }\n\n const total_count = incomingData.total_count;\n\n let nextData;\n if (data.length > 250) {\n // let pos = this.__dataCollection.count();\n let pos = this.__dataCollection.find({}).length;\n let remain = data.splice(250);\n nextData = {\n data: remain,\n pos: pos + data.length,\n total_count,\n };\n }\n\n const parsedData = {\n data,\n pos: incomingData.pos,\n total_count,\n };\n this.__dataCollection.parse(parsedData);\n\n return new Promise((resolve) => {\n setTimeout(async () => {\n await this.queuedParse(nextData);\n\n // Introduce a delay to ensure the UI has fully rendered the list before proceeding\n setTimeout(async () => {\n cb?.();\n resolve();\n }, 50);\n }, 15);\n });\n }\n\n /**\n * processIncomingData()\n * is called from loadData() once the data is returned. This method\n * allows the platform to make adjustments to the data based upon any\n * platform defined criteria.\n * @param {obj} data the data as it was returned from the Server\n * which should be in following format:\n * {\n * status: \"success\", // or \"error\"\n * data:[ {ABObjectData}, {ABObjectData}, ...]\n * }\n */\n processIncomingData(data) {\n return Promise.resolve().then(() => {\n // store total count\n this.__totalCount = data.total_count;\n\n // Need to .parse at the first time\n if (!this.__dataCollection.find({}).length) {\n this.__dataCollection.clearAll();\n // this.__dataCollection.parse(data);\n }\n\n if (this.__throttleIncoming) clearTimeout(this.__throttleIncoming);\n this.__throttleIncoming = setTimeout(async () => {\n // using queuedParse() to responsively handle large datasets.\n await this.queuedParse(data);\n\n // In order to get the total_count updated I had to use .load()\n this.__dataCollection.load(async () => {\n setTimeout(() => {\n this.refreshLinkCursor();\n }, 250);\n\n return {\n // NOTE: return a empty array to prevent render items in DataTable twice. (Items are rendered in .queuedParse function)\n data: [],\n pos: data.pos,\n total_count: data.total_count,\n };\n });\n\n // this does nothing???\n this.parseTreeCollection(data);\n\n // if we are linked, then refresh our cursor\n var linkDv = this.datacollectionLink;\n if (linkDv) {\n // filter data by match link data collection\n this.refreshLinkCursor();\n this.setStaticCursor();\n } else {\n // set static cursor\n this.setStaticCursor();\n }\n\n // now we close out our .loadData() promise.resolve() :\n if (data.jobID) {\n this._pendingLoadDataResolves[data.jobID].resolve();\n delete this._pendingLoadDataResolves[data.jobID];\n }\n\n // If dc set load all, then it will not trigger .loadData in dc at\n // .onAfterLoad event\n if (this.settings.loadAll) {\n this.emit(\"loadData\", {});\n }\n\n // mark initialized data\n if (this._dataStatus != this.dataStatusFlag.initialized) {\n this._dataStatus = this.dataStatusFlag.initialized;\n this.emit(\"initializedData\", {});\n }\n }, 100);\n });\n }\n\n /**\n * @method reloadData()\n * Trigger the DataCollection to reload its data from the server.\n * @param {int} start\n * Start position of where we want the data to load.\n * @param {int} limit\n * How many entries to load at a time.\n * @return {Promise}\n */\n reloadData(start, limit) {\n // var waitForDataCollectionToInitialize = (DC) => {\n // return new Promise((resolve, reject) => {\n // switch (DC.dataStatus) {\n // // if that DC hasn't started initializing yet, start it!\n // case DC.dataStatusFlag.notInitial:\n // DC.loadData().catch(reject);\n // // no break;\n\n // // once in the process of initializing\n // /* eslint-disable no-fallthrough*/\n // case DC.dataStatusFlag.initializing:\n // /* eslint-enable no-fallthrough*/\n // // listen for \"initializedData\" event from the DC\n // // then we can continue.\n // this.eventAdd({\n // emitter: DC,\n // eventName: \"initializedData\",\n // listener: () => {\n // // go next\n // resolve();\n // },\n // });\n // break;\n\n // // if it is already initialized, we can continue:\n // case DC.dataStatusFlag.initialized:\n // resolve();\n // break;\n\n // // just in case, if the status is not known, just continue\n // default:\n // resolve();\n // break;\n // }\n // });\n // };\n\n return Promise.resolve().then(() => {\n // check if we are currently waiting for more data requests on this datacollection before continuing\n if (this.reloadTimer) {\n // if we are already waiting delete the current timer\n clearTimeout(this.reloadTimer);\n delete this.reloadTimer;\n }\n\n // return a promise\n if (!this.reloadPromise) {\n this.reloadPromise = new Promise((resolve, reject) => {\n this.reloadPromise__resolve = resolve;\n this.reloadPromise__reject = reject;\n });\n }\n\n // then create a new timeout to delete current timeout, clear data\n // and load new\n this.reloadTimer = setTimeout(() => {\n // clear the data from the dataCollection,\n this.clearAll();\n // then loads new data from the server\n return this.loadData(start, limit)\n .then(() => {\n if (this.reloadPromise) {\n this.reloadPromise__resolve();\n delete this.reloadPromise;\n delete this.reloadPromise__resolve;\n delete this.reloadPromise__reject;\n }\n\n // delete the current setTimeout\n clearTimeout(this.reloadTimer);\n delete this.reloadTimer;\n })\n .catch((err) => {\n if (this.reloadPromise) {\n this.reloadPromise__reject(err);\n delete this.reloadPromise;\n delete this.reloadPromise__resolve;\n delete this.reloadPromise__reject;\n }\n // delete the current setTimeout\n clearTimeout(this.reloadTimer);\n delete this.reloadTimer;\n });\n }, 50);\n // setting to 50ms because right now we do not see many\n // concurrent calls, we need to increase this if we begin to\n\n return this.reloadPromise;\n });\n }\n\n /**\n * reloadWheres()\n * stores the child data collections filters for subsequent loads.\n * It is called from bindParentDc() when child data collections that are not\n * marked to load all data are initializing. To do this we use webix\n * server side binding by setting the param of \"dataFeed\".\n * @param {obj} wheres the new filters for the data collection\n * This is a combination of any exisiting filters the data collection\n * alreay had as well as the filter for the current cursor set by the\n * master data collection. We store this in __reloadWheres for when\n * the data needs to be updated.\n * The format of the wheres is our Query Builder Format\n * ex: {\n * \"glue\": \"and\",\n * \"rules\": [{\n * \"key\": \"33ba8957-6b9c-4ddb-9533-c46b13878ae1\",\n * \"rule\": \"contains\",\n * \"value\": \"1594176994894\"\n * }]\n * }\n */\n reloadWheres(wheres) {\n this.__reloadWheres = wheres;\n }\n\n getData(filter) {\n var dc = this.__dataCollection;\n if (dc) {\n return dc.find((row) => {\n let isValid = true;\n\n // data collection filter\n // isValid = this.isValidData(row);\n\n // NOTE: data are filtered from the server side (webix.dataFeed)\n // parent dc filter\n let linkDv = this.datacollectionLink;\n if (linkDv && this.settings.loadAll && isValid) {\n isValid = this.isParentFilterValid(row);\n }\n\n // addition filter\n if (isValid && filter) {\n isValid = filter(row);\n }\n\n return isValid;\n });\n } else {\n return [];\n }\n }\n\n isParentFilterValid(rowData) {\n // data is empty\n if (rowData == null) return false;\n\n var linkDv = this.datacollectionLink;\n if (linkDv == null) return true;\n\n const linkObj = linkDv.datasource;\n if (linkObj == null) return true;\n\n var fieldLink = this.fieldLink;\n if (fieldLink == null) return true;\n\n // if the parent's cursor is not set we have not filted this collection\n // yet so the data that comes back should be valid\n var linkCursor = linkDv.getCursor();\n if (linkCursor == null) {\n return true;\n }\n\n var linkVal = rowData[fieldLink.relationName()];\n if (linkVal == null) {\n // try to get relation value(id) again\n if (rowData[fieldLink.columnName]) {\n linkVal = rowData[fieldLink.columnName];\n } else {\n return false;\n }\n }\n\n let PK = fieldLink.object.PK();\n\n // array - 1:M , M:N\n if (linkVal.filter) {\n return (\n linkVal.filter(\n (val) =>\n (val[PK] || val.id || val) ==\n (linkCursor[linkObj.PK()] || linkCursor.id || linkCursor)\n ).length > 0\n );\n } else {\n return (\n (linkVal[PK] || linkVal.id || linkVal) ==\n (linkCursor[linkObj.PK()] || linkCursor.id || linkCursor)\n );\n }\n }\n\n clearAll() {\n if (this.__dataCollection) this.__dataCollection.clearAll();\n\n if (this.__treeCollection) this.__treeCollection.clearAll();\n\n this._dataStatus = this.dataStatusFlag.notInitial;\n }\n\n get totalCount() {\n return this.__totalCount || 0;\n }\n\n ///\n /// Components\n ///\n\n /**\n * @method bind\n * @param {Object} component - a webix element instance\n */\n bind(/* component */) {\n console.error(\"Platform.ABDataCollection.bind() Not implemented\");\n }\n\n unbind(/* component */) {\n console.error(\"Platform.ABDataCollection.unbind() Not implemented\");\n }\n\n removeComponent(comId) {\n // get index\n let index = this.__bindComponentIds.indexOf(comId);\n\n // delete\n this.__bindComponentIds.splice(index, 1);\n }\n\n /**\n * @method ruleLinkedData()\n * return a QueryFilter rule that also checks that incoming data is linked\n * to our .datacollectionLink (if it exists).\n * @return {obj} {QueryFilterRule}\n */\n ruleLinkedData() {\n let rule = null;\n const dataCollectionLink = this.datacollectionLink;\n const fieldLink = this.fieldLink;\n if (dataCollectionLink && fieldLink) {\n const linkCursorId = dataCollectionLink?.getCursor()?.id;\n if (linkCursorId) {\n const linkType = `${fieldLink.linkType()}:${fieldLink.linkViaType()}`;\n\n let filterRule;\n // NOTE: If object is query, then use \"contains\" because ABOBjectQuery return JSON\n if (fieldLink.alias) {\n filterRule = \"contains\";\n }\n // M:1\n else if (linkType == \"many:one\") {\n filterRule = \"have_relation\";\n }\n // 1:M\n else {\n filterRule = \"equals\";\n }\n\n rule = {\n alias: fieldLink.alias, // ABObjectQuery\n key: fieldLink.id,\n rule: filterRule,\n value: fieldLink.getRelationValue(\n dataCollectionLink.__dataCollection.getItem(linkCursorId)\n ),\n };\n }\n }\n return rule;\n }\n\n /**\n * @method refreshFilterConditions()\n * This is called in two primary cases:\n * - on initialization of a DC to setup our filters.\n * - in the operation of the ABDesigner when using a DC to display data\n * in the Work_object_grid and the datacollection_work(?)\n * In the case of the ABDesigner, new temporary where conditions are provided\n * from the possible filters we can set, and those need to effect the data\n * we display.\n * @param {ABRowFilter.where} wheres\n * The filter condition from the ABRowFilter values we are storing.\n */\n refreshFilterConditions(wheres = null) {\n // There are 3 Filters that help us know if our data is Valid:\n // 1) A filter for any ABObjectQuery we are managing.\n // 2) A filter for our own filter condition\n // 3) A filter that represents what our scopes allows\n\n // Set filter of ABObject\n if (this.__filterDatasource == null)\n this.__filterDatasource = this.AB.filterComplexNew(\n `${this.id}_filterDatasource`\n );\n\n if (this.datasource) {\n // this.__filterDatasource.applicationLoad(this.datasource.application);\n this.__filterDatasource.fieldsLoad(this.datasource.fields());\n\n let filterConditions;\n\n // Query\n if (this.datasource instanceof this.AB.Class.ABObjectQuery) {\n filterConditions = this.datasource.where;\n }\n // Apr 29, 2021 Removed this because we do not want Object filters to\n // effect validation of DataCollections\n // Object\n\n // else if (this.datasource instanceof ABObject) {\n // let currentView = this.datasource.currentView();\n // if (currentView && currentView.filterConditions)\n // filterConditions = currentView.filterConditions;\n // }\n\n if (filterConditions)\n this.__filterDatasource.setValue(filterConditions);\n else this.__filterDatasource.setValue({});\n } else {\n this.__filterDatasource.fieldsLoad([]);\n this.__filterDatasource.setValue(\n DefaultValues.settings.objectWorkspace.filterConditions\n );\n }\n\n // Set filter of data view\n // Apr 29, 2021 Added this code back to validate with DataCollection Filters\n if (this.__filterDatacollection == null)\n this.__filterDatacollection = this.AB.filterComplexNew(\n `${this.id}_filterDatacollection`\n );\n\n // this.__filterDatacollection.applicationLoad(\n // this.datasource ? this.datasource.application : null\n // );\n this.__filterDatacollection.fieldsLoad(\n this.datasource ? this.datasource.fields() : []\n );\n\n // if we pass in wheres, then Save that value to our internal .filterConditions\n if (wheres) this.settings.objectWorkspace.filterConditions = wheres;\n\n let filter = this.AB.cloneDeep(\n this.settings.objectWorkspace?.filterConditions ?? {\n glue: \"and\",\n rules: [],\n }\n );\n // sanity checks:\n // I've learned not to trust: this.settings.objectWorkspace\n filter.glue = filter.glue || \"and\";\n filter.rules = filter.rules || [];\n\n // if there is a linkRule, add it to filter\n let linkRule = this.ruleLinkedData(); // returns a rule if we are linked\n if (linkRule) {\n // NOTE: linkRule was originally designed to produce a rule for the\n // loadData() routine. In SQL, our linkRule might have an \"equals\"\n // rule, to match. But in this context if our linktype is \"many\"\n // we need to change the rule to \"contains\":\n // QUESTION: If this is still required, consider moving it into the `ruleLinkedData` function for maintainability. ??\n // if (this.fieldLink?.linkType() == \"many\") {\n // linkRule.rule = \"contains\";\n // }\n\n // if linkRule not already IN filter:\n let isAlreadyThere = false;\n let keys = Object.keys(linkRule);\n (filter.rules || []).forEach((r) => {\n if (isAlreadyThere) return;\n let allMatch = true;\n keys.forEach((k) => {\n if (r[k] != linkRule[k]) {\n allMatch = false;\n }\n });\n isAlreadyThere = allMatch;\n });\n if (!isAlreadyThere) {\n // link Rule needs to be ANDed to our current Rules:\n if (filter.glue == \"and\") {\n filter.rules.push(linkRule);\n } else {\n filter = { glue: \"and\", rules: [filter, linkRule] };\n }\n }\n }\n\n if ((filter.rules || []).length > 0 && !this.isCursorFollow) {\n this.__filterDatacollection.setValue(filter);\n } else {\n this.__filterDatacollection.setValue(\n DefaultValues.settings.objectWorkspace.filterConditions\n );\n }\n\n // Set filter of user's scope\n if (this.__filterScope == null)\n this.__filterScope = this.AB.filterComplexNew(\n `${this.id}_filterScope`\n );\n\n if (this.datasource) {\n let scopeList = (this.userScopes || []).filter(\n (s) =>\n !s.allowAll &&\n (s.objectIds || []).indexOf(this.datasource.id) > -1\n );\n if (scopeList && scopeList.length > 0) {\n // this.__filterScope.applicationLoad(this.datasource.application);\n this.__filterScope.fieldsLoad(this.datasource.fields() || []);\n\n // concat all rules of scopes\n let scopeRules = [];\n scopeList\n .filter(\n (s) => s.filter && s.filter.rules && s.filter.rules.length\n )\n .forEach((s) => {\n let sRules = (s.filter.rules || []).filter(\n (r) =>\n this.datasource.fields((f) => f.id == r.key).length > 0\n );\n\n scopeRules = scopeRules.concat(sRules);\n });\n\n let scopeWhere = {\n glue: \"or\",\n rules: scopeRules,\n };\n this.__filterScope.setValue(scopeWhere);\n }\n }\n }\n\n get isGroup() {\n return this.__isGroup || false;\n }\n\n ///\n /// Sync type\n ///\n\n get syncTypeFlag() {\n return {\n server: 1,\n client: 2,\n };\n }\n\n get syncType() {\n return this.settings.syncType || DefaultValues.syncType;\n }\n\n /** Private methods */\n\n /**\n * @method _dataCollectionNew\n * Get webix.DataCollection\n *\n * @return {webix.DataCollection}\n *\n * @param {Array} data - initial data\n */\n _dataCollectionNew(/*data*/) {\n var error = new Error(\n \"the platform.ABDataCollection._dataCollectionNew() is expected to return a proper DataCollection!\"\n );\n console.error(error);\n return null;\n }\n\n /**\n * @method _treeCollectionNew\n * Get webix.TreeCollection\n *\n * @return {webix.TreeCollection}\n *\n */\n _treeCollectionNew() {\n console.error(\n \"the platform.ABDataCollection._treeCollectionNew() is expected to return a proper TreeCollection!\"\n );\n return null;\n }\n\n parseTreeCollection(data = {}) {\n // TODO all this does is log \"is missing?\"\n // if (false) {\n // console.log(\n // \"Platform.ABDataCollection.parseTreeCollection() missing!\"\n // );\n // }\n }\n // parseTreeCollection(data = {}) {\n\n // if (!(this.__datasource instanceof ABObjectQuery) ||\n // !this.__datasource.isGroup ||\n // !this.__treeCollection)\n // return;\n\n // let addRowToTree = (join = {}, parentAlias = null) => {\n\n // let alias = join.alias;\n\n // (data.data || []).forEach(row => {\n\n // let dataId = row[`${alias}.uuid`] || row[`${alias}.id`];\n // if (!dataId) return;\n\n // // find parent nodes\n // let parentItemIds = [];\n // let parentId = row[`${parentAlias}.uuid`] || row[`${parentAlias}.id`];\n // if (parentId) {\n // parentItemIds = this.__treeCollection\n // .find(item => item._alias == parentAlias && item._dataId == parentId)\n // .map(item => item.id);\n // }\n\n // // check exists\n // let exists = this.__treeCollection.find(item => {\n // return item._alias == alias &&\n // item._dataId == dataId &&\n // (parentItemIds.length == 0 || parentItemIds.indexOf(item.$parent) > -1);\n // }, true);\n // if (exists) return;\n\n // let treeNode = {};\n // treeNode._alias = alias;\n // treeNode._dataId = dataId;\n // treeNode._itemId = row.id; // Keep row id for set cursor to data collection\n\n // Object.keys(row).forEach(propName => {\n\n // // Pull value from alias\n // if (propName.indexOf(`${alias}.`) == 0) {\n // treeNode[propName] = row[propName];\n // }\n\n // });\n\n // if (row.translations)\n // treeNode.translations = row.translations;\n\n // // child nodes\n // if (parentItemIds.length > 0)\n // parentItemIds.forEach(parentItemId => {\n // this.__treeCollection.add(treeNode, null, parentItemId);\n // });\n // // root node\n // else\n // this.__treeCollection.add(treeNode, null);\n\n // });\n\n // // Sub-joins\n // (join.links || []).forEach(link => {\n // addRowToTree(link, alias);\n // });\n\n // };\n\n // // Show loading cursor\n // (this.__bindComponentIds || []).forEach(comId => {\n\n // let boundComp = $$(comId);\n // if (boundComp &&\n // boundComp.showProgress)\n // boundComp.showProgress({ type: \"icon\" });\n\n // });\n\n // addRowToTree(this.__datasource.joins());\n\n // // Hide loading cursor\n // (this.__bindComponentIds || []).forEach(comId => {\n\n // let boundComp = $$(comId);\n // if (boundComp &&\n // boundComp.hideProgress)\n // boundComp.hideProgress();\n\n // })\n // }\n\n /**\n * @method _queryUpdateData\n *\n * @param {Array} objList - List of ABObject\n * @param {Object} values\n */\n _queryUpdateData(objList, values) {\n let updatedVals = {};\n\n // Add alias to properties of update data\n Object.keys(values).forEach((key) => {\n objList.forEach((oItem) => {\n let alias = this.datasource.objectAlias(oItem.id);\n\n updatedVals[`${alias}.${key}`] = values[key];\n\n // Add alias to properties of .translations\n if (\n key == \"translations\" &&\n values[\"translations\"] &&\n values[\"translations\"].length\n ) {\n updatedVals.translations = [];\n\n values[\"translations\"].forEach((tran) => {\n let updatedTran = {};\n\n Object.keys(tran).forEach((tranKey) => {\n if (tranKey == \"language_code\")\n updatedTran[\"language_code\"] = tran[\"language_code\"];\n else updatedTran[`${alias}.${tranKey}`] = tran[tranKey];\n });\n\n updatedVals.translations.push(updatedTran);\n });\n }\n });\n });\n\n return updatedVals;\n }\n\n isValidData(rowData, skipDatasourceFilter = false) {\n let result = true;\n\n // NOTE: should we use filter of the current view of object to filter\n // if yes, update .wheres condition in .loadData too\n if (this.__filterDatasource && !skipDatasourceFilter)\n result = result && this.__filterDatasource.isValid(rowData);\n\n if (this.__filterDatacollection)\n result = result && this.__filterDatacollection.isValid(rowData);\n\n if (result && this.__filterScope)\n result = result && this.__filterScope.isValid(rowData);\n\n return result;\n }\n\n updateRelationalDataFromLinkDC(objectId, rowData) {\n const dcLink = this.datacollectionLink;\n const cursorLink = dcLink?.getCursor();\n\n // Add the new data that just relate to the Link DC\n if (\n dcLink?.datasource.id == objectId &&\n cursorLink &&\n cursorLink.id == rowData?.id\n ) {\n const obj = this.datasource;\n const linkedField = this.fieldLink;\n let relatedData = rowData[linkedField.fieldLink.relationName()];\n if (relatedData && !Array.isArray(relatedData))\n relatedData = [relatedData];\n\n (relatedData ?? []).forEach((item) => {\n if (item == null) return;\n\n if (!this.__dataCollection.exists(item[obj.PK()])) {\n // QUESTION: Should we .find to get fully info here ?\n const newItem = this.AB.cloneDeep(item);\n newItem[linkedField.relationName()] = [rowData];\n this.__dataCollection.add(newItem);\n }\n });\n\n // trigger to components to know there are updated data.\n this.emit(\"warnRefresh\");\n }\n }\n\n // Clone\n\n clone(settings) {\n settings = settings || this.toObj();\n var clonedDatacollection = new this.constructor(settings, this.AB);\n clonedDatacollection.__datasource = this.__datasource;\n clonedDatacollection._dataStatus = this._dataStatus;\n\n // clonedDatacollection.__dataCollection = this.__dataCollection.copy();\n clonedDatacollection.__filterDatacollection.setValue(\n settings.settings.objectWorkspace.filterConditions\n );\n\n var parseMe = () => {\n if (clonedDatacollection.__dataCollection) {\n clonedDatacollection.__dataCollection.parse(\n this.__dataCollection\n .find({})\n .filter((row) =>\n clonedDatacollection.__filterDatacollection.isValid(row)\n )\n );\n }\n if (clonedDatacollection.__treeCollection) {\n clonedDatacollection.__treeCollection.parse(\n this.__treeCollection\n .find({})\n .filter((row) =>\n clonedDatacollection.__filterDatacollection.isValid(row)\n )\n );\n }\n };\n\n parseMe();\n\n // return new Promise((resolve, reject) => {\n // // load the data\n // clonedDatacollection\n // .loadData()\n // .then(() => {\n\n // set the cursor\n clonedDatacollection.setStaticCursor();\n\n var cursorID = this.getCursor();\n if (cursorID) {\n // NOTE: webix documentation issue: .getCursor() is supposed to return\n // the .id of the item. However it seems to be returning the {obj}\n if (cursorID.id) cursorID = cursorID.id;\n\n clonedDatacollection.setCursor(cursorID);\n }\n\n return clonedDatacollection;\n\n // resolve(clonedDatacollection);\n // })\n // .catch(reject);\n // });\n }\n\n filteredClone(filters) {\n var obj = this.toObj();\n\n // check to see that filters are set (this is sometimes helpful to select the first record without doing so at the data collection level)\n if (filters?.rules?.length) {\n if (obj.settings.objectWorkspace.filterConditions?.rules?.length) {\n obj.settings.objectWorkspace.filterConditions.rules =\n obj.settings.objectWorkspace.filterConditions.rules.concat(\n filters.rules\n );\n } else {\n obj.settings.objectWorkspace.filterConditions = filters;\n }\n }\n let clonedDC = this.clone(obj);\n return clonedDC; // new ABViewDataCollection(settings, this.application, this.parent);\n }\n\n //\n // Event handles\n //\n\n /**\n * @method eventAdd()\n *\n *\n *\n * @param {object} evt - {\n * emitter: object,\n * eventName: string,\n * listener: function\n * }\n */\n eventAdd(evt) {\n if (!evt || !evt.emitter || !evt.listener) return;\n\n this.__events = this.__events || [];\n\n let exists = this.__events.find((e) => {\n return e.emitter == evt.emitter && e.eventName == evt.eventName;\n // && e.listener == evt.listener;\n });\n\n if (!exists || exists.length < 1) {\n // add to array\n this.__events.push({\n emitter: evt.emitter,\n eventName: evt.eventName,\n listener: evt.listener,\n });\n\n // listening this event\n evt.emitter.on(evt.eventName, evt.listener);\n }\n }\n\n /**\n * @method eventClear()\n * unsubscribe all events.\n * should do it before destroy a component\n *\n */\n eventClear() {\n if (this.__events && this.__events.length > 0) {\n this.__events.forEach((e) => {\n e.emitter.removeListener(e.eventName, e.listener);\n });\n }\n }\n\n /**\n * @method eventRemove()\n * unsubscribe a event.\n *\n * @param {string} eventName - Name of the event\n * @param {object} emitter - Emitter object\n */\n eventRemove(eventName, emitter = null) {\n if (this.__events?.length > 0 && eventName) {\n this.__events.forEach((e) => {\n if (eventName == e.eventName && (!emitter || emitter == e.emitter))\n e.emitter.removeListener(e.eventName, e.listener);\n });\n\n this.__events = this.__events.filter((e) => e.eventName != eventName);\n }\n }\n\n get userScopes() {\n return [];\n }\n\n get isCursorFollow() {\n return (\n this.settings.followDatacollectionID &&\n (!this.settings.linkDatacollectionID || !this.settings.linkFieldID)\n );\n }\n\n get datacollectionFollow() {\n if (!this.isCursorFollow) return null;\n\n return (this.AB ?? AB).datacollectionByID(\n this.settings.followDatacollectionID\n );\n }\n\n get previousCursorId() {\n return this.__previousCursorId;\n }\n\n waitReady() {\n // if (this.dataStatus == this.dataStatusFlag.initialized) {\n // return Promise.resolve();\n // }\n // console.log(`DC[${this.label}] waiting for initializedData.`);\n // return new Promise((resolve /*, reject */) => {\n // this.once(\"initializedData\", ()=>{\n // resolve();\n // })\n\n // })\n\n return this.waitForDataCollectionToInitialize(this);\n }\n};\n","// import ABApplication from \"./ABApplication\"\n\nmodule.exports = class ABDefinitionCore {\n constructor(attributes, AB) {\n this.AB = AB;\n this.fromValues(attributes);\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n fromValues(attributes) {\n /*\n\t\t{\n\t\t\tid: uuid(),\n\t\t\tname: 'name',\n\t\t\ttype: 'xxxxx',\n\t\t\tjson: \"{json}\"\n\t\t}\n\t\t*/\n if (attributes.id) {\n this.id = attributes.id;\n }\n this.name =\n attributes?.name ||\n attributes?.json?.name ||\n attributes?.json?.label ||\n attributes?.json?.translations?.[0]?.label ||\n \"\";\n if (!this.name) {\n this.AB.notify.builder(\n new Error(\"Attributes for definition had no 'name'\"),\n {\n context: \"ABDefinitionCore.fromValues()\",\n attributes,\n }\n );\n }\n this.type = attributes.type || attributes?.json?.type || \"\";\n this.json = attributes.json || null;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n return {\n id: this.id,\n name: this.name,\n type: this.type,\n json: this.json,\n };\n }\n\n /**\n * @method destroy()\n * destroy the current instance of ABDefinition\n * Also remove it from our parent application\n * @return {Promise}\n */\n destroy() {\n return this.AB.definitionDestroy(this.id);\n }\n\n /**\n * @method save()\n * persist this instance of ABObject with it's parent ABApplication\n * @return {Promise}\n * .resolve( {this} )\n */\n async save() {\n if (this.id) {\n return this.AB.definitionUpdate(this.id, this.toObj());\n } else {\n return this.AB.definitionCreate(this.toObj());\n }\n }\n};\n","/*\n * ABFactoryCore\n * an object that contains the definitions and references for a single tenant.\n * It is expected that an instance of this should be returned from an\n * ABBootstrap.init(req).then((AB)=>{}) call.\n */\n\n// const _ = require(\"lodash\");\n// const uuidv4 = require(\"uuid\");\n\nconst ABApplication = require(\"../platform/ABApplication\");\nconst ABApplicationMobile = require(\"../platform/ABApplicationMobile\");\nconst ABDefinition = require(\"../platform/ABDefinition\");\n\nconst ABComponent = require(\"../platform/ABComponent\");\n\nconst ABFieldManager = require(\"./ABFieldManager\");\n\nconst ABIndex = require(\"../platform/ABIndex\");\nconst ABObject = require(\"../platform/ABObject\");\nconst ABObjectExternal = require(\"../platform/ABObjectExternal\");\nconst ABObjectImport = require(\"../platform/ABObjectImport\");\nconst ABObjectApi = require(\"../platform/ABObjectApi\");\nconst ABObjectApiNetsuite = require(\"../platform/ABObjectApiNetsuite\");\nconst ABDataCollection = require(\"../platform/ABDataCollection\");\nconst ABObjectQuery = require(\"../platform/ABObjectQuery\");\n\nconst ABHint = require(\"../platform/ABHint\");\nconst ABProcess = require(\"../platform/ABProcess\");\n\nconst ABProcessParticipant = require(\"../platform/process/ABProcessParticipant\");\nconst ABProcessLane = require(\"../platform/process/ABProcessLane\");\nconst ABProcessTaskManager = require(\"./process/ABProcessTaskManager\");\n\nconst ABStep = require(\"../platform/ABStep\");\n\nconst ABViewDetailItem = require(\"../platform/views/ABViewDetailItem\");\nconst ABViewFormItem = require(\"../platform/views/ABViewFormItem\");\nconst ABMobileViewFormItem = require(\"../platform/mobile/ABMobileViewFormItem\");\n\n// const ABObjectWorkspaceViewGrid = require(\"../platform/workspaceViews/ABObjectWorkspaceViewGrid\");\n// const ABObjectWorkspaceViewKanban = require(\"../platform/workspaceViews/ABObjectWorkspaceViewKanban\");\n// const ABObjectWorkspaceViewGantt = require(\"../platform/workspaceViews/ABObjectWorkspaceViewGantt\");\n\nconst RowFilter = require(\"../platform/RowFilter\");\nconst FilterComplex = require(\"../platform/FilterComplex\");\n\nconst ABMLClass = require(\"../platform/ABMLClass\");\n\nconst EventEmitter = require(\"../platform/ABEmitter\");\n\nclass ABFactory extends EventEmitter {\n constructor(definitions) {\n /**\n * @param {hash} definitions\n * { ABDefinition.id : {ABDefinition} }\n * of all the definitions defined for the current Tenant\n */\n\n super();\n this.setMaxListeners(0);\n\n this._definitions = definitions || {};\n // {hash} { ABDefinition.id : {ABDefinition} }\n // ensure ._definitions is a HASH{ ID : {ABDefinition}}\n if (Array.isArray(definitions)) {\n var hash = {};\n definitions.forEach((d) => {\n hash[d.id] = d;\n });\n this._definitions = hash;\n }\n\n //\n //\n // Manage our working objects\n //\n\n this._allApplications = [];\n // {array} of all the ABApplication(s) in our site.\n\n this._allObjects = [];\n // {array} of all the ABObject(s) in our site.\n\n this._allHints = [];\n // {array} of all the ABHint(s) in our site.\n\n this._allProcesses = [];\n // {array} of all the ABProcess(s) in our site.\n\n this._allQueries = [];\n // {array} of all the ABObjectQuery(s) in our site.\n\n this._allSteps = [];\n // {array} of all the ABStep(s) in our site.\n\n this._allDatacollections = [];\n // {array} of all the ABDataCollection(s) in our site.\n\n //\n // Class References\n //\n this.Class = {\n ABApplication,\n ABComponent,\n ABDefinition,\n ABFieldManager,\n ABIndex,\n ABMLClass,\n ABObject,\n ABObjectExternal,\n ABObjectImport,\n ABObjectApi,\n ABObjectApiNetsuite,\n ABObjectQuery,\n ABProcessParticipant,\n // ABRole // Do we need this anymore?\n\n // ABObjectWorkspaceViewGrid,\n // ABObjectWorkspaceViewKanban,\n // ABObjectWorkspaceViewGantt,\n\n ABProcessTaskManager,\n\n ABViewDetailItem,\n ABViewFormItem,\n ABMobileViewFormItem,\n };\n\n //\n // Rules\n // These are a common set of \"rules\" for all platforms.\n //\n this.rules = {\n /**\n * @method AB.rules.isUUID\n * evaluate a given value to see if it matches the format of a uuid\n * @param {string} key\n * @return {boolean}\n */\n isUUID: function (key) {\n var checker = RegExp(\n \"^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$\",\n \"i\"\n );\n return checker.test(key);\n },\n\n /**\n * @method AB.rules.nameFilter()\n * return a properly formatted name for an AppBuilder object.\n * @param {string} name\n * The name of the object we are conditioning.\n * @return {string}\n */\n nameFilter: function (name) {\n return String(name).replace(/[^a-z0-9_.]/gi, \"\");\n },\n\n /**\n * @method AB.rules.toApplicationNameFormat()\n * return a properly formatted Application Name\n * @param {string} name\n * The name of the Application we are conditioning.\n * @return {string}\n */\n toApplicationNameFormat: function (name) {\n return \"AB_\" + this.nameFilter(name);\n },\n\n /**\n * @method AB.rules.toFieldRelationFormat()\n * This function uses for define relation name of Knex Objection\n * return a relation name of column\n * @param {string} colName\n * The name of the Column\n * @return {string}\n */\n toFieldRelationFormat: function (colName) {\n return this.nameFilter(colName) + \"__relation\";\n },\n\n /**\n * @method AB.rules.toJunctionTableFK()\n * return foriegnkey (FK) column name for a junction table name\n * @param {string} objectName\n * The name of the Object with a connection\n * @param {string} columnName\n * The name of the connection columnName.\n * @return {string}\n */\n toJunctionTableFK: function (objectName, columnName) {\n var fkName = objectName + \"_\" + columnName;\n\n if (fkName.length > 64) fkName = fkName.substring(0, 64);\n\n return fkName;\n },\n\n /**\n * @method AB.rules.toJunctionTableNameFormat()\n * return many-to-many junction table name\n * @param {string} appName\n * The name of the Application for this object\n * @param {string} sourceTableName\n * The name of the source object we are conditioning.\n * @param {string} targetTableName\n * The name of the target object we are conditioning.\n * @param {string} colName\n * @return {string}\n */\n toJunctionTableNameFormat: function (\n appName,\n sourceTableName,\n targetTableName,\n colName\n ) {\n // The maximum length of a table name in MySql is 64 characters\n appName = this.toApplicationNameFormat(appName);\n if (appName.length > 17) appName = appName.substring(0, 17);\n\n if (sourceTableName.length > 15)\n sourceTableName = sourceTableName.substring(0, 15);\n\n if (targetTableName.length > 15)\n targetTableName = targetTableName.substring(0, 15);\n\n colName = this.nameFilter(colName);\n if (colName.length > 14) colName = colName.substring(0, 14);\n\n return \"{appName}_{sourceName}_{targetName}_{colName}\"\n .replace(\"{appName}\", appName)\n .replace(\"{sourceName}\", sourceTableName)\n .replace(\"{targetName}\", targetTableName)\n .replace(\"{colName}\", colName);\n },\n\n /**\n * @method AB.rules.toObjectNameFormat\n * return a properly formatted Object/Table Name\n * @param {string} objectName\n * The {ABObject}.name of the Object we are conditioning.\n * @return {string}\n */\n toObjectNameFormat: function (objectName) {\n return `AB_${this.nameFilter(objectName)}`;\n },\n };\n\n // Notify Helpers\n this.notify.builder = (...params) => {\n this.notify(\"builder\", ...params);\n };\n\n this.notify.developer = (...params) => {\n this.notify(\"developer\", ...params);\n };\n }\n\n /**\n * @method definitionClean()\n * make sure the provided ABDefinition values are properly formatted\n * @param {ABDefinition} d\n * The json settings of an ABDefinition object.\n */\n definitionClean(d) {\n if (typeof d.json == \"string\") {\n try {\n d.json = JSON.parse(d.json);\n } catch (e) {\n console.log(e);\n console.error(` Error on definition id[${d.id}]`);\n }\n }\n }\n\n init() {\n let allDefinitions = Object.keys(this._definitions).map(\n (k) => this._definitions[k]\n );\n // {array} all our definitions in an Array format.\n\n // make sure our definitions.json field is an {} and not string\n allDefinitions.forEach((d) => {\n this.definitionClean(d);\n });\n\n // perform these in order:\n [\n \"object\",\n \"query\",\n \"datacollection\",\n \"process\",\n \"hint\",\n \"step\",\n \"application\",\n ].forEach((type) => {\n var objTypes = allDefinitions.filter((d) => d.type == type);\n objTypes.forEach((def) => {\n let { keyList, keyFn } = this.objectKeysByDef(def);\n if (keyList) {\n this[keyList].push(this[keyFn](def.json));\n }\n });\n });\n\n this.emit(\"init.objects_ready\");\n return Promise.resolve();\n }\n\n /**\n * @method objectKeysByDef()\n * Analyze the provided ABDefinition json and return which set of list and\n * functions are used to create a new instance of this definition.\n * @param {json} def\n * the ABDefinition json of the definition we are evaluating\n * @return { keyList, keyFn }\n * keyList: {string} which of our internal lists to store this new\n * object.\n * keyFn: {string} which of our methods to call with the def.json\n * as the param that will create the new object.\n *\n * ex: this[keyList].push( this[keyFn](def.json));\n *\n * if this def is not one of the types we track,\n * keyList = keyFn = null;\n */\n objectKeysByDef(def) {\n switch (def.type) {\n case \"application\":\n return { keyList: \"_allApplications\", keyFn: \"applicationNew\" };\n\n case \"datacollection\":\n return {\n keyList: \"_allDatacollections\",\n keyFn: \"datacollectionNew\",\n };\n\n case \"hint\":\n return { keyList: \"_allHints\", keyFn: \"hintNew\" };\n\n case \"steps\":\n return { keyList: \"_allSteps\", keyFn: \"stepNew\" };\n\n case \"object\":\n return { keyList: \"_allObjects\", keyFn: \"objectNew\" };\n\n case \"process\":\n return { keyList: \"_allProcesses\", keyFn: \"processNew\" };\n\n case \"query\":\n return { keyList: \"_allQueries\", keyFn: \"queryNew\" };\n\n default:\n // we don't manage any other\n return { keyList: null, keyFn: null };\n }\n }\n\n //\n // Definitions\n //\n\n /**\n * definitionByID(id)\n * return an ABDefinition.json value ready for our objects to use.\n * @param {string} id\n * the uuid of the ABDefinition to delete\n * @param {bool} isRaw\n * indicates if we want the full ABDefinition, or the .json param\n * true : returns full ABDefinition value.\n * false: returns the .json parameter used by most ABObjects.\n * @return {Promise}\n */\n definitionByID(id, isRaw = false) {\n if (this._definitions[id]) {\n if (isRaw) {\n return this._definitions[id];\n } else {\n return this._definitions[id].json;\n }\n }\n return null;\n }\n\n /**\n * definitionNew(values)\n * return an ABDefinition object tied to this Tenant.\n * @param {obj} values\n * The value hash of the ABDefinition object to create.\n * @return {ABDefinition}\n */\n definitionNew(values) {\n return new ABDefinition(values, this);\n }\n\n /**\n * definitionsParse()\n * include the incoming definitions into our ABFactory. These new\n * definitions will replace any existing ones with the same .id.\n * @param {array[ABDefinitioin]} defs\n * the incoming array of ABDefinitions to parse.\n * @return {Promise}\n */\n definitionsParse(defs = []) {\n if (!Array.isArray(defs)) {\n defs = [defs];\n }\n\n // store/replace the incoming definitions\n // 1st: insert ALL our definitions internally\n defs.forEach((d) => {\n this.definitionClean(d);\n this._definitions[d.id] = d;\n });\n // 2nd: Now we can then go through and signal the \"updates\"\n // and the related objects can find their dependent definitions.\n defs.forEach((d) => {\n this.definitionSync(\"updated\", d.id, d);\n });\n\n return Promise.resolve();\n }\n\n /**\n * definitionSync()\n * Synchronize an individual definition into our repository of definitions.\n * @param {string} op\n * the type of synchronization this is\n * [ \"created\", \"updated\", \"destroyed\"]\n * @param {uuid} id\n * the definition.id of the definition we are synchronizing\n * @param {json} def\n * the ABDefinition attributes we are storing.\n */\n definitionSync(op, id, def) {\n var { keyList, keyFn } = this.objectKeysByDef(def);\n if (keyList) {\n var curr;\n switch (op) {\n case \"created\":\n this[keyList].push(this[keyFn](def.json));\n this.emit(\"definition.created\", def.json);\n break;\n\n case \"updated\":\n // get the current object\n curr = this[keyList].find((d) => d.id == id);\n\n // remove from list\n this[keyList] = this[keyList].filter((d) => d.id != id);\n // add new one:\n this[keyList].push(this[keyFn](def.json));\n\n // signal this object needs to be updated:\n // NOTE: if this is one of the objects we are tracking,\n // we don't need to this.emit() the message.\n if (curr) {\n curr.emit(\"definition.updated\", def.json);\n } else {\n this.emit(\"definition.updated\", def.json);\n }\n break;\n\n case \"destroyed\":\n // get the current object\n curr = this[keyList].find((d) => d.id == id);\n if (curr) {\n // remove from list\n this[keyList] = this[keyList].filter((d) => d.id != id);\n\n // signal this object needs to be updated:\n curr.emit(\"definition.deleted\", def.json);\n\n this.emit(\"definition.deleted\", def.json);\n }\n break;\n }\n }\n }\n\n //\n // ABObjects\n //\n /**\n * @method applications()\n * return all the ABApplications that match the provided filter.\n * @param {fn} fn\n * A filter function to select specific ABApplications.\n * Must return true to include the entry.\n * @return {array}\n */\n applications(fn = () => true) {\n return (this._allApplications || []).filter(fn);\n }\n\n /**\n * @method applicationByID()\n * returns a single ABApplication that matches the given ID.\n * @param {string} ID\n * the .id/.name/.label of the ABApplication we are searching\n * for.\n * @return {ABApplication}\n * the matching ABApplication object if found\n * {null} if not found.\n */\n applicationByID(ID) {\n return this.applications((a) => a.id == ID)[0];\n }\n\n /**\n * @method applicationNew()\n * Return a new instance of an ABApplication object.\n * @param {json} values\n * the ABDefinition.json of the ABApplication object we are\n * creating.\n * @return {ABApplication}\n */\n applicationNew(values) {\n // just in case we got here by mistake:\n if (values.appType == \"mobile\") {\n return this.applicationMobileNew(values);\n }\n\n return new ABApplication(values, this);\n }\n\n /**\n * @method applicationMobileNew()\n * Return a new instance of an ABApplicationMobile object.\n * @param {json} values\n * the ABDefinition.json of the ABApplicationMobile object we are\n * creating.\n * @return {ABApplicationMobile}\n */\n applicationMobileNew(values) {\n return new ABApplicationMobile(values, this);\n }\n\n /**\n * @method datacollections()\n * return an array of all the ABDataCollection for this ABApplication.\n * @param {fn} filter\n * a filter fn to return a set of ABDataCollection that\n * this fn returns true for.\n * @return {array}\n * array of ABDataCollection\n */\n datacollections(filter = () => true) {\n return (this._allDatacollections || []).filter(filter);\n }\n\n /**\n * @method datacollectionByID()\n * returns a single ABDatacollection that matches the given ID.\n * @param {string} ID\n * the .id/.name/.label of the ABDatacollection we are searching\n * for.\n * @return {ABDatacollection}\n * the matching ABDatacollection object if found\n * {null} if not found.\n */\n datacollectionByID(ID) {\n // an undefined or null ID should not match any DC.\n if (!ID) return null;\n\n return this.datacollections((dc) => {\n return dc.id == ID || dc.name == ID || dc.label == ID;\n })[0];\n }\n\n /**\n * @method datacollectionNew()\n * create a new instance of ABDataCollection\n * @param {obj} values\n * the initial values for the DC\n * @return {ABDatacollection}\n */\n datacollectionNew(values) {\n var dc = new ABDataCollection(values, this);\n dc.on(\"destroyed\", () => {\n // make sure it is no longer in our internal list\n this._allDatacollections = this._allDatacollections.filter(\n (d) => d.id != dc.id\n );\n });\n return dc;\n }\n\n /**\n * @method fieldNew()\n * return an instance of a new (unsaved) ABField that is tied to a given\n * ABObject.\n * NOTE: this new field is not included in our this.fields until a .save()\n * is performed on the field.\n * @param {obj} values the initial values for this field.\n * - { key:'{string}'} is required\n * @param {ABObject} object the parent object this field belongs to.\n * @return {ABField}\n */\n fieldNew(values, object) {\n // NOTE: ABFieldManager returns the proper ABFieldXXXX instance.\n return ABFieldManager.newField(values, object);\n }\n\n /**\n * @method indexNew()\n * return an instance of a new (unsaved) ABIndex.\n * @return {ABIndex}\n */\n indexNew(values, object) {\n return new ABIndex(values, object);\n }\n\n /**\n * @method Label()\n * a simple label factory.\n * It is expected to be called like this:\n * @codestart\n * var L = AB.Label();\n * var outputText = L(\"Hello World\");\n * var o2 = L(\"I'm {0} years old\", [5]);\n * @codeend\n * @return {fn}\n */\n Label() {\n return (key, altText, values = []) => {\n var label = key;\n if (altText) {\n if (Array.isArray(altText)) {\n values = altText;\n } else {\n label = altText;\n }\n }\n\n values.forEach((v, i) => {\n var sub = `{${i}}`;\n label = label.replaceAll(sub, v);\n });\n\n return label;\n };\n }\n\n /**\n * @method objects()\n * return an array of all the ABObjects for this ABApplication.\n * @param {fn} filter\n * a filter fn to return a set of ABObjects that this fn\n * returns true for.\n * @return {array}\n * array of ABObject\n */\n objects(filter = () => true) {\n return (this._allObjects || []).filter(filter);\n }\n\n /**\n * @method objectByID()\n * return the specific object requested by the provided id.\n * @param {string} ID\n * @return {obj}\n */\n objectByID(ID) {\n return this.objects((o) => {\n return o.id == ID || o.name == ID || o.label == ID;\n })[0];\n }\n\n /**\n * @method objectNew()\n * return an instance of a new (unsaved) ABObject that is tied to this\n * ABApplication.\n * NOTE: this new object is not included in our this.objects until a .save()\n * is performed on the object.\n * @return {ABObject}\n */\n objectNew(values) {\n var newObj = null;\n\n if (values.isExternal == true)\n newObj = new ABObjectExternal(values, this);\n else if (values.isImported == true)\n newObj = new ABObjectImport(values, this);\n else if (values.isNetsuite == true)\n newObj = new ABObjectApiNetsuite(values, this);\n else if (values.isAPI == true) newObj = new ABObjectApi(values, this);\n else newObj = new ABObject(values, this);\n\n /*\n // IS THIS CORRECT?\n newObj.on(\"destroyed\", () => {\n // make sure it is no longer in our internal list\n this._allObjects = this._allObjects.filter((o) => o.id != newObj.id);\n });\n */\n\n return newObj;\n }\n\n objectFile() {\n return this.objectByID(\"4a9d89c9-f4eb-41af-91e4-909eff389f3e\");\n }\n\n objectLanguage() {\n return this.objectByID(\"d84cd351-d96c-490f-9afb-2a0b880ca0ec\");\n }\n\n objectProcessDefinition() {\n return this.objectByID(\"af91fc75-fb73-4d71-af14-e22832eb5915\");\n }\n\n objectProcessForm() {\n return this.objectByID(\"d36ae4c8-edef-48d8-bd9c-79a0edcaa067\");\n }\n\n objectProcessInstance() {\n return this.objectByID(\"2ba85be0-78db-4eda-ba43-c2c4e3831849\");\n }\n\n objectRole() {\n return this.objectByID(\"c33692f3-26b7-4af3-a02e-139fb519296d\");\n }\n\n objectScope() {\n return this.objectByID(\"af10e37c-9b3a-4dc6-a52a-85d52320b659\");\n }\n\n objectToken() {\n return this.objectByID(\"08826ac7-4b33-4745-a3d7-f7831ca4ff59\");\n }\n\n objectUser() {\n return this.objectByID(\"228e3d91-5e42-49ec-b37c-59323ae433a1\");\n }\n\n objectKey() {\n return this.objectByID(\"d734fe8c-b615-446c-8a5f-793ddece19f9\");\n }\n\n objectSecret() {\n return this.objectByID(\"db5b3b26-5300-4c92-bc73-8ce4f4696992\");\n }\n\n //\n // Hints\n //\n /**\n * @method hints()\n * return all the ABHints that match the provided filter.\n * @param {fn} fn\n * A filter function to select specific ABHints.\n * Must return true to include the entry.\n * @return {array}\n */\n hints(filter = () => true) {\n return (this._allHints || []).filter(filter);\n }\n\n /**\n * @method hintByID()\n * return the specific hint requested by the provided id.\n * @param {string} ID\n * @return {obj}\n */\n hintID(ID) {\n return this.hints((h) => {\n return h.id == ID || h.name == ID || h.label == ID;\n })[0];\n }\n\n /**\n * @method hintNew()\n * return an instance of a new (unsaved) ABHint that is tied to this\n * ABApplication.\n * NOTE: this new hint is not included in our this.hints until a .save()\n * is performed on the object.\n * @return {ABHint}\n */\n hintNew(values) {\n var newHint = new ABHint(values, this);\n\n return newHint;\n }\n\n //\n // Steps\n //\n /**\n * @method steps()\n * return all the ABSteps that match the provided filter.\n * @param {fn} fn\n * A filter function to select specific ABSteps.\n * Must return true to include the entry.\n * @return {array}\n */\n steps(filter = () => true) {\n return (this._allSteps || []).filter(filter);\n }\n\n /**\n * @method stepByID()\n * return the specific step requested by the provided id.\n * @param {string} ID\n * @return {obj}\n */\n stepID(ID) {\n return this.steps((s) => {\n return s.id == ID || s.name == ID || s.label == ID;\n })[0];\n }\n\n /**\n * @method stepNew()\n * return an instance of a new (unsaved) ABStep that is tied to this\n * ABApplication.\n * NOTE: this new step is not included in our this.steps until a .save()\n * is performed on the object.\n * @return {ABHint}\n */\n stepNew(id, hintID) {\n var stepDef = this.definitionByID(id);\n if (stepDef) {\n var getStep = new ABStep(stepDef, this);\n return getStep;\n } else {\n var params = {\n settings: {\n hint: hintID,\n },\n };\n var newStep = new ABStep(params, this);\n return newStep;\n }\n // return null;\n }\n\n //\n // Processes\n //\n /**\n * @method processes()\n * return all the ABProcess that match the provided filter.\n * @param {fn} fn\n * A filter function to select specific ABProcess.\n * Must return true to include the entry.\n * @return {array}\n */\n processes(filter = () => true) {\n return (this._allProcesses || []).filter(filter);\n }\n\n /**\n * @method processByID()\n * return the specific process requested by the provided id.\n * @param {string} ID\n * @return {obj}\n */\n processByID(ID) {\n return this.processes((p) => {\n return p.id == ID || p.name == ID || p.label == ID;\n })[0];\n }\n\n /**\n * @method processNew()\n * Return a new instance of an ABProcess object.\n * @param {json} values\n * the ABDefinition.json of the ABProcess object we are\n * creating.\n * @return {ABProcess}\n */\n processNew(values) {\n return new ABProcess(values, this);\n }\n\n /**\n * @method processElementNew(id)\n * return an instance of a new ABProcessOBJ that is tied to a given\n * ABProcess.\n * @param {string} id\n * the ABDefinition.id of the element we are creating\n * @param {ABProcess} process\n * the process this task is a part of.\n * @return {ABProcessTask}\n */\n processElementNew(id, process) {\n var taskDef = this.definitionByID(id);\n if (taskDef) {\n switch (taskDef.type) {\n case ABProcessParticipant.defaults().type:\n return new ABProcessParticipant(taskDef, process, this);\n // break;\n\n case ABProcessLane.defaults().type:\n return new ABProcessLane(taskDef, process, this);\n // break;\n\n default:\n // default to a Task\n return ABProcessTaskManager.newTask(taskDef, process, this);\n // break;\n }\n }\n return null;\n }\n\n /**\n * @method processElementNewForModelDefinition(def)\n *\n * return an instance of a new ABProcess[OBJ] that is tied to the given\n * BPMI:Element definition.\n *\n * @param {BPMI:Element} element the element definition from our BPMI\n * modler.\n * @return {ABProcess[OBJ]}\n */\n processElementNewForModelDefinition(element, process) {\n var newElement = null;\n\n switch (element.type) {\n case \"bpmn:Participant\":\n newElement = new ABProcessParticipant({}, process, this);\n break;\n\n case \"bpmn:Lane\":\n newElement = new ABProcessLane({}, process, this);\n break;\n\n default:\n var defaultDef = ABProcessTaskManager.definitionForElement(element);\n if (defaultDef) {\n newElement = ABProcessTaskManager.newTask(\n defaultDef,\n process,\n this\n );\n }\n break;\n }\n\n // now make sure this new Obj pulls any relevant info from the\n // diagram element\n if (newElement) {\n newElement.fromElement(element);\n }\n return newElement;\n }\n\n /**\n * @method queries()\n * return an array of all the ABObjectQuery(s).\n * @param {fn} filter\n * a filter fn to return a set of ABObjectQuery(s) that this fn\n * returns true for.\n * @return {array}\n * array of ABObjectQuery\n */\n queries(filter = () => true) {\n return (this._allQueries || []).filter(filter);\n }\n // queriesAll() {\n // console.error(\n // \"ABFactory.queriesAll() Depreciated! Use .queries() instead. \"\n // );\n // return this.queries();\n // }\n\n /**\n * @method queryByID()\n * return the specific query requested by the provided id.\n * NOTE: this method has been extended to allow .name and .label\n * as possible lookup values.\n * @param {string} ID\n * @return {ABObjectQuery}\n */\n queryByID(ID) {\n return this.queries((q) => {\n return q.id == ID || q.name == ID || q.label == ID;\n })[0];\n }\n\n /**\n * @method queryNew()\n * return an instance of a new (unsaved) ABObjectQuery that is tied to this\n * ABFactory.\n * @return {ABObjectQuery}\n */\n queryNew(values) {\n return new ABObjectQuery(values, this);\n }\n\n /**\n * @method rowfilterNew()\n * return an instance of a new RowFilter that is tied to this\n * ABFactory.\n * @return {RowFilter}\n */\n rowfilterNew(App, idBase) {\n if (App) {\n console.error(\"!! Who is calling this with an App?\");\n }\n return new RowFilter(App || this._App, idBase, this);\n }\n\n /**\n * @method filterComplexNew()\n * return an instance of a new FilterComplex that is tied to this\n * ABFactory.\n * @return {FilterComplex}\n */\n filterComplexNew(idBase, options = {}) {\n return new FilterComplex(idBase, this, options);\n }\n\n /**\n * @method viewNewDetatched()\n * Return an instance of a View that is NOT attached to an ABApplication.\n * @return {ABViewXXX}\n */\n viewNewDetatched(values) {\n if (!this._mockApp) {\n this._mockApp = this.applicationNew({});\n }\n return this._mockApp.viewNew(values, this._mockApp);\n }\n\n //\n // Utilities\n //\n\n /**\n * notify()\n * will send alerts to a group of people. These alerts are usually about\n * configuration errors, or software problems.\n * @param {string} domain\n * which group of people we are sending a notification to.\n * @param {Error} error\n * An error object generated at the point of issue.\n * @param {json} info\n * Additional related information concerning the issue.\n */\n notify(/* ...params */) {\n console.error(\n \"ABFactory.notify() is expected to be overwritten by the platform!\"\n );\n }\n\n /**\n * notifyInfo()\n * a common routine to parse the info parameter provided to .notify() into\n * a more detailed set of data.\n * @param {json} info\n * @return {json}\n */\n _notifyInfo(info) {\n var moreInfo = {};\n\n if (info) {\n Object.keys(info).forEach((k) => {\n switch (k) {\n case \"field\":\n moreInfo.objectID = info[k].object?.id;\n moreInfo.objectName = info[k].object?.name;\n moreInfo.fieldID = info[k].id;\n moreInfo.fieldName = info[k].label || info[k].name;\n break;\n\n case \"object\":\n moreInfo.objectID = info[k].id;\n moreInfo.objectName = info[k].name;\n break;\n\n case \"datacollection\":\n moreInfo.datacollectionID = info[k].id;\n moreInfo.datacollectionName = info[k].label || info[k].name;\n var ds = info[k].datasource;\n if (ds) {\n moreInfo.datacollectionDSID = ds.id;\n moreInfo.datacollectionDSName = ds.name;\n }\n break;\n\n case \"process\":\n moreInfo.processID = info[k].id;\n moreInfo.processName = info[k].label || info[k].name;\n break;\n\n case \"req\":\n moreInfo.req = {\n jobID: info[k].jobID,\n tenantID: info[k]._tenantID,\n user: info[k]._user,\n };\n break;\n\n case \"task\":\n if (info[k].process) {\n moreInfo.processID = info[k].process.id;\n moreInfo.processName =\n info[k].process.label || info[k].process.name;\n }\n moreInfo.taskID = info[k].id;\n moreInfo.taskName = info[k].label || info[k].name;\n break;\n\n case \"view\":\n if (info[k].application) {\n moreInfo.applicationID = info[k].application.id;\n moreInfo.applicationName =\n info[k].application.label || info[k].application.name;\n }\n moreInfo.viewID = info[k].id;\n moreInfo.viewName = info[k].label || info[k].name;\n moreInfo.viewKey = info[k].key;\n break;\n default:\n moreInfo[k] = info[k];\n break;\n }\n });\n }\n\n return moreInfo;\n }\n}\n\nmodule.exports = ABFactory;\n","/*\n * ABFieldManager\n *\n * An interface for managing the different ABFields available in our AppBuilder.\n *\n */\n\n/*\n * Fields\n * A name => ABField hash of the different ABFields available.\n */\nvar Fields = {};\n\nvar AllFieldClasses = [\n require(\"../platform/dataFields/ABFieldString\"),\n require(\"../platform/dataFields/ABFieldLongText\"),\n require(\"../platform/dataFields/ABFieldNumber\"),\n require(\"../platform/dataFields/ABFieldDate\"),\n require(\"../platform/dataFields/ABFieldDateTime\"),\n require(\"../platform/dataFields/ABFieldBoolean\"),\n require(\"../platform/dataFields/ABFieldList\"),\n require(\"../platform/dataFields/ABFieldTree\"),\n require(\"../platform/dataFields/ABFieldEmail\"),\n require(\"../platform/dataFields/ABFieldFile\"),\n require(\"../platform/dataFields/ABFieldImage\"),\n require(\"../platform/dataFields/ABFieldUser\"),\n require(\"../platform/dataFields/ABFieldConnect\"),\n require(\"../platform/dataFields/ABFieldCalculate\"),\n require(\"../platform/dataFields/ABFieldTextFormula\"),\n require(\"../platform/dataFields/ABFieldFormula\"),\n require(\"../platform/dataFields/ABFieldAutoIndex\"),\n require(\"../platform/dataFields/ABFieldJson\"),\n require(\"../platform/dataFields/ABFieldCombine\"),\n require(\"../platform/dataFields/ABFieldSelectivity\"),\n];\n\nAllFieldClasses.forEach((FIELD) => {\n Fields[FIELD.defaults().key] = FIELD;\n});\n\nmodule.exports = class ABFieldManager {\n /*\n * @function allFields\n * return all the currently defined ABFields in an array.\n * @return [{ABField},...]\n */\n static allFields() {\n var fields = [];\n for (var f in Fields) {\n fields.push(Fields[f]);\n }\n return fields;\n }\n\n /**\n * @function fieldByKey()\n * Return a specific ABField that matches the given key\n * @param {string} key\n * The ABField.key value we are looking for.\n * @return {ABFieldXXX || undefined}\n */\n static fieldByKey(key) {\n return Fields[key];\n }\n\n /*\n * @function newField\n * return an instance of an ABField based upon the values.key value.\n * @return {ABField}\n */\n static newField(values, object) {\n if (values.key) {\n try {\n return new Fields[values.key](values, object);\n } catch (err) {\n console.log(\"Error\", err);\n console.log(\"Available fields\", Fields);\n console.log(\"Requested field\", values.key);\n }\n } else {\n console.log(\"-------\");\n console.log(\"values:\");\n console.error(values);\n console.log();\n console.error(\"object:\");\n console.error(object);\n console.log(\"-------\");\n throw new Error(\n `ABFieldManager.newField(): Unknown Field Key [${values.name}][${values.key}] for object[${object.name}]`\n );\n //// TODO: what to do here?\n }\n }\n};\n","// import ABApplication from \"./ABApplication\"\n\nvar ABMLClass = require(\"../platform/ABMLClass\");\nconst _concat = require(\"lodash/concat\");\n\nmodule.exports = class ABHintCore extends ABMLClass {\n constructor(attributes, AB) {\n super([\"name\", \"description\"], AB);\n\n this.fromValues(attributes);\n\n // indicate we are ready.\n // this.elements().forEach((e) => {\n // e.onProcessReady();\n // });\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n description: 'description',\n type: 'hint',\n settings: {\n active: {boolean},\n view: uuid\n }\n }\n */\n\n let active = attributes?.settings?.active ?? \"1\";\n\n this.id = attributes?.id || \"\";\n this.name = attributes?.name || \"New Tutorial\";\n this.description = attributes?.description || \"\";\n this.type = attributes?.type || \"hint\";\n this.settings = {};\n this.settings.active = active;\n this.settings.transition = attributes?.settings?.transition;\n this.settings.showIntroStep = attributes?.settings?.showIntroStep;\n this.settings.view = attributes?.settings?.view || \"\";\n this.stepIDs = attributes?.stepIDs || [];\n\n let currSteps = this?._steps || {};\n this._steps = {};\n (attributes?.stepIDs || []).forEach((sID) => {\n if (!sID) return;\n var ele = this.AB.stepNew(sID, this.id);\n if (ele) {\n this._steps[sID] = ele;\n }\n });\n if (attributes) super.fromValues(attributes); // perform translation on this object.\n // NOTE: keep this at the end of .fromValues();\n\n if (!this.label) {\n this.label = this.name;\n }\n }\n\n /**\n * @method toObj()\n * properly compile the current state of this ABProcess instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n toObj() {\n // default label value\n if (!this.label) {\n this.label = this.name;\n }\n\n // OP.Multilingual.unTranslate(this, this, [\"label\"]);\n var data = super.toObj();\n\n var fieldsToSave = [\"type\", \"settings\", \"stepIDs\", \"id\", \"name\"];\n fieldsToSave.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n\n /**\n * steps()\n * return an array of steps that match the given filter (or all steps\n * if no filter is provided).\n * @param {fn} fn an iterator that returns true if the provided element\n * should be returned.\n * @return {[ABStep]}\n */\n steps(fn = () => true) {\n var allSteps = Object.keys(this._steps).map((e) => {\n return this._steps[e];\n });\n return allSteps.filter(fn);\n }\n\n /**\n * stepAdd()\n * insert a step to be added to this hint.\n * @param {ABStep} element\n * the full instance of an ABStep to track.\n */\n stepAdd(step) {\n this._steps[step.id] = step;\n }\n\n /**\n * stepByID()\n * return the {ABStep} that has the given .id\n * @param {string} id\n * @return {ABStep[OBJ]}\n */\n stepByID(id) {\n return this._steps[id] ?? null;\n }\n\n /**\n * stepRemove()\n * remove a step from being displayed by this hint.\n * @param {id} ABStep ID\n * an ID of a step\n * to remove.\n */\n stepRemove(id) {\n // remove from stepIDs array\n let stepIndex = this.stepIDs.indexOf(id);\n if (stepIndex > -1) {\n this.stepIDs.splice(stepIndex, 1);\n }\n // remove from _steps definitions\n delete this._steps[id];\n }\n};\n","const ABMLClass = require(\"../platform/ABMLClass\");\n\nmodule.exports = class ABIndexCore extends ABMLClass {\n constructor(attributes, object) {\n super([\"label\"], object.AB);\n this.object = object;\n\n this.fromValues(attributes);\n }\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n fields:[\n {ABDataField.id}\n ],\n unique: {boolean}\n }\n */\n this.id = attributes.id;\n this.type = \"index\";\n this.name = attributes.name;\n this.unique = JSON.parse(attributes.unique || false);\n\n // Convert to an array\n if (attributes.fieldIDs && !Array.isArray(attributes.fieldIDs)) {\n attributes.fieldIDs = [attributes.fieldIDs];\n }\n\n this._unknownFieldIDs = [];\n this.fields = (attributes.fieldIDs || [])\n .map((f) => {\n let field = this.object.fieldByID(f);\n if (!field) {\n this._unknownFieldIDs.push(f);\n let err = new Error(\n `Index[${this.name}][${this.id}] is referencing an unknown field[${f}]`\n );\n this.AB.notify.developer(err, {\n index: this.id,\n field: f,\n });\n }\n return field;\n })\n .filter((fId) => fId);\n\n if (this.fields.length == 0) {\n let err = new Error(\n `Index[${this.name}][${this.id}] is not referencing any fields`\n );\n this.AB.notify.developer(err, {\n index: this.id,\n attributeFieldIDs: attributes.fieldIDs || [],\n });\n }\n\n // let the MLClass process the Translations\n super.fromValues(attributes);\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n let result = super.toObj();\n\n result.id = this.id;\n result.type = \"index\";\n result.name = this.name;\n result.unique = this.unique;\n\n // Convert to an array\n if (this.fields && !Array.isArray(this.fields)) {\n this.fields = [this.fields];\n }\n\n result.fieldIDs = (this.fields || [])\n .map((f) => {\n // Convert to the id of field\n return f.id || f;\n })\n .filter((fId) => fId);\n\n // carry along the unknown Field IDs so a\n // developer/builder can come along and trace\n // what happened.\n this._unknownFieldIDs.forEach((f) => {\n result.fieldIDs.push(f);\n });\n\n return result;\n }\n\n get indexName() {\n let tableName = this.object.dbTableName();\n\n // Maximum 64 characters long\n return `${tableName}_${this.name}`.replace(/ /g, \"\").substring(0, 64);\n }\n\n get uniqueName() {\n let indexName = this.indexName.substring(0, 57);\n\n return `${indexName}_unique`;\n }\n};\n","/**\n * ABMLClassCore\n * manage the multilingual information of an instance of a AB Defined Class.\n *\n * these classes have certain fields (\"label\", \"description\"), that can be\n * represented in different language options as defined by our platform.\n *\n * This core ABMLClass will internally track the multilingual fields\n * (this.mlFields) and auto\n */\nvar ABEmitter = require(\"../platform/ABEmitter\");\nmodule.exports = class ABMLClassCore extends ABEmitter {\n constructor(fieldList, AB) {\n super();\n this.mlFields = fieldList || [\"label\"];\n // {array}\n // field names of values that are multilingual\n\n this.AB = AB;\n // {ABFactory}\n // our common source of references for other AB objects\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n /**\n * @method fromValues\n * called during the .fromValues() work chain. Should be called\n * AFTER all the current data is already populated.\n */\n fromValues(attributes) {\n this.translations = attributes.translations;\n\n // if translations were provided\n if (this.translations) {\n // multilingual fields: label, description\n this.translate();\n } else {\n // maybe this came from a form that has ML values in the attributes, but\n // no .translations[] yet:\n // check for mlFields in attributes and record them here:\n (this.mlFields || []).forEach((field) => {\n if (attributes[field]) {\n this[field] = attributes[field];\n }\n });\n }\n }\n\n /**\n * @function defaultTranslations()\n * return an initial .translations entry to initialize the\n * translations values of a given translateable object.\n * @param {array} fields the multilingual fields this obj manages.\n * @param {json} values a default set of values for this object.\n * @return {array} of translation entries.\n */\n defaultTranslations(fields, values) {\n values = values || {};\n\n var entry = {\n // Question: should this be this.AB.Multilingual.currentLanguage() || \"en\"\n // currently since the defaults are sent in programattically, we are\n // expecting the labels to be in \"en\"\n language_code: \"en\",\n };\n\n fields.forEach((f) => {\n entry[f] = values[f] || f;\n });\n\n return [entry];\n }\n\n /**\n * @method languageDefault\n * return a default language code.\n * @return {string}\n */\n languageDefault() {\n return \"en\";\n }\n\n /**\n * @method toObj()\n * called during the .toObj() work chain. Should be called\n * BEFORE the current data is populated.\n */\n toObj() {\n this.unTranslate();\n\n return {\n translations: this.translations,\n };\n }\n\n /**\n * @method toDefinition()\n * convert this instance into an ABDefinition object.\n * @return {ABDefinition}\n */\n toDefinition() {\n return this.AB.definitionNew({\n id: this.id,\n name: this.name,\n type: this.type,\n json: this.toObj(),\n });\n }\n\n /**\n * @method translate\n * Given a set of json data, pull out any multilingual translations\n * and flatten those values to the base object.\n * @param {obj} obj The instance of the object being translated\n * @param {json} json The json data being used for translation.\n * There should be json.translations = [ {transEntry}, ...]\n * where transEntry = {\n * language_code:'en',\n * field1:'value',\n * ...\n * }\n * @param {array} fields an Array of multilingual fields to pull to\n * the obj[field] value.\n */\n translate(obj, json, fields, languageCode = null) {\n if (!obj) obj = this;\n if (!json) json = this;\n if (!fields) fields = this.mlFields || [];\n\n if (!json.translations) {\n json.translations = [];\n }\n\n if (typeof json.translations == \"string\") {\n json.translations = JSON.parse(json.translations);\n }\n\n var currLanguage = languageCode || this.languageDefault();\n\n if (fields && fields.length > 0) {\n // [fix] if no matching translation is in our json.translations\n // object, then just use the 1st one.\n var first = null; // the first translation entry encountered\n var found = false; // did we find a matching translation?\n\n json.translations.forEach(function (t) {\n if (!first) first = t;\n\n // find the translation for the current language code\n if (t.language_code == currLanguage) {\n found = true;\n\n // copy each field to the root object\n fields.forEach(function (f) {\n if (t[f] != null) obj[f] = t[f];\n\n obj[f] = t[f] || \"\"; // default to '' if not found.\n });\n }\n });\n\n // if !found, then use the 1st entry we did find. prepend desired\n // [language_code] to each of the fields.\n if (!found && first) {\n // copy each field to the root object\n fields.forEach(function (f) {\n if (first[f] != null && first[f] != \"\")\n obj[f] = `[${currLanguage}]${first[f]}`;\n else obj[f] = \"\"; // default to '' if not found.\n });\n }\n }\n }\n\n /**\n * @method unTranslate\n * Take the multilingual information in the base obj, and push that\n * down into the json.translations data.\n * @param {obj} obj The instance of the object with the translation\n * @param {json} json The json data being used for translation.\n * There should be json.translations = [ {transEntry}, ...]\n * where transEntry = {\n * language_code:'en',\n * field1:'value',\n * ...\n * }\n * @param {array} fields an Array of multilingual fields to pull from\n * the obj[field] value.\n */\n unTranslate(obj, json, fields) {\n if (!obj) obj = this;\n if (!json) json = this;\n if (!fields) fields = this.mlFields || [];\n\n if (!json.translations) {\n json.translations = [];\n }\n\n var currLanguage = this.languageDefault();\n\n if (fields && fields.length > 0) {\n var foundOne = false;\n\n json.translations.forEach(function (t) {\n // find the translation for the current language code\n if (t.language_code == currLanguage) {\n // copy each field to the root object\n fields.forEach(function (f) {\n // verify obj[f] is defined\n // --> DONT erase the existing translation\n if (obj[f] != null) {\n t[f] = obj[f];\n }\n });\n\n foundOne = true;\n }\n });\n\n // if we didn't update an existing translation\n if (!foundOne) {\n // create a translation entry:\n var trans = {};\n\n // assume current languageCode:\n trans.language_code = currLanguage;\n\n fields.forEach(function (field) {\n if (obj[field] != null) {\n trans[field] = obj[field];\n }\n });\n\n json.translations.push(trans);\n }\n }\n }\n};\n","//\n// ABModelCore\n//\n// Represents the Data interface for an ABObject data.\n//\n// to use an ABModel to load a DataTable:\n// Method 1:\n// gather all the data externally and send to the DataTable\n// Model.findAll()\n// .then((data)=>{\n// DataTable.parse(data);\n// })\n//\n\n// const { isArray } = require(\"lodash\");\n\nmodule.exports = class ABModelCore {\n constructor(object) {\n // link me to my ABObject\n this.object = object;\n this.AB = object.AB;\n\n this._where = null;\n this._sort = null;\n this._skip = null;\n this._limit = null;\n\n this.staleRefreshInProcess = false;\n this.staleRefreshMap = {\n /* id : Promise */\n };\n this.staleRefreshPending = [];\n this.staleRefreshTimerID = null;\n\n // include this\n this.responseContext = { key: \"--\", context: {} };\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n ///\n /// Instance Methods\n ///\n\n contextKey(key) {\n this.responseContext.key = key || \"--\";\n }\n\n contextValues(values) {\n this.responseContext.context = values || {};\n }\n\n // Prepare multilingual fields to be untranslated\n // Before untranslating we need to ensure that values.translations is set.\n prepareMultilingualData(values) {\n // if this object has some multilingual fields, translate the data:\n var mlFields = this.object.multilingualFields();\n // if mlFields are inside of the values saved we want to translate otherwise do not because it will reset the translation field and you may loose unchanged translations\n var shouldTranslate = false;\n if (mlFields.length) {\n mlFields.forEach(function (field) {\n if (values[field] != null) {\n shouldTranslate = true;\n }\n });\n }\n if (shouldTranslate) {\n if (\n values.translations == null ||\n typeof values.translations == \"undefined\" ||\n values.translations == \"\"\n ) {\n values.translations = [];\n }\n this.object.unTranslate(values, values, mlFields);\n }\n }\n\n request(/* method, params */) {\n console.error(\n \"!!! ABModelCore.request() should be overridden by platform.\"\n );\n return Promise.resolve();\n }\n\n // /**\n // * @method create\n // * update model values on the server.\n // */\n // create(values) {\n\n // this.prepareMultilingualData(values);\n\n // var params = {\n // url: this.object.urlRest(),\n // params: values\n // }\n // return this.request('post', params)\n // .then((data) => {\n\n // this.normalizeData(data);\n\n // return data;\n\n // // FIX: now with sockets, the triggers are fired from socket updates.\n // // trigger a create event\n // // triggerEvent('create', this.object, data);\n\n // })\n // .catch(reject);\n\n // }\n\n /**\n * @method delete\n * remove this model instance from the server\n * @param {integer} id the .id of the instance to remove.\n * @return {Promise}\n */\n // delete(id) {\n\n // var params = {\n // url: this.object.urlRestItem(id)\n // }\n // return this.request('delete', params)\n // .then((data) => {\n\n // return data;\n\n // // FIX: now with sockets, the triggers are fired from socket updates.\n // // trigger a delete event\n // // triggerEvent('delete', this.object, id);\n\n // })\n // }\n\n /**\n * @method findAll\n * performs a data find with the provided condition.\n */\n // findAll(cond) {\n\n // cond = cond || {};\n\n // var params = {\n // url: this.object.urlRest(),\n // params: cond\n // }\n // return this.request('get', params)\n // .then((data) => {\n\n // this.normalizeData(data.data);\n\n // resolve(data);\n // })\n // .catch((err) => {\n // /// TODO: this should be done in platform/ABModel:\n // // if (err && err.code) {\n // // switch(err.code) {\n // // case \"ER_PARSE_ERROR\":\n // // OP.Error.log('AppBuilder:ABModel:findAll(): Parse Error with provided condition', { error: err, condition:cond })\n // // break;\n\n // // default:\n // // OP.Error.log('AppBuilder:ABModel:findAll(): Unknown Error with provided condition', { error: err, condition:cond })\n // // break;\n // // }\n\n // // }\n // console.error(err);\n // })\n\n // }\n\n urlParamsCreate(values) {\n return {\n url: this.object.urlRest(),\n params: values,\n };\n }\n\n urlParamsDelete(id) {\n return {\n url: this.object.urlRestItem(id),\n };\n }\n\n urlParamsFind(cond) {\n return {\n url: this.object.urlRest(),\n params: cond || {},\n };\n }\n\n urlParamsUpdate(id, values) {\n return {\n url: this.object.urlRestItem(id),\n params: values,\n };\n }\n\n /**\n * @method count\n * count a data find with the provided condition.\n */\n count(cond) {\n cond = cond || {};\n\n var params = {\n url: this.object.urlRestCount(),\n params: cond,\n };\n return this.request(\"get\", params)\n .then((numberOfRows) => {\n // resolve(numberOfRows);\n return numberOfRows;\n })\n .catch((err) => {\n // TODO: this should be done in platform/ABModel\n\n // OP.Error.log('AppBuilder:ABModel:count(): Parse Error with provided condition', { error: err, condition:cond })\n\n // reject(err);\n console.error(err);\n });\n }\n\n /**\n * @method staleRefresh\n * Process a request to refresh the data for a given entry.\n * This method is called from a ABDataview when it receives\n * a 'ab.datacollection.stale' message.\n * This method will try to queue similar reqeusts and then issue 1 large\n * request, rather than numerous individual ones.\n * @param {obj} cond the condition of the entry we are requesting.\n * @return {Promise}\n */\n staleRefresh(cond) {\n // cond should be { where:{ id: X } } format.\n var PK = this.object.PK();\n\n var currID = cond[PK]; // just in case we get a { id: X }\n if (cond.where) {\n currID = cond.where[PK];\n }\n\n return new Promise((resolve, reject) => {\n if (!currID) {\n var Err = new Error(\n \"Model.staleRefresh(): could not resolve .\" + PK\n );\n Err.cond = cond;\n reject(Err);\n return;\n }\n\n // convert to PK : Promise object:\n var entry = {\n resolve: resolve,\n reject: reject,\n };\n entry[PK] = currID;\n\n // queue up refresh condition\n this.staleRefreshPending.push(entry);\n\n // if ! staleRefreshInProcess\n if (!this.staleRefreshInProcess) {\n // set timeout to another 200ms wait after LAST staleRefresh()\n if (this.staleRefreshTimerID) {\n clearTimeout(this.staleRefreshTimerID);\n }\n this.staleRefreshTimerID = setTimeout(() => {\n this.staleRefreshProcess();\n }, 200);\n }\n });\n }\n\n /**\n * @method staleRefreshProcess\n * Actually process the current pending requests.\n */\n staleRefreshProcess() {\n this.staleRefreshInProcess = true;\n var currentEntries = this.staleRefreshPending;\n this.staleRefreshPending = [];\n var PK = this.object.PK();\n\n var responseHash = {\n /* id : [{entry}] */\n };\n var cond = { where: {}, populate: true };\n cond.where[PK] = [];\n\n console.log(\n \"Model.staleRefreshProcess(): buffered \" +\n currentEntries.length +\n \" requests\"\n );\n currentEntries.forEach((e) => {\n responseHash[e[PK]] = responseHash[e[PK]] || [];\n responseHash[e[PK]].push(e);\n });\n\n cond.where[PK] = Object.keys(responseHash);\n\n this.findAll(cond).then((res) => {\n // for each entry we got back\n if (Array.isArray(res.data) && res.data.length) {\n res.data.forEach((data) => {\n // find it's matching request:\n if (responseHash[data[PK]]) {\n // respond to the pending promise\n // and remove these entries from responseHash\n var entries = responseHash[data[PK]];\n entries.forEach((entry) => {\n var resolve = entry.resolve;\n resolve({ data: [data] });\n });\n\n delete responseHash[data[PK]];\n } else {\n console.error(\n \"Model.staleRefreshProcess(): returned entry was not in our responseHash:\",\n data,\n responseHash\n );\n }\n });\n }\n\n // now if there are any entries left in responseHash,\n // respond with an empty entry:\n var allKeys = Object.keys(responseHash);\n if (allKeys.length > 0) {\n console.warn(\n \"Model.staleRefreshProcess(): \" +\n allKeys.length +\n \" entries with no responses. \"\n );\n }\n allKeys.forEach((key) => {\n let entry = responseHash[key];\n let resolve;\n if (Array.isArray(entry)) {\n resolve = entry[0].resolve;\n } else {\n resolve = entry.resolve;\n }\n resolve({ data: [] });\n delete responseHash[key];\n });\n\n // now check to see if there are any more pending requests:\n if (this.staleRefreshPending.length > 0) {\n // process them:\n this.staleRefreshProcess();\n } else {\n // mark we are no longer processing stale requests.\n this.staleRefreshInProcess = false;\n }\n });\n }\n\n /**\n * @method findConnected\n * return the connected data associated with an instance of this model.\n *\n * to limit the result to only a single connected column:\n * model.findConnected( 'col1', {data})\n * then ((data) => {\n * // data = [{obj1}, {obj2}, ... {objN}]\n * })\n *\n * To find >1 connected field data:\n * model.findConnected( ['col1', 'col2'], {data} )\n * .then((data) =>{\n * \n * // data = {\n * // col1 : [{obj1}, {obj2}, ... {objN}],\n * // col2 : [{obj1}, {obj2}, ... {objN}]\n * // }\n * })\n *\n * To find all connected field data:\n * model.findConnected( {data} )\n * .then((data) =>{\n * \n * // data = {\n * // connectedColName1 : [{obj1}, {obj2}, ... {objN}],\n * // connectedColName2 : [{obj1}, {obj2}, ... {objN}],\n * // ...\n * // connectedColNameN : [{obj1}, {obj2}, ... {objN}]\n * // }\n * })\n\n * @param {string/array} fields [optional] an array of connected fields you want to return.\n * @param {obj} data the current object instance (data) to lookup\n * @return {Promise}\n */\n findConnected(fields, data) {\n if (typeof data == \"undefined\") {\n if (!Array.isArray(fields) && typeof fields == \"object\") {\n data = fields;\n fields = []; // return all fields\n }\n }\n\n if (typeof fields == \"string\") {\n fields = [fields]; // convert to an array of values\n }\n\n return new Promise((resolve, reject) => {\n // sanity checking:\n if (!data.id) {\n // I can't find any connected items, if I can't find this one:\n resolve(null);\n return;\n }\n\n let cond = {};\n cond[this.object.PK()] = data.id;\n this.findAll({ where: cond, populate: true })\n .then((results) => {\n if (\n !results.data ||\n !Array.isArray(results.data) ||\n results.data.length == 0\n ) {\n resolve([]); // no data to return.\n return;\n }\n\n // work with the first object.\n var myObj = results.data[0];\n\n // if only 1 field requested, then return that\n if (fields.length == 1) {\n let data =\n myObj[\n fields[0].replace(/[^a-z0-9.]/gi, \"\") + \"__relation\"\n ];\n if (!data) return resolve([]);\n\n if (!Array.isArray(data)) data = [data];\n\n resolve(data);\n return;\n }\n\n // if no fields requested, return them all:\n if (fields.length == 0) {\n var allFields = this.object.fields((f) => {\n return f.settings.linkType;\n });\n allFields.forEach((f) => {\n fields.push(f.columnName);\n });\n }\n\n var returnData = {};\n fields.forEach((colName) => {\n returnData[colName] =\n myObj[colName.replace(/[^a-z0-9.]/gi, \"\") + \"__relation\"];\n });\n\n resolve(returnData);\n })\n .catch((err) => {\n console.error(\"!!! error with findConnected() attempt:\", err);\n reject(err);\n });\n });\n }\n\n // /**\n // * @method loadInto\n // * loads the current values into the provided Webix DataTable\n // * @param {DataTable} DT A Webix component that can dynamically load data.\n // */\n // loadInto(DT) {\n\n // // if a limit was applied, then this component should be loading dynamically\n // if (this._limit) {\n\n // DT.define('datafetch', this._limit);\n // DT.define('datathrottle', 250); // 250ms???\n\n // // catch the event where data is requested:\n // // here we will do our own findAll() so we can persist\n // // the provided .where condition.\n\n // // oh yeah, and make sure to remove any existing event handler when we\n // // perform a new .loadInto()\n // DT.___AD = DT.___AD || {};\n // if (DT.___AD.onDataRequestEvent) {\n // DT.detachEvent(DT.___AD.onDataRequestEvent);\n // }\n // DT.___AD.onDataRequestEvent = DT.attachEvent(\"onDataRequest\", (start, count) => {\n\n // var cond = {\n // where: this._where,\n // sort: this._sort,\n // limit: count,\n // skip: start\n // }\n\n // if (DT.showProgress)\n // DT.showProgress({ type: \"icon\" });\n\n // this.findAll(cond)\n // .then((data) => {\n // data.data.forEach((item) => {\n // if (item.properties != null && item.properties.height != \"undefined\" && parseInt(item.properties.height) > 0) {\n // item.$height = parseInt(item.properties.height);\n // } else if (parseInt(this._where.height) > 0) {\n // item.$height = parseInt(this._where.height)\n // }\n // });\n // DT.parse(data);\n\n // if (DT.hideProgress)\n // DT.hideProgress();\n\n // })\n\n // return false; // <-- prevent the default \"onDataRequest\"\n // });\n\n // DT.refresh();\n // }\n\n // // else just load it all at once:\n // var cond = {};\n // if (this._where) cond.where = this._where;\n // if (this._sort) cond.sort = this._sort;\n // if (this._limit != null) cond.limit = this._limit;\n // if (this._skip != null) cond.skip = this._skip;\n\n // if (DT.showProgress)\n // DT.showProgress({ type: \"icon\" });\n\n // this.findAll(cond)\n // .then((data) => {\n // data.data.forEach((item) => {\n // if (item.properties != null && item.properties.height != \"undefined\" && parseInt(item.properties.height) > 0) {\n // item.$height = parseInt(item.properties.height);\n // } else if (parseInt(this._where.height) > 0) {\n // item.$height = parseInt(this._where.height)\n // }\n // });\n // DT.parse(data);\n\n // if (DT.hideProgress)\n // DT.hideProgress();\n\n // })\n // .catch((err) => {\n // console.error('!!!!!', err);\n // })\n\n // }\n\n // /**\n // * @method limit\n // * set the limit value for this set of data\n // * @param {integer} limit the number or elements to return in this call\n // * @return {ABModel} this object that is chainable.\n // */\n // limit(limit) {\n // this._limit = limit;\n // return this;\n // }\n\n // /**\n // * @method skip\n // * set the skip value for this set of data\n // * @param {integer} skip the number or elements to skip\n // * @return {ABModel} this object that is chainable.\n // */\n // skip(skip) {\n // this._skip = skip;\n // return this;\n // }\n\n // /**\n // * @method update\n // * update model values on the server.\n // */\n // update(id, values) {\n\n // this.prepareMultilingualData(values);\n\n // // remove empty properties\n // for (var key in values) {\n // if (values[key] == null)\n // delete values[key];\n // }\n\n // var params = {\n // url: this.object.urlRestItem(id),\n // params: values\n // }\n // return this.request('put', params)\n // .then((data) => {\n\n // // .data is an empty object ??\n\n // this.normalizeData(data);\n\n // return data;\n\n // // FIX: now with sockets, the triggers are fired from socket updates.\n // // trigger a update event\n // // triggerEvent('update', this.object, data);\n\n // })\n // .catch((err)=>{\n // console.error(err);\n // });\n\n // }\n\n /**\n * @method upsert\n * upsert model values on the server.\n */\n upsert(values) {\n this.prepareMultilingualData(values);\n\n // remove empty properties\n for (var key in values) {\n if (values[key] == null) delete values[key];\n }\n\n var params = {\n url: this.object.urlRest(),\n params: values,\n };\n return this.request(\"put\", params)\n .then((data) => {\n // .data is an empty object ??\n\n this.normalizeData(data);\n\n return data;\n\n // FIX: now with sockets, the triggers are fired from socket updates.\n // trigger a update event\n // triggerEvent('update', this.object, data);\n })\n .catch((err) => {\n console.error(err);\n });\n }\n\n /**\n * @method where\n * set the where condition for the data being loaded.\n * @param {json} cond the json condition statement.\n * @return {ABModel} this object that is chainable.\n */\n where(cond) {\n this._where = cond;\n return this;\n }\n\n /**\n * @method where\n * set the sort condition for the data being loaded.\n * @param {json} cond the json condition statement.\n * @return {ABModel} this object that is chainable.\n */\n sort(cond) {\n this._sort = cond;\n return this;\n }\n\n /**\n * @method refresh\n * refresh model definition on the server.\n */\n refresh() {\n console.error(\"!!! Depreciated: where is this being called from?\");\n return Promise.resolve();\n\n // var params = {\n // url: this.object.urlRestRefresh(),\n // };\n // return this.request(\"put\", params);\n }\n\n /**\n * @method isCsvPacked\n * check if the data is packed in a csv format\n * @param {json} data the json condition statement.\n * @return {boolean} true if the data is packed in a csv format\n * false if the data is not packed in a csv format\n */\n isCsvPacked(data) {\n if (data.csv_packed) {\n return true;\n }\n return false;\n }\n\n csvPackPrepareFirstRow(myObject, content) {\n const firstRow = content[0];\n\n // Note: CSV will refer to the columns at the first row in a list to generate CSV columns.\n // if the first row were missing somecolumns and the next rows has those columns.\n // they will lost those columns and values\n if (firstRow) {\n const columnNames = Object.keys(firstRow);\n for (const missingField of myObject.fields(\n (f) => columnNames.indexOf(f.columnName) === -1\n ))\n firstRow[missingField.columnName] = undefined;\n }\n }\n\n csvPackStringifyFields(myObject, content) {\n // stringify any potential json data\n // starting with List data\n let keys = [\"list\", \"json\"];\n let stringifyFields = myObject.fields((f) => keys.indexOf(f.key) > -1);\n stringifyFields.forEach((f) => {\n for (let I = 0; I < content.length; I++) {\n let row = content[I];\n if (row[f.columnName]) {\n row[f.columnName] = JSON.stringify(row[f.columnName]);\n }\n }\n });\n }\n\n csvPackMergeRelations(relations, id, connHash) {\n relations[id] = this.AB.defaultsDeep(relations[id] || {}, connHash);\n }\n\n csvPackGetRelations(myObject, content, visited = new Set()) {\n let relations = {\n /* objectID: { row.id: entryJSON} */\n };\n\n // Check for circular reference\n if (visited.has(myObject.id)) {\n console.warn(`Circular reference detected for object ${myObject.id}`);\n return relations;\n }\n visited.add(myObject.id);\n\n // break out and compact the connected data\n let connections = myObject.connectFields();\n connections.forEach((connField) => {\n let connHash = {};\n let relationName = connField.relationName();\n\n // gather all the connected data for this field\n for (let I = 0; I < content.length; I++) {\n let row = content[I];\n if (row[relationName]) {\n if (Array.isArray(row[relationName])) {\n row[relationName].forEach((r) => {\n let rval = connField.getRelationValue(r);\n if (rval != null && !connHash[rval]) {\n connHash[rval] = r;\n }\n });\n } else {\n let r = row[relationName];\n let rval = connField.getRelationValue(r);\n if (rval != null && !connHash[rval]) {\n connHash[rval] = r;\n }\n }\n }\n }\n\n let connObject = connField.datasourceLink;\n let values = Object.values(connHash);\n if (values.length > 0) {\n this.csvPackMergeRelations(relations, connObject.id, connHash);\n\n let connRelations = this.csvPackGetRelations(\n connObject,\n values,\n visited\n );\n\n // merge these into my relations\n Object.keys(connRelations).forEach((id) => {\n this.csvPackMergeRelations(relations, id, connRelations[id]);\n });\n }\n });\n visited.delete(myObject.id);\n return relations;\n }\n\n csvPackReIndexRelations(relations) {\n Object.keys(relations).forEach((id) => {\n Object.keys(relations[id]).forEach((cid, indx) => {\n relations[id][cid]._csvID = indx;\n });\n });\n }\n\n csvPackReEncodeRelations(relations, myObject, content) {\n let connections = myObject.connectFields();\n connections.forEach((connField) => {\n let relationName = connField.relationName();\n let connObject = connField.datasourceLink;\n let connHash = relations[connObject.id];\n\n // now reencode the connection data to reference the new _csvID\n for (let I = 0; I < content.length; I++) {\n let row = content[I];\n let ids = [];\n let hasRelationData = false;\n if (row[relationName]) {\n hasRelationData = true;\n if (Array.isArray(row[relationName])) {\n row[relationName].forEach((r) => {\n let rval = connField.getRelationValue(r);\n if (\n rval != null &&\n connHash[rval] &&\n connHash[rval]._csvID != null\n ) {\n ids.push(connHash[rval]._csvID);\n }\n });\n } else {\n let r = row[relationName];\n let rval = connField.getRelationValue(r);\n if (\n rval != null &&\n connHash[rval] &&\n connHash[rval]._csvID != null\n ) {\n ids.push(connHash[rval]._csvID);\n }\n }\n }\n // only make an update if it did have relation data\n if (hasRelationData) {\n row[connField.columnName] = JSON.stringify(ids);\n delete row[relationName];\n }\n }\n });\n }\n\n csvPackFinalModifications(myObject, content) {\n let connPK = myObject.PK();\n const isPKID = connPK === \"id\";\n content.forEach((c) => {\n if (!isPKID && c.id == c[connPK]) {\n delete c.id;\n }\n\n // if translations are present return them to an object\n if (c.translations && typeof c.translations != \"string\") {\n c.translations = JSON.stringify(c.translations);\n }\n });\n }\n\n /**\n * @method csvPack\n * pack the data into a csv format\n * @param {json} data\n * The original data format.\n * {\n * data: [{obj1}, {obj2}, ... {objN}],\n * total_bytes:xx,\n * }\n * @return {json} the csv packed data\n * {\n * csv_packed:{\n * data: \"\",\n * relations: {\n * {connectionID}: \"\",\n * {connectionID}: \"\",\n * ...\n * },\n * },\n * total_bytes:xx,\n * }\n */\n async csvPack(data, batchSize = 10000, jobID) {\n // data should be the original json data packet we want to send\n // {\n // data: [{obj1}, {obj2}, ... {objN}],\n // total_bytes:xx,\n // }\n // we want to convert this to:\n // {\n // csv_packed:{\n // data: \"csv data\",\n // relations: {\n // {connectionID}: \"csv data\", // each entry has entry._csvID, that is the lookup\n // {connectionID}: \"csv data\",\n // ...\n // }\n // total_bytes:xx,\n // }\n\n if (!data || typeof data !== \"object\") {\n throw new Error(\"csvPack: Invalid data parameter\");\n }\n if (data.data === undefined) {\n throw new Error(\"csvPack: data.data is required\");\n }\n\n let packedData = { data: \"\", relations: {} };\n let myObject = this.object;\n\n let content = data.data;\n if (!content || (Array.isArray(content) && content.length === 0)) {\n // Return the original data if there is no content to pack\n // existing code will handle this fine.\n return data;\n }\n this.csvPackPrepareFirstRow(myObject, content);\n\n let returnType = \"array\";\n if (!Array.isArray(content)) {\n returnType = \"single\";\n content = [content];\n }\n content = content.filter((row) => !this.AB.isNil(row));\n\n this.csvPackStringifyFields(myObject, content);\n\n let relations = this.csvPackGetRelations(myObject, content);\n // { objectID: { row.id: entryJSON}}\n\n this.csvPackReIndexRelations(relations);\n\n // now reencode the connection data to reference the new _csvID\n // do this for the main content\n this.csvPackReEncodeRelations(relations, myObject, content);\n this.csvPackFinalModifications(myObject, content);\n\n // do this for the relations as well\n let allIds = Object.keys(relations);\n for (let i = 0; i < allIds.length; i++) {\n let id = allIds[i];\n let relatedObj = this.AB.objectByID(id);\n if (relatedObj) {\n let values = Object.values(relations[id]);\n this.csvPackReEncodeRelations(relations, relatedObj, values);\n this.csvPackFinalModifications(relatedObj, values);\n packedData.relations[id] = await this.AB.jsonToCsvBatched(\n values,\n batchSize,\n jobID\n );\n }\n }\n\n // now convert the data to CSV\n packedData.data = await this.AB.jsonToCsvBatched(\n content,\n batchSize,\n jobID\n );\n packedData.type = returnType; // single or array\n\n let newData = {};\n Object.keys(data).forEach((key) => {\n if (key != \"data\") {\n newData[key] = data[key];\n }\n });\n newData.csv_packed = packedData;\n return newData;\n }\n\n csvUnpackUnstringifyFields(myObject, data) {\n let connPK = myObject.PK();\n let keyFields = [\"list\", \"boolean\", \"number\", \"json\"];\n let parseFields = myObject.fields((f) => keyFields.indexOf(f.key) > -1);\n data.forEach((row) => {\n // unstringify any list,bool,number fields\n parseFields.forEach((f) => {\n let val = row[f.columnName];\n if (val && typeof val == \"string\") {\n try {\n row[f.columnName] = JSON.parse(val);\n } catch (e) {\n // sometimes \"list\" fields are not JSON parseable\n if (f.key != \"list\") {\n console.error(\n \"Error parsing JSON data for column: \" + f.columnName,\n val,\n e\n );\n }\n }\n }\n });\n\n // if translations are present return them to an object\n if (row.translations) {\n try {\n row.translations = JSON.parse(row.translations);\n } catch (e) {\n // just leave it as it is\n }\n }\n\n // readd .id to the row\n if (!row.id) {\n if (row[connPK]) {\n row.id = row[connPK];\n }\n }\n });\n }\n\n csvUnpackReconnectRelations(relations, myObject, data) {\n let connections = myObject.connectFields();\n connections.forEach((connField) => {\n let relationName = connField.relationName();\n\n let relationObject = connField.datasourceLink;\n let connHash = relations[relationObject.id];\n if (connHash) {\n data.forEach((row) => {\n let ids = [];\n let populatedData = [];\n let entries = [];\n if (typeof row[connField.columnName] !== \"undefined\") {\n try {\n // ok, we know this is a possibility, so just skip it\n if (row[connField.columnName] !== \"\") {\n entries = JSON.parse(row[connField.columnName]);\n }\n } catch (e) {\n if (row[connField.columnName] == \"\") {\n // not a problem, just no data\n } else {\n // this might be a situation on the server where\n // row[columnName] has a value, but row[relationName] is empty.\n if (typeof row[relationName] == \"undefined\") {\n row[relationName] = null;\n }\n // console.error(\n // \"Error parsing JSON data for column: \" +\n // connField.columnName,\n // e\n // );\n }\n }\n if (!Array.isArray(entries)) {\n entries = [entries];\n }\n entries.forEach((id) => {\n if (id != null && connHash[id]) {\n let connEntry = connHash[id];\n ids.push(connField.getRelationValue(connEntry));\n // Alternatively, we could remove the row[columnName] and let\n // normalizeData() repopulate it.\n populatedData.push(connEntry);\n } else if (id != null) {\n console.warn(\n `Missing relation entry for _csvID: ${id}`\n );\n }\n });\n if (connField.linkType() == \"many\") {\n row[connField.columnName] = ids;\n row[connField.relationName()] = populatedData;\n } else {\n row[connField.columnName] = ids[0] ?? null;\n row[connField.relationName()] = populatedData[0] ?? null;\n }\n }\n });\n }\n });\n\n // final pass to clear up stringified relation data\n data.forEach((row) => {\n connections.forEach((connField) => {\n // many connections must be an array, not \"[]\"\n if (connField.linkType() == \"many\") {\n let val = row[connField.columnName];\n if (val && typeof val == \"string\") {\n row[connField.columnName] = JSON.parse(val);\n }\n }\n });\n });\n }\n\n csvUnpackClearCSVID(relations) {\n Object.keys(relations).forEach((id) => {\n Object.keys(relations[id]).forEach((cid) => {\n delete relations[id][cid]._csvID;\n });\n });\n }\n\n /**\n * @method csvUnpack\n * unpack the data from our csv format\n * @param {json} data\n * The csv packed data format.\n * @return {json} the unpacked data\n */\n csvUnpack(data) {\n // data should be a data packet returned from the server\n // {\n // csv_packed:{\n // data: \"csv data\",\n // relations: {\n // {connectionID}: \"csv data\", // each entry has entry._csvID, that is the lookup\n // {connectionID}: \"csv data\",\n // ...\n // }\n // total_bytes:xx,\n // }\n // we want to convert this to:\n // {\n // data: [{obj1}, {obj2}, ... {objN}],\n // total_bytes:xx,\n // }\n if (!data || !data.csv_packed) {\n throw new Error(\"csvUnpack: Invalid data format - csv_packed missing\");\n }\n if (typeof data.csv_packed.data !== \"string\") {\n throw new Error(\"csvUnpack: Invalid csv_packed.data format\");\n }\n\n let myObject = this.object;\n let parseResult = this.AB.csvToJson(data.csv_packed.data);\n // parseResult = { data: [], errors:[], meta:{}}\n\n let returnType = data.csv_packed.type;\n\n if (parseResult.errors?.length) {\n // ignore common error when .data is \"\"\n if (data.csv_packed.data !== \"\") {\n console.error(\"Error parsing CSV data:\", parseResult.errors);\n console.error(\"Original CSV data:\");\n console.error(data.csv_packed.data);\n console.error(\"result:\");\n console.error(parseResult.data);\n }\n }\n let jsonData = parseResult.data;\n\n let relations = {};\n Object.keys(data.csv_packed.relations).forEach((id) => {\n relations[id] = this.AB.csvToJson(data.csv_packed.relations[id]).data;\n });\n\n this.csvUnpackUnstringifyFields(myObject, jsonData);\n Object.keys(relations).forEach((id) => {\n let relatedObj = this.AB.objectByID(id);\n if (relatedObj) {\n this.csvUnpackUnstringifyFields(relatedObj, relations[id]);\n // to hash by _csvID\n let hash = {};\n relations[id].forEach((c) => {\n hash[c._csvID] = c;\n });\n relations[id] = hash;\n }\n });\n\n // now reconnect the data\n Object.keys(relations).forEach((id) => {\n let relatedObj = this.AB.objectByID(id);\n if (relatedObj) {\n let values = Object.values(relations[id]);\n this.csvUnpackReconnectRelations(relations, relatedObj, values);\n }\n });\n\n this.csvUnpackReconnectRelations(relations, myObject, jsonData);\n\n this.csvUnpackClearCSVID(relations);\n\n let returnData = {};\n Object.keys(data).forEach((key) => {\n if (key != \"csv_packed\") {\n returnData[key] = data[key];\n }\n });\n returnData.data = jsonData;\n\n if (returnType == \"single\" && Array.isArray(returnData.data)) {\n returnData.data = returnData.data[0];\n }\n return returnData;\n }\n\n normalizeData(data) {\n // convert to array\n if (!(data instanceof Array)) data = [data];\n\n // find all connected fields\n var connectedFields = this.object.connectFields();\n\n // if this object has some multilingual fields, translate the data:\n var mlFields = this.object.multilingualFields();\n\n // if this object has some date fields, convert the data to date object:\n var dateFields =\n this.object.fields(function (f) {\n return f.key == \"date\" || f.key == \"datetime\";\n }) || [];\n\n // calculate fields\n var calculatedFields = this.object.fields((f) => f.key == \"calculate\");\n\n data.forEach((d) => {\n if (d == null) return;\n\n // various PK name\n if (!d.id && this.object.PK() != \"id\") d.id = d[this.object.PK()];\n\n // loop through data's connected fields\n connectedFields.forEach((c) => {\n // get the relation name so we can change the original object\n var relationName = c.relationName();\n\n // if (d[c.columnName] == null)\n // d[c.columnName] = '';\n\n // Our client side tools need to know that this value is null if it\n // isn't provided:\n if (\n typeof d[relationName] == \"undefined\" &&\n typeof d[c.columnName] == \"undefined\"\n ) {\n d[relationName] = null;\n d[c.columnName] = null;\n return;\n }\n\n // if there is no data we can exit now\n if (d[relationName] == null) return;\n\n // if relation data is still a string and isn't empty\n if (\n typeof d[relationName] == \"string\" &&\n d[relationName].length > 0\n ) {\n // parse the string into an object\n d[relationName] = JSON.parse(d[relationName]);\n }\n\n // if the data is an array we need to loop through it\n if (Array.isArray(d[relationName])) {\n d[relationName].forEach((r) => {\n // if translations are present and they are still a string\n if (r.translations && typeof r.translations == \"string\") {\n // parse the string into an object\n r.translations = JSON.parse(r.translations);\n }\n });\n // if the data is not an array it is a single item...check that has translations and it is a string\n } else if (\n d[relationName].translations &&\n typeof d[relationName].translations == \"string\"\n ) {\n // if so parse the string into an object\n d[relationName].translations = JSON.parse(\n d[relationName].translations\n );\n }\n\n // set .id to relation columns\n let objectLink = c.datasourceLink;\n\n // if we didn't get the linked object, just return.\n if (!objectLink) return;\n\n let olPK = objectLink.PK();\n var relatedMlFields = objectLink.multilingualFields();\n\n if (Array.isArray(d[relationName])) {\n d[relationName].forEach((subData) => {\n // update .id values\n // if (olPK != \"id\" && subData[olPK]) subData.id = subData[olPK];\n const relationValue = c.getRelationValue(subData);\n if (olPK != \"id\") subData.id = relationValue;\n\n // perform Translation\n if (relatedMlFields.length) {\n objectLink.translate(subData, subData, relatedMlFields);\n }\n });\n } else {\n // update .id value\n // if (d[relationName][olPK]) {\n // d[relationName].id = d[relationName][olPK];\n // }\n const relationValue = c.getRelationValue(d[relationName]);\n if (relationValue) {\n d[relationName].id = relationValue;\n }\n\n // perform Translation\n if (relatedMlFields.length) {\n objectLink.translate(\n d[relationName],\n d[relationName],\n relatedMlFields\n );\n }\n }\n\n // if (\n // objectLink &&\n // olPK != \"id\" &&\n // d[relationName] &&\n // !d[relationName].id\n // ) {\n // // is array\n // if (d[relationName].forEach) {\n // d[relationName].forEach((subData) => {\n // if (subData[olPK]) subData.id = subData[olPK];\n // });\n // } else if (d[relationName][olPK]) {\n // d[relationName].id = d[relationName][olPK];\n // }\n // }\n\n // if (relatedMlFields.length) {\n // d[relationName];\n // objectLink.translate(\n // d[relationName],\n // d[relationName],\n // relatedMlFields\n // );\n // }\n\n // Change property name of connected field\n if (!d[c.columnName]) {\n if (c.linkType() == \"one\") {\n if (d[relationName]) {\n // d[c.columnName] = d[relationName][olPK];\n d[c.columnName] = c.getRelationValue(d[relationName]);\n } else {\n d[c.columnName] = null;\n }\n } else {\n if (d[relationName]) {\n if (Array.isArray(d[relationName])) {\n try {\n d[c.columnName] = (d[relationName] || []).map(\n // (i) => i[olPK]\n (i) => c.getRelationValue(i)\n );\n } catch (e) {\n console.log(\"+++++++++++++++\");\n console.log(`ID:[${c.id}]`);\n console.log(`ColumnName:[${c.label}]`);\n console.log(`relationName:[${relationName}]`);\n console.log(`linkType:[${c.linkType()}]`);\n console.log(\"data:\");\n console.log(JSON.stringify(d[relationName]));\n console.log(\"+++++++++++++++\");\n }\n } else {\n // this is strange: supposed to be \"many\" but coming in\n // as \"one\"\n console.log(\"+++++++++++++++\");\n console.log(`ID:[${c.id}]`);\n console.log(`ColumnName:[${c.label}]`);\n console.log(`relationName:[${relationName}]`);\n console.log(`linkType:[${c.linkType()}]`);\n console.log(\"data:\");\n console.log(JSON.stringify(d[relationName]));\n console.log(\"+++++++++++++++\");\n // d[c.columnName] = [d[relationName][olPK]];\n d[c.columnName] = [c.getRelationValue(d[relationName])];\n }\n } else {\n d[c.columnName] = [];\n }\n }\n }\n });\n\n if (mlFields.length) {\n this.object.translate(d, d, mlFields);\n }\n\n // convert the data to date object\n dateFields.forEach((date) => {\n if (d && d[date.columnName] != null) {\n // check to see if data has already been converted to a date object\n if (typeof d[date.columnName] == \"string\") {\n if (date.key == \"date\") {\n // if we are ignoring the time it means we ignore timezone as well\n // so lets trim that off when creating the date so it can be a simple date\n d[date.columnName] = this.AB.rules.toDate(\n d[date.columnName],\n {\n format: \"MM/DD/YYYY\",\n ignoreTime: true,\n }\n );\n } else {\n // Convert UTC to Date\n d[date.columnName] = this.AB.rules.toDate(\n d[date.columnName]\n );\n // d[date.columnName] = new Date(moment(d[date.columnName]));\n }\n }\n }\n });\n\n calculatedFields.forEach((calField) => {\n d[calField.columnName] = calField.format(d);\n });\n });\n }\n};\n","const ABObject = require(\"../platform/ABObject\");\nconst ABModelApi = require(\"../platform/ABModelApi\");\n\nmodule.exports = class ABObjectApiCore extends ABObject {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n this.isAPI = true;\n\n this.fromValues(attributes);\n }\n\n ///\n /// Instance Methods\n ///\n\n /// ABApplication data methods\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.readonly = parseInt(attributes.readonly) || 0;\n this.apiType = attributes.apiType || \"Read\";\n this.request = attributes.request ?? {};\n this.request.headers = attributes.request?.headers ?? [];\n this.response = attributes.response ?? {};\n this.response.fields = attributes.response?.fields ?? [];\n this.isFetched = attributes.isFetched ?? false;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABObjectQuery instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n const result = super.toObj();\n\n result.isAPI = this.isAPI;\n result.readonly = this.readonly;\n result.apiType = this.apiType;\n result.request = this.request ?? {};\n result.request.headers = this.request?.headers ?? [];\n result.response = this.response ?? {};\n result.response.fields = this.response?.fields ?? [];\n result.isFetched = this.isFetched;\n\n return result;\n }\n\n /**\n * @method model\n * return a Model object that will allow you to interact with the data for\n * this ABObjectQuery.\n */\n model() {\n var model = new ABModelApi(this);\n\n // default the context of this model's operations to this object\n model.contextKey(this.constructor.contextKey());\n model.contextValues({ id: this.id }); // the datacollection.id\n\n return model;\n }\n\n /**\n * @function getPagingValues()\n *\n * @return {Object} - {\n * start: \"Property name of the API for start index\",\n * limit: \"Property name of the API for limit return the item number\"\n * }\n */\n getPagingValues({ skip, limit }) {\n const result = {};\n const pagingSettings = this.request?.paging ?? {};\n\n if (pagingSettings.start && skip != null) {\n result[pagingSettings.start] = skip;\n }\n if (pagingSettings.limit && limit != null) {\n result[pagingSettings.limit] = limit;\n }\n\n return result;\n }\n\n dataFromKey(data) {\n let result = [];\n\n if (!Array.isArray(data)) data = [data];\n\n data.forEach((item) => {\n // Clone item\n let itemResult = { ...item };\n\n // Pull data from `Data key` of the API object\n // FORMAT: \"Property.Name.Value\"\n (this.response.dataKey ?? \"\").split(\".\").forEach((key) => {\n if (key == \"\" || key == null) return;\n itemResult = itemResult?.[key];\n });\n\n if (Array.isArray(itemResult)) {\n result = result.concat(itemResult);\n } else if (itemResult) {\n result.push(itemResult);\n }\n });\n\n return result;\n }\n\n get headers() {\n const headers = {};\n\n (this.request.headers ?? []).forEach((header) => {\n if (header?.value == null) return;\n\n headers[header.key] = header.value;\n });\n\n return headers;\n }\n};\n","const ABObjectApi = require(\"../platform/ABObjectApi\");\nconst ABModelApiNetsuite = require(\"../platform/ABModelApiNetsuite\");\n\nmodule.exports = class ABObjectApiNetsuiteCore extends ABObjectApi {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n this.isNetsuite = true;\n\n this.fromValues(attributes);\n }\n\n ///\n /// Instance Methods\n ///\n\n /// ABApplication data methods\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.credentials = attributes.credentials ?? {};\n this.columnRef = attributes.columnRef ?? {};\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABObjectQuery instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n const result = super.toObj();\n\n result.isNetsuite = true;\n result.credentials = this.credentials;\n result.columnRef = this.columnRef;\n\n return result;\n }\n\n /**\n * @method model\n * return a Model object that will allow you to interact with the data for\n * this ABObjectQuery.\n */\n model() {\n var model = new ABModelApiNetsuite(this);\n\n // default the context of this model's operations to this object\n model.contextKey(this.constructor.contextKey());\n model.contextValues({ id: this.id }); // the datacollection.id\n\n return model;\n }\n\n /**\n * @function getPagingValues()\n *\n * @return {Object} - {\n * start: \"Property name of the API for start index\",\n * limit: \"Property name of the API for limit return the item number\"\n * }\n */\n /*\n getPagingValues({ skip, limit }) {\n const result = {};\n const pagingSettings = this.request?.paging ?? {};\n\n if (pagingSettings.start && skip != null) {\n result[pagingSettings.start] = skip;\n }\n if (pagingSettings.limit && limit != null) {\n result[pagingSettings.limit] = limit;\n }\n\n return result;\n }\n\n dataFromKey(data) {\n let result = [];\n\n if (!Array.isArray(data)) data = [data];\n\n data.forEach((item) => {\n // Clone item\n let itemResult = { ...item };\n\n // Pull data from `Data key` of the API object\n // FORMAT: \"Property.Name.Value\"\n (this.response.dataKey ?? \"\").split(\".\").forEach((key) => {\n if (key == \"\" || key == null) return;\n itemResult = itemResult?.[key];\n });\n\n if (Array.isArray(itemResult)) {\n result = result.concat(itemResult);\n } else if (itemResult) {\n result.push(itemResult);\n }\n });\n\n return result;\n }\n\n get headers() {\n const headers = {};\n\n (this.request.headers ?? []).forEach((header) => {\n if (header?.value == null) return;\n\n headers[header.key] = header.value;\n });\n\n return headers;\n }\n\n */\n};\n","/**\n * ABObjectCore\n *\n * Manage the loading of specific ABObject data into useable objects\n * that can instantiate themselves and provide field and model resources.\n */\n\nvar ABModel = require(\"../platform/ABModel\");\nvar ABMLClass = require(\"../platform/ABMLClass\");\n\n/* eslint-disable-next-line no-undef */\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABObjectCore extends ABMLClass {\n constructor(attributes, AB) {\n super([\"label\"], AB);\n\n /*\n{\n\tid: uuid(),\n\tconnName: 'string', // Sails DB connection name: 'appdev_default', 'legacy_hris', etc. Default is 'appBuilder'.\n\tname: 'name',\n\tlabelFormat: 'xxxxx',\n\tlabelSettings: Object,\n\tisImported: 1/0,\n\tisExternal: 1/0,\n\ttableName:'string', // NOTE: store table name of import object to ignore async\n\tprimaryColumnName: 'string', // NOTE: store column name of PK\n\ttransColumnName: 'string', // NOTE: store column name of translations table\n\turlPath:'string',\n\timportFromObject: 'string', // JSON Schema style reference: '#[ABApplication.id]/objects/[ABObject.id]'\n\t\t\t\t\t\t\t\t// to get other object:\t ABApplication.objectFromRef(obj.importFromObject);\n\ttranslations:[\n\t\t{}\n\t],\n\tfields:[\n\t\t{ABDataField}\n ],\n indexes: [\n {ABIndex}\n ]\n}\n*/\n\n this.fromValues(attributes);\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n static contextKey() {\n return \"object\";\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n connName: 'string', // Sails DB connection name: 'appdev_default', 'legacy_hris', etc. Default is 'appBuilder'.\n name: 'name',\n labelFormat: 'xxxxx',\n labelSettings: Object,\n isImported: 1/0,\n isExternal: 1/0,\n tableName:'string', // NOTE: store table name of import object to ignore async\n primaryColumnName: 'string', // NOTE: store column name of PK\n transColumnName: 'string', // NOTE: store column name of translations table\n urlPath:'string',\n importFromObject: 'string', // JSON Schema style reference: '#[ABApplication.id]/objects/[ABObject.id]'\n // to get other object: ABApplication.objectFromRef(obj.importFromObject);\n translations:[\n {}\n ],\n fields:[\n {ABDataField}\n ],\n indexes: [\n {ABIndex}\n ]\n }\n */\n\n this.id = attributes.id;\n // {string} .id\n // the uuid of this ABObject Definition.\n\n this.type = attributes.type || \"object\";\n // {string} .type\n // the type of ABDefinition this is.\n\n this.connName = attributes.connName || undefined; // undefined == 'appBuilder'\n // {string} .connName\n // the sails.config.connections[connName] configuration reference.\n // if not set ({undefined}), then our default \"appBuilder\" config is used\n\n this.name = attributes.name || \"\";\n // {string} .name\n // A name reference for this ABObject. This is a reference that isn't\n // translateable and will be used for lookups across languages.\n\n this.labelFormat = attributes.labelFormat || \"\";\n // {string} .labelFormat\n // A string template for how to display an entry for this ABObject in\n // common UI elements like grids, lists, etc...\n\n this.labelSettings = attributes.labelSettings || {};\n // {Object} .labelSettings\n\n this.labelSettings.isNoLabelDisplay = parseInt(\n this.labelSettings.isNoLabelDisplay || 0\n );\n // {bool} .isNoLabelDisplay\n\n this.isImported = parseInt(attributes.isImported || 0);\n // {depreciated}\n // {bool} .isImported\n // previously used to mark ABObjects that were created in other\n // ABApplicaitons. No longer relevant with Global ABObjects\n\n this.isExternal = parseInt(attributes.isExternal || 0);\n // {bool} .isExternal\n // Marks this ABObject as referencing a pre-existing table in the DB that\n // we are treating as an ABObject.\n // These objects are not allowed to create/update/destroy the db table\n // nor can we add/remove fields.\n // However we are able to customize the Field definitions to change the\n // column names, hidden attributes, Object label, etc...\n // We can update our Defintion attributes, but not any actual DB changes.\n\n this.tableName = attributes.tableName || \"\"; // NOTE: store table name of import object to ignore async\n // {string} .tableName\n // the `{database}.{tableName}` of the db table that this ABObject's data\n // is stored in.\n // knex does not like .(dot) in table and column names\n // https://github.com/knex/knex/issues/2762\n this.tableName = this.tableName.replace(/[^a-zA-Z0-9_ ]/gi, \"\");\n\n this.primaryColumnName = attributes.primaryColumnName || \"\"; // NOTE: store column name of PK\n // {string} .primaryColumnName\n // is the col_name of which key is the primary key. By default it is\n // \"uuid\", but in some external objects this might be something else\n // (\"id\", \"ren_id\", etc...).\n\n this.transColumnName = attributes.transColumnName || \"\"; // NOTE: store column name of translations table\n // {string} .transColumnName\n // this is a workaround to include hris_ren_data and hris_ren_trans data\n\n this.urlPath = attributes.urlPath || \"\";\n\n // this.importFromObject = attributes.importFromObject || \"\";\n\n this.isSystemObject = attributes.isSystemObject;\n // {bool} .isSystemObject\n // We are now storing some of our System Required Data as ABObjects as well.\n // These Objects should not be allowed to be modified by typical AppBuilder\n // designer. However we can enable a mode for AB Designer to then expand these\n // ABObjects, and eventually we can use the AppBuilder to Create the AppBuilder.\n if (\n typeof this.isSystemObject == \"undefined\" ||\n this.isSystemObject == \"false\"\n ) {\n this.isSystemObject = false;\n }\n\n this.createdInAppID = attributes.createdInAppID;\n // {string} .createdInAppID\n // the .id of the ABApplication that originally created this ABObject.\n\n // if attributes.objectWorkspace DOES exist, make sure it is fully\n // populated.\n if (typeof attributes.objectWorkspace != \"undefined\") {\n if (typeof attributes.objectWorkspace.sortFields == \"undefined\")\n attributes.objectWorkspace.sortFields = [];\n if (typeof attributes.objectWorkspace.filterConditions == \"undefined\")\n attributes.objectWorkspace.filterConditions = [];\n if (typeof attributes.objectWorkspace.frozenColumnID == \"undefined\")\n attributes.objectWorkspace.frozenColumnID = \"\";\n if (typeof attributes.objectWorkspace.hiddenFields == \"undefined\")\n attributes.objectWorkspace.hiddenFields = [];\n }\n this.objectWorkspace = attributes.objectWorkspace || {\n sortFields: [], // array of columns with their sort configurations\n filterConditions: [], // array of filters to apply to the data table\n frozenColumnID: \"\", // id of column you want to stop freezing\n hiddenFields: [], // array of [ids] to add hidden:true to\n };\n // {obj} .objectWorkspace\n // When in the ABObject editor in the AppBuilder Designer, different\n // views of the information can be created. These views are stored here\n // and are avaiable to other users in the Designer.\n\n // pull in field definitions:\n var fields = [];\n this.fieldIDs = attributes.fieldIDs || [];\n // {array} [ ABField.id, ... ]\n // this is a collection of ALL the ABFields this object references.\n // This will include ABFields that were directly created for this object\n // and will include ABFields that were imported.\n\n this.importedFieldIDs = attributes.importedFieldIDs || [];\n // {array} [ ABField.id, ... ]\n // this is a collection of the ABFields in our .fieldIDs that were\n // IMPORTED.\n\n this._unknownFieldIDs = [];\n this.fieldIDs.forEach((id) => {\n if (!id) return;\n\n var def = this.AB.definitionByID(id);\n if (def) {\n fields.push(this.AB.fieldNew(def, this));\n } else {\n this._unknownFieldIDs.push(id);\n let err = new Error(\n `O[${this.name}] is referenceing an unknown field id[${id}]`\n );\n this.AB.notify.builder(err, {\n field: { id, object: { id: this.id, name: this.name } },\n });\n }\n });\n this._fields = fields;\n\n // pull in index definitions:\n this.importIndexes(attributes.indexIDs);\n\n // let the MLClass now process the translations:\n super.fromValues(attributes);\n }\n\n /**\n * @method importIndexes\n * instantiate a set of indexes from the given ids.\n * @param {array} indexIDs The different ABDefinition IDs for each index\n * [ \"uuid11\", \"uuid2\", ... \"uuidN\" ]\n */\n importIndexes(indexIDs) {\n this._unknownIndex = [];\n var indexes = [];\n (indexIDs || []).forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (def) {\n indexes.push(this.AB.indexNew(def, this));\n } else {\n this._unknownIndex.push(id);\n let err = new Error(\n `O[${this.name}] is referenceing an unknown index id[${id}]`\n );\n this.AB.notify.builder(err, {\n field: { id, object: { id: this.id, name: this.name } },\n });\n }\n });\n this._indexes = indexes;\n }\n\n /**\n * @method exportFields\n * convert our array of fields into a settings object for saving to disk.\n * @return {array}\n */\n // exportFields() {\n // var currFields = [];\n // this._fields.forEach((obj) => {\n // currFields.push(obj.toObj());\n // });\n // return currFields;\n // }\n\n // /**\n // * @method exportFields\n // * convert our array of fields into a settings object for saving to disk.\n // * @return {array}\n // */\n // exportIndexes() {\n // var currIndexes = [];\n // this._indexes.forEach((idx) => {\n // currIndexes.push(idx.toObj());\n // });\n // return currIndexes;\n // }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n // MLClass translation\n var obj = super.toObj();\n\n // track the field .ids of our fields\n var fieldIDs = this.fields().map((f) => f.id);\n (this._unknownFieldIDs || []).forEach((id) => {\n fieldIDs.push(id);\n });\n // NOTE: we keep the ._unknownFieldIDs so a developer/builder\n // can come back and track down what happened to the missing\n // ids.\n\n // track the index .ids of our indexes\n var indexIDs = this.indexes().map((f) => f.id);\n (this._unknownIndex || []).forEach((id) => {\n indexIDs.push(id);\n });\n\n return {\n id: this.id,\n type: this.type || \"object\",\n connName: this.connName,\n name: this.name,\n labelFormat: this.labelFormat,\n labelSettings: this.labelSettings || {},\n isImported: this.isImported,\n isExternal: this.isExternal,\n tableName: this.tableName,\n // NOTE: store table name of import object to ignore async\n primaryColumnName: this.primaryColumnName,\n // NOTE: store column name of PK\n transColumnName: this.transColumnName,\n // NOTE: store column name of translations table\n urlPath: this.urlPath,\n // importFromObject: this.importFromObject,\n objectWorkspace: this.objectWorkspace,\n isSystemObject: this.isSystemObject,\n\n translations: obj.translations,\n fieldIDs: fieldIDs,\n importedFieldIDs: this.importedFieldIDs,\n indexIDs: indexIDs,\n createdInAppID: this.createdInAppID,\n };\n }\n\n ///\n /// Objects\n ///\n\n /**\n * @method objectLinks()\n *\n * return an array of ABObject that's connected.\n *\n * @param {object} filter\n * @return {array} - An array of ABObject\n */\n objectLinks(/* filter */) {\n var connectFields = this.connectFields();\n\n return connectFields.map((f) => f.datasourceLink);\n }\n\n ///\n /// Fields\n ///\n\n /**\n * @method fields()\n * return an array of all the ABFields for this ABObject.\n * @param {fn} fn\n * a filter function that returns {true} if a value should\n * be included, or {false} otherwise.\n * @return {array[ABFieldxxx]}\n */\n fields(fn = () => true) {\n return this._fields.filter(fn);\n }\n\n /**\n * @method fieldByID()\n * return the object's field from the given {ABField.id}\n * @param {string} id\n * the uuid of the field to return.\n * @return {ABFieldxxx}\n */\n fieldByID(id) {\n return this.fields((f) => f?.id == id)[0];\n }\n\n /**\n * @method connectFields()\n *\n * return an array of the ABFieldConnect that is connect object fields.\n * @param {fn} fn\n * a filter function that returns {true} if a value should\n * be included, or {false} otherwise.\n * @return {array}\n */\n connectFields(fn = () => true) {\n return this.fields((f) => f && f.isConnection).filter(fn);\n }\n\n /**\n * @method fieldImport\n * register the given ABField.id as an imported field for this ABObject.\n * The ABField definition should be available before making this call.\n * After this call, the ABField is included in the ABObject, but the ABObject\n * has NOT been saved.\n * @param {ABField} fieldID The ABDefinition.id for a field that is imported\n * into this object.\n */\n fieldImport(id) {\n if (!id) return;\n\n if (this.importedFieldIDs.indexOf(id) == -1) {\n this.importedFieldIDs.push(id);\n }\n\n // just to be safe:\n var isThere = this._fields.find((f) => f.id == id);\n if (!isThere) {\n var def = this.AB.definitionByID(id);\n if (def) {\n this._fields.push(this.AB.fieldNew(def, this));\n } else {\n this._unknownFieldIDs = this._unknownFieldIDs || [];\n this._unknownFieldIDs.push(id);\n let err = new Error(\n `O[${this.name}] is importing an unknown field id[${id}]`\n );\n this.AB.notify.builder(err, {\n field: { id, object: { id: this.id, name: this.name } },\n });\n }\n }\n }\n\n /**\n * @method fieldNew()\n *\n * return an instance of a new (unsaved) ABField that is tied to this\n * ABObject.\n *\n * NOTE: this new field is not included in our this.fields until a .save()\n * is performed on the field.\n *\n * @return {ABField}\n */\n fieldNew(values) {\n return this.AB.fieldNew(values, this);\n }\n\n /**\n * @method fieldRemove()\n *\n * remove the given ABField from our ._fields array and persist the current\n * values.\n *\n * @param {ABField} field The instance of the field to remove.\n * @return {Promise}\n */\n fieldRemove(field) {\n var origLen = this._fields.length;\n this._fields = this.fields(function (o) {\n return o.id != field.id;\n });\n\n // be sure to remove this from our imported ids if it was\n // listed there.\n this.importedFieldIDs = this.importedFieldIDs.filter(\n (fid) => fid != field.id\n );\n\n if (this._fields.length < origLen) {\n return this.save();\n }\n\n // if we get here, then nothing changed so nothing to do.\n return Promise.resolve();\n }\n\n /**\n * @method fieldReorder()\n *\n * reorder the fields in our object\n *\n * @param {ABField} field The instance of the field to remove.\n * @return {Promise}\n */\n fieldReorder(sourceId, targetId) {\n // We know what was moved and what item it has replaced/pushed forward\n // so first we want to splice the item moved out of the array of fields\n // and store it so we can put it somewhere else\n let itemMoved = null;\n let oPos = 0; // original position\n for (var i = 0; i < this._fields.length; i++) {\n if (this._fields[i].columnName == sourceId) {\n itemMoved = this._fields[i];\n this._fields.splice(i, 1);\n oPos = i;\n break;\n }\n }\n // once we have removed/stored it we can find where its new position\n // will be by looping back through the array and finding the item it\n // is going to push forward\n for (var j = 0; j < this._fields.length; j++) {\n if (this._fields[j].columnName == targetId) {\n // if the original position was before the new position we will\n // follow webix's logic that the drop should go after the item\n // it was placed on\n if (oPos <= j) {\n j++;\n }\n this._fields.splice(j, 0, itemMoved);\n break;\n }\n }\n\n return this.save();\n }\n\n /**\n * @method fieldSave()\n *\n * save the given ABField in our ._fields array and persist the current\n * values.\n *\n * @param {ABField} field The instance of the field to save.\n * @return {Promise}\n */\n fieldSave(field) {\n var isIncluded = this.fieldByID(field.id);\n if (!isIncluded) {\n this._fields.push(field);\n return this.save();\n }\n\n return Promise.resolve();\n }\n\n /**\n * @method fieldAdd()\n *\n * save the given ABField in our ._fields array and persist the current\n * values if they changed.\n *\n * @param {ABField} field The instance of the field to save.\n * @return {Promise}\n */\n fieldAdd(field) {\n var isIncluded = this.fieldByID(field.id);\n if (!isIncluded) {\n // if not already included, then add and save the Obj definition:\n this._fields.push(field);\n return this.save();\n }\n\n // Nothing was required so return\n return Promise.resolve();\n }\n\n /**\n * @method imageFields()\n *\n * return an array of the ABFieldImage fields this object has.\n * @param {fn} fn\n * a filter function that returns {true} if a value should\n * be included, or {false} otherwise.\n * @return {array}\n */\n imageFields(fn = () => true) {\n return this.fields((f) => f && f.key == \"image\").filter(fn);\n }\n\n /**\n * @method multilingualFields()\n *\n * return an array of columnnames that are multilingual.\n *\n * @return {array}\n */\n multilingualFields() {\n return this.fields((f) => f && f.isMultilingual).map((f) => f.columnName);\n }\n\n /**\n * @method indexes()\n *\n * return an array of all the ABIndex for this ABObject.\n *\n * @param filter {Object}\n *\n * @return {array}\n */\n indexes(filter = () => true) {\n return this._indexes.filter(filter);\n }\n\n /**\n * @method indexByID()\n * return the object's index from the given {ABIndex.id}\n * @param {string} id\n * the id of the ABIndex to return.\n * @return {ABIndex}\n */\n indexByID(id) {\n return this.indexes((f) => f.id == id)[0];\n }\n\n /**\n * @method indexRemove()\n * remove the given ABIndex from our ._indexes array and persist the current\n * values.\n * @param {ABIndex} index\n * @return {Promise}\n */\n indexRemove(index) {\n var origLen = this._indexes.length;\n this._indexes = this.indexes(function (idx) {\n return idx.id != index.id;\n });\n\n // persist our changes if something changed.\n if (origLen != this._indexes.length) {\n return this.save();\n }\n\n // nothing was removed, so continue on.\n return Promise.resolve();\n }\n\n /**\n * @method indexSave()\n * save the given ABIndex in our ._indexes array and persist the current\n * values.\n * @param {ABIndex} index\n * @return {Promise}\n */\n indexSave(index) {\n var isIncluded = this.indexByID(index.id);\n if (!isIncluded) {\n this._indexes.push(index);\n return this.save();\n }\n\n return Promise.resolve();\n }\n\n ///\n /// Working with data from server\n ///\n\n /**\n * @method model\n * return a Model object that will allow you to interact with the data for\n * this ABObject.\n */\n model() {\n var model = new ABModel(this);\n\n // default the context of this model's operations to this object\n model.contextKey(ABObjectCore.contextKey());\n model.contextValues({ id: this.id });\n\n return model;\n }\n\n ///\n /// URL\n ///\n\n /**\n * @method urlRest\n * return the url to access the data for this object.\n * @return {string}\n */\n urlRest() {\n return `/app_builder/model/${this.id}`;\n }\n\n /**\n * @method urlRestBatch\n * return the url to use for batch creates for this object\n * @return {string}\n */\n urlRestBatch() {\n return `/app_builder/batch/model/${this.id}`;\n }\n\n /**\n * @method urlRestItem\n * return the url to access the data for an instance of this object.\n * @return {string}\n */\n urlRestItem(id) {\n return `/app_builder/model/${this.id}/${id}`;\n }\n\n /**\n * @method urlRestLog\n * return the url to access the logs for this ABObject.\n * @return {string}\n */\n urlRestLog() {\n return `/app_builder/object/${this.id}/track`;\n }\n\n /**\n * @method urlRestRefresh\n * return the url to signal a refresh for this object.\n * @return {string}\n */\n urlRestRefresh() {\n return `/app_builder/model/refreshobject/${this.id}`;\n }\n\n /**\n * @method urlCount\n * return the url to count of data for this object.\n * @return {string}\n */\n urlRestCount() {\n return `/app_builder/model/${this.id}/count`;\n }\n\n ///\n ///\tObject Workspace Settings\n ///\n get workspaceSortFields() {\n // new version\n if (this.workspaceViews) {\n let currView = this.workspaceViews.getCurrentView();\n if (currView) return currView.sortFields;\n else return null;\n }\n // old version\n else {\n return this.objectWorkspace.sortFields;\n }\n }\n\n set workspaceSortFields(fields) {\n // new version\n if (this.workspaceViews) {\n let currView = this.workspaceViews.getCurrentView();\n if (currView) currView.sortFields = fields;\n }\n // old version\n else {\n this.objectWorkspace.sortFields = fields;\n }\n }\n\n get workspaceFilterConditions() {\n // new version\n if (this.workspaceViews) {\n let currView = this.workspaceViews.getCurrentView();\n if (currView) return currView.filterConditions;\n else return null;\n }\n // old version\n else {\n return this.objectWorkspace.filterConditions;\n }\n }\n\n set workspaceFilterConditions(filterConditions) {\n // new version\n if (this.workspaceViews) {\n let currView = this.workspaceViews.getCurrentView();\n if (currView) currView.filterConditions = filterConditions;\n }\n // old version\n else {\n this.objectWorkspace.filterConditions = filterConditions;\n }\n }\n\n get workspaceFrozenColumnID() {\n return this.objectWorkspace.frozenColumnID;\n }\n\n set workspaceFrozenColumnID(id) {\n this.objectWorkspace.frozenColumnID = id;\n }\n\n get workspaceHiddenFields() {\n return this.objectWorkspace.hiddenFields || [];\n }\n\n set workspaceHiddenFields(fields) {\n this.objectWorkspace.hiddenFields = fields;\n }\n\n /**\n * @method isReadOnly\n *\n * @return {boolean}\n */\n get isReadOnly() {\n return this.isImported || this.isExternal || this.readonly;\n }\n\n /**\n * @method defaultValues\n * Collect a hash of key=>value pairs that represent the default values\n * from each of our fields.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @return {array}\n */\n defaultValues() {\n var values = {};\n this.fields().forEach((f) => {\n f.defaultValue(values);\n });\n\n return values;\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an array of any invalid\n * value errors.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @return {array}\n */\n isValidData(/* data */) {\n // NOTE: the platform needs to define a way to verify the data\n console.warn(\"Platform.ABObject.isValidData() missing\");\n return true;\n }\n\n /**\n * @method urlPointer()\n * return the url pointer that references this object. This url pointer\n * should be able to be used by this.application.urlResolve() to return\n * this object.\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlPointer(acrossApp) {\n console.error(\"Who is calling this?\");\n\n if (this.application == null) return null;\n\n return this.application.urlObject(acrossApp) + this.id;\n }\n\n /**\n * @method urlField\n * return a string pointer to this object's fields\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlField(acrossApp) {\n console.error(\"Who is calling this?\");\n\n return this.urlPointer(acrossApp) + \"/_fields/\";\n }\n\n /**\n * @method PK\n * return a string of the primary column name\n *\n * @return {string}\n */\n PK() {\n return this.primaryColumnName || \"uuid\";\n }\n\n remoteCreate(data) {\n console.log(\n \"object[\" + this.name + \"] received a remoteCreate() with data:\",\n data\n );\n }\n\n /**\n * @method clone\n * return a clone of ABObject\n *\n * @return {ABObjectBase}\n */\n clone() {\n // ignore properties who're spend much performance\n // NOTE: do not clone them. Just copy reference\n let ignoreProps = [\"application\", \"_fields\"];\n\n let cloneOne = JSON.parse(JSON.stringify(this));\n\n ignoreProps.forEach((prop) => {\n cloneOne[prop] = this[prop];\n });\n\n return cloneOne;\n }\n\n /**\n * @method minRelationData()\n * return an array of ABField.columnNames that make up\n * the minimum fields required to display this objects __RELATION\n * data in our UI widgets.\n */\n minRelationData() {\n var fields = [this.PK()];\n\n if (this.multilingualFields().length > 0) {\n fields.push(\"translations\");\n }\n\n var labelData = this.labelFormat || \"\";\n\n // get column ids in {colId} template\n // ['{colId1}', ..., '{colIdN}']\n var colIds = labelData.match(/\\{[^}]+\\}/g);\n\n if (colIds && colIds.forEach) {\n colIds.forEach((colId) => {\n var colIdNoBracket = colId.replace(\"{\", \"\").replace(\"}\", \"\");\n\n var field = this.fieldByID(colIdNoBracket);\n if (field == null) return;\n\n fields.push(field.columnName);\n });\n }\n // Default defining label\n else {\n const defaultFld = this.fields((f) => f.fieldUseAsLabel())[0];\n if (defaultFld) fields.push(defaultFld.columnName);\n }\n\n // System requires to include number field values\n // because they are used on Formula/Calculate fields on client side\n fields = fields.concat(\n this.fields((f) => f.key == \"number\").map((f) => f.columnName)\n );\n\n return fields;\n }\n\n // Display data with label format of object\n displayData(rowData) {\n if (rowData == null) return \"\";\n\n // translate multilingual\n //// TODO: isn't this a MLObject?? use this.translate()\n var mlFields = this.multilingualFields();\n this.translate(rowData, rowData, mlFields);\n\n var labelData = this.labelFormat || \"\";\n\n // default label\n if (!labelData && this.fields().length > 0) {\n var defaultField = this.fields((f) => f.fieldUseAsLabel())[0];\n if (defaultField) labelData = \"{\" + defaultField.id + \"}\";\n else {\n // if label is empty, then show .id\n if (!labelData.trim()) {\n let labelSettings = this.labelSettings || {};\n if (labelSettings && labelSettings.isNoLabelDisplay) {\n labelData = L(labelSettings.noLabelText || \"[No Label]\");\n } else {\n // show id of row\n labelData = `${\n this.AB.rules.isUUID(rowData.id) ? \"ID: \" : \"\"\n }${rowData.id}`;\n }\n }\n }\n }\n\n // get column ids in {colId} template\n // ['{colId1}', ..., '{colIdN}']\n var colIds = labelData.match(/\\{[^}]+\\}/g);\n\n // Using rawString to catch actual values we are pulling out.\n // the label data might have additional characters \"-\" and such that will\n // remain, and doing a .trim() on that wont catch that the label data\n // is actually empty.\n let rawString = \"\";\n if (colIds && colIds.forEach) {\n colIds.forEach((colId) => {\n var colIdNoBracket = colId.replace(\"{\", \"\").replace(\"}\", \"\");\n\n var field = this.fieldByID(colIdNoBracket);\n if (field == null) return;\n\n let valField = field.format(rowData) || \"\";\n labelData = labelData.replace(colId, valField);\n rawString = `${rawString}${valField}`;\n });\n }\n\n // if label is empty, then show .id\n if (!rawString.trim()) {\n let labelSettings = this.labelSettings || {};\n if (labelSettings && labelSettings.isNoLabelDisplay) {\n labelData = L(labelSettings.noLabelText || \"[No Label]\");\n } else {\n // show id of row\n labelData = `${this.AB.rules.isUUID(rowData.id) ? \"ID: \" : \"\"}${\n rowData.id\n }`;\n }\n }\n\n return labelData;\n }\n\n /**\n * @method whereCleanUp()\n * Parse through the current where condition and remove any null or\n * empty logical blocks.\n * @param {obj} curr\n * 1) The current where condition in ABQuery Format:\n * {\n * glue: [AND, OR],\n * rules: [ {rule} ]\n * }\n * or 2) The current {rule} to validate\n * {\n * key:{string},\n * rule:{string},\n * vlaue:{mixed}\n * }\n * @return {ABQuery.where} / { Rule }\n */\n whereCleanUp(curr) {\n if (curr) {\n if (curr.glue && curr.rules) {\n // SENTRY Error AB-APPBUILDER-4H\n // \"curr.rules.forEach is not a function\"\n // curr.rules is supposed to be an array. If we are not\n // getting that, then let's send an alert to figure out what\n // is happening here:\n if (!Array.isArray(curr.rules)) {\n // what is this entry?\n let err = new Error(\n `ABObjectCore.whereCleanUP(): Sentry Error: AB-APPBUILDER-4H: current rule is not properly formed: ${JSON.stringify(\n curr\n )}`\n );\n this.AB.notify.developer(err, { curr });\n }\n\n // this is a logical Block (AND, OR)\n // we need to filter the children\n let newValue = { glue: curr.glue, rules: [] };\n curr.rules.forEach((r) => {\n let cleanRule = this.whereCleanUp(r);\n // don't add values that didn't pass\n if (cleanRule) {\n newValue.rules.push(cleanRule);\n }\n });\n\n // if we have a non empty block, then return it:\n if (newValue.rules.length > 0) {\n return newValue;\n }\n\n // this isn't really a valid conditional, so null\n return null;\n }\n\n // This is a specific rule, that isn't null so:\n // if it isn't {}, then return it\n if (Object.keys(curr).length > 0) return curr;\n\n // otherwise we skip this as well\n return null;\n }\n return null;\n }\n};\n","//\n// ABObjectQuery\n//\n// A type of Object in our system that is based upon a complex relationship of multiple\n// existing Objects.\n//\n// In the QueryBuilder section of App Builder, a new Query Object can be created.\n// An initial Object can be chosen from our current list of Objects. After that, additional Objects\n// and a specified join type can be specified.\n//\n// A list of fields from each specified Object can also be included as the data to be returned.\n//\n// A where statement is also part of the definition.\n//\n\nvar ABObject = require(\"../platform/ABObject\");\nvar ABModelQuery = require(\"../platform/ABModelQuery\");\n\nmodule.exports = class ABObjectQueryCore extends ABObject {\n constructor(attributes, AB) {\n super(attributes, AB);\n /*\n{\n\tid: uuid(),\n\tname: 'name',\n\tlabelFormat: 'xxxxx',\n\tisImported: 1/0,\n\turlPath:'string',\n\timportFromObject: 'string', // JSON Schema style reference: '#[ABApplication.id]/objects/[ABObject.id]'\n\t\t\t\t\t\t\t\t// to get other object: ABApplication.objectFromRef(obj.importFromObject);\n\ttranslations:[\n\t\t{}\n\t],\n\n\n\n\t// ABOBjectQuery Specific Changes\n\t// we store a list of fields by their urls:\n\tfields:[\n\t\t{\n\t\t\talias: \"\",\n\t\t\tfieldURL:'#/url/to/field',\n\t\t}\n\t],\n\n\n\t// we store a list of joins:\n\tjoins:{\n\t\talias: \"\",\t\t\t\t\t\t\t// the alias name of table - use in SQL command\n\t\tobjectURL:\"#/...\",\t\t\t\t\t// the base object of the join\n\t\tlinks: [\n\t\t\t{\n\t\t\t\talias: \"\",\t\t\t\t\t\t\t// the alias name of table - use in SQL command\n\t\t\t\tfieldID: \"uuid\",\t\t\t\t\t// the connection field of the object we are joining with.\n\t\t\t\ttype:[left, right, inner, outer]\t// join type: these should match the names of the knex methods\n\t\t\t\t\t\t=> innerJoin, leftJoin, leftOuterJoin, rightJoin, rightOuterJoin, fullOuterJoin\n\t\t\t\tlinks: [\n\t\t\t\t\t...\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\n\t},\n\n\n\twhere: { QBWhere }\n}\n*/\n this.isQuery = true;\n // {bool}\n // a property to mark the difference between an ABObject and ABObjectQuery.\n\n this.__missingObject = this.__missingObject ?? [];\n // {array} fieldInfo\n // the field info that defined an object we can't find.\n\n this.__missingFields = this.__missingFields ?? [];\n // {array} [ { objID, fieldID }, ... ]\n // a list of field definitions that we are unable to resolve.\n\n this.__cantFilter = [];\n // {array} [ {field, fieldInfo}, ... ]\n // a list of field that were assigned but can't be used for filtering.\n\n this.__duplicateFields = [];\n // {array} [ {fieldInfo}, ... ]\n // a list of duplicate field definitions.\n\n this.__linkProblems = [];\n // {array} [ { message, data }, ...]\n // a list of warning messages related to link objects\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n /**\n * contextKey()\n * returns a unique key that represents a query in\n * our networking job resolutions.\n * @return {string}\n */\n static contextKey() {\n return \"query\";\n }\n\n ///\n /// Instance Methods\n ///\n\n /// ABApplication data methods\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.type = \"query\";\n\n // populate connection objects\n // this._objects = {};\n // this.obj2Alias = attributes.obj2Alias || {};\n\n this.alias2Obj = {}; // this gets built in the .importJoins()\n // { \"alias\" : object.id }\n // this is a lookup hash of a referenced alias to the Object it\n // references.\n\n this.objectIDs = [];\n // {array} of ABObject.id s that are referenced by this query.\n // this is how we limit our searches on objects.\n // this gets built in the .importJoins();\n\n this.viewName = attributes.viewName || \"\";\n // {string}\n // this is the SQL tablename of where our Query will store it's\n // view data.\n\n // import all our ABObjects\n this.importJoins(attributes.joins || {});\n\n // import fields after joins are imported\n this._fields = null;\n this.importFields(attributes.fields || []);\n // {array} [ { alias, field}, {},... ]\n // an array of field definition structures that mark what fields this\n // query is interested in pulling data from.\n // .alias : {string} matches the alias of the ABObject that the field\n // is from\n // .field : {ABFieldXXX} the link to the actual ABField instance\n\n // Import our Where condition\n this.where = attributes.where || {}; // .workspaceFilterConditions\n // Fix default where.glue value\n if (\n this.where &&\n !this.where.glue &&\n this.where.rules &&\n this.where.rules.length > 0\n )\n this.where.glue = \"and\";\n\n this._objectWorkspaceViews = attributes.objectWorkspaceViews || {};\n\n this.settings = this.settings || {};\n\n if (attributes && attributes.settings) {\n // convert from \"0\" => true/false\n this.settings.grouping = JSON.parse(\n attributes.settings.grouping || false\n );\n this.settings.hidePrefix = JSON.parse(\n attributes.settings.hidePrefix || false\n );\n }\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABObjectQuery instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n var result = super.toObj();\n\n result.viewName = this.viewName;\n\n result.joins = this.exportJoins();\n result.fields = this.exportFields();\n result.where = this.where; // .workspaceFilterConditions\n\n result.settings = this.settings;\n\n return result;\n }\n\n ///\n /// Fields\n ///\n\n /**\n * @method importFields\n * instantiate a set of fields from the given attributes.\n * Our attributes are a set of field URLs That should already be created in their respective\n * ABObjects.\n * @param {array} fieldSettings The different field urls for each field\n */\n importFields(fieldSettings) {\n var newFields = [];\n (fieldSettings || []).forEach((fieldInfo) => {\n if (fieldInfo == null) return;\n\n // pull object by alias name\n let object = this.objectByAlias(fieldInfo.alias);\n\n // Pull object from .AB\n if (!object && this.AB) {\n object = this.AB.objectByID(fieldInfo.objectID);\n\n // keep\n if (object) {\n this._objects = this._objects || {};\n this._objects[fieldInfo.alias] = object;\n }\n }\n\n if (!object) {\n this.__missingObject = this.__missingObject ?? [];\n this.__missingObject.push(fieldInfo);\n return;\n }\n\n let field = object.fieldByID(fieldInfo.fieldID);\n if (!field) {\n this.__missingFields = this.__missingFields ?? [];\n this.__missingFields.push({\n objID: object.id,\n fieldID: fieldInfo.fieldID,\n fieldInfo,\n });\n return;\n }\n\n if (!this.canFilterField(field)) {\n this.__cantFilter = this.__cantFilter ?? [];\n this.__cantFilter.push({ field, fieldInfo });\n }\n\n // check duplicate\n let isNew =\n newFields.filter(\n (f) =>\n f.alias == fieldInfo.alias && f.field.id == fieldInfo.fieldID\n ).length < 1;\n\n if (!isNew) {\n this.__duplicateFields = this.__duplicateFields ?? [];\n this.__duplicateFields.push({ fieldInfo });\n }\n\n // should be a field of base/join objects\n if (field && this.canFilterField(field) && isNew) {\n // add alias to field\n // create new instance of this field:\n var def = field.toObj();\n let clonedField = new field.constructor(def, field.object);\n\n clonedField.alias = fieldInfo.alias;\n\n let alias = fieldInfo.alias;\n if (Array.isArray(this.joins())) {\n // NOTE: query v1\n alias = field.object.name;\n }\n\n newFields.push({\n alias: alias,\n field: clonedField,\n });\n }\n });\n this._fields = newFields;\n }\n\n /**\n * @method exportFields\n * convert our array of fields into a settings object for saving to disk.\n * @return {array}\n */\n exportFields() {\n var currFields = [];\n this._fields.forEach((fieldInfo) => {\n currFields.push({\n alias: fieldInfo.alias,\n objectID: fieldInfo.field.object.id,\n fieldID: fieldInfo.field.id,\n });\n });\n\n // let's persist the faulty settings so a developer or builder can\n // review and fix it by hand.\n (this.__missingObject || []).forEach((f) => {\n currFields.push(f);\n });\n\n (this.__cantFilter || []).forEach((f) => {\n currFields.push(f.fieldInfo);\n });\n\n return currFields;\n }\n\n /**\n * @method fields()\n *\n * Support the ABObject api by returning a list of fields relevant\n * to this ABObjectQuery.\n *\n * @return {array}\n */\n fields(fn = () => true) {\n if (!fn) fn = () => true;\n return this._fields.map((f) => f.field).filter(fn);\n }\n\n ///\n /// Joins & Objects\n ///\n\n /**\n * @method joins()\n *\n * return an object of joins for this Query.\n *\n * @return {Object}\n */\n joins() {\n return this._joins || {};\n }\n\n /**\n * @method objects()\n *\n * return an array of all the relevant ABObjects for this Query.\n *\n * @return {array}\n */\n objects(fn = () => true) {\n // FOR proper expected operation, this fn must only return object\n // matches for which this ABQuery is managing objects:\n\n return this.AB.objects((o) => this.objectIDs.indexOf(o.id) > -1).filter(\n fn\n );\n }\n\n /**\n * @method objectAlias()\n *\n * return alias of of ABObjects.\n *\n * @return {string}\n */\n objectAlias(objectId) {\n let result = null;\n\n Object.keys(this.alias2Obj || {}).forEach((alias) => {\n if (!result && this.alias2Obj[alias] == objectId) {\n result = alias;\n }\n });\n\n return result;\n }\n\n /**\n * @method objectBase\n * return the origin object\n *\n * @return {ABObject}\n */\n objectBase() {\n if (!this._joins.objectID) return null;\n\n return this.AB.objectByID(this._joins.objectID) || null;\n }\n\n /**\n * @method objectByAlias()\n * return ABObject search by alias name\n *\n * @param {string} - alias name\n * @return {ABClassObject}\n */\n objectByAlias(alias) {\n var objID = this.alias2Obj[alias];\n if (objID) {\n return this.objects((o) => o.id == objID)[0];\n }\n return null;\n }\n\n /**\n * @method objectByID()\n * return ABObject search by ID\n * @param {string} objID\n * The requested {ABObject}.id of the object to return.\n * @return {ABObject} | null\n */\n objectByID(objID) {\n if (objID) {\n return this.objects((o) => o.id == objID)[0];\n }\n return null;\n }\n\n /**\n * @method links()\n *\n * return an array of links for this Query.\n *\n * @return {array}\n */\n links(filter = () => true) {\n return (this._links || []).filter(filter);\n }\n\n /**\n * @method importJoins\n * instantiate a set of joins from the given attributes.\n * Our joins contain a set of ABObject URLs that should already be created in our Application.\n * @param {Object} settings The different field urls for each field\n *\t\t\t\t\t{ }\n */\n importJoins(settings) {\n // copy join settings\n this._joins = this.AB.cloneDeep(settings);\n\n var uniqueObjectIDs = {};\n // { obj.id : obj.id }\n // a hash of object.ids for all the relevant ABObjects necessary for this\n // ABObjectQuery\n\n var newLinks = [];\n // {array} of link definitions\n // build the operating values for this._links\n\n let storeObject = (object, alias) => {\n if (!object) return;\n\n // var inThere = newObjects.filter(obj => obj.id == object.id && obj.alias == alias ).length > 0;\n // if (!inThere) {\n // newObjects[alias] = object;\n // this.obj2Alias[object.id] = alias;\n this.alias2Obj[alias] = object.id;\n uniqueObjectIDs[object.id] = object.id;\n // newObjects.push({\n // \talias: alias,\n // \tobject: object\n // });\n // }\n };\n\n let storeLinks = (links) => {\n (links || []).forEach((link) => {\n // var inThere = newLinks.filter(l => l.fieldID == link.fieldID).length > 0;\n // if (!inThere) {\n newLinks.push(link);\n // }\n });\n };\n\n this.__linkProblems = this.__linkProblems ?? [];\n\n let processJoin = (baseObject, joins) => {\n if (!baseObject) return;\n\n (joins || []).forEach((link) => {\n // Convert our saved settings:\n //\t{\n //\t\talias: \"\",\t\t\t\t\t\t\t// the alias name of table - use in SQL command\n //\t\tobjectID: \"uuid\",\t\t\t\t\t// id of the connection object\n //\t\tlinks: [\n //\t\t\t{\n //\t\t\t\talias: \"\",\t\t\t\t\t\t\t// the alias name of table - use in SQL command\n //\t\t\t\tfieldID: \"uuid\",\t\t\t\t\t// uhe connection field of the object we are joining with.\n //\t\t\t\ttype:[left, right, inner, outer]\t// join type: these should match the names of the knex methods\n //\t\t\t\t\t\t=> innerJoin, leftJoin, leftOuterJoin, rightJoin, rightOuterJoin, fullOuterJoin\n //\t\t\t\tlinks: [\n //\t\t\t\t\t...\n //\t\t\t\t]\n //\t\t\t}\n //\t\t]\n //\t},\n\n var linkField = baseObject.fieldByID(link.fieldID);\n if (!linkField) {\n this.__linkProblems.push({\n message: `could not resolve our linkField[${link.fieldID}]`,\n data: {\n link,\n },\n });\n return;\n }\n\n // track our linked object\n var linkObject = this.AB.objectByID(linkField.settings.linkObject);\n if (!linkObject) {\n this.__linkProblems.push({\n message: `could not resolve our linked field -> linkObject[${linkField.settings.linkObject}]`,\n data: {\n link,\n },\n });\n return;\n }\n\n storeObject(linkObject, link.alias);\n\n storeLinks(link.links);\n\n processJoin(linkObject, link.links);\n });\n };\n\n // if (!this._joins.objectURL)\n // \t// TODO: this is old query version\n // \treturn;\n\n // store the root object\n var rootObject = this.objectBase();\n if (!rootObject) {\n // this._objects = newObjects;\n this.__linkProblems.push({\n message: \"could not resolve our base object\",\n data: {\n objectID: this._joins?.objectID,\n },\n });\n return;\n }\n\n storeObject(rootObject, \"BASE_OBJECT\");\n\n storeLinks(settings.links);\n\n processJoin(rootObject, settings.links);\n\n // this._objects = newObjects;\n this._links = newLinks;\n this.objectIDs = Object.keys(uniqueObjectIDs);\n }\n\n /**\n * @method exportJoins\n * save our list of objects into our format for persisting on the server\n * @param {array} settings\n */\n exportJoins() {\n return this.AB.cloneDeep(this._joins || {});\n }\n\n ///\n /// Working with Client Components:\n ///\n\n /**\n * @method model\n * return a Model object that will allow you to interact with the data for\n * this ABObjectQuery.\n */\n model() {\n var model = new ABModelQuery(this);\n\n // default the context of this model's operations to this object\n model.contextKey(this.constructor.contextKey());\n model.contextValues({ id: this.id }); // the datacollection.id\n\n return model;\n }\n\n /**\n * @method canFilterObject\n * evaluate the provided object to see if it can directly be filtered by this\n * query.\n * @param {ABObject} object\n * @return {bool}\n */\n canFilterObject(object) {\n if (!object) return false;\n\n // I can filter this object if it is one of the objects in my joins\n return (\n this.objects((obj) => {\n return obj.id == object.id;\n }).length > 0\n );\n }\n\n /**\n * @method canFilterField\n * evaluate the provided field to see if it can be filtered by this\n * query.\n * @param {ABObject} object\n * @return {bool}\n */\n canFilterField(field) {\n if (!field) return false;\n\n // I can filter a field if it's object OR the object it links to can be filtered:\n let object = field.object;\n // Transition:\n // let linkedObject = this.objects(\n // (obj) => obj.id == field.settings.linkObject\n // )[0];\n var linkedObject = field.datasourceLink;\n\n return this.canFilterObject(object) || this.canFilterObject(linkedObject);\n }\n\n /**\n * @method urlPointer()\n * return the url pointer that references this object. This url pointer\n * should be able to be used by this.AB.urlResolve() to return\n * this object.\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlPointer(acrossApp) {\n console.error(\n \"ABQueryCore.urlPointer(): Depreciated: Where is this being called?\"\n );\n return this.application.urlQuery(acrossApp) + this.id;\n }\n\n /**\n * @method isGroup\n *\n * @return {boolean}\n */\n get isGroup() {\n return this.settings.grouping || false;\n }\n\n /**\n * @method isReadOnly\n *\n * @return {boolean}\n */\n get isReadOnly() {\n return true;\n }\n\n /**\n * @method isDisabled()\n * check this contains removed objects or fields\n *\n * @return {boolean}\n */\n isDisabled() {\n return this.disabled || false;\n }\n\n get workspaceFilterConditions() {\n let filterConditions = super.workspaceFilterConditions;\n if (\n filterConditions == null ||\n filterConditions.rules == null ||\n !filterConditions.rules.length\n ) {\n filterConditions = this.where;\n }\n\n return filterConditions;\n }\n};\n","// import ABApplication from \"./ABApplication\"\n\nvar ABMLClass = require(\"../platform/ABMLClass\");\nconst _concat = require(\"lodash/concat\");\n\nconst ABProcessTaskSubProcess = require(\"../platform/process/tasks/ABProcessTaskSubProcess\");\n\nmodule.exports = class ABProcessCore extends ABMLClass {\n constructor(attributes, AB) {\n super([\"label\"], AB);\n\n this.fromValues(attributes);\n\n // indicate we are ready.\n this.elements().forEach((e) => {\n e.onProcessReady();\n });\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n this.id = attributes.id;\n this.name = attributes.name || \"\";\n this.type = attributes.type || \"process\";\n this.xmlDefinition = attributes.xmlDefinition || null;\n\n // this.json = attributes.json || null;\n let currElements = this._elements || {};\n this._elements = {};\n (attributes.elementIDs || []).forEach((eID) => {\n var ele = this.AB.processElementNew(eID, this);\n if (ele) {\n this._elements[eID] = ele;\n } else {\n // current eID isn't one of our definitions yet, so might be\n // a temporary .diagramID from an unsaved task:\n if (currElements[eID]) {\n this._elements[eID] = currElements[eID];\n } else {\n this.emit(\n \"warning\",\n `P[${this.name}] is referencing an unknown process element id[${eID}]`,\n { process: this.id, eID }\n );\n }\n }\n });\n\n this._connections = attributes.connections || {};\n\n super.fromValues(attributes); // perform translation on this object.\n // NOTE: keep this at the end of .fromValues();\n\n if (!this.label) {\n this.label = this.name;\n }\n }\n\n /**\n * @method toObj()\n * properly compile the current state of this ABProcess instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n toObj() {\n // default label value\n if (!this.label) {\n this.label = this.name;\n }\n\n // OP.Multilingual.unTranslate(this, this, [\"label\"]);\n var data = super.toObj();\n\n var fieldsToSave = [\"id\", \"name\", \"xmlDefinition\"];\n fieldsToSave.forEach((f) => {\n data[f] = this[f];\n });\n\n data.elementIDs = [];\n for (var e in this._elements) {\n // NOTE: when a task is initially created, it doesn't have an .id\n // so we need to reference it by it's .diagramID\n data.elementIDs.push(\n this._elements[e].id ?? this._elements[e].diagramID\n );\n }\n\n data.connections = this._connections;\n\n // data.participantIDs = [];\n // for (var p in this._participants) {\n // data.participantIDs.push(this._participants[p].id);\n // }\n\n return data;\n }\n\n //\n // XML Model\n //\n\n /**\n * modelDefinition()\n * return the current xml definition for this process\n * @return {string}\n */\n modelDefinition() {\n return this.xmlDefinition;\n }\n\n /**\n * modelNew()\n * initialze our xml definition to a new state.\n * @return {string}\n */\n modelNew() {\n this.xmlDefinition = `\n\n \n \n \n \n \n \n \n \n \n \n`;\n\n //// TODO: create a default Start Task here??\n }\n\n /**\n * modelUpdate()\n * update our xml definition from the provided description.\n * @param {string} xml bpmn2 xml definition from our modeler.\n * @return {string}\n */\n modelUpdate(xml) {\n this.xmlDefinition = xml;\n }\n\n //\n // Diagram Elements\n //\n\n /**\n * connections()\n * return an array of connections that describe the relationships between\n * our process elements.\n * @param {fn} fn an iterator that returns true if the provided element\n * should be returned.\n * @return [{SimpleConnectionObj}]\n */\n connections(fn = () => true) {\n var allConnections = Object.keys(this._connections).map((e) => {\n return this._connections[e];\n });\n\n // If parent, merge connections\n if (this.process && this.key === \"SubProcess\") {\n allConnections = allConnections.concat(this.process.connections());\n }\n\n return allConnections.filter(fn);\n }\n\n /**\n * connectionForDiagramID()\n * return the connection for the given diagram id\n * @param {string} dID\n * the bpmn:Element diagram id\n */\n connectionForDiagramID(dID) {\n return this.connections((t) => {\n return t.id == dID;\n })[0];\n }\n\n /**\n * connectionsIncoming()\n * return the connections that are entering this Element\n * @param {string} dID\n * the bpmn:Element diagram id\n */\n connectionsIncoming(dID) {\n return this.connections((c) => {\n return c.to == dID;\n });\n }\n\n /**\n * connectionsOutgoing()\n * return the connections that are leaving this Element\n * @param {string} dID\n * the bpmn:Element diagram id\n */\n connectionsOutgoing(dID) {\n return this.connections((c) => {\n return c.from == dID;\n });\n }\n\n /**\n * connectionRemove()\n * remove the connection info for the given bpmn:element\n * @param {BMPNDiagramOBJ} element\n * the {element} returned from the BPMN.io modeling library event.\n */\n connectionRemove(element) {\n delete this._connections[element.id];\n }\n\n /**\n * connectionSimplyElement()\n * given a BPMN diagram element, return a simplified object that describes\n * the connection between two elements.\n * @param {BMPNDiagramOBJ} element\n * the {element} returned from the BPMN.io modeling library event.\n * @return {SimpleConnectionObj}\n * .id : {string} diagram id of the connection element\n * .type : {string} the type of connection\n * .from : {string} the diagram id of the source element\n * .to : {string} the diagram id of the dest element\n */\n connectionSimplyElement(element) {\n var bo = element.businessObject;\n var from = null;\n if (bo.sourceRef) {\n from = bo.sourceRef.id;\n }\n\n var to = null;\n if (bo.targetRef) {\n to = bo.targetRef.id;\n }\n\n var connection = {\n id: element.id,\n type: element.type,\n from: from,\n to: to,\n };\n return connection;\n }\n\n /**\n * connectionUpsert()\n * add or update the connection information for the given bpmn:element\n * @param {BMPNDiagramOBJ} element\n * the {element} returned from the BPMN.io modeling library event.\n */\n connectionUpsert(element) {\n var simpleConn = this.connectionSimplyElement(element);\n if (simpleConn.from && simpleConn.to && element.parent) {\n this._connections[simpleConn.id] = simpleConn;\n } else {\n // this connection is no longer connecting anything thing.\n // it is being removed.\n this.connectionRemove(element);\n }\n }\n\n /**\n * elements()\n * return an array of elements that match the given filter (or all elements\n * if no filter is provided).\n * @param {fn} fn an iterator that returns true if the provided element\n * should be returned.\n * @return {[ABProcessTask, ABProcessParticipant, etc...]}\n */\n elements(fn = () => true) {\n var allElements = Object.keys(this._elements).map((e) => {\n return this._elements[e];\n });\n return allElements.filter(fn);\n }\n\n /**\n * elementAdd()\n * insert an element to be tracked by this process.\n * @param {ABProcessElement} element\n * the full instance of an ABProcessElement to track.\n */\n elementAdd(element) {\n this._elements[element.id || element.diagramID] = element;\n }\n\n /**\n * elementByID()\n * return the {ABProcessElement} that has the given .id\n * @param {string} id\n * @return {ABProcess[OBJ]}\n */\n elementByID(id) {\n return this._elements[id] ?? null;\n }\n\n /**\n * elementForDiagramID()\n * return the object that is tied to the given xml diagram ID.\n * @param {string} dID the diagram ID\n * @return {ABProcess[OBJ]}\n */\n elementForDiagramID(dID) {\n return this.elements((t) => {\n return t.diagramID == dID;\n })[0];\n }\n\n /**\n * elementRemove()\n * remove an element from being tracked by this process.\n * @param {obj|ABProcessElement} def\n * a definition of, or full Object instance of the ABProcessElement\n * to remove.\n */\n elementRemove(def) {\n delete this._elements[def.id || def.diagramID];\n }\n\n /**\n * isTriggeredBy()\n * scan our tasks and see if we have a \"trigger\" task that responds to\n * the provided key.\n * @param {string} key the trigger key\n * @return {bool}\n */\n isTriggeredBy(key) {\n return this.taskForTriggerKey(key) != null;\n }\n\n /**\n * connectionNextTask()\n * return the ABProcessElement(s) that are after the given Element\n * (eg connects to) this element.\n * @param {ABProcessElement} currElement\n * @return {array}\n */\n connectionNextTask(currElement) {\n var elements = [];\n var nextConnections = this.connections((c) => {\n return c.from == currElement.diagramID;\n });\n nextConnections.forEach((c) => {\n var element = this.elements((e) => {\n return e.diagramID == c.to;\n })[0];\n if (element) {\n elements.push(element);\n }\n });\n return elements;\n }\n\n /**\n * connectionPreviousTask()\n * return the ABProcessElement(s) that was a previous Element\n * (eg connects to) this element.\n * @param {ABProcessElement} currElement\n * @return {array}\n */\n connectionPreviousTask(currElement) {\n var elements = [];\n var prevConnections = this.connections((c) => {\n return c.to == currElement.diagramID;\n });\n prevConnections.forEach((c) => {\n var element = this.elements((e) => {\n return e.diagramID == c.from;\n })[0];\n if (element) {\n elements.push(element);\n }\n });\n return elements;\n }\n\n /**\n * processData()\n * return an array of avaiable ABObjects that are represented\n * by the data previous ProcessElements are working with.\n * @param {ABProcessElement} currElement\n * the ABProcessElement that is requesting the data.\n * @return {array} | null\n */\n processData(currElement, params) {\n // var tasksToAsk = this.connectionPreviousTask(currElement);\n // var values = queryPreviousTasks(tasksToAsk, \"processData\", params, this);\n // return values.length > 0\n // ? values.length > 1\n // ? values\n // : values[0]\n // : null;\n\n var tasksToAsk = this.allPreviousTasks(currElement);\n var values = queryPreviousTasks(tasksToAsk, \"processData\", params, this);\n return values.length > 0\n ? values.length > 1\n ? values\n : values[0]\n : null;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can request from other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @param {ABProcessElement} currElement\n * the ABProcessElement that is requesting the data.\n * @return {array} | null\n */\n processDataFields(currElement) {\n var tasksToAsk = this.allPreviousTasks(currElement);\n // var tasksToAsk = this.connectionPreviousTask(currElement);\n var fields = queryPreviousTasks(\n tasksToAsk,\n \"processDataFields\",\n null,\n this\n );\n // Include data from the main process as well\n if (this.key === \"SubProcess\") {\n const parentFields = this.process.processDataFields(this);\n if (parentFields) {\n fields.push(...parentFields);\n }\n }\n return fields.length > 0 ? fields : null;\n }\n\n /**\n * allPreviousConnections()\n * walk through the current graph and return all the previous connections\n * leading up to the given {ProcessElement}\n * @param {Connection} conn\n * @param {hash} hashConn\n * { connection.id : connection }\n * @return {array}\n */\n allPreviousConnectionsForConnection(conn, hashConn) {\n var prevConnections = this.connections((c) => {\n return c.to == conn.from;\n });\n\n prevConnections.forEach((c) => {\n if (!hashConn[c.id]) {\n hashConn[c.id] = c;\n this.allPreviousConnectionsForConnection(c, hashConn);\n }\n });\n }\n allPreviousConnectionsForElement(currElement) {\n var prevConnections = this.connections((c) => {\n return c.to == currElement.diagramID;\n });\n var hashConn = {\n /* connection.id : connection */\n };\n // hashConn will contains the final collection of connections.\n\n prevConnections.forEach((c) => {\n hashConn[c.id] = c;\n this.allPreviousConnectionsForConnection(c, hashConn);\n });\n\n // TODO: detect circle backs and remove connections that\n // resolve back to currElement\n\n // convert our hash into an array\n return Object.keys(hashConn).map((k) => hashConn[k]);\n }\n\n allPreviousTasks(currElement) {\n var prevTasks = {}; /* task.id : task */\n var allPreviousConnections =\n this.allPreviousConnectionsForElement(currElement);\n var task;\n allPreviousConnections.forEach((conn) => {\n // each conn has a .to and a .from => grab both tasks\n task = this.elementForDiagramID(conn.to);\n if (task) prevTasks[task.id] = task;\n\n task = this.elementForDiagramID(conn.from);\n if (task) prevTasks[task.id] = task;\n });\n\n var tasksToAsk = Object.keys(prevTasks)\n .map((k) => prevTasks[k])\n .filter((t) => t.id != currElement.id);\n\n return tasksToAsk;\n }\n\n /**\n * processDataObjects()\n * return an array of avaiable ABObjects that are represented\n * by the data previous ProcessElements are working with.\n * @param {ABProcessElement} currElement\n * the ABProcessElement that is requesting the data.\n * @return {array} | null\n */\n processDataObjects(currElement) {\n var tasksToAsk = this.connectionPreviousTask(currElement);\n var fields = queryPreviousTasks(\n tasksToAsk,\n \"processDataObjects\",\n null,\n this\n );\n return fields.length > 0 ? fields : null;\n }\n\n /**\n * taskForTriggerKey()\n * return one or more tasks that respond to the given trigger key\n * @param {string} key a trigger key\n * @return {[ABProcessTask,...]}\n */\n taskForTriggerKey(key) {\n var trigger = this.elements((t) => {\n return t.triggerKey == key;\n })[0];\n if (trigger) {\n return trigger;\n } else {\n return null;\n }\n }\n\n //\n // Participants\n //\n\n // /**\n // * participants()\n // * return an array of participants that match the given filter (or all tasks\n // * if no filter is provided).\n // * @param {fn} fn an iterator that returns true if the provided participants\n // * should be returned.\n // * @return {[ABProcessParticipant,...]}\n // */\n // participants(fn) {\n // if (!fn)\n // fn = () => {\n // return true;\n // };\n // var all = Object.keys(this._participants).map((p) => {\n // return this._participants[p];\n // });\n // return all.filter(fn);\n // }\n\n // /**\n // * participantsForDiagramID()\n // * return the participant(s) that are tied to the given xml diagram ID.\n // * @param {string} dID the diagram ID\n // * @return {[ABProcessParticipant,...]}\n // */\n // participantsForDiagramID(dID) {\n // return this.participants((p) => {\n // return p.diagramID == dID;\n // });\n // }\n};\n\nvar queryPreviousTasks = (\n list,\n method,\n param,\n process,\n responses,\n processedIDs\n) => {\n // recursive fn() to step through our graph and compile\n // results.\n if (typeof responses == \"undefined\") {\n responses = [];\n }\n if (typeof processedIDs == \"undefined\") {\n processedIDs = [];\n }\n if (list.length == 0) {\n return responses;\n } else {\n // get next task\n const task = list.shift();\n\n // if we haven't already done task:\n if (processedIDs.indexOf(task.diagramID) == -1) {\n // mark this task as having been processed\n processedIDs.push(task.diagramID);\n\n let value = null;\n\n // get any field's it provides\n if (!(task instanceof ABProcessTaskSubProcess))\n value = task[method].apply(task, param);\n\n // value = task[method].apply(task, param);\n\n if (value == null) value = [];\n responses = _concat(responses, value);\n\n // add any previous tasks to our list\n list = _concat(list, process.connectionPreviousTask(task));\n }\n\n // process next Task\n return queryPreviousTasks(\n list,\n method,\n param,\n process,\n responses,\n processedIDs\n );\n }\n};\n","// import ABApplication from \"./ABApplication\"\n\nvar ABMLClass = require(\"../platform/ABMLClass\");\nconst _concat = require(\"lodash/concat\");\n\nmodule.exports = class ABStepCore extends ABMLClass {\n constructor(attributes, AB) {\n super([\"name\", \"text\"], AB);\n\n this.fromValues(attributes);\n\n // indicate we are ready.\n // this.elements().forEach((e) => {\n // e.onProcessReady();\n // });\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n this.id = attributes.id;\n this.name = attributes.name || \"New Step\";\n this.type = attributes.type || \"step\";\n this.text = attributes.text || \"\";\n this.settings = attributes.settings || {};\n this.settings.event = attributes?.settings?.event || \"click\";\n this.settings.el = attributes?.settings?.el || \"\";\n // this.xmlDefinition = attributes.xmlDefinition || null;\n\n super.fromValues(attributes); // perform translation on this object.\n // NOTE: keep this at the end of .fromValues();\n\n if (!this.label) {\n this.label = this.name;\n }\n }\n\n /**\n * @method toObj()\n * properly compile the current state of this ABProcess instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n toObj() {\n // debugger;\n // default label value\n if (!this.label) {\n this.label = this.name;\n }\n\n // OP.Multilingual.unTranslate(this, this, [\"label\"]);\n var data = super.toObj();\n\n var fieldsToSave = [\"id\", \"name\", \"settings\", \"type\"];\n fieldsToSave.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n\n // /**\n // * steps()\n // * return an array of steps that match the given filter (or all steps\n // * if no filter is provided).\n // * @param {fn} fn an iterator that returns true if the provided element\n // * should be returned.\n // * @return {[ABStep]}\n // */\n // steps(fn = () => true) {\n // var allSteps = Object.keys(this._steps).map((e) => {\n // return this._steps[e];\n // });\n // return allSteps.filter(fn);\n // }\n\n // /**\n // * stepAdd()\n // * insert a step to be added to this hint.\n // * @param {ABStep} element\n // * the full instance of an ABStep to track.\n // */\n // stepAdd(step) {\n // this._steps[step.id] = step;\n // }\n\n // /**\n // * stepByID()\n // * return the {ABStep} that has the given .id\n // * @param {string} id\n // * @return {ABStep[OBJ]}\n // */\n // stepByID(id) {\n // return this._step[id] ?? null;\n // }\n\n // /**\n // * stepRemove()\n // * remove a step from being displayed by this hint.\n // * @param {obj|ABStep} def\n // * a definition of, or full Object instance of the ABStep\n // * to remove.\n // */\n // stepRemove(def) {\n // delete this._steps[def.id];\n // }\n};\n","/*\n * ABViewManager\n *\n * An interface for managing the different ABViews available in our AppBuilder.\n *\n */\n\nvar AllViews = [\n require(\"../platform/views/ABView\"),\n require(\"../platform/views/ABViewCarousel\"),\n require(\"../platform/views/ABViewChart\"),\n require(\"../platform/views/ABViewChartArea\"),\n require(\"../platform/views/ABViewChartBar\"),\n require(\"../platform/views/ABViewChartLine\"),\n require(\"../platform/views/ABViewChartPie\"),\n require(\"../platform/views/ABViewComment\"),\n require(\"../platform/views/ABViewConditionalContainer\"),\n require(\"../platform/views/ABViewConnectDataFilter\"),\n require(\"../platform/views/ABViewContainer\"),\n require(\"../platform/views/ABViewCSVExporter\"),\n require(\"../platform/views/ABViewCSVImporter\"),\n require(\"../platform/views/ABViewDataFilter\"),\n require(\"../platform/views/ABViewDataSelect\"),\n require(\"../platform/views/ABViewDataview\"),\n require(\"../platform/views/ABViewDocxBuilder\"),\n require(\"../platform/views/ABViewGrid\"),\n require(\"../platform/views/ABViewImage\"),\n require(\"../platform/views/ABViewLabel\"),\n require(\"../platform/views/ABViewLayout\"),\n require(\"../platform/views/ABViewList\"),\n require(\"../platform/views/ABViewMenu\"),\n require(\"../platform/views/ABViewPage\"),\n require(\"../platform/views/ABViewPDFImporter\"),\n require(\"../platform/views/ABViewPivot\"),\n require(\"../platform/views/ABViewTab\"),\n require(\"../platform/views/ABViewText\"),\n\n //\n // Special Editors\n //\n require(\"../platform/views/ABViewGantt\"),\n require(\"../platform/views/ABViewKanban\"),\n require(\"../platform/views/ABViewReportsManager\"),\n require(\"../platform/views/ABViewScheduler\"),\n\n //\n // Detail Components\n //\n require(\"../platform/views/ABViewDetail\"),\n require(\"../platform/views/ABViewDetailCheckbox\"),\n require(\"../platform/views/ABViewDetailConnect\"),\n require(\"../platform/views/ABViewDetailCustom\"),\n require(\"../platform/views/ABViewDetailImage\"),\n // require(\"../platform/views/ABViewDetailSelectivity\"),\n require(\"../platform/views/ABViewDetailText\"),\n require(\"../platform/views/ABViewDetailTree\"),\n\n //\n // Form Components\n //\n require(\"../platform/views/ABViewForm\"),\n require(\"../platform/views/ABViewFormButton\"),\n require(\"../platform/views/ABViewFormCheckbox\"),\n require(\"../platform/views/ABViewFormConnect\"),\n require(\"../platform/views/ABViewFormCustom\"),\n require(\"../platform/views/ABViewFormDatepicker\"),\n require(\"../platform/views/ABViewFormJson\"),\n require(\"../platform/views/ABViewFormNumber\"),\n require(\"../platform/views/ABViewFormReadonly\"),\n require(\"../platform/views/ABViewFormSelectMultiple\"),\n require(\"../platform/views/ABViewFormSelectSingle\"),\n require(\"../platform/views/ABViewFormTextbox\"),\n require(\"../platform/views/ABViewFormTree\"),\n];\n\n/*\n * Views\n * A name => ABView hash of the different ABViews available.\n */\nvar Views = {};\nAllViews.forEach((v) => {\n if (v.default?.common) {\n v = v.default;\n }\n Views[v.common().key] = v;\n});\n\nmodule.exports = class ABViewManagerCore {\n /**\n * @function allViews\n * return all the currently defined ABViews in an array.\n * @return [{ABView},...]\n */\n static allViews(fn = () => true) {\n var views = [];\n for (var v in Views) {\n var V = Views[v];\n if (fn(V)) {\n views.push(V);\n }\n }\n return views;\n }\n\n /**\n * @function newView\n * return an instance of an ABView based upon the values.key value.\n * @return {ABView}\n */\n static newView(values, application, parent) {\n parent = parent || null;\n\n if (values.key == \"detailselectivity\") {\n values.key = \"detailconnect\";\n }\n\n //\t\tif ((values.key) && (Views[values.key])) {\n if (values.key) {\n if (!Views[values.key]) {\n if (!isPlugin(values.key)) {\n console.error(\n \"!! View[\" +\n values.key +\n \"] not yet defined. Have an ABView instead:\"\n );\n }\n return new Views[\"view\"](values, application, parent);\n }\n\n return new Views[values.key](values, application, parent);\n } else {\n var err = new Error(`Unknown view key [${values.key}]`);\n console.error(err); // show the stack.\n console.error({\n error: err,\n values: values,\n application: application,\n });\n return null;\n }\n }\n\n static viewClass(key) {\n if (Views[key]) {\n return Views[key];\n }\n console.error(`Unknown View Key[${key}]`);\n return;\n }\n\n static addViewClass(View) {\n Views[View.common().key] = View;\n }\n};\n\n/**\n * Check if the key starts with plugin_\n */\nfunction isPlugin(key) {\n return key.split(\"_\")[0] === \"plugin\";\n}\n","/*\n * ABViewManagerMobile\n *\n * An interface for managing the different ABViews available in our AppBuilder.\n *\n */\n\n/*\n * Views\n * A name => ABView hash of the different ABViews available.\n */\nvar Views = {};\n[\n require(\"../platform/mobile/ABMobilePage\"),\n require(\"../platform/mobile/ABMobileView\"),\n require(\"../platform/mobile/ABMobileViewCustom\"),\n require(\"../platform/mobile/ABMobileViewForm\"),\n require(\"../platform/mobile/ABMobileViewFormButton\"),\n require(\"../platform/mobile/ABMobileViewFormCheckbox\"),\n require(\"../platform/mobile/ABMobileViewFormConnect\"),\n require(\"../platform/mobile/ABMobileViewFormDate\"),\n require(\"../platform/mobile/ABMobileViewFormDatetime\"),\n require(\"../platform/mobile/ABMobileViewFormEmail\"),\n require(\"../platform/mobile/ABMobileViewFormFile\"),\n require(\"../platform/mobile/ABMobileViewFormFormula\"),\n require(\"../platform/mobile/ABMobileViewFormImage\"),\n require(\"../platform/mobile/ABMobileViewFormNumber\"),\n require(\"../platform/mobile/ABMobileViewFormReadonly\"),\n require(\"../platform/mobile/ABMobileViewFormSelectMultiple\"),\n require(\"../platform/mobile/ABMobileViewFormSelectSingle\"),\n require(\"../platform/mobile/ABMobileViewFormTextbox\"),\n require(\"../platform/mobile/ABMobileViewLabel\"),\n require(\"../platform/mobile/ABMobileViewList\"),\n require(\"../platform/mobile/ABMobileViewTimeline\"),\n].forEach((v) => {\n if (v.default?.common) {\n v = v.default;\n }\n Views[v.common().key] = v;\n});\n\nmodule.exports = class ABViewManagerCore {\n /**\n * @function allViews\n * return all the currently defined ABViews in an array.\n * @return [{ABView},...]\n */\n static allViews(fn = () => true) {\n var views = [];\n for (var v in Views) {\n var V = Views[v];\n if (fn(V)) {\n views.push(V);\n }\n }\n return views;\n }\n\n /**\n * @function newView\n * return an instance of an ABView based upon the values.key value.\n * @return {ABView}\n */\n static newView(values, application, parent) {\n parent = parent || null;\n\n if (values.key == \"detailselectivity\") {\n values.key = \"detailconnect\";\n }\n\n //\t\tif ((values.key) && (Views[values.key])) {\n if (values.key) {\n if (!Views[values.key]) {\n console.error(\n \"!! View[\" +\n values.key +\n \"] not yet defined. Have an ABView instead:\"\n );\n return new Views[\"mobile-view\"](values, application, parent);\n }\n\n return new Views[values.key](values, application, parent);\n } else {\n var err = new Error(`Unknown view key [${values.key}]`);\n console.error(err); // show the stack.\n console.error({\n error: err,\n values: values,\n application: application,\n });\n return null;\n }\n }\n\n static viewClass(key) {\n if (Views[key]) {\n return Views[key];\n }\n console.error(`Unknown View Key[${key}]`);\n return;\n }\n};\n","const ABComponent = require(\"../platform/ABComponent\");\n// const ABObjectQuery = require(\"../platform/ABObjectQuery\");\n\n/**\n * support get data from objects and queries\n */\nfunction getFieldVal(rowData, field) {\n if (!field) return null;\n if (!field.columnName) return null;\n const columnName = field.columnName;\n\n let value = null;\n\n if (columnName.indexOf(\".\") > -1) {\n let colName = columnName.split(\".\")[1];\n value = rowData[columnName] || rowData[colName];\n } else {\n value = rowData[columnName];\n }\n\n // pull relation data\n if (value == null && field.relationName) {\n const relationName = field.relationName();\n const pureRelationName = relationName.split(\".\")[1]; // support [BASE_OBJECT.columnName] field name of ABQuery\n value = rowData[relationName] || rowData[pureRelationName];\n }\n\n if (value != null && !isNaN(value)) {\n return value;\n }\n\n // otherwise, this might be a process check where the rowData keys have\n // '[diagramID].[field.id]'\n for (const k in rowData) {\n const key = k.split(\".\")[1];\n if (key && key == field.id) {\n value = rowData[k];\n }\n }\n\n if (\n (value == null || (typeof value == \"number\" && isNaN(value))) &&\n field.format\n )\n value = field.format(rowData);\n\n return value;\n}\n\nfunction getConnectFieldValue(rowData, field) {\n let connectedVal = \"\";\n\n const extractVal = (itemData) => {\n let val;\n const relationName = field.relationName();\n if (itemData[relationName]) {\n val =\n (field.indexField\n ? itemData[relationName][field.indexField.columnName]\n : null) ?? // custom index\n (field.indexField2\n ? itemData[relationName][field.indexField2.columnName]\n : null) ?? // custom index 2\n itemData[relationName].id ??\n itemData[relationName];\n } else {\n let fieldVal = getFieldVal(itemData, field);\n if (fieldVal != null) {\n val = fieldVal;\n }\n }\n return val;\n };\n\n if (Array.isArray(rowData)) {\n connectedVal = rowData.map((data) => extractVal(data));\n } else if (rowData) {\n connectedVal = extractVal(rowData);\n }\n return connectedVal;\n}\n\nmodule.exports = class FilterComplexCore extends ABComponent {\n constructor(idBase, AB) {\n idBase = idBase || \"ab_filter_complex\";\n\n if (typeof AB === \"undefined\") {\n console.error(\"FilterComplexCore(): being called without an AB!\");\n }\n\n super(null, idBase, AB);\n\n this.Account = { username: \"??\", email: \"??\" };\n this._settings = {};\n this.condition = {};\n // const batchName; // we need to revert to this default when switching away from a in/by query field\n\n this._QueryFields = [];\n this._Fields;\n\n // internal business logic\n const _logic = (this._logic = {\n callbacks: {\n onChange: () => {},\n },\n\n removeHtmlTags: function (text) {\n let result = \"\";\n try {\n let div = document.createElement(\"div\");\n div.innerHTML = text;\n\n result = div.textContent || div.innerText || \"\";\n } catch (err) {\n result = (text || \"\").replace(/(<([^>]+)>)/gi, \"\");\n }\n\n return result;\n },\n });\n\n // Interface methods for parent component:\n // this.objectLoad = _logic.objectLoad;\n // this.viewLoad = _logic.viewLoad;\n // this.setValue = _logic.setValue;\n // this.isValid = _logic.isValid;\n }\n\n init(options = {}) {\n this._settings = options;\n }\n\n /**\n * @method isValid\n * validate the row data is valid filter condition\n *\n * @param rowData {Object} - data row\n * @param condition {Object} - [Optional] {\n * glue: \"and\" | \"or\",\n * rules: []\n * }\n */\n isValid(rowData, condition = this.condition) {\n // If conditions but no data return false\n if (condition?.rules?.length && rowData == null) return false;\n\n // If no conditions, then return true\n if (!condition?.rules?.length || rowData == null) return true;\n\n let result = condition.glue === \"and\" ? true : false;\n\n condition.rules.forEach((filter) => {\n // Nested filters\n if (filter?.rules?.length) {\n if (condition.glue === \"or\")\n result = result || this.isValid(rowData, filter);\n else result = result && this.isValid(rowData, filter);\n return;\n }\n // Skip incomplete filter condition\n else if (!filter || !filter.key || !filter.rule) return;\n\n const fieldInfo = (this._Fields || []).filter(\n (f) => f.id == filter.key || f.columnName == filter.key\n )[0];\n\n if (!fieldInfo) return;\n\n let condResult = null;\n\n // Filters that have \"this_object\" don't have a fieldInfo.key, so in that case,\n // define a special .key == \"this_object\"\n let ruleFieldType = fieldInfo.key;\n\n if (typeof fieldInfo.key == \"undefined\") {\n if (fieldInfo.id != \"this_object\") {\n fieldInfo.key = \"connectField\"; // if you are looking at the parent object it won't have a key to analyze\n ruleFieldType = fieldInfo.key;\n } else ruleFieldType = \"this_object\";\n }\n\n let value = null;\n\n if (fieldInfo.relationName) {\n value = getConnectFieldValue(rowData, fieldInfo);\n } else {\n value = getFieldVal(rowData, fieldInfo);\n }\n\n switch (ruleFieldType) {\n case \"string\":\n case \"LongText\":\n case \"email\":\n if (value == null) value = \"\";\n\n condResult = this.textValid(value, filter.rule, filter.value);\n break;\n case \"date\":\n case \"datetime\":\n condResult = this.dateValid(value, filter.rule, filter.value);\n break;\n case \"number\":\n case \"calculate\":\n case \"formula\":\n condResult = this.numberValid(value, filter.rule, filter.value);\n break;\n case \"list\":\n condResult = this.listValid(value, filter.rule, filter.value);\n break;\n case \"boolean\":\n condResult = this.booleanValid(value, filter.rule, filter.value);\n break;\n case \"user\":\n condResult = this.userValid(value, filter.rule, filter.value);\n break;\n case \"connectField\":\n case \"connectObject\":\n condResult = this.connectFieldValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"this_object\":\n condResult = this.thisObjectValid(\n rowData,\n filter.rule,\n filter.value\n );\n break;\n }\n\n if (condition.glue === \"and\") {\n result = result && condResult;\n } else {\n result = result || condResult;\n }\n });\n\n return result;\n }\n\n textValid(value, rule, compareValue) {\n let result = false;\n\n value = value.trim().toLowerCase();\n value = this._logic.removeHtmlTags(value); // remove html tags - rich text editor\n\n compareValue = compareValue.trim().toLowerCase().replace(/ +/g, \" \");\n\n // support \"john smith\" => \"john\" OR/AND \"smith\"\n const compareArray = compareValue.split(\" \");\n\n switch (rule) {\n case \"contains\":\n compareArray.forEach((val) => {\n if (result == false)\n // OR\n result = value.indexOf(val) > -1;\n });\n break;\n case \"not_contains\":\n result = true;\n compareArray.forEach((val) => {\n if (result == true)\n // AND\n result = value.indexOf(val) < 0;\n });\n break;\n case \"equals\":\n compareArray.forEach((val) => {\n if (result == false)\n // OR\n result = value == val;\n });\n break;\n case \"not_equal\":\n result = true;\n compareArray.forEach((val) => {\n if (result == true)\n // AND\n result = value != val;\n });\n break;\n case \"is_empty\":\n result = value == \"\" || value == null;\n break;\n case \"is_not_empty\":\n result = value != \"\" && value != null;\n break;\n default:\n result = this.queryFieldValid(value, rule, compareValue);\n break;\n }\n\n return result;\n }\n\n dateValid(value, rule, compareValue) {\n let result = false;\n\n if (value && !(value instanceof Date)) value = new Date(value);\n\n if (compareValue && !(compareValue instanceof Date))\n compareValue = new Date(compareValue);\n switch (rule) {\n case \"less\":\n result = value < compareValue;\n break;\n case \"greater\":\n result = value > compareValue;\n break;\n case \"less_or_equal\":\n result = value <= compareValue;\n break;\n case \"greater_or_equal\":\n result = value >= compareValue;\n break;\n case \"less_current\":\n result = value.setHours?.(0, 0, 0, 0) < (new Date()).setHours(0, 0, 0, 0);\n break;\n case \"greater_current\":\n result = value.setHours?.(0, 0, 0, 0) > (new Date()).setHours(0, 0, 0, 0);\n break;\n case \"less_or_equal_current\":\n result = value.setHours?.(0, 0, 0, 0) <= (new Date()).setHours(0, 0, 0, 0);\n break;\n case \"greater_or_equal_current\":\n result = value.setHours?.(0, 0, 0, 0) >= (new Date()).setHours(0, 0, 0, 0);\n break\n case \"is_current_date\":\n result =\n value.setHours?.(0, 0, 0, 0) == compareValue.setHours(0, 0, 0, 0);\n break;\n case \"is_null\":\n case \"is_empty\":\n result = !value;\n break;\n case \"is_not_null\":\n case \"is_not_empty\":\n result = !!value;\n break;\n default:\n result = this.queryFieldValid(value, rule, compareValue);\n break;\n }\n return result;\n }\n\n numberValid(value, rule, compareValue) {\n let result = false;\n\n value = Number(value);\n compareValue = Number(compareValue);\n\n switch (rule) {\n case \"equal\":\n case \"equals\":\n result = value == compareValue;\n break;\n case \"not_equal\":\n result = value != compareValue;\n break;\n case \"less\":\n result = value < compareValue;\n break;\n case \"greater\":\n result = value > compareValue;\n break;\n case \"less_or_equal\":\n result = value <= compareValue;\n break;\n case \"greater_or_equal\":\n result = value >= compareValue;\n break;\n default:\n result = this.queryFieldValid(value, rule, compareValue);\n break;\n }\n\n return result;\n }\n\n listValid(value, rule, compareValue) {\n let result = false;\n\n // compareValue = compareValue.toLowerCase();\n\n if (!Array.isArray(compareValue)) compareValue = [compareValue];\n\n switch (rule) {\n case \"equals\":\n if (value) result = compareValue.indexOf(value) > -1;\n break;\n case \"not_equal\":\n if (value) result = compareValue.indexOf(value) < 0;\n else result = true;\n break;\n default:\n result = this.queryFieldValid(value, rule, compareValue);\n break;\n }\n\n return result;\n }\n\n booleanValid(value, rule, compareValue) {\n let result = false;\n\n switch (rule) {\n case \"checked\":\n result = value == true || value > 0 || value == \"true\";\n break;\n case \"unchecked\":\n result =\n value == false ||\n value <= 0 ||\n value == \"false\" ||\n value == null;\n break;\n default:\n result = this.queryFieldValid(value, rule, compareValue);\n break;\n }\n\n return result;\n }\n\n emailValid(value, rule, compareValue) {\n let result = false;\n\n switch (rule) {\n case \"is_current_email\":\n result = value == compareValue;\n break;\n case \"is_not_current_email\":\n result = value != compareValue;\n break;\n }\n\n return result;\n }\n\n userValid(value, rule, compareValue) {\n if (!value || !value?.length) return false;\n let result = false;\n\n if (!Array.isArray(value)) value = [value];\n\n /* eslint-disable no-fallthrough */\n switch (rule) {\n case \"is_current_user\":\n result =\n value.filter((v) => (v?.username || v) == this.Account.username)\n .length > 0;\n break;\n case \"is_not_current_user\":\n result =\n value.filter((v) => (v?.username || v) != this.Account.username)\n .length > 0;\n break;\n case \"contain_current_user\":\n compareValue = this.Account.username;\n // break; <-- NO BREAK HERE: fall through to \"equals\"\n\n case \"equals\":\n result =\n value.filter((v) => (v?.username || v) == compareValue).length >\n 0;\n break;\n case \"not_contain_current_user\":\n compareValue = this.Account.username;\n // break; <-- NO BREAK HERE: fall through to \"not_equals\"\n\n case \"not_equal\":\n result =\n value.filter((v) => (v?.username || v) == compareValue).length <\n 1;\n break;\n default:\n result = this.queryFieldValid(value, rule, compareValue);\n break;\n }\n /* eslint-enable no-fallthrough */\n\n return result;\n }\n\n queryFieldValid(rowData, rule, compareValue) {\n let result = false;\n\n if (!compareValue) return result;\n\n // queryId:fieldId\n const queryId = compareValue.split(\":\")[0],\n fieldId = compareValue.split(\":\")[1];\n\n // if no query\n const query = this.AB.queries((q) => q.id == queryId)[0];\n if (!query) return result;\n\n // if no field\n const field = query.fields((f) => f.id == fieldId)[0];\n if (!field) return result;\n\n let qIdBase = \"{idBase}-query-field-{id}\"\n .replace(\"{idBase}\", this.idBase)\n .replace(\"{id}\", query.id),\n inQueryFieldFilter = new this.constructor(qIdBase, this.AB);\n inQueryFieldFilter.Account = this.Account;\n inQueryFieldFilter.fieldsLoad(query.fields());\n inQueryFieldFilter.setValue(query.workspaceFilterConditions);\n\n switch (rule) {\n case \"in_query_field\":\n result = inQueryFieldFilter.isValid(rowData);\n break;\n case \"not_in_query_field\":\n result = !inQueryFieldFilter.isValid(rowData);\n break;\n }\n\n return result;\n }\n\n inQueryValid(rowData, rule, compareValue) {\n let result = false;\n\n if (!compareValue || !this.AB) return result;\n\n // if no query\n let query = this.AB.queries((q) => q.id == compareValue)[0];\n if (!query) return result;\n\n let qIdBase = \"{idBase}-query-{id}\"\n .replace(\"{idBase}\", this.idBase)\n .replace(\"{id}\", query.id),\n inQueryFilter = new this.constructor(qIdBase, this.AB);\n inQueryFilter.Account = this.Account;\n inQueryFilter.fieldsLoad(query.fields());\n inQueryFilter.setValue(query.workspaceFilterConditions);\n\n switch (rule) {\n case \"in_query\":\n result = inQueryFilter.isValid(rowData);\n break;\n case \"not_in_query\":\n result = !inQueryFilter.isValid(rowData);\n break;\n }\n\n return result;\n }\n\n dataCollectionValid(value, rule, compareValue) {\n let result = false;\n\n if (!compareValue) return result;\n\n let dc = this.AB.datacollections((d) => d.id == compareValue)[0];\n\n switch (rule) {\n case \"in_data_collection\":\n if (!dc) return false;\n\n result = dc.getData((d) => d.id == value.id).length > 0;\n break;\n case \"not_in_data_collection\":\n if (!dc) return true;\n\n result = dc.getData((d) => d.id == value.id).length < 1;\n break;\n }\n\n return result;\n }\n\n connectFieldValid(rowData, field, rule, compareValue) {\n let relationName = field.relationName();\n\n let connectedVal = \"\";\n\n let linkType = field.linkType();\n\n if (rowData) {\n if (rowData[relationName]) {\n if (linkType == \"many\") {\n // lets get an array of connected ids => stringified()\n connectedVal = JSON.stringify(\n getConnectFieldValue(rowData, field).map((i) => i.id || i)\n );\n } else {\n // connectedVal = (\n // (field.indexField\n // ? rowData[relationName][field.indexField.columnName]\n // : null) ?? // custom index\n // (field.indexField2\n // ? rowData[relationName][field.indexField2.columnName]\n // : null) ?? // custom index 2\n // rowData[relationName].id ??\n // rowData[relationName]\n // )\n connectedVal = getConnectFieldValue(rowData, field)\n .toString()\n .toLowerCase();\n }\n } else {\n let fieldVal = getFieldVal(rowData, field);\n if (fieldVal != null) {\n connectedVal = fieldVal;\n }\n }\n }\n\n // If value will be the connected object, then pull value (string)\n if (typeof connectedVal == \"object\") {\n connectedVal =\n (field.indexField\n ? connectedVal[field.indexField.columnName]\n : null) ??\n (field.indexField2\n ? connectedVal[field.indexField2.columnName]\n : null) ??\n connectedVal[field.columnName] ??\n connectedVal.id ??\n connectedVal;\n }\n\n // Compare value isn't always a string?\n // https://appdev-designs.sentry.io/issues/5056850389/\n let compareValueLowercase =\n typeof compareValue === \"string\"\n ? compareValue.toLowerCase?.()\n : compareValue;\n\n // NOTE: if linkType == many, and rule is equals/not_equal,\n // these will be interpreted as \"contains/not_contains\"\n let ruleSafe = rule;\n if (linkType == \"many\") {\n switch (rule) {\n case \"equals\":\n ruleSafe = \"contains\";\n break;\n case \"not_equal\":\n ruleSafe = \"not_contains\";\n break;\n }\n }\n\n switch (ruleSafe) {\n case \"contains\":\n return connectedVal.toString().indexOf(compareValueLowercase) > -1;\n case \"not_contains\":\n return connectedVal.toString().indexOf(compareValueLowercase) == -1;\n case \"equals\":\n return connectedVal == compareValueLowercase;\n case \"not_equal\":\n return connectedVal != compareValueLowercase;\n case \"in_query\":\n case \"not_in_query\":\n return this.inQueryValid(rowData[relationName], rule, compareValue);\n case \"is_current_user\":\n case \"is_not_current_user\":\n case \"contain_current_user\":\n case \"not_contain_current_user\":\n return this.userValid(connectedVal, rule, compareValue);\n case \"is_empty\":\n return (\n rowData[relationName] == null ||\n rowData[relationName].length < 1 ||\n rowData[relationName] == \"\"\n );\n case \"is_not_empty\":\n return (\n rowData[relationName] != null &&\n ((Array.isArray(rowData[relationName]) &&\n rowData[relationName].length > 0) ||\n rowData[relationName] != \"\")\n );\n case \"in_data_collection\":\n case \"not_in_data_collection\":\n return this.dataCollectionValid(connectedVal, rule, compareValue);\n }\n }\n\n thisObjectValid(rowData, rule, compareValue) {\n let result = false;\n let query = null;\n let listThisObjects = null;\n let alias = null;\n let newRowData = null;\n\n switch (rule) {\n // if in_query condition\n case \"in_query\":\n case \"not_in_query\":\n if (!this._Object) return result;\n\n // if > 1 copy of this object in query ==> Error!\n query = this.AB.queries((q) => q.id == compareValue)[0];\n\n if (!query) return result;\n\n listThisObjects = query.objects((o) => {\n return o.id == this._Object.id;\n });\n\n if (listThisObjects.length > 1) {\n // Alternative: choose the 1st instance of this object in the query, and make the compare on that.\n // Be sure to warn the developer of the limitiations of an \"this_object\" \"in_query\" when query has > 1 copy of\n // this object as part of the query.\n\n console.error(\n \"HEY! Can't compare this_object to a query that has > 1 copy of that object!\"\n );\n\n return true;\n }\n\n // get this object's alias from the query\n alias = query.objectAlias(this._Object.id);\n\n // make sure all my columns in rowData are prefixed by \"alias\".columnName\n newRowData = {};\n\n Object.keys(rowData).forEach((key) => {\n newRowData[`${alias}.${key}`] = rowData[key];\n });\n\n // then pass this on to the _logic.queryValid();\n return this.inQueryValid(newRowData, rule, compareValue);\n\n // if in_datacollection condition\n case \"in_data_collection\":\n case \"not_in_data_collection\":\n // send rowData, null to datacollectionValid()\n return this.dataCollectionValid(rowData, rule, compareValue);\n }\n }\n\n processFieldsLoad(processFields = []) {\n if (processFields && !Array.isArray(processFields)) {\n processFields = [processFields];\n }\n this._ProcessFields = processFields;\n\n this.uiInit();\n }\n\n /**\n * @method fieldsLoad\n * set fields\n *\n * @param array {ABField}\n * @param object {ABObject} [optional]\n */\n fieldsLoad(fields = [], object = null) {\n this._Fields = fields.filter(\n (f) => f && f.fieldIsFilterable && f.fieldIsFilterable()\n );\n this._QueryFields = this._Fields\n ? this._Fields.filter((f) => f && f.isConnection && f.key != \"user\")\n : [];\n\n // insert our 'this object' entry if an Object was given.\n if (object) {\n this._Object = object;\n\n // insert our uuid in addition to the rest of our fields\n let thisObjOption = {\n id: \"this_object\",\n label: object.label,\n key: \"uuid\",\n };\n\n // If object is query ,then should define default alias: \"BASE_OBJECT\"\n // NOTE: Could not reference ABObjectQuery because recursive looping reference\n // if (object instanceof ABObjectQuery) {\n if (object.viewName) {\n thisObjOption.alias = \"BASE_OBJECT\";\n }\n\n this._Fields.unshift(thisObjOption);\n } else {\n delete this._Object;\n }\n }\n\n fieldsToQB() {\n /*\n let mapTypes = {\n LongText: \"string\",\n email: \"string\",\n datetime: \"date\",\n connectField: \"connectObject\"\n };\n\n const fields = this._Fields.map((f) => {\n // Label\n let label = f.label;\n if (this._settings.showObjectName && f.object && f.object.label)\n label = `${f.object.label}.${f.label}`;\n\n // Type\n let type = f.key || f.type;\n if (mapTypes[type]) type = mapTypes[type];\n\n // the format for webix querybuilder:\n // { id value:\"label\" type }\n // type: {string} the type of value it is.\n // since we want to tailor value selectors per field,\n // we will make a unique type for each field. and then\n // add value selectors for that specific .type\n return { id: f.columnName, value: label, type: type };\n });\n return fields;\n */\n\n let fields = (this._Fields || []).map((f) => {\n let label = f.label;\n if (this._settings.showObjectName && f.object && f.object.label)\n label = `${f.object.label}.${f.label}`;\n\n let type = \"text\"; // \"text\", \"number\", \"date\"\n let conditions = [];\n let processFieldKeys = [];\n let hasQueryField = true;\n\n if (!this._settings.isProcessParticipant)\n switch (f.key) {\n case \"boolean\":\n conditions = conditions.concat(\n this.fieldsAddFiltersBoolean(f)\n );\n processFieldKeys = [\"boolean\"];\n\n break;\n\n case \"connectObject\":\n conditions = this.fieldsAddFiltersConnectObject(f);\n\n // Add filter options to Custom index\n if (\n // 1:M\n (f.settings.linkType == \"one\" &&\n f.settings.linkViaType == \"many\") ||\n // 1:1 isSource = true\n (f.settings.linkType == \"one\" &&\n f.settings.linkViaType == \"one\" &&\n f.settings.isSource)\n ) {\n const stringResults = this.fieldsAddFiltersString(\n f\n ).filter(\n (opt) =>\n f.settings.isCustomFK ||\n // If this connect field does not use custom FK, then allow just `is empty` and `is not empty` filter options\n opt.id == \"is_empty\" ||\n opt.id == \"is_not_empty\"\n );\n conditions = stringResults.concat(conditions);\n\n // By Query Field\n conditions = conditions.concat(\n this.fieldsAddFiltersQuery(f, true)\n );\n }\n\n hasQueryField = false;\n processFieldKeys = [\"connectObject\"];\n\n break;\n\n case \"date\":\n case \"datetime\":\n type = \"date\";\n conditions = conditions.concat(this.fieldsAddFiltersDate(f));\n processFieldKeys = [\"date\", \"datetime\"];\n\n break;\n\n case \"calculate\":\n case \"formula\":\n case \"number\":\n type = \"number\";\n conditions = conditions.concat(\n this.fieldsAddFiltersNumber(f)\n );\n processFieldKeys = [\"calculate\", \"formula\", \"number\"];\n\n break;\n case \"email\":\n conditions = conditions.concat(this.fieldsAddFiltersEmail(f));\n // eslint-disable-next-line no-fallthrough\n case \"string\":\n case \"LongText\":\n case \"AutoIndex\":\n conditions = conditions.concat(\n this.fieldsAddFiltersString(f)\n );\n processFieldKeys = [\n \"string\",\n \"LongText\",\n \"email\",\n \"AutoIndex\",\n ];\n\n break;\n\n case \"list\":\n conditions = conditions.concat(this.fieldsAddFiltersList(f));\n\n break;\n\n case \"user\":\n conditions = conditions.concat(this.fieldsAddFiltersUser(f));\n processFieldKeys = [\"user\"];\n\n break;\n\n case \"uuid\":\n conditions = conditions.concat(\n this.fieldsAddFiltersThisObject(f)\n );\n hasQueryField = false;\n\n break;\n default:\n break;\n }\n else\n switch (f.key) {\n case \"connectObject\":\n case \"uuid\":\n hasQueryField = false;\n\n break;\n }\n\n conditions = conditions.concat(\n this.fieldsAddFiltersQuery(f, hasQueryField)\n );\n\n if (this._settings.isRecordRule) {\n conditions = conditions.concat(this.fieldsAddFiltersRecordRule(f));\n }\n\n let isProcessField =\n (this._ProcessFields || []).filter((processField) => {\n if (!processField) return false;\n\n if (processField.field) {\n return processFieldKeys.includes(processField.field.key);\n } else if (processField.key) {\n // uuid\n let processFieldId = processField.key.split(\".\").pop();\n return processFieldId == f.id || processFieldId == f.key;\n }\n }).length > 0;\n\n if (isProcessField) {\n conditions = conditions.concat(this.fieldsAddFiltersContext(f));\n }\n\n conditions = conditions.concat(this.fieldsAddFiltersCustom(f));\n\n // let type = f.id; // the default unique identifier for our filter types\n // if (f.id == \"this_object\") {\n // // if this happens to be our special \"this_object\" field, then our\n // // type needs to be the \"uuid\" type in the definition:\n // type = f.type;\n // }\n\n // the format for webix querybuilder:\n // { id value:\"label\" type }\n // type: {string} the type of value it is.\n // since we want to tailor value selectors per field,\n // we will make a unique type for each field. and then\n // add value selectors for that specific .type\n return {\n id: f.id,\n value: label,\n type: type,\n conditions: conditions,\n // format: () => {},\n };\n });\n\n // !!! Process Fields of ABProcess\n // https://github.com/CruGlobal/appbuilder_class_core/blob/master/FilterComplexCore.js#L636\n // https://github.com/CruGlobal/appbuilder_class_core/blob/master/FilterComplexCore.js#L564\n // (this._ProcessFields || [])\n // // if there is no .field, it is probably an embedded special field\n // .filter((pField) => pField.field == null)\n // .forEach((pField) => {\n // // like: .uuid\n // let key = pField.key.split(\".\").pop();\n // if (key == \"uuid\" && this._Object) {\n // fields.unshift({\n // id: pField.key,\n // value: this._Object.label,\n // type: \"text\",\n // conditions: this.fieldsAddFiltersContext(),\n // });\n // }\n // });\n\n return fields;\n }\n\n fieldsAddFiltersDate(field) {\n let dateConditions = {\n less: this.labels.component.beforeCondition,\n greater: this.labels.component.afterCondition,\n less_or_equal: this.labels.component.onOrBeforeCondition,\n greater_or_equal: this.labels.component.onOrAfterCondition,\n is_current_date: this.labels.component.isCurrentDateCondition,\n less_current: this.labels.component.beforeCurrentCondition,\n greater_current: this.labels.component.afterCurrentCondition,\n less_or_equal_current:\n this.labels.component.onOrBeforeCurrentCondition,\n greater_or_equal_current:\n this.labels.component.onOrAfterCurrentCondition,\n last_days: this.labels.component.onLastDaysCondition,\n next_days: this.labels.component.onNextDaysCondition,\n is_empty: this.labels.component.isEmpty,\n is_not_empty: this.labels.component.isNotEmpty,\n };\n\n let result = [];\n\n for (let condKey in dateConditions)\n switch (condKey) {\n case \"is_current_date\":\n case \"less_current\":\n case \"greater_current\":\n case \"less_or_equal_current\":\n case \"greater_or_equal_current\":\n case \"is_empty\":\n case \"is_not_empty\":\n result.push({\n id: condKey,\n value: dateConditions[condKey],\n batch: \"none\",\n handler: (a, b) => this.dateValid(a, condKey, b),\n });\n break;\n case \"last_days\":\n result.push({\n id: condKey,\n value: dateConditions[condKey],\n batch: \"text\",\n handler: (a, b) => this.dateValid(a, condKey, b),\n });\n break;\n default:\n result.push({\n id: condKey,\n value: dateConditions[condKey],\n batch: \"datepicker\",\n handler: (a, b) => this.dateValid(a, condKey, b),\n });\n break;\n }\n return result;\n }\n\n fieldsAddFiltersString(field) {\n let stringConditions = {\n contains: {\n batch: \"text\",\n label: this.labels.component.containsCondition,\n },\n not_contains: {\n batch: \"text\",\n label: this.labels.component.notContainsCondition,\n },\n equals: {\n batch: \"text\",\n label: this.labels.component.isCondition,\n },\n not_equal: {\n batch: \"text\",\n label: this.labels.component.isNotCondition,\n },\n is_empty: {\n batch: \"none\",\n label: this.labels.component.isEmpty,\n },\n is_not_empty: {\n batch: \"none\",\n label: this.labels.component.isNotEmpty,\n },\n };\n\n let result = [];\n\n for (let condKey in stringConditions) {\n result.push({\n id: condKey,\n value: stringConditions[condKey].label,\n batch: stringConditions[condKey].batch,\n handler: (a, b) => this.textValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersNumber(field) {\n let numberConditions = {\n equals: this.labels.component.equalCondition,\n not_equal: this.labels.component.notEqualCondition,\n less: this.labels.component.lessThanCondition,\n greater: this.labels.component.moreThanCondition,\n less_or_equal: this.labels.component.lessThanOrEqualCondition,\n greater_or_equal: this.labels.component.moreThanOrEqualCondition,\n };\n\n let result = [];\n\n for (let condKey in numberConditions) {\n result.push({\n id: condKey,\n value: numberConditions[condKey],\n batch: \"text\",\n handler: (a, b) => this.numberValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersList(field) {\n let listConditions = {\n equals: this.labels.component.equalListCondition,\n not_equal: this.labels.component.notEqualListCondition,\n };\n\n let result = [];\n\n for (let condKey in listConditions) {\n result.push({\n id: condKey,\n value: listConditions[condKey],\n batch: \"list\",\n handler: (a, b) => this.listValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersBoolean(field) {\n let booleanConditions = {\n checked: this.labels.component.checkedCondition,\n unchecked: this.labels.component.notCheckedCondition,\n };\n\n let result = [];\n\n for (let condKey in booleanConditions) {\n result.push({\n id: condKey,\n value: booleanConditions[condKey],\n batch: \"none\",\n handler: (a, b) => this.booleanValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersEmail(field) {\n let userConditions = {\n is_current_email: {\n batch: \"none\",\n label: this.labels.component.isCurrentUserEmailCondition,\n },\n is_not_current_email: {\n batch: \"none\",\n label: this.labels.component.isNotCurrentUserEmailCondition,\n },\n };\n\n let result = [];\n\n for (let condKey in userConditions) {\n result.push({\n id: condKey,\n value: userConditions[condKey].label,\n batch: userConditions[condKey].batch,\n handler: (a, b) => this.emailValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersUser(field) {\n let userConditions = {\n is_current_user: {\n batch: \"none\",\n label: this.labels.component.isCurrentUserCondition,\n },\n is_not_current_user: {\n batch: \"none\",\n label: this.labels.component.isNotCurrentUserCondition,\n },\n contain_current_user: {\n batch: \"none\",\n label: this.labels.component.containsCurrentUserCondition,\n },\n not_contain_current_user: {\n batch: \"none\",\n label: this.labels.component.notContainsCurrentUserCondition,\n },\n equals: {\n batch: \"user\",\n label: this.labels.component.equalListCondition,\n },\n not_equal: {\n batch: \"user\",\n label: this.labels.component.notEqualListCondition,\n },\n };\n\n let result = [];\n\n for (let condKey in userConditions) {\n result.push({\n id: condKey,\n value: userConditions[condKey].label,\n batch: userConditions[condKey].batch,\n handler: (a, b) => this.userValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersConnectObject(field) {\n const connectConditions = {\n same_as_user: {\n batch: \"user\",\n label: this.labels.component.sameAsUser,\n handler: (a, b) => this.userValid(a, \"same_as_user\", b),\n },\n not_same_as_user: {\n batch: \"user\",\n label: this.labels.component.notSameAsUser,\n handler: (a, b) => this.userValid(a, \"not_same_as_user\", b),\n },\n in_data_collection: {\n batch: \"datacollection\",\n label: this.labels.component.inDataCollection,\n handler: (a, b) =>\n this.dataCollectionValid(a, \"in_data_collection\", b),\n },\n not_in_data_collection: {\n batch: \"datacollection\",\n label: this.labels.component.notInDataCollection,\n handler: (a, b) =>\n this.dataCollectionValid(a, \"not_in_data_collection\", b),\n },\n // TODO\n // contains: this.labels.component.containsCondition,\n // not_contains: this.labels.component.notContainCondition,\n // equals: this.labels.component.isCondition,\n // not_equal: this.labels.component.isNotCondition\n };\n\n const result = [];\n\n for (let condKey in connectConditions) {\n result.push({\n id: condKey,\n value: connectConditions[condKey].label,\n batch: connectConditions[condKey].batch,\n handler: connectConditions[condKey].handler,\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersQuery(field, hasQueryField = false) {\n const queryConditions = hasQueryField\n ? {\n in_query_field: {\n label: this.labels.component.inQueryField,\n batch: \"queryField\",\n },\n not_in_query_field: {\n label: this.labels.component.notInQueryField,\n batch: \"queryField\",\n },\n }\n : {\n in_query: {\n label: this.labels.component.inQuery,\n batch: \"query\",\n },\n not_in_query: {\n label: this.labels.component.notInQuery,\n batch: \"query\",\n },\n };\n\n const result = [];\n\n for (const condKey in queryConditions) {\n result.push({\n id: condKey,\n value: queryConditions[condKey].label,\n batch: queryConditions[condKey].batch,\n handler: (a, b) => this.queryFieldValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersThisObject(field) {\n let thisObjectConditions = {\n in_data_collection: {\n batch: \"datacollection\",\n label: this.labels.component.inDataCollection,\n },\n not_in_data_collection: {\n batch: \"datacollection\",\n label: this.labels.component.notInDataCollection,\n },\n };\n\n let result = [];\n\n for (let condKey in thisObjectConditions) {\n result.push({\n id: condKey,\n value: thisObjectConditions[condKey].label,\n batch: thisObjectConditions[condKey].batch,\n handler: (a, b) => this.thisObjectValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersRecordRule(field) {\n let recordRuleConditions = {\n same_as_field: this.labels.component.sameAsField,\n not_same_as_field: this.labels.component.notSameAsField,\n };\n\n let result = [];\n\n for (let condKey in recordRuleConditions) {\n result.push({\n id: condKey,\n value: recordRuleConditions[condKey],\n batch: \"recordRule\",\n handler: (a, b) => true, // TODO: record rule validation\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersContext(field) {\n let contextConditions = {\n context_equals: {\n batch: \"context\",\n label: this.labels.component.equalsProcessValue,\n handler: (a, b) => a == b,\n },\n context_not_equal: {\n batch: \"context\",\n label: this.labels.component.notEqualsProcessValueCondition,\n handler: (a, b) => a != b,\n },\n context_in: {\n batch: \"context\",\n label: this.labels.component.inProcessValueCondition,\n handler: (a, b) => a.indexOf(b) > -1,\n },\n context_not_in: {\n batch: \"context\",\n label: this.labels.component.notInProcessValueCondition,\n handler: (a, b) => a.indexOf(b) == -1,\n },\n };\n\n let result = [];\n\n for (let condKey in contextConditions) {\n result.push({\n id: condKey,\n value: contextConditions[condKey].label,\n batch: contextConditions[condKey].batch,\n handler: contextConditions[condKey].handler,\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersCustom(field) {\n const customOptions = this._customOptions ?? {};\n const options = customOptions[field.id || field] ?? {};\n return options.conditions ?? [];\n }\n\n queriesLoad(queries = []) {\n this._Queries = queries;\n }\n\n /**\n * @method queries()\n *\n * return an array of all the ABObjectQuery.\n *\n * @param filter {Object}\n *\n * @return {array}\n */\n queries(filter = () => true) {\n const queryList = this._Queries ?? this.AB?.queries?.() ?? [];\n\n return queryList.filter((q) => filter(q));\n }\n\n setValue(settings) {\n this.condition = settings || {};\n\n this.condition.rules = this.condition.rules || [];\n }\n\n /**\n * @method getValue\n * return the current condition of the filter.\n * @return {JSON} -\n * {\n * \tglue: '', // 'and', 'or'\n *\t\trules: [\n *\t\t\t{\n *\t\t\t\tkey:\t'uuid',\n *\t\t\t\trule:\t'rule',\n *\t\t\t\tvalue:\t'value'\n *\t\t\t}\n *\t\t]\n * }\n */\n getValue() {\n // When asked for a value before a condition is set, default the\n // unset glue to \"and\";\n if (typeof this.condition.glue == \"undefined\") {\n this.condition.glue = \"and\";\n }\n return this.condition;\n }\n\n isComplete() {\n let result = true;\n\n const noValueRules = [\n \"is_current_user\",\n \"is_not_current_user\",\n \"contain_current_user\",\n \"not_contain_current_user\",\n \"same_as_user\",\n \"not_same_as_user\",\n \"is_empty\",\n \"is_not_empty\",\n \"checked\",\n \"unchecked\",\n \"is_current_date\",\n ];\n\n const isCompleteRules = (rules = []) => {\n if (result == false) return;\n\n rules.forEach((r) => {\n if (r?.rules && Array.isArray(r?.rules)) {\n isCompleteRules(r?.rules);\n } else {\n result =\n result &&\n r?.key != null &&\n r?.key != \"\" &&\n r?.rule != null &&\n r?.rule != \"\" &&\n ((r?.value != null && r?.value != \"\") ||\n noValueRules.indexOf(r?.rule) > -1);\n }\n });\n };\n\n isCompleteRules(this.condition?.rules);\n\n return result;\n }\n};\n","const ABComponent = require(\"../platform/ABComponent\");\n\n/**\n * support get data from objects and queries\n */\nfunction getFieldVal(rowData, field, returnSingular = true) {\n if (!field) return null;\n if (!field.columnName) return null;\n // if rowData is an array, then pull the first element to get value\n if (rowData && rowData[0]) rowData = rowData[0];\n\n let columnId = field.id;\n let columnName = field.columnName;\n\n let value = null;\n if (columnName.indexOf(\".\") > -1) {\n let colName = columnName.split(\".\")[1];\n value = rowData[columnName] || rowData[colName] || rowData[columnId];\n } else {\n value = rowData[columnName] || rowData[columnId];\n }\n\n if (value) {\n return value;\n }\n\n // otherwise, this might be a process check where the rowData keys have\n // '[diagramID].[field.id]'\n for (var k in rowData) {\n var key = k.split(\".\")[1];\n if (key && (key == columnId || key == columnName)) {\n value = rowData[k];\n }\n }\n\n // if value is an array, filter empty item\n if (value && Array.isArray(value)) {\n value = value.filter((v) => v != null);\n if (returnSingular) value = value[0];\n }\n\n return value;\n}\n\nmodule.exports = class RowFilterCore extends ABComponent {\n constructor(App, idBase, AB) {\n idBase = idBase || \"ab_row_filter\";\n\n super(App, idBase, AB);\n\n this.Account = { username: \"??\" };\n this._settings = {};\n this.config_settings = {};\n // var batchName; // we need to revert to this default when switching away from a in/by query field\n\n this._QueryFields = [];\n this._Fields;\n\n // internal business logic\n var _logic = (this._logic = {\n callbacks: {\n onChange: () => {},\n },\n\n /**\n * @method getValue\n *\n * @return {JSON} -\n * {\n * \t\tglue: '', // 'and', 'or'\n *\t\trules: [\n *\t\t\t{\n *\t\t\t\tkey:\t'column name',\n *\t\t\t\trule:\t'rule',\n *\t\t\t\tvalue:\t'value'\n *\t\t\t}\n *\t\t]\n * }\n */\n getValue: () => {\n return this.config_settings;\n },\n\n removeHtmlTags: function (text) {\n let result = \"\";\n try {\n let div = document.createElement(\"div\");\n div.innerHTML = text;\n\n result = div.textContent || div.innerText || \"\";\n } catch (err) {\n result = (text || \"\").replace(/(<([^>]+)>)/gi, \"\");\n }\n\n return result;\n },\n\n textValid: function (rowData, field, rule, compareValue) {\n var result = false;\n\n var value = getFieldVal(rowData, field);\n if (value == null) value = \"\";\n\n value = value.toString().trim().toLowerCase();\n value = _logic.removeHtmlTags(value); // remove html tags - rich text editor\n\n compareValue = compareValue\n .toString()\n .trim()\n .toLowerCase()\n .replace(/ +/g, \" \");\n\n // support \"john smith\" => \"john\" OR/AND \"smith\"\n var compareArray = compareValue.split(\" \");\n\n switch (rule) {\n case \"contains\":\n compareArray.forEach((val) => {\n if (result == false)\n // OR\n result = value.indexOf(val) > -1;\n });\n break;\n case \"not_contains\":\n result = true;\n compareArray.forEach((val) => {\n if (result == true)\n // AND\n result = value.indexOf(val) < 0;\n });\n break;\n case \"equals\":\n compareArray.forEach((val) => {\n if (result == false)\n // OR\n result = value == val;\n });\n break;\n case \"not_equal\":\n result = true;\n compareArray.forEach((val) => {\n if (result == true)\n // AND\n result = value != val;\n });\n break;\n case \"is_empty\":\n result = value == null || value == \"\";\n break;\n case \"is_not_empty\":\n result = value != null && value != \"\";\n break;\n default:\n result = _logic.queryValid(rowData, rule, compareValue);\n break;\n }\n\n return result;\n },\n\n dateValid: function (rowData, field, rule, compareValue) {\n var result = false;\n\n var value = getFieldVal(rowData, field);\n if (!(value instanceof Date)) value = new Date(value);\n\n if (!(compareValue instanceof Date))\n compareValue = new Date(compareValue);\n\n switch (rule) {\n case \"equals\":\n result = value == compareValue;\n break;\n case \"not_equal\":\n result = value != compareValue;\n break;\n case \"less\":\n result = value < compareValue;\n break;\n case \"greater\":\n result = value > compareValue;\n break;\n case \"less_or_equal\":\n result = value <= compareValue;\n break;\n case \"greater_or_equal\":\n result = value >= compareValue;\n break;\n default:\n result = _logic.queryValid(rowData, rule, compareValue);\n break;\n }\n\n return result;\n },\n\n numberValid: function (rowData, field, rule, compareValue) {\n var result = false;\n\n var value = getFieldVal(rowData, field);\n value = Number(value);\n compareValue = Number(compareValue);\n\n switch (rule) {\n case \"equals\":\n result = value == compareValue;\n break;\n case \"not_equal\":\n result = value != compareValue;\n break;\n case \"less\":\n result = value < compareValue;\n break;\n case \"greater\":\n result = value > compareValue;\n break;\n case \"less_or_equal\":\n result = value <= compareValue;\n break;\n case \"greater_or_equal\":\n result = value >= compareValue;\n break;\n default:\n result = _logic.queryValid(rowData, rule, compareValue);\n break;\n }\n\n return result;\n },\n\n listValid: function (rowData, field, rule, compareValue) {\n var result = false;\n\n var value = getFieldVal(rowData, field);\n if (value && value.toLowerCase) value = value.toLowerCase();\n\n compareValue = compareValue.toLowerCase();\n\n if (!Array.isArray(compareValue)) compareValue = [compareValue];\n\n switch (rule) {\n case \"equals\":\n if (value) result = compareValue.indexOf(value) > -1;\n break;\n case \"not_equal\":\n if (value) result = compareValue.indexOf(value) < 0;\n else result = true;\n break;\n default:\n result = _logic.queryValid(rowData, rule, compareValue);\n break;\n }\n\n return result;\n },\n\n booleanValid: function (rowData, field, rule, compareValue) {\n var result = false;\n\n var value = getFieldVal(rowData, field);\n\n // default value should be false\n if (value == null) value = false;\n\n switch (rule) {\n case \"equals\":\n result = value == compareValue;\n break;\n case \"not_equal\":\n result = value != compareValue;\n break;\n default:\n result = _logic.queryValid(rowData, rule, compareValue);\n break;\n }\n\n return result;\n },\n\n userValid: (rowData, field, rule, compareValue) => {\n var result = false;\n\n var value = getFieldVal(rowData, field);\n\n // if (Array.isArray(value)) value = [value];\n\n switch (rule) {\n case \"is_current_user\":\n result = value == this.Account.username;\n break;\n case \"is_not_current_user\":\n result = value != this.Account.username;\n break;\n case \"contain_current_user\":\n if (!value) {\n result = false;\n break;\n }\n if (!Array.isArray(value)) value = [value];\n\n result =\n (value || []).filter((v) => {\n if (v) {\n return (\n (v.username || v.id || v.text || v) ==\n this.Account.username\n );\n } else {\n return false;\n }\n }).length > 0;\n break;\n case \"not_contain_current_user\":\n if (!value) {\n result = false;\n break;\n }\n if (!Array.isArray(value)) value = [value];\n\n result =\n (value || []).filter((v) => {\n if (v) {\n return (\n (v.username || v.id || v.text || v) ==\n this.Account.username\n );\n } else {\n return false;\n }\n }).length == 0;\n break;\n case \"equals\":\n result = value.indexOf(compareValue) > -1;\n break;\n case \"not_equal\":\n result = value.indexOf(compareValue) < 0;\n break;\n default:\n result = _logic.queryValid(rowData, rule, compareValue);\n break;\n }\n\n return result;\n },\n\n queryValid: (rowData, rule, compareValue) => {\n var result = false;\n\n if (!this.AB || !compareValue) return result;\n\n // queryId:fieldId\n var queryId = compareValue.split(\":\")[0],\n fieldId = compareValue.split(\":\")[1];\n\n // if no query\n var query = this.queries((q) => q.id == queryId)[0];\n if (!query) return result;\n\n // if no field\n var field = query.fields((f) => f.id == fieldId)[0];\n if (!field) return result;\n\n let qIdBase = \"{idBase}-query-field-{id}\"\n .replace(\"{idBase}\", idBase)\n .replace(\"{id}\", query.id),\n inQueryFieldFilter = new this.constructor(this.App, qIdBase);\n inQueryFieldFilter.Account = this.Account;\n // inQueryFieldFilter.applicationLoad(this._Application);\n inQueryFieldFilter.fieldsLoad(query.fields());\n inQueryFieldFilter.setValue(query.workspaceFilterConditions);\n\n switch (rule) {\n case \"in_query_field\":\n result = inQueryFieldFilter.isValid(rowData);\n break;\n case \"not_in_query_field\":\n result = !inQueryFieldFilter.isValid(rowData);\n break;\n }\n\n return result;\n },\n\n inQueryValid: (rowData, columnName, rule, compareValue) => {\n let result = false;\n\n if (columnName) {\n rowData = rowData[columnName] || {};\n }\n\n if (!compareValue || !this.AB) return result;\n\n // if no query\n let query = this.queries((q) => q.id == compareValue)[0];\n if (!query) return result;\n\n let qIdBase = \"{idBase}-query-{id}\"\n .replace(\"{idBase}\", idBase)\n .replace(\"{id}\", query.id),\n inQueryFilter = new this.constructor(this.App, qIdBase);\n inQueryFilter.Account = this.Account;\n // inQueryFilter.applicationLoad(this._Application);\n inQueryFilter.fieldsLoad(query.fields());\n inQueryFilter.setValue(query.workspaceFilterConditions);\n\n switch (rule) {\n case \"in_query\":\n result = inQueryFilter.isValid(rowData);\n break;\n case \"not_in_query\":\n result = !inQueryFilter.isValid(rowData);\n break;\n }\n\n return result;\n },\n\n dataCollectionValid: (rowData, columnName, rule, compareValue) => {\n var result = false;\n\n if (!compareValue || !this.AB) return result;\n\n if (columnName) {\n rowData = rowData[columnName] || {};\n }\n\n let dc = this.AB.datacollectionByID(compareValue);\n\n switch (rule) {\n case \"in_data_collection\":\n if (!dc) return false;\n\n result =\n dc.getData(\n (d) => (d.id || d.uuid) == (rowData.id || rowData.uuid)\n ).length > 0;\n break;\n case \"not_in_data_collection\":\n if (!dc) return true;\n\n result =\n dc.getData(\n (d) => (d.id || d.uuid) == (rowData.id || rowData.uuid)\n ).length < 1;\n break;\n }\n\n return result;\n },\n\n connectFieldValid: function (rowData, field, rule, compareValue) {\n let relationName = field.relationName();\n\n let connectedVal = \"\";\n\n if (rowData) {\n if (rowData[relationName]) {\n connectedVal = (\n (field.indexField\n ? rowData[relationName][field.indexField.columnName]\n : false) || // custom index\n (field.indexField2\n ? rowData[relationName][field.indexField2.columnName]\n : false) || // custom index 2\n rowData[relationName].id ||\n rowData[relationName]\n )\n .toString()\n .toLowerCase();\n } else {\n let fieldVal = getFieldVal(rowData, field);\n if (fieldVal != null) {\n connectedVal = fieldVal;\n\n // an Object to a String\n if (typeof connectedVal == \"object\") {\n connectedVal =\n field.datasourceLink.displayData(connectedVal);\n }\n }\n }\n }\n\n let compareValueLowercase = (compareValue || \"\").toLowerCase();\n\n switch (rule) {\n case \"contains\":\n return (\n connectedVal.toString().indexOf(compareValueLowercase) > -1\n );\n case \"not_contains\":\n return (\n connectedVal.toString().indexOf(compareValueLowercase) ==\n -1\n );\n case \"equals\":\n return connectedVal == compareValueLowercase;\n case \"not_equal\":\n return connectedVal != compareValueLowercase;\n case \"in_query\":\n case \"not_in_query\":\n return _logic.inQueryValid(\n rowData,\n relationName,\n rule,\n compareValue\n );\n case \"is_current_user\":\n case \"is_not_current_user\":\n case \"contain_current_user\":\n case \"not_contain_current_user\":\n return _logic.userValid(rowData, field, rule, compareValue);\n case \"is_empty\":\n return (\n rowData[relationName] == null ||\n rowData[relationName].length < 1 ||\n rowData[relationName] == \"\"\n );\n case \"is_not_empty\":\n return (\n rowData[relationName] != null &&\n ((Array.isArray(rowData[relationName]) &&\n rowData[relationName].length > 0) ||\n rowData[relationName] != \"\")\n );\n case \"in_data_collection\":\n case \"not_in_data_collection\":\n return _logic.dataCollectionValid(\n rowData,\n relationName,\n rule,\n compareValue\n );\n }\n },\n\n thisObjectValid: (rowData, rule, compareValue) => {\n let result = false;\n\n switch (rule) {\n // if in_query condition\n case \"in_query\":\n case \"not_in_query\":\n if (!this.AB || !this._Object) return result;\n\n // if > 1 copy of this object in query ==> Error!\n var query = this.queries((q) => q.id == compareValue)[0];\n if (!query) return result;\n\n var listThisObjects = query.objects((o) => {\n return o.id == this._Object.id;\n });\n if (listThisObjects.length > 1) {\n // Alternative: choose the 1st instance of this object in the query, and make the compare on that.\n // Be sure to warn the developer of the limitiations of an \"this_object\" \"in_query\" when query has > 1 copy of\n // this object as part of the query.\n\n console.error(\n \"HEY! Can't compare this_object to a query that has > 1 copy of that object!\"\n );\n return true;\n }\n\n // get this object's alias from the query\n var alias = query.objectAlias(this._Object.id);\n\n // make sure all my columns in rowData are prefixed by \"alias\".columnName\n var newRowData = {};\n Object.keys(rowData).forEach((key) => {\n newRowData[`${alias}.${key}`] = rowData[key];\n });\n\n // then pass this on to the _logic.queryValid();\n return _logic.inQueryValid(\n newRowData,\n null,\n rule,\n compareValue\n );\n // break; /* eslint no-unreachable */\n\n // if in_datacollection condition\n case \"in_data_collection\":\n case \"not_in_data_collection\":\n // send rowData, null to datacollectionValid()\n return _logic.dataCollectionValid(\n rowData,\n null,\n rule,\n compareValue\n );\n // break; /* eslint no-unreachable */\n }\n },\n });\n\n // Interface methods for parent component:\n // this.objectLoad = _logic.objectLoad;\n // this.viewLoad = _logic.viewLoad;\n this.getValue = _logic.getValue;\n // this.setValue = _logic.setValue;\n // this.isValid = _logic.isValid;\n }\n\n init(options) {\n if (options.showObjectName) {\n this._settings.showObjectName = options.showObjectName;\n }\n }\n\n /**\n * @method isValid\n * validate the row data is valid filter condition\n *\n * @param rowData {Object} - data row\n */\n isValid(rowData) {\n var config_settings = this.config_settings;\n var _logic = this._logic;\n\n // If no conditions, then return true\n if (\n config_settings == null ||\n config_settings.rules == null ||\n config_settings.rules.length == 0\n )\n return true;\n\n if (rowData == null) return false;\n\n var result = config_settings.glue === \"and\" ? true : false;\n\n config_settings.rules.forEach((filter) => {\n if (!filter?.key || !filter?.rule) return;\n\n var fieldInfo = this._Fields.filter((f) => f.id == filter.key)[0];\n if (!fieldInfo) return;\n\n var condResult;\n\n // Filters that have \"this_object\" don't have a fieldInfo.key, so in that case,\n // define a special .key == \"this_object\"\n var ruleFieldType = fieldInfo.key;\n if (typeof fieldInfo.key == \"undefined\") {\n if (fieldInfo.id != \"this_object\") {\n fieldInfo.key = \"connectField\"; // if you are looking at the parent object it won't have a key to analyze\n ruleFieldType = fieldInfo.key;\n } else ruleFieldType = \"this_object\";\n }\n\n switch (ruleFieldType) {\n case \"string\":\n case \"LongText\":\n case \"email\":\n condResult = _logic.textValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"date\":\n case \"datetime\":\n condResult = _logic.dateValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"number\":\n case \"formula\":\n condResult = _logic.numberValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"list\":\n condResult = _logic.listValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"boolean\":\n condResult = _logic.booleanValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"user\":\n condResult = _logic.userValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"connectField\":\n case \"connectObject\":\n condResult = _logic.connectFieldValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"this_object\":\n condResult = _logic.thisObjectValid(\n rowData,\n filter.rule,\n filter.value\n );\n break;\n }\n\n if (config_settings.glue === \"and\") {\n result = result && condResult;\n } else {\n result = result || condResult;\n }\n });\n\n return result;\n }\n\n /**\n * @method applicationLoad\n * set application\n *\n * @param application {ABApplication}\n */\n // applicationLoad(application) {\n // this._Application = application;\n // }\n\n /**\n * @method fieldsLoad\n * set fields\n *\n * @param {array} fields\n * an array of fields used in this Query\n * @param {ABObject} object [optional]\n * (optional) ABObject reference if this Filter should support\n * the \"this object\" conditions.\n */\n fieldsLoad(fields = [], object = null) {\n this._Fields = fields.filter((f) => f?.fieldIsFilterable?.());\n // NOTE: User fields are now Connections, but we want to treat them\n // differently.\n this._QueryFields = this._Fields\n ? this._Fields.filter((f) => f && f.isConnection && f.key != \"user\")\n : [];\n\n // insert our 'this object' entry if an Object was given.\n if (object) {\n this._Object = object;\n\n let thisObjOption = {\n id: \"this_object\",\n label: object.label,\n };\n\n // If object is query ,then should define default alias: \"BASE_OBJECT\"\n if (object.viewName) {\n thisObjOption.alias = \"BASE_OBJECT\";\n }\n\n this._Fields.unshift(thisObjOption);\n } else {\n delete this._Object;\n }\n }\n\n queriesLoad(queries = []) {\n this._Queries = queries;\n }\n\n /**\n * @method queries()\n * return an array of all the ABObjectQuery.\n * @param {fn} filter\n * @return {array}\n */\n queries(filter = () => true) {\n let result = [];\n\n if (this.AB) {\n result = result.concat(this.AB.queries(filter));\n }\n\n if (this._Queries) {\n result = result.concat(\n (this._Queries || []).filter(\n (q) => filter(q) && result.filter((r) => r.id == q.id).length < 1\n )\n );\n }\n\n return result;\n }\n\n setValue(settings) {\n this.config_settings = settings || {};\n this.config_settings.rules = this.config_settings.rules || [];\n }\n};\n","/*\n * ABFieldAutoIndex\n *\n * An ABFieldAutoIndex defines a AutoIndex field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldAutoIndexDefaults = {\n key: \"AutoIndex\",\n // unique key to reference this specific DataField\n\n description: \"Auto Increment Value\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"key\",\n // font-awesome icon reference. (without the 'fa-'). so 'key' to\n // reference 'fa-key'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Auto Index\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"number\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"tinyint\", \"smallint\", \"mediumint\", \"int\", \"integer\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\n// defaultValues: the keys must match a .name of your elements to set it's default value.\nconst defaultValues = {\n prefix: \"\",\n delimiter: \"none\",\n displayLength: 4,\n previewText: \"0000\",\n};\n\nmodule.exports = class ABFieldAutoIndexCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldAutoIndexDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldAutoIndexDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n static getDelimiterSign(text) {\n const delimiterItem = this.delimiterList().filter((item) => {\n return item.id == text;\n })[0];\n\n return delimiterItem ? delimiterItem.sign : \"\";\n }\n\n static delimiterList() {\n return [\n { id: \"none\", value: L(\"None\"), sign: \"\" },\n { id: \"comma\", value: L(\"Comma\"), sign: \", \" },\n { id: \"slash\", value: L(\"Slash\"), sign: \"/\" },\n { id: \"space\", value: L(\"Space\"), sign: \" \" },\n { id: \"dash\", value: L(\"Dash\"), sign: \"-\" },\n { id: \"colon\", value: L(\"Colon\"), sign: \":\" },\n ];\n }\n\n static setValueToIndex(prefix, delimiter, displayLength, displayNumber) {\n const resultIndex =\n prefix +\n this.getDelimiterSign(delimiter) +\n (\"0000000000\" + displayNumber).slice(-parseInt(displayLength));\n\n return resultIndex;\n }\n\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n this.settings.displayLength = parseInt(this.settings.displayLength);\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // Remove every values, then we will use AUTO_INCREMENT of MySQL\n delete values[this.columnName];\n }\n\n format(rowData) {\n if (!rowData?.[this.columnName]) return \"\";\n\n try {\n const resultAutoIndex = this.constructor.setValueToIndex(\n this.settings.prefix,\n this.settings.delimiter,\n this.settings.displayLength,\n rowData[this.columnName]\n );\n\n return resultAutoIndex;\n } catch (err) {\n return \"\";\n }\n }\n};\n","/*\n * ABFieldBoolean\n *\n * An ABFieldBoolean defines a boolean field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldBooleanDefaults = {\n key: \"boolean\",\n // unique key to reference this specific DataField\n\n description: \"A single checkbox that can be checked or unchecked.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"check-square-o\",\n // font-awesome icon reference. (without the 'fa-'). so 'check-square-o' to\n // reference 'fa-check-square-o'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Checkbox\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"boolean\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"bool\", \"boolean\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n default: 0,\n};\n\nmodule.exports = class ABFieldBooleanCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldBooleanDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldBooleanDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n if (this.settings.default != null)\n this.settings.default = parseInt(this.settings.default);\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n if (values[this.columnName] == null && this.settings.default != null) {\n values[this.columnName] = this.settings.default;\n }\n }\n};\n","/*\n * ABFieldCalculate\n *\n * An ABFieldCalculate defines a calculate field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\n/** Private methods */\nfunction AGE(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n const today = new Date();\n const oneYear = 31536000000; // (24 * 60 * 60 * 1000) * 365;\n const diffYears = (today - dataDate) / oneYear;\n\n if (diffYears < 1) return Math.round(diffYears * 10) / 10;\n // float 2 digits\n else return Math.floor(diffYears); // no float digit\n\n // const today = new Date();\n // const age = today.getFullYear() - dataDate.getFullYear();\n // if (age < 1) {\n // \tconst m = today.getMonth() - dataDate.getMonth();\n\n // \tage = parseFloat(\"0.\" + m);\n\n // \t// if (m < 0 || (m === 0 && today.getDate() < dataDate.getDate())) {\n // \t// \tage--;\n // \t// }\n // }\n // return age;\n}\n\nfunction YEAR(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n return dataDate.getFullYear();\n}\n\nfunction MONTH(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n // Start at 0\n return dataDate.getMonth();\n}\n\nfunction DAY(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n return dataDate.getDate();\n}\n\nfunction DATE(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n // number of miliseconds in one day\n const oneDay = 86400000; // 1000 * 60 * 60 * 24\n\n // Convert back to days and return\n return Math.round(dataDate.getTime() / oneDay);\n}\n\nfunction HOUR(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n // number of miliseconds in one hour\n const oneHour = 3600000; // 1000 * 60 * 60\n\n // Convert back to days and return\n return Math.round(dataDate.getTime() / oneHour);\n}\n\nfunction MINUTE(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n // number of miliseconds in one hour\n const oneMinute = 60000; // 1000 * 60\n\n // Convert back to days and return\n return Math.round(dataDate.getTime() / oneMinute);\n}\n\nfunction MINUTE_TO_HOUR(mins) {\n const hours = mins / 60;\n const rhours = Math.floor(hours);\n const minutes = (hours - rhours) * 60;\n const rminutes = Math.round(minutes);\n\n return parseFloat(`${rhours}.${rminutes}`);\n}\n\nconst ABFieldCalculateDefaults = {\n key: \"calculate\",\n // unique key to reference this specific DataField\n\n description: \"Perform a calculation based upon existing values\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"calculator\",\n // font-awesome icon reference. (without the 'fa-'). so 'calculator' to\n // reference 'fa-calculator'\n\n isFilterable: (field) => {\n const unsupportedInFilter = [\"MINUTE_TO_HOUR\", \"DATE\", \"HOUR\", \"MINUTE\"];\n const unsupported = unsupportedInFilter.filter((item) =>\n field.settings.formula.includes(item)\n );\n return unsupported.length == 0;\n },\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Calculate\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"number\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\n \"tinyint\",\n \"smallint\",\n \"mediumint\",\n \"int\",\n \"integer\",\n \"bigint\",\n \"decimal\",\n \"dec\",\n \"numeric\",\n \"fixed\",\n \"float\",\n \"real\",\n ],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n formula: \"\",\n decimalSign: \"none\", // \"none\", \"comma\", \"period\", \"space\"\n decimalPlaces: 0, // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\n};\n\nmodule.exports = class ABFieldCalculateCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldCalculateDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldCalculateDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n /**\n * @method convertToJs\n *\n * @param {ABOBject} object\n * @param {string} formula\n * @param {object} rowData\n * @param {integer} place\n * @param {string} alias [Optional]\n */\n static convertToJs(\n object,\n formula,\n rowData,\n place,\n alias = null,\n recalculate = false\n ) {\n if (!formula) return \"\";\n\n // replace with current date\n formula = formula.replace(/\\(CURRENT\\)/g, \"(new Date())\");\n\n object.fields().forEach((f) => {\n let colName = f.columnName;\n if (colName.indexOf(\".\") > -1)\n // QUERY: get only column name\n colName = colName.split(\".\")[1];\n\n // if template does not contain, then should skip\n if (formula.indexOf(\"{\" + colName + \"}\") < 0) return;\n\n const data =\n rowData[`${object.alias ?? alias}.${f.columnName}`] ??\n rowData[f.columnName];\n\n // number fields\n if (f.key == \"number\") {\n const numberVal = `(${data || 0})`; // (number) - NOTE : (-5) to support negative number\n formula = formula.replace(\n new RegExp(\"{\" + colName + \"}\", \"g\"),\n numberVal\n );\n }\n // calculate and formula fields\n else if (f.key == \"calculate\" || f.key == \"formula\") {\n let calVal = f.format(rowData, recalculate) || 0;\n\n // pull number only\n if (typeof calVal == \"string\")\n calVal = calVal.replace(/[^-0-9.]/g, \"\");\n\n calVal = `(${calVal})`;\n\n formula = formula.replace(\n new RegExp(\"{\" + colName + \"}\", \"g\"),\n calVal\n );\n }\n // date fields\n else if (f.key == \"date\" || f.key == \"datetime\") {\n const dateVal = `\"${data || \"\"}\"`; // \"date\"\n formula = formula.replace(\n new RegExp(\"{\" + colName + \"}\", \"g\"),\n dateVal\n );\n }\n // boolean fields\n else if (f.key == \"boolean\") {\n const booleanVal = `(${data || 0})`; // show 1 or 0 for boolean\n formula = formula.replace(\n new RegExp(\"{\" + colName + \"}\", \"g\"),\n booleanVal\n );\n }\n });\n\n // decimal places - toFixed()\n // FIX: floating number calculation\n // https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/\n return eval(formula).toFixed(place || 0);\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // this field is read only\n delete values[this.columnName];\n }\n\n format(rowData, recalculate = false) {\n let place = 0;\n if (this.settings.decimalSign != \"none\") {\n place = this.settings.decimalPlaces;\n }\n\n try {\n let result = this.constructor.convertToJs(\n this.object,\n this.settings.formula,\n rowData,\n place,\n this.alias,\n recalculate\n );\n\n if (typeof result == \"string\")\n result = result.replace(/[^-0-9.]/g, \"\");\n\n switch (this.settings.decimalSign) {\n case \"comma\":\n result = result.replace(\".\", \",\");\n break;\n case \"space\":\n result = result.replace(\".\", \" \");\n break;\n }\n\n return result;\n } catch (err) {\n return \"\";\n }\n }\n};\n","/*\n * ABFieldCombine\n *\n * An ABFieldCombine defines a combined field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\n// function L(key, altText) {\n// // TODO:\n// return altText; // AD.lang.label.getLabel(key) || altText;\n// }\n\nconst ABFieldCombinedDefaults = {\n key: \"combined\",\n // unique key to reference this specific DataField\n\n description: \"Combined Value\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"key\",\n // font-awesome icon reference. (without the 'fa-'). so 'key' to\n // reference 'fa-key'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Combined Field\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"text\", \"mediumtext\", \"longtext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\n// defaultValues: the keys must match a .name of your elements to set it's default value.\nconst defaultValues = {\n combinedFields: \"\",\n // {string} \"field's uuid1, field's uuid2, field's uuid3, ...\"\n // This tells us what fields will be combined.\n // if we don't have this, the old value which we filled out won't be cleared when we do \"Add field\" this type again.\n\n delimiter: \"plus\", // plus, space, dash, period\n};\n\nmodule.exports = class ABFieldCombineCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldCombinedDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldCombinedDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.delimiter =\n values.settings.delimiter || defaultValues.delimiter;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // Remove every values, then we will use AUTO_INCREMENT of MySQL\n delete values[this.columnName];\n }\n\n /**\n * @method getCombinedFields\n * Retrieve the fields used to combine and generate a specific value\n *\n * @return {Array}\n */\n getCombinedFields() {\n const result = [];\n\n (this.settings?.combinedFields ?? \"\").split(\",\").forEach((fieldId) => {\n const fld = this.object.fields((f) => f.id == fieldId)[0];\n if (!fld) return;\n\n result.push(fld);\n });\n\n return result;\n }\n\n /**\n * @method format\n * Convert the value of a connected field (without a custom index) to display the label of the linked object\n *\n * @param {Object} rowData\n * @returns {String}\n */\n format(rowData) {\n let val = rowData[this.columnName] ?? \"\";\n\n this.getCombinedFields().forEach((f, index) => {\n if (\n f.key != \"connectObject\" ||\n f.settings.indexField ||\n f.settings.indexField2\n )\n return;\n\n let connectVal = rowData[f.relationName()];\n if (!connectVal) return;\n\n if (!Array.isArray(connectVal)) connectVal = [connectVal];\n\n const connectLabel = connectVal\n .map((item) => item.text ?? f.datasourceLink.displayData(item))\n .join(\"|\");\n\n val = val.replace(rowData[f.columnName], connectLabel);\n });\n\n return val;\n }\n};\n","/*\n * ABFieldConnect\n *\n * An ABFieldConnect defines a connect to other object field type.\n *\n */\n\nvar ABField = require(\"../../platform/dataFields/ABField\");\n\n// function L(key, altText) {\n// // TODO:\n// return altText; // AD.lang.label.getLabel(key) || altText;\n// }\n\nconst ABFieldConnectDefaults = {\n key: \"connectObject\",\n // unique key to reference this specific DataField\n\n description: \"Connect two data objects together\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"external-link\",\n // font-awesome icon reference. (without the 'fa-'). so 'external-link' to\n // reference 'fa-external-link'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: (field) => {\n const linkType = `${field?.settings?.linkType}:${field?.settings?.linkViaType}`;\n return [\"one:many\", \"one:one\"].indexOf(linkType) > -1;\n },\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Connect to another record\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: false,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"char\", \"varchar\", \"tinytext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n linkObject: \"\", // ABObject.id\n // the .id of the ABObject we are connected to\n\n linkType: \"one\", // [one, many]\n // 'one' : this object can have only 1 of our linkObject\n // 'many': this object can have MANY of our linkObject\n\n linkViaType: \"many\", // [one, many]\n // 'one' : the linkedObject can only have 1 of me\n // 'many' : the linkedObject can have many of me\n\n linkColumn: \"\", // ABField.id\n // the .id of the field in the linkedObject that is our\n // connected field.\n\n isSource: null, // bit : 1,0\n // isSource indicates that this object is the source of the connection:\n // if linkType==one, and isSource=1, then the value in this object's field\n // \t\tis the connected object's id\n // if linkType == one, and isSource = 0, then the linkObject has this obj.id\n // \tin it's connected field (linkColumn)\n\n // the next 3 Fields are concerning how we connect to other ABObjects when\n // we are NOT using the .uuid as the connecting Value. Instead, there is an\n // ABIndex setting we are connecting with.\n isCustomFK: 0,\n // {bool} truthy [0,1, etc...]\n // indicates that this connection is using 1 or more custom foreign keys\n // for the data it is storing in it's relationship.\n\n indexField: \"\", // ABField.id\n // {string} {ABField.id}\n // In a Connection defined between A --> B, this field represents the ABField\n // that is used for the data being stored.\n // In 1:1, 1:M or M:1 relationships, .indexField always refers to the\n // field we are pulling the Data FROM.\n // In M:N relationships: this will refer to the A.Field.id that is a custom\n // key (if any).\n\n indexField2: \"\", // ABField.id\n // {string} {ABField.id}\n // In the M:N relationship: this field refers to the B.Field.id that is a\n // custom Key for the data we are storing.\n};\n\nmodule.exports = class ABFieldConnectCore extends ABField {\n constructor(values, object, fieldDefaults = ABFieldConnectDefaults) {\n super(values, object, fieldDefaults);\n\n this.isConnection = true;\n // {bool}\n // is this an ABFieldConnect type of field.\n // this is a simplified helper to identify if an ABField is a type\n // of connect field. Since this is the only place it is defined,\n // all other field types will be falsy\n\n // // text to Int:\n // this.settings.isSource = parseInt(this.settings.isSource || 0);\n // this.settings.isCustomFK = parseInt(this.settings.isCustomFK || 0);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldConnectDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n this.settings.isSource = parseInt(this.settings.isSource || 0);\n this.settings.isCustomFK = parseInt(this.settings.isCustomFK || 0);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(/* values */) {}\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n }\n\n relationName() {\n // there is object name - {objectName}.{columnName}\n if (this.columnName.indexOf(\".\") > -1) {\n const names = this.columnName.split(\".\");\n return `${names[0]}.${this.AB.rules.toFieldRelationFormat(names[1])}`;\n } else {\n return this.AB.rules.toFieldRelationFormat(this.columnName);\n }\n }\n\n /**\n * @method datasourceLink\n * return the ABObject that this field connection links to\n * @return {ABObject}\n */\n get datasourceLink() {\n const linkObj = this.AB.objectByID(this.settings.linkObject);\n if (!linkObj) {\n const configError = new Error(\n `ConnectField[${this.label}][${this.id}] unable to find linkObject[${this.settings.linkObject}]`\n );\n this.AB.notify.builder(configError, {\n field: this,\n linkObject: this.settings.linkObject,\n });\n }\n return linkObj;\n }\n\n /**\n * @method fieldLink\n * return the ABField that we are linked to.\n * @return {ABDataField} or undefined if not found.\n */\n get fieldLink() {\n const objectLink = this.datasourceLink;\n if (!objectLink) return null; // note: already Notified\n\n const linkColumn = objectLink.fieldByID(this.settings.linkColumn);\n if (!linkColumn) {\n const configError = new Error(\n `ConnectField[${this.label}][${this.id}] unable to find linkColumn[${this.settings.linkColumn}]`\n );\n this.AB.notify.builder(configError, {\n field: this,\n linkColumn: this.settings.linkColumn,\n });\n }\n return linkColumn;\n }\n\n /**\n * @method pullRelationValues\n * Return the data values for this field entry in the provided data row.\n * @param {*} row\n * @return {array}\n */\n pullRelationValues(row) {\n let selectedData;\n\n // Get linked object\n const linkedObject = this.datasourceLink;\n\n let data = this.dataValue(row);\n if (data && linkedObject) {\n // convert to JSON\n if (typeof data == \"string\") {\n try {\n data = JSON.parse(data);\n } catch (e) {\n // must be a UUID\n // so just set that to selectedData:\n selectedData = data;\n }\n }\n\n selectedData = data;\n }\n\n return selectedData;\n }\n\n dataValue(rowData) {\n if (rowData == null) return \"\";\n\n const propName = `${this.object.name}.${this.relationName()}`;\n\n return (\n rowData[this.relationName()] ||\n rowData[propName] ||\n rowData[this.columnName] ||\n \"\"\n );\n }\n\n format(rowData) {\n const val = this.pullRelationValues(rowData);\n const linkedObject = this.datasourceLink;\n\n // array\n if (Array.isArray(val))\n return val\n .map((v) => {\n if (v.text == null) return linkedObject.displayData(v) || \"\";\n else return v.text || \"\";\n })\n .join(\", \");\n // string\n else if (val) {\n if (val.text == null) return linkedObject.displayData(val) || \"\";\n else if (val.text) return val.text || \"\";\n }\n // empty string\n else return \"\";\n }\n\n /**\n * @method linkType\n * return the type of connection we have to our connected object\n * @return {string}\n */\n linkType() {\n return this.settings.linkType;\n }\n\n /**\n * @method linkType\n * return the type of connection we have to our connected object\n * @return {string}\n */\n linkViaType() {\n return this.settings.linkViaType;\n }\n\n /**\n * @method isSource\n * does this object contain the .id of the remote object (in case of linkType : one )\n * @return {bool}\n */\n isSource() {\n return this.settings.isSource;\n }\n\n /**\n * @property indexField\n * @return {ABField}\n */\n get indexField() {\n if (!this.settings.isCustomFK || !this.settings.indexField) {\n return null;\n }\n const linkType = `${this.settings.linkType}:${this.settings.linkViaType}`;\n // 1:M\n if (linkType === \"one:many\") {\n return this.datasourceLink.fieldByID(this.settings.indexField);\n }\n // 1:1\n else if (linkType === \"one:one\") {\n if (this.settings.isSource) {\n return this.datasourceLink.fieldByID(this.settings.indexField);\n } else {\n return this.object.fieldByID(this.settings.indexField);\n }\n }\n // M:1\n else if (linkType === \"many:one\") {\n return this.object.fieldByID(this.settings.indexField);\n }\n // M:N\n else if (linkType === \"many:many\") {\n let indexField = this.object.fieldByID(this.settings.indexField);\n\n if (indexField == null)\n indexField = this.datasourceLink.fieldByID(\n this.settings.indexField\n );\n\n return indexField;\n }\n\n return null;\n }\n\n /**\n * @property indexField2\n * @return {ABField}\n */\n get indexField2() {\n if (!this.settings.isCustomFK || !this.settings.indexField2) {\n return null;\n }\n\n let indexField;\n\n // M:N only\n if (\n this.settings.linkType == \"many\" &&\n this.settings.linkViaType == \"many\"\n ) {\n indexField = this.object.fieldByID(this.settings.indexField2);\n\n if (indexField == null)\n indexField = this.datasourceLink.fieldByID(\n this.settings.indexField2\n );\n }\n\n return indexField;\n }\n\n /**\n * @method getRelationValue\n * pull values for update connect data\n * @param {Object} rowData\n * @param {Object} options - {\n * forUpdate: boolean\n * }\n * @return {Object}\n */\n getRelationValue(rowData, options = {}) {\n if (rowData == null) return;\n let colName;\n const indexField = this.indexField;\n const datasourceLink = this.datasourceLink;\n\n const linkType = `${this.settings.linkType}:${this.settings.linkViaType}`;\n\n // custom index\n // M:N\n if (linkType === \"many:many\") {\n const indexField2 = this.indexField2;\n\n if (indexField && indexField.object.id == datasourceLink.id) {\n colName = indexField.columnName;\n } else if (indexField2 && indexField2.object.id == datasourceLink.id) {\n colName = indexField2.columnName;\n }\n }\n // 1:M, 1:1 isSource = true\n else if (\n indexField &&\n (linkType === \"one:many\" ||\n (linkType === \"one:one\" && this.settings.isSource))\n ) {\n colName = indexField.columnName;\n }\n // M:1\n else if (linkType === \"many:one\") {\n // NOTE: M:1 has special case\n // it uses different value for search and update.\n // UPDATE uses row id\n // SEARCH uses custom index value\n if (options.forUpdate) {\n colName = datasourceLink.PK();\n } else {\n colName = indexField ? indexField.columnName : datasourceLink.PK();\n }\n }\n // NO CUSTOM INDEX\n else if (datasourceLink) {\n colName = datasourceLink.PK();\n }\n\n let result =\n rowData[colName] ||\n rowData[this.object?.PK()] ||\n rowData.id ||\n rowData;\n\n if (colName == \"id\") {\n result = parseInt(result);\n }\n\n return result;\n }\n};\n","/*\n * ABFieldCore\n *\n * ABFieldBase defines the common ABField structure that is shared between\n * the client and the server. Mostly how it manages it's internal data, and\n * how it is related to the ABObject classes.\n *\n */\n// const ABEmitter = require(\"../../platform/ABEmitter\");\nconst ABMLClass = require(\"../../platform/ABMLClass\");\n\nmodule.exports = class ABFieldCore extends ABMLClass {\n constructor(values, object, fieldDefaults) {\n super([\"label\"], object.AB);\n\n // NOTE: setup this first so later we can use .fieldType(), .fieldIcon()\n this.defaults = fieldDefaults || {};\n\n /*\n \t\t{\n \t\t\tid:'uuid',\t\t\t\t\t// uuid value for this obj\n \t\t\tkey:'fieldKey',\t\t\t\t// unique key for this Field\n \t\t\ticon:'font',\t\t\t\t// fa-[icon] reference for an icon for this Field Type\n \t\t\tlabel:'',\t\t\t\t\t// pulled from translation\n\t\t\tcolumnName:'column_name',\t// a valid mysql table.column name\n\t\t\tisImported: 1/0,\t\t\t// flag to mark is import from other object\n\t\t\tsettings: {\t\t\t\t\t// unique settings for the type of field\n\t\t\t\tshowIcon:true/false,\t// only useful in Object Workspace DataTable\n\t\t\t\tisImported: 1/0,\t\t// flag to mark is import from other object\n\t\t\t\trequired: 1/0,\t\t\t// field allows does not allow NULL or it does allow NULL\n\t\t\t\twidth: {int}\t\t\t// width of display column\n\n\t\t\t\t// specific for dataField\n\t\t\t},\n\t\t\ttranslations:[]\n \t\t}\n \t\t*/\n\n this.object = object;\n\n this.fromValues(values);\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n static get reservedNames() {\n return [\n \"id\",\n \"created_at\",\n \"updated_at\",\n \"properties\",\n \"createdAt\",\n \"updatedAt\",\n ];\n }\n\n static defaultValues() {\n return {};\n }\n\n // unique key to reference this specific DataField\n fieldKey() {\n return this.defaults.key;\n }\n\n /**\n * Sails ORM data types that can be imported to this DataField\n * @return {Array}\n */\n fieldOrmTypes() {\n if (this.defaults.compatibleOrmTypes) {\n if (Array.isArray(this.defaults.compatibleOrmTypes)) {\n return this.defaults.compatibleOrmTypes;\n } else {\n return [this.defaults.compatibleOrmTypes];\n }\n } else {\n return [];\n }\n }\n\n /**\n * Mysql data types that can be imported to this DataField\n * @return {Array}\n */\n fieldMysqlTypes() {\n if (this.defaults.compatibleMysqlTypes) {\n if (Array.isArray(this.defaults.compatibleMysqlTypes)) {\n return this.defaults.compatibleMysqlTypes;\n } else {\n return [this.defaults.compatibleMysqlTypes];\n }\n } else {\n return [];\n }\n }\n\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n fieldIcon() {\n return this.defaults.icon;\n }\n\n // the multilingual text for the name of this data field.\n fieldMenuName() {\n return this.defaults.menuName;\n }\n\n // the multilingual text for the name of this data field.\n fieldDescription() {\n return this.defaults.description;\n }\n\n // the flag to set when checking if field should be filterable\n fieldIsFilterable() {\n if (this.defaults.isFilterable != null) {\n if (typeof this.defaults.isFilterable === \"function\") {\n return this.defaults.isFilterable(this);\n } else {\n return this.defaults.isFilterable;\n }\n }\n\n return 1;\n }\n\n // the flag to set when checking if field should be sortable\n fieldIsSortable() {\n if (this.defaults.isSortable != null) {\n if (typeof this.defaults.isSortable === \"function\") {\n return this.defaults.isSortable(this);\n } else {\n return this.defaults.isSortable;\n }\n }\n\n return 1;\n }\n\n // the flag to set when checking if the field should be used as a label\n fieldUseAsLabel() {\n if (this.defaults.useAsLabel != null) {\n if (typeof this.defaults.useAsLabel === \"function\") {\n return this.defaults.useAsLabel(this);\n } else {\n return this.defaults.useAsLabel;\n }\n }\n\n return 1;\n }\n\n fieldSupportRequire() {\n if (this.defaults.supportRequire) return this.defaults.supportRequire;\n // default\n else return true;\n }\n\n fieldSupportQuery() {\n if (this.defaults.supportQuery != null) {\n if (typeof this.defaults.supportQuery === \"function\") {\n return this.defaults.supportQuery(this);\n } else {\n return this.defaults.supportQuery;\n }\n }\n\n return true;\n }\n\n ///\n /// Instance Methods\n ///\n\n /// ABApplication data methods\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABField instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n const obj = super.toObj();\n\n return {\n id: this.id,\n type: this.type || \"field\",\n key: this.key,\n icon: this.icon,\n isImported: this.isImported,\n columnName: this.columnName,\n settings: this.settings,\n translations: obj.translations,\n };\n }\n\n defaultCheck(val, defaultVal) {\n let returnVal = defaultVal;\n if (typeof val != \"undefined\") {\n returnVal = val;\n }\n return returnVal;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n if (!this.id) this.id = values.id; // NOTE: only exists after .save()\n this.type == values.type || \"field\";\n this.key = values.key || this.fieldKey();\n this.icon = values.icon || this.fieldIcon();\n\n values.settings = values.settings || {};\n\n // if this is being instantiated on a read from the Property UI,\n // .label is coming in under .settings.label\n this.label = values.label || values.settings.label || \"?label?\";\n\n this.columnName = values.columnName || \"\";\n\n this.isImported = values.isImported || 0;\n\n this.settings = values.settings;\n this.settings.showIcon = this.defaultCheck(values.settings.showIcon, \"1\");\n this.settings.required = this.defaultCheck(values.settings.required, \"0\");\n this.settings.width = this.defaultCheck(values.settings.width, \"0\");\n\n // convert from \"0\" => 0\n this.isImported = parseInt(this.isImported);\n this.settings.showIcon = parseInt(this.settings.showIcon);\n this.settings.required = parseInt(this.settings.required);\n this.settings.unique = parseInt(this.settings.unique || 0);\n this.settings.width = parseInt(this.settings.width);\n\n // we're responsible for setting up our specific settings:\n const defaultValues = this.constructor.defaultValues() || {};\n for (const dv in defaultValues) {\n this.settings[dv] = this.defaultCheck(\n values.settings[dv],\n defaultValues[dv]\n );\n }\n\n // const the MLClass now process the Translations\n super.fromValues(values);\n\n // final validity check: columnName really should have a value:\n this.columnName = this.columnName || this.label;\n\n // knex does not like .(dot) in table and column names\n // https://github.com/knex/knex/issues/2762\n this.columnName = this.columnName.replace(/[^a-zA-Z0-9_ ]/gi, \"\");\n }\n\n /**\n * @method urlPointer()\n * return a string pointer to decode this object from the root application\n * object.\n * @return {string} pointer reference\n */\n urlPointer() {\n return this.object.urlField() + this.id;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n values[this.columnName] = \"\";\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n */\n isValidData(data, validator) {\n // console.error('!!! Field ['+this.fieldKey()+'] has not implemented .isValidData()!!!');\n if (\n this.settings.required &&\n (data[this.columnName] == null || data[this.columnName] == \"\") &&\n data[this.columnName] != 0\n ) {\n validator.addError(this.columnName, \"This is a required field.\");\n }\n }\n\n /*\n * @property isMultilingual\n * does this field represent multilingual data?\n * @return {bool}\n */\n get isMultilingual() {\n return false;\n }\n\n dataValue(rowData) {\n const propName = `${this.alias || this.object.name}.${this.columnName}`;\n\n let result = \"\";\n if (rowData?.[this.columnName] != null) {\n result = rowData[this.columnName];\n } else if (rowData?.[propName] != null) {\n result = rowData[propName];\n }\n\n return result;\n }\n\n /**\n * @method format\n * return display text to detail comonent and define label of object\n *\n * @param {Object} rowData - data\n */\n format(rowData) {\n if (rowData) {\n return this.dataValue(rowData);\n } else return \"\";\n }\n\n /**\n * @method toDefinition()\n *\n * convert this instance into an ABDefinition object.\n *\n * @return {ABDefinition}\n */\n toDefinition() {\n const myDef = super.toDefinition();\n\n // attempt to provide a more descriptive name:\n // [obj]->[fieldName]\n if (myDef.name == \"\") {\n myDef.name =\n myDef.json.name || myDef.json.label || myDef.json.columnName;\n }\n if (this.object && this.object.name) {\n myDef.name = `${this.object.name}->${myDef.name}`;\n }\n return myDef;\n }\n};\n","/*\n * ABFieldDate\n *\n * An ABFieldDate defines a date field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\n/*function L(key, altText) {\n // TODO:git \n // return altText; // AD.lang.label.getLabel(key) || altText;\n}*/\n\nconst ABFieldDateDefaults = {\n key: \"date\",\n // unique key to reference this specific DataField\n\n description: \"Pick one from a calendar.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"calendar\",\n // font-awesome icon reference. (without the 'fa-'). so 'calendar' to\n // reference 'fa-calendar'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Date\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"date\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"date\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n dateFormat: 2, // 1 (Ignore date), 2, 3, 4, 5\n defaultDate: 1, // 1 (None), 2 (Current Date), 3 (Specific Date)\n defaultDateValue: null, // {Date}\n validateCondition: \"none\",\n validateRangeUnit: \"days\",\n validateRangeBefore: 0,\n validateRangeAfter: 0,\n validateStartDate: null,\n validateEndDate: null,\n};\n\nmodule.exports = class ABFieldDateCore extends ABField {\n constructor(values, object, defaultValues = ABFieldDateDefaults) {\n super(values, object, defaultValues);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldDateDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n // TODO: current webpack install fails here without babel-loader,\n // so swtich this to old JS method of Static Values (see bottom)\n // static RegEx = \"^[0-9]{4}-[0-9]{2}-[0-9]{2}$\";\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n this.settings.dateFormat = parseInt(this.settings.dateFormat);\n this.settings.defaultDate = parseInt(this.settings.defaultDate);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n if (values[this.columnName] != null) return;\n\n let dateResult;\n\n // Set current date as default\n if (this.settings.defaultDate == 2) {\n dateResult = new Date();\n }\n // Set specific date as default\n else if (\n this.settings.defaultDate == 3 &&\n this.settings.defaultDateValue\n ) {\n dateResult = new Date(this.settings.defaultDateValue);\n }\n\n // if no default value is set, then don't insert a value.\n if (dateResult != null) {\n values[this.columnName] = this.AB.rules.toDateFormat(dateResult, {\n format: \"YYYY-MM-DD\",\n });\n // values[this.columnName] = moment(dateResult).format(\"YYYY-MM-DD\");\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n var L = this.AB.Label();\n\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n\n if (data[this.columnName]) {\n let value = data[this.columnName];\n\n if (!(value instanceof Date)) {\n value = this.AB.rules.toDate(value);\n // value = new Date(this.convertToMoment(value));\n }\n\n // verify we didn't end up with an InValid Date result.\n if (\n Object.prototype.toString.call(value) === \"[object Date]\" &&\n isFinite(value)\n ) {\n let isValid = true;\n\n // Custom vaildate is here\n if (this.settings && this.settings.validateCondition) {\n const startDate = this.settings.validateStartDate\n ? new Date(this.settings.validateStartDate)\n : null,\n endDate = this.settings.validateEndDate\n ? new Date(this.settings.validateEndDate)\n : null,\n startDateDisplay = this.getDateDisplay(startDate),\n endDateDisplay = this.getDateDisplay(endDate);\n const minDate = this.AB.rules.subtractDate(\n new Date(),\n this.settings.validateRangeBefore,\n this.settings.validateRangeUnit\n );\n const maxDate = this.AB.rules.addDate(\n new Date(),\n this.settings.validateRangeAfter,\n this.settings.validateRangeUnit\n );\n switch (this.settings.validateCondition) {\n case \"dateRange\":\n if (minDate < value && value < maxDate) isValid = true;\n else {\n isValid = false;\n validator.addError(\n this.columnName,\n L(\"Should be in between {0} and {1}\", [\n this.getDateDisplay(minDate),\n this.getDateDisplay(maxDate),\n ])\n );\n }\n\n break;\n case \"between\":\n if (startDate < value && value < endDate) isValid = true;\n else {\n isValid = false;\n validator.addError(\n this.columnName,\n L(\"Should be in between {0} and {1}\", [\n startDateDisplay,\n endDateDisplay,\n ])\n );\n }\n break;\n case \"notBetween\":\n if (value < startDate && endDate < value) isValid = true;\n else {\n isValid = false;\n validator.addError(\n this.columnName,\n L(\"Should not be in between {0} and {1}\", [\n startDateDisplay,\n endDateDisplay,\n ])\n );\n }\n break;\n case \"=\":\n isValid =\n value.getTime &&\n startDate.getTime &&\n value.getTime() == startDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should equal {0}\", [startDateDisplay])\n );\n break;\n case \"<>\":\n isValid =\n value.getTime &&\n startDate.getTime &&\n value.getTime() != startDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should not equal {0}\", [startDateDisplay])\n );\n break;\n case \">\":\n isValid =\n value.getTime &&\n startDate.getTime &&\n value.getTime() > startDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should after {0}\", [startDateDisplay])\n );\n break;\n case \"<\":\n isValid =\n value.getTime &&\n startDate.getTime &&\n value.getTime() < startDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should before {0}\", [startDateDisplay])\n );\n break;\n case \">=\":\n isValid =\n value.getTime &&\n startDate.getTime &&\n value.getTime() >= startDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should after or equal {0}\", [startDateDisplay])\n );\n break;\n case \"<=\":\n isValid =\n value.getTime &&\n startDate.getTime &&\n value.getTime() <= startDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should before or equal {0}\", [startDateDisplay])\n );\n break;\n case \"lessCurrentDate\":\n isValid =\n value.getTime &&\n value.getTime() < currentDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should before {0}\", [\n this.getDateDisplay(currentDate),\n ])\n );\n break;\n case \"lessEqualCurrentDate\":\n isValid =\n value.getTime &&\n value.getTime() <= currentDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should before or equal {0}\", [\n this.getDateDisplay(currentDate),\n ])\n );\n break;\n }\n }\n\n if (isValid) {\n // Reformat value to DB\n // NOTE: should we update here?\n data[this.columnName] = this.exportValue(value);\n }\n } else {\n // return a validation error\n validator.addError(this.columnName, \"Should be a Date!\");\n }\n }\n }\n\n format(rowData) {\n const d = this.dataValue(rowData);\n\n if (d == \"\" || d == null) {\n return \"\";\n }\n\n // pull format from settings.\n const dateObj = this.AB.rules.toDate(d);\n return this.getDateDisplay(dateObj);\n\n // const momentObj = this.convertToMoment(d);\n // return this.getDateDisplay(new Date(momentObj));\n }\n\n getFormat() {\n let dateFormatString = \"\";\n\n const dateFormat =\n this.settings && this.settings.dateFormat\n ? this.settings.dateFormat\n : \"\";\n\n switch (dateFormat) {\n //Ignore Date\n case (1, 2):\n {\n dateFormatString = \"%d/%m/%Y\";\n }\n break;\n //mm/dd/yyyy\n case 3:\n {\n dateFormatString = \"%m/%d/%Y\";\n }\n break;\n //M D, yyyy\n case 4:\n {\n dateFormatString = \"%M %d, %Y\";\n }\n break;\n //D M, yyyy\n case 5:\n {\n dateFormatString = \"%d %M, %Y\";\n }\n break;\n default:\n {\n dateFormatString = \"%d/%m/%Y\";\n }\n break;\n }\n\n return dateFormatString;\n }\n\n getDateDisplay(dateData) {\n const dateFormat = this.getFormat();\n\n return this.dateToString(dateFormat, dateData);\n }\n\n // convertToMoment(string) {\n // const result = moment(string);\n\n // const supportFormats = [\n // \"DD/MM/YYYY\",\n // \"MM/DD/YYYY\",\n // \"DD-MM-YYYY\",\n // \"MM-DD-YYYY\"\n // ];\n\n // supportFormats.forEach((format) => {\n // if (!result || !result.isValid()) result = moment(string, format);\n // });\n\n // return result;\n // }\n\n exportValue(value) {\n return value\n ? this.AB.rules.toDateFormat(value, {\n format: \"YYYY-MM-DD\",\n })\n : \"\";\n // return this.convertToMoment(value).format(\"YYYY-MM-DD\");\n }\n\n dateToString(dateFormat, dateData) {\n if (dateData && dateData.toString) return dateData.toString();\n else return \"\";\n }\n};\n\n// Transition Code:\n// revert to static RegEx once babel-loader is working locally.\nmodule.exports.RegEx = \"^[0-9]{4}-[0-9]{2}-[0-9]{2}$\";\n","/*\n * ABFieldDateTime\n *\n * An ABFieldDateTime defines a datetime field type.\n *\n */\n\nconst ABFieldDateCore = require(\"./ABFieldDateCore\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldDateDefaults = {\n key: \"datetime\",\n // unique key to reference this specific DataField\n\n description: \"Pick one from date & time.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"clock-o\",\n // font-awesome icon reference. (without the 'fa-'). so 'clock-o' to\n // reference 'clock-o'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Date & Time\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"datetime\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"datetime\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n timeFormat: 2, // 1 (Ignore time), 2, 3\n defaultTime: 1, // 1 (None), 2 (Current Time), 3 (Specific Time)\n defaultTimeValue: null, // {Date}\n};\n\nmodule.exports = class ABFieldDateTimeCore extends ABFieldDateCore {\n constructor(values, object) {\n super(values, object, ABFieldDateDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldDateDefaults;\n }\n\n static defaultValues() {\n const baseDefault = super.defaultValues();\n return Object.assign(baseDefault, defaultValues);\n }\n\n // TODO: current webpack install fails here without babel-loader,\n // so swtich this to old JS method of Static Values (see bottom)\n // static RegEx = \"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$\";\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n this.settings.timeFormat = parseInt(this.settings.timeFormat);\n this.settings.defaultTime = parseInt(this.settings.defaultTime);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n if (values[this.columnName] != null) return;\n\n super.defaultValue(values);\n\n let dateResult;\n\n // From default value of ABFieldDateCore\n if (values[this.columnName]) {\n dateResult = this.AB.rules.toDate(values[this.columnName]);\n // const momentVal = this.convertToMoment(values[this.columnName]);\n // if (momentVal.isValid()) {\n // dateResult = new Date(momentVal);\n // }\n }\n\n // Set current time as default\n if (this.settings.defaultTime == 2) {\n const currDate = new Date();\n\n if (dateResult == null) dateResult = new Date();\n\n dateResult.setHours(currDate.getHours());\n dateResult.setMinutes(currDate.getMinutes());\n dateResult.setSeconds(currDate.getSeconds());\n dateResult.setMilliseconds(currDate.getMilliseconds());\n }\n // Set specific time as default\n else if (\n this.settings.defaultTime == 3 &&\n this.settings.defaultTimeValue\n ) {\n const defaultTime = new Date(this.settings.defaultTimeValue);\n\n if (dateResult == null) dateResult = new Date();\n\n dateResult.setHours(defaultTime.getHours());\n dateResult.setMinutes(defaultTime.getMinutes());\n dateResult.setSeconds(defaultTime.getSeconds());\n dateResult.setMilliseconds(defaultTime.getMilliseconds());\n }\n\n // if no default value is set, then don't insert a value.\n if (dateResult != null)\n values[this.columnName] = dateResult.toISOString();\n }\n\n getFormat() {\n const timeFormat = this.getTimeFormat();\n\n this.settings = this.settings || {};\n\n if (this.settings.dateFormat == 1) {\n return timeFormat;\n }\n\n const dateFormat = super.getFormat();\n\n return `${dateFormat} ${timeFormat}`;\n }\n\n format(rowData) {\n const datetimeFormat = this.getFormat();\n const d = this.dataValue(rowData);\n const dateObj = this.AB.rules.toDate(d);\n\n if (d == \"\" || d == null) {\n return \"\";\n }\n\n if (this.AB.Webix)\n return this.AB.Webix.Date.dateToStr(datetimeFormat)(dateObj);\n else\n return dateObj?.toISOString() ?? \"\";\n }\n\n getTimeFormat() {\n this.settings = this.settings || {};\n switch (this.settings.timeFormat) {\n case 2:\n return \" %h:%i %A\";\n case 3:\n return \" %H:%i\";\n default:\n return \"\";\n }\n }\n\n /**\n * @method exportValue\n * @param {Date} date\n * @return {string}\n */\n exportValue(date) {\n return date?.toISOString?.() ?? \"\";\n }\n};\n\n// Transition Code:\n// revert to static RegEx once babel-loader is working locally.\nmodule.exports.RegEx =\n \"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$\";\n","/*\n * ABFieldEmail\n *\n * An ABFieldEmail defines a boolean field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldEmailDefaults = {\n key: \"email\",\n // unique key to reference this specific DataField\n\n description: \"Email fields are used to store email addresses.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"envelope\",\n // font-awesome icon reference. (without the 'fa-'). so 'envelope' to\n // reference 'fa-envelope'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Email\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: true,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"char\", \"varchar\", \"tinytext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n default: \"\",\n defaultCheckbox: 0,\n};\n\nmodule.exports = class ABFieldEmailCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldEmailDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldEmailDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.default = values.settings.default || \"\";\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // if no default value is set, then don't insert a value.\n if (!values[this.columnName]) {\n // Set default string\n if (this.settings.default) {\n values[this.columnName] = this.settings.default;\n }\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n if (data[this.columnName]) {\n const Reg =\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\n let value = data[this.columnName];\n value = String(value).toLowerCase();\n if (!Reg.test(value)) {\n validator.addError(this.columnName, \"Invalid email\");\n }\n }\n }\n};\n","/*\n * ABFieldFile\n *\n * An ABFieldFile defines a File field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldFileDefaults = {\n key: \"file\",\n // unique key to reference this specific DataField\n\n description: \"Attach a File to this object.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"file\",\n // font-awesome icon reference. (without the 'fa-'). so 'file' to\n // reference 'fa-file'\n\n isFilterable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"File Attachment\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: false,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"char\", \"varchar\", \"tinytext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n removeExistingData: 0,\n fileSize: 0,\n fileType: \"\",\n};\n\nmodule.exports = class ABFieldFileCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldFileDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldFileDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n this.settings.fileSize = parseInt(this.settings.fileSize);\n this.settings.limitFileSize = parseInt(this.settings.limitFileSize);\n this.settings.limitFileType = parseInt(this.settings.limitFileType);\n this.settings.removeExistingData = parseInt(\n this.settings.removeExistingData\n );\n }\n\n /**\n * @method dataValue\n * return the file data stored as part of this field.\n *\n * An ABFieldFile column contains a json structure that contains\n * .uuid : {string} a file uuid reference\n * .filename : {string} the name of the file that was uploaded.\n *\n * This will return the json object.\n * @param {obj} values a key=>value hash of the current values.\n * @return {obj} { uuid, filename }, or {} if empty.\n */\n dataValue(rowData) {\n const propName = `${this.alias || this.object.name}.${this.columnName}`;\n\n let result = rowData[this.columnName] || rowData[propName] || {};\n if (typeof result == \"string\") {\n try {\n result = JSON.parse(result);\n } catch (err) {\n // ignore error\n }\n }\n\n return result;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n *\n * An ABFieldFile expects a json structure that contains\n * .uuid : {string} a file uuid reference\n * .filename : {string} the name of the file that was uploaded.\n *\n * For a default value, we return an empty json object: \"{}\"\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n values[this.columnName] = \"{}\";\n }\n\n format(rowData) {\n let result = this.dataValue(rowData);\n if (result) {\n if (typeof result == \"string\") {\n try {\n result = JSON.parse(result);\n } catch (err) {\n // ignore error.\n }\n }\n\n // return file name\n return result ? result.filename || \"\" : \"\";\n } else {\n return \"\";\n }\n }\n\n /**\n * @method requestParam\n * return the entry in the given input that relates to this field.\n * @param {obj} allParameters a key=>value hash of the inputs to parse.\n * @return {obj} or undefined\n */\n requestParam(allParameters) {\n const myParameter = super.requestParam(allParameters);\n\n // if we have our default empty object, then remove the entry\n // and let the DB insert a null value.\n let val = myParameter?.[this.columnName];\n if (val == \"{}\" || val == \"\") {\n delete myParameter[this.columnName];\n }\n if (\"string\" === typeof val) {\n try {\n myParameter[this.columnName] = JSON.parse(val);\n } catch (e) {\n /* ignore */\n }\n }\n\n return myParameter;\n }\n};\n","/*\n * ABFieldFormula\n *\n * An ABFieldFormula are used to run calculations on connected (child) records\n * and store the total of that calculation in the parent.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nconst ABFieldFormulaDefaults = {\n key: \"formula\",\n // unique key to reference this specific DataField\n\n description:\n \"Perform a calculation by a formula type based upon existing values\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"circle-o-notch\",\n // font-awesome icon reference. (without the 'fa-'). so 'circle-o-notch' to\n // reference 'fa-circle-o-notch'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Formula\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportQuery: (field) => {\n const fieldLink = field.fieldLink;\n if (fieldLink == null) return false;\n\n // Not support calculate field in query\n return fieldLink.key !== \"calculate\";\n },\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: false,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"number\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\n \"tinyint\",\n \"smallint\",\n \"mediumint\",\n \"int\",\n \"integer\",\n \"bigint\",\n \"decimal\",\n \"dec\",\n \"numeric\",\n \"fixed\",\n \"float\",\n \"real\",\n ],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n field: \"\", // id of ABField : NOTE - store our connect field to support when there are multi - linked columns\n objectLink: \"\", // id of ABObject\n fieldLink: \"\", // id of ABField\n type: \"sum\", // \"sum\", \"average\", \"max\", \"min\", \"count\"\n where: \"\",\n};\n\nmodule.exports = class ABFieldFormulaCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldFormulaDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldFormulaDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // this field is read only\n delete values[this.columnName];\n }\n\n /**\n * @method format\n * both calculate and format the data input based of user settings\n * for this field.\n * @param {obj} rowData\n * a key=>value hash of the current values.\n * @param {boolean} reCalculate\n * a boolean that signals if we should force recalculation of values\n */\n format(rowData, reCalculate = false, isGrouped = false) {\n const fieldLink = this.fieldLink;\n\n const reformat = (numData) => {\n // ABFieldCalculate does not need to .format again\n if (!fieldLink || fieldLink.key == \"calculate\") {\n return numData;\n } else {\n const rowDataFormat = {};\n rowDataFormat[fieldLink.columnName] = numData;\n return fieldLink.format(rowDataFormat);\n }\n };\n\n // if data exists, then will not calculate on client side\n // unless we pass reCalculate=true to force the recalculation\n if (rowData[this.columnName] != null && !reCalculate && !isGrouped) {\n // reformat data\n return reformat(rowData[this.columnName]);\n } else if (\n rowData[this.columnName] != null &&\n !reCalculate &&\n isGrouped\n ) {\n return rowData[this.columnName];\n }\n\n if (!fieldLink) return 0;\n\n const fieldBase = this.fieldBase();\n if (!fieldBase) return 0;\n\n let data =\n rowData[fieldBase.relationName()] ||\n rowData[fieldBase.columnName] ||\n [];\n if (!Array.isArray(data)) data = [data];\n\n // Filter\n if (\n data &&\n data.length &&\n this.settings &&\n this.settings.where &&\n this.settings.where.rules &&\n this.settings.where.rules.length\n ) {\n this.filterHelper.setValue(this.settings.where);\n data = data.filter((item) => this.filterHelper.isValid(item));\n }\n\n let numberList = [];\n\n // pull number from data\n switch (fieldLink.key) {\n case \"calculate\":\n data.forEach((d) => {\n numberList.push(parseFloat(fieldLink.format(d) || 0));\n });\n break;\n case \"number\":\n numberList = data.map((d) => d[fieldLink.columnName] || 0);\n break;\n }\n\n let result = 0;\n\n // get the decimal size of the numbers being calculated\n const decimalSize = fieldLink.getDecimalSize();\n\n // calculate\n switch (this.settings.type) {\n case \"sum\":\n if (numberList.length > 0) {\n // get power of 10 to the number of decimal places this number\n // is formated to require\n const multiplier = Math.pow(10, decimalSize);\n // multiply values by muliplyier and add them to pervious value\n // because in javascript adding number with decimals can cause issues\n // ex: 9.11 + 222.11 = 231.22000000000003\n let sum = 0;\n numberList.forEach((val) => {\n sum += val * multiplier || 0;\n });\n // divide result by multiplier to get actual value\n result = sum / multiplier;\n }\n break;\n\n case \"average\":\n if (numberList.length > 0) {\n // get power of 10 to the number of decimal places this number\n // is formated to require\n const multiplier = Math.pow(10, decimalSize);\n // multiply values by muliplyier and add them to pervious value\n // because in javascript adding number with decimals can cause issues\n // ex: 9.11 + 222.11 = 231.22000000000003\n let sum = 0;\n numberList.forEach((val) => {\n sum += val * multiplier || 0;\n });\n // divide result by multiplier to get actual value\n // and divide by length to get the average\n result = sum / multiplier / numberList.length;\n }\n break;\n\n case \"max\":\n result = Math.max(...numberList) || 0;\n break;\n case \"min\":\n result = Math.min(...numberList) || 0;\n break;\n case \"count\":\n result = numberList.length;\n break;\n }\n\n rowData[this.columnName] = result;\n\n // ABFieldCalculate does not need to .format again\n if (fieldLink.key == \"calculate\") {\n return result;\n } else {\n return reformat(result);\n }\n }\n\n fieldBase() {\n return this.object.fieldByID(this.settings.field);\n }\n\n get fieldLink() {\n const obj = this.AB.objectByID(this.settings.object);\n if (!obj) return null;\n\n const field = obj.fieldByID(this.settings.fieldLink);\n if (!field) return null;\n\n return field;\n }\n\n get filterHelper() {\n if (this._rowFilter == null) {\n this._rowFilter = this.AB.filterComplexNew(`${this.id}_filterComplex`);\n\n if (this.fieldLink && this.fieldLink.object) {\n this._rowFilter.fieldsLoad(this.fieldLink.object.fields());\n this._rowFilter.setValue(this.settings.where);\n }\n }\n\n return this._rowFilter;\n }\n};\n","/*\n * ABFieldImageCore\n *\n * An ABFieldImage defines a Image field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nconst ABFieldImageDefaults = {\n key: \"image\",\n // unique key to reference this specific DataField\n\n description: \"Attach an image to this object.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"file-image-o\",\n // font-awesome icon reference. (without the 'fa-'). so 'file-image-o' to\n // reference 'fa-file-image-o'\n\n isFilterable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Image Attachment\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: false,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"char\", \"varchar\", \"tinytext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n useWidth: 0,\n imageWidth: \"\",\n useHeight: 0,\n imageHeight: \"\",\n removeExistingData: 0,\n useDefaultImage: false,\n defaultImageUrl: \"\",\n};\n\nmodule.exports = class ABFieldImageCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldImageDefaults);\n\n // NOTE: our Labels are ready here:\n // if (\n // ABFieldImageDefaults.menuName == \"*Image Attachment\" &&\n // this.AB.Label\n // ) {\n // const L = this.AB.Label();\n // ABFieldImageDefaults.menuName = L(\"Image Attachment\");\n // ABFieldImageDefaults.description = L(\"Attach an image to this object.\");\n // }\n\n /*\n \t{\n\t\t\tsettings: {\n\t\t\t\t'useWidth':0,\n\t\t\t\t'imageWidth':'',\n\t\t\t\t'useHeight': 0,\n\t\t\t\t'imageHeight': '',\n\t\t\t\t'removeExistingData': 0\n\t\t\t}\n \t}\n \t*/\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldImageDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n this.settings.useWidth = parseInt(this.settings.useWidth);\n this.settings.useHeight = parseInt(this.settings.useHeight);\n this.settings.imageWidth = parseInt(this.settings.imageWidth);\n this.settings.imageHeight = parseInt(this.settings.imageHeight);\n this.settings.useDefaultImage = parseInt(this.settings.useDefaultImage);\n this.settings.removeExistingData = parseInt(\n this.settings.removeExistingData\n );\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n }\n};\n","/*\n * ABFieldJson\n *\n * An ABFieldJson defines a JSON field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nconst ABFieldJsonDefaults = {\n key: \"json\",\n // unique key to reference this specific DataField\n\n description: \"JSON value\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"font\",\n // font-awesome icon reference. (without the 'fa-'). so 'font' to\n // reference 'fa-font'\n\n isFilterable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"JSON\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"json\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"json\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {};\n\nmodule.exports = class ABFieldJsonCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldJsonDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldJsonDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // in the case of a JSON data type, we should NOT insert a \"\"\n //\n // values[this.columnName] = \"\";\n }\n};\n","/*\n * ABFieldListCore\n *\n * An ABFieldList defines a select list field type.\n *\n */\n\n// const ABFieldSelectivity = require(\"../../platform/dataFields/ABFieldSelectivity\");\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldListDefaults = {\n key: \"list\",\n // unique key to reference this specific DataField\n\n description:\n \"Select list allows you to select predefined options below from a dropdown.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"th-list\",\n // font-awesome icon reference. (without the 'fa-'). so 'th-list' to\n // reference 'fa-th-list'\n\n isFilterable: (field) => {\n if (field.settings.isMultiple) {\n return false;\n } else {\n return true;\n }\n },\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: (field) => {\n if (field.settings.isMultiple) {\n return false;\n } else {\n return true;\n }\n },\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Select list\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\n \"char\",\n \"varchar\",\n \"tinytext\" /* \"text\", \"mediumtext\" */,\n ],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n\n hasColors: (field) => {\n if (field.settings.hasColors) {\n return true;\n } else {\n return false;\n }\n },\n};\n\nconst defaultValues = {\n isMultiple: 0,\n // {bool}\n // can multiple values be selected?\n\n hasColors: 0,\n // {bool}\n // are we to display our values in colors?\n\n options: [],\n // {array}\n // The options defined for this list:\n // [ { id, text, hex, translations },...]\n // .id {string} a unique id for this value\n // .text {string} the displayed text of this value\n // .hex {string} a color hex definition for this value\n // .translations {obj} the multilingual definitions for this value.\n\n default: \"none\",\n multipleDefault: [],\n};\n\nmodule.exports = class ABFieldListCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldListDefaults);\n\n this.pendingDeletions = [];\n // {array}\n // a list of pending option deletions that need to be processed\n // when this is saved.\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldListDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // translate options list\n if (this.settings.options && this.settings.options.length > 0) {\n this.settings.options.forEach((opt) => {\n this.translate(opt, opt, [\"text\"]);\n });\n }\n\n this.settings.isMultiple = parseInt(this.settings.isMultiple);\n this.settings.hasColors = parseInt(this.settings.hasColors);\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n const obj = super.toObj();\n\n // Un-translate options list\n obj.settings.options.forEach((opt) => {\n this.unTranslate(opt, opt, [\"text\"]);\n });\n\n return obj;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // Multiple select list\n if (this.settings.isMultiple == true) {\n let defaultVals = [];\n this.settings.multipleDefault.forEach((def) => {\n this.settings.options.forEach((opt) => {\n if (opt.id == def.text) {\n defaultVals.push(opt);\n }\n });\n });\n values[this.columnName] = defaultVals || [];\n }\n // Single select list\n else if (this.settings.default && this.settings.default != \"\") {\n values[this.columnName] = this.settings.default;\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n }\n\n /**\n * @method options\n * Return an array of [{ id, text }] options defined by this field.\n * @return {array}\n */\n options() {\n return this.settings.options.map((opt) => {\n return {\n id: opt.id,\n text: opt.text,\n hex: opt.hex ? opt.hex : \"\",\n translations: opt.translations ? opt.translations : \"\",\n };\n });\n }\n\n format(rowData, options = {}) {\n let val = this.dataValue(rowData) || [];\n\n if (typeof val == \"string\") {\n try {\n val = JSON.parse(val);\n } catch (e) {\n // continue regardless of error\n }\n }\n\n // Convert to array\n if (!Array.isArray(val)) val = [val];\n\n const displayOpts = this.settings.options\n .filter((opt) => val.filter((v) => (v.id || v) == opt.id).length > 0)\n .map((opt) => {\n let text = opt.text;\n const languageCode = options.languageCode || \"en\";\n\n // Pull text of option with specify language code\n const optTran = (opt.translations || []).filter(\n (o) => o.language_code == languageCode\n )[0];\n if (optTran) text = optTran.text;\n\n return text;\n });\n\n return displayOpts.join(\", \");\n }\n};\n","/*\n * ABFieldLongText\n *\n * An ABFieldLongText defines a LongText field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nconst MAX_CHAR_LENGTH = 5000;\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldLongTextDefaults = {\n key: \"LongText\", // unique key to reference this specific DataField\n\n description: \"Multiple lines of text\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"align-right\",\n // font-awesome icon reference. (without the 'fa-'). so 'align-right' to\n // reference 'fa-align-right'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Long text\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"longtext\", \"mediumtext\", \"text\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"text\", \"mediumtext\", \"longtext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n\n MAX_CHAR_LENGTH,\n // {integer}\n // The maximum length our ABFieldLongText can be.\n};\n\n// defaultValues: the keys must match a .name of your elements to set it's default value.\nconst defaultValues = {\n default: \"\",\n supportMultilingual: 0,\n};\n\nmodule.exports = class ABFieldLongText extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldLongTextDefaults);\n\n /*\n \t{\n\t\t\tsettings: {\n\t\t\t\tdefault: 'string',\n\t\t\t\tsupportMultilingual: 1/0\n\t\t\t}\n \t}\n \t*/\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldLongTextDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.default = values.settings.default || \"\";\n\n // we're responsible for setting up our specific settings:\n this.settings.supportMultilingual =\n values.settings.supportMultilingual + \"\" ||\n defaultValues.supportMultilingual;\n\n // text to Int:\n this.settings.supportMultilingual = parseInt(\n this.settings.supportMultilingual\n );\n\n if (this.settings.supportMultilingual) {\n if (this.object)\n this.object.translate(this.settings, this.settings, [\"default\"]);\n } else this.settings.default = values.settings.default || \"\";\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n const obj = super.toObj();\n\n if (this.settings.supportMultilingual)\n if (this.object)\n this.object.unTranslate(obj.settings, obj.settings, [\"default\"]);\n else obj.settings.default = this.settings.default;\n\n return obj;\n }\n\n /*\n * @property isMultilingual\n * does this field represent multilingual data?\n * @return {bool}\n */\n get isMultilingual() {\n return this.settings.supportMultilingual == 1;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n if (values[this.columnName] == null) {\n if (typeof this.settings.default == \"string\") {\n values[this.columnName] = this.settings.default;\n } else {\n values[this.columnName] = \"\";\n }\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n\n if (\n data &&\n data[this.columnName] &&\n data[this.columnName].length > MAX_CHAR_LENGTH\n ) {\n validator.addError(\n this.columnName,\n `should NOT be longer than ${MAX_CHAR_LENGTH} characters`\n );\n }\n }\n};\n","/*\n * ABFieldNumber\n *\n * An ABFieldNumber defines a Number field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nconst ABFieldNumberDefaults = {\n key: \"number\",\n // unique key to reference this specific DataField\n\n description: \"A Float or Integer Value\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"hashtag\",\n // font-awesome icon reference. (without the 'fa-'). so 'hashtag' to\n // reference 'fa-hashtag'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Number\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: true,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"number\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\n \"tinyint\",\n \"smallint\",\n \"mediumint\",\n \"int\",\n \"integer\",\n \"bigint\",\n \"decimal\",\n \"dec\",\n \"numeric\",\n \"fixed\",\n \"float\",\n \"real\",\n ],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n // 'allowRequired': 0,\n default: \"\",\n typeFormat: \"none\",\n typeDecimals: \"none\",\n typeDecimalPlaces: 0,\n typeRounding: \"none\",\n typeThousands: \"none\",\n validation: 0,\n validateMinimum: \"\",\n validateMaximum: \"\",\n};\n\nlet L = null; //AB.Label();\n\nmodule.exports = class ABFieldNumberCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldNumberDefaults);\n\n /*\n \t{\n\t\t\tsettings: {\n\t\t\t\t'allowRequired':0,\n\t\t\t\t'default':null,\n\t\t\t\t'typeFormat': 'none',\n\t\t\t\t'typeDecimals': 'none',\n\t\t\t\t'typeDecimalPlaces': 'none',\n\t\t\t\t'typeRounding' : 'none',\n\t\t\t\t'typeThousands': 'none',\n\t\t\t\t'validation':0,\n\t\t\t\t'validateMinimum':null,\n\t\t\t\t'validateMaximum':null\n\t\t\t}\n \t}\n \t*/\n if (!L) {\n L = this.AB.Label();\n }\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldNumberDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n static formatList(iL) {\n if (iL && !L) L = iL;\n return [\n { id: \"none\", value: L(\"None\") },\n {\n id: \"dollar\",\n value: L(\"$\"),\n sign: \"$\",\n position: \"prefix\",\n },\n {\n id: \"yen\",\n value: L(\"¥\"),\n sign: \"¥\",\n position: \"prefix\",\n },\n {\n id: \"pound\",\n value: L(\"£\"),\n sign: \"£\",\n position: \"prefix\",\n },\n {\n id: \"euroBefore\",\n value: L(\"€ (before)\"),\n sign: \"€\",\n position: \"prefix\",\n },\n {\n id: \"euroAfter\",\n value: L(\"€ (after)\"),\n sign: \"€\",\n position: \"postfix\",\n },\n {\n id: \"percent\",\n value: L(\"%\"),\n sign: \"%\",\n position: \"postfix\",\n },\n ];\n }\n\n static delimiterList() {\n return [\n { id: \"none\", value: L(\"None\") },\n {\n id: \"comma\",\n value: L(\"Comma\"),\n sign: \",\",\n },\n {\n id: \"period\",\n value: L(\"Period\"),\n sign: \".\",\n },\n {\n id: \"space\",\n value: L(\"Space\"),\n sign: \" \",\n },\n ];\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n // this.settings.allowRequired = parseInt(this.settings.allowRequired);\n this.settings.validation = parseInt(this.settings.validation);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // if no default value is set, then don't insert a value.\n if (this.settings.default != \"\") {\n values[this.columnName] = this.settings.default;\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n\n // const L = this.AB.Label();\n\n if (data[this.columnName] != null && data[this.columnName] != \"\") {\n let value = data[this.columnName];\n\n // if this is an integer:\n if (this.settings.typeDecimals == \"none\") {\n value = parseInt(value);\n } else {\n const places = parseInt(this.settings.typeDecimalPlaces) || 2;\n value = parseFloat(parseFloat(value).toFixed(places));\n }\n\n const isNumeric = (n) => {\n return !Number.isNaN(parseFloat(n)) && Number.isFinite(n);\n };\n if (!isNumeric(value)) {\n validator.addError(this.columnName, L(\"invalid number\"));\n }\n\n // validate Minimum\n if (\n this.settings.validation == true &&\n this.settings.validateMinimum != null &&\n this.settings.validateMinimum > value\n ) {\n const errMessage = L(\"should be greater than {0}\", [\n this.settings.validateMinimum,\n ]);\n\n validator.addError(this.columnName, errMessage);\n }\n\n // validate Maximum\n if (\n this.settings.validation == true &&\n this.settings.validateMaximum != null &&\n this.settings.validateMaximum < value\n ) {\n const errMessage = L(\"should be less than {0}\", [\n this.settings.validateMaximum,\n ]);\n\n validator.addError(this.columnName, errMessage);\n }\n }\n }\n\n format(rowData) {\n if (\n rowData?.[this.columnName] == null ||\n (rowData[this.columnName] !== 0 && rowData[this.columnName] == \"\")\n )\n return \"\";\n\n let data = rowData[this.columnName] || 0;\n\n if (typeof data == \"string\") {\n data = data.replace(/,/g, \"\");\n }\n\n // Validate number\n if (isNaN(parseFloat(data))) data = 0;\n\n const formatSign = this.constructor\n .formatList()\n .filter((item) => item.id == this.settings.typeFormat)[0];\n const decimalPlaces =\n this.settings.typeDecimalPlaces != \"none\"\n ? parseInt(this.settings.typeDecimalPlaces)\n : 0;\n\n let thousandsSign = this.constructor\n .delimiterList()\n .filter((item) => item.id == this.settings.typeThousands)[0];\n let decimalSign = this.constructor\n .delimiterList()\n .filter((item) => item.id == this.settings.typeDecimals)[0];\n let prefix = \"\";\n let postfix = \"\";\n\n if (formatSign && formatSign.sign) {\n switch (formatSign.position) {\n case \"prefix\":\n prefix = formatSign.sign;\n break;\n case \"postfix\":\n postfix = formatSign.sign;\n break;\n }\n }\n\n decimalSign = decimalSign.sign || \"\";\n thousandsSign = thousandsSign.sign || \"\";\n\n // round number\n if (this.settings.typeRounding == \"roundDown\") {\n const digit = Math.pow(10, decimalPlaces);\n data = Math.floor(data * digit) / digit;\n }\n\n const number = this.formatNumber(data, {\n groupDelimiter: thousandsSign,\n groupSize: 3,\n decimalDelimiter: decimalSign,\n decimalSize: decimalPlaces,\n });\n\n return `${prefix} ${number} ${postfix}`;\n }\n\n formatNumber(data, options = {}) {\n if (data === \"\" || data == null) return data;\n\n data = parseFloat(data);\n const negativeSign = data < 0 ? \"-\" : \"\";\n data = Math.abs(data);\n\n const dataStr = data.toString();\n const integerStr = dataStr.split(\".\")[0];\n const decimalStr = dataStr.split(\".\")[1];\n\n let integerValue = \"\";\n\n // Thousands digit sign\n if (options.groupDelimiter) {\n const step = 3;\n let i = integerStr.length;\n\n do {\n i -= step;\n const chunk =\n i > 0\n ? integerStr.substr(i, step)\n : integerStr.substr(0, step + i);\n integerValue = `${chunk}${\n integerValue ? options.groupDelimiter + integerValue : \"\"\n }`;\n } while (i > 0);\n } else {\n integerValue = integerStr;\n }\n\n // Integer\n let result = `${negativeSign}${integerValue}`;\n\n // Decimal\n if (decimalStr && options.decimalDelimiter && options.decimalSize) {\n const decimalVal = data.toFixed(options.decimalSize).split(\".\")[1];\n result += `${options.decimalDelimiter}${decimalVal}`;\n }\n\n return result;\n }\n\n getDecimalSize() {\n if (this.settings.typeDecimalPlaces != \"none\") {\n return parseInt(this.settings.typeDecimalPlaces);\n } else {\n return 0;\n }\n }\n};\n","/*\n * ABFieldString\n *\n * An ABFieldString defines a string field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nconst MAX_CHAR_LENGTH = 255;\n\nconst ABFieldStringDefaults = {\n key: \"string\",\n // unique key to reference this specific DataField\n\n description: \"short string value\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"font\",\n // font-awesome icon reference. (without the 'fa-'). so 'font' to\n // reference 'fa-font'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Single line text\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"char\", \"varchar\", \"tinytext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n\n MAX_CHAR_LENGTH,\n // {integer}\n // The maximum length our ABFieldString can be.\n};\n\nconst defaultValues = {\n default: \"\",\n supportMultilingual: 0,\n};\n\nmodule.exports = class ABFieldStringCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldStringDefaults);\n\n /*\n \t{\n\t\t\tsettings: {\n\t\t\t\tdefault: 'string',\n\t\t\t\tsupportMultilingual: 1/0\n\t\t\t}\n \t}\n */\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldStringDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // we're responsible for setting up our specific settings:\n this.settings.default = values.settings.default || defaultValues.default;\n this.settings.supportMultilingual =\n values.settings.supportMultilingual + \"\" ||\n defaultValues.supportMultilingual;\n\n // text to Int:\n this.settings.supportMultilingual = parseInt(\n this.settings.supportMultilingual\n );\n\n if (this.settings.supportMultilingual) {\n this.translate(this.settings, this.settings, [\"default\"]);\n } else this.settings.default = values.settings.default || \"\";\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n const obj = super.toObj();\n\n if (this.settings.supportMultilingual) {\n this.unTranslate(obj.settings, obj.settings, [\"default\"]);\n } else obj.settings.default = this.settings.default;\n\n return obj;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // if no default value is set, then don't insert a value.\n if (!values[this.columnName]) {\n // Set default string\n if (this.settings.default) {\n if (this.settings.default.indexOf(\"{uuid}\") >= 0) {\n values[this.columnName] = this.AB.uuid();\n } else {\n values[this.columnName] = this.settings.default;\n }\n }\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n\n if (data?.[this.columnName]?.length > MAX_CHAR_LENGTH) {\n const L = this.AB.Label();\n validator.addError(\n this.columnName,\n L(\"should NOT be longer than {0} characters\", [MAX_CHAR_LENGTH])\n );\n }\n }\n\n /*\n * @property isMultilingual\n * does this field represent multilingual data?\n * @return {bool}\n */\n get isMultilingual() {\n return this.settings.supportMultilingual == 1;\n }\n};\n","/*\n * ABFieldTextFormula\n *\n * An ABFieldTextFormula defines a TextFormula field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldTextFormulaDefaults = {\n key: \"TextFormula\",\n // unique key to reference this specific DataField\n\n description: \"Text Formula\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"question\",\n // font-awesome icon reference. (without the 'fa-'). so 'question' to\n // reference 'fa-question'\n\n isFilterable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Text Formula\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"text\", \"mediumtext\", \"longtext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\n// defaultValues: the keys must match a .name of your elements to set it's default value.\nconst defaultValues = {\n textFormula: \"\",\n // {string} \"some text or text with formula ...\"\n // This tells us what the formula we need to do with text included text string.\n // if we don't have this, the old value which we filled out won't be cleared when we do \"Add field\" this type again.\n\n // 'imageWidth':'',\n // 'useHeight': 0,\n // 'imageHeight': ''\n};\n\n/** Private methods */\n\n/**\n * @method setValueToFormula\n *\n * @param {ABOBject} object\n * @param {string} formulaString\n * @param {object} rowData\n */\n\nfunction setValueToFormula(object, formulaString, rowData) {\n if (!formulaString) return;\n\n const fieldRegExp = /{[^{}]+}/gm;\n const matches_field_array = formulaString.match(fieldRegExp);\n matches_field_array.forEach((element) => {\n const columnName = element.replace(/{|}|\"/g, \"\");\n object.fields().forEach((field) => {\n if (field.columnName == columnName) {\n if (field.key == \"AutoIndex\") {\n //Check AutoIndex Field\n const autoIndexVal = field.format(rowData) || 0;\n formulaString = formulaString.replace(element, autoIndexVal);\n } else if (field.key == \"calculate\") {\n //Calculate Field\n const calVal = `(${field.format(rowData) || 0})`;\n formulaString = formulaString.replace(element, eval(calVal));\n } else if (field.key == \"date\") {\n formulaString = formulaString.replace(\n element,\n rowData[columnName]\n ? field.exportValue(rowData[columnName])\n : \"\"\n );\n } else {\n \n formulaString = formulaString.replace(\n element,\n // support normal field and connect field\n (rowData[columnName] || rowData[field.relationName?.()])\n ? field.format(rowData)\n : \"\"\n );\n }\n }\n });\n });\n\n return formulaString;\n}\n\n/**\n * @method setBuildinValueToFormula\n *\n * @param {ABFactory} AB\n * @param {string} formulaString\n */\n\nfunction setBuildinValueToFormula(AB, formulaString) {\n const buildInRegExp = /\\w+\\(.*?\\)/gm;\n const matches_buildin_array = formulaString.match(buildInRegExp);\n if (matches_buildin_array) {\n const buildinList = getBuildInFunction();\n matches_buildin_array.forEach((element) => {\n const formula_array = element.split(/\\(|\\)/);\n const isBracketInBracket =\n formula_array.length > 2 && formula_array[2] != \"\";\n const functionName = formula_array[0];\n const parameters_array = formula_array[1].split(\",\");\n let isMatch = false;\n for (let i = 0; i < buildinList.length; i++) {\n let resultParameters = element;\n if (functionName == buildinList[i].id) {\n if (parameters_array.length == buildinList[i].parameter_size) {\n switch (functionName) {\n case \"left\":\n resultParameters = getLeft(\n parameters_array[0],\n parameters_array[1]\n );\n break;\n case \"right\":\n resultParameters = getRight(\n parameters_array[0],\n parameters_array[1]\n );\n break;\n case \"mid\":\n resultParameters = getMid(\n parameters_array[0],\n parameters_array[1],\n parameters_array[2]\n );\n break;\n case \"trim\":\n resultParameters = getTrim(parameters_array[0]);\n break;\n case \"trimLeft\":\n resultParameters = getTrimLeft(parameters_array[0]);\n break;\n case \"trimRight\":\n resultParameters = getTrimRight(parameters_array[0]);\n break;\n case \"length\":\n resultParameters = getLength(parameters_array[0]);\n break;\n case \"regexReplace\":\n resultParameters = getRegExpReplace(\n parameters_array[0],\n parameters_array[1].trimLeft(),\n parameters_array[2].trimLeft()\n );\n break;\n case \"extractRegex\":\n resultParameters = getExtractRegex(\n parameters_array[0],\n parameters_array[1].trimLeft()\n );\n break;\n case \"replace\":\n resultParameters = getReplace(\n parameters_array[0],\n parameters_array[1].trimLeft(),\n parameters_array[2].trimLeft()\n );\n break;\n case \"lower\":\n resultParameters = getLower(parameters_array[0]);\n break;\n case \"upper\":\n resultParameters = getUpper(parameters_array[0]);\n break;\n case \"capitalize\":\n resultParameters = getCapitalize(parameters_array[0]);\n break;\n case \"random\":\n resultParameters = getRandom(parameters_array[0]);\n break;\n case \"numberToWords\":\n resultParameters = getNumberToWords(\n parameters_array[0]\n );\n break;\n case \"getDateDayOfWeekName\":\n if (isBracketInBracket) {\n element = element + \")\";\n }\n resultParameters = getDateDayOfWeekName(\n AB,\n parameters_array[0]\n );\n break;\n case \"getDateMonthOfYearName\":\n if (isBracketInBracket) {\n element = element + \")\";\n }\n resultParameters = getDateMonthOfYearName(\n AB,\n parameters_array[0]\n );\n break;\n case \"formatDate\":\n resultParameters = getFormatDate(\n parameters_array[0],\n parameters_array[1].trimLeft()\n );\n break;\n default:\n break;\n }\n isMatch = true;\n formulaString = formulaString.replace(\n element,\n resultParameters\n );\n return;\n } else {\n resultParameters = functionName + \"(Bad Parameter)\";\n formulaString = formulaString.replace(\n element,\n resultParameters\n );\n }\n }\n }\n });\n }\n return formulaString;\n}\n\nfunction getBuildInFunction() {\n const functionList = [\n {\n id: \"left\",\n value: \"left({COLUMN_NAME}, 1)\",\n type: \"build-in\",\n parameter_size: 2,\n },\n {\n id: \"right\",\n value: \"right({COLUMN_NAME}, 1)\",\n type: \"build-in\",\n parameter_size: 2,\n },\n {\n id: \"mid\",\n value: \"mid({COLUMN_NAME}, 1, 1)\",\n type: \"build-in\",\n parameter_size: 3,\n },\n {\n id: \"trim\",\n value: \"trim({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"trimLeft\",\n value: \"trimLeft({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"trimRight\",\n value: \"trimRight({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"length\",\n value: \"length({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"regexReplace\",\n value: \"regexReplace({COLUMN_NAME}, [*], REPLACE_VALUE)\",\n type: \"build-in\",\n parameter_size: 3,\n },\n {\n id: \"extractRegex\",\n value: \"extractRegex({COLUMN_NAME}, [*])\",\n type: \"build-in\",\n parameter_size: 2,\n },\n {\n id: \"replace\",\n value: \"replace({COLUMN_NAME}, SEARCH_VALUE, REPLACE_VALUE)\",\n type: \"build-in\",\n parameter_size: 3,\n },\n {\n id: \"lower\",\n value: \"lower({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"upper\",\n value: \"upper({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"capitalize\",\n value: \"capitalize({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n { id: \"random\", value: \"random(1)\", type: \"build-in\", parameter_size: 1 },\n {\n id: \"numberToWords\",\n value: \"numberToWords({NUMBER_COLUMN} or 012...)\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"getDateDayOfWeekName\",\n value: \"getDateDayOfWeekName({DATE_COLUMN})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"getDateMonthOfYearName\",\n value: \"getDateMonthOfYearName({DATE_COLUMN})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"formatDate\",\n value: \"formatDate({DATE_COLUMN}, OUTPUT_FORMAT)\",\n type: \"build-in\",\n parameter_size: 2,\n },\n ];\n return functionList;\n}\n\nfunction getLeft(string, endPosition) {\n return string.substring(0, parseInt(endPosition));\n}\n\nfunction getRight(string, endposition) {\n const reverseStr = reverseString(string).substring(0, parseInt(endposition));\n return reverseString(reverseStr);\n}\n\nfunction reverseString(string) {\n return string.split(\" \").reverse().join(\" \");\n}\n\nfunction getMid(string, startPosition, length) {\n if (string.length < startPosition) return \"mid(Bad Parameter)\";\n return string.substring(\n parseInt(startPosition),\n parseInt(startPosition) + parseInt(length)\n );\n}\n\nfunction getTrim(string) {\n return string.trim();\n}\n\nfunction getTrimLeft(string) {\n return string.trimLeft();\n}\n\nfunction getTrimRight(string) {\n return string.trimRight();\n}\n\nfunction getLength(string) {\n return string.length;\n}\n\nfunction getRegExpReplace(string, regexp, replaceString) {\n return string.replace(regexp, replaceString);\n}\n\nfunction getExtractRegex(string, regexp) {\n const extractResult = string.match(regexp);\n if (Array.isArray(extractResult)) {\n return extractResult[0];\n }\n return extractResult;\n}\n\nfunction getReplace(string, searchValue, replaceValue) {\n return string.replace(searchValue, replaceValue);\n}\n\nfunction getLower(string) {\n return string.toLowerCase();\n}\n\nfunction getUpper(string) {\n return string.toUpperCase();\n}\n\nfunction getCapitalize(string) {\n return string\n .toLowerCase()\n .split(\" \")\n .map((s) => s.charAt(0).toUpperCase() + s.substring(1))\n .join(\" \");\n}\n\nfunction getRandom(max) {\n return Math.floor(Math.random() * (max + 1));\n}\n\nfunction getNumberToWords(number) {\n const string = number.trim(\",\").toString();\n\n let units,\n tens,\n scales,\n start,\n end,\n chunks,\n chunksLen,\n chunk,\n ints,\n i,\n word,\n words;\n\n const and = \"\";\n\n /* Is number zero? */\n if (parseInt(string) === 0) {\n return \"zero\";\n }\n\n /* Array of units as words */\n units = [\n \"\",\n \"one\",\n \"two\",\n \"three\",\n \"four\",\n \"five\",\n \"six\",\n \"seven\",\n \"eight\",\n \"nine\",\n \"ten\",\n \"eleven\",\n \"twelve\",\n \"thirteen\",\n \"fourteen\",\n \"fifteen\",\n \"sixteen\",\n \"seventeen\",\n \"eighteen\",\n \"nineteen\",\n ];\n\n /* Array of tens as words */\n tens = [\n \"\",\n \"\",\n \"twenty\",\n \"thirty\",\n \"forty\",\n \"fifty\",\n \"sixty\",\n \"seventy\",\n \"eighty\",\n \"ninety\",\n ];\n\n /* Array of scales as words */\n scales = [\n \"\",\n \"thousand\",\n \"million\",\n \"billion\",\n \"trillion\",\n \"quadrillion\",\n \"quintillion\",\n \"sextillion\",\n \"septillion\",\n \"octillion\",\n \"nonillion\",\n \"decillion\",\n \"undecillion\",\n \"duodecillion\",\n \"tredecillion\",\n \"quatttuor-decillion\",\n \"quindecillion\",\n \"sexdecillion\",\n \"septen-decillion\",\n \"octodecillion\",\n \"novemdecillion\",\n \"vigintillion\",\n \"centillion\",\n ];\n\n /* Split user arguemnt into 3 digit chunks from right to left */\n start = string.length;\n chunks = [];\n while (start > 0) {\n end = start;\n chunks.push(string.slice((start = Math.max(0, start - 3)), end));\n }\n\n /* Check if function has enough scale words to be able to stringify the user argument */\n chunksLen = chunks.length;\n if (chunksLen > scales.length) {\n return \"\";\n }\n\n /* Stringify each integer in each chunk */\n words = [];\n for (i = 0; i < chunksLen; i++) {\n chunk = parseInt(chunks[i]);\n\n if (chunk) {\n /* Split chunk into array of individual integers */\n ints = chunks[i].split(\"\").reverse().map(parseFloat);\n\n /* If tens integer is 1, i.e. 10, then add 10 to units integer */\n if (ints[1] === 1) {\n ints[0] += 10;\n }\n\n /* Add scale word if chunk is not zero and array item exists */\n if ((word = scales[i])) {\n words.push(word);\n }\n\n /* Add unit word if array item exists */\n if ((word = units[ints[0]])) {\n words.push(word);\n }\n\n /* Add tens word if array item exists */\n if ((word = tens[ints[1]])) {\n words.push(word);\n }\n\n /* Add 'and' string after units or tens integer if: */\n if (ints[0] || ints[1]) {\n /* Chunk has a hundreds integer or chunk is the first of multiple chunks */\n if (ints[2] || (!i && chunksLen)) {\n words.push(and);\n }\n }\n\n /* Add hundreds word if array item exists */\n if ((word = units[ints[2]])) {\n words.push(word + \" hundred\");\n }\n }\n }\n\n return words.reverse().join(\" \");\n}\n\nfunction getDateDayOfWeekName(AB, date) {\n // const localizeDT = moment(date);\n // localizeDT.locale(AD.lang.currentLanguage);\n // return localizeDT.format(\"dddd\");\n\n return AB.rules.toDateFormat(date, {\n format: \"dddd\",\n localeCode: AB.Account.language(),\n });\n}\n\nfunction getDateMonthOfYearName(AB, date) {\n // const localizeDT = moment(date);\n // localizeDT.locale(AD.lang.currentLanguage);\n // return localizeDT.format(\"MMMM\");\n\n return AB.rules.toDateFormat(date, {\n format: \"MMMM\",\n localeCode: AB.Account.language(),\n });\n}\n\nfunction getFormatDate(date, format) {\n const dt = new Date(date);\n return dt.toString(format);\n}\n\nmodule.exports = class ABFieldTextFormulaCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldTextFormulaDefaults);\n\n /*\n \t{\n\t\t\tsettings: {\n\t\t\t\ttextDefault: 'string',\n\t\t\t\tsupportMultilingual: true/false\n\t\t\t}\n \t}\n \t*/\n\n // // text to Int:\n // this.settings.supportMultilingual = parseInt(this.settings.supportMultilingual);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldTextFormulaDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n static getBuildInFunction() {\n return getBuildInFunction();\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // if no default value is set, then don't insert a value.\n if (!values[this.columnName]) {\n // Set default value\n // values[this.columnName] = this.settings.DEFAULT_VALUE;\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n validator = super.isValid();\n\n // validator.addError(this.columnName, L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n /*\n * @property isMultilingual\n * does this field represent multilingual data?\n * @return {bool}\n */\n get isMultilingual() {\n // return this.settings.supportMultilingual == 1;\n return false;\n }\n\n format(rowData) {\n try {\n if (!this.settings.textFormula) return \"\";\n\n let resultFormula = this.settings.textFormula;\n\n //Set Field value first\n resultFormula = setValueToFormula(this.object, resultFormula, rowData);\n\n //then Check Build-in Function\n resultFormula = setBuildinValueToFormula(this.AB, resultFormula);\n\n return resultFormula;\n } catch (err) {\n return \"\";\n }\n }\n};\n\n//// NOTE: if you need a unique [edit_type] by your returned config.editor above:\n// webix.editors = {\n// \"[edit_type]\": {\n// focus: function () {...}\n// getValue: function () {...},\n// setValue: function (value) {...},\n// render: function () {...}\n// }\n// };\n\n//// NOTE: if you need a unique [sort_type] by your returned config.sort above:\n// webix.DataStore.prototype.sorting.as.[sort_type] = function(a,b){\n// return a > b ? 1 : -1;\n// }\n","/*\n * ABFieldTreeCore\n *\n * An ABFieldTree defines a select list field type.\n *\n */\n\nconst ABFieldSelectivity = require(\"../../platform/dataFields/ABFieldSelectivity\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldTreeDefaults = {\n key: \"tree\",\n // unique key to reference this specific DataField\n\n description:\n \"Data tree allows you to build a hierarchical set of selectable data. (ex: Categories and sub-categories)\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"sitemap\",\n // font-awesome icon reference. (without the 'fa-'). so 'sitemap' to\n // reference 'fa-sitemap'\n\n isFilterable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Data Tree\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: false,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"text\", \"mediumtext\", \"longtext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n options: [],\n};\n\nmodule.exports = class ABFieldTreeCore extends ABFieldSelectivity {\n constructor(values, object) {\n super(values, object, ABFieldTreeDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldTreeDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // translate options list\n if (this.settings.options && this.settings.options.length > 0) {\n this.settings.options.forEach((opt) => {\n this.translate(opt, opt, [\"text\"]);\n });\n }\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n const obj = super.toObj();\n\n // Un-translate options list\n if (obj.settings.options && obj.settings.options.length > 0) {\n obj.settings.options.forEach((opt) => {\n this.unTranslate(opt, opt, [\"text\"]);\n });\n }\n\n return obj;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {}\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n }\n};\n","/*\n * ABFieldUser\n *\n * An ABFieldUser defines a user field type.\n *\n */\n\nconst ABFieldConnect = require(\"../../platform/dataFields/ABFieldConnect\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldUserDefaults = {\n key: \"user\",\n // unique key to reference this specific DataField\n\n description: \"Add users to a record.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"user-o\",\n // font-awesome icon reference. (without the 'fa-'). so 'user-o' to\n // reference 'fa-user-o'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: (field) => {\n if (field.settings.isMultiple) {\n return false;\n } else {\n return true;\n }\n },\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"User\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"char\", \"varchar\", \"tinytext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n\n USERNAME_FIELD_ID: \"5760560b-c078-47ca-98bf-e18ac492a561\",\n // {string} .uuid\n // the ABField.id of the SiteUser.username field. This is what other\n // objects will link to in their ABFieldUser connections.\n};\n\nconst defaultValues = {\n editable: 1,\n isMultiple: 0,\n isCurrentUser: 0,\n isShowProfileImage: 0,\n isShowUsername: 1,\n};\n\nmodule.exports = class ABFieldUserCore extends ABFieldConnect {\n constructor(values, object) {\n super(values, object, ABFieldUserDefaults);\n\n this.isUser = true;\n // {bool}\n // is this an ABFieldUser type of field.\n // this is a simplified helper to identify if an ABField is a type\n // of User field. Since this is the only place it is defined,\n // all other field types will be falsy\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldUserDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.editable = parseInt(this.settings.editable);\n this.settings.isMultiple = parseInt(this.settings.isMultiple);\n this.settings.isCurrentUser = parseInt(this.settings.isCurrentUser);\n this.settings.isShowProfileImage = parseInt(\n this.settings.isShowProfileImage\n );\n this.settings.isShowUsername = parseInt(this.settings.isShowUsername);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n format(rowData) {\n let val = this.dataValue(rowData) || [];\n\n if (val && !Array.isArray(val)) val = [val];\n if (!val) val = [];\n\n return val.map((v) => v.username || v).join(\", \");\n }\n};\n","/*\n * ABMobilePageCore\n *\n * An view that represents a \"Page\" on the Mobile Device.\n *\n * Pages are\n *\t- allowed to be displayed in the interface list\n *\t- return a full list of components that can be added to the view editor\n *\n *\n */\n\nconst ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n// var ABViewManager = require(\"../ABViewManager\");\n\n// function L(key, altText) {\n// return AD.lang.label.getLabel(key) || altText;\n// }\n\nconst ABMobilePageDefaults = {\n key: \"mobile-page\", // unique key identifier for this ABView\n icon: \"file\", // icon reference: (without 'fa-' )\n};\n\nconst ABPropertyComponentDefaults = {\n type: \"page\",\n // {string}\n // What type of \"Page\" this is: ['page', 'popup', 'reportPage']\n\n defaultPage: 0,\n // {bool} 1|0\n // is this the default page for the Mobile App? If so, this is the initial\n // Page that is displayed when the App is loaded.\n // NOTE: there can be only 1 page defined in the app as .defaultPage\n\n hideTitle: 0,\n // {bool} 1|0\n // By default we will display this.label as our Title. Set this to 1 to not\n // show the tile on the page.\n\n hideTabs: 0,\n // {bool} 1|0\n // By default, pages will show any Tab options on their display. Set this\n // to 1 to not show the tab options for this Page. (good for pages that\n // are linkedPages with forms )\n};\n\nmodule.exports = class ABMobilePageCore extends ABMobileView {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABMobilePageDefaults);\n\n // \t{\n // \t\tid:'uuid',\t\t\t\t\t// uuid value for this obj\n // \t\tkey:'viewKey',\t\t\t\t// unique key for this View Type\n // \t\ticon:'font',\t\t\t\t// fa-[icon] reference for an icon for this View Type\n\n //\t\tname: '',\t\t\t\t\t// unique page name\n\n // \t\tlabel:'',\t\t\t\t\t// pulled from translation\n\n //\t\tsettings: {\t\t\t\t\t// unique settings for the type of field\n //\t\t},\n\n //\t\ttranslations:[]\n // \t}\n\n this.parent = null; // will be set by the pageNew() that creates this obj.\n // {obj} .parent\n // this points to the ABView object that manages this object as a child.\n // this param is shared across ABViews as well as ABMobilePage, but has\n // different implications ... so we default an ABMobilePage.parent = null\n // and the place that Creates the Page must assign the .parent externally.\n }\n\n static common() {\n return ABMobilePageDefaults;\n }\n\n static defaultValues() {\n return ABPropertyComponentDefaults;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABMobilePage instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n var obj = super.toObj();\n\n obj.name = this.name;\n obj.route = this.route;\n\n obj.myAppID = this.myAppID;\n\n obj.menuType = this.menuType;\n\n obj.defaultPage = this.defaultPage;\n\n // icon of popup page\n if (this.settings.type == \"popup\") obj.icon = \"clone\";\n\n // set label of the page\n if (!this.label || this.label == \"?label?\") obj.label = obj.name;\n\n // compile our pages\n obj.pageIDs = (this._pages || []).map((p) => p.id);\n\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n const DV = ABPropertyComponentDefaults;\n\n this.route =\n values.route || (this.name || this.label).replaceAll(\" \", \"_\");\n\n // icon of popup page\n if (values.settings.type == \"popup\") this.icon = \"clone\";\n\n // set label of the page\n if (!this.label || this.label == \"?label?\") this.label = this.name;\n\n // track which application this Page belongs to:\n this.myAppID = values.myAppID;\n if (!this.myAppID && this.application) {\n this.myAppID = this.application.id;\n }\n\n this.menuType = values.menuType || \"menu\";\n // {string} [\"menu\", \"tab\"]\n // indicates if this Page was added as a Mobile App's \"menu\" or \"Tab\"\n\n this.defaultPage = values.defaultPage || 0;\n // {bool} 1|0\n // indicates if this is the default page that is loaded when the mobile app\n // is started.\n // NOTE: only 1 Page in a Mobile App can have this setting = 1.\n\n this.settings.hideTitle = parseInt(\n values.settings.hideTitle ?? DV.hideTitle\n );\n // {bool} 1|0\n // By default an ABMobilePage will display it's this.label for a title\n // on the page. Setting this to TRUE (1) will hide the title.\n\n this.settings.hideTabs = parseInt(\n values.settings.hideTabs ?? DV.hideTabs\n );\n // {bool} 1|0\n // By default, pages will show any Tab options on their display. Set this\n // to 1 to not show the tab options for this Page. (good for pages that\n // are linkedPages with forms )\n\n // now properly handle our sub pages.\n var pages = [];\n (values.pageIDs || []).forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (def) {\n pages.push(this.pageNew(def));\n } else {\n this.emit(\n \"warning\",\n `App[${this.application.name}][${this.application.id}]->Page[${this.name}][${this.id}] referenced an unknown Page[${id}]`,\n {\n appID: this.application.id,\n pageID: this.id,\n missingPageID: id,\n }\n );\n }\n });\n this._pages = pages;\n\n // the default columns of ABView is 1\n // this.settings.columns = this.settings.columns || 1;\n // this.settings.gravity = this.settings.gravity || [1];\n\n // convert from \"0\" => 0\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABApplication\n *\n * also remove it from our _AllApplications\n *\n * @return {Promise}\n */\n destroy() {\n return Promise.resolve()\n .then(() => {\n // When deleting an ABMobilePage\n // be sure to remove any of it's ABMobilePage as well\n // This cleans out any dangling ABDefinitions\n\n var allPageDeletes = [];\n var allPages = this.pages();\n this._pages = [];\n // doing ._pages = [] prevents any of my updates when\n // a sub-page is .destroy()ed\n\n allPages.forEach((p) => {\n allPageDeletes.push(p.destroy());\n });\n return Promise.all(allPageDeletes);\n })\n .then(() => {\n var parent = this.parent || this.application;\n\n return parent.pageRemove(this);\n })\n .then(() => {\n return super.destroy();\n });\n }\n\n /**\n * @method save()\n * persist this instance of ABMobilePage\n * @return {Promise}\n * .resolve( {this} )\n */\n save() {\n return Promise.resolve()\n .then(() => {\n // this creates our .id\n return super.save();\n })\n .then(() => {\n // now we can persist ourself in our parent\n var parent = this.parent || this.application;\n\n return parent.pageInsert(this);\n })\n .then(() => {\n // make sure .defaultPage is properly set\n if (this.defaultPage) {\n return this.application.setPageDefault(this);\n }\n })\n .then(() => {\n return this;\n });\n }\n\n /**\n * @method refreshInstance()\n * This returns a NEW instance of a ABMobilePage based upon the latest\n * version of it's Definition. It also resolves any current listeners\n * this copy currently has and prepare this to discard itself.\n */\n refreshInstance() {\n console.warn(\n \"This version of ABMobilePage hasn't updated it's refreshInstance()\",\n this\n );\n return this;\n }\n\n ///\n /// Pages\n ///\n\n /**\n * @method pages()\n *\n * return an array of all the ABMobilePages for this ABMobilePage.\n *\n * @param {fn} filter\t\ta filter fn to return a set of ABMobilePages that this fn\n *\t\t\t\t\t\t\treturns true for.\n * @param {boolean} deep\tflag to find in sub pages\n *\n * @return {array}\t\t\tarray of ABMobilePages\n */\n pages(filter = () => true, deep = false) {\n var result = [];\n\n // find into sub-pages recursively\n if (filter && deep) {\n // if (this._pages && this._pages.length > 0) {\n // result = this._pages.filter(filter);\n\n // if (result.length < 1) {\n // this._pages.forEach((p) => {\n // var subPages = p.pages(filter, deep);\n // if (subPages && subPages.length > 0) {\n // result = subPages;\n // }\n // });\n // }\n // }\n result = this.application._searchDeep(this, \"_pages\", filter);\n }\n // find root pages\n else {\n result = this._pages.filter(filter);\n }\n\n return result;\n }\n\n /**\n * @method pageInsert()\n *\n * save the given ABMobilePage in our ._pages array and persist the current\n * values if they changed.\n *\n * @param {ABMobilePage} page The instance of the page to save.\n * @return {Promise}\n */\n pageInsert(page) {\n var isIncluded = this.pages((o) => o.id === page.id).length > 0;\n if (!isIncluded) {\n // if not already included, then add and save the Obj definition:\n this._pages.push(page);\n return this.save();\n }\n\n // Nothing was required so return\n return Promise.resolve();\n }\n\n /**\n * @method pageNew()\n *\n * return an instance of a new (unsaved) ABMobilePage that is tied to this\n * ABMobilePage.\n *\n * NOTE: this new page is not included in our this.pages until a .save()\n * is performed on the page.\n *\n * @return {ABMobilePage}\n */\n pageNew(values) {\n // make sure this is an ABMobilePage description\n values.key = ABMobilePageDefaults.key;\n\n // NOTE: this returns a new ABView component.\n // when creating a new page, the 3rd param should be null, to signify\n // the top level component.\n var page = this.application.viewNew(values, this.application, null);\n page.parent = this;\n return page;\n }\n\n /**\n * @method pageRemove()\n *\n * remove the given ABMobilePage from our ._pages array and persist the current\n * values.\n *\n * @param {ABMobilePage} page The instance of the page to remove.\n * @return {Promise}\n */\n pageRemove(page) {\n var origLen = this._pages.length;\n this._pages = this.pages((p) => p.id != page.id);\n\n if (this._pages.length < origLen) {\n return this.save();\n }\n\n // if we get here, then nothing changed so nothing to do.\n return Promise.resolve();\n }\n\n updateIcon(obj) {\n // icon of page\n if (obj.settings.type == \"popup\") {\n obj.icon = \"clone\";\n } else {\n obj.icon = ABMobilePageDefaults.icon;\n }\n return obj;\n }\n\n /**\n * @method clone()\n * clone the defintions of this ABMobilePage object.\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @return {obj}\n * defs of the copied ABView\n */\n clone(lookUpIds, parent) {\n // initial new ids of pages and components\n if (lookUpIds == null) {\n // create a hash of { oldID : newID } of any sub Pages and Views.\n lookUpIds = {};\n\n let mapNewIdFn = (currView) => {\n if (!lookUpIds[currView.id])\n lookUpIds[currView.id] = this.AB.uuid();\n\n if (currView.pages) {\n currView.pages().forEach((p) => mapNewIdFn(p));\n }\n\n if (currView.views) {\n currView.views().forEach((v) => mapNewIdFn(v));\n }\n };\n\n // start map new ids\n mapNewIdFn(this);\n }\n\n // copy\n let result = super.clone(lookUpIds, parent);\n\n // page's name should not be duplicate\n result.name = null;\n\n return result;\n }\n\n /**\n * @method copy()\n * create a new copy of this ABMobilePage object. The resulting ABView should\n * be identical in settings and all sub pages/views, but each new object\n * is a unique view (different ids).\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @return {Promise}\n * .resolved with the instance of the copied ABView\n */\n copy(lookUpIds, parent, options) {\n // initial new ids of pages and components\n if (lookUpIds == null) {\n // create a hash of { oldID : newID } of any sub Pages and Views.\n lookUpIds = {};\n\n let mapNewIdFn = (currView) => {\n if (!lookUpIds[currView.id])\n lookUpIds[currView.id] = this.AB.uuid();\n\n if (currView.pages) {\n currView.pages().forEach((p) => mapNewIdFn(p));\n }\n\n if (currView.views) {\n currView.views().forEach((v) => mapNewIdFn(v));\n }\n };\n\n // start map new ids\n mapNewIdFn(this);\n }\n\n // now continue with the default .copy()\n return super.copy(lookUpIds, parent, options);\n }\n};\n","/*\n * ABViewCore\n *\n * ABViewCore defines the common ABView structure that is shared between\n * the client and the server. Mostly how it manages it's internal data, and\n * how it is related to the ABView classes.\n *\n */\n\nvar ABMLClass = require(\"../../platform/ABMLClass\");\n\nconst ABMobileViewDefaults = {\n key: \"mobile-view\", // {string} unique key for this view\n icon: \"window-maximize\", // {string} fa-[icon] reference for this view\n labelKey: \"view\", // {string} the multilingual label key for the class label\n tabicon: \"\", // no default tab icons\n};\n\nconst ABViewPropertyComponentDefaults = {\n label: \"\",\n};\n\nmodule.exports = class ABMobileViewCore extends ABMLClass {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super([\"label\"], application.AB);\n\n this.__events = [];\n // keep track of any event listeners attached to this ABView object\n\n this.defaults = defaultValues || ABMobileViewDefaults;\n\n this.application = application;\n\n this.parent = parent || null;\n\n this.warningsSilent = false;\n // {bool}\n // Should we suppress our configuration warnings?\n\n this.__missingViews = [];\n // {array}\n // Any ABView.id we have stored that we can't find.\n\n this.fromValues(values);\n }\n\n static common() {\n return ABMobileViewDefaults;\n }\n\n static defaultValues() {\n return ABViewPropertyComponentDefaults;\n }\n\n /**\n * @method newInstance()\n * return a new instance of this ABView. Most likely called from interfaces\n * that create new UI elements like the ABDesigner.\n * @param {ABApplication} application \t: the root ABApplication this view is under\n * @param {ABView/ABApplication} parent\t: the parent object of this ABView.\n * @return {ABView}\n */\n static newInstance(application, parent) {\n // return a new instance from ABViewManager:\n return application.viewNew(\n { key: this.common().key },\n application,\n parent\n );\n }\n\n viewKey() {\n return this.defaults.key;\n }\n\n viewIcon() {\n return this.defaults.icon;\n }\n\n tabIcon() {\n return this.defaults.tabicon;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABView instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n // MLClass translation\n var obj = super.toObj();\n\n var result = {\n id: this.id,\n type: this.type || this.viewKey(),\n key: this.key,\n icon: this.icon,\n tabicon: this.tabicon,\n name: this.name,\n settings: this.AB.cloneDeep(this.settings || {}),\n // accessLevels: this.accessLevels,\n translations: obj.translations,\n };\n\n // encode our child view references\n result.viewIDs = (this._views || []).map((v) => v.id).filter((id) => id);\n result.viewIDs = result.viewIDs.concat(this.__missingViews);\n\n if (this.position) result.position = this.position;\n\n // encode our .isRoot() reference.\n // (NOTE: this is set so our server side code can distinguish) between a .view\n // and a root page:\n // NOTE: we intentionally do NOT pull this out in .fromValues()\n result.isRoot = this.isRoot();\n\n return result;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n this.id = values.id; // NOTE: only exists after .save()\n // {string} .id\n // the uuid of this ABObject Definition.\n\n this.type = values.type || this.viewKey();\n // {string} .type\n // the type of ABDefinition this is.\n\n this.key = values.key || this.viewKey();\n // {string} .key\n // the unique lookup key for our ABViewManager to create new\n // instances of this object.\n\n this.icon = values.icon || this.viewIcon();\n // {string} .icon\n // the font awesome icon reference for showing an icon for this\n // view in the AppBuilder interface builder.\n\n this.tabicon = values.tabicon || this.tabIcon();\n\n this.name = values.name;\n // {string} .name\n // A name reference for this ABView. This is a reference that isn't\n // translateable and will be used for lookups across languages.\n\n // if this is being instantiated on a read from the Property UI,\n // .label is coming in under .settings.label\n values.settings = values.settings || {};\n this.label = values.label || values.settings.label || \"?label?\";\n\n this.settings = values.settings || {};\n // {obj} .settings\n // the property settings for this ABView\n\n // make sure .settings.height is an int and not a string\n this.settings.height = parseInt(this.settings.height || 0);\n\n // this.accessLevels = values.accessLevels || {};\n // {obj} .accessLevels\n // Hash: { ABRole.id : accessLevel }\n // tracks the Role -> AccessLevel settings of this particular\n // view.\n // accessLevel: 0 : no access, 1 : view only, 2: full access\n\n // let the MLClass now process the translations:\n super.fromValues(values);\n\n // If the View / DataCollection does not have a .name already,\n // use the English label translation as the .name instead.\n if (!this.name && Array.isArray(this.translations)) {\n for (var i = 0; i < this.translations.length; i++) {\n if (i == 0) {\n // Use the first label found, in case there is no 'en'\n this.name = this.translations[i].label;\n }\n if (this.translations[i].language_code == \"en\") {\n // But the 'en' label will have final priority\n this.name = this.translations[i].label;\n break;\n }\n }\n }\n\n // default value for our label\n if (this.label == \"?label?\") {\n if (this.parent) {\n this.label =\n this.parent.label +\n \".\" +\n (this.field?.()?.columnName ?? this.defaults.key);\n }\n }\n\n var views = [];\n this.__missingViews = this.__missingViews || [];\n (values.viewIDs || []).forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (def) {\n views.push(this.application.viewNew(def, this.application, this));\n } else {\n this.__missingViews.push(id);\n }\n });\n this._views = views;\n\n this.position = values.position || {};\n\n if (this.position.x != null) this.position.x = parseInt(this.position.x);\n if (this.position.y != null) this.position.y = parseInt(this.position.y);\n\n this.position.dx = parseInt(this.position.dx || 1);\n this.position.dy = parseInt(this.position.dy || 1);\n }\n\n isRoot() {\n return this.parent == null || this.parent == this.application;\n }\n\n /**\n * @method allParents()\n * return a flattened array of all the ABViews parents\n * @return {array} array of ABViews\n */\n allParents() {\n var parents = [];\n var curView = this;\n\n // add current view to array\n parents.unshift(curView);\n\n while (!curView.isRoot() && curView.parent) {\n parents.unshift(curView.parent);\n\n curView = curView.parent;\n }\n\n return parents;\n }\n\n /**\n * @method isAccessibleForRoles()\n * return true/false if this ABViewPage is accessible for one of the\n * passed in ABRoles.\n * @param {array[ABRole]} roles\n * an array of {ABRole} instances.\n * @return {bool}\n */\n // isAccessibleForRoles(roles) {\n // var foundRole = false;\n\n // var accessibleRoles = Object.keys(this.accessLevels) || [];\n // (roles || []).forEach((r) => {\n // if (accessibleRoles.indexOf(r.uuid || r) > -1) {\n // foundRole = true;\n // }\n // });\n\n // return foundRole;\n // }\n\n /**\n * @method getUserAccess()\n *\n * return the access level of the current user on the current view\n *\n * @return {integer} // 0 = No Access // 1 = Read Only // 2 = Full Access\n */\n // getUserAccess() {\n // // by default everyone has no access\n // var accessLevel = 0;\n\n // if (this.application.isAccessManaged) {\n // // check to see if the current users is the access manager\n // var isAccessManager = false;\n // // first check if manager is defined by their role\n // if (parseInt(this.application.accessManagers.useRole) == 1) {\n // // if so check if any of the user's role match the managers\n // this.AB.Account.roles().forEach((role) => {\n // if (\n // this.application.accessManagers.role.indexOf(\n // role.id || role.uuid\n // ) > -1\n // ) {\n // // if so set the access level to full access\n // isAccessManager = true;\n // accessLevel = 2;\n // }\n // });\n // }\n // // if the user isn't already set as the manager and the manager is defined by their account\n // if (\n // !isAccessManager &&\n // parseInt(this.application.accessManagers.useAccount) == 1\n // ) {\n // // check if the user's account matches the managers\n // if (\n // this.application.accessManagers.account.indexOf(\n // this.AB.Account.uuid() + \"\"\n // ) > -1\n // ) {\n // // if so set the access level to full access\n // isAccessManager = true;\n // accessLevel = 2;\n // }\n // }\n\n // // if the user is not the manager check if the page has access levels defined for roles\n // if (\n // this.accessLevels &&\n // Object.keys(this.accessLevels).length > 0 &&\n // !isAccessManager\n // ) {\n // // check to see if the user's roles matches one of the roles defined\n // this.AB.Account.roles().forEach((role) => {\n // var currentRole = this.accessLevels[role.id || role.uuid];\n // if (currentRole && parseInt(currentRole) > accessLevel)\n // // if the access level is higher than a previous role set to the new level\n // accessLevel = parseInt(currentRole);\n // });\n // }\n // } else {\n // accessLevel = 2;\n // }\n\n // return accessLevel;\n // }\n\n /**\n * @method parentFormComponent\n * return the closest form object this component is on.\n */\n parentFormComponent() {\n var form = null;\n\n var curr = this;\n while (curr.key != \"mobile-form\" && !curr.isRoot() && curr.parent) {\n curr = curr.parent;\n }\n\n if (curr.key == \"mobile-form\") {\n form = curr;\n }\n\n return form;\n }\n\n /**\n * @method parentDetailComponent\n * return the closest detail object that this component is on.\n * @returns {ABViewDetail} detail component\n */\n parentDetailComponent() {\n var detail = null;\n\n var curr = this;\n while (curr.key != \"mobile-detail\" && !curr.isRoot() && curr.parent) {\n curr = curr.parent;\n }\n\n if (curr.key == \"mobile-detail\") {\n detail = curr;\n }\n\n return detail;\n }\n\n pageParent(filterFn) {\n if (filterFn == null) filterFn = () => true;\n\n // if current page is the root page, then return itself.\n if (this.isRoot()) {\n return this;\n }\n\n var parentPage = this.parent;\n while (\n parentPage &&\n (parentPage.key != \"mobile-page\" || !filterFn(parentPage))\n ) {\n parentPage = parentPage.parent;\n }\n\n return parentPage;\n }\n\n pageRoot() {\n var rootPage = this.pageParent();\n\n while (!rootPage.isRoot()) {\n rootPage = rootPage.pageParent();\n }\n\n return rootPage;\n }\n\n /**\n * @property datacollection\n * return data source\n *\n * @return {ABDataCollection}\n */\n get datacollection() {\n let dataviewID = (this.settings || {}).dataviewID;\n if (!dataviewID) {\n if (\n [\n \"mobile-form\",\n \"grid\",\n \"line\",\n \"area\",\n \"bar\",\n \"gantt\",\n \"kanban\",\n ].indexOf(this.key) > -1\n ) {\n // NOTE: ignore kanban side forms where this is the case:\n if (this.key == \"mobile-form\" && this._currentObject) return null;\n\n if (this.warningsSilent) return null;\n\n var errNoDCID = new Error(\n `ABViewCore:get datacollection(): View[${this.key}] didn't define a dataviewID.`\n );\n this.AB.notify.builder(errNoDCID, {\n view: this,\n settings: this.settings,\n });\n } else {\n // These views shouldn't matter if they don't have a datacollection.\n if (\n [\n \"button\",\n \"label\",\n \"mobile-page\",\n \"tab\",\n \"viewcontainer\",\n ].indexOf(this.key) == -1\n ) {\n console.warn(\n `TODO: figure out which ABView* require a .dataviewID: ${this.key}?`\n );\n }\n }\n return null;\n }\n\n var dc = this.AB.datacollectionByID(dataviewID);\n if (!dc) {\n var errNoDC = new Error(\n `MobileView[${this.label}][${this.id}] is unable to find associated DataCollection`\n );\n this.AB.notify.builder(errNoDC, {\n view: this,\n dataviewID,\n });\n }\n return dc;\n }\n\n ///\n /// Update Access accessLevels\n ///\n\n /**\n * @method updateAccessLevels()\n *\n *\n * @param {string} roleId\n *\n * @param {string} accessLevel\n *\n * @return {Promise}\n *\n */\n // updateAccessLevels(roleId, accessLevel) {\n // if (parseInt(accessLevel) == 0) {\n // if (this.accessLevels[roleId]) delete this.accessLevels[roleId];\n // } else {\n // this.accessLevels[roleId] = accessLevel;\n // }\n\n // return this.save(false, false);\n // }\n\n ///\n /// Views\n ///\n\n /**\n * @method views()\n *\n * return an array of all the ABViews children\n *\n * @param {fn} filter \ta filter fn to return a set of ABViews that this fn\n *\t\t\t\t\t\treturns true for.\n * @param {boolean} deep\n *\n * @return {array} \tarray of ABViews\n */\n views(filter = () => true, deep = false) {\n var result = [];\n\n if (!this._views || this._views.length < 1) return result;\n\n // find into recursively\n if (filter && deep) {\n // result = result.concat(this._views.filter(filter));\n\n // this._views.forEach((v) => {\n // var subViews = v.views(filter, deep);\n // if (subViews && subViews.length > 0) {\n // result = result.concat(subViews);\n // }\n // });\n result = this.application._searchDeep(this, \"_views\", filter);\n } else {\n result = this._views.filter(filter);\n }\n\n return result;\n }\n\n /**\n * @method viewByID()\n *\n * return the specific View referenced by the given ID.\n *\n * @param {uuid} ID\n * the {ABMobileView}.id of the child view we are requesting\n *\n * @return {ABMobileView || undefined}\n */\n viewByID(ID) {\n return this.views((v) => v.id == ID, true)[0];\n }\n\n /**\n * @method viewNew()\n * @return {ABView}\n */\n viewNew(values, application, parent) {\n return this.application.viewNew(\n values,\n application || this.application,\n parent || this\n );\n }\n\n /**\n * @method viewDestroy()\n *\n * remove the current ABView from our list of ._views.\n *\n * @param {ABView} view\n * @return {Promise}\n */\n // viewDestroy(view) {\n // console.error(\"DEPRECIATED: where is this called?\");\n // return this.viewRemove(view);\n // }\n\n /**\n * @method viewRemove()\n *\n * remove the current ABView from our list of ._views.\n *\n * @param {ABView} view\n * @return {Promise}\n */\n viewRemove(view) {\n var origLen = this._views.length;\n this._views = this.views(function (v) {\n return v.id != view.id;\n });\n\n if (this._views.length < origLen) {\n return this.save();\n }\n\n return Promise.resolve();\n }\n\n /**\n * @method viewInsert()\n *\n * persist the current ABView in our list of ._views.\n *\n * @param {ABView} object\n * @return {Promise}\n */\n viewInsert(view) {\n var isIncluded =\n this.views(function (v) {\n return v.id == view.id;\n }).length > 0;\n if (!isIncluded) {\n this._views.push(view);\n return this.save();\n }\n\n return Promise.resolve();\n }\n\n /**\n * @method viewReorder()\n *\n * reorder the current ABView in our list of ._views.\n *\n * @param {string} viewId - id of the active view\n * @param {string} toPosition - 'to' postion\n * @return {Promise}\n */\n viewReorder(viewId, toPosition) {\n var from = this._views.findIndex((v) => v.id == viewId);\n if (from < 0) return;\n\n // move drag item to 'to' position\n this._views.splice(toPosition, 0, this._views.splice(from, 1)[0]);\n\n // save to database\n return this.save(true);\n }\n\n /// ABApplication data methods\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABApplication\n *\n * also remove it from our _AllApplications\n *\n * @return {Promise}\n */\n destroy() {\n // unsubscribe events\n this.eventClear(true);\n\n return Promise.resolve()\n .then(() => {\n // When deleting an ABView\n // be sure to remove any of it's ABViews as well\n // This cleans out any dangling ABDefinitions\n\n var allViewDeletes = [];\n var allViews = this.views();\n this._views = [];\n // doing ._views = [] prevents any of my updates when\n // a sub-view is .destroy()ed\n\n allViews.forEach((v) => {\n allViewDeletes.push(v.destroy());\n });\n return Promise.all(allViewDeletes);\n })\n .then(() => {\n // NOTE: this should not happen on ABViewPage objects\n if (this.parent && !this.pages) {\n return this.parent.viewRemove(this);\n }\n })\n .then(() => {\n return super.destroy();\n })\n .then(() => {\n this.emit(\"destroyed\");\n });\n }\n\n /**\n * @method save()\n * persist this instance of ABView\n * @return {Promise}\n *\t\t.resolve( {this} )\n */\n save() {\n return Promise.resolve()\n .then(() => {\n // this creates our .id\n return super.save();\n })\n .then(() => {\n // NOTE: this should not happen on ABViewPage objects:\n if (this.parent && !this.pages) {\n // if we have a .parent, make sure we are included in our .parent's\n // viewIDs\n return this.parent.viewInsert(this);\n }\n })\n .then(() => {\n return this;\n });\n }\n\n /**\n * @method wantsAdd()\n * Some widgets can indicate to their containing ABMobilePage that\n * it wants to provide an [Add] feature.\n * @return {bool}\n */\n get wantsAdd() {\n // the default widget doesn't.\n // only those that actually do, should override this.\n return false;\n }\n\n ///\n /// Events\n ///\n\n /**\n * @method eventAdd()\n *\n *\n *\n * @param {object} evt - {\n * \t\t\t\t\t\t\temitter: object,\n * \t\t\t\t\t\t\teventName: string,\n * \t\t\t\t\t\t\tlistener: function\n * \t\t\t\t\t\t}\n */\n eventAdd(evt) {\n if (!evt || !evt.emitter || !evt.listener) return;\n\n var exists = this.__events.find((e) => {\n return e.emitter == evt.emitter && e.eventName == evt.eventName;\n // && e.listener == evt.listener;\n });\n\n if (!exists || exists.length < 1) {\n // add to array\n this.__events.push({\n emitter: evt.emitter,\n eventName: evt.eventName,\n listener: evt.listener,\n });\n\n // listening this event\n evt.emitter.on(evt.eventName, evt.listener);\n }\n }\n\n /**\n * @method eventClear()\n * unsubscribe all events.\n * should do it before destroy a component\n *\n * @param {bool} deep - clear events of child views\n */\n eventClear(deep) {\n if (deep) {\n this.views().forEach((v) => {\n v.eventClear(deep);\n });\n }\n\n if (this.__events && this.__events.length > 0) {\n this.__events.forEach((e) => {\n e.emitter.removeListener(e.eventName, e.listener);\n });\n }\n }\n\n /**\n * @method clone()\n * clone the definitions of this ABView object.\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @param {obj} options\n * option settings for the copy command.\n * options.ignoreSubPages {bool}\n * set to true to skip copying any sub pages of this ABView.\n * @return {obj}\n * obj defs of this ABView\n */\n clone(lookUpIds, parent, options = {}) {\n lookUpIds = lookUpIds || {};\n\n // get settings of the target\n let config = this.toObj();\n\n // remove sub-elements property\n [\"pages\", \"views\"].forEach((prop) => {\n delete config[prop];\n });\n\n // update id of linked components\n if (this.copyUpdateProperyList) {\n (this.copyUpdateProperyList() || []).forEach((prop) => {\n if (config && config.settings)\n config.settings[prop] = lookUpIds[config.settings[prop]];\n });\n }\n\n // copy from settings\n let result = this.viewNew(config, this.application, parent);\n\n // change id\n if (parent == null) {\n // the page is getting cloned to root: there is no parent, as parent is the application\n result.id = null;\n } else {\n result.id = lookUpIds[result.id] || this.AB.uuid();\n }\n\n // copy sub pages\n if (this.pages && !options.ignoreSubPages) {\n result._pages = [];\n this.pages().forEach((p) => {\n let copiedSubPage = p.clone(lookUpIds, result, options);\n copiedSubPage.parent = result;\n\n result._pages.push(copiedSubPage);\n });\n }\n\n // copy sub views\n if (this.views && !options.ignoreSubViews) {\n result._views = [];\n this.views().forEach((v) => {\n let copiedView = v.clone(lookUpIds, result, options);\n\n result._views.push(copiedView);\n });\n }\n\n return result;\n }\n\n /**\n * @method copy()\n * create a new copy of this ABView object. The resulting ABView should\n * be identical in settings and all sub pages/views, but each new object\n * is a unique view (different ids).\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @param {obj} options\n * option settings for the copy command.\n * options.ignoreSubPages {bool}\n * set to true to skip copying any sub pages of this ABView.\n * options.newName {string}\n * new user determined name for page\n * @return {Promise}\n * .resolved with the instance of the copied ABView\n */\n copy(lookUpIds, parent, options = {}) {\n lookUpIds = lookUpIds || {};\n\n // get settings of the target\n let config = this.toObj();\n\n // remove sub-elements property\n [\"pageIDs\", \"viewIDs\"].forEach((prop) => {\n delete config[prop];\n });\n\n // update id of linked components\n if (this.copyUpdateProperyList) {\n (this.copyUpdateProperyList() || []).forEach((prop) => {\n if (config && config.settings)\n config.settings[prop] = lookUpIds[config.settings[prop]];\n });\n }\n\n // copy from settings\n let result = this.application.viewNew(config, this.application, parent);\n\n // keep the parent\n result.parent = parent || this.parent;\n\n // change id\n if (parent == null) {\n // the page is getting cloned to root: there is no parent, as parent is the application.\n // pages with null parent ids default to getting put on root\n result.id = null;\n } else {\n result.id = lookUpIds[result.id] || this.AB.uuid();\n }\n\n // page's name should not be duplicate\n if (this.key == \"mobile-page\") {\n result.name =\n options?.newName ||\n `${result.name}_copied_${this.AB.uuid().slice(0, 3)}`;\n\n result.label = options?.newName || `${result.label} (copied)`;\n }\n\n return Promise.resolve()\n .then(() => {\n // copy sub pages\n var allSaves = [];\n\n if (this._pages && !options.ignoreSubPages) {\n result._pages = [];\n this.pages().forEach((p) => {\n // this prevents result.save() from happening on each of these\n // p.copy():\n if (p.isRoot())\n this.application._pages.push({ id: lookUpIds[p.id] });\n\n allSaves.push(\n p\n .copy(lookUpIds, result, options)\n .then((copiedSubPage) => {\n copiedSubPage.parent = result;\n // remove the temp {id:} entry above:\n this.application._pages =\n this.application._pages.filter(\n (p2) => p2.id != lookUpIds[p.id]\n );\n\n // now add the full copiedSubPage:\n result._pages.push(copiedSubPage);\n })\n );\n });\n }\n\n return Promise.all(allSaves);\n })\n .then(() => {\n // copy sub views\n var allSaves = [];\n\n if (this._views && !options.ignoreSubViews) {\n result._views = [];\n this.views().forEach((v) => {\n allSaves.push(\n // send a null for parent, so that the .save() wont trigger\n // a save of the parent.\n v.copy(lookUpIds, result, options).then((copiedView) => {\n // now patch up the parent connection:\n // copiedView.parent = result;\n if (\n result._views.filter((vi) => vi.id == copiedView.id)\n .length < 1\n ) {\n result._views.push(copiedView);\n }\n })\n );\n });\n }\n\n return Promise.all(allSaves);\n })\n .then(() => {\n // now we do 1 save for all the views\n return result.save();\n })\n .then(() => {\n return result;\n });\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABViewCustomPropertyComponentDefaults = {\n dataviewID: null,\n field: null,\n height: 0,\n hideTitle: 0,\n hideTabs: 0,\n};\n\nconst ABViewDefaults = {\n key: \"mobile-custom\", // {string} unique key for this view\n icon: \"palette\", // {string} fa-[icon] reference for this view\n labelKey: \"Custom\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewCustomCore extends ABMobileView {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewCustomPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n // field() {\n // var dv = this.datacollection;\n // if (!dv) return null;\n\n // var object = dv.datasource;\n // if (!object) return null;\n\n // return object.fieldByID(this.settings.field);\n // }\n\n /**\n * @method wantsAdd()\n * Some widgets can indicate to their containing ABMobilePage that\n * it wants to provide an [Add] feature.\n * @return {bool}\n */\n get wantsAdd() {\n // we do if we have a setting for linkPageAdd\n return this.settings.wantsAdd ?? false;\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABViewFormButtonPropertyComponentDefaults = {\n includeSave: true,\n saveLabel: \"\",\n includeCancel: false,\n cancelLabel: \"\",\n includeReset: false,\n resetLabel: \"\",\n afterCancel: null,\n alignment: \"right\",\n isDefault: false, // mark default button of form widget\n};\n\nconst ABViewFormButtonDefaults = {\n key: \"mobile-button\",\n // {string} unique key for this view\n\n icon: \"square\",\n // {string} fa-[icon] reference for this view\n\n labelKey: \"button\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormButtonCore extends ABMobileView {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormButtonDefaults\n );\n }\n\n static common() {\n return ABViewFormButtonDefaults;\n }\n\n static defaultValues() {\n return ABViewFormButtonPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n toObj() {\n // labels are multilingual values:\n let labels = [];\n\n if (this.settings.saveLabel) labels.push(\"saveLabel\");\n\n if (this.settings.cancelLabel) labels.push(\"cancelLabel\");\n\n if (this.settings.resetLabel) labels.push(\"resetLabel\");\n\n this.unTranslate(this.settings, this.settings, labels);\n\n let result = super.toObj();\n\n return result;\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n return null;\n }\n\n fromValues(values) {\n super.fromValues(values);\n\n // labels are multilingual values:\n let labels = [];\n\n if (this.settings.saveLabel) labels.push(\"saveLabel\");\n\n if (this.settings.cancelLabel) labels.push(\"cancelLabel\");\n\n if (this.settings.resetLabel) labels.push(\"resetLabel\");\n\n this.unTranslate(this.settings, this.settings, labels);\n\n Object.keys(ABViewFormButtonPropertyComponentDefaults).forEach((k) => {\n let val =\n this.settings[k] ?? ABViewFormButtonPropertyComponentDefaults[k];\n try {\n val = JSON.parse(val);\n } catch (e) {\n // just ignore the error and save val\n }\n this.settings[k] = val;\n });\n\n // this.settings.includeSave = JSON.parse(\n // this.settings.includeSave ||\n // ABViewFormButtonPropertyComponentDefaults.includeSave\n // );\n // this.settings.includeCancel = JSON.parse(\n // this.settings.includeCancel ||\n // ABViewFormButtonPropertyComponentDefaults.includeCancel\n // );\n // this.settings.includeReset = JSON.parse(\n // this.settings.includeReset ||\n // ABViewFormButtonPropertyComponentDefaults.includeReset\n // );\n\n // this.settings.isDefault = JSON.parse(\n // this.settings.isDefault ||\n // ABViewFormButtonPropertyComponentDefaults.isDefault\n // );\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormCheckboxPropertyComponentDefaults = {};\n\nconst ABMobileViewFormCheckboxDefaults = {\n key: \"mobile-checkbox\", // {string} unique key for this view\n icon: \"check-square-o\", // {string} fa-[icon] reference for this view\n labelKey: \"checkbox\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormCheckboxCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormCheckboxDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormCheckboxDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormCheckboxPropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormConnectPropertyComponentDefaults = {\n formView: \"\", // id of form to add new data\n filterConditions: {\n glue: \"and\",\n rules: [],\n },\n sortFields: [],\n popupWidth: 700,\n popupHeight: 450,\n};\n\nconst ABMobileViewFormConnectDefaults = {\n key: \"mobile-connect\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"Connect\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormConnectCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormConnectDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormConnectDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormConnectPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.filterConditions =\n this.settings.filterConditions ||\n ABMobileViewFormConnectPropertyComponentDefaults.filterConditions;\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABRecordRule = require(\"../../rules/ABViewRuleListFormRecordRules\");\nconst ABSubmitRule = require(\"../../rules/ABViewRuleListFormSubmitRules\");\n\nconst ABViewFormDefaults = {\n key: \"mobile-form\", // unique key identifier for this ABMobileViewForm\n icon: \"list-alt\", // icon reference: (without 'fa-' )\n labelKey: \"Form\", // {string} the multilingual label key for the class label\n};\n\nconst ABViewFormPropertyComponentDefaults = {\n dataviewID: null,\n showLabel: true,\n labelPosition: \"left\",\n labelWidth: 120,\n height: 200,\n clearOnLoad: false,\n clearOnSave: false,\n displayRules: [],\n editForm: \"none\", // The url pointer of ABViewForm\n\n //\t[{\n //\t\taction: {string},\n //\t\twhen: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tcomparer: {string},\n //\t\t\t\tvalue: {string}\n //\t\t\t}\n //\t\t],\n //\t\tvalues: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tvalue: {object}\n //\t\t\t}\n //\t\t]\n //\t}]\n recordRules: [],\n\n //\t[{\n //\t\taction: {string},\n //\t\twhen: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tcomparer: {string},\n //\t\t\t\tvalue: {string}\n //\t\t\t}\n //\t\t],\n //\t\tvalue: {string}\n //\t}]\n submitRules: [],\n};\n\nmodule.exports = class ABMobileViewFormCore extends ABMobileView {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewFormDefaults);\n }\n\n static common() {\n return ABViewFormDefaults;\n }\n\n static defaultValues() {\n return ABViewFormPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.labelPosition =\n this.settings.labelPosition ||\n ABViewFormPropertyComponentDefaults.labelPosition;\n\n // convert from \"0\" => true/false\n this.settings.showLabel = JSON.parse(\n this.settings.showLabel != null\n ? this.settings.showLabel\n : ABViewFormPropertyComponentDefaults.showLabel\n );\n this.settings.clearOnLoad = JSON.parse(\n this.settings.clearOnLoad != null\n ? this.settings.clearOnLoad\n : ABViewFormPropertyComponentDefaults.clearOnLoad\n );\n this.settings.clearOnSave = JSON.parse(\n this.settings.clearOnSave != null\n ? this.settings.clearOnSave\n : ABViewFormPropertyComponentDefaults.clearOnSave\n );\n\n // convert from \"0\" => 0\n this.settings.labelWidth = parseInt(\n this.settings.labelWidth == null\n ? ABViewFormPropertyComponentDefaults.labelWidth\n : this.settings.labelWidth\n );\n this.settings.height = parseInt(\n this.settings.height == null\n ? ABViewFormPropertyComponentDefaults.height\n : this.settings.height\n );\n }\n\n // Use this function in kanban\n objectLoad(object) {\n this._currentObject = object;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n var viewsToAllow = [\"mobile-label\", \"mobile-button\", \"mobile-text\"],\n allComponents = this.application.viewAll();\n\n return allComponents.filter((c) => {\n return viewsToAllow.indexOf(c.common().key) > -1;\n });\n }\n\n /**\n * @method fieldComponents()\n * return an array of all the ABViewFormField children\n * @param {fn} filter\n * a filter fn to return a set of ABViewFormField that this fn\n *\t returns true for.\n * @return {array} \tarray of ABViewFormField\n */\n fieldComponents(filter) {\n const flattenComponents = (views) => {\n let components = [];\n\n views.forEach((v) => {\n if (v == null) return;\n\n components.push(v);\n\n if (v._views?.length) {\n components = components.concat(flattenComponents(v._views));\n }\n });\n\n return components;\n };\n\n if (this._views?.length) {\n const allComponents = flattenComponents(this._views);\n\n if (filter == null) {\n filter = (comp) =>\n comp instanceof this.AB.Class.ABMobileViewFormItem;\n }\n\n return allComponents.filter(filter);\n } else {\n return [];\n }\n }\n\n /**\n * @method addFieldToForm()\n * Create a New Form Item on this Form from a given ABFieldXXX object.\n * @param {ABFieldXXX} field\n * @param {int} yPosition\n * @return {ABMobileViewFormXXX}\n */\n addFieldToForm(field, yPosition) {\n if (field == null) return;\n\n // TODO: figure out how to decode the Data Field and return a form\n // element.\n\n var fieldComponent = field.formComponentMobile();\n if (fieldComponent == null) return;\n\n var newView = fieldComponent.newInstance(this.application, this);\n if (newView == null) return;\n\n // set settings to component\n newView.settings = newView.settings || {};\n newView.settings.fieldId = field.id;\n // TODO : Default settings\n\n if (yPosition != null) newView.position.y = yPosition;\n\n // add a new component\n this._views.push(newView);\n\n return newView;\n }\n\n get RecordRule() {\n let object = this.datacollection.datasource;\n\n if (this._recordRule == null) {\n this._recordRule = new ABRecordRule();\n }\n\n this._recordRule.formLoad(this);\n this._recordRule.fromSettings(this.settings.recordRules);\n this._recordRule.objectLoad(object);\n\n return this._recordRule;\n }\n\n /**\n * @method recordRulesReady()\n * This returns a Promise that gets resolved when all record rules report\n * that they are ready.\n * @return {Promise}\n */\n async recordRulesReady() {\n return this.RecordRule.rulesReady();\n }\n\n doRecordRulesPre(rowData) {\n return this.RecordRule.processPre({ data: rowData, form: this });\n }\n\n doRecordRules(rowData) {\n // validate for record rules\n if (rowData) {\n let object = this.datacollection.datasource;\n let ruleValidator = object.isValidData(rowData);\n let isUpdatedDataValid = ruleValidator.pass();\n if (!isUpdatedDataValid) {\n console.error(\"Updated data is invalid.\", { rowData: rowData });\n return Promise.reject(new Error(\"Updated data is invalid.\"));\n }\n }\n\n return this.RecordRule.process({ data: rowData, form: this });\n }\n\n doSubmitRules(rowData) {\n var object = this.datacollection.datasource;\n\n var SubmitRules = new ABSubmitRule();\n SubmitRules.formLoad(this);\n SubmitRules.fromSettings(this.settings.submitRules);\n SubmitRules.objectLoad(object);\n\n return SubmitRules.process({ data: rowData, form: this });\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABViewFormCustomPropertyComponentDefaults = {};\n\nconst ABViewFormCustomDefaults = {\n key: \"mobile-fieldcustom\",\n // {string} unique key for this view\n icon: \"object-group\",\n // {string} fa-[icon] reference for this view\n labelKey: \"custom\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormCustomCore extends ABMobileViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormCustomDefaults\n );\n }\n\n static common() {\n return ABViewFormCustomDefaults;\n }\n\n static defaultValues() {\n return ABViewFormCustomPropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormDatepickerPropertyComponentDefaults = {\n timepicker: false,\n};\n\nconst ABMobileViewFormDatepickerDefaults = {\n key: \"mobile-date\", // {string} unique key for this view\n icon: \"calendar\", // {string} fa-[icon] reference for this view\n labelKey: \"datepicker\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormDatepickerCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormDatepickerDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormDatepickerDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormDatepickerPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormDatetimePropertyComponentDefaults = {\n timepicker: false,\n};\n\nconst ABMobileViewFormDatetimeDefaults = {\n key: \"mobile-datetime\", // {string} unique key for this view\n icon: \"calendar\", // {string} fa-[icon] reference for this view\n labelKey: \"Date and Time\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormDatetimeCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormDatetimeDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormDatetimeDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormDatetimePropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormEmailPropertyComponentDefaults = {\n timepicker: false,\n};\n\nconst ABMobileViewFormEmailDefaults = {\n key: \"mobile-email\", // {string} unique key for this view\n icon: \"envelope\", // {string} fa-[icon] reference for this view\n labelKey: \"Email\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormEmailCore extends ABMobileViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormEmailDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormEmailDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormEmailPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABViewFormFilePropertyComponentDefaults = {};\n\nconst ABViewFormFileDefaults = {\n key: \"mobile-file\",\n // {string} unique key for this view\n icon: \"file\",\n // {string} fa-[icon] reference for this view\n labelKey: \"file\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormFileCore extends ABMobileViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormFileDefaults\n );\n }\n\n static common() {\n return ABViewFormFileDefaults;\n }\n\n static defaultValues() {\n return ABViewFormFilePropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABViewFormFormulaPropertyComponentDefaults = {};\n\nconst ABViewFormFormulaDefaults = {\n key: \"mobile-formula\",\n // {string} unique key for this view\n icon: \"circle-o-notch\",\n // {string} fa-[icon] reference for this view\n labelKey: \"Formula\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormFormulaCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormFormulaDefaults\n );\n }\n\n static common() {\n return ABViewFormFormulaDefaults;\n }\n\n static defaultValues() {\n return ABViewFormFormulaPropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormFile = require(\"../../platform/mobile/ABMobileViewFormFile\");\n\nconst ABViewFormImagePropertyComponentDefaults = {};\n\nconst ABViewImageFileDefaults = {\n key: \"mobile-image\",\n // {string} unique key for this view\n icon: \"file-image-o\",\n // {string} fa-[icon] reference for this view\n labelKey: \"Image\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormImageCore extends ABMobileViewFormFile {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewImageFileDefaults\n );\n }\n\n static common() {\n return ABViewImageFileDefaults;\n }\n\n static defaultValues() {\n return ABViewFormImagePropertyComponentDefaults;\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABViewFormFieldPropertyComponentDefaults = {\n required: 0,\n disable: 0,\n};\n\nmodule.exports = class ABMobileViewFormItemCore extends ABMobileView {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n static defaultValues() {\n return ABViewFormFieldPropertyComponentDefaults;\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n let form = this.parentFormComponent();\n if (form == null) return null;\n\n let datacollection = form.datacollection;\n if (datacollection == null) return null;\n\n return datacollection;\n }\n\n field() {\n if (this.settings.objectId) {\n let object = this.AB.objectByID(this.settings.objectId);\n if (!object) return null;\n\n return object.fieldByID(this.settings.fieldId);\n } else {\n let form = this.parentFormComponent();\n if (form == null) return null;\n\n let object;\n if (form._currentObject) {\n object = form._currentObject;\n } else {\n let datacollection = form.datacollection;\n if (datacollection == null) return null;\n\n object = datacollection.datasource;\n }\n\n if (object == null) return null;\n\n let field = object.fieldByID(this.settings.fieldId);\n return field;\n }\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormNumberPropertyComponentDefaults = {\n isStepper: 0,\n};\n\nconst ABMobileViewFormNumberDefaults = {\n key: \"mobile-numberbox\", // {string} unique key for this view\n icon: \"hashtag\", // {string} fa-[icon] reference for this view\n labelKey: \"number\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormNumberCore extends ABMobileViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormNumberDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormNumberDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormNumberPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewFormText instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n this.unTranslate(this, this, [\"label\", \"formLabel\"]);\n\n var obj = super.toObj();\n obj.views = []; // no subviews\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // if this is being instantiated on a read from the Property UI,\n this.settings.isStepper =\n this.settings.isStepper ||\n ABMobileViewFormNumberPropertyComponentDefaults.isStepper;\n\n // convert from \"0\" => 0\n this.settings.isStepper = parseInt(this.settings.isStepper);\n }\n};\n","const ABMobileViewFormCustom = require(\"../../platform/mobile/ABMobileViewFormCustom\");\n\nconst ABMobileViewFormReadonlyPropertyComponentDefaults = {};\n\nconst ABMobileViewFormReadonlyDefaults = {\n key: \"mobile-fieldreadonly\", // {string} unique key for this view\n icon: \"calculator\", // {string} fa-[icon] reference for this view\n labelKey: \"readonly\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormReadonly extends ABMobileViewFormCustom {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormReadonlyDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormReadonlyDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormReadonlyPropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormSelectSingle = require(\"../../platform/mobile/ABMobileViewFormSelectSingle\");\n\nconst ABMobileViewFormSelectMultiplePropertyComponentDefaults = {\n type: \"richselect\", // 'richselect' or 'radio'\n};\n\nconst ABMobileViewFormSelectMultipleDefaults = {\n key: \"mobile-selectmultiple\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"selectmultiple\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormSelectMultipleCore extends (\n ABMobileViewFormSelectSingle\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormSelectMultipleDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormSelectMultipleDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormSelectMultiplePropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormSelectSinglePropertyComponentDefaults = {\n type: \"richselect\", // 'richselect' or 'radio'\n};\n\nconst ABMobileViewFormSelectSingleDefaults = {\n key: \"mobile-selectsingle\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"selectsingle\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormSelectSingleCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormSelectSingleDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormSelectSingleDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormSelectSinglePropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABViewFormTextboxPropertyComponentDefaults = {\n type: \"single\", // 'single', 'multiple' or 'rich'\n placeholder: \"\", // default placeholder text\n};\n\nconst ABViewFormTextboxDefaults = {\n key: \"mobile-textbox\", // {string} unique key for this view\n icon: \"i-cursor\", // {string} fa-[icon] reference for this view\n labelKey: \"textbox\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormTextboxCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormTextboxDefaults\n );\n }\n\n static common() {\n return ABViewFormTextboxDefaults;\n }\n\n static defaultValues() {\n return ABViewFormTextboxPropertyComponentDefaults;\n }\n\n toObj() {\n // placeholder is a multilingual value:\n this.unTranslate(this.settings, this.settings, [\"placeholder\"]);\n\n return super.toObj();\n }\n\n fromValues(values) {\n super.fromValues(values);\n\n // placeholder is a multilingual value:\n this.unTranslate(this.settings, this.settings, [\"placeholder\"]);\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABViewLabelPropertyComponentDefaults = {\n text: \"\",\n format: 0, // 0 - normal, 1 - title, 2 - description\n alignment: \"left\",\n};\n\nconst ABViewDefaults = {\n key: \"mobile-label\", // {string} unique key for this view\n icon: \"font\", // {string} fa-[icon] reference for this view\n labelKey: \"Label\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewLabelCore extends ABMobileView {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewLabelPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n this.unTranslate(this, this, [\"label\", \"text\"]);\n\n var obj = super.toObj();\n obj.viewIDs = [];\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values); // <-- this performs the translations\n\n // if this is being instantiated on a read from the Property UI,\n // .text is coming in under .settings.label\n this.text = values.text || values.settings.text || \"*text\";\n\n this.settings.format =\n this.settings.format || ABViewLabelPropertyComponentDefaults.format;\n this.settings.alignment =\n this.settings.alignment ||\n ABViewLabelPropertyComponentDefaults.alignment;\n\n // we are not allowed to have sub views:\n this._views = [];\n\n // convert from \"0\" => 0\n this.settings.format = parseInt(this.settings.format);\n\n this.translate(this, this, [\"label\", \"text\"]);\n }\n\n //// Allow external interface to manipulate our settings:\n\n /**\n * @method formatNormal\n * display text in the normal format.\n */\n formatNormal() {\n this.settings.format = 0;\n }\n\n /**\n * @method formatTitle\n * display text as a Title.\n */\n formatTitle() {\n this.settings.format = 1;\n }\n\n /**\n * @method formatDescription\n * display text as a description.\n */\n formatDescription() {\n this.settings.format = 2;\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABViewListPropertyComponentDefaults = {\n dataviewID: null,\n field: null,\n height: 0,\n hideTitle: 0,\n hideTabs: 0,\n};\n\nconst ABViewDefaults = {\n key: \"mobile-list\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"List\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewLabelCore extends ABMobileView {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewListPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n field() {\n var dv = this.datacollection;\n if (!dv) return null;\n\n var object = dv.datasource;\n if (!object) return null;\n\n return object.fieldByID(this.settings.field);\n }\n\n /**\n * @method wantsAdd()\n * Some widgets can indicate to their containing ABMobilePage that\n * it wants to provide an [Add] feature.\n * @return {bool}\n */\n get wantsAdd() {\n // we do if we have a setting for linkPageAdd\n return this.settings.linkPageAdd != \"\";\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABViewTimelinePropertyComponentDefaults = {\n dataviewID: null,\n field: null,\n height: 0,\n hideTitle: 0,\n hideTabs: 0,\n};\n\nconst ABViewDefaults = {\n key: \"mobile-timeline\", // {string} unique key for this view\n icon: \"timeline\", // {string} fa-[icon] reference for this view\n labelKey: \"Timeline\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewTimelineCore extends ABMobileView {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewTimelinePropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n field() {\n var dv = this.datacollection;\n if (!dv) return null;\n\n var object = dv.datasource;\n if (!object) return null;\n\n return object.fieldByID(this.settings.field);\n }\n\n /**\n * @method wantsAdd()\n * Some widgets can indicate to their containing ABMobilePage that\n * it wants to provide an [Add] feature.\n * @return {bool}\n */\n get wantsAdd() {\n // we do if we have a setting for linkPageAdd\n return this.settings.linkPageAdd != \"\";\n }\n};\n","/**\n * ABProcessLane\n * manages the lanes in a Process Diagram.\n *\n * Lanes manage users in the system, and provide a way to lookup a SiteUser.\n */\nconst ABProcessParticipant = require(\"../../platform/process/ABProcessParticipant\");\n\nconst ABProcessLaneDefaults = {\n type: \"process.lane\",\n // {string} .type\n // unique key to reference this specific object\n\n // icon: \"key\"\n // {string} .icon\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n};\n\nmodule.exports = class ABProcessLaneCore extends ABProcessParticipant {\n constructor(attributes, process, AB) {\n super(attributes, process, AB);\n\n //// Runtime Values\n //// these are not stored in the Definition, but rather\n //// loaded and used from a running process instance.\n }\n\n static defaults() {\n return ABProcessLaneDefaults;\n }\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n super.fromValues(attributes);\n\n this.type = attributes.type || ABProcessLaneDefaults.type;\n }\n\n /**\n * @method toObj()\n * properly compile the current state of this object instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n // toObj() {\n // // default label value\n // if (!this.label && this.name && this.name != \"\") {\n // this.label = this.name;\n // }\n\n // // untranslate this object:\n // var data = super.toObj();\n\n // var fieldsToSave = [\n // \"id\",\n // \"name\",\n // \"type\",\n // \"processID\",\n // \"diagramID\",\n // \"where\"\n // ];\n // fieldsToSave.forEach((f) => {\n // data[f] = this[f];\n // });\n\n // return data;\n // }\n};\n","/**\n * ABProcessParticipant\n * manages the participant lanes in a Process Diagram.\n *\n * Participants manage users in the system, and provide a way to lookup a SiteUser.\n */\nconst ABMLClass = require(\"../../platform/ABMLClass\");\n\nconst ABProcessParticipantDefaults = {\n type: \"process.participant\",\n // {string} .type\n // unique key to reference this specific object\n\n // icon: \"key\" // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n};\n\nmodule.exports = class ABProcessParticipantCore extends ABMLClass {\n constructor(attributes, process, AB) {\n super([\"label\"], AB);\n\n this.process = process;\n if (!this.processID) {\n this.processID = process.id;\n }\n\n this.fromValues(attributes);\n\n //// Runtime Values\n //// these are not stored in the Definition, but rather\n //// loaded and used from a running process instance.\n }\n\n static defaults() {\n return ABProcessParticipantDefaults;\n }\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n // These Values are needed By ABDefinition:\n this.id = attributes.id;\n this.name = attributes.name || \"\";\n this.type = attributes.type || ABProcessParticipantDefaults.type;\n this.key = attributes.key || ABProcessParticipantDefaults.type;\n\n // Process Values:\n this.processID = attributes.processID || null;\n this.diagramID = attributes.diagramID || \"?diagramID?\";\n this.laneIDs = attributes.laneIDs || [];\n this.stashed = false;\n if (attributes.stashed && attributes.stashed != \"\") {\n this.stashed = attributes.stashed;\n }\n\n function validChecker(attribute) {\n return typeof attribute != \"undefined\" && attribute != null;\n }\n\n this.useRole = 0;\n if (validChecker(attributes.useRole)) {\n this.useRole = parseInt(attributes.useRole);\n }\n\n this.role = 0;\n if (validChecker(attributes.role)) {\n this.role = attributes.role;\n }\n\n this.useAccount = 0;\n if (validChecker(attributes.useAccount)) {\n this.useAccount = parseInt(attributes.useAccount);\n }\n\n this.account = 0;\n if (validChecker(attributes.account)) {\n this.account = attributes.account;\n }\n\n this.useField = 0;\n if (validChecker(attributes.useField)) {\n this.useField = parseInt(attributes.useField);\n }\n\n this.userField = [];\n if (validChecker(attributes.userField)) {\n this.userField = attributes.userField;\n }\n\n // depreciated\n this.fields = [];\n if (validChecker(attributes.fields)) {\n this.fields = attributes.fields;\n }\n\n super.fromValues(attributes); // perform translation on this object.\n // NOTE: keep this at the end of .fromValues();\n\n if (!this.label) {\n this.label = this.name;\n }\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n // default label value\n if (!this.label && this.name && this.name != \"\") {\n this.label = this.name;\n }\n\n // untranslate this object:\n var data = super.toObj();\n\n var fieldsToSave = [\n \"id\",\n \"name\",\n \"type\",\n \"processID\",\n \"diagramID\",\n \"laneIDs\",\n \"where\",\n \"useRole\",\n \"role\",\n \"useAccount\",\n \"account\",\n \"useField\",\n \"userField\",\n \"fields\",\n \"stashed\",\n ];\n fieldsToSave.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n\n /**\n * @method onProcessReady()\n * perform any tasks/checks necessary after the parent Process is\n * setup and ready.\n */\n onProcessReady() {}\n};\n","/*\n * ABProcessTaskManager\n *\n * An interface for managing the different ABProcessTasks in AppBuilder.\n *\n */\n\n/*\n * Tasks\n * A name => ABProcessElement hash of the different ABProcessElements available.\n */\nvar Tasks = {};\n\n/*\n * DEFINITIONTYPES\n * a hash of BPMN:Element.type to Default values\n * for each of our Process Objects.\n *\n * NOTE: For Tasks, the key should be target.type,\n * for Triggers or End elements, the key should be\n * the target.eventDefinitionType\n */\nvar DEFINITIONTYPES = {};\n\nvar AllProcessElements = [\n require(\"../../platform/process/tasks/ABProcessEnd\"),\n require(\"../../platform/process/tasks/ABProcessGatewayExclusive\"),\n require(\"../../platform/process/tasks/ABProcessTaskEmail\"),\n require(\"../../platform/process/tasks/ABProcessTaskService\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceAccountingBatchProcessing\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceAccountingFPClose\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceAccountingFPYearClose\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceAccountingJEArchive\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceApi\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceCalculate\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceInsertRecord\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceQuery\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceGetResetPasswordUrl\"),\n require(\"../../platform/process/tasks/ABProcessTaskSubProcess\"),\n require(\"../../platform/process/tasks/ABProcessTaskUser\"),\n require(\"../../platform/process/tasks/ABProcessTaskUserApproval\"),\n require(\"../../platform/process/tasks/ABProcessTaskUserExternal\"),\n require(\"../../platform/process/tasks/ABProcessTaskUserForm\"),\n require(\"../../platform/process/tasks/ABProcessTrigger\"),\n require(\"../../platform/process/tasks/ABProcessTriggerLifecycle\"),\n require(\"../../platform/process/tasks/ABProcessTriggerTimer\"),\n];\n\nAllProcessElements.forEach((ELEMENT) => {\n Tasks[ELEMENT.defaults().key] = ELEMENT;\n\n switch (ELEMENT.defaults().category) {\n case \"start\":\n case \"end\":\n DEFINITIONTYPES[ELEMENT.DiagramReplace().target.eventDefinitionType] =\n ELEMENT.defaults();\n break;\n\n case \"gateway\":\n case \"task\":\n DEFINITIONTYPES[ELEMENT.DiagramReplace().target.type] =\n ELEMENT.defaults();\n break;\n }\n});\n\nmodule.exports = {\n /*\n * @function allTasks\n * return all the currently defined ABProcessTasks in an array.\n * @return [{ABProcessTask},...]\n */\n allTasks: function () {\n var tasks = [];\n for (var t in Tasks) {\n tasks.push(Tasks[t]);\n }\n return tasks;\n },\n\n /*\n * @function newTask\n * return an instance of an ABProcessTask based upon the values.type value.\n * @return {ABProcessTask}\n */\n newTask: function (values, process, AB) {\n if (values.key) {\n return new Tasks[values.key](values, process, AB);\n } else {\n //// TODO: what to do here?\n }\n },\n\n DiagramReplaceDefinitionsForType: function (type) {\n var definitions = AllProcessElements.filter((e) => {\n return e.defaults().category == type;\n }).map((e) => {\n return e.DiagramReplace();\n });\n return definitions;\n },\n\n StartEvents: function () {\n return this.DiagramReplaceDefinitionsForType(\"start\");\n },\n\n Gateways: function () {\n return this.DiagramReplaceDefinitionsForType(\"gateway\");\n },\n\n Tasks: function () {\n return this.DiagramReplaceDefinitionsForType(\"task\");\n },\n\n EndEvents: function () {\n return this.DiagramReplaceDefinitionsForType(\"end\");\n },\n\n definitionForElement: function (element) {\n // pull the key from the embedded .eventDefinition\n // if there is one\n var key = null;\n if (element.businessObject.eventDefinitions) {\n var def = element.businessObject.eventDefinitions[0];\n if (def) {\n key = def.$type;\n }\n }\n\n // if not, then just use the base .type\n if (!key) {\n key = element.type;\n }\n\n return DEFINITIONTYPES[key];\n },\n};\n","var ABMLClass = require(\"../../../platform/ABMLClass\");\n\nmodule.exports = class ABProcessTaskCore extends ABMLClass {\n constructor(attributes, process, AB, defaultValues) {\n super([\"label\"], AB);\n\n this.defaults = defaultValues || { key: \"core\", icon: \"core\" };\n // {obj} .defaults\n // a value hash of default values for an ABProcessTask\n // NOTE: needs to be set before .fromValues()\n\n this.fromValues(attributes);\n\n this.process = process;\n if (!this.processID) {\n this.processID = process.id;\n }\n // {ABProcess} .process\n // The parent ABProcess this process element is a part of.\n\n //// Runtime Values\n //// these are not stored in the Definition, but rather\n //// loaded and used from a running process instance.\n this.state = null;\n }\n\n ///\n /// Static Methods\n ///\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n // ABDefinition Related fields:\n this.id = attributes.id;\n this.name = attributes.name || \"\";\n this.type = attributes.type || \"process.task.unknown\";\n\n // ABProcess related fields:\n this.key = attributes.key || this.defaults.key || \"?key?\";\n this.processID = attributes.processID || null;\n this.diagramID = attributes.diagramID || \"?diagramID?\";\n this.laneDiagramID = attributes.laneDiagramID || \"?laneID?\";\n // laneDiagramID : connects to the parent object that defines any\n // default User information for the Task. In our case, it\n // might be a {ABProcessParticipant} object, or a {ABProcessLane}\n // object. by default, a diagram's Participant obj doesn't define\n // any lanes, and therefore can provide that info. Once a lane\n // is added, however, an object is assigned to it, and the\n // Lane will provide that info.\n\n // initialize any defined settings\n if (this.defaults && this.defaults.settings) {\n this.defaults.settings.forEach((s) => {\n if (typeof attributes[s] == \"undefined\") this[s] = null;\n else this[s] = attributes[s];\n });\n }\n\n super.fromValues(attributes); // perform translation on this object.\n // NOTE: keep this at the end of .fromValues();\n\n if (!this.label) {\n this.label = this.name;\n }\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n // default label value\n if (!this.label && this.name && this.name != \"\") {\n this.label = this.name;\n }\n\n // untranslate this object:\n var data = super.toObj();\n\n var fieldsToSave = [\n \"id\",\n \"name\",\n \"type\",\n \"processID\",\n \"diagramID\",\n \"laneDiagramID\",\n \"key\",\n ];\n fieldsToSave.forEach((f) => {\n data[f] = this[f];\n });\n\n // save any defined settings\n if (this.defaults && this.defaults.settings) {\n this.defaults.settings.forEach((s) => {\n data[s] = this[s];\n });\n }\n\n return data;\n }\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * errorConfig()\n * Respond with an error when expected configuration parameters do not\n * pull data.\n * @param {obj} instance\n * the instance data of this task\n * @param {string} msg\n * the display message for this error.\n * @param {array[string]} fields\n * an array of parameter keys that should be included in the error\n * for additional information.\n * @return {Promise.reject(error)}\n */\n errorConfig(instance, msg, fields = []) {\n this.log(instance, msg);\n var error = new Error(`${this.type}: ${msg}`);\n var info = { task: this };\n if (!Array.isArray(fields)) fields = [fields];\n fields.forEach((field) => {\n info[field] = this[field];\n });\n this.AB.notify.builder(error, info);\n return Promise.reject(error);\n }\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context\n * the context data of the process instance\n * @param {obj} defaults\n * any values to include from our child classes\n * @param {obj} val\n * any values to override the default state\n */\n initState(context, defaults, val) {\n defaults = defaults || {};\n if (!val) {\n val = defaults;\n defaults = {};\n\n // in this case, then auto initi blank instanceValues:\n if (this.defaults && this.defaults.instanceValues) {\n this.defaults.instanceValues.forEach((v) => {\n defaults[v] = null;\n });\n }\n }\n\n context.taskState = context.taskState || {};\n\n // don't overwrite your settings if they already exist:\n if (!context.taskState[this.diagramID]) {\n context.taskState[this.diagramID] = {\n initialized: true,\n status: \"initialized\",\n };\n for (var d in defaults) {\n context.taskState[this.diagramID][d] = defaults[d];\n }\n for (var v in val) {\n context.taskState[this.diagramID][v] = val[v];\n }\n }\n }\n\n /*\n * @function isEndTask\n * return true if the current type of task is an End task. False otherwise.\n * @return {bool}\n */\n isEndTask() {\n return false;\n }\n\n /**\n * log()\n * enter a log in the current process instance\n * @param {obj} instance the current ABProcessInstance\n * @param {...} ...allArgs the remaining parameters sent to the log\n */\n log(instance, ...allArgs) {\n var text = `${this.diagramID} : ${\n this.name ? this.name : this.key\n } : ${allArgs.join(\" \")}`;\n instance.log.push(text);\n }\n\n /**\n * myLane()\n * return the ABProcessParticipant | ABProcessLane element we are\n * in.\n * @return {ABProcessParticipant|ABProcessLane}\n */\n myLane() {\n return this.process.elementForDiagramID(this.laneDiagramID);\n }\n\n /**\n * myState()\n * return the current state values for this ABProcessTask\n * @param {obj} instance the current ABProcessInstance\n * @return {obj}\n */\n myState(instance) {\n return instance.context.taskState[this.diagramID];\n }\n\n /**\n * nextTasks()\n * follow the current instance diagram and return the next task(s)\n * after this task.\n * @param {obj} instance the current ABProcessInstance\n * @return {array} [ABProcessTask, ...] or {null} if an error\n */\n nextTasks(instance) {\n var nextTasks = [];\n\n var myDiagramObj = instance.hashDiagramObjects[this.diagramID];\n if (!myDiagramObj) {\n let error = new Error(\n `Configuration Error: Did not find my definition for dID[${this.diagramID}]`\n );\n this.onError(instance, error);\n return null;\n }\n\n // myDiagramObj :\n // {\n // \"bpmn2:outgoing\": [{\"_text\": \"SequenceFlow_00fbxm3\"} ...],\n // \"_attributes\": {id: \"StartEvent_1\"},\n // \"_type\": \"start\"\n // }\n\n // find my possible exits:\n var exitFlows = myDiagramObj[\"bpmn2:outgoing\"];\n if (!exitFlows) {\n let error = new Error(\n `Configuration Error: Did not find any outgoing flows for dID[${this.diagramID}]`\n );\n this.AB.notify.builder(error, { task: this });\n this.onError(instance, error);\n return null;\n }\n\n if (!Array.isArray(exitFlows)) {\n exitFlows = [exitFlows];\n }\n\n var tasksFromFlow = (flow) => {\n // follow a flow and grab each of it's exit tasks\n // place them into nextTasks[];\n\n var flowObj = instance.hashDiagramObjects[flow[\"_text\"]];\n if (!flowObj) return;\n\n var targetIDs = flowObj[\"_attributes\"][\"targetRef\"];\n if (!targetIDs) return;\n\n if (!Array.isArray(targetIDs)) {\n targetIDs = [targetIDs];\n }\n\n targetIDs.forEach((tid) => {\n var targetTask = this.process.elementForDiagramID(tid);\n if (targetTask) {\n if (nextTasks) {\n nextTasks.push(targetTask);\n }\n } else {\n let error = new Error(\n `Configuration Error: No ProcessTask instance for diagramID[${tid}]`\n );\n this.AB.notify.builder(error, { task: this });\n this.onError(instance, error);\n nextTasks = null;\n }\n });\n };\n\n exitFlows.forEach((f) => {\n tasksFromFlow(f);\n });\n\n return nextTasks;\n }\n\n /**\n * onError()\n * perform the following actions (log it) on an error.\n * @param {obj} instance the current ABProcessInstance\n * @param {Error} error\n */\n onError(instance, error) {\n if (error) {\n var text = `${error.toString()}`;\n this.log(instance, text);\n }\n var myState = this.myState(instance);\n myState.status = \"error\";\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can request from other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n return null;\n }\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n processData(instance, key) {\n return null;\n }\n\n /**\n * processDataObjects()\n * return an array of avaiable ABObjects that this element\n * can provide to other ProcessElements.\n * @return {array} | null\n */\n processDataObjects() {\n return null;\n }\n\n /**\n * hashProcessDataValues()\n * return a hash of live Process Data Values\n * @param {obj} instance\n * @return {array} | null\n */\n hashProcessDataValues(instance) {\n var listDataFields = this.process.processDataFields(this);\n var currentProcessValues = {};\n listDataFields.forEach((f) => {\n currentProcessValues[f.key] = this.process.processData(this, [\n instance,\n f.key,\n ]);\n });\n return currentProcessValues;\n }\n\n /**\n * reset()\n * prepare this task to run again if it was already completed.\n *\n * This might happen in a process where a loop is formed and tasks\n * are repeated until a certain outcome.\n *\n * @param {obj} instance the current ABProcessInstance\n */\n reset(instance) {\n // a task wants to run me. Possibly again.\n var myState = this.myState(instance);\n\n // if I haven't setup my state (why?) then just\n // do that again:\n if (!myState) {\n this.initState(instance.context);\n } else {\n // if I have already \"completed\" and we are being\n // asked to run again (it's possible)\n if (myState.status == \"completed\" || myState.status == \"error\") {\n // remove my current state\n delete instance.context.taskState[this.diagramID];\n\n // store a new state in the context\n this.initState(instance.context);\n\n // remember our previous state\n var newState = this.myState(instance);\n newState._prevState = myState;\n this.log(instance, \" Reset() called. Running again. \");\n }\n }\n }\n\n /**\n * stateCompleted()\n * mark this task has having completed.\n * @param {obj} instance the current ABProcessInstance\n */\n stateCompleted(instance) {\n var myState = this.myState(instance);\n myState.status = \"completed\";\n }\n\n /**\n * stateUpdate()\n * update my state values with the given values data\n * @param {obj} instance the current ABProcessInstance\n * @param {obj} values the new state values\n */\n stateUpdate(instance, values) {\n values = values || {};\n var myState = this.myState(instance);\n for (var v in values) {\n myState[v] = values[v];\n }\n }\n\n /**\n * wantToDoSomething()\n * determine if this task still has something to do.\n * @param {obj} instance the instance data of the process we are working on\n * @return {bool} true if there is still pending actions\n */\n wantToDoSomething(instance) {\n var state = this.myState(instance);\n if (state) {\n return state.status != \"completed\" && state.status != \"error\";\n } else {\n // my state wasn't defined?\n console.warn(\n \"ABProcessTaskCore:wantToDoSomething(): called without having initialized our state first.\",\n instance\n );\n // initialize our state and try again\n this.initState(instance.context);\n return this.wantToDoSomething(instance);\n }\n }\n\n /**\n * @method onProcessReady()\n * Perform any setup actions after the parent process has indicated it is \"ready\"\n */\n onProcessReady() {}\n\n get startElements() {\n let startElems =\n this.process.elements(\n (elem) =>\n elem && elem.defaults && elem.defaults.category === \"start\"\n ) || [];\n return startElems;\n }\n\n get previousElements() {\n return this.process.connectionPreviousTask(this);\n }\n\n get objectOfStartElement() {\n const startElem = this.startElements[0];\n if (!startElem) return null;\n\n return this.AB.objectByID(startElem.objectID);\n }\n\n get objectOfPrevElement() {\n let prevElem = this.previousElements[0];\n if (!prevElem) return null;\n\n let objectID;\n switch (prevElem.type) {\n case \"process.task.service.query\":\n objectID = prevElem.qlObj ? prevElem.qlObj.objectID : null;\n break;\n case \"process.task.service.insertRecord\":\n default:\n objectID = prevElem.objectID;\n break;\n }\n\n return this.AB.objectByID(objectID);\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar ABProcessTaskEndDefaults = {\n category: \"end\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n fields: [],\n // fields: {array}\n // a list of internal setting values this Element tracks\n\n icon: \"stop\",\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to\n // reference 'fa-user'\n\n key: \"End\",\n // key: {string}\n // unique key to reference this specific Task\n};\n\nmodule.exports = class ABProcessTaskEndCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.end\";\n super(attributes, process, AB, ABProcessTaskEndDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskEndDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Terminate End Event\",\n actionName: \"replace-with-terminate-end\",\n className: \"bpmn-icon-end-event-terminate\",\n target: {\n type: \"bpmn:EndEvent\",\n eventDefinitionType: \"bpmn:TerminateEventDefinition\",\n },\n };\n }\n\n /**\n * do()\n * this method actually performs the action for this task.\n * @param {obj} instance the instance data of the running process\n * @return {Promise}\n * resolve(true/false) : true if the task is completed.\n * false if task is still waiting\n */\n // do(instance) {\n // return new Promise((resolve, reject) => {\n // // An End Event doesn't perform any other actions\n // // than to signal it has successfully completed.\n // // But it provides no Additional Tasks to work on.\n // // for testing:\n // this.stateCompleted(instance);\n // this.log(instance, \"End Event Reached\");\n // resolve(true);\n // });\n // }\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n initState(context, val) {\n var myDefaults = {\n triggered: false,\n };\n\n super.initState(context, myDefaults, val);\n }\n\n /*\n * @function isEndTask\n * return true if the current type of task is an End task. False otherwise.\n * @return {bool}\n */\n isEndTask() {\n return true;\n }\n\n /**\n * nextTasks()\n * return the next tasks to be run after this task is complete.\n * @param {obj} instance the instance data of the running process\n * @return {Promise}\n * resolve([])\n */\n nextTasks(instance) {\n // I'm an End Event. There are no nextTasks()\n return [];\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar ABProcessGatewayExclusiveDefaults = {\n category: \"gateway\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\",\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to\n // reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"GatewayExclusive\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"conditions\"],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class ABProcessGatewayExclusiveCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.gateway.exclusive\";\n super(attributes, process, AB, ABProcessGatewayExclusiveDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessGatewayExclusiveDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Exclusive Gateway\",\n actionName: \"replace-with-exclusive-gateway\",\n className: \"bpmn-icon-gateway-xor\",\n target: {\n type: \"bpmn:ExclusiveGateway\",\n },\n };\n }\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n super.fromValues(attributes);\n\n this.conditions = this.conditions || {};\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n\n ABProcessGatewayExclusiveDefaults.fields.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {\n userFormID: null,\n userFormResponse: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n /*\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n return [\n {\n key: `${this.id}.userFormResponse`,\n label: `${this.label}->Response`\n }\n ];\n }\n */\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n /*\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.id) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n return null;\n }\n */\n};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar ABProcessTaskEmailDefaults = {\n category: \"task\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n fields: [\n \"to\",\n \"from\",\n \"subject\",\n \"message\",\n \"toCustom\",\n \"fromCustom\",\n \"toUsers\",\n \"fromUsers\",\n \"toCustomFields\",\n \"fromCustomFields\",\n ],\n // fields: {array}\n // a list of internal setting values this Element tracks\n\n icon: \"email\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n key: \"Email\",\n // key: {string}\n // unique key to reference this specific Task\n};\n\nmodule.exports = class ABProcessTaskEmailCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.email\";\n super(attributes, process, AB, ABProcessTaskEmailDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskEmailDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Send Task\",\n actionName: \"replace-with-send-task\",\n className: \"bpmn-icon-send\",\n target: {\n type: \"bpmn:SendTask\",\n },\n };\n }\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n super.fromValues(attributes);\n\n ABProcessTaskEmailDefaults.fields.forEach((f) => {\n this[f] = attributes[f];\n });\n }\n\n /**\n * onProcessReady()\n * Perform our warnings checks once the parent Process is ready\n */\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var data = super.toObj();\n\n ABProcessTaskEmailDefaults.fields.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * do()\n * this method actually performs the action for this task.\n * @param {obj} instance the instance data of the running process\n * @return {Promise}\n * resolve(true/false) : true if the task is completed.\n * false if task is still waiting\n */\n // do(instance) {\n // return new Promise((resolve, reject) => {\n // // for testing:\n // var myState = this.myState(instance);\n // myState.status = \"completed\";\n // this.log(instance, \"Email Sent successfully\");\n // resolve(true);\n // });\n // }\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n initState(context, val) {\n var myDefaults = {\n to: [],\n from: [],\n subject: this.subject,\n message: this.message,\n };\n\n super.initState(context, myDefaults, val);\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar AccountingBatchProcessingDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"AccountingBatchProcessing\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"objectBatch\",\n \"processBatchValue\",\n \"fieldBatchEntries\",\n \"fieldBatchFinancialPeriod\",\n \"objectJE\",\n \"fieldJEAccount\",\n \"fieldJERC\",\n \"fieldJEStatus\",\n \"fieldJEStatusComplete\",\n \"objectBR\",\n \"fieldBRFinancialPeriod\",\n \"fieldBRAccount\",\n \"fieldBRRC\",\n \"fieldBREntries\",\n ],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class AccountingBatchProcessingCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type =\n attributes.type || \"process.task.service.accounting.batchProcessing\";\n super(attributes, process, AB, AccountingBatchProcessingDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return AccountingBatchProcessingDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /*\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n * /\n super.fromValues(attributes);\n\n AccountingBatchProcessingDefaults.settings.forEach((f) => {\n this[f] = attributes[f];\n });\n }\n */\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n\n AccountingBatchProcessingDefaults.settings.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {\n instanceVariable1: null,\n instanceVariable2: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n /*\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n return [\n {\n key: `${this.id}.[someInstanceVariableHere]`,\n label: `${this.label}->Response`\n }\n ];\n }\n */\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n /*\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.id) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n return null;\n }\n */\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar AccountingFPCloseDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"AccountingFPClose\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"processFPValue\",\n \"objectFP\",\n \"objectGL\",\n \"objectAcc\",\n \"fieldFPStart\",\n \"fieldFPOpen\",\n \"fieldFPStatus\",\n \"fieldFPActive\",\n \"fieldGLStarting\",\n \"fieldGLRunning\",\n \"fieldGLAccount\",\n \"fieldGLRc\",\n \"fieldGLDebit\",\n \"fieldGLCredit\",\n \"fieldAccType\",\n \"fieldAccAsset\",\n \"fieldAccExpense\",\n \"fieldAccLiabilities\",\n \"fieldAccEquity\",\n \"fieldAccIncome\",\n ],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class AccountingFPCloseCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type =\n attributes.type || \"process.task.service.accounting.fpClose\";\n super(attributes, process, AB, AccountingFPCloseDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return AccountingFPCloseDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /*\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n * /\n super.fromValues(attributes);\n\n AccountingFPCloseDefaults.settings.forEach((f) => {\n this[f] = attributes[f];\n });\n }\n */\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n\n AccountingFPCloseDefaults.settings.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {\n instanceVariable1: null,\n instanceVariable2: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n /*\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n return [\n {\n key: `${this.id}.[someInstanceVariableHere]`,\n label: `${this.label}->Response`\n }\n ];\n }\n */\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n /*\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.id) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n return null;\n }\n */\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar AccountingFPYearCloseDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"AccountingFPYearClose\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"processFPYearValue\",\n \"objectFPYear\",\n \"objectFPMonth\",\n \"objectGL\",\n \"objectAccount\",\n \"valueFundBalances\",\n \"valueNetIncome\",\n \"fieldFPYearStart\",\n \"fieldFPYearEnd\",\n \"fieldFPYearStatus\",\n \"fieldFPYearActive\",\n \"fieldFPMonthStart\",\n \"fieldFPMonthEnd\",\n \"fieldGLStartBalance\",\n \"fieldGLRunningBalance\",\n \"fieldGLrc\",\n \"fieldAccNumber\",\n \"fieldAccType\",\n \"fieldAccTypeIncome\",\n \"fieldAccTypeExpense\",\n \"fieldAccTypeEquity\",\n ],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class AccountingFPYearCloseCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type =\n attributes.type || \"process.task.service.accounting.fpYearClose\";\n super(attributes, process, AB, AccountingFPYearCloseDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return AccountingFPYearCloseDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /*\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n * /\n super.fromValues(attributes);\n\n AccountingFPCloseDefaults.settings.forEach((f) => {\n this[f] = attributes[f];\n });\n }\n */\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n\n AccountingFPCloseDefaults.settings.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {\n instanceVariable1: null,\n instanceVariable2: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n /*\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n return [\n {\n key: `${this.id}.[someInstanceVariableHere]`,\n label: `${this.label}->Response`\n }\n ];\n }\n */\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n /*\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.id) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n return null;\n }\n */\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nlet AccountingJEArchiveDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"archive\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"AccountingJEArchive\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"processBatchValue\",\n \"objectBatch\",\n \"objectBalance\",\n \"objectJE\",\n \"objectJEArchive\",\n\n \"fieldBatchFiscalMonth\",\n \"fieldJeAccount\",\n \"fieldJeRC\",\n \"fieldJeArchiveBalance\",\n \"fieldBrFiscalMonth\",\n \"fieldBrAccount\",\n \"fieldBrRC\",\n \"fieldsMatch\",\n ],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class AccountingJEArchiveCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type =\n attributes.type || \"process.task.service.accounting.jeArchive\";\n super(attributes, process, AB, AccountingJEArchiveDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return AccountingJEArchiveDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /*\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n * /\n super.fromValues(attributes);\n\n AccountingBatchProcessingDefaults.settings.forEach((f) => {\n this[f] = attributes[f];\n });\n }\n */\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n\n AccountingBatchProcessingDefaults.settings.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {\n instanceVariable1: null,\n instanceVariable2: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n /*\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n return [\n {\n key: `${this.id}.[someInstanceVariableHere]`,\n label: `${this.label}->Response`\n }\n ];\n }\n */\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n /*\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.id) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n return null;\n }\n */\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nlet ApiDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"exchange\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"Api\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"url\",\n \"method\",\n \"headers\",\n \"body\",\n \"responseJson\",\n \"storedSecrets\",\n ],\n responseJson: 1,\n headers: [],\n};\n\nmodule.exports = class ApiTaskCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.service.api\";\n super(attributes, process, AB, ApiDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ApiDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n const label = `${this.label}->rawResponse`;\n if (!this._fakeField) {\n this._fakeObj = this.AB.objectNew({});\n this._fakeField = this.AB.fieldNew(\n { key: \"string\", name: label, label },\n this._fakeObj,\n );\n }\n return [\n {\n key: `${this.id}.rawResponse`,\n label,\n field: this._fakeField,\n },\n ];\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nlet CalculateDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"calculator\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"Calculate\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"formulaText\"],\n};\n\nmodule.exports = class CalculateTaskCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.service.calculate\";\n super(attributes, process, AB, CalculateDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return CalculateDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n const label = `${this.label}->Value`;\n // this is a calculate task, so let's include a fake ABFieldNumber\n // for the .field value, so other tasks that limit their operations\n // to fields can use this as a number\n if (!this._fakeNum) {\n this._fakeObj = this.AB.objectNew({});\n this._fakeNum = this.AB.fieldNew(\n { key: \"number\", name: label, label },\n this._fakeObj\n );\n }\n return {\n key: `${this.id}.value`,\n label,\n field: this._fakeNum,\n };\n }\n};\n","/**\n * ABProcessTaskServiceCore\n *\n * This defines the base Service Task element that can be placed on a BPMN\n * diagram. In our system, we will let the designer choose a sub class\n * to make active for this element.\n *\n * Currently a ServiceTask performs a dedicated operation on the server.\n * - performing a query, looking up data, etc...\n *\n */\nconst ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar ABProcessTaskServiceDefaults = {\n category: \"task\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"TaskService\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class ABProcessTaskServiceCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.service\";\n super(attributes, process, AB, ABProcessTaskServiceDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskServiceDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Service Task\",\n actionName: \"replace-with-service-task\",\n className: \"bpmn-icon-service\",\n target: {\n type: \"bpmn:ServiceTask\",\n },\n };\n }\n\n /*\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n * /\n super.fromValues(attributes);\n\n ABProcessTaskServiceDefaults.fields.forEach((f) => {\n this[f] = attributes[f];\n });\n }\n */\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n\n ABProcessTaskServiceDefaults.fields.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {\n userFormID: null,\n userFormResponse: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n /*\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n return [\n {\n key: `${this.id}.userFormResponse`,\n label: `${this.label}->Response`\n }\n ];\n }\n */\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n /*\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.id) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n return null;\n }\n */\n};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nconst ABProcessTaskGetResetPasswordUrlDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"plus-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"GetResetPasswordUrl\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"email\"],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class ABProcessTaskGetResetPasswordUrlCore extends (\n ABProcessElement\n) {\n constructor(attributes, process, AB) {\n attributes.type =\n attributes.type || \"process.task.service.getResetPasswordUrl\";\n super(attributes, process, AB, ABProcessTaskGetResetPasswordUrlDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskGetResetPasswordUrlDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n return {\n key: `${this.id}.url`,\n label: `${this.label}->URL`,\n };\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nlet InsertRecordDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"plus-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"InsertRecord\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"objectID\",\n \"fieldValues\",\n \"isRepeat\",\n \"repeatMode\",\n \"repeatColumn\",\n ],\n};\n\nmodule.exports = class InsertRecordCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.service.insertRecord\";\n super(attributes, process, AB, InsertRecordDefaults);\n\n this.results = [];\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return InsertRecordDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.isRepeat = JSON.parse(attributes.isRepeat || false);\n }\n\n get startElement() {\n let startElem = null;\n let currProcess = this.process;\n\n // Find the start (trigger) task\n while (!startElem && currProcess) {\n startElem = currProcess.elements(\n (elem) => elem?.defaults?.category == \"start\"\n )[0];\n\n // If .currProcess is a sub task, then go to the parent process for get the start task\n currProcess = currProcess.process;\n }\n\n return startElem;\n }\n\n get previousElement() {\n return this.process.connectionPreviousTask(this)[0];\n }\n\n get objectOfStartElement() {\n let startElem = this.startElement;\n if (!startElem) return null;\n\n let startElemObj = this.AB.objectByID(startElem.objectID);\n return startElemObj;\n }\n\n get objectOfPrevElement() {\n let prevElem = this.previousElement;\n if (!prevElem) return null;\n\n let objectID;\n switch (prevElem.type) {\n case \"process.task.service.query\":\n objectID = prevElem.qlObj ? prevElem.qlObj.objectID : null;\n break;\n case \"process.task.service.insertRecord\":\n default:\n objectID = prevElem.objectID;\n break;\n }\n\n return this.AB.objectByID(objectID);\n }\n\n get fieldRepeat() {\n let obj = this.objectOfStartElement;\n if (!obj) return null;\n\n return obj.fields((f) => f.id == this.repeatColumn)[0];\n }\n\n /**\n * processDataFields()\n * return a single available data field from this element\n * this will be the record inserted by this task\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n return [\n {\n key: `${this.id}.[PK]`,\n label: `${this.label}-> Inserted record [PK]`,\n field: {\n id: this.id,\n object: { id: this.objectID },\n key: \"InsertedRecord\",\n columnName: \"uuid\",\n },\n object: this.objectID,\n set: true,\n },\n ];\n }\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n \n AccountingBatchProcessingDefaults.settings.forEach((f) => {\n data[f] = this[f];\n });\n \n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nconst ABQLManager = require(\"../../../platform/ql/ABQLManager.js\");\n\nconst ABProcessTaskServiceQueryDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"TaskServiceQuery\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"qlObj\"],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class ABProcessTaskServiceQueryCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.service.query\";\n super(attributes, process, AB, ABProcessTaskServiceQueryDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskServiceQueryDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n // Before we make instances of qlObj:\n this._datasources = [];\n\n // comvert our qlObj into an ABQLxxx instance.\n if (this.qlObj) {\n this.qlObj = ABQLManager.fromAttributes(this.qlObj, this, this.AB);\n }\n }\n\n /**\n * @method toObj()\n * properly compile the current state of this object instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n toObj() {\n const data = super.toObj();\n\n // convert qlObj into obj format:\n if (this.qlObj) data.qlObj = this.qlObj.toObj();\n\n return data;\n }\n\n registerDatasource(obj) {\n this._datasources.push(obj);\n }\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n const myDefaults = {\n instanceVariable1: null,\n instanceVariable2: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n let fields = null;\n\n if (this._datasources.length > 0) {\n fields = [];\n\n this._datasources.forEach((s) => {\n const param = s.processDataField(this.id, this.label);\n\n if (param) {\n fields.push(param);\n }\n });\n }\n\n return fields;\n }\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n processData(instance, key) {\n const parts = key.split(\".\");\n\n if (parts[0] === this.id) {\n const myState = this.myState(instance);\n\n return myState[parts[1]];\n }\n\n return null;\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nlet SubProcessDefaults = {\n category: \"task\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"object-group\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"SubProcess\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"isEnable\",\n \"parameterId\",\n \"connectionAttrs\",\n \"elementIDs\",\n \"loopType\",\n ],\n};\n\nconst NOSPAM = {\n /*message : bool */\n};\n// prevent sending the same message over and over.\n\nmodule.exports = class SubProcessCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.service.subProcess\";\n super(attributes, process, AB, SubProcessDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return SubProcessDefaults;\n }\n\n static DiagramReplace() {\n // taken from \"bpmn-js/lib/features/replace/ReplaceOptions\"\n return {\n label: \"Sub Process\",\n actionName: \"replace-with-subprocess\",\n className: \"bpmn-icon-subprocess-expanded\",\n target: {\n type: \"bpmn:SubProcess\",\n isExpanded: true,\n },\n };\n }\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n // Convert string to boolean\n this.isEnable = this.isEnable == null ? true : JSON.parse(this.isEnable);\n\n let currElements = this._elements || {};\n this._unknownElementIDs = [];\n this._elements = {};\n (attributes.elementIDs || []).forEach((eID) => {\n let ele = this.AB.processElementNew(eID, this);\n if (ele) {\n this._elements[eID] = ele;\n } else {\n // current eID isn't one of our definitions yet, so might be\n // a temporary .diagramID from an unsaved task:\n if (currElements[eID]) {\n this._elements[eID] = currElements[eID];\n } else {\n this._unknownElementIDs.push(eID);\n }\n }\n });\n\n this._unknownElementIDs.forEach((eID) => {\n let key = `Process[${this.processID}] Task[${this.label}] is referencing an unknown element id:[${eID}]`;\n if (!NOSPAM[key]) {\n let err = new Error(key);\n this.AB.notify.builder(err, { processTask: this.id, eID });\n NOSPAM[key] = true;\n }\n });\n\n this._connections = attributes.connectionAttrs || {};\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n let data = super.toObj();\n\n data.elementIDs = [];\n for (let e in this._elements) {\n data.elementIDs.push(this._elements[e].id);\n }\n\n data.connectionAttrs = this._connections;\n\n return data;\n }\n\n /**\n * @method processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @param {ABProcessElement} currElement\n * the ABProcessElement that is requesting the data.\n * @return {array} | null\n */\n processDataFields(currElement) {\n if (this.parameterId == null) return [];\n\n // only call processDataFields once, filter it to get the different queries\n let dataFieldsAll = this.process.processDataFields(this) || [];\n\n // get the subtask data\n let dataFieldOpt = dataFieldsAll.filter(\n (opt) => opt.key === this.parameterId\n )[0];\n\n // get data from insert tasks\n let dataFieldsAllInserted = dataFieldsAll.filter(\n (opt) => (opt?.field?.key ?? opt?.field) === \"InsertedRecord\"\n );\n\n if (dataFieldOpt == null) return [];\n\n let result = [];\n\n // Connect field type\n if (\n dataFieldOpt.field &&\n dataFieldOpt.field.key == \"connectObject\" &&\n dataFieldOpt.field.datasourceLink &&\n dataFieldOpt.field.datasourceLink.fields\n ) {\n result.push({\n key: `${this.id}.uuid`,\n label: `${this.label}->Repeat Data.ID`,\n object: dataFieldOpt.field.datasourceLink,\n });\n\n dataFieldOpt.field.datasourceLink.fields().forEach((f) => {\n result.push({\n key: `${this.id}.${f.id}`,\n label: `${this.label}->Repeat Data.${f.label}`,\n field: f,\n object: f.object,\n });\n });\n }\n // Other field types\n else {\n result.push({\n key: dataFieldOpt.field\n ? `${this.id}.${dataFieldOpt.field.id}`\n : `${this.id}.subProcess`,\n label: `${this.label}->Repeat Data`,\n field: dataFieldOpt.field,\n object: dataFieldOpt.object,\n });\n }\n\n dataFieldsAllInserted.forEach((opt) => {\n result.push({\n key: `${opt.key || opt.id}`,\n label: `Parent Process Data->${opt.label}`,\n field: opt.field,\n object: opt.object,\n });\n });\n\n // Get any tasks that exist inside the subprocess\n let previousFields = this.process.processDataFields.call(\n this,\n currElement\n );\n if (previousFields && previousFields.length > 0) {\n result = result.concat(previousFields);\n }\n\n return result;\n }\n\n /**\n * @method processData()\n * return an array of avaiable ABObjects that are represented\n * by the data previous ProcessElements are working with.\n * @param {ABProcessElement} currElement\n * the ABProcessElement that is requesting the data.\n * @return {array} | null\n */\n processData(currElement, params) {\n let instance = params[0];\n let key = params[1];\n let data;\n\n if (instance && key?.startsWith?.(this.id)) {\n let fieldId = key.split(\".\")[1];\n let myState = this.myState(instance);\n let stateData = myState ? myState.data : null;\n data = stateData;\n\n if (stateData && fieldId) {\n let dataFieldOpt = (\n this.process.processDataFields(this) || []\n ).filter((opt) => opt.key == this.parameterId)[0];\n\n if (dataFieldOpt?.field?.key == \"connectObject\") {\n if (!Array.isArray(stateData)) stateData = [stateData];\n\n // Extract data\n data = stateData.map((item) => {\n if (fieldId == \"uuid\" || fieldId == \"id\") {\n return item.uuid || item.id || item;\n } else if (dataFieldOpt.field.datasourceLink) {\n let returnField = dataFieldOpt.field.datasourceLink.fields(\n (f) => f.id == fieldId\n )[0];\n if (returnField) return item[returnField.columnName];\n else return item;\n }\n });\n }\n }\n }\n\n // Filter none data items\n if (Array.isArray(data)) data = data.filter((d) => d != null);\n\n if (data == null || data.length == 0)\n data = this.process.processData.call(this, currElement, params);\n\n if (data == null || data.length == 0)\n data = this.process.processData(this, params);\n\n return data;\n }\n\n allPreviousTasks(...params) {\n return this.process.allPreviousTasks.call(this, ...params);\n }\n\n allPreviousConnectionsForElement(...params) {\n return this.process.allPreviousConnectionsForElement.call(\n this,\n ...params\n );\n }\n\n allPreviousConnectionsForConnection(...params) {\n return this.process.allPreviousConnectionsForConnection.call(\n this,\n ...params\n );\n }\n\n //\n // Diagram Elements\n //\n\n /**\n * @method connections()\n * return an array of connections that describe the relationships between\n * our process elements.\n * @param {fn} fn an iterator that returns true if the provided element\n * should be returned.\n * @return [{SimpleConnectionObj}]\n */\n connections(fn) {\n return this.process.connections.call(this, fn);\n }\n\n /**\n * @method connectionForDiagramID()\n * return the connection for the given diagram id\n * @param {string} dID\n * the bpmn:Element diagram id\n */\n connectionForDiagramID(dID) {\n if (!dID) return;\n\n return this.process.connectionForDiagramID.call(this, dID);\n }\n\n /**\n * @method connectionsIncoming()\n * return the connections that are entering this Element\n * @param {string} dID\n * the bpmn:Element diagram id\n */\n connectionsIncoming(dID) {\n if (!dID) return;\n\n return this.process.connectionsIncoming.call(this, dID);\n }\n\n /**\n * @method connectionsOutgoing()\n * return the connections that are leaving this Element\n * @param {string} dID\n * the bpmn:Element diagram id\n */\n connectionsOutgoing(dID) {\n if (!dID) return;\n\n return this.process.connectionsOutgoing.call(this, dID);\n }\n\n /**\n * @method connectionRemove()\n * remove the connection info for the given bpmn:element\n * @param {BMPNDiagramOBJ} element\n * the {element} returned from the BPMN.io modeling library event.\n */\n connectionRemove(element) {\n if (!element) return;\n\n this.process.connectionRemove.call(this, element);\n }\n\n /**\n * @method connectionSimplyElement()\n * given a BPMN diagram element, return a simplified object that describes\n * the connection between two elements.\n * @param {BMPNDiagramOBJ} element\n * the {element} returned from the BPMN.io modeling library event.\n * @return {SimpleConnectionObj}\n * .id : {string} diagram id of the connection element\n * .type : {string} the type of connection\n * .from : {string} the diagram id of the source element\n * .to : {string} the diagram id of the dest element\n */\n connectionSimplyElement(element) {\n if (!element) return;\n\n return this.process.connectionSimplyElement.call(this, element);\n }\n\n /**\n * @method connectionUpsert()\n * add or update the connection information for the given bpmn:element\n * @param {BMPNDiagramOBJ} element\n * the {element} returned from the BPMN.io modeling library event.\n */\n connectionUpsert(element) {\n if (!element) return;\n\n this.process.connectionUpsert.call(this, element);\n }\n\n /**\n * @method connectionPreviousTask()\n * return the ABProcessElement(s) that was a previous Element\n * (eg connects to) this element.\n * @param {ABProcessElement} currElement\n * @return {array}\n */\n connectionPreviousTask(currElement) {\n if (!currElement) return;\n\n return this.process.connectionPreviousTask.call(this, currElement);\n }\n\n /**\n * @method elements()\n * return an array of elements that match the given filter (or all elements\n * if no filter is provided).\n * @param {fn} fn an iterator that returns true if the provided element\n * should be returned.\n * @return {[ABProcessTask, ABProcessParticipant, etc...]}\n */\n elements(fn = () => true) {\n return this.process.elements.call(this, fn);\n }\n\n /**\n * @method elementAdd()\n * insert an element to be tracked by this process.\n * @param {ABProcessElement} element\n * the full instance of an ABProcessElement to track.\n */\n elementAdd(element) {\n if (!element) return;\n\n this.process.elementAdd.call(this, element);\n }\n\n /**\n * @method elementForDiagramID()\n * return the object that is tied to the given xml diagram ID.\n * @param {string} dID the diagram ID\n * @return {ABProcess[OBJ]}\n */\n elementForDiagramID(dID) {\n if (!dID) return null;\n\n return this.process.elementForDiagramID.call(this, dID);\n }\n\n /**\n * @method elementRemove()\n * remove an element from being tracked by this process.\n * @param {obj|ABProcessElement} def\n * a definition of, or full Object instance of the ABProcessElement\n * to remove.\n */\n elementRemove(def) {\n if (!def) return;\n\n this.process.elementRemove.call(this, def);\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nconst ABFieldList = require(\"../../../platform/dataFields/ABFieldList.js\");\n\nvar ABProcessTaskApprovalDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [\"userFormID\", \"userFormResponse\"],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"Approval\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"who\", \"toUsers\", \"formBuilder\"],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class ABProcessTaskUserApprovalCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.user.approval\";\n super(attributes, process, AB, ABProcessTaskApprovalDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskApprovalDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n super.fromValues(attributes);\n\n function fixBoolean(obj) {\n if (obj) {\n Object.keys(obj).forEach((k) => {\n if (obj[k] == \"false\") {\n obj[k] = false;\n } else if (obj[k] == \"true\") {\n obj[k] = true;\n } else if (typeof obj[k] == \"object\") {\n fixBoolean(obj[k]);\n }\n });\n }\n }\n fixBoolean(this.formBuilder);\n }\n\n /**\n * @method toObj()\n * properly compile the current state of this object instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n /* \n toObj() {\n var data = super.toObj();\n\n ABProcessTaskApprovalDefaults.fields.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n*/\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {};\n ABProcessTaskApprovalDefaults.instanceValues.forEach((v) => {\n myDefaults[v] = null;\n });\n\n super.initState(context, myDefaults, val);\n }\n*/\n\n /*\n * preProcessFormIOComponents()\n * we need to parse the form.io components to ensure the proper columnName\n * and labels are being used. We also will translate the columnNames at this\n * point in the code\n */\n preProcessFormIOComponents() {\n var fields = this.process.processDataFields(this);\n if (fields && this.formBuilder && this.formBuilder.components) {\n this.formBuilder.components.forEach((c) => {\n if (c.abFieldID) {\n fields.filter((entry) => {\n if (entry.field?.id == c.abFieldID) {\n c.label = entry.field.label;\n c.key = entry.key;\n if (c.data?.values && entry.field.settings.options) {\n var vals = [];\n entry.field.settings.options.forEach((opt) => {\n vals.push({\n label: opt.text,\n value: opt.id,\n });\n });\n c.data.values = vals;\n }\n }\n });\n } else if (c.components && c.components.length) {\n c.key = c.path;\n c.components.forEach((o) => {\n if (o.abFieldID) {\n // these are plucked conneted values\n // gather up all their fields to be used\n var pluck = fields.filter((f) => {\n return f.key == c.path;\n })[0];\n if (!pluck) return;\n pluck.object.fields().filter((entry) => {\n if (entry?.id == o.abFieldID) {\n o.label = entry.label;\n o.key = entry.columnName;\n if (o.data?.values && entry.settings.options) {\n var vals = [];\n entry.settings.options.forEach((opt) => {\n vals.push({\n label: opt.text,\n value: opt.id,\n });\n });\n o.data.values = vals;\n }\n }\n });\n }\n });\n }\n });\n }\n return this.formBuilder;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n // we need to get the button events defined by the form.io formBuilder\n var options = [];\n this.formBuilder.components.forEach((comp) => {\n if (comp.type == \"button\" && comp.action == \"event\" && comp.event) {\n options.push({\n id: comp.event,\n text: comp.label,\n });\n }\n });\n // in this Task, we can return the Response to the UserForm\n // The Response can be in the form of a List Field, with one or more\n // return options.\n\n var myID = this.diagramID;\n\n // create an ABFieldList object:\n // make sure the options follow what is currently defined for our\n // responses:\n var myObj = this.AB.objectNew({});\n var listField = new ABFieldList(\n {\n id: `${myID}.userFormResponse`,\n label: `${this.label}->Response`,\n columnName: `${myID}.userFormResponse`,\n settings: {\n options: options,\n },\n },\n myObj\n );\n\n // NOTE: We are pretending our response is a type of ABFieldList. But our\n // ABField objects no longer allow \".\" in our columnNames:\n // ( https://github.com/CruGlobal/appbuilder_class_core/blob/212cf5fa1c1d5c959aa246c730582ed50809ee0f/dataFields/ABFieldCore.js#L262 )\n // But our Process tasks really will be expecting it there so lets put\n // it back:\n listField.columnName = `${myID}.userFormResponse`;\n\n return [\n {\n key: `${myID}.userFormResponse`,\n label: `${this.label}->Response`,\n field: listField,\n object: null,\n },\n ];\n }\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n processData(instance, key) {\n if (key) {\n var parts = key.split(\".\");\n if (parts[0] == this.diagramID) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n }\n return null;\n }\n};\n","/**\n * ABProcessTaskUserCore\n *\n * This defines the base User Task element that can be placed on a BPMN\n * diagram. In our system, we will let the designer choose a sub class\n * to make active for this element.\n *\n * Currently a UserTask expects a human user to perform an action. These\n * actions are in the possible forms:\n * - confirm offline action\n * - approve data\n * - fill out a form\n *\n */\n\nconst ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar ABProcessTaskUserDefaults = {\n category: \"task\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"user\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"TaskUser\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class ABProcessTaskUserCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.user\";\n super(attributes, process, AB, ABProcessTaskUserDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskUserDefaults;\n }\n\n static DiagramReplace() {\n // taken from \"bpmn-js/lib/features/replace/ReplaceOptions\"\n return {\n label: \"User Task\",\n actionName: \"replace-with-user-task\",\n className: \"bpmn-icon-user\",\n target: {\n type: \"bpmn:UserTask\",\n },\n };\n }\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * do()\n * this method actually performs the action for this task.\n * @param {obj} instance the instance data of the running process\n * @return {Promise}\n * resolve(true/false) : true if the task is completed.\n * false if task is still waiting\n */\n // do(instance) {\n // return new Promise((resolve, reject) => {\n // // for testing:\n // var myState = this.myState(instance);\n // myState.status = \"completed\";\n // this.log(instance, \"Email Sent successfully\");\n // resolve(true);\n // });\n // }\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n initState(context, val) {\n var myDefaults = {\n roles: [],\n ui: null,\n };\n\n super.initState(context, myDefaults, val);\n }\n};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nconst ABProcessTaskUserExternalDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"plus-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [\"userFormID\", \"userFormResponse\"],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"External\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"who\", \"toUsers\", \"url\"],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nconst settings = {\n who: 0,\n toUsers: null,\n url: \"\",\n};\n\nmodule.exports = class ABProcessTaskUserExternalCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n for (const key in settings)\n attributes[key] = attributes[key] ?? settings[key];\n super(\n Object.assign(\n {\n type: \"process.task.service.external\",\n },\n attributes\n ),\n process,\n AB,\n ABProcessTaskUserExternalDefaults\n );\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskUserExternalDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n return [\n {\n key: `${this.id}.userFormResponse`,\n label: `${this.label}->Response`,\n },\n ];\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nconst ABProcessTaskUserFormDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"form\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [\"\"],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"Form\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"formBuilder\"],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nconst settings = {};\n\nmodule.exports = class ABProcessTaskUserFormCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n for (const key in settings)\n attributes[key] = attributes[key] ?? settings[key];\n super(\n Object.assign(\n {\n type: \"process.task.service.form\",\n },\n attributes\n ),\n process,\n AB,\n ABProcessTaskUserFormDefaults\n );\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskUserFormDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n return (this.formBuilder?.components ?? [])\n .filter((comp) => comp.type != \"button\")\n .map((comp) => {\n return {\n key: comp.key,\n label: `${this.label}->${comp.label}`,\n };\n });\n }\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n processData(instance, key) {\n if (!key) return null;\n\n const myState = this.myState(instance);\n\n return myState[key];\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar ABProcessTriggerDefaults = {\n category: \"start\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n fields: [],\n // fields: {array}\n // a list of internal setting values this Element tracks\n\n icon: \"key\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n key: \"Trigger\",\n // key: {string}\n // unique key to reference this specific Task\n};\n\nmodule.exports = class ABProcessTriggerCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"trigger\";\n super(attributes, process, AB, ABProcessTriggerDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTriggerDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Signal Start Event\",\n actionName: \"replace-with-signal-start\",\n className: \"bpmn-icon-start-event-signal\",\n target: {\n type: \"bpmn:StartEvent\",\n // type: {string} the general bpmn category\n // \"StartEvent\", \"Task\", \"EndEvent\", \"ExclusiveGateway\"\n eventDefinitionType: \"bpmn:SignalEventDefinition\",\n },\n };\n }\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.triggerKey = attributes.triggerKey || \"triggerKey.??\";\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var data = super.toObj();\n\n data.triggerKey = this.triggerKey;\n\n return data;\n }\n};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessTrigger = require(\"../../../platform/process/tasks/ABProcessTrigger.js\");\n\nvar ABProcessTaskTriggerLifecycleDefaults = {\n category: \"start\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n fields: [\n \"objectID\",\n \"lifecycleKey\" /* , \"triggerKey\" is tracked in ABProcessTrigger */,\n ],\n // fields: {array}\n // a list of internal setting values this Element tracks\n\n icon: \"key\",\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n key: \"TriggerLifecycle\",\n // key: {string}\n // unique key to reference this specific Task\n};\n\nmodule.exports = class ABProcessTriggerLifecycle extends ABProcessTrigger {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"trigger\";\n super(attributes, process, AB, ABProcessTaskTriggerLifecycleDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskTriggerLifecycleDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Object Lifecycle Trigger\",\n actionName: \"replace-with-signal-lifecycle-start\",\n // type: {string} a unique key to reference this element\n className: \"bpmn-icon-start-event-signal\",\n target: {\n type: \"bpmn:StartEvent\",\n // type: {string} the general bpmn category\n // \"StartEvent\", \"Task\", \"EndEvent\", \"ExclusiveGateway\"\n eventDefinitionType: \"ab:SignalLifecycle\",\n },\n };\n }\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.objectID = attributes.objectID || \"objID.??\";\n this.lifecycleKey = attributes.lifecycleKey || \"lifecycle.key??\";\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var data = super.toObj();\n\n data.objectID = this.objectID;\n data.lifecycleKey = this.lifecycleKey;\n return data;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n var fields = null;\n if (this.objectID) {\n fields = [];\n var object = this.AB.objectByID(this.objectID);\n if (object) {\n var myID = this.diagramID;\n object.fields().forEach((field) => {\n fields.push({\n key: `${myID}.${field.id}`,\n label: `${this.label}->${object.label}->${field.label}`,\n field,\n object,\n });\n });\n fields.push({\n key: `${myID}.uuid`,\n label: `${this.label}->${object.label}`,\n field: null,\n object,\n });\n } else {\n // OK, so we have an this.objectID defined, but we can't find it.\n // that's something we need to alert:\n var error = new Error(\n `ABProcessTriggerLifecycleCore.processDataFields():TaskID[${this.id}]: could not find referenced object by ID [${this.objectID}]`\n );\n this.AB.notify.builder(error, {\n task: this.id,\n objID: this.objectID,\n });\n }\n }\n return fields;\n }\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.diagramID) {\n var myState = this.myState(instance);\n if (myState[\"data\"]) {\n var object = this.AB.objectByID(this.objectID);\n var field = object.fields((f) => {\n return f.id == parts[1];\n })[0];\n if (field) {\n if (parts[2]) {\n return field[parts[2]].call(field, myState[\"data\"]);\n } else {\n // instance.context.data[field.column_name];\n // if field is \"calculate\" or \"TextFormula\" data is not stored\n // in data base and we need to run format method\n if ([\"calculate\", \"TextFormula\"].indexOf(field.key) != -1) {\n return field.format(myState[\"data\"]);\n } else if (\n field.key == \"connectObject\" ||\n field.key == \"user\"\n ) {\n return (\n myState[\"data\"][field.relationName()] ||\n myState[\"data\"][field.columnName]\n );\n } else {\n return myState[\"data\"][field.columnName];\n }\n }\n } else if (parts[1] == \"uuid\") {\n return myState[\"data\"][\"uuid\"];\n } else {\n ///\n /// Questioning the validity of this section of code.\n /// In order to get here, we tried to find field, and it\n /// didn't exist.\n /// then we turn around and REPEAT the same attempt\n /// and check for field again.\n /*\n // parts[1] should be a field.id\n object = this.AB.objectByID(this.objectID);\n field = object.fields((f) => {\n return f.id == parts[1];\n })[0];\n if (field) {\n if (parts[2]) {\n return field[parts[2]].call(field, myState[\"data\"]);\n } else {\n // instance.context.data[field.column_name];\n return myState[\"data\"][field.columnName];\n }\n }\n */\n }\n }\n }\n return null;\n }\n\n /**\n * processDataObjects()\n * return an array of avaiable ABObjects that this element\n * can provide to other ProcessElements.\n * @return {array} | null\n */\n processDataObjects() {\n var objects = null;\n if (this.objectID) {\n objects = [this.AB.objectByID(this.objectID)];\n }\n return objects;\n }\n};\n","const ABProcessTrigger = require(\"../../../platform/process/tasks/ABProcessTrigger.js\");\n\nvar ABProcessTaskTriggerLifecycleDefaults = {\n category: \"start\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n fields: [\n \"repeatEvery\",\n \"repeatTime\",\n \"repeatDaily\",\n \"repeatWeekly\",\n \"repeatMonthly\",\n \"isEnabled\",\n ],\n // fields: {array}\n // a list of internal setting values this Element tracks\n\n icon: \"clock-o\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n key: \"TimerStartEvent\",\n // key: {string}\n // unique key to reference this specific Task\n\n repeatEvery: \"daily\",\n repeatTime: \"01:00\",\n repeatDaily: \"day\",\n repeatWeekly: \"FRI\",\n repeatMonthly: \"last\",\n isEnabled: true,\n};\n\nmodule.exports = class ABProcessTriggerTimer extends ABProcessTrigger {\n constructor(attributes, process, application) {\n attributes.type = attributes.type || \"trigger\";\n super(\n attributes,\n process,\n application,\n ABProcessTaskTriggerLifecycleDefaults\n );\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskTriggerLifecycleDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Timer Start Event\",\n actionName: \"replace-with-signal-timer-start\",\n // type: {string} a unique key to reference this element\n className: \"bpmn-icon-start-event-timer\",\n target: {\n type: \"bpmn:StartEvent\",\n // type: {string} the general bpmn category\n // \"StartEvent\", \"Task\", \"EndEvent\", \"ExclusiveGateway\"\n eventDefinitionType: \"ab:SignalTriggerTimer\",\n },\n };\n }\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.repeatEvery =\n attributes.repeatEvery ||\n ABProcessTaskTriggerLifecycleDefaults.repeatEvery;\n\n this.repeatDaily =\n attributes.repeatDaily ||\n ABProcessTaskTriggerLifecycleDefaults.repeatDaily;\n\n this.repeatWeekly =\n attributes.repeatWeekly ||\n ABProcessTaskTriggerLifecycleDefaults.repeatWeekly;\n\n this.repeatMonthly =\n attributes.repeatMonthly ||\n ABProcessTaskTriggerLifecycleDefaults.repeatMonthly;\n\n // Convert UTC to local time\n if (attributes.repeatTime) {\n let timeVals = attributes.repeatTime.split(\":\");\n let currDate = new Date();\n currDate.setUTCHours(timeVals[0]);\n currDate.setUTCMinutes(timeVals[1]);\n this.repeatTime = `${currDate.getHours()}:${currDate.getMinutes()}`;\n } else {\n this.repeatTime = ABProcessTaskTriggerLifecycleDefaults.repeatTime;\n }\n\n if (typeof attributes.isEnabled != \"undefined\") {\n this.isEnabled = JSON.parse(attributes.isEnabled);\n } else {\n this.isEnabled = ABProcessTaskTriggerLifecycleDefaults.isEnabled;\n }\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var data = super.toObj();\n\n data.repeatEvery = this.repeatEvery;\n data.repeatDaily = this.repeatDaily;\n data.repeatWeekly = this.repeatWeekly;\n data.repeatMonthly = this.repeatMonthly;\n\n // Convert local time to UTC\n data.repeatTime = this.repeatTime;\n if (data.repeatTime && data.repeatTime instanceof Date) {\n data.repeatTime = `${data.repeatTime.getUTCHours()}:${data.repeatTime.getMinutes()}`;\n }\n\n data.isEnabled = this.isEnabled;\n\n return data;\n }\n\n getCronExpression() {\n let timeVals = this.repeatTime.split(\":\");\n let second = \"*\";\n let minute = timeVals[1];\n let hour = timeVals[0];\n let day;\n let month;\n let dayWeek;\n let year = \"*\";\n\n switch (this.repeatEvery) {\n case \"daily\":\n day = \"*\";\n month = \"*\";\n dayWeek = this.repeatDaily == \"weekday\" ? \"1-5\" : \"*\";\n break;\n case \"weekly\":\n day = \"*\";\n month = \"*\";\n dayWeek = this.repeatWeekly;\n break;\n case \"monthly\":\n day = this.repeatMonthly;\n month = \"*\";\n dayWeek = \"*\";\n break;\n }\n\n return `${second} ${minute} ${hour} ${day} ${month} ${dayWeek} ${year}`;\n }\n};\n","/*\n * ABQL\n *\n * An ABQL defines the base class for our AB Query Language Objects.\n * These classes share a common way to\n * - parse input strings for commands\n *\n *\n */\nvar ABEmitter = require(\"../../platform/ABEmitter\");\nclass ABQLCore extends ABEmitter {\n constructor(attributes, parameterDefinitions, prevOP, task, AB) {\n super();\n\n // manage the incoming Parameter Definitions\n if (!Array.isArray(parameterDefinitions)) {\n parameterDefinitions = [parameterDefinitions];\n }\n\n this.parameterDefinitions = parameterDefinitions;\n\n this.object = prevOP ? prevOP.object : null;\n // {ABObject}\n // The current {ABObject} the current Query Language Operation is associated\n // with.\n\n // if the previous Operation defined an .objectOut then our .object is THAT\n // one.\n if (prevOP && prevOP.objectOut) this.object = prevOP.objectOut;\n\n this.prevOP = prevOP;\n this.task = task;\n // {ABProcessTaskxxx}\n // This is running under a specific ABProcessTaskServiceQuery. When\n // searching for data from the Process, we must go through this.task\n // to do so.\n\n this.AB = AB;\n this.next = null;\n\n this.fromAttributes(attributes);\n }\n\n ///\n /// Instance Methods\n ///\n initObject(attributes) {}\n\n fromAttributes(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n\n // super.fromValues(attributes);\n this.key = this.constructor.key ?? null;\n\n // this.entryComplete = attributes.entryComplete || false;\n this.params = attributes.params ?? {};\n // {hash}\n // The configuration values entered by the AppBuilder UI for this\n // operation.\n\n this.objectID = attributes.objectID || null;\n\n // be sure to do a hard lookup if an objectID was saved:\n if (this.objectID) this.object = this.objectLookup(this.objectID);\n\n this.initObject(attributes);\n\n // at least dump a warning here:\n if (this.objectID && !this.object)\n this.AB.notify.developer(\n new Error(\n `ABQLCore.fromAttributes(): unable to initialize ABObject [${this.objectID}]`\n ),\n {\n attributes,\n objectID: this.objectID,\n }\n );\n\n if (attributes.next) {\n let nextOP = null;\n\n (this.NextQLOps ?? this.constructor.NextQLOps).forEach((OP) => {\n if (OP.key === attributes.next.key) nextOP = OP;\n });\n\n if (nextOP) {\n // exact match, so add next:\n const qlOP = new nextOP(attributes.next, this, this.task, this.AB);\n\n this.next = qlOP;\n }\n }\n }\n\n /**\n * @method objectLookup()\n * return a matching {ABObject} that is represented by the given id.\n * NOTE: we will try to match on: our initial .objectID first, then\n * the given objID.\n * NOTE: this will match an object.id as well as object.label\n * @param {string} objID\n */\n objectLookup(objID) {\n return this.AB.objects((o) => {\n const quotedLabel = `\"${o.label}\"`;\n\n return (\n // o.id === this.objectID ||\n o.id === objID || quotedLabel.indexOf(objID) === 0\n );\n })[0];\n }\n\n /**\n * @method availableProcessDataFieldsHash()\n * return a { \"field.key\" => {processFieldDef} } hash of the currently\n * available fields in the process.\n * @return {obj}\n */\n availableProcessDataFieldsHash() {\n const availableProcessDataFields =\n this.task.process.processDataFields(this.task) ?? [];\n const hashFieldIDs = {};\n\n availableProcessDataFields.forEach((f) => {\n if (f.field) {\n hashFieldIDs[f.field.id] = f;\n } else {\n hashFieldIDs[f.key] = f;\n }\n });\n\n return hashFieldIDs;\n }\n\n /*\n * @method paramChanged()\n * respond to an update to the given parameter.\n * NOTE: the value will ALREADY be saved in this.params[pDef.name].\n * @param {obj} pDef\n * the this.parameterDefinition entry of the parameter that was\n * changed.\n */\n paramChanged(pDef) {}\n\n /**\n * @method toObj()\n * properly compile the current state of this ABQL instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n toObj() {\n const obj = {\n key: this.constructor.key,\n // entryComplete: this.entryComplete,\n params: this.params,\n // currQuery: this.currQuery,\n // queryValid: this.queryValid,\n objectID: this.object?.id ?? null,\n };\n\n if (this.next) {\n obj.next = this.next.toObj();\n }\n\n return obj;\n }\n}\n\nmodule.exports = ABQLCore;\n","/*\n * ABQLFindCore\n *\n * An ABQLFind depends on a BASE QL object (Object, Datacollection, Query)\n * and can perform a DB query based upon that BASE object.\n *\n */\n\nconst ABQL = require(\"../../platform/ql/ABQL.js\");\nconst NextQLOps = require(\"./ABQLSet.js\");\n// {array} of {ABQLxxx} options\n// this is an array of what possible next Operations can come after an\n// ABQLFind task is complete. In this case the {ABQLSet} operations come\n// next. {ABQLSet} operations work on a Set|{Array} or data results.\n\nconst ParameterDefinitions = [\n {\n type: \"objectConditions\",\n name: \"cond\",\n },\n];\n\nclass ABQLFindCore extends ABQL {\n constructor(attributes, prevOP, task, AB) {\n super(attributes, ParameterDefinitions, prevOP, task, AB);\n }\n\n ///\n /// Instance Methods\n ///\n}\n\nABQLFindCore.key = \"find\";\nABQLFindCore.label = \"find\";\nABQLFindCore.NextQLOps = NextQLOps;\n\nmodule.exports = ABQLFindCore;\n","/*\n * ABQLManagerCore\n *\n * An interface for managing the different ABQL Operations available in our\n * AppBuilder.\n *\n */\n\nconst QLObject = require(\"../../platform/ql/ABQLRootObject.js\");\nconst QLOps = [QLObject];\n\nconst ABQLManagerCore = {\n /**\n * @method fromAttributes()\n * return an {ABQL} object that represents the given attributes that\n * were saved from the previous .toObj()\n * @param {object} attributes\n *\t\t the values returned from the previous .toObj() call\n * @param {ABProcessTask***} task\n *\t\t the current ABProcessTaskServiceQuery that contains this QL\n * @param {ABFactory} AB\n *\t\t the current ABFactory we are operating under.\n * @return {ABQL} | null\n */\n fromAttributes: function (attributes, task, AB) {\n if (!attributes) return null;\n\n const matchingOPs = [];\n\n ABQLManagerCore.QLOps.forEach((Op) => {\n if (Op.key === attributes.key) matchingOPs.push(Op);\n });\n\n if (matchingOPs.length === 1) {\n // let this Operation initialize and return the last OP\n // in the chain\n const qlOP = new matchingOPs[0](attributes, task, AB);\n\n return qlOP;\n } else return null;\n },\n\n /**\n * @array QLOps\n * An array of the root QL Operations.\n */\n QLOps: QLOps,\n};\nmodule.exports = ABQLManagerCore;\n","/*\n * ABQLRootObjectCore\n *\n * An ABQL defines a Query Language Operation. A QL Operation\n * is intended to be evaluated at run time and return a value that can be\n * assigned to form value or an object.\n *\n *\n */\n\nconst ABQL = require(\"../../platform/ql/ABQL.js\");\n\n// Define the Operations that can be performed off of a RootObject.\n// Each Root Object might have a different set of Operations, so we\n// define them here.\nconst QLFind = require(\"../../platform/ql/ABQLFind.js\");\nconst NextQLOps = [QLFind];\n\nconst ParameterDefinitions = [\n {\n type: \"objectName\",\n name: \"name\",\n },\n];\n\nclass ABQLObjectCore extends ABQL {\n constructor(attributes, task, AB) {\n // NOTE: keep this so we can insert the prevOp == null\n super(attributes, ParameterDefinitions, null, task, AB);\n }\n\n ///\n /// Instance Methods\n ///\n initObject(/* attributes */) {\n if (!this.object && this.params) {\n const objNameDef = this.parameterDefinitions.find((pDef) => {\n return pDef.type === \"objectName\";\n });\n\n if (objNameDef) {\n this.objectID = this.params[objNameDef.name];\n this.object = this.objectLookup(this.objectID);\n }\n\n if (!this.object) {\n // This function exists on platform_web but not platform_service\n this.warningMessage?.(\"has no object set.\", {\n objectID: this.objectID,\n });\n }\n }\n }\n\n toObj() {\n const obj = super.toObj();\n\n // if we don't have an objectID, but we have an objectName parameter\n // definition then save that as our objectID\n if (!obj.objectID && this.params) {\n const objNameDef = this.parameterDefinitions.find((pDef) => {\n return pDef.type === \"objectName\";\n });\n\n if (objNameDef) obj.objectID = this.params[objNameDef.name];\n }\n\n return obj;\n }\n}\n\nABQLObjectCore.key = \"object\";\nABQLObjectCore.label = \"object\";\nABQLObjectCore.NextQLOps = NextQLOps;\n\nmodule.exports = ABQLObjectCore;\n","/*\n * ABQLRow\n *\n * Defines all the QL operations that can be performed on a Row of data. This is a\n * Single row/instance of an object.\n *\n */\n\nconst QLUpdate = require(\"../../platform/ql/ABQLRowUpdate.js\");\nconst QLSave = require(\"../../platform/ql/ABQLRowSave\");\nconst QLPluck = require(\"../../platform/ql/ABQLRowPluck\");\n\nmodule.exports = [QLUpdate, QLSave, QLPluck];\n","/*\n/*\n * ABQLRowPluckCore\n *\n * An ABQLRowPluckCore can process a value of data and puck out a specified\n * field to then make an object of values that only contain that field.\n *\n */\n\n// const ABQLValue = require(\"./ABQLValue.js\");\n// const ABQLSet = require(\"./ABQLSet.js\");\nconst ABQLSetPluck = require(\"../../platform/ql/ABQLSetPluck.js\");\nconst ABQLRowUpdate = require(\"../../platform/ql/ABQLRowUpdate.js\");\nconst ABQLRowSave = require(\"../../platform/ql/ABQLRowSave.js\");\n\nclass ABQLRowPluckCore extends ABQLSetPluck {\n // Dynamic NextQLOps\n get NextQLOps() {\n let nextQLOps = [];\n\n const field = this.field ?? this.object.fieldByID(this.fieldID) ?? null;\n\n // Update .NextQLOps WARN: update to static it affects to every ABQLRowPluck instances.\n switch (field?.key) {\n // M:1 M:N connect field, then set ABQLSet to next steps\n case \"connectObject\":\n if (field.settings.linkType === \"many\") {\n // NOTE: Could not require(\"./ABQLSet.js\") on the top. It returns an empty object. Why ><\n const ABQLSet = require(\"./ABQLSet.js\");\n\n nextQLOps = ABQLSet;\n\n break;\n }\n\n // return ABQLRow.js\n nextQLOps = this.prevOP.constructor.NextQLOps.filter(\n (NextQLOp) =>\n NextQLOp.key === this.constructor.key ||\n NextQLOp.key === ABQLRowUpdate.key\n );\n\n break;\n\n case \"user\":\n // TODO set this up corectlys\n if (\n field.settings.linkType === \"many\" ||\n field.settings.isMultiple // may be unnessicary\n ) {\n // NOTE: Could not require(\"./ABQLSet.js\") on the top. It returns an empty object. Why ><\n const ABQLSet = require(\"./ABQLSet.js\");\n\n nextQLOps = ABQLSet;\n\n break;\n }\n\n // default\n nextQLOps = this.prevOP.constructor.NextQLOps.filter(\n (NextQLOp) =>\n NextQLOp.key === this.constructor.key ||\n NextQLOp.key === ABQLRowUpdate.key ||\n NextQLOp.key === ABQLRowSave.key\n );\n\n break;\n\n default:\n // Normal field and _PK\n nextQLOps = this.prevOP.constructor.NextQLOps.filter(\n (NextQLOp) => NextQLOp.key === ABQLRowSave.key\n );\n\n break;\n }\n\n return nextQLOps;\n }\n}\n\nABQLRowPluckCore.key = \"row_pluck\";\nABQLRowPluckCore.label = \"Read the value from the field\";\nABQLRowPluckCore.NextQLOps = []; // Static NextQLOps\n\nmodule.exports = ABQLRowPluckCore;\n","/*\n/*\n * ABQLRowSaveCore\n *\n * An ABQLRowSave can store the current Data set into the Process Task it is\n * in, so that this data can be made available to other Process Tasks.\n *\n */\n\nconst ABQLSetSave = require(\"../../platform/ql/ABQLSetSave.js\");\n\nclass ABQLRowSaveCore extends ABQLSetSave {}\n\nABQLRowSaveCore.key = \"row_save\";\nABQLRowSaveCore.label = \"Save the value as\";\nABQLRowSaveCore.NextQLOps = [];\n// NOTE: currently, this is an ending step. but it doesn't have to be...\n\nmodule.exports = ABQLRowSaveCore;\n","/*\n * ABQLRowUpdateCore\n *\n * An ABQLRow Update allows you to update the values on the current\n * Row of data.\n *\n */\n\nconst ABQL = require(\"../../platform/ql/ABQL.js\");\n// const ABQLRow = require(\"./ABQLRow.js\");\n\nconst ParameterDefinitions = [\n {\n type: \"objectValues\",\n name: \"values\",\n },\n];\n\nclass ABQLRowUpdateCore extends ABQL {\n constructor(attributes, prevOP, task, AB) {\n super(attributes, ParameterDefinitions, prevOP, task, AB);\n\n // #Hack! : when an Operation provides the same .NextQlOps that it\n // was defined in, we can't require it again ==> circular dependency.\n // so we manually set it here from the operation that created us:\n this.constructor.NextQLOps = prevOP.constructor.NextQLOps;\n }\n\n ///\n /// Instance Methods\n ///\n}\n\nABQLRowUpdateCore.key = \"update\";\nABQLRowUpdateCore.label = \"Update this record\";\nABQLRowUpdateCore.NextQLOps = [];\n// NOTE: .NextQLOps => see the #Hack in the constructor\n\nmodule.exports = ABQLRowUpdateCore;\n","/*\n * ABQLSet\n *\n * Here we define the group of operations that can be performed on a SET of data.\n * A SET is an array of objects/row data.\n *\n */\n\nmodule.exports = [\n require(\"../../platform/ql/ABQLSetFirst.js\"),\n require(\"../../platform/ql/ABQLSetPluck.js\"),\n require(\"../../platform/ql/ABQLSetSave.js\"),\n];\n","/*\n/*\n * ABQLSetFirstCore\n *\n * An ABQLFind depends on a BASE QL object (Object, Datacollection, Query)\n * and can perform a DB query based upon that BASE object.\n *\n */\n\nconst ABQL = require(\"../../platform/ql/ABQL.js\");\nconst ABQLRow = require(\"./ABQLRow.js\");\n// {array} of {ABQLxxx} options\n// this is an array of what possible next Operations can come after an\n// ABQLSetFirst task is complete. In this case the {ABQLRow} operations come\n// next. {ABQLRow} operations work on a single row of data.\n\nclass ABQLSetFirstCore extends ABQL {\n constructor(attributes, prevOP, task, AB) {\n super(attributes, [], prevOP, task, AB);\n }\n\n ///\n /// Instance Methods\n ///\n}\n\nABQLSetFirstCore.key = \"first\";\nABQLSetFirstCore.label = \"Select the first record\";\nABQLSetFirstCore.NextQLOps = ABQLRow;\n\nmodule.exports = ABQLSetFirstCore;\n","/*\n/*\n * ABQLSetPluckCore\n *\n * An ABQLSetPluck can process a set (array) of data and puck out a specified\n * field to then make an array of values that only contain that field.\n *\n */\n\nconst ABQL = require(\"../../platform/ql/ABQL.js\");\n// const ABQLSet = require(\"./ABQLSet.js\");\n\nconst ParameterDefinitions = [\n {\n type: \"objectFields\",\n name: \"fieldID\",\n },\n];\n\nclass ABQLSetPluckCore extends ABQL {\n constructor(attributes, prevOP, task, AB) {\n super(attributes, ParameterDefinitions, prevOP, task, AB);\n }\n\n ///\n /// Instance Methods\n ///\n\n fromAttributes(attributes) {\n // #Hack! : when an Operation provides the same .NextQlOps that it\n // was defined in, we can't require it again ==> circular dependency.\n // so we manually set it here from the operation that created us:\n this.constructor.NextQLOps = this.prevOP.constructor.NextQLOps;\n\n // we need to gather our .field and .objectOut before we\n // allow our base class to continue forward:\n\n this.fieldID = attributes.fieldID;\n this.field = this.object?.fieldByID(this.fieldID);\n\n //// TODO: figure out how to dynamically update the next row of options\n //// based upon the current choice of field.\n // // based upon the type of field, we now configure what next steps\n // // are available.\n // if (this.field) {\n // // if connected, then we can stay with same .NextQLOps\n // // so we can just leave what we did above.\n\n // // if a discreet value, then we need to remove SetPluck\n // if (!this.field.isConnection) {\n // this.constructor.NextQLOps = [\n // ...this.prevOP.constructor.NextQLOps,\n // ].filter((o) => o.key != this.constructor.key);\n // }\n // }\n\n if (attributes.objectOutID)\n this.objectOut = this.objectLookup(attributes.objectOutID);\n\n super.fromAttributes(attributes);\n }\n\n toObj() {\n const obj = super.toObj();\n\n if (this.fieldID) {\n obj.fieldID = this.fieldID;\n\n if (this.objectOut) obj.objectOutID = this.objectOut.id;\n } else {\n obj.fieldID = this.params.field || null;\n\n const field = this.object.fieldByID(obj.fieldID);\n\n if (field?.isConnection) obj.objectOutID = field.datasourceLink.id;\n }\n\n return obj;\n }\n}\n\nABQLSetPluckCore.key = \"set_pluck\";\nABQLSetPluckCore.label = \"Read the value from the field\";\nABQLSetPluckCore.NextQLOps = [];\n\nmodule.exports = ABQLSetPluckCore;\n","/*\n/*\n * ABQLSetSaveCore\n *\n * An ABQLSetSave can store the current Data set into the Process Task it is\n * in, so that this data can be made available to other Process Tasks.\n *\n */\n\nconst ABQL = require(\"../../platform/ql/ABQL.js\");\n\nconst ParameterDefinitions = [\n {\n type: \"taskParam\",\n name: \"task_param\",\n },\n];\n\nclass ABQLSetSaveCore extends ABQL {\n constructor(attributes, prevOP, task, AB) {\n super(attributes, ParameterDefinitions, prevOP, task, AB);\n\n // TODO: register with the task that we can provide data.\n if (this.taskParam) {\n task.registerDatasource(this);\n this.registered = true;\n }\n }\n\n ///\n /// Instance Methods\n ///\n\n fromAttributes(attributes) {\n // #Hack! : when an Operation provides the same .NextQlOps that it\n // was defined in, we can't require it again ==> circular dependency.\n // so we manually set it here from the operation that created us:\n this.constructor.NextQLOps = this.prevOP.constructor.NextQLOps;\n\n super.fromAttributes(attributes);\n\n this.taskParam = attributes.taskParam || this.params.task_param;\n }\n\n toObj() {\n const obj = super.toObj();\n\n obj.taskParam = this.taskParam || this.params.task_param;\n\n return obj;\n }\n\n processDataField(id, label) {\n // we have to report back on:\n // key: id.taskParam\n // label: label->taskParam\n // object: ABObject\n // field: ABField\n // set : {bool}\n\n let field = null;\n // {ABField}\n // if the value being stored is NOT a connectObject, then it is\n // a particular field in the previous object.\n\n // if we are saving a specific field of an Object, pass that\n // ABField along:\n if (this.prevOP?.field?.key !== \"connectObject\")\n field = this?.prevOP?.field;\n\n return {\n key: `${id}.${this.taskParam || this.params.task_param}`,\n label: `${label}->${this.taskParam || this.params.task_param}`,\n field: field,\n object: this.object,\n set: true,\n };\n }\n}\n\nABQLSetSaveCore.key = \"set_save\";\nABQLSetSaveCore.label = \"Save the value as\";\nABQLSetSaveCore.NextQLOps = [];\n// NOTE: currently, this is an ending step. but it doesn't have to be...\n\nmodule.exports = ABQLSetSaveCore;\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewCSVExporterDefaults = {\n key: \"csvExporter\", // unique key identifier for this ABViewForm\n icon: \"download\", // icon reference: (without 'fa-' )\n labelKey: \"CSV Exporter\", // {string} the multilingual label key for the class label\n};\n\nconst ABViewCSVExporterPropertyComponentDefaults = {\n dataviewID: null,\n where: null,\n buttonLabel: \"Export CSV\",\n filename: \"exportCSV\",\n hasHeader: true,\n width: 150,\n hiddenFieldIds: [],\n};\n\nmodule.exports = class ABViewCSVExporterCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewCSVExporterDefaults\n );\n }\n\n static common() {\n return ABViewCSVExporterDefaults;\n }\n\n static defaultValues() {\n return ABViewCSVExporterPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert to boolean\n if (typeof values.settings.hasHeader == \"string\")\n this.settings.hasHeader = JSON.parse(values.settings.hasHeader);\n\n if (this.settings.hasHeader == null)\n this.settings.hasHeader =\n ABViewCSVExporterPropertyComponentDefaults.hasHeader;\n\n // convert from \"0\" => 0\n this.settings.width = parseInt(\n values.settings.width ||\n ABViewCSVExporterPropertyComponentDefaults.width\n );\n\n this.settings.hiddenFieldIds =\n values.settings.hiddenFieldIds ||\n ABViewCSVExporterPropertyComponentDefaults.hiddenFieldIds;\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABRecordRule = require(\"../../rules/ABViewRuleListFormRecordRules\");\n\nconst ABViewCSVImporterDefaults = {\n key: \"csvImporter\",\n // {string}\n // unique key identifier for this ABViewForm\n\n icon: \"upload\",\n // {string}\n // font-awesome icon reference: (without 'fa-' )\n\n labelKey: \"CSV Importer\",\n // {string}\n // the multilingual label key for the class label\n // NOTE: will be used as L(labelKey)\n};\n\nconst ABViewCSVImporterPropertyComponentDefaults = {\n dataviewID: null,\n // {uuid}\n // The ABDataCollection.uuid that we are using to store the data.\n // NOTE: we actually use the DC to get the ABObject it is connected to.\n\n availableFieldIds: [],\n //{array}\n // A list of ABField.ids that are allowed to be imported using this widget.\n\n buttonLabel: \"Upload CSV\",\n // {string}\n // The Label(key) to display on the initial button\n\n width: 0,\n // {integer}\n // Width of the Popup.\n\n recordRules: [],\n // {array} [ {RecordRule}, ... ]\n // A list of ABViewRuleListFormRecordRules that should be performed upon\n // each row of data imported.\n // The Array should look like:\n // [{\n // action: {string},\n // when: [\n // {\n // fieldId: {UUID},\n // comparer: {string},\n // value: {string}\n // }\n // ],\n // values: [\n // {\n // fieldId: {UUID},\n // value: {object}\n // }\n // ]\n // }]\n};\n\nmodule.exports = class ABViewCSVImporterCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewCSVImporterDefaults\n );\n }\n\n /**\n * @method common()\n * Provides the default settings for an instance of an ABViewCSVImporter\n * @return {json}\n */\n static common() {\n return ABViewCSVImporterDefaults;\n }\n\n /**\n * @method defaultValues()\n * Provides the default settings for an instance of an ABViewCSVImporter\n * Component that is displayed on the UI.\n * @return {json}\n */\n static defaultValues() {\n return ABViewCSVImporterPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.width = parseInt(\n this.settings.width || ABViewCSVImporterPropertyComponentDefaults.width\n );\n }\n\n get RecordRule() {\n let object = this.datacollection?.datasource;\n if (!object) return null;\n\n if (this._recordRule == null) {\n this._recordRule = new ABRecordRule();\n }\n\n this._recordRule.formLoad(this);\n this._recordRule.fromSettings(this.settings.recordRules);\n this._recordRule.objectLoad(object);\n\n return this._recordRule;\n }\n\n doRecordRulesPre(rowDatas) {\n if (rowDatas && !Array.isArray(rowDatas)) {\n rowDatas = [rowDatas];\n }\n\n rowDatas.forEach((row) => {\n this.RecordRule?.processPre({ data: row.data || row, form: this });\n });\n }\n\n doRecordRules(rowDatas) {\n if (rowDatas && !Array.isArray(rowDatas)) {\n rowDatas = [rowDatas];\n }\n\n if (!this.RecordRule) return Promise.resolve();\n\n let tasks = [];\n\n rowDatas.forEach((row) => {\n tasks.push(\n this.RecordRule.process({ data: row.data || row, form: this })\n );\n });\n\n return Promise.all(tasks);\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewCarouselPropertyComponentDefaults = {\n dataviewID: null, // uuid of ABDatacollection\n field: null, // uuid\n\n width: 460,\n height: 275,\n showLabel: true,\n hideItem: false,\n hideButton: false,\n navigationType: \"corner\", // \"corner\" || \"side\"\n filterByCursor: false,\n\n detailsPage: null, // uuid\n detailsTab: null, // uuid\n editPage: null, // uuid\n editTab: null, // uuid\n};\n\nconst ABViewDefaults = {\n key: \"carousel\", // {string} unique key for this view\n icon: \"clone\", // {string} fa-[icon] reference for this view\n labelKey: \"Carousel\", // {string} the multilingual label key for the class label\n};\n\nfunction parseIntOrDefault(_this, key) {\n if (typeof _this.settings[key] != \"undefined\") {\n _this.settings[key] = parseInt(_this.settings[key]);\n } else {\n _this.settings[key] = ABViewCarouselPropertyComponentDefaults[key];\n }\n}\n\nfunction parseOrDefault(_this, key) {\n try {\n _this.settings[key] = JSON.parse(_this.settings[key]);\n } catch (e) {\n _this.settings[key] = ABViewCarouselPropertyComponentDefaults[key];\n }\n}\n\nmodule.exports = class ABViewCarouselCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewCarouselPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n parseIntOrDefault(this, \"width\");\n parseIntOrDefault(this, \"height\");\n\n // json\n parseOrDefault(this, \"showLabel\");\n parseOrDefault(this, \"hideItem\");\n parseOrDefault(this, \"hideButton\");\n\n this.settings.navigationType =\n this.settings.navigationType ||\n ABViewCarouselPropertyComponentDefaults.navigationType;\n\n parseOrDefault(this, \"filterByCursor\");\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n get imageField() {\n let dc = this.datacollection;\n if (!dc) return null;\n\n let obj = dc.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.field);\n }\n};\n","const ABViewChartContainer = require(\"../../platform/views/ABViewChartContainer\");\n\nconst ABViewChartAreaPropertyComponentDefaults = {\n areaType: \"area\",\n isLegend: 1,\n // chartWidth: 600,\n chartHeight: 200,\n labelFontSize: 12,\n stepValue: 20,\n maxValue: 100,\n};\n\nconst ABViewDefaults = {\n key: \"area\", // {string} unique key for this view\n icon: \"area-chart\", // {string} fa-[icon] reference for this view\n labelKey: \"Area\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewChartAreaCore extends ABViewChartContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewChartAreaPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.areaType =\n this.settings.areaType ||\n ABViewChartAreaPropertyComponentDefaults.areaType;\n\n this.settings.isLegend = parseInt(\n this.settings.isLegend ??\n ABViewChartAreaPropertyComponentDefaults.isLegend\n );\n\n // this.settings.chartWidth = parseInt(this.settings.chartWidth || ABViewChartAreaPropertyComponentDefaults.chartWidth);\n this.settings.chartHeight = parseInt(\n this.settings.chartHeight ??\n ABViewChartAreaPropertyComponentDefaults.chartHeight\n );\n\n this.settings.labelFontSize = parseInt(\n this.settings.labelFontSize ??\n ABViewChartAreaPropertyComponentDefaults.labelFontSize\n );\n this.settings.stepValue = parseInt(\n this.settings.stepValue ??\n ABViewChartAreaPropertyComponentDefaults.stepValue\n );\n this.settings.maxValue = parseInt(\n this.settings.maxValue ??\n ABViewChartAreaPropertyComponentDefaults.maxValue\n );\n\n this.translate(this, this, [\"areaLabel\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewChartContainer = require(\"../../platform/views/ABViewChartContainer\");\n\nconst ABViewChartBarPropertyComponentDefaults = {\n barType: \"bar\",\n barPreset: \"column\",\n isLegend: 1,\n // chartWidth: 600,\n height: 200,\n labelFontSize: 12,\n stepValue: 20,\n maxValue: 100,\n};\n\nconst ABViewDefaults = {\n key: \"bar\", // {string} unique key for this view\n icon: \"bar-chart\", // {string} fa-[icon] reference for this view\n labelKey: \"Bar\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewChartBarCore extends ABViewChartContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewChartBarPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.barType =\n this.settings.barType ||\n ABViewChartBarPropertyComponentDefaults.barType;\n\n this.settings.barPreset =\n this.settings.barPreset ||\n ABViewChartBarPropertyComponentDefaults.barPreset;\n\n this.settings.isLegend = parseInt(\n this.settings.isLegend ??\n ABViewChartBarPropertyComponentDefaults.isLegend\n );\n\n // this.settings.chartWidth = parseInt(this.settings.chartWidth || ABViewChartBarPropertyComponentDefaults.chartWidth);\n this.settings.height = parseInt(\n this.settings.height ?? ABViewChartBarPropertyComponentDefaults.height\n );\n\n this.settings.labelFontSize = parseInt(\n this.settings.labelFontSize ??\n ABViewChartBarPropertyComponentDefaults.labelFontSize\n );\n this.settings.stepValue = parseInt(\n this.settings.stepValue ??\n ABViewChartBarPropertyComponentDefaults.stepValue\n );\n this.settings.maxValue = parseInt(\n this.settings.maxValue ??\n ABViewChartBarPropertyComponentDefaults.maxValue\n );\n\n this.translate(this, this, [\"barLabel\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewContainer = require(\"../../platform/views/ABViewContainer\");\n\nconst ABViewChartPropertyComponentDefaults = {\n dataviewID: \"\",\n columnValue: \"\",\n columnLabel: \"\",\n columnValue2: \"\",\n isPercentage: 1,\n showLabel: 1,\n labelPosition: \"left\",\n labelWidth: 120,\n height: 200,\n multipleSeries: 0,\n};\n\nconst ABViewChartDefaults = {\n key: \"chart\", // {string} unique key for this view\n icon: \"bar-chart\", // {string} fa-[icon] reference for this view\n labelKey: \"Chart\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewChartCore extends ABViewContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewChartDefaults);\n }\n\n static common() {\n return ABViewChartDefaults;\n }\n\n static defaultValues() {\n return ABViewChartPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.dataviewID =\n this.settings.dataviewID ??\n ABViewChartPropertyComponentDefaults.dataviewID;\n\n this.settings.columnValue =\n this.settings.columnValue ??\n ABViewChartPropertyComponentDefaults.columnValue;\n\n this.settings.columnLabel =\n this.settings.columnLabel ??\n ABViewChartPropertyComponentDefaults.columnLabel;\n\n this.settings.columnValue2 =\n this.settings.columnValue2 ??\n ABViewChartPropertyComponentDefaults.columnValue2;\n\n this.settings.isPercentage = parseInt(\n this.settings.isPercentage ??\n ABViewChartPropertyComponentDefaults.isPercentage\n );\n\n this.settings.showLabel = parseInt(\n this.settings.showLabel ??\n ABViewChartPropertyComponentDefaults.showLabel\n );\n\n this.settings.labelPosition =\n this.settings.labelPosition ||\n ABViewChartPropertyComponentDefaults.labelPosition;\n\n this.settings.labelWidth = parseInt(\n this.settings.labelWidth ??\n ABViewChartPropertyComponentDefaults.labelWidth\n );\n\n this.settings.height = parseInt(\n this.settings.height ?? ABViewChartPropertyComponentDefaults.height\n );\n\n this.settings.multipleSeries = parseInt(\n this.settings.multipleSeries ??\n ABViewChartPropertyComponentDefaults.multipleSeries\n );\n\n this.translate(this, this, [\"chartLabel\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n const viewsToAllow = [\"label\", \"pie\", \"bar\", \"line\", \"area\"];\n return this.application.viewAll((c) => {\n return viewsToAllow.indexOf(c.common().key) > -1;\n });\n }\n\n labelField() {\n const dc = this.datacollection;\n if (!dc) return null;\n\n const obj = dc.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.columnLabel);\n }\n\n valueField() {\n const dc = this.datacollection;\n if (!dc) return null;\n\n const obj = dc.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.columnValue);\n }\n\n valueField2() {\n const dc = this.datacollection;\n if (!dc) return null;\n\n const obj = dc.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.columnValue2);\n }\n};\n","const ABViewChartContainer = require(\"../../platform/views/ABViewChartContainer\");\n\nconst ABViewChartLinePropertyComponentDefaults = {\n lineType: \"line\",\n linePreset: \"plot\",\n isLegend: 1,\n // chartWidth: 600,\n chartHeight: 200,\n labelFontSize: 12,\n stepValue: 20,\n maxValue: 100,\n};\n\nconst ABViewDefaults = {\n key: \"line\", // {string} unique key for this view\n icon: \"line-chart\", // {string} fa-[icon] reference for this view\n labelKey: \"Line\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewChartLineCore extends ABViewChartContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewChartLinePropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.lineType =\n this.settings.lineType ||\n ABViewChartLinePropertyComponentDefaults.lineType;\n\n this.settings.linePreset =\n this.settings.linePreset ||\n ABViewChartLinePropertyComponentDefaults.linePreset;\n\n this.settings.isLegend = parseInt(\n this.settings.isLegend ??\n ABViewChartLinePropertyComponentDefaults.isLegend\n );\n\n // this.settings.chartWidth = parseInt(this.settings.chartWidth || ABViewChartLinePropertyComponentDefaults.chartWidth);\n this.settings.chartHeight = parseInt(\n this.settings.chartHeight ??\n ABViewChartLinePropertyComponentDefaults.chartHeight\n );\n\n this.settings.labelFontSize = parseInt(\n this.settings.labelFontSize ??\n ABViewChartLinePropertyComponentDefaults.labelFontSize\n );\n this.settings.stepValue = parseInt(\n this.settings.stepValue ??\n ABViewChartLinePropertyComponentDefaults.stepValue\n );\n this.settings.maxValue = parseInt(\n this.settings.maxValue ??\n ABViewChartLinePropertyComponentDefaults.maxValue\n );\n\n this.translate(this, this, [\"lineLabel\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewChartContainer = require(\"../../platform/views/ABViewChartContainer\");\n\nconst ABViewChartPiePropertyComponentDefaults = {\n pieType: \"pie\",\n isLegend: 1,\n // chartWidth: 600,\n height: 200,\n innerFontSize: 12,\n labelFontSize: 12,\n};\n\nconst ABViewDefaults = {\n key: \"pie\", // {string} unique key for this view\n icon: \"pie-chart\", // {string} fa-[icon] reference for this view\n labelKey: \"Pie\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewChartPieCore extends ABViewChartContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewChartPiePropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.pieType =\n this.settings.pieType ||\n ABViewChartPiePropertyComponentDefaults.pieType;\n\n this.settings.isLegend = parseInt(\n this.settings.isLegend ??\n ABViewChartPiePropertyComponentDefaults.isLegend\n );\n\n // this.settings.chartWidth = parseInt(this.settings.chartWidth || ABViewChartPiePropertyComponentDefaults.chartWidth);\n this.settings.height = parseInt(\n this.settings.height ?? ABViewChartPiePropertyComponentDefaults.height\n );\n\n this.settings.innerFontSize = parseInt(\n this.settings.innerFontSize ??\n ABViewChartPiePropertyComponentDefaults.innerFontSize\n );\n this.settings.labelFontSize = parseInt(\n this.settings.labelFontSize ??\n ABViewChartPiePropertyComponentDefaults.labelFontSize\n );\n\n this.translate(this, this, [\"pieLabel\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewCommentPropertyComponentDefaults = {\n dataviewID: null,\n columnUser: null,\n columnComment: null,\n columnDate: null,\n height: 300,\n label: \"\", // label is required and you can add more if the component needs them\n // format:0 \t// 0 - normal, 1 - title, 2 - description\n};\n\nconst ABViewDefaults = {\n key: \"comment\", // {string} unique key for this view\n icon: \"comments\", // {string} fa-[icon] reference for this view\n labelKey: \"Comment\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewCommentCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewCommentPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n // this.settings.format = parseInt(this.settings.format);\n // if this is being instantiated on a read from the Property UI,\n this.settings.height = parseInt(this.settings.height || 0);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n getCurrentUserId() {\n const userObject = this.getUsers();\n const currentUser = this.AB.Account.username();\n //Anonymous User = 0\n\n if (!userObject) return;\n\n return userObject.findIndex((e) => e.value === currentUser) + 1;\n }\n\n getUsers() {\n return this.AB.Account.userList().map((e) => {\n return {\n id: e.username,\n value: e.username,\n image: e.image_id,\n };\n });\n }\n\n getUserField() {\n var dv = this.datacollection;\n if (!dv) return null;\n\n var obj = dv.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.columnUser);\n }\n\n getCommentField() {\n var dv = this.datacollection;\n if (!dv) return null;\n\n var obj = dv.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.columnComment);\n }\n\n getDateField() {\n var dv = this.datacollection;\n if (!dv) return null;\n\n var obj = dv.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.columnDate);\n }\n\n getUserData() {\n let UserImageField = this.AB.objectUser().fieldByID(\n \"6383ce19-b344-44ee-87e6-decced7361f8\"\n );\n\n var userObject = this.getUsers();\n var userList = [];\n\n if (!userObject) return;\n\n userObject.forEach((item, index) => {\n var imageURL = \"\";\n if (item.image) {\n imageURL = UserImageField.urlImage(item.image);\n }\n var user = { id: index + 1, value: item.value, image: imageURL };\n userList.push(user);\n });\n return userList;\n }\n\n model() {\n let dv = this.datacollection;\n if (!dv) return null; // TODO: refactor in v2\n\n // get ABModel\n let model = dv.model; // already notified\n if (!model) return null;\n\n return model;\n }\n};\n","const ABViewContainer = require(\"../../platform/views/ABViewContainer\");\n\nconst ABViewPropertyDefaults = {\n dataviewID: null,\n filterConditions: {},\n};\n\nconst ABViewDefaults = {\n key: \"conditionalcontainer\", // unique key identifier for this ABView\n icon: \"shield\", // icon reference: (without 'fa-' )\n labelKey: \"Conditional Container\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewConditionalContainerCore extends ABViewContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n\n const L = (...params) => this.AB.Multilingual.label(...params);\n\n // the conditional container always has 'If' and 'Else' panels\n if (this.views((v) => v instanceof ABViewContainer).length < 2) {\n this._views = [];\n\n // 'If' panel\n const ifPanel = application.viewNew(\n {\n key: ABViewContainer.common().key,\n label: L(\"If\"),\n name: \"If\",\n settings: {\n removable: false,\n },\n },\n application,\n this\n );\n\n this._views.push(ifPanel);\n\n // 'Else' panel\n const elsePanel = application.viewNew(\n {\n key: ABViewContainer.common().key,\n label: L(\"Else\"),\n name: \"Else\",\n settings: {\n removable: false,\n },\n },\n application,\n this\n );\n\n this._views.push(elsePanel);\n }\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewPropertyDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n * For a Conditional Container, we don't allow any other items to be placed on it.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewConnectDataFilterPropertyComponentDefaults = {\n dataviewID: null, // uuid of ABDatacollection\n field: null, // uuid\n};\n\nconst ABViewDefaults = {\n key: \"connect-data-filter\", // {string} unique key for this view\n icon: \"filter\", // {string} fa-[icon] reference for this view\n labelKey: \"Connected Data Filter\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewConnectDataFilterCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues ?? ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewConnectDataFilterPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","/*\n * ABViewContainerCore\n *\n * An ABViewContainerCore defines a UI display component.\n *\n * A container might have multiple columns of display info.\n *\n */\n\nconst ABView = require(\"../../platform/views/ABView\");\n\n// function L(key, altText) {\n// \treturn AD.lang.label.getLabel(key) || altText;\n// }\n\nconst ABViewDefaults = {\n key: \"viewcontainer\", // {string} unique key for this view\n icon: \"braille\", // {string} fa-[icon] reference for this view\n labelKey: \"Container\", // {string} the multilingual label key for the class label\n};\n\nconst ABPropertyComponentDefaults = {\n columns: 1,\n gravity: 1,\n movable: true,\n removable: true,\n};\n\nmodule.exports = class ABViewContainerCore extends ABView {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n * @param {obj} defaultValues special sub class defined default values.\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABPropertyComponentDefaults;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.columns = parseInt(\n this.settings.columns || ABPropertyComponentDefaults.columns\n );\n\n if (typeof this.settings.gravity != \"undefined\") {\n this.settings.gravity.map(function (gravity) {\n return parseInt(gravity);\n });\n }\n\n if (this.settings.removable != null) {\n this.settings.removable = JSON.parse(this.settings.removable); // convert to boolean\n } else {\n this.settings.removable = ABPropertyComponentDefaults.removable;\n }\n\n if (this.settings.movable != null) {\n this.settings.movable = JSON.parse(this.settings.movable); // convert to boolean\n } else {\n this.settings.movable = ABPropertyComponentDefaults.movable;\n }\n }\n\n viewsSortByPosition() {\n // Sort views from y, x positions\n return this.views().sort((a, b) => {\n if (a.position.y == b.position.y) return a.position.x - b.position.x;\n else return a.position.y - b.position.y;\n });\n }\n\n // saveReorder() {\n // return this.application.viewReorder(this);\n // }\n};\n","/*\n * ABViewCore\n *\n * ABViewCore defines the common ABView structure that is shared between\n * the client and the server. Mostly how it manages it's internal data, and\n * how it is related to the ABView classes.\n *\n */\n\nvar ABMLClass = require(\"../../platform/ABMLClass\");\n\nconst ABViewDefaults = {\n key: \"view\", // {string} unique key for this view\n icon: \"window-maximize\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.view\", // {string} the multilingual label key for the class label\n tabicon: \"\", // no default tab icons\n};\n\nconst ABViewPropertyComponentDefaults = {\n label: \"\",\n};\n\nmodule.exports = class ABViewCore extends ABMLClass {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super([\"label\"], application.AB);\n\n this.__events = [];\n // keep track of any event listeners attached to this ABView object\n\n this.defaults = defaultValues || ABViewDefaults;\n\n this.application = application;\n\n this.parent = parent || null;\n\n this.warningsSilent = false;\n // {bool}\n // Should we suppress our configuration warnings?\n\n this.__missingViews = [];\n // {array}\n // Any ABView.id we have stored that we can't find.\n\n this.fromValues(values);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewPropertyComponentDefaults;\n }\n\n /**\n * @method newInstance()\n * return a new instance of this ABView. Most likely called from interfaces\n * that create new UI elements like the ABDesigner.\n * @param {ABApplication} application \t: the root ABApplication this view is under\n * @param {ABView/ABApplication} parent\t: the parent object of this ABView.\n * @return {ABView}\n */\n static newInstance(application, parent) {\n // return a new instance from ABViewManager:\n return application.viewNew(\n { key: this.common().key },\n application,\n parent\n );\n }\n\n viewKey() {\n return this.defaults.key;\n }\n\n viewIcon() {\n return this.defaults.icon;\n }\n\n tabIcon() {\n return this.defaults.tabicon;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABView instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n // // NOTE: ensure we have a uuid() set:\n // if (!this.id) {\n // this.id = this.application.uuid();\n // }\n\n // this.application.unTranslate(this, this, [\"label\"]);\n\n // MLClass translation\n var obj = super.toObj();\n\n var result = {\n id: this.id,\n type: this.type || \"view\",\n key: this.key,\n icon: this.icon,\n tabicon: this.tabicon,\n name: this.name,\n settings: this.AB.cloneDeep(this.settings || {}),\n accessLevels: this.accessLevels,\n translations: obj.translations,\n };\n\n // encode our child view references\n result.viewIDs = (this._views || []).map((v) => v.id).filter((id) => id);\n result.viewIDs = result.viewIDs.concat(this.__missingViews);\n\n if (this.position) result.position = this.position;\n\n // encode our .isRoot() reference.\n // (NOTE: this is set so our server side code can distinguish) between a .view\n // and a root page:\n // NOTE: we intentionally do NOT pull this out in .fromValues()\n result.isRoot = this.isRoot();\n\n return result;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n this.id = values.id; // NOTE: only exists after .save()\n // {string} .id\n // the uuid of this ABObject Definition.\n\n this.type = values.type || \"view\";\n // {string} .type\n // the type of ABDefinition this is.\n\n this.key = values.key || this.viewKey();\n // {string} .key\n // the unique lookup key for our ABViewManager to create new\n // instances of this object.\n\n this.icon = values.icon || this.viewIcon();\n // {string} .icon\n // the font awesome icon reference for showing an icon for this\n // view in the AppBuilder interface builder.\n\n this.tabicon = values.tabicon || this.tabIcon();\n\n this.name = values.name;\n // {string} .name\n // A name reference for this ABView. This is a reference that isn't\n // translateable and will be used for lookups across languages.\n\n // if this is being instantiated on a read from the Property UI,\n // .label is coming in under .settings.label\n values.settings = values.settings || {};\n this.label = values.label || values.settings.label || \"?label?\";\n\n this.settings = values.settings || {};\n // {obj} .settings\n // the property settings for this ABView\n\n // make sure .settings.height is an int and not a string\n this.settings.height = parseInt(this.settings.height || 0);\n\n this.accessLevels = values.accessLevels || {};\n // {obj} .accessLevels\n // Hash: { ABRole.id : accessLevel }\n // tracks the Role -> AccessLevel settings of this particular\n // view.\n // accessLevel: 0 : no access, 1 : view only, 2: full access\n\n // let the MLClass now process the translations:\n super.fromValues(values);\n\n // If the View / DataCollection does not have a .name already,\n // use the English label translation as the .name instead.\n if (!this.name && Array.isArray(this.translations)) {\n for (var i = 0; i < this.translations.length; i++) {\n if (i == 0) {\n // Use the first label found, in case there is no 'en'\n this.name = this.translations[i].label;\n }\n if (this.translations[i].language_code == \"en\") {\n // But the 'en' label will have final priority\n this.name = this.translations[i].label;\n break;\n }\n }\n }\n\n // default value for our label\n if (this.label == \"?label?\") {\n if (this.parent) {\n this.label = this.parent.label + \".\" + this.defaults.key;\n }\n }\n\n var views = [];\n this.__missingViews = this.__missingViews || [];\n (values.viewIDs || []).forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (def) {\n views.push(this.application.viewNew(def, this.application, this));\n } else {\n this.__missingViews.push(id);\n }\n });\n this._views = views;\n\n // convert from \"0\" => 0\n this.position = values.position || {};\n\n if (this.position.x != null) this.position.x = parseInt(this.position.x);\n if (this.position.y != null) this.position.y = parseInt(this.position.y);\n\n this.position.dx = parseInt(this.position.dx || 1);\n this.position.dy = parseInt(this.position.dy || 1);\n }\n\n isRoot() {\n return this.parent == null || this.parent == this.application;\n }\n\n /**\n * @method allParents()\n * return a flattened array of all the ABViews parents\n * @return {array} array of ABViews\n */\n allParents() {\n var parents = [];\n var curView = this;\n\n // add current view to array\n parents.unshift(curView);\n\n while (!curView.isRoot() && curView.parent) {\n parents.unshift(curView.parent);\n\n curView = curView.parent;\n }\n\n return parents;\n }\n\n /**\n * @method isAccessibleForRoles()\n * return true/false if this ABViewPage is accessible for one of the\n * passed in ABRoles.\n * @param {array[ABRole]} roles\n * an array of {ABRole} instances.\n * @return {bool}\n */\n isAccessibleForRoles(roles) {\n var foundRole = false;\n\n var accessibleRoles = Object.keys(this.accessLevels) || [];\n (roles || []).forEach((r) => {\n if (accessibleRoles.indexOf(r.uuid || r) > -1) {\n foundRole = true;\n }\n });\n\n return foundRole;\n }\n\n /**\n * @method getUserAccess()\n *\n * return the access level of the current user on the current view\n *\n * @return {integer} // 0 = No Access // 1 = Read Only // 2 = Full Access\n */\n getUserAccess() {\n // by default everyone has no access\n var accessLevel = 0;\n\n if (this.application.isAccessManaged) {\n // check to see if the current users is the access manager\n var isAccessManager = false;\n // first check if manager is defined by their role\n if (parseInt(this.application.accessManagers.useRole) == 1) {\n // if so check if any of the user's role match the managers\n this.AB.Account.roles().forEach((role) => {\n if (\n this.application.accessManagers.role.indexOf(\n role.id || role.uuid\n ) > -1\n ) {\n // if so set the access level to full access\n isAccessManager = true;\n accessLevel = 2;\n }\n });\n }\n // if the user isn't already set as the manager and the manager is defined by their account\n if (\n !isAccessManager &&\n parseInt(this.application.accessManagers.useAccount) == 1\n ) {\n // check if the user's account matches the managers\n if (\n this.application.accessManagers.account.indexOf(\n this.AB.Account.uuid() + \"\"\n ) > -1\n ) {\n // if so set the access level to full access\n isAccessManager = true;\n accessLevel = 2;\n }\n }\n\n // if the user is not the manager check if the page has access levels defined for roles\n if (\n this.accessLevels &&\n Object.keys(this.accessLevels).length > 0 &&\n !isAccessManager\n ) {\n // check to see if the user's roles matches one of the roles defined\n this.AB.Account.roles().forEach((role) => {\n var currentRole = this.accessLevels[role.id || role.uuid];\n if (currentRole && parseInt(currentRole) > accessLevel)\n // if the access level is higher than a previous role set to the new level\n accessLevel = parseInt(currentRole);\n });\n }\n } else {\n accessLevel = 2;\n }\n\n return accessLevel;\n }\n\n /**\n * @method parentFormComponent\n * return the closest form object this component is on.\n */\n parentFormComponent() {\n var form = null;\n\n var curr = this;\n while (curr.key != \"form\" && !curr.isRoot() && curr.parent) {\n curr = curr.parent;\n }\n\n if (curr.key == \"form\") {\n form = curr;\n }\n\n return form;\n }\n\n /**\n * @method parentDetailComponent\n * return the closest detail object that this component is on.\n * @returns {ABViewDetail} detail component\n */\n parentDetailComponent() {\n var detail = null;\n\n var curr = this;\n while (curr.key != \"detail\" && !curr.isRoot() && curr.parent) {\n curr = curr.parent;\n }\n\n if (curr.key == \"detail\") {\n detail = curr;\n }\n\n return detail;\n }\n\n pageParent(filterFn) {\n if (filterFn == null) filterFn = () => true;\n\n // if current page is the root page, then return itself.\n if (this.isRoot()) {\n return this;\n }\n\n var parentPage = this.parent;\n while (\n parentPage &&\n (parentPage.key != \"page\" || !filterFn(parentPage))\n ) {\n parentPage = parentPage.parent;\n }\n\n return parentPage;\n }\n\n pageRoot() {\n var rootPage = this.pageParent();\n\n while (!rootPage.isRoot()) {\n rootPage = rootPage.pageParent();\n }\n\n return rootPage;\n }\n\n /**\n * @method urlPointer()\n * return the url pointer that references this view. This url pointer\n * should be able to be used by this.application.urlResolve() to return\n * this view object.\n * @return {string}\n */\n urlPointer() {\n if (this.parent) {\n return this.parent.urlView() + this.id;\n } else {\n return this.application.urlPage() + this.id;\n }\n }\n\n /**\n * @method urlView\n * return a string pointer to this object's views.\n * @return {string}\n */\n urlView() {\n return this.urlPointer() + \"/_views/\";\n }\n\n /**\n * @property datacollection\n * return data source\n *\n * @return {ABDataCollection}\n */\n get datacollection() {\n let dataviewID = (this.settings || {}).dataviewID;\n if (!dataviewID) {\n if (\n [\"form\", \"grid\", \"line\", \"area\", \"bar\", \"gantt\", \"kanban\"].indexOf(\n this.key\n ) > -1\n ) {\n // NOTE: ignore kanban side forms where this is the case:\n if (this.key == \"form\" && this._currentObject) return null;\n\n if (this.warningsSilent) return null;\n\n var errNoDCID = new Error(\n `ABViewCore:get datacollection(): View[${this.key}] didn't define a dataviewID.`\n );\n this.AB.notify.builder(errNoDCID, {\n view: this,\n settings: this.settings,\n });\n } else {\n // These views shouldn't matter if they don't have a datacollection.\n if (\n [\"button\", \"label\", \"page\", \"tab\", \"viewcontainer\"].indexOf(\n this.key\n ) == -1\n ) {\n console.warn(\n `TODO: figure out which ABView* require a .dataviewID: ${this.key}?`\n );\n }\n }\n return null;\n }\n\n var dc = this.AB.datacollectionByID(dataviewID);\n if (!dc) {\n var errNoDC = new Error(\n `View[${this.label}][${this.id}] is unable to find associated DataCollection`\n );\n this.AB.notify.builder(errNoDC, {\n view: this,\n dataviewID,\n });\n }\n return dc;\n }\n\n ///\n /// Update Access accessLevels\n ///\n\n /**\n * @method updateAccessLevels()\n *\n *\n * @param {string} roleId\n *\n * @param {string} accessLevel\n *\n * @return {Promise}\n *\n */\n updateAccessLevels(roleId, accessLevel) {\n if (parseInt(accessLevel) == 0) {\n if (this.accessLevels[roleId]) delete this.accessLevels[roleId];\n } else {\n this.accessLevels[roleId] = accessLevel;\n }\n\n return this.save(false, false);\n }\n\n ///\n /// Views\n ///\n\n /**\n * @method views()\n *\n * return an array of all the ABViews children\n *\n * @param {fn} filter \ta filter fn to return a set of ABViews that this fn\n *\t\t\t\t\t\treturns true for.\n * @param {boolean} deep\n *\n * @return {array} \tarray of ABViews\n */\n views(filter = () => true, deep = false) {\n var result = [];\n\n if (!this._views || this._views.length < 1) return result;\n\n // find into recursively\n if (filter && deep) {\n result = result.concat(this._views.filter(filter));\n\n this._views.forEach((v) => {\n var subViews = v.views(filter, deep);\n if (subViews && subViews.length > 0) {\n result = result.concat(subViews);\n }\n });\n } else {\n result = this._views.filter(filter);\n }\n\n return result;\n }\n\n /**\n * @method viewNew()\n *\n *\n * @return {ABView}\n */\n viewNew(values, application, parent) {\n return this.application.viewNew(\n values,\n application || this.application,\n parent || this\n );\n }\n\n /**\n * @method viewDestroy()\n *\n * remove the current ABView from our list of ._views.\n *\n * @param {ABView} view\n * @return {Promise}\n */\n viewDestroy(view) {\n console.error(\"DEPRECIATED: where is this called?\");\n return this.viewRemove(view);\n }\n\n /**\n * @method viewRemove()\n *\n * remove the current ABView from our list of ._views.\n *\n * @param {ABView} view\n * @return {Promise}\n */\n viewRemove(view) {\n var origLen = this._views.length;\n this._views = this.views(function (v) {\n return v.id != view.id;\n });\n\n if (this._views.length < origLen) {\n return this.save();\n }\n\n return Promise.resolve();\n }\n\n /**\n * @method viewInsert()\n *\n * persist the current ABView in our list of ._views.\n *\n * @param {ABView} object\n * @return {Promise}\n */\n viewInsert(view) {\n var isIncluded =\n this.views(function (v) {\n return v.id == view.id;\n }).length > 0;\n if (!isIncluded) {\n this._views.push(view);\n return this.save();\n }\n\n return Promise.resolve();\n }\n\n /**\n * @method viewReorder()\n *\n * reorder the current ABView in our list of ._views.\n *\n * @param {string} viewId - id of the active view\n * @param {string} toPosition - 'to' postion\n * @return {Promise}\n */\n viewReorder(viewId, toPosition) {\n var from = this._views.findIndex((v) => v.id == viewId);\n if (from < 0) return;\n\n // move drag item to 'to' position\n this._views.splice(toPosition, 0, this._views.splice(from, 1)[0]);\n\n // save to database\n return this.save(true);\n }\n\n /// ABApplication data methods\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABApplication\n *\n * also remove it from our _AllApplications\n *\n * @return {Promise}\n */\n destroy() {\n // unsubscribe events\n this.eventClear(true);\n\n return Promise.resolve()\n .then(() => {\n // When deleting an ABView\n // be sure to remove any of it's ABViews as well\n // This cleans out any dangling ABDefinitions\n\n var allViewDeletes = [];\n var allViews = this.views();\n this._views = [];\n // doing ._views = [] prevents any of my updates when\n // a sub-view is .destroy()ed\n\n allViews.forEach((v) => {\n allViewDeletes.push(v.destroy());\n });\n return Promise.all(allViewDeletes);\n })\n .then(() => {\n // NOTE: this should not happen on ABViewPage objects\n if (this.parent && !this.pages) {\n return this.parent.viewRemove(this);\n }\n })\n .then(() => {\n return super.destroy();\n })\n .then(() => {\n this.emit(\"destroyed\");\n });\n }\n\n /**\n * @method save()\n * persist this instance of ABView\n * @return {Promise}\n *\t\t.resolve( {this} )\n */\n save() {\n return Promise.resolve()\n .then(() => {\n // this creates our .id\n return super.save();\n })\n .then(() => {\n // NOTE: this should not happen on ABViewPage objects:\n if (this.parent && !this.pages) {\n // if we have a .parent, make sure we are included in our .parent's\n // viewIDs\n return this.parent.viewInsert(this);\n }\n })\n .then(() => {\n return this;\n });\n }\n\n ///\n /// Events\n ///\n\n /**\n * @method eventAdd()\n *\n *\n *\n * @param {object} evt - {\n * \t\t\t\t\t\t\temitter: object,\n * \t\t\t\t\t\t\teventName: string,\n * \t\t\t\t\t\t\tlistener: function\n * \t\t\t\t\t\t}\n */\n eventAdd(evt) {\n if (!evt || !evt.emitter || !evt.listener) return;\n\n var exists = this.__events.find((e) => {\n return e.emitter == evt.emitter && e.eventName == evt.eventName;\n // && e.listener == evt.listener;\n });\n\n if (!exists || exists.length < 1) {\n // add to array\n this.__events.push({\n emitter: evt.emitter,\n eventName: evt.eventName,\n listener: evt.listener,\n });\n\n // listening this event\n evt.emitter.on(evt.eventName, evt.listener);\n }\n }\n\n /**\n * @method eventClear()\n * unsubscribe all events.\n * should do it before destroy a component\n *\n * @param {bool} deep - clear events of child views\n */\n eventClear(deep) {\n if (deep) {\n this.views().forEach((v) => {\n v.eventClear(deep);\n });\n }\n\n if (this.__events && this.__events.length > 0) {\n this.__events.forEach((e) => {\n e.emitter.removeListener(e.eventName, e.listener);\n });\n }\n }\n\n /**\n * @method clone()\n * clone the definitions of this ABView object.\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @param {obj} options\n * option settings for the copy command.\n * options.ignoreSubPages {bool}\n * set to true to skip copying any sub pages of this ABView.\n * @return {obj}\n * obj defs of this ABView\n */\n clone(lookUpIds, parent, options = {}) {\n lookUpIds = lookUpIds || {};\n\n // get settings of the target\n let config = this.toObj();\n\n // remove sub-elements property\n [\"pages\", \"views\"].forEach((prop) => {\n delete config[prop];\n });\n\n // update id of linked components\n if (this.copyUpdateProperyList) {\n (this.copyUpdateProperyList() || []).forEach((prop) => {\n if (config && config.settings)\n config.settings[prop] = lookUpIds[config.settings[prop]];\n });\n }\n\n // copy from settings\n let result = this.viewNew(config, this.application, parent);\n\n // change id\n if (parent == null) {\n // the page is getting cloned to root: there is no parent, as parent is the application\n result.id = null;\n } else {\n result.id = lookUpIds[result.id] || this.AB.uuid();\n }\n\n // copy sub pages\n if (this.pages && !options.ignoreSubPages) {\n result._pages = [];\n this.pages().forEach((p) => {\n let copiedSubPage = p.clone(lookUpIds, result, options);\n copiedSubPage.parent = result;\n\n result._pages.push(copiedSubPage);\n });\n }\n\n // copy sub views\n if (this.views && !options.ignoreSubViews) {\n result._views = [];\n this.views().forEach((v) => {\n let copiedView = v.clone(lookUpIds, result, options);\n\n result._views.push(copiedView);\n });\n }\n\n return result;\n }\n\n /**\n * @method copy()\n * create a new copy of this ABView object. The resulting ABView should\n * be identical in settings and all sub pages/views, but each new object\n * is a unique view (different ids).\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @param {obj} options\n * option settings for the copy command.\n * options.ignoreSubPages {bool}\n * set to true to skip copying any sub pages of this ABView.\n * options.newName {string}\n * new user determined name for page\n * @return {Promise}\n * .resolved with the instance of the copied ABView\n */\n copy(lookUpIds, parent, options = {}) {\n lookUpIds = lookUpIds || {};\n\n // get settings of the target\n let config = this.toObj();\n\n // remove sub-elements property\n [\"pageIDs\", \"viewIDs\"].forEach((prop) => {\n delete config[prop];\n });\n\n // update id of linked components\n if (this.copyUpdateProperyList) {\n (this.copyUpdateProperyList() || []).forEach((prop) => {\n if (config && config.settings)\n config.settings[prop] = lookUpIds[config.settings[prop]];\n });\n }\n\n // copy from settings\n let result = this.application.viewNew(config, this.application, parent);\n\n // keep the parent\n result.parent = parent || this.parent;\n\n // change id\n if (parent == null) {\n // the page is getting cloned to root: there is no parent, as parent is the application.\n // pages with null parent ids default to getting put on root\n result.id = null;\n } else {\n result.id = lookUpIds[result.id] || this.AB.uuid();\n }\n\n // page's name should not be duplicate\n if (this.key == \"page\") {\n result.name =\n options?.newName ||\n `${result.name}_copied_${this.AB.uuid().slice(0, 3)}`;\n\n result.label = options?.newName || `${result.label} (copied)`;\n }\n\n return Promise.resolve()\n .then(() => {\n // copy sub pages\n var allSaves = [];\n\n if (this._pages && !options.ignoreSubPages) {\n result._pages = [];\n this.pages().forEach((p) => {\n // this prevents result.save() from happening on each of these\n // p.copy():\n if (p.isRoot())\n this.application._pages.push({ id: lookUpIds[p.id] });\n\n allSaves.push(\n p\n .copy(lookUpIds, result, options)\n .then((copiedSubPage) => {\n copiedSubPage.parent = result;\n // remove the temp {id:} entry above:\n this.application._pages =\n this.application._pages.filter(\n (p2) => p2.id != lookUpIds[p.id]\n );\n\n // now add the full copiedSubPage:\n result._pages.push(copiedSubPage);\n })\n );\n });\n }\n\n return Promise.all(allSaves);\n })\n .then(() => {\n // copy sub views\n var allSaves = [];\n\n if (this._views && !options.ignoreSubViews) {\n result._views = [];\n this.views().forEach((v) => {\n allSaves.push(\n // send a null for parent, so that the .save() wont trigger\n // a save of the parent.\n v.copy(lookUpIds, result, options).then((copiedView) => {\n // now patch up the parent connection:\n // copiedView.parent = result;\n if (\n result._views.filter((vi) => vi.id == copiedView.id)\n .length < 1\n ) {\n result._views.push(copiedView);\n }\n })\n );\n });\n }\n\n return Promise.all(allSaves);\n })\n .then(() => {\n // now we do 1 save for all the views\n return result.save();\n })\n .then(() => {\n return result;\n });\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewDataFilterPropertyComponentDefaults = {\n dataviewID: null, // uuid of ABDatacollection\n field: null, // uuid,\n viewType: \"advanced\",\n showFilter: 1,\n showSort: 1,\n};\n\nconst ABViewDefaults = {\n key: \"data-filter\", // {string} unique key for this view\n icon: \"filter\", // {string} fa-[icon] reference for this view\n labelKey: \"Data Filter\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDataFilterCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues ?? ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewDataFilterPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewDataSelectPropertyComponentDefaults = {\n dataviewID: null, // uuid of ABDatacollection\n};\n\nconst ABViewDefaults = {\n key: \"data-select\", // {string} unique key for this view\n icon: \"chevron-circle-down\", // {string} fa-[icon] reference for this view\n labelKey: \"Data Select\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDataSelectCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues ?? ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewDataSelectPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewDetail = require(\"../../platform/views/ABViewDetail\");\n\nconst ABViewDataviewPropertyComponentDefaults = {\n xCount: 1, // {int} the number of columns per row (need at least one)\n detailsPage: \"\",\n detailsTab: \"\",\n editPage: \"\",\n editTab: \"\",\n};\n\nconst ABViewDataviewDefaults = {\n key: \"dataview\", // {string} unique key for this view\n icon: \"th\", // {string} fa-[icon] reference for this view\n labelKey: \"Data view\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDataviewCore extends ABViewDetail {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewDataviewDefaults\n );\n }\n\n static common() {\n return ABViewDataviewDefaults;\n }\n\n static defaultValues() {\n return ABViewDataviewPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.xCount = parseInt(\n this.settings.xCount || ABViewDataviewPropertyComponentDefaults.xCount\n );\n this.settings.detailsPage =\n this.settings.detailsPage ||\n ABViewDataviewPropertyComponentDefaults.detailsPage;\n this.settings.editPage =\n this.settings.editPage ||\n ABViewDataviewPropertyComponentDefaults.editPage;\n this.settings.detailsTab =\n this.settings.detailsTab ||\n ABViewDataviewPropertyComponentDefaults.detailsTab;\n this.settings.editTab =\n this.settings.editTab ||\n ABViewDataviewPropertyComponentDefaults.editTab;\n }\n\n parentDetailComponent() {\n let dataview = null;\n\n let curr = this;\n while (curr.key != \"dataview\" && !curr.isRoot() && curr.parent) {\n curr = curr.parent;\n }\n\n if (curr.key == \"dataview\") {\n dataview = curr;\n }\n\n return dataview;\n }\n};\n","const ABViewDetailItem = require(\"../../platform/views/ABViewDetailItem\");\n\nconst ABViewDetailCheckboxPropertyComponentDefaults = {};\n\nconst ABViewDetailCheckboxDefaults = {\n key: \"detailcheckbox\", // {string} unique key for this view\n icon: \"check-square-o\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.detail.checkbox\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDetailCheckboxCore extends ABViewDetailItem {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues ?? ABViewDetailCheckboxDefaults\n );\n }\n\n static common() {\n return ABViewDetailCheckboxDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailCheckboxPropertyComponentDefaults;\n }\n};\n","// const ABViewDetailSelectivity = require(\"../../platform/views/ABViewDetailSelectivity\");\nconst ABViewDetailItem = require(\"../../platform/views/ABViewDetailItem\");\n\nconst ABViewDetailPropertyComponentDefaults = {\n formView: \"\", // id of form to add new data\n};\n\nconst ABViewDefaults = {\n key: \"detailconnect\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.detail.connect\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDetailConnectCore extends ABViewDetailItem {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues ?? ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailPropertyComponentDefaults;\n }\n};\n","const ABViewContainer = require(\"../../platform/views/ABViewContainer\");\n\nconst ABViewDetailDefaults = {\n key: \"detail\", // {string} unique key for this view\n icon: \"file-text-o\", // {string} fa-[icon] reference for this view\n labelKey: \"Detail\", // {string} the multilingual label key for the class label\n};\n\nconst ABViewDetailPropertyComponentDefaults = {\n dataviewID: null,\n showLabel: true,\n labelPosition: \"left\",\n labelWidth: 120,\n height: 0,\n};\n\nmodule.exports = class ABViewDetailCore extends ABViewContainer {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues ?? ABViewDetailDefaults);\n }\n\n static common() {\n return ABViewDetailDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailPropertyComponentDefaults;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.labelPosition =\n this.settings.labelPosition ||\n ABViewDetailPropertyComponentDefaults.labelPosition;\n\n // convert from \"0\" => true/false\n this.settings.showLabel = JSON.parse(\n this.settings.showLabel != null\n ? this.settings.showLabel\n : ABViewDetailPropertyComponentDefaults.showLabel\n );\n\n // convert from \"0\" => 0\n this.settings.labelWidth = parseInt(\n this.settings.labelWidth ||\n ABViewDetailPropertyComponentDefaults.labelWidth\n );\n this.settings.height = parseInt(\n this.settings.height ?? ABViewDetailPropertyComponentDefaults.height\n );\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n let viewsToAllow = [\"label\", \"text\"],\n allComponents = this.application.viewAll();\n\n return allComponents.filter((c) => {\n return viewsToAllow.indexOf(c.common().key) > -1;\n });\n }\n\n addFieldToDetail(field, yPosition) {\n if (field == null) return;\n\n let newView = field.detailComponent().newInstance(this.application, this);\n if (newView == null) return;\n\n // set settings to component\n newView.settings = newView.settings ?? {};\n newView.settings.fieldId = field.id;\n newView.settings.labelWidth =\n this.settings.labelWidth ||\n ABViewDetailPropertyComponentDefaults.labelWidth;\n\n // keep alias to support Query that contains alias name\n // [alias].[columnName]\n newView.settings.alias = field.alias;\n\n // TODO : Default settings\n\n newView.position.y = yPosition;\n\n // add a new component\n this._views.push(newView);\n\n return newView;\n }\n};\n","const ABViewDetailItem = require(\"../../platform/views/ABViewDetailItem\");\n\nconst ABViewDetailCustomPropertyComponentDefaults = {};\n\nconst ABViewDetailCustomDefaults = {\n key: \"detailcustom\", // {string} unique key for this view\n icon: \"dot-circle-o\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.detail.custom\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDetailCustomCore extends ABViewDetailItem {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues ?? ABViewDetailCustomDefaults\n );\n }\n\n static common() {\n return ABViewDetailCustomDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailCustomPropertyComponentDefaults;\n }\n};\n","const ABViewDetailItem = require(\"../../platform/views/ABViewDetailItem\");\n\nconst ABViewDetailImagePropertyComponentDefaults = {\n height: 80,\n width: 120,\n};\n\nconst ABViewDetailImageDefaults = {\n key: \"detailimage\", // {string} unique key for this view\n icon: \"image\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.detail.image\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDetailImageCore extends ABViewDetailItem {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues ?? ABViewDetailImageDefaults\n );\n }\n\n static common() {\n return ABViewDetailImageDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailImagePropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.height = parseInt(\n this.settings.height ||\n ABViewDetailImagePropertyComponentDefaults.height\n );\n this.settings.width = parseInt(\n this.settings.width ?? ABViewDetailImagePropertyComponentDefaults.width\n );\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nmodule.exports = class ABViewDetailItemCore extends ABViewWidget {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n detailComponent() {\n let detailView = null;\n\n let curr = this;\n while (\n !curr.isRoot() &&\n curr.parent &&\n curr.key != \"detail\" &&\n curr.key != \"dataview\"\n ) {\n curr = curr.parent;\n }\n\n if (curr.key == \"detail\" || curr.key == \"dataview\") {\n detailView = curr;\n }\n\n return detailView;\n }\n\n field() {\n let detailComponent = this.detailComponent();\n if (detailComponent == null) return null;\n\n let datacollection = detailComponent.datacollection;\n if (datacollection == null) return null;\n\n let object = datacollection.datasource;\n if (object == null) return null;\n\n let field = object.fields((v) => v.id == this.settings.fieldId)[0];\n\n // set .alias to support queries that contains alias name\n // [aliasName].[columnName]\n if (field && this.settings.alias) {\n field.alias = this.settings.alias;\n }\n\n return field;\n }\n\n getCurrentData() {\n let detailCom = this.detailComponent();\n if (!detailCom) return null;\n\n let dv = detailCom.datacollection;\n if (!dv) return null;\n\n let field = this.field();\n if (!field) return null;\n\n let currData = dv.getCursor();\n if (currData) return currData[field.columnName];\n else return null;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n return null;\n }\n};\n","const ABViewDetailItem = require(\"../../platform/views/ABViewDetailItem\");\n\nconst ABViewDetailTextPropertyComponentDefaults = {\n height: 0,\n};\n\nconst ABViewDetailTextDefaults = {\n key: \"detailtext\", // {string} unique key for this view\n icon: \"etsy\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.detail.text\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDetailTextCore extends ABViewDetailItem {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues ?? ABViewDetailTextDefaults\n );\n }\n\n static common() {\n return ABViewDetailTextDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailTextPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.height = parseInt(\n this.settings.height ||\n ABViewDetailTextPropertyComponentDefaults.height\n );\n }\n};\n","const ABViewDetailItem = require(\"../../platform/views/ABViewDetailItem\");\n\nconst ABViewDetailPropertyComponentDefaults = {};\n\nconst ABViewDetailTreeDefaults = {\n key: \"detailtree\", // {string} unique key for this view\n icon: \"sitemap\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.detail.tree\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDetailTextCore extends ABViewDetailItem {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues ?? ABViewDetailTreeDefaults\n );\n }\n\n static common() {\n return ABViewDetailTreeDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailPropertyComponentDefaults;\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewDocxBuilderPropertyComponentDefaults = {\n buttonlabel: \"Download DOCX\",\n dataviewID: null,\n width: 0,\n filename: \"\", // uuid\n filelabel: \"output.docx\",\n language: \"en\", // en\n toolbarBackground: \"ab-background-default\",\n buttonPosition: \"left\",\n};\n\nconst ABViewDefaults = {\n key: \"docxBuilder\", // {string} unique key for this view\n icon: \"file-word-o\", // {string} fa-[icon] reference for this view\n labelKey: \"DOCX Builder\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDocxBuilderCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewDocxBuilderPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n this.unTranslate(this, this, [\"filelabel\", \"buttonlabel\"]);\n\n let obj = super.toObj();\n obj.viewIDs = [];\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.width = parseInt(\n this.settings.width || ABViewDocxBuilderPropertyComponentDefaults.width\n );\n\n this.translate(this, this, [\"filelabel\", \"buttonlabel\"]);\n }\n\n uploadUrl() {\n // TODO: Convert this to use ABFactory.urlFileUpload() or a ABFieldFile\n // to get the URL:\n\n // support uploading template when more than one data source is selected\n const object = this.datacollections[0].datasource;\n\n // NOTE: file-upload API needs to have the id of ANY field.\n const field = object ? object.fields()[0] : null;\n\n return `/file/upload/${object?.id}/${field?.id}/1`;\n }\n\n downloadUrl() {\n return `/file/${this.settings.filename}`;\n }\n\n get languageCode() {\n return (\n this.settings.language ||\n ABViewDocxBuilderPropertyComponentDefaults.language\n );\n }\n\n get datacollections() {\n let dataviewID = (this.settings || {}).dataviewID;\n if (!dataviewID) return [];\n\n let dvList = dataviewID.split(\",\") || [];\n\n return this.AB.datacollections((dv) => dvList.indexOf(dv.id) > -1) || [];\n }\n};\n","const ABView = require(\"../../platform/views/ABView\");\n\nconst ABViewFormButtonPropertyComponentDefaults = {\n includeSave: true,\n saveLabel: \"\",\n includeCancel: false,\n cancelLabel: \"\",\n includeReset: false,\n resetLabel: \"\",\n includeDelete: false,\n deleteLabel: \"\",\n afterCancel: null,\n alignment: \"right\",\n isDefault: false, // mark default button of form widget\n};\n\nconst ABViewFormButtonDefaults = {\n key: \"button\",\n // {string} unique key for this view\n\n icon: \"square\",\n // {string} fa-[icon] reference for this view\n\n labelKey: \"ab.components.button\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormButtonCore extends ABView {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormButtonDefaults\n );\n }\n\n static common() {\n return ABViewFormButtonDefaults;\n }\n\n static defaultValues() {\n return ABViewFormButtonPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n toObj() {\n // labels are multilingual values:\n let labels = [];\n\n if (this.settings.saveLabel) labels.push(\"saveLabel\");\n\n if (this.settings.cancelLabel) labels.push(\"cancelLabel\");\n\n if (this.settings.resetLabel) labels.push(\"resetLabel\");\n\n if (this.settings.deleteLabel) labels.push(\"deleteLabel\");\n\n this.unTranslate(this.settings, this.settings, labels);\n\n let result = super.toObj();\n\n return result;\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n return null;\n }\n\n fromValues(values) {\n super.fromValues(values);\n\n // labels are multilingual values:\n let labels = [];\n\n if (this.settings.saveLabel) labels.push(\"saveLabel\");\n\n if (this.settings.cancelLabel) labels.push(\"cancelLabel\");\n\n if (this.settings.resetLabel) labels.push(\"resetLabel\");\n\n if (this.settings.deleteLabel) labels.push(\"deleteLabel\");\n\n this.unTranslate(this.settings, this.settings, labels);\n\n this.settings.includeSave = JSON.parse(\n (this.settings?.includeSave ?? true) &&\n ABViewFormButtonPropertyComponentDefaults.includeSave\n );\n this.settings.includeCancel = JSON.parse(\n this.settings.includeCancel ||\n ABViewFormButtonPropertyComponentDefaults.includeCancel\n );\n this.settings.includeReset = JSON.parse(\n this.settings.includeReset ||\n ABViewFormButtonPropertyComponentDefaults.includeReset\n );\n this.settings.includeDelete = JSON.parse(\n this.settings.includeDelete ||\n ABViewFormButtonPropertyComponentDefaults.includeDelete\n );\n\n this.settings.isDefault = JSON.parse(\n this.settings.isDefault ||\n ABViewFormButtonPropertyComponentDefaults.isDefault\n );\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormCheckboxPropertyComponentDefaults = {};\n\nconst ABViewFormCheckboxDefaults = {\n key: \"checkbox\", // {string} unique key for this view\n icon: \"check-square-o\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.checkbox\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormCheckboxCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormCheckboxDefaults\n );\n }\n\n static common() {\n return ABViewFormCheckboxDefaults;\n }\n\n static defaultValues() {\n return ABViewFormCheckboxPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormConnectPropertyComponentDefaults = {\n formView: \"\", // id of form to add new data\n filterConditions: {\n // array of filters to apply to the data table\n glue: \"and\",\n rules: [],\n },\n sortFields: [],\n // objectWorkspace: {\n // filterConditions: {\n // // array of filters to apply to the data table\n // glue: \"and\",\n // rules: [],\n // },\n // },\n popupWidth: 700,\n popupHeight: 450,\n};\n\nconst ABViewFormConnectDefaults = {\n key: \"connect\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"Connect\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormConnectCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormConnectDefaults\n );\n }\n\n static common() {\n return ABViewFormConnectDefaults;\n }\n\n static defaultValues() {\n return ABViewFormConnectPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.filterConditions =\n this.settings.filterConditions ||\n ABViewFormConnectPropertyComponentDefaults.filterConditions;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewContainer = require(\"../../platform/views/ABViewContainer\");\nconst ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABRecordRule = require(\"../../rules/ABViewRuleListFormRecordRules\");\nconst ABSubmitRule = require(\"../../rules/ABViewRuleListFormSubmitRules\");\n\nconst ABViewFormDefaults = {\n key: \"form\", // unique key identifier for this ABViewForm\n icon: \"list-alt\", // icon reference: (without 'fa-' )\n labelKey: \"Form\", // {string} the multilingual label key for the class label\n};\n\nconst ABViewFormPropertyComponentDefaults = {\n dataviewID: null,\n showLabel: true,\n labelPosition: \"left\",\n labelWidth: 120,\n height: 200,\n clearOnLoad: false,\n clearOnSave: false,\n displayRules: [],\n editForm: \"none\", // The url pointer of ABViewForm\n\n //\t[{\n //\t\taction: {string},\n //\t\twhen: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tcomparer: {string},\n //\t\t\t\tvalue: {string}\n //\t\t\t}\n //\t\t],\n //\t\tvalues: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tvalue: {object}\n //\t\t\t}\n //\t\t]\n //\t}]\n recordRules: [],\n\n //\t[{\n //\t\taction: {string},\n //\t\twhen: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tcomparer: {string},\n //\t\t\t\tvalue: {string}\n //\t\t\t}\n //\t\t],\n //\t\tvalue: {string}\n //\t}]\n submitRules: [],\n};\n\nmodule.exports = class ABViewFormCore extends ABViewContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewFormDefaults);\n }\n\n static common() {\n return ABViewFormDefaults;\n }\n\n static defaultValues() {\n return ABViewFormPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.labelPosition =\n this.settings.labelPosition ||\n ABViewFormPropertyComponentDefaults.labelPosition;\n\n // convert from \"0\" => true/false\n this.settings.showLabel = JSON.parse(\n this.settings.showLabel != null\n ? this.settings.showLabel\n : ABViewFormPropertyComponentDefaults.showLabel\n );\n this.settings.clearOnLoad = JSON.parse(\n this.settings.clearOnLoad != null\n ? this.settings.clearOnLoad\n : ABViewFormPropertyComponentDefaults.clearOnLoad\n );\n this.settings.clearOnSave = JSON.parse(\n this.settings.clearOnSave != null\n ? this.settings.clearOnSave\n : ABViewFormPropertyComponentDefaults.clearOnSave\n );\n\n // convert from \"0\" => 0\n this.settings.labelWidth = parseInt(\n this.settings.labelWidth == null\n ? ABViewFormPropertyComponentDefaults.labelWidth\n : this.settings.labelWidth\n );\n this.settings.height = parseInt(\n this.settings.height == null\n ? ABViewFormPropertyComponentDefaults.height\n : this.settings.height\n );\n }\n\n // Use this function in kanban\n objectLoad(object) {\n this._currentObject = object;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n var viewsToAllow = [\"label\", \"layout\", \"button\", \"text\"],\n allComponents = this.application.viewAll();\n\n return allComponents.filter((c) => {\n return viewsToAllow.indexOf(c.common().key) > -1;\n });\n }\n\n /**\n * @method fieldComponents()\n *\n * return an array of all the ABViewFormField children\n *\n * @param {fn} filter \ta filter fn to return a set of ABViewFormField that this fn\n *\t\t\t\t\t\treturns true for.\n * @return {array} \tarray of ABViewFormField\n */\n fieldComponents(filter) {\n const flattenComponents = (views) => {\n let components = [];\n\n views.forEach((v) => {\n if (v == null) return;\n\n components.push(v);\n\n if (v._views?.length) {\n components = components.concat(flattenComponents(v._views));\n }\n });\n\n return components;\n };\n\n if (this._views?.length) {\n const allComponents = flattenComponents(this._views);\n\n if (filter == null) {\n filter = (comp) => comp instanceof ABViewFormItem;\n }\n\n return allComponents.filter(filter);\n } else {\n return [];\n }\n }\n\n addFieldToForm(field, yPosition) {\n if (field == null) return;\n\n var fieldComponent = field.formComponent();\n if (fieldComponent == null) return;\n\n var newView = fieldComponent.newInstance(this.application, this);\n if (newView == null) return;\n\n // set settings to component\n newView.settings = newView.settings || {};\n newView.settings.fieldId = field.id;\n // TODO : Default settings\n\n if (yPosition != null) newView.position.y = yPosition;\n\n // add a new component\n this._views.push(newView);\n\n return newView;\n }\n\n get RecordRule() {\n let object = this.datacollection.datasource;\n\n if (this._recordRule == null) {\n this._recordRule = new ABRecordRule();\n }\n\n this._recordRule.formLoad(this);\n this._recordRule.fromSettings(this.settings.recordRules);\n this._recordRule.objectLoad(object);\n\n return this._recordRule;\n }\n\n doRecordRulesPre(rowData) {\n return this.RecordRule.processPre({ data: rowData, form: this });\n }\n\n doRecordRules(rowData) {\n // validate for record rules\n if (rowData) {\n let object = this.datacollection.datasource;\n let ruleValidator = object.isValidData(rowData);\n let isUpdatedDataValid = ruleValidator.pass();\n if (!isUpdatedDataValid) {\n console.error(\"Updated data is invalid.\", { rowData: rowData });\n return Promise.reject(new Error(\"Updated data is invalid.\"));\n }\n }\n\n return this.RecordRule.process({ data: rowData, form: this });\n }\n\n doSubmitRules(rowData) {\n var object = this.datacollection.datasource;\n\n var SubmitRules = new ABSubmitRule();\n SubmitRules.formLoad(this);\n SubmitRules.fromSettings(this.settings.submitRules);\n SubmitRules.objectLoad(object);\n\n return SubmitRules.process({ data: rowData, form: this });\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormCustomPropertyComponentDefaults = {};\n\nconst ABViewFormCustomDefaults = {\n key: \"fieldcustom\",\n // {string} unique key for this view\n icon: \"object-group\",\n // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.custom\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormCustom extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormCustomDefaults\n );\n }\n\n static common() {\n return ABViewFormCustomDefaults;\n }\n\n static defaultValues() {\n return ABViewFormCustomPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormDatepickerPropertyComponentDefaults = {\n timepicker: false,\n};\n\nconst ABViewFormDatepickerDefaults = {\n key: \"datepicker\", // {string} unique key for this view\n icon: \"calendar\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.datepicker\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormDatepickerCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormDatepickerDefaults\n );\n }\n\n static common() {\n return ABViewFormDatepickerDefaults;\n }\n\n static defaultValues() {\n return ABViewFormDatepickerPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABView = require(\"../../platform/views/ABView\");\n\nconst ABViewFormFieldPropertyComponentDefaults = {\n required: 0,\n disable: 0,\n};\n\nmodule.exports = class ABViewFormComponentCore extends ABView {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n static defaultValues() {\n return ABViewFormFieldPropertyComponentDefaults;\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n let form = this.parentFormComponent();\n if (form == null) return null;\n\n let datacollection = form.datacollection;\n if (datacollection == null) return null;\n\n return datacollection;\n }\n\n field() {\n if (this.settings.objectId) {\n let object = this.AB.objectByID(this.settings.objectId);\n if (!object) return null;\n\n return object.fieldByID(this.settings.fieldId);\n } else {\n let form = this.parentFormComponent();\n if (form == null) return null;\n\n let object;\n if (form._currentObject) {\n object = form._currentObject;\n } else {\n let datacollection = form.datacollection;\n if (datacollection == null) return null;\n\n object = datacollection.datasource;\n }\n\n if (object == null) return null;\n\n let field = object.fieldByID(this.settings.fieldId);\n return field;\n }\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormJsonPropertyComponentDefaults = {\n type: \"string\", // 'string', 'systemObject' or 'filter'\n};\n\nconst ABViewFormJsonDefaults = {\n key: \"json\", // {string} unique key for this view\n icon: \"brackets-curly\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.json\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormJsonCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormJsonDefaults\n );\n }\n\n static common() {\n return ABViewFormJsonDefaults;\n }\n\n static defaultValues() {\n return ABViewFormJsonPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormNumberPropertyComponentDefaults = {\n isStepper: 0,\n};\n\nconst ABViewFormNumberDefaults = {\n key: \"numberbox\", // {string} unique key for this view\n icon: \"hashtag\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.number\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormNumberCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormNumberDefaults\n );\n }\n\n static common() {\n return ABViewFormNumberDefaults;\n }\n\n static defaultValues() {\n return ABViewFormNumberPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewFormText instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n this.unTranslate(this, this, [\"label\", \"formLabel\"]);\n\n var obj = super.toObj();\n obj.views = []; // no subviews\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // if this is being instantiated on a read from the Property UI,\n this.settings.isStepper =\n this.settings.isStepper ||\n ABViewFormNumberPropertyComponentDefaults.isStepper;\n\n // convert from \"0\" => 0\n this.settings.isStepper = parseInt(this.settings.isStepper);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormCustom = require(\"../../platform/views/ABViewFormCustom\");\n\nconst ABViewFormReadonlyPropertyComponentDefaults = {};\n\nconst ABViewFormReadonlyDefaults = {\n key: \"fieldreadonly\", // {string} unique key for this view\n icon: \"calculator\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.readonly\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormReadonly extends ABViewFormCustom {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormReadonlyDefaults\n );\n }\n\n static common() {\n return ABViewFormReadonlyDefaults;\n }\n\n static defaultValues() {\n return ABViewFormReadonlyPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormSelectMultiplePropertyComponentDefaults = {\n type: \"multicombo\", // 'richselect' or 'radio'\n};\n\nconst ABSelectMultipleDefaults = {\n key: \"selectmultiple\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.selectmultiple\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormSelectMultipleCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABSelectMultipleDefaults\n );\n }\n\n static common() {\n return ABSelectMultipleDefaults;\n }\n\n static defaultValues() {\n return ABViewFormSelectMultiplePropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormSelectSinglePropertyComponentDefaults = {\n type: \"richselect\", // 'richselect' or 'radio'\n};\n\nconst ABSelectSingleDefaults = {\n key: \"selectsingle\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.selectsingle\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormSelectSingleCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABSelectSingleDefaults\n );\n }\n\n static common() {\n return ABSelectSingleDefaults;\n }\n\n static defaultValues() {\n return ABViewFormSelectSinglePropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormTextboxPropertyComponentDefaults = {\n type: \"single\", // 'single', 'multiple' or 'rich'\n};\n\nconst ABViewFormTextboxDefaults = {\n key: \"textbox\", // {string} unique key for this view\n icon: \"i-cursor\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.textbox\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormTextboxCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormTextboxDefaults\n );\n }\n\n static common() {\n return ABViewFormTextboxDefaults;\n }\n\n static defaultValues() {\n return ABViewFormTextboxPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormCustom = require(\"../../platform/views/ABViewFormCustom\");\n\nconst ABViewFormTreePropertyComponentDefaults = {};\n\nconst ABTreeDefaults = {\n key: \"formtree\", // {string} unique key for this view\n icon: \"sitemap\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.tree\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormTreeCore extends ABViewFormCustom {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABTreeDefaults);\n }\n\n static common() {\n return ABTreeDefaults;\n }\n\n static defaultValues() {\n return ABViewFormTreePropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewGanttPropertyComponentDefaults = {\n dataviewID: \"\",\n // {string}\n // {ABDatacollection.id} of the datacollection that contains the data for\n // the Gantt chart.\n\n titleFieldID: \"\",\n // {string}\n // {ABFieldXXX.id} of the field that contains the value of the title\n // ABFieldString, ABFieldLongText\n\n startDateFieldID: \"\",\n // {string}\n // {ABFieldDate.id} of the field that contains the start date\n\n endDateFieldID: \"\",\n // {string}\n // {ABFieldDate.id} of the field that contains the end date\n\n durationFieldID: \"\",\n // {string}\n // {ABFieldNumber.id} of the field that contains the duration\n\n progressFieldID: \"\",\n // {string}\n // {ABFieldNumber.id} of the field that marks the progress\n\n notesFieldID: \"\",\n // {string}\n // {ABFieldXXX.id} of the field that contains the value of the title\n // ABFieldString, ABFieldLongText\n};\n\nconst ABViewDefaults = {\n key: \"gantt\", // {string} unique key for this view\n icon: \"tasks\", // {string} fa-[icon] reference for this view\n labelKey: \"Gantt\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewGanttCore extends ABViewWidget {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewGanttPropertyComponentDefaults;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n Object.keys(ABViewGanttPropertyComponentDefaults).forEach((k) => {\n this.settings[k] =\n this.settings[k] || ABViewGanttPropertyComponentDefaults[k];\n });\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewGridPropertyComponentDefaults = {\n label: \"\",\n // {string}\n // label is required and you can add more if the component needs them\n\n // format:0 \t// 0 - normal, 1 - title, 2 - description\n dataviewID: \"\",\n // {uuid}\n // uuid of ABDataCollection that drives the data for our Grid\n\n padding: 17,\n // {int}\n // the default padding surrounding the component\n\n showToolbar: 1,\n // {bool}\n // do we show our toolbar?\n\n isEditable: 0,\n // {bool}\n // do we allow editing in the grid?\n\n massUpdate: 0,\n // {bool}\n // do we allow the Mass Update capability? (row checkboxes and the\n // MassUpdate popup)\n\n allowDelete: 0,\n // {bool}\n // do we allow deleting multiple rows at a time? Mass Delete.\n\n // isFilterable:0,\n\n isSortable: 1,\n // {bool}\n // do we allow the sort options.\n\n isExportable: 0,\n // {bool}\n // do we enable the webix export from grid capabilities?\n\n // linkedObject:'',\n // linkedField:'',\n // linkedPage:'',\n // linkedPageView:'',\n // linkedEditPage:'',\n // linkedEditPageForm:'',\n\n detailsPage: \"\",\n // {ABViewPage.id}\n // the ABViewPage that has the details component.\n\n detailsTab: \"\",\n // {ABViewTab.id}\n // the ABViewTab component, that has the details component.\n // NOTE: if your details is embedded on a TAB, we need both the\n // .detailsPage & .detailsTab to successfully show the item.\n\n editPage: \"\",\n // {ABViewPage.id}\n // the ABViewPage that has the edit component.\n\n editTab: \"\",\n // {ABViewTab.id}\n // the ABViewTab component, that has the edit component.\n // NOTE: if your editor is embedded on a TAB, we need both the\n // .editPage & .editTab to successfully show the form.\n\n trackView: 0,\n // {bool}\n // Do we offer the ability to track changes to this object/row?\n\n frozenColumnID: \"\",\n // {ABField.id}\n // id of column you want to stop freezing the left hand side at.\n\n hiddenFields: [],\n // {array} [ ABField.id, ABField.id, ... ]\n // array of [ids] to add hidden:true to\n\n summaryColumns: [],\n // {array} [ ABField.id, ABField.id, ... ]\n // array of [ids] to add the SUM footer to\n\n countColumns: [],\n // {array} [ ABField.id, ABField.id, ... ]\n // array of [ids] to add the Count footer to\n\n // TODO: get rid of objectWorkspace!\n objectWorkspace: {\n // sortFields:[], // array of columns with their sort configurations\n // filterConditions:[], // array of filters to apply to the data table\n frozenColumnID: \"\", // id of column you want to stop freezing\n hiddenFields: [], // array of [ids] to add hidden:true to\n summaryColumns: [],\n countColumns: [],\n },\n gridFilter: {\n filterOption: 1,\n userFilterPosition: \"toolbar\",\n isGlobalToolbar: 1,\n },\n // summaryFields: [], // array of [field ids] to add the summary column in footer\n // countFields: [], // array of [field ids] to add the summary column in footer\n\n height: 0,\n // {int}\n // The Height of our Grid.\n // See ../views/ABViewDataview.js\n\n hideHeader: 0,\n labelAsField: 0,\n hideButtons: 0,\n groupBy: \"\", // id of field\n\n // TODO: add to ABDesigner.interface design:\n columnConfig: [],\n // {array} [ {columnHeader}, {columnHeader} ... ]\n // An array of column headers for the grid to display. These should\n // be generated at Design time, and can allow the designer to ORDER the\n // columns, assign column widths, fillspace, etc...\n // {columnHeader}\n // The minimum amount of information a Grid needs for it's customization\n // .id {string} ABField.columnName\n // .fieldId {string} ABField.id\n // .width {int}\n // .fillspace {bool}\n // .minwidth\n //\n // When displaying column headers, we will ask the\n // CurrentObject.columnHeaders(), and then modify them with our settings\n // here.\n\n saveLocal: 1,\n // {bool}\n // Allow saving of local changes to our grid display. This will enable\n // a user to modify the Grid display locally.\n};\n\nconst ABViewDefaults = {\n key: \"grid\", // {string} unique key for this view\n icon: \"table\", // {string} fa-[icon] reference for this view\n labelKey: \"Grid\", // {string} the multilingual label key for the class label\n};\n\n/**\n * @function settingsDefault()\n * Verifies a given field is set and if not, defaults to what we havein our\n * ABViewGridPropertyComponentDefaults.\n * NOTE: use this fn() for values that are NOT TRUTHY ... so not for numeric\n * 1 or 0.\n * @param {hash} base\n * The current settings value hash.\n * @param {string} field\n * The parameter we are checking.\n */\nfunction settingsDefault(base, field) {\n if (typeof base[field] == \"undefined\") {\n base[field] = ABViewGridPropertyComponentDefaults[field];\n return;\n }\n base[field] = base[field] || ABViewGridPropertyComponentDefaults[field];\n}\n\n/**\n * @function settingsDefaultJSON()\n * Verifies a given field is set and if not, defaults to what we havein our\n * ABViewGridPropertyComponentDefaults.\n * NOTE: use this fn() for values that ARE TRUTHY ... so for numeric 1 or 0\n * @param {hash} base\n * The current settings value hash.\n * @param {string} field\n * The parameter we are checking.\n */\nfunction settingsDefaultJSON(base, field) {\n try {\n if (typeof base[field] == \"string\") {\n base[field] = JSON.parse(base[field]);\n }\n } catch (e) {\n base[field] = ABViewGridPropertyComponentDefaults[field];\n }\n}\n\nmodule.exports = class ABViewGridCore extends ABViewWidget {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewGridPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // if this is being instantiated on a read from the Property UI,\n settingsDefault(this.settings, \"dataviewID\");\n\n // Convert to boolean\n // these values are sometimes 0 (number) at this point so the JSON.parse\n // with the || (or) statement was always falling to the default so I am\n // trying to parse the value...if it fails we use the default value\n settingsDefaultJSON(this.settings, \"padding\");\n settingsDefaultJSON(this.settings, \"showToolbar\");\n settingsDefaultJSON(this.settings, \"isEditable\");\n settingsDefaultJSON(this.settings, \"massUpdate\");\n settingsDefaultJSON(this.settings, \"allowDelete\");\n // this.settings.isFilterable = JSON.parse(this.settings.isFilterable || ABViewGridPropertyComponentDefaults.isFilterable);\n settingsDefaultJSON(this.settings, \"isSortable\");\n settingsDefaultJSON(this.settings, \"isExportable\");\n settingsDefaultJSON(this.settings, \"hideHeader\");\n settingsDefaultJSON(this.settings, \"labelAsField\");\n settingsDefaultJSON(this.settings, \"hideButtons\");\n settingsDefaultJSON(this.settings, \"columnConfig\");\n settingsDefaultJSON(this.settings, \"saveLocal\");\n\n this.settings.gridFilter =\n this.settings.gridFilter ||\n ABViewGridPropertyComponentDefaults.gridFilter;\n\n try {\n this.settings.gridFilter.filterOption = JSON.parse(\n this.settings.gridFilter.filterOption\n );\n } catch (e) {\n this.settings.gridFilter.filterOption =\n ABViewGridPropertyComponentDefaults.gridFilter.filterOption;\n }\n\n try {\n this.settings.gridFilter.isGlobalToolbar = JSON.parse(\n this.settings.gridFilter.isGlobalToolbar\n );\n } catch (e) {\n this.settings.gridFilter.isGlobalToolbar =\n ABViewGridPropertyComponentDefaults.gridFilter.isGlobalToolbar;\n }\n\n // this.settings.linkedObject = this.settings.linkedObject || ABViewGridPropertyComponentDefaults.linkedObject;\n // this.settings.linkedField = this.settings.linkedField || ABViewGridPropertyComponentDefaults.linkedField;\n // this.settings.linkedPage = this.settings.linkedPage || ABViewGridPropertyComponentDefaults.linkedPage;\n // this.settings.linkedPageView = this.settings.linkedPageView || ABViewGridPropertyComponentDefaults.linkedPageView;\n // this.settings.linkedEditPage = this.settings.linkedEditPage || ABViewGridPropertyComponentDefaults.linkedEditPage;\n // this.settings.linkedEditPageForm = this.settings.linkedEditPageForm || ABViewGridPropertyComponentDefaults.linkedEditPageForm;\n\n settingsDefault(this.settings, \"detailsPage\");\n settingsDefault(this.settings, \"editPage\");\n settingsDefault(this.settings, \"detailsTab\");\n settingsDefault(this.settings, \"editTab\");\n settingsDefaultJSON(this.settings, \"trackView\");\n\n // TODO: remove objectworkspace!\n // this.settings.objectWorkspace =\n // this.settings.objectWorkspace ||\n // ABViewGridPropertyComponentDefaults.objectWorkspace;\n\n // if (typeof this.settings.objectWorkspace != \"undefined\") {\n // if (typeof this.settings.objectWorkspace.sortFields == \"undefined\")\n // this.settings.objectWorkspace.sortFields = [];\n // if (\n // typeof this.settings.objectWorkspace.filterConditions == \"undefined\"\n // )\n // this.settings.objectWorkspace.filterConditions = [];\n // if (typeof this.settings.objectWorkspace.frozenColumnID == \"undefined\")\n // this.settings.objectWorkspace.frozenColumnID = \"\";\n // if (typeof this.settings.objectWorkspace.hiddenFields == \"undefined\")\n // this.settings.objectWorkspace.hiddenFields = [];\n // if (typeof this.settings.objectWorkspace.summaryColumns == \"undefined\")\n // this.settings.objectWorkspace.summaryColumns = [];\n // if (typeof this.settings.objectWorkspace.countColumns == \"undefined\")\n // this.settings.objectWorkspace.countColumns = [];\n // }\n\n var owFields = [\n \"sortFields\",\n \"filterConditions\",\n \"frozenColumnID\",\n \"hiddenFields\",\n \"summaryColumns\",\n \"countColumns\",\n ];\n // Transition: if we have an .objectWorkspace, copy those values in here:\n if (this.settings.objectWorkspace) {\n owFields.forEach((f) => {\n if (this.settings[f] == null)\n this.settings[f] = this.settings.objectWorkspace[f];\n });\n }\n\n // make sure they have actual default values now.\n owFields.forEach((f) => {\n settingsDefault(this.settings, f);\n });\n\n // we are not allowed to have sub views:\n this._views = [];\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n removeField(field, cb) {\n let shouldSave = false;\n\n // check to see if there is a frozenColumnID and if it matches the\n // deleted field\n if (this.settings?.frozenColumnID == field.columnName) {\n // remove the column name from the frozen column id\n this.settings.frozenColumnID = \"\";\n // flag the object to be saved later\n shouldSave = true;\n }\n\n // check to see if there are hidden fields\n if (this.settings.hiddenFields?.length) {\n // find if the deleted field is in the array\n let index = this.settings.hiddenFields.indexOf(field.columnName);\n // if so splice it out of the array\n if (index > -1) {\n this.settings.hiddenFields.splice(index, 1);\n // flag the object to be saved later\n shouldSave = true;\n }\n }\n\n // check to see if there are Summary fields\n if (this.settings.summaryColumns?.length) {\n // find if the deleted field is in the array\n let index = this.settings.summaryColumns.indexOf(field.id);\n // if so splice it out of the array\n if (index > -1) {\n this.settings.summaryColumns.splice(index, 1);\n // flag the object to be saved later\n shouldSave = true;\n }\n }\n\n // check to see if there are hidden fields\n if (this.settings.countColumns?.length) {\n // find if the deleted field is in the array\n let index = this.settings.countColumns.indexOf(field.id);\n // if so splice it out of the array\n if (index > -1) {\n this.settings.countColumns.splice(index, 1);\n // flag the object to be saved later\n shouldSave = true;\n }\n }\n // if settings were changed call the callback\n\n cb(null, shouldSave);\n }\n\n copyUpdateProperyList() {\n return [\"detailsPage\", \"detailsTab\", \"editPage\", \"editTab\"];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewImagePropertyComponentDefaults = {\n filename: \"\",\n width: 200,\n height: 100,\n};\n\nconst ABViewDefaults = {\n key: \"image\", // {string} unique key for this view\n icon: \"picture-o\", // {string} fa-[icon] reference for this view\n labelKey: \"Image\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewImageCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewImagePropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n return null;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.width = parseInt(\n this.settings.width || ABViewImagePropertyComponentDefaults.width\n );\n this.settings.height = parseInt(\n this.settings.height || ABViewImagePropertyComponentDefaults.height\n );\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewKanbanPropertyComponentDefaults = {\n dataviewID: null,\n // {uuid}\n // The ABDataCollection.uuid that we are using to store the data.\n // NOTE: we actually use the DC to get the ABObject it is connected to.\n\n editFields: [],\n // {array}\n // An array of {ABField.id} that determines which fields should show up\n // in the editor.\n\n verticalGroupingField: \"\",\n // {ABField.id}\n // the .id of the ABField instance that determines the Vertical Grouping\n // of the Kanban.\n\n horizontalGroupingField: \"\",\n // {ABField.id}\n // the .id of the ABField instance that determines the horizontal Grouping\n // of the Kanban.\n\n ownerField: \"\",\n // {ABFieldUser.id}\n // the .id of the ABFieldUser instance that determines the owner of the\n // entries.\n\n template: \"\",\n // {json}\n // The {ABViewText} definition used to display the template for this KanBan.\n //\n // A display template used for displaying the information in each Card. The\n // template is a basic string with special placeholders: {field.id}\n // Given a row of data, the current object will scan the template for any\n // placeholders matching one of it's fields, and then update it with the\n // current value.\n};\n\nconst ABViewDefaults = {\n key: \"kanban\",\n // {string}\n // unique key identifier for this ABView object\n\n icon: \"columns\",\n // {string}\n // font-awesome icon reference: (without 'fa-' )\n\n labelKey: \"Kanban\",\n // {string}\n // the multilingual label key\n // NOTE: will be used as L(labelKey)\n};\n\nmodule.exports = class ABViewKanbanCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n fromValues(values) {\n super.fromValues(values);\n\n // set a default .template value\n if (!this.settings.template) {\n this.settings.template = { id: `${this.id}_template`, key: \"text\" };\n this.settings.template.text = this.settings.textTemplate;\n }\n\n this.TextTemplate = this.AB.viewNewDetatched(this.settings.template);\n }\n\n toObj() {\n var obj = super.toObj();\n obj.settings.template = this.TextTemplate.toObj();\n // NOTE: this corrects the initial save where this.id == undefined\n // all the rest will set the .id correctly.\n obj.settings.template.id = `${this.id}_template`;\n return obj;\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewKanbanPropertyComponentDefaults;\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewLabelPropertyComponentDefaults = {\n text: \"\",\n format: 0, // 0 - normal, 1 - title, 2 - description\n alignment: \"left\",\n};\n\nconst ABViewDefaults = {\n key: \"label\", // {string} unique key for this view\n icon: \"font\", // {string} fa-[icon] reference for this view\n labelKey: \"Label\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewLabelCore extends ABViewWidget {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewLabelPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n this.unTranslate(this, this, [\"label\", \"text\"]);\n\n var obj = super.toObj();\n obj.viewIDs = [];\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values); // <-- this performs the translations\n\n // if this is being instantiated on a read from the Property UI,\n // .text is coming in under .settings.label\n this.text = values.text || values.settings.text || \"*text\";\n\n this.settings.format =\n this.settings.format || ABViewLabelPropertyComponentDefaults.format;\n this.settings.alignment =\n this.settings.alignment ||\n ABViewLabelPropertyComponentDefaults.alignment;\n\n // we are not allowed to have sub views:\n this._views = [];\n\n // convert from \"0\" => 0\n this.settings.format = parseInt(this.settings.format);\n\n this.translate(this, this, [\"label\", \"text\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n //// Allow external interface to manipulate our settings:\n\n /**\n * @method formatNormal\n * display text in the normal format.\n */\n formatNormal() {\n this.settings.format = 0;\n }\n\n /**\n * @method formatTitle\n * display text as a Title.\n */\n formatTitle() {\n this.settings.format = 1;\n }\n\n /**\n * @method formatDescription\n * display text as a description.\n */\n formatDescription() {\n this.settings.format = 2;\n }\n};\n","const ABViewContainer = require(\"../../platform/views/ABViewContainer\");\nconst ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst PropertyComponentDefaults = {\n label: \"\",\n numColumns: 1, // The number of columns for this layout\n};\n\nconst ABViewDefaults = {\n key: \"layout\", // {string} unique key for this view\n icon: \"columns\", // {string} fa-[icon] reference for this view\n labelKey: \"Layout\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewLayoutCore extends ABViewWidget {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return PropertyComponentDefaults;\n }\n\n /**\n * @method addColumn\n * method to actually add a new ABView as one of our columns.\n * This is called by the static .addView() method.\n */\n addColumn() {\n this._views.push(\n this.application.viewNew(\n {\n key: ABViewContainer.common().key,\n },\n this.application,\n this\n )\n );\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n * @param {bool} isEdited is this component currently in the Interface Editor\n * @return {array} of ABView objects.\n */\n componentList(isEdited) {\n if (isEdited) {\n // if the layout component is being edited in the editor (isEdited == true)\n // then we return [];\n return [];\n } else {\n // the layout view doesn't care what components are offered, it get's\n // the list from it's parent view.\n // ## NOTE: layout views should not be root views.\n if (this.parent) {\n return this.parent.componentList(false);\n } else {\n return [];\n }\n }\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n return null;\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewListPropertyComponentDefaults = {\n dataviewID: null,\n field: null,\n height: 0,\n};\n\nconst ABViewDefaults = {\n key: \"list\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"List\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewLabelCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewListPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n field() {\n var dv = this.datacollection;\n if (!dv) return null;\n\n var object = dv.datasource;\n if (!object) return null;\n\n return object.fieldByID(this.settings.field);\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewMenuPropertyComponentDefaults = {\n orientation: \"x\",\n buttonStyle: \"ab-menu-default\",\n menuAlignment: \"ab-menu-left\",\n menuInToolbar: 1,\n menuPadding: 10,\n menuTheme: \"bg_gray\",\n menuPosition: \"left\",\n menuTextLeft: \"\",\n menuTextRight: \"\",\n menuTextCenter: \"\",\n // [\n // \t\t{\n //\t\t\tpageId: uuid,\n //\t\t\ttabId: uuid,\n //\t\t\ttype: string, // \"page\", \"tab\"\n //\t\t\tisChecked: bool,\n //\t\t\taliasname: string,\n //\t\t\ttranslations: []\n //\t\t}\n // ]\n pages: [],\n order: [],\n};\n\nconst ABMenuDefaults = {\n key: \"menu\", // {string} unique key for this view\n icon: \"th-large\", // {string} fa-[icon] reference for this view\n labelKey: \"Menu\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewMenuCore extends ABViewWidget {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABMenuDefaults);\n }\n\n static common() {\n return ABMenuDefaults;\n }\n\n static defaultValues() {\n return ABViewMenuPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewMenu instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n this.unTranslate(this, this, [\n \"menuTextLeft\",\n \"menuTextCenter\",\n \"menuTextRight\",\n ]);\n if (this.settings.pages) {\n this.settings.pages.forEach((page) => {\n this.unTranslate(page, page, [\"aliasname\"]);\n });\n }\n\n var obj = super.toObj();\n obj.viewIDs = [];\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.translate(this, this, [\n \"menuTextLeft\",\n \"menuTextCenter\",\n \"menuTextRight\",\n ]);\n\n this.settings.pages =\n this.settings.pages || ABViewMenuPropertyComponentDefaults.pages;\n\n for (var i = 0; i < this.settings.pages.length; i++) {\n var page = this.settings.pages[i];\n if (page instanceof Object) {\n page.isChecked = JSON.parse(page.isChecked || false);\n\n this.translate(page, page, [\"aliasname\"]);\n }\n // Compatible with old data\n else if (typeof page == \"string\") {\n this.settings.pages[i] = {\n pageId: page,\n isChecked: true,\n };\n }\n }\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n ClearPagesInView(view) {\n // clear menu items\n if (view && view.count() > 1) {\n view.find({}).forEach((item) => {\n view.remove(item.id);\n });\n }\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n return null;\n }\n\n AddPagesToView(view, pages) {\n if (!view || !pages) return;\n\n (pages || []).forEach((displayPage) => {\n if (displayPage.isChecked) {\n let existsPage = this.application.pages(\n (p) => p.id == displayPage.pageId,\n true\n )[0];\n if (!existsPage) return;\n\n var pageAccessLevel = existsPage.getUserAccess();\n if (pageAccessLevel == 0) return;\n\n if (displayPage.tabId) {\n let existsTab = this.application.views(\n (v) => v.id == displayPage.tabId,\n true\n )[0];\n if (!existsTab) return;\n\n var tabAccessLevel = existsTab.getUserAccess();\n if (tabAccessLevel == 0) return;\n }\n\n let label = this.getAliasname(displayPage);\n // create a temporaty store for the menu item\n var menuItem;\n // check if page has a parent or not\n if (displayPage.parent && displayPage.parent != \"0\") {\n // if page has a parent attempt to grab its submenu\n menuItem = view.getSubMenu(displayPage.parent);\n } else {\n // if the page doesn't have parent use the current menu\n menuItem = view;\n }\n // if the menu item doesn't have a menu selected find it\n if (menuItem == null) {\n // get the menu item\n var curMenu = view.getMenuItem(displayPage.parent);\n // create a submenu placeholder\n curMenu.submenu = [];\n // update the menu with the new submenu included\n view.refresh(displayPage.parent);\n // get the submenu we just created\n menuItem = view.getSubMenu(displayPage.parent);\n }\n if (menuItem.exists(displayPage.tabId || displayPage.pageId))\n return;\n // add a new item to the menu/submenu\n menuItem.add(\n {\n id: displayPage.tabId || displayPage.pageId,\n value: label,\n type: displayPage.type,\n pageId: displayPage.pageId,\n icon: displayPage.icon\n ? \"fa fa-fw fa-\" + displayPage.icon\n : \"\",\n },\n displayPage.position ? parseInt(displayPage.position) : 0\n );\n }\n });\n }\n\n /**\n * @method getAliasname\n * @param pageInfo - an object in settings\n * {\n * \tpageId: uuid,\n * \ttabId: uuid,\n * \ttype: string, - \"page\" or \"tab\"\n * \tisChecked: bool,\n * \taliasname: string,\n *\ttranslations: []\n *}\n *\n * @return {string}\n */\n getAliasname(pageInfo) {\n var lang = this.AB.Multilingual.currentLanguage();\n var translation = pageInfo.translations.filter((t) => {\n return t.language_code == lang;\n });\n\n var label = \"\";\n\n if (translation.length) {\n if (translation[0].aliasname) {\n label = translation[0].aliasname;\n } else if (translation[0].label) {\n label = translation[0].label;\n }\n }\n\n // Just in case there isn't one stored in the translations yet\n if (!label && pageInfo.aliasname) {\n label = pageInfo.aliasname;\n }\n\n // if alias is empty, then find label of page or tab\n if (\n !label ||\n // remove [en] or [th] etc.\n !label.replace(/\\[.{2,}\\]/g, \"\")\n ) {\n // first check to see if we are actually on a page\n // if not recursivly look up for the nearest parent page\n var pageId;\n if (pageInfo.pageId) {\n pageId = pageInfo.pageId;\n } else {\n pageId = this.getParentPageId(pageInfo);\n }\n // find label of the actual page\n var page = this.application.pages((p) => p.id == pageId, true)[0];\n if (page) {\n // find label of the tab view\n if (pageInfo.type == \"tab\" || pageInfo.key == \"viewcontainer\") {\n var tabView = page.views(\n (v) => v.id == pageInfo.tabId || v.id == pageInfo.id,\n true\n )[0];\n if (tabView) {\n label = tabView.label;\n }\n } else {\n label = page.label;\n }\n }\n }\n\n return label;\n }\n\n getParentPageId(currentView) {\n if (currentView.key != \"page\") {\n return this.getParentPageId(currentView.parent);\n } else {\n return currentView.id;\n }\n }\n\n copy(lookUpIds, parent) {\n return super.copy(lookUpIds, parent).then((result) => {\n // update ids of page's settings\n (result.settings.pages || []).forEach((p, i) => {\n let page = result.settings.pages[i];\n\n // Compatible with old data\n if (typeof page == \"string\") {\n result.settings.pages[i] = lookUpIds[page];\n } else {\n page.pageId = lookUpIds[page.pageId];\n page.tabId = lookUpIds[page.tabId];\n }\n });\n\n return result.save().then(() => {\n return result;\n });\n });\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABSubmitRule = require(\"../../rules/ABViewRuleListFormSubmitRules\");\n\nconst ABViewPDFImporterPropertyComponentDefaults = {\n dataviewID: null,\n fieldID: null,\n\n //\t[{\n //\t\taction: {string},\n //\t\twhen: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tcomparer: {string},\n //\t\t\t\tvalue: {string}\n //\t\t\t}\n //\t\t],\n //\t\tvalue: {string}\n //\t}]\n submitRules: [],\n};\n\nconst ABViewDefaults = {\n key: \"pdfImporter\", // {string} unique key for this view\n icon: \"file-pdf-o\", // {string} fa-[icon] reference for this view\n labelKey: \"PDF Importer\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewPDFImporterCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewPDFImporterPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.dataviewID =\n this.settings.dataviewID ??\n ABViewPDFImporterPropertyComponentDefaults.dataviewID;\n\n this.settings.fieldID =\n this.settings.fieldID ??\n ABViewPDFImporterPropertyComponentDefaults.fieldID;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n var obj = super.toObj();\n\n obj.settings = obj.settings ?? {};\n\n return obj;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n doSubmitRules(rowDatas) {\n const object = this.datacollection.datasource;\n\n const SubmitRules = new ABSubmitRule();\n SubmitRules.formLoad(this);\n SubmitRules.fromSettings(this.settings.submitRules);\n SubmitRules.objectLoad(object);\n\n if (rowDatas && !Array.isArray(rowDatas)) rowDatas = [rowDatas];\n\n rowDatas?.forEach((rowData) => {\n SubmitRules.process({ data: rowData, form: this });\n });\n }\n};\n","/*\n * ABViewPage\n *\n * An ABView that represents a \"Page\" in the system.\n *\n * Pages are\n *\t- allowed to be displayed in the interface list\n *\t- return a full list of components that can be added to the view editor\n *\n *\n */\n\nconst ABViewContainer = require(\"../../platform/views/ABViewContainer\");\n// var ABViewManager = require(\"../ABViewManager\");\n\n// function L(key, altText) {\n// return AD.lang.label.getLabel(key) || altText;\n// }\n\nconst ABViewDefaults = {\n key: \"page\", // unique key identifier for this ABView\n icon: \"file\", // icon reference: (without 'fa-' )\n};\n\nconst ABPropertyComponentDefaults = {\n type: \"page\", // 'page', 'popup' or 'reportPage'\n popupWidth: 700,\n popupHeight: 450,\n pageWidth: null,\n fixedPageWidth: 0,\n pageBackground: \"ab-background-default\",\n};\n\nmodule.exports = class ABViewPageCore extends ABViewContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n\n // \t{\n // \t\tid:'uuid',\t\t\t\t\t// uuid value for this obj\n // \t\tkey:'viewKey',\t\t\t\t// unique key for this View Type\n // \t\ticon:'font',\t\t\t\t// fa-[icon] reference for an icon for this View Type\n\n //\t\tname: '',\t\t\t\t\t// unique page name\n\n // \t\tlabel:'',\t\t\t\t\t// pulled from translation\n\n //\t\tsettings: {\t\t\t\t\t// unique settings for the type of field\n //\t\t},\n\n //\t\ttranslations:[]\n // \t}\n\n this.parent = null; // will be set by the pageNew() that creates this obj.\n // {obj} .parent\n // this points to the ABView object that manages this object as a child.\n // this param is shared across ABViews as well as ABViewPage, but has\n // different implications ... so we default an ABViewPage.parent = null\n // and the place that Creates the Page must assign the .parent externally.\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABPropertyComponentDefaults;\n }\n\n static getPageActionKey(view) {\n return [\n \"opstools\",\n \"AB_\" + String(view.application.name).replace(/[^a-z0-9]/gi, \"\"),\n String(view.name)\n .replace(/[^a-z0-9]/gi, \"\")\n .toLowerCase(),\n \"view\",\n ].join(\".\");\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewPage instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n var obj = super.toObj();\n\n obj.name = this.name;\n\n obj.myAppID = this.myAppID;\n\n // icon of popup page\n if (this.settings.type == \"popup\") obj.icon = \"clone\";\n\n // set label of the page\n if (!this.label || this.label == \"?label?\") obj.label = obj.name;\n\n // compile our pages\n obj.pageIDs = (this._pages || []).map((p) => p.id);\n\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // icon of popup page\n if (values.settings.type == \"popup\") this.icon = \"clone\";\n\n // set label of the page\n if (!this.label || this.label == \"?label?\") this.label = this.name;\n\n // track which application this Page belongs to:\n this.myAppID = values.myAppID;\n if (!this.myAppID && this.application) {\n this.myAppID = this.application.id;\n }\n\n // now properly handle our sub pages.\n var pages = [];\n (values.pageIDs || []).forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (def) {\n pages.push(this.pageNew(def));\n } else {\n this.AB.error(\n `App[${this.application.name}][${this.application.id}]->Page[${this.name}][${this.id}] referenced an unknown Page[${id}]`\n );\n }\n });\n this._pages = pages;\n\n // the default columns of ABView is 1\n this.settings.columns = this.settings.columns || 1;\n this.settings.gravity = this.settings.gravity || [1];\n\n // convert from \"0\" => 0\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABApplication\n *\n * also remove it from our _AllApplications\n *\n * @return {Promise}\n */\n destroy() {\n return Promise.resolve()\n .then(() => {\n // When deleting an ABViewPage\n // be sure to remove any of it's ABViewPages as well\n // This cleans out any dangling ABDefinitions and cleans up the\n // OpsPortal Permissions:\n\n var allPageDeletes = [];\n var allPages = this.pages();\n this._pages = [];\n // doing ._pages = [] prevents any of my updates when\n // a sub-page is .destroy()ed\n\n allPages.forEach((p) => {\n allPageDeletes.push(p.destroy());\n });\n return Promise.all(allPageDeletes);\n })\n .then(() => {\n var parent = this.parent || this.application;\n\n return parent.pageRemove(this);\n })\n .then(() => {\n return super.destroy();\n });\n\n // return new Promise((resolve, reject) => {\n // // verify we have been .save() before:\n // if (this.id) {\n // this.application\n // .viewDestroy(this)\n // .then(() => {\n // // remove the page in list\n // var parent = this.parent || this.application;\n // var remainingPages = parent.pages((p) => {\n // return p.id != this.id;\n // });\n // parent._pages = remainingPages;\n\n // resolve();\n // })\n // .catch(reject);\n // } else {\n // resolve(); // nothing to do really\n // }\n // });\n }\n\n /**\n * @method save()\n * persist this instance of ABViewPage\n * @return {Promise}\n * .resolve( {this} )\n */\n save() {\n return Promise.resolve()\n .then(() => {\n // this creates our .id\n return super.save();\n })\n .then(() => {\n // now we can persist ourself in our parent\n var parent = this.parent || this.application;\n\n return parent.pageInsert(this);\n })\n .then(() => {\n return this;\n });\n }\n\n /**\n * @method refreshInstance()\n * This returns a NEW instance of a ABViewPage based upon the latest\n * version of it's Definition. It also resolves any current listeners\n * this copy currently has and prepare this to discard itself.\n */\n refreshInstance() {\n console.warn(\n \"This version of ABViewPage hasn't updated it's refreshInstance()\",\n this\n );\n return this;\n }\n\n ///\n /// Pages\n ///\n\n /**\n * @method pages()\n *\n * return an array of all the ABViewPages for this ABViewPage.\n *\n * @param {fn} filter\t\ta filter fn to return a set of ABViewPages that this fn\n *\t\t\t\t\t\t\treturns true for.\n * @param {boolean} deep\tflag to find in sub pages\n *\n * @return {array}\t\t\tarray of ABViewPages\n */\n pages(filter = () => true, deep = false) {\n var result = [];\n\n // find into sub-pages recursively\n if (filter && deep) {\n if (this._pages && this._pages.length > 0) {\n result = this._pages.filter(filter);\n\n if (result.length < 1) {\n this._pages.forEach((p) => {\n var subPages = p.pages(filter, deep);\n if (subPages && subPages.length > 0) {\n result = subPages;\n }\n });\n }\n }\n }\n // find root pages\n else {\n result = this._pages.filter(filter);\n }\n\n return result;\n }\n\n /**\n * @method pageInsert()\n *\n * save the given ABViewPage in our ._pages array and persist the current\n * values if they changed.\n *\n * @param {ABViewPage} page The instance of the page to save.\n * @return {Promise}\n */\n pageInsert(page) {\n var isIncluded = this.pages((o) => o.id === page.id).length > 0;\n if (!isIncluded) {\n // if not already included, then add and save the Obj definition:\n this._pages.push(page);\n return this.save();\n }\n\n // Nothing was required so return\n return Promise.resolve();\n }\n\n /**\n * @method pageNew()\n *\n * return an instance of a new (unsaved) ABViewPage that is tied to this\n * ABViewPage.\n *\n * NOTE: this new page is not included in our this.pages until a .save()\n * is performed on the page.\n *\n * @return {ABViewPage}\n */\n pageNew(values) {\n // make sure this is an ABViewPage description\n values.key = ABViewDefaults.key;\n\n // NOTE: this returns a new ABView component.\n // when creating a new page, the 3rd param should be null, to signify\n // the top level component.\n var page = this.application.viewNew(values, this.application, null);\n page.parent = this;\n return page;\n }\n\n /**\n * @method pageRemove()\n *\n * remove the given ABViewPage from our ._pages array and persist the current\n * values.\n *\n * @param {ABViewPage} page The instance of the page to remove.\n * @return {Promise}\n */\n pageRemove(page) {\n var origLen = this._pages.length;\n this._pages = this.pages(function (p) {\n return p.id != page.id;\n });\n\n if (this._pages.length < origLen) {\n return this.save();\n }\n\n // if we get here, then nothing changed so nothing to do.\n return Promise.resolve();\n }\n\n /**\n * @method urlView()\n * return the url pointer for views in this application.\n * @return {string}\n */\n urlPage() {\n return this.urlPointer() + \"/_pages/\";\n }\n\n /**\n * @method urlPointer()\n * return the url pointer that references this view. This url pointer\n * should be able to be used by this.application.urlResolve() to return\n * this view object.\n * @return {string}\n */\n urlPointer() {\n if (this.parent) {\n return this.parent.urlPage() + this.id;\n } else {\n return this.application.urlPage() + this.id;\n }\n }\n\n updateIcon(obj) {\n // icon of page\n if (obj.settings.type == \"popup\") {\n obj.icon = \"clone\";\n } else {\n obj.icon = ABViewDefaults.icon;\n }\n return obj;\n }\n\n /**\n * @method clone()\n * clone the defintions of this ABViewPage object.\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @return {obj}\n * defs of the copied ABView\n */\n clone(lookUpIds, parent) {\n // initial new ids of pages and components\n if (lookUpIds == null) {\n // create a hash of { oldID : newID } of any sub Pages and Views.\n lookUpIds = {};\n\n let mapNewIdFn = (currView) => {\n if (!lookUpIds[currView.id])\n lookUpIds[currView.id] = this.AB.uuid();\n\n if (currView.pages) {\n currView.pages().forEach((p) => mapNewIdFn(p));\n }\n\n if (currView.views) {\n currView.views().forEach((v) => mapNewIdFn(v));\n }\n };\n\n // start map new ids\n mapNewIdFn(this);\n }\n\n // copy\n let result = super.clone(lookUpIds, parent);\n\n // page's name should not be duplicate\n result.name = null;\n\n return result;\n }\n\n /**\n * @method copy()\n * create a new copy of this ABViewPage object. The resulting ABView should\n * be identical in settings and all sub pages/views, but each new object\n * is a unique view (different ids).\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @return {Promise}\n * .resolved with the instance of the copied ABView\n */\n copy(lookUpIds, parent, options) {\n // initial new ids of pages and components\n if (lookUpIds == null) {\n // create a hash of { oldID : newID } of any sub Pages and Views.\n lookUpIds = {};\n\n let mapNewIdFn = (currView) => {\n if (!lookUpIds[currView.id])\n lookUpIds[currView.id] = this.AB.uuid();\n\n if (currView.pages) {\n currView.pages().forEach((p) => mapNewIdFn(p));\n }\n\n if (currView.views) {\n currView.views().forEach((v) => mapNewIdFn(v));\n }\n };\n\n // start map new ids\n mapNewIdFn(this);\n }\n\n // now continue with the default .copy()\n return super.copy(lookUpIds, parent, options);\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewPivotPropertyComponentDefaults = {\n dataviewID: null,\n removeMissed: 0,\n totalColumn: 0,\n separateLabel: 0,\n min: 0,\n max: 0,\n height: 0,\n};\n\nconst ABViewDefaults = {\n key: \"pivot\", // {string} unique key for this view\n icon: \"cube\", // {string} fa-[icon] reference for this view\n labelKey: \"Pivot\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewPivotCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewPivotPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // Convert to boolean\n this.settings.removeMissed = JSON.parse(\n this.settings.removeMissed ||\n ABViewPivotPropertyComponentDefaults.removeMissed\n );\n this.settings.totalColumn = JSON.parse(\n this.settings.totalColumn ||\n ABViewPivotPropertyComponentDefaults.totalColumn\n );\n this.settings.separateLabel = JSON.parse(\n this.settings.separateLabel ||\n ABViewPivotPropertyComponentDefaults.separateLabel\n );\n this.settings.min = JSON.parse(\n this.settings.min || ABViewPivotPropertyComponentDefaults.min\n );\n this.settings.max = JSON.parse(\n this.settings.max || ABViewPivotPropertyComponentDefaults.max\n );\n\n if (this.settings.structure && typeof this.settings.structure == \"string\")\n this.settings.structure = JSON.parse(this.settings.structure);\n\n // \"0\" -> 0\n this.settings.height = parseInt(\n this.settings.height || ABViewPivotPropertyComponentDefaults.height\n );\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n var obj = super.toObj();\n\n obj.views = [];\n obj.settings = obj.settings || {};\n\n if (this.settings.structure)\n obj.settings.structure = JSON.stringify(this.settings.structure);\n\n return obj;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewReportManagerPropertyComponentDefaults = {\n dataviewID: \"\",\n dataviewFields: {\n name: \"\", // id of a String field\n text: \"\", // id of a LongText field\n queries: \"\", // id of a json field\n },\n datacollectionIDs: [],\n editMode: 0,\n hideCommonTab: 0,\n hideDataTab: 0,\n hideViewTab: 0,\n};\n\nconst ABViewDefaults = {\n key: \"reportsManager\", // {string} unique key for this view\n icon: \"wpforms\", // {string} fa-[icon] reference for this view\n labelKey: \"Reports Manager\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewReportsManagerCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewReportManagerPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n const parsedSettings = {};\n\n Object.keys(ABViewReportManagerPropertyComponentDefaults).forEach(\n (key1) => {\n if (\n typeof ABViewReportManagerPropertyComponentDefaults[key1] ===\n \"object\" &&\n !Array.isArray(\n ABViewReportManagerPropertyComponentDefaults[key1]\n )\n ) {\n parsedSettings[key1] = {};\n\n Object.keys(\n ABViewReportManagerPropertyComponentDefaults[key1]\n ).forEach((key2) => {\n parsedSettings[key1][key2] =\n this.settings[key1]?.[key2] ??\n ABViewReportManagerPropertyComponentDefaults[key1][key2];\n });\n\n return;\n }\n\n parsedSettings[key1] =\n this.settings[key1] ??\n ABViewReportManagerPropertyComponentDefaults[key1];\n }\n );\n\n this.settings = parsedSettings;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n var obj = super.toObj();\n\n obj.settings = obj.settings || {};\n\n return obj;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewSchedulerPropertyComponentDefaults = {\n readonly: 0,\n dataviewID: \"\",\n dataviewFields: {\n name: \"\", // id of a String field\n start: \"\", // id of a DateTime field\n end: \"\", // id of a DateTime field\n allDay: \"\", // id of a Checkbox field\n repeat: \"\", // id of a String field\n calendar: \"\", // id of a String field\n color: \"\", // id of a String field\n sectionID: \"\", // id of a String field\n unitID: \"\", // id of a String field\n notes: \"\", // id of a LongText field\n originID: \"\", // id of a LongText field\n },\n calendarDataviewID: \"\",\n calendarDataviewFields: {\n title: \"\", // id of a String field\n color: \"\", // id of a String field\n active: \"\", // id of a Checkbox field\n },\n timeline: {\n day: 1,\n week: 1,\n month: 1,\n year: 1,\n agenda: 1,\n timeline: 1,\n units: 1,\n },\n timelineSectionList: \"\",\n unitList: \"\",\n export: {\n excel: 0,\n csv: 0,\n pdf: 0,\n },\n};\n\nconst ABViewDefaults = {\n key: \"scheduler\",\n // {string}\n // unique key for this view\n\n icon: \"calendar\",\n // {string}\n // fa-[icon] reference for this view\n\n labelKey: \"Scheduler\",\n // {string}\n // the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewSchedulerCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n\n this._object = null;\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewSchedulerPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n // NOTE: ABView auto translates/untranslates \"label\"\n // add in any additional fields here:\n this.unTranslate(this, this, [\"scheduler\"]);\n\n const obj = super.toObj();\n\n obj.views = [];\n\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings = this.settings || {};\n this.settings.dataviewFields = this.settings.dataviewFields || {};\n this.settings.calendarDataviewFields =\n this.settings.calendarDataviewFields || {};\n this.settings.timeline = this.settings.timeline || {};\n this.settings.export = this.settings.export || {};\n\n const parsedSettings = {};\n\n Object.keys(ABViewSchedulerPropertyComponentDefaults).forEach((key1) => {\n if (\n typeof ABViewSchedulerPropertyComponentDefaults[key1] === \"object\"\n ) {\n parsedSettings[key1] = {};\n\n Object.keys(ABViewSchedulerPropertyComponentDefaults[key1]).forEach(\n (key2) => {\n parsedSettings[key1][key2] =\n this.settings[key1][key2] ??\n ABViewSchedulerPropertyComponentDefaults[key1][key2];\n }\n );\n\n return;\n }\n\n parsedSettings[key1] =\n this.settings[key1] ??\n ABViewSchedulerPropertyComponentDefaults[key1];\n });\n\n this.settings = parsedSettings;\n\n // if this is being instantiated on a read from the Property UI,\n this.scheduler =\n values.scheduler || ABViewSchedulerPropertyComponentDefaults.scheduler;\n\n // NOTE: ABView auto translates/untranslates \"label\"\n // add in any additional fields here:\n this.translate(this, this, [\"scheduler\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\nconst ABViewContainer = require(\"../../platform/views/ABViewContainer\");\n\nconst ABViewTabPropertyComponentDefaults = {\n height: 0,\n minWidth: 0,\n stackTabs: 0, // use sidebar view instead of tabview\n darkTheme: 0, // set dark theme css or not\n sidebarWidth: 200, // width of sidebar menu when stacking tabs\n sidebarPos: \"left\", // the default position of sidebar\n iconOnTop: 0, // do you want to put the icon above the text label?\n hintID: null, // store the ID of a webix hint tutorial for this view\n};\n\nconst ABViewTabDefaults = {\n key: \"tab\", // {string} unique key for this view\n icon: \"window-maximize\", // {string} fa-[icon] reference for this view\n labelKey: \"Tab\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewTabCore extends ABViewWidget {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewTabDefaults);\n }\n\n static common() {\n return ABViewTabDefaults;\n }\n\n static defaultValues() {\n return ABViewTabPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.height = parseInt(this.settings.height);\n this.settings.minWidth = parseInt(this.settings.minWidth || 0);\n this.settings.stackTabs = parseInt(this.settings.stackTabs);\n this.settings.darkTheme = parseInt(this.settings.darkTheme);\n this.settings.sidebarWidth = parseInt(this.settings.sidebarWidth);\n // this.settings.sidebarPos = this.settings.sidebarPos;\n this.settings.iconOnTop = parseInt(this.settings.iconOnTop);\n }\n\n addTab(tabName, tabIcon) {\n return this.application\n .viewNew(\n {\n key: ABViewContainer.common().key,\n label: tabName,\n tabicon: tabIcon,\n },\n this.application,\n this\n )\n .save();\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewTextPropertyComponentDefaults = {\n text: \"\",\n // {string}\n // A multilingual text template that is used to display a given set of\n // values.\n\n height: 0,\n // {integer}\n // The default height of this widget.\n\n dataviewID: null,\n // {uuid}\n // The {ABDataCollection.id} of the datacollection this ABViewText is\n // pulling data from.\n // In most usage situations this ABView is tied to the data in an\n // ABDataCollection. However, it is possible for an ABObject to be\n // directly assigned to the ABView, and that will be used instead.\n};\n\nconst ABViewDefaults = {\n key: \"text\",\n // {string}\n // unique key for this view\n\n icon: \"font\",\n // {string}\n // fa-[icon] reference for this view\n\n labelKey: \"Text\",\n // {string}\n // the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewTextCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n\n this._object = null;\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewTextPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n // NOTE: ABView auto translates/untranslates \"label\"\n // add in any additional fields here:\n this.unTranslate(this, this, [\"text\"]);\n\n var obj = super.toObj();\n obj.views = [];\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings = this.settings || {};\n\n // convert from \"0\" => 0\n this.settings.height = parseInt(\n this.settings.height || ABViewTextPropertyComponentDefaults.height\n );\n\n // if this is being instantiated on a read from the Property UI,\n this.text = values.text || ABViewTextPropertyComponentDefaults.text;\n\n // NOTE: ABView auto translates/untranslates \"label\"\n // add in any additional fields here:\n this.translate(this, this, [\"text\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n /**\n * @property datacollection\n * return ABDatacollection of this form\n *\n * @return {ABDatacollection}\n */\n get datacollection() {\n if (this.parent?.key == \"dataview\") {\n return this.AB.datacollectionByID(this.parent.settings.dataviewID);\n } else {\n return this.AB.datacollectionByID(this.settings.dataviewID);\n }\n }\n\n fieldKey(field) {\n let label = field.label || \"\";\n label = label.replace(/\\(/g, \"\\\\(\");\n label = label.replace(/\\)/g, \"\\\\)\");\n return label;\n }\n\n displayText(val, componentID) {\n var result = this.text;\n\n let clearTemplateValue = (result) => {\n return result.replace(/{(.*?)}/g, \"\");\n };\n\n var dv = this.datacollection;\n // if (!dv) return clearTemplateValue(result);\n\n var object = dv?.datasource ?? this._object;\n if (!object) return clearTemplateValue(result);\n\n const rowData = val || dv.getCursor() || {};\n\n object.fields().forEach((f) => {\n // add \\\\ in front of the regular expression special charactors\n // let label = f.label || \"\";\n // label = label.replace(/\\(/g, \"\\\\(\");\n // label = label.replace(/\\)/g, \"\\\\)\");\n let label = this.fieldKey(f);\n\n var template = new RegExp(\"{\" + label + \"}\", \"g\");\n\n // IDEA: I'd like to keep all the image url logic INSIDE the ABFieldImage\n // object. Is there some way we can simply call: f.imageTemplate(rowData)\n // and parse the results for the url to display here?\n\n var data = f.format(rowData);\n if (f.key == \"image\") {\n var fData = data;\n data = f.urlImage(fData);\n\n // Question: should we change f.urlImage() to return the defaultImageUrl\n // if fData is \"\" and .useDefaultImage = true?\n\n if (\n !fData &&\n f.settings.defaultImageUrl &&\n f.settings.useDefaultImage\n ) {\n data = f.urlImage(f.settings.defaultImageUrl);\n\n ////\n //// James: Revisit this and make sure we are handling things ok now.\n // result = result.replace(\n // \"img\",\n // 'img onload=\\'AD.comm.hub.publish(\"component.adjust\", {\"containerID\": \"' +\n // componentID +\n // \"\\\"});' \"\n // );\n // } else if (\n // fData != \"\" &&\n // result.indexOf(\"onload\") == -1 &&\n // componentID\n // ) {\n // result = result.replace(\n // \"img\",\n // 'img onload=\\'AD.comm.hub.publish(\"component.adjust\", {\"containerID\": \"' +\n // componentID +\n // \"\\\"});' \"\n // );\n } else {\n ////\n //// James: It looks like this routine assumes the this.text template will\n //// only have 1 tag in it. Is that necessarilly true?\n ////\n //// If NOT, then we need to rethink this next line:\n\n result = result.replace(\n \"img\",\n \"img onerror='this.parentNode.removeChild(this);' \"\n );\n }\n }\n\n result = result.replace(template, data);\n });\n\n // Support {uuid} tag in tempalte\n result = result.replace(/{PK}/g, rowData[object.PK()]);\n\n return result;\n }\n\n objectLoad(object) {\n this._object = object;\n }\n};\n","const ABView = require(\"../../platform/views/ABView\");\n\nconst ABViewDefaults = {\n key: \"viewwidget\", // {string} unique key for this view\n icon: \"circle-o-notch \", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.widget\", // {string} the multilingual label key for the class label\n};\n\nconst ABPropertyComponentDefaults = {\n columnSpan: 1,\n rowSpan: 1,\n};\n\nmodule.exports = class ABViewWidgetCore extends ABView {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n * @param {obj} defaultValues special sub class defined default values.\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABPropertyComponentDefaults;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.columnSpan = parseInt(\n this.settings.columnSpan || ABPropertyComponentDefaults.columnSpan\n );\n this.settings.rowSpan = parseInt(\n this.settings.rowSpan || ABPropertyComponentDefaults.rowSpan\n );\n }\n};\n","const _ = require(\"lodash\");\n\n// prettier-ignore\nconst ABApplicationCore = require(\"../core/ABApplicationCore.js\");\n\nconst ABViewPage = require(\"./views/ABViewPage\");\nconst ABViewManager = require(\"./ABViewManager\");\n\nmodule.exports = class ABClassApplication extends ABApplicationCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n // now listen for any updates to our managed objects\n this._handler_page_updated = (definition) => {\n // we want to keep the same pageID order:\n var newPages = [];\n this.pages().forEach((pg) => {\n if (pg.id === definition.id) {\n newPages.push(pg.refreshInstance(this));\n return;\n }\n newPages.push(pg);\n });\n\n this._pages = newPages;\n\n // var currPage = this._pages.find((p) => p.id === definition.id);\n // if (currPage) {\n // this._pages = this._pages.filter((p) => p.id != currPage.id);\n // this._pages.push(currPage.refreshInstance());\n // }\n };\n this._pages.forEach((p) => {\n p.on(\"definition.updated\", this._handler_page_updated);\n });\n }\n\n static applications(/*fn = () => true*/) {\n console.error(\n \"ABApplication.applicationForID(): Depreciated. Who is doing this?\"\n );\n return null;\n }\n static applicationForID(/*id*/) {\n var errDepreciated = new Error(\n \"ABApplication.applicationForID(): Depreciated. Who is doing this?\"\n );\n console.error(errDepreciated);\n return null;\n }\n\n static definitionForID(/*id*/) {\n var errDepreciated = new Error(\n \"ABApplication.definitionForID(): Depreciated. Who is doing this?\"\n );\n console.error(errDepreciated);\n return null;\n }\n\n areaKey() {\n return this.AB.kebabCase(`ab-${this.name}`);\n }\n\n /**\n * @method refreshInstance()\n * Used when a definition.updated message is detected on this ABApplication.\n * This method will return a new instance based upon the current definition\n * and properly resolve any handlers and pending network Requests.\n * @return {ABObject}\n */\n refreshInstance() {\n var newObj = this.AB.applicationByID(this.id);\n\n // remove my listeners\n this._pages.forEach((p) => {\n p.removeListener(\"definition.updated\", this._handler_page_updated);\n });\n\n return newObj;\n }\n\n ///\n /// Definition\n ///\n\n /**\n * @method _listInsert()\n * save the given entity into our desired list:\n * @param {varid} entity\n * @param {string} key\n * the key of the list we are managing\n * @return {Promise}\n */\n async _listInsert(entity, key) {\n var isIncluded = this[key].indexOf(entity.id) != -1;\n if (!isIncluded) {\n this[key].push(entity.id);\n await this.save();\n }\n }\n\n async _listRemove(entity, key) {\n var begLen = this[key].length;\n this[key] = this[key].filter((id) => {\n return id != entity.id;\n });\n // if there was a change then save this.\n if (begLen != this[key].length) {\n await this.save();\n }\n }\n\n /**\n * @method datacollectionInsert()\n * persist the current ABDataCollection in our list of .datacollectionIDs.\n * @param {ABDataCollection} dc\n * @return {Promise}\n */\n datacollectionInsert(dc) {\n return this._listInsert(dc, \"datacollectionIDs\");\n }\n\n /**\n * @method datacollectionRemove()\n * remove the given ABDataCollection from our list of .datacollectionIDs.\n * @param {ABDataCollection} dc\n * @return {Promise}\n */\n datacollectionRemove(dc) {\n return this._listRemove(dc, \"datacollectionIDs\");\n }\n\n /**\n * @method objectInsert()\n * persist the current ABObject in our list of .objectIDs.\n * @param {ABObject} object\n * @return {Promise}\n */\n objectInsert(object) {\n return this._listInsert(object, \"objectIDs\");\n }\n\n /**\n * @method objectRemove()\n * remove the current ABObject from our list of .objectIDs.\n * NOTE: this method persists the changes to the server.\n * @param {ABObject} object\n * @return {Promise}\n */\n objectRemove(object) {\n return this._listRemove(object, \"objectIDs\");\n }\n\n /**\n * @method processInsert()\n * persist the current ABProcess in our list of .processIDs.\n * @param {ABProcess} process\n * @return {Promise}\n */\n processInsert(process) {\n return this._listInsert(process, \"processIDs\");\n }\n\n /**\n * @method processRemove()\n * remove the current ABProcess from our list of .processIDs.\n * NOTE: this method persists the changes to the server.\n * @param {ABProcess} process\n * @return {Promise}\n */\n processRemove(process) {\n return this._listRemove(process, \"processIDs\");\n }\n\n /**\n * @method queryInsert()\n * persist the current ABObjectQuery in our list of .queryIDs.\n * @param {ABObjectQuery} query\n * @return {Promise}\n */\n queryInsert(query) {\n return this._listInsert(query, \"queryIDs\");\n }\n\n /**\n * @method queryRemove()\n * remove the current ABObjectQuery from our list of .queryIDs.\n * NOTE: this method persists the changes to the server.\n * @param {ABObjectQuery} query\n * @return {Promise}\n */\n queryRemove(query) {\n return this._listRemove(query, \"queryIDs\");\n }\n\n /**\n * @method exportIDs()\n * export any relevant .ids for the necessary operation of this application.\n * @param {array} ids\n * the array of ids to insert any relevant .ids into\n */\n exportIDs(ids) {\n // make sure we don't get into an infinite loop:\n if (ids.indexOf(this.id) > -1) return;\n\n ids.push(this.id);\n\n // start with Objects:\n this.objectsIncluded().forEach((o) => {\n o.exportIDs(ids);\n });\n\n // get all Hints\n this.hintsIncluded().forEach((h) => {\n h.exportIDs(ids);\n });\n\n // Queries\n this.queriesIncluded().forEach((q) => {\n q.exportIDs(ids);\n });\n\n // Datacollections\n // NOTE: currently the server doesn't make instances of DataCollections\n // so we manually parse the related info here:\n this.datacollectionIDs.forEach((dID) => {\n if (ids.indexOf(dID) > -1) return;\n\n var def = this.AB.definitionByID(dID);\n if (def) {\n ids.push(dID);\n if (def.settings.datasourceID) {\n var object = this.AB.objectByID(def.settings.datasourceID);\n if (object) {\n object.exportIDs(ids);\n }\n }\n }\n });\n\n // Processes\n this.processes().forEach((p) => {\n p.exportIDs(ids);\n });\n\n // Pages\n // NOTE: currently the server doesn't make instances of ABViews\n // so we manually parse the object data here:\n var parseView = (view) => {\n if (ids.indexOf(view.id) > -1) return;\n ids.push(view.id);\n (view.pageIDs || []).forEach((pid) => {\n var pdef = this.AB.definitionByID(pid);\n if (pdef) {\n parseView(pdef);\n }\n });\n\n (view.viewIDs || []).forEach((vid) => {\n var vdef = this.AB.definitionByID(vid);\n if (vdef) {\n parseView(vdef);\n }\n });\n };\n\n var pageIDs = this._pages.map((p) => p.id);\n (pageIDs || []).forEach((pid) => {\n var pdef = this.AB.definitionByID(pid);\n if (pdef) {\n parseView(pdef);\n }\n });\n\n // return only unique entries:\n ids = this.AB.uniq(ids);\n }\n\n /**\n * @method pageNew()\n * return a new instance of an ABViewPage\n * @param values\n * The initial settings for the page.\n * @return {ABViewPage}\n */\n pageNew(values) {\n return new ABViewPage(values, this);\n }\n\n /**\n * @method pageInsert()\n * Insert a new ABViewPage into this Application.\n * @param {ABViewPage} page\n * The instance of the page to save.\n * @return {Promise}\n */\n async pageInsert(page) {\n // var isIncluded = this.pageByID(page.id);\n var isIncluded = this._pages.filter((p) => p.id == page.id)[0];\n if (!isIncluded) {\n this._pages.push(page);\n // Save our own Info:\n return this.save();\n }\n }\n\n /**\n * @method pageRemove()\n * remove the current ABViewPage from our list of pages.\n * @param {ABViewPage} page\n * @return {Promise}\n */\n async pageRemove(page) {\n var origLen = this._pages.length;\n this._pages = this.pages(function (p) {\n return p.id != page.id;\n });\n\n if (this._pages.length < origLen) {\n return this.save();\n }\n\n // if we get here, then nothing changed so nothing to do.\n }\n\n save() {\n // if someone just changed the name of our ABApplication, reflect that\n // in our Def.Name\n if (this.name != this.label) {\n this.name = this.label;\n }\n return super.save();\n }\n\n warningsEval() {\n super.warningsEval();\n\n //\n // check for valid object references:\n //\n var checks = {\n objectIDs: \"object\",\n queryIDs: \"query\",\n datacollectionIDs: \"datacollection\",\n };\n\n Object.keys(checks).forEach((k) => {\n this[k].forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (!def) {\n this.warningsMessage(` is referencing a missing ${checks[k]}`, {\n appID: this.id,\n id,\n });\n }\n });\n });\n\n //\n // Make sure there is some way to access this Application:\n //\n if (this.roleAccess.length == 0 && !this.isAccessManaged) {\n this.warningsMessage(\" has no Role assigned, and is unaccessible.\");\n }\n\n // do our Role references exist?\n var allRoles = this.AB.Account.rolesAll().map((r) => r.id);\n this.roleAccess.forEach((r) => {\n if (allRoles.indexOf(r) == -1) {\n this.warningsMessage(\n `Specified Role Access [${r}] does not exist in this system`,\n { role: r }\n );\n }\n });\n\n // Make sure all our Pages perform a new warningsEval();\n this.pages().forEach((p) => {\n p.warningsEval();\n });\n }\n\n warningsAll() {\n var warnings = [].concat(this._warnings);\n [\n \"objectsIncluded\",\n \"queriesIncluded\",\n \"datacollectionsIncluded\",\n \"processes\",\n \"pages\",\n // \"views\", // <-- these are gathered in \"pages\"\n ].forEach((k) => {\n this[k]().forEach((o) => {\n warnings = warnings.concat(o.warningsAll());\n });\n });\n\n return warnings;\n }\n\n warningsMessage(msg, data = {}) {\n let message = `Application[${this.label}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n\n /**\n * @method mobileAppNew()\n *\n * return an instance of a new (unsaved) ABMobileApp that is tied to this\n * ABApplication.\n *\n * @return {ABMobileApp}\n */\n // mobileAppNew(values) {\n // return new ABMobileApp(values, this);\n // }\n};\n","const _ = require(\"lodash\");\n\n// prettier-ignore\nconst ABApplicationMobileCore = require(\"../core/ABApplicationMobileCore.js\");\n\nconst ABViewPageMobile = require(\"./mobile/ABMobilePage\");\nconst ABViewManager = require(\"./ABViewManager\");\n\nmodule.exports = class ABClassApplicationMobile extends (\n ABApplicationMobileCore\n) {\n constructor(attributes, AB) {\n super(attributes, AB);\n }\n\n ///\n /// Definition\n ///\n\n /**\n * @method pageNew()\n * return a new instance of an ABViewPageMobile\n * @param values\n * The initial settings for the page.\n * @return {ABViewPageMobile}\n */\n pageNew(values) {\n const newPage = new ABViewPageMobile(values, this);\n newPage.parent = this;\n return newPage;\n }\n\n async setPageDefault(page) {\n if (this.pageDefault != page.id) {\n let oldPage = this.pageByID(this.pageDefault, true);\n if (oldPage) {\n oldPage.defaultPage = 0;\n await oldPage.save();\n }\n\n this.pageDefault = page.id;\n await this.save();\n }\n }\n};\n","const ABEmitter = require(\"./ABEmitter\");\n\nconst CustomComponentManager = require(\"../../webix_custom_components/customComponentManager\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABComponent extends ABEmitter {\n /**\n * @param {object} App ?what is this?\n * @param {string} idBase Identifier for this component\n * @param {import(\"../ABFactory\").default} AB ABFactory instance\n */\n constructor(App, idBase, AB) {\n super();\n\n this.AB = AB;\n // Transition Code:\n // make sure we have an this.AB\n if (!AB && App?.AB) {\n this.AB = App.AB;\n }\n\n if (!App) {\n if (this.AB._App) {\n App = this.AB._App;\n } else {\n App = {\n uuid: this.AB.Webix.uid(),\n\n /*\n * AB\n * the {ABFactory} for our interface.\n */\n AB: this.AB,\n\n /*\n * actions:\n * a hash of exposed application methods that are shared among our\n * components, so one component can invoke an action that updates\n * another component.\n */\n actions: {},\n\n /*\n * config\n * webix configuration settings for our current browser\n */\n config: this.AB.UISettings.config(),\n\n /*\n * custom\n * a collection of custom components for this App Instance.\n */\n custom: null,\n\n /*\n * Icons\n * this will provide you with the list of avaialbe font awesome 4.7.0 icons to use in interface building\n */\n icons: this.AB.UISettings.icons,\n\n Label: L,\n\n /*\n * labels\n * a collection of labels that are common for the Application.\n */\n labels: {\n add: L(\"Add\"),\n create: L(\"Create\"),\n delete: L(\"Delete\"),\n edit: L(\"Edit\"),\n export: L(\"Export\"),\n formName: L(\"Name\"),\n import: L(\"Import\"),\n rename: L(\"Rename\"),\n ok: L(\"Ok\"),\n\n cancel: L(\"Cancel\"),\n save: L(\"Save\"),\n\n yes: L(\"Yes\"),\n no: L(\"No\"),\n\n none: L(\"None\"),\n close: L(\"Close\"),\n\n default: L(\"Default\"),\n defaultPlaceholder: L(\"Enter default value\"),\n\n disable: L(\"Disable\"),\n\n required: L(\"Required\"),\n unique: L(\"Unique\"),\n\n invalidMessage: {\n required: L(\"This field is required\"),\n },\n\n createErrorMessage: L(\"System could not create {0}.\"),\n createSuccessMessage: L(\"{0} is created.\"),\n\n updateErrorMessage: L(\"System could not update {0}.\"),\n updateSucessMessage: L(\"{0} is updated.\"),\n\n deleteErrorMessage: L(\"System could not delete {0}.\"),\n deleteSuccessMessage: L(\"{0} is deleted.\"),\n\n renameErrorMessage: L(\"System could not rename {0}.\"),\n renameSuccessMessage: L(\"{0} is renamed.\"),\n\n // Data Field common Property labels:\n dataFieldHeaderLabel: L(\"Section Title\"),\n dataFieldHeaderLabelPlaceholder: L(\"Section Name\"),\n\n dataFieldLabel: L(\"Label\"),\n dataFieldLabelPlaceholder: L(\"Label\"),\n\n dataFieldColumnName: L(\"Field Name\"),\n dataFieldColumnNamePlaceholder: L(\"Database field name\"),\n\n dataFieldShowIcon: L(\"show icon?\"),\n\n componentDropZone: L(\"add widgets here\"),\n },\n\n /*\n * unique()\n * A function that returns a globally unique Key.\n * @param {string} key The key to modify and return.\n * @return {string}\n */\n unique: function (key) {\n return `${key}${this.uuid}`;\n },\n };\n this.AB._App = App;\n }\n }\n\n if (!App.custom) {\n if (!this.AB.custom) {\n var componentManager = new CustomComponentManager();\n componentManager.initComponents(App);\n } else {\n App.custom = this.AB.custom;\n }\n }\n\n this.App = App;\n\n this.idBase = idBase || \"?idbase?\";\n }\n\n actions(_actions) {\n console.error(\"!!! REFACTOR out .actions()\");\n if (_actions) {\n for (var a in _actions) {\n this.App.actions[a] = _actions[a];\n }\n }\n }\n\n Label() {\n return (...params) => {\n // console.error(\"!! App.label() depreciated.\");\n return this.AB.Multilingual.label(...params);\n };\n }\n\n unique(key) {\n return this.App.unique(`${this.idBase}_${key}`);\n }\n};\n","const ABObjectQuery = require(\"./ABObjectQuery\");\nconst ABDataCollectionCore = require(\"../core/ABDataCollectionCore\");\n\nmodule.exports = class ABDataCollection extends ABDataCollectionCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n this.setMaxListeners(0);\n this.blacklistLoadData = {};\n // { key : ?? }\n // keep track of previous loadData() calls that might not\n // have fully completed yet. We don't want to get in a\n // race condition where we keep trying to load the same frame\n // over and over again.\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABDataCollection with it's parent\n *\n *\n * @return {Promise}\n * .resolve( {this} )\n */\n async save() {\n if (!this.id) {\n this.label = this.label || this.name;\n }\n await super.save();\n this.AB.emit(\"ab.datacollection.update\", {\n datacollectionId: this.id,\n });\n return this;\n }\n\n isValid() {\n var validator = this.AB.Validation.validator();\n var L = this.AB.Label();\n\n // label/name must be unique:\n var isNameUnique =\n this.AB.datacollections((o) => {\n return (\n o.id != this.id &&\n o.name.toLowerCase() == this.name.toLowerCase()\n );\n }).length == 0;\n if (!isNameUnique) {\n validator.addError(\n \"name\",\n L('Name must be unique (\"{0}\" already in use)', [this.name])\n );\n }\n\n return validator;\n }\n\n ///\n /// Cursor\n ///\n\n /**\n * currentUserUsername\n * must return the proper value for the current user that would match a \"user\" field\n * in an object.\n * This is platform dependent, so must be implemented by a child object.\n * @return {string}\n */\n currentUserUsername() {\n return this.AB.Account.username();\n }\n\n ///\n /// Data\n ///\n\n init() {\n // prevent initialize many times\n if (this.initialized) return;\n // this.initialized = true; // <<---- DO NOT SET THIS HERE\n\n super.init();\n\n //// Now connect our platform hub to our Object Triggers:\n\n // events\n [\n \"ab.datacollection.create\",\n \"ab.datacollection.update\",\n \"ab.datacollection.stale\",\n \"ab.datacollection.delete\",\n ].forEach((key) => {\n this.AB.on(key, (data) => {\n this.emit(key, data);\n });\n });\n\n this.bindParentDc();\n }\n\n bindParentDc() {\n // if we pass the master datacollection and the field it is linked to\n // we want to bind it with that field as second param so dataFeed is\n // used on the slave datacollection\n let dataCollectionLink = this.datacollectionLink;\n let fieldLink = this.fieldLink;\n if (!this.settings.loadAll && dataCollectionLink && fieldLink) {\n let dc = this.__dataCollection;\n // the second param is the field id we bind the data to the master with\n dc.bind(dataCollectionLink.__dataCollection, fieldLink.id);\n // defining dataFeed allows us to query the database when the table is scrolled\n dc.define(\"dataFeed\", (value, params) => {\n let cursorUpdated = false;\n // check if the current cursor was updated\n if (dc.__prevLinkDcCursor != value) {\n cursorUpdated = true;\n }\n\n dc.__prevLinkDcCursor = this?.datacollectionLink?.getCursor()?.id;\n\n // NOTE: If no cursor of the parent DC, then show empty list\n if (\n this.datacollectionLink &&\n value == null &&\n dc.__prevLinkDcCursor == null\n ) {\n this.clearAll();\n }\n // this is the same item that was already bound...don't reload data\n else if (cursorUpdated) {\n // now that we have the modified wheres the dataCollections wheres\n // need to be modified for subsequent loads on scroll so lets set them\n // this.reloadWheres(wheres);\n\n // reload data\n this.reloadData(0, 20);\n }\n });\n }\n }\n\n loadData(start, limit = 20) {\n console.log(`loadData: ${start}, ${limit}`);\n return super.loadData(start, limit).catch((err) => {\n // hideProgressOfComponents() is a platform specific action.\n this.hideProgressOfComponents();\n this.emit(\"loadData\", {});\n\n // propagate the error here:\n if (err) {\n throw err;\n }\n });\n }\n\n /**\n * processIncomingData()\n * is called from loadData() once the data is returned. This method\n * allows the platform to make adjustments to the data based upon any\n * platform defined criteria.\n * @param {obj} data the data as it was returned from the Server\n * which should be in following format:\n * {\n * status: \"success\", // or \"error\"\n * data:[ {ABObjectData}, {ABObjectData}, ...]\n * }\n */\n processIncomingData(data) {\n // Web Platform:\n\n // data check:\n if (data.data && !Array.isArray(data.data)) {\n data.data = [data.data];\n }\n\n // standardize the heights\n\n /*\n // In v2: we move the row height calculation into the Interface designer.\n //\n\n // calculate default value of $height of rows\n let obj = this.datasource;\n let defaultHeight = 0;\n let minHeight = 0;\n let imageFields = obj.fields((f) => f.key == \"image\");\n let hiddenFields = obj.objectWorkspace.hiddenFields;\n imageFields.forEach(function (f) {\n if (hiddenFields.indexOf(f.columnName) == -1) {\n if (\n parseInt(f.settings.useHeight) == 1 &&\n parseInt(f.settings.imageHeight) > minHeight\n ) {\n minHeight = parseInt(f.settings.imageHeight) + 20;\n } else {\n minHeight = 100;\n }\n }\n });\n if (minHeight > 0) {\n defaultHeight = minHeight;\n }\n\n (data.data || []).forEach((d) => {\n // define $height of rows to render in webix elements\n if (\n d.properties != null &&\n d.properties.height != \"undefined\" &&\n parseInt(d.properties.height) > 0\n ) {\n d.$height = parseInt(d.properties.height);\n } else if (defaultHeight > 0) {\n d.$height = defaultHeight;\n }\n });\n */\n\n return super.processIncomingData(data).then(() => {\n // Web Platform:\n // when that is done:\n this.hideProgressOfComponents();\n });\n }\n\n ///\n /// Components\n ///\n\n /**\n * @method attachFlexlayout\n *\n *\n * @param {Object} component - a webix flexlayout element instance\n */\n attachFlexlayout(component) {\n var dc = this.__dataCollection;\n\n // prevent attach many times\n if (this.__flexComponentIds.indexOf(component.config.id) > -1) {\n return;\n } else {\n // keep component id to an array\n this.__flexComponentIds.push(component.config.id);\n }\n }\n\n /**\n * @method bind\n *\n *\n * @param {Object} component - a webix element instance\n */\n bind(component) {\n var dc = this.__dataCollection;\n\n // prevent bind many times\n // keep component id to an array\n if (this.__bindComponentIds.indexOf(component.config.id) === -1)\n this.__bindComponentIds.push(component.config.id);\n\n if ($$(component.config.id).data?.find?.({}).length > 0) return;\n\n if (\n component.config.view == \"datatable\" ||\n component.config.view == \"dataview\" ||\n component.config.view == \"treetable\" ||\n component.config.view == \"kanban\"\n ) {\n if (dc) {\n var items = dc.count();\n if (\n items == 0 &&\n (this._dataStatus == this.dataStatusFlag.notInitial ||\n this._dataStatus == this.dataStatusFlag.initializing) &&\n component.showProgress\n ) {\n component.showProgress({ type: \"icon\" });\n }\n\n component.define(\"datafetch\", 20);\n component.define(\"datathrottle\", 500);\n\n // initial data of treetable\n if (component.config.view == \"treetable\") {\n if (\n this.datasource &&\n this.datasource.isGroup &&\n this.__treeCollection\n ) {\n component.define(\"data\", this.__treeCollection);\n component.refresh();\n } else {\n // NOTE: tree data does not support dynamic loading when scrolling\n // https://forum.webix.com/discussion/3078/dynamic-loading-in-treetable\n component.define(\"data\", []);\n component.parse(dc.find({}));\n }\n } else {\n component.data.sync(dc);\n }\n\n // Implement .onDataRequest for paging loading\n if (!this.settings.loadAll) {\n component.___AD = component.___AD || {};\n // if (component.___AD.onDataRequestEvent) component.detachEvent(component.___AD.onDataRequestEvent);\n if (!component.___AD.onDataRequestEvent) {\n component.___AD.onDataRequestEvent = component.attachEvent(\n \"onDataRequest\",\n (start, count) => {\n if (component.showProgress)\n component.showProgress({ type: \"icon\" });\n\n // load more data to the data collection\n dc.loadNext(count, start);\n\n return false; // <-- prevent the default \"onDataRequest\"\n }\n );\n }\n\n // // NOTE : treetable should use .parse or TreeCollection\n // // https://forum.webix.com/discussion/1694/tree-and-treetable-using-data-from-datacollection\n // if (\n // component.config.view == \"treetable\" &&\n // !this.datasource.isGroup\n // ) {\n // component.___AD = component.___AD || {};\n // if (!component.___AD.onDcLoadData) {\n // component.___AD.onDcLoadData = () => {\n // component.parse(dc.find({}));\n // };\n\n // this.on(\"loadData\", component.___AD.onDcLoadData);\n // }\n // }\n }\n } else {\n component.data.unsync();\n }\n } else if (component.bind) {\n if (dc) {\n // Do I need to check if there is any data in the collection before binding?\n component.bind(dc);\n } else {\n component.unbind();\n }\n\n if (component.refresh) component.refresh();\n }\n }\n\n unbind(component) {\n if (!component) return;\n\n component.detachEvent(\"onDataRequest\");\n if (component.___AD) {\n if (component.___AD.onDataRequestEvent)\n delete component.___AD.onDataRequestEvent;\n\n if (component.___AD.onDcLoadData) {\n if (this.off) this.off(\"loadData\", component.___AD.onDcLoadData);\n delete component.___AD.onDcLoadData;\n }\n }\n\n if (component.data && component.data.unsync) {\n component.data.unsync();\n component.define(\"data\", []);\n }\n\n if (component.unbind) component.unbind();\n\n if (component.refresh) component.refresh();\n\n // remove from array\n this.__bindComponentIds = (this.__bindComponentIds || []).filter(\n (id) => id != component.config.id\n );\n }\n\n hideProgressOfComponents() {\n this.__bindComponentIds.forEach((comId) => {\n if ($$(comId) && $$(comId).hideProgress) $$(comId).hideProgress();\n });\n }\n\n /** Private methods */\n\n /**\n * @method _dataCollectionNew\n * Get webix.DataCollection\n *\n * @return {webix.DataCollection}\n *\n * @param {Array} data - initial data\n */\n _dataCollectionNew(data) {\n // get a webix data collection\n let dc = new webix.DataCollection({\n data: data || [],\n });\n\n this._extendCollection(dc);\n\n return dc;\n }\n\n /**\n * @method _treeCollectionNew\n * Get webix.TreeCollection\n *\n * @return {webix.TreeCollection}\n *\n */\n _treeCollectionNew() {\n // get a webix data collection\n let treeStore = new webix.TreeCollection();\n\n this._extendCollection(treeStore);\n\n return treeStore;\n }\n\n _extendCollection(dataStore) {\n // Apply this data collection to support multi-selection\n // https://docs.webix.com/api__refs__selectionmodel.html\n webix.extend(dataStore, webix.SelectionModel);\n\n dataStore.___AD = dataStore.___AD || {};\n\n // Implement .onDataRequest for paging loading\n if (!this.settings.loadAll) {\n if (!dataStore.___AD.onDataRequestEvent) {\n dataStore.___AD.onDataRequestEvent = dataStore.attachEvent(\n \"onDataRequest\",\n (start, count) => {\n if (start < 0) start = 0;\n\n // since the where clause can change if we are following\n // another cursor, include the where as part of the key:\n let [where] = this.getWhereClause(start, 0);\n let key = `${JSON.stringify(where)}-${start}-${count}`;\n if (this.blacklistLoadData[key]) {\n return false;\n }\n this.blacklistLoadData[key] = true;\n // load more data to the data collection\n this.loadData(start, count).finally(() => {\n // remove from blacklist\n delete this.blacklistLoadData[key];\n });\n\n return false; // <-- prevent the default \"onDataRequest\"\n }\n );\n }\n\n if (!dataStore.___AD.onAfterLoadEvent) {\n dataStore.___AD.onAfterLoadEvent = dataStore.attachEvent(\n \"onAfterLoad\",\n () => {\n this.emit(\"loadData\", {});\n }\n );\n }\n }\n\n // override unused functions of selection model\n dataStore.addCss = function () {};\n dataStore.removeCss = function () {};\n dataStore.render = function () {};\n\n if (!dataStore.___AD.onAfterLoad) {\n dataStore.___AD.onAfterLoad = dataStore.attachEvent(\n \"onAfterLoad\",\n () => {\n this.hideProgressOfComponents();\n }\n );\n }\n }\n\n parseTreeCollection(data = {}) {\n if (\n !(this.__datasource instanceof ABObjectQuery) ||\n !this.__datasource.isGroup ||\n !this.__treeCollection\n )\n return;\n\n let addRowToTree = (join = {}, parentAlias = null) => {\n let alias = join.alias;\n\n (data.data || []).forEach((row) => {\n let dataId = row[`${alias}.uuid`] || row[`${alias}.id`];\n if (!dataId) return;\n\n // find parent nodes\n let parentItemIds = [];\n let parentId =\n row[`${parentAlias}.uuid`] || row[`${parentAlias}.id`];\n if (parentId) {\n parentItemIds = this.__treeCollection\n .find(\n (item) =>\n item._alias == parentAlias && item._dataId == parentId\n )\n .map((item) => item.id);\n }\n\n // check exists\n let exists = this.__treeCollection.find((item) => {\n return (\n item._alias == alias &&\n item._dataId == dataId &&\n (parentItemIds.length == 0 ||\n parentItemIds.indexOf(item.$parent) > -1)\n );\n }, true);\n if (exists) return;\n\n let treeNode = {};\n treeNode._alias = alias;\n treeNode._dataId = dataId;\n treeNode._itemId = row.id; // Keep row id for set cursor to data collection\n\n Object.keys(row).forEach((propName) => {\n // Pull value from alias\n if (propName.indexOf(`${alias}.`) == 0) {\n treeNode[propName] = row[propName];\n }\n });\n\n if (row.translations) treeNode.translations = row.translations;\n\n // child nodes\n if (parentItemIds.length > 0)\n parentItemIds.forEach((parentItemId) => {\n this.__treeCollection.add(treeNode, null, parentItemId);\n });\n // root node\n else this.__treeCollection.add(treeNode, null);\n });\n\n // Sub-joins\n (join.links || []).forEach((link) => {\n addRowToTree(link, alias);\n });\n };\n\n // Show loading cursor\n (this.__bindComponentIds || []).forEach((comId) => {\n //// Webix Command here:\n let boundComp = $$(comId);\n if (boundComp && boundComp.showProgress)\n boundComp.showProgress({ type: \"icon\" });\n\n if (boundComp.data && boundComp.data.unsync) boundComp.data.unsync();\n });\n\n addRowToTree(this.__datasource.joins());\n\n // Hide loading cursor\n (this.__bindComponentIds || []).forEach((comId) => {\n let boundComp = $$(comId);\n if (boundComp && boundComp.hideProgress) boundComp.hideProgress();\n boundComp.define(\"data\", this.__treeCollection);\n });\n }\n\n warningsEval() {\n super.warningsEval();\n\n if (!this.datasource) {\n this.warningsMessage(`doesn't have a datasource.`);\n } else if (this.linkDatacollectionID) {\n const linkDC = this.AB.datacollectionById(this.linkDatacollectionID);\n\n if (!linkDC)\n this.warningsMessage(\n `can't resolve linkDatacollectionID[${this.linkDatacollectionID}]`\n );\n }\n }\n\n warningsMessage(msg, data = {}) {\n let message = `Datacollection[${this.label}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n\n get userScopes() {\n return this.AB.Account.scopes();\n }\n};\n","var ABDefinitionCore = require(\"../core/ABDefinitionCore\");\n\nmodule.exports = class ABDefinition extends ABDefinitionCore {\n // constructor(attributes, AB) {\n // super(attributes, AB);\n // }\n};\n","/**\n * ABEmitter\n *\n * This is the platform dependent implementation of an Emitter object.\n *\n */\n\nvar EventEmitter = require(\"events\").EventEmitter;\n\nmodule.exports = class ABEmitter extends EventEmitter {\n constructor() {\n super(/*{ maxListeners: 0 }*/);\n }\n};\n","const ABHintCore = require(\"../core/ABHintCore\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABHint extends ABHintCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n // listen\n // this.AB.on(\"ab.abprocess.update\", (data) => {\n // if (this.id == data.objectId) this.fromValues(data.data);\n // });\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABObject\n *\n * also remove it from our parent application\n *\n * @return {Promise}\n */\n destroy(App) {\n // debugger;\n // remove all my Elements\n var allSteps = this.steps();\n var allDestroy = [];\n allSteps.forEach((e) => {\n allDestroy.push(e.destroy());\n });\n // remove reference on App and View\n let hintIndex = App.hintIDs.indexOf(this.id);\n if (hintIndex > -1) {\n App.hintIDs.splice(hintIndex, 1);\n App.save();\n }\n\n let view = App.views((v) => {\n return v.id == this.settings.view;\n })[0];\n\n if (view) {\n delete view.settings.hintID;\n view.save();\n }\n\n return Promise.all(allDestroy).then(() => {\n // now remove myself\n return new Promise((resolve, reject) => {\n this.toDefinition()\n .destroy()\n .then(() => {\n webix.message({\n text: L(\"Tutorial Deleted\"),\n type: \"success\",\n expire: 3000,\n });\n resolve();\n })\n .catch((err) => {\n reject(err);\n });\n });\n });\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABObject with it's parent ABApplication\n *\n *\n * @return {Promise}\n * .resolve( {this} )\n */\n save() {\n return this.toDefinition()\n .save()\n .then((data) => {\n // if I didn't have an .id then this was a create()\n // and I need to update my data with the generated .id\n\n if (!this.id) {\n this.id = data.id;\n }\n return this;\n });\n }\n\n isValid() {\n // debugger;\n return true;\n // var validator = this.AB.Validation.validator();\n\n // // label/name must be unique:\n // var isNameUnique =\n // this.AB.processes((o) => {\n // return o.name.toLowerCase() == this.name.toLowerCase();\n // }).length == 0;\n // if (!isNameUnique) {\n // validator.addError(\n // \"name\",\n // L(`Process name must be unique (\"{0}\" already in use)`, [this.name])\n // );\n // }\n\n // return validator;\n }\n\n /**\n * @method warningsAll()\n * Return an array of mis configuration warnings for our object or any\n * of our sub elements.\n * @return {array} [ { message: \"warning message\", data:{} } ]\n */\n warningsAll() {\n // debugger;\n // report both OUR warnings, and any warnings from any of our fields\n // var allWarnings = [].concat(this._warnings);\n // this.elements().forEach((e) => {\n // e.warningsEval();\n // allWarnings = allWarnings.concat(e.warnings());\n // });\n // if (this.elements().length == 0) {\n // allWarnings.push({ message: \"No process Tasks defined.\", data: {} });\n // }\n // // perform a check of our xml document to see if we have any unknown\n // // shapes\n // if (!this._DOMParser) {\n // if (window.DOMParser) {\n // // Handy snippet from https://stackoverflow.com/questions/17604071/parse-xml-using-javascript\n // this._DOMParser = function (xmlStr) {\n // return new window.DOMParser().parseFromString(\n // xmlStr,\n // \"text/xml\"\n // );\n // };\n // } else if (\n // typeof window.ActiveXObject != \"undefined\" &&\n // new window.ActiveXObject(\"Microsoft.XMLDOM\")\n // ) {\n // this._DOMParser = function (xmlStr) {\n // var xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n // xmlDoc.async = \"false\";\n // xmlDoc.loadXML(xmlStr);\n // return xmlDoc;\n // };\n // } else {\n // throw new Error(\"No XML parser found\");\n // }\n // }\n // // find any references to our generic shapes\n // let xml = this._DOMParser(this.xmlDefinition);\n // const genericShapes = [\n // \"bpmn2:startEvent\",\n // \"bpmn2:task\",\n // \"bpmn2:endEvent\",\n // ];\n // genericShapes.forEach((s) => {\n // let allElements = xml.getElementsByTagName(s);\n // for (let x = 0; x < allElements.length; x++) {\n // // if we don't know about this shape\n // let ele = allElements[x];\n // let myEle = this.elementForDiagramID(allElements[x].id);\n // if (!myEle) {\n // this.unknownShape(allElements[x]);\n // }\n // }\n // });\n // // if any unknown shapes have been reported:\n // if (this._unknownShapes.length) {\n // allWarnings.push({\n // message: \"Generic Tasks still undefined.\",\n // data: {},\n // });\n // }\n //\n // return allWarnings;\n }\n\n createHintUI() {\n // if already loaded skip\n if ($$(this.id)) return;\n\n let steps = [];\n let next = 0;\n let display = webix.storage.cookie.get(this.id);\n if (display?.hide) return;\n let dontShow = ``;\n this.stepIDs.forEach((step) => {\n next++;\n let newStep = {};\n newStep.id = this._steps[step].id;\n newStep.el = this._steps[step].settings.el;\n newStep.event = this._steps[step].settings.event;\n newStep.title = this._steps[step].name;\n newStep.text = this._steps[step].text + dontShow;\n if (this.stepIDs[next]) {\n newStep.nextEl = this._steps[this.stepIDs[next]].settings.el;\n if (newStep.nextEl) {\n newStep.hintId = this.id;\n newStep.eventEl = \"button\"; // added this so we do not trigger a second advance on the hint when triggering the click below\n newStep.next = function (event) {\n let nextEl = this.nextEl;\n let theNextEl = document.querySelector(nextEl);\n if (theNextEl && theNextEl.checkVisibility()) {\n return false;\n } else {\n document.querySelector(this.el).click();\n return false;\n }\n };\n }\n }\n if (newStep.el) steps.push(newStep);\n });\n\n let ui = {\n view: \"hint\",\n id: this.id,\n steps: steps,\n on: {\n onNext: (step) => {\n setTimeout(() => {\n const boxes = document.querySelectorAll(\n \"input[data-hint-id='\" + this.id + \"']\"\n );\n let display = webix.storage.cookie.get(this.id);\n boxes.forEach((b) => {\n b.checked = display?.hide || false;\n });\n }, 100);\n },\n onPrevious: (step) => {\n setTimeout(() => {\n const boxes = document.querySelectorAll(\n \"input[data-hint-id='\" + this.id + \"']\"\n );\n let display = webix.storage.cookie.get(this.id);\n boxes.forEach((b) => {\n b.checked = display?.hide || false;\n });\n }, 100);\n },\n },\n };\n\n webix.delay(\n () => {\n try {\n webix.ui(ui).start();\n } catch (err) {\n this.AB.notify.developer(err, {\n context:\n \"ABHint.createUIHint() error calling webix.ui(ui).start()\",\n ui,\n });\n }\n },\n null,\n null,\n 2000\n );\n\n // $$(this.id);\n }\n};\n","const ABIndexCore = require(\"../core/ABIndexCore\");\n\nmodule.exports = class ABIndex extends ABIndexCore {\n // constructor(attributes, object) {\n // super(attributes, object);\n // }\n\n /**\n * @method save()\n * persist this instance of ABIndex with it's parent ABObject\n * @return {Promise}\n */\n save() {\n return super\n .save()\n .then(() => this.object.indexSave(this))\n .then(() => this.migrateCreate());\n }\n\n /**\n * @method destroy()\n * destroy the current instance of ABIndex\n * also remove it from our parent ABObject\n * @return {Promise}\n */\n destroy() {\n return new Promise((resolve, reject) => {\n if (this.id) {\n this.migrateDrop()\n .then(() => {\n return super.destroy();\n })\n .then(() => this.object.indexRemove(this))\n .then(resolve)\n .catch(reject);\n } else {\n resolve();\n }\n });\n }\n\n warningsEval() {\n super.warningsEval();\n\n (this._unknownFieldIDs || []).forEach((id) => {\n this.warningsMessage(`is referencing an unknown field id[${id}]`);\n });\n\n if (this.fields.length == 0) {\n this.warningsMessage(`is not referencing any fields`);\n }\n }\n\n /**\n * @method warningsMessage()\n * generate a commonly formatted warning message for this ABField.\n * This is expected to be called from within a .warningsEval()\n * method when generating warnings.\n * @param {string} msg\n * the warning string to display\n * @param {json} data\n * any relevant additional information for a developer to refer to.\n */\n warningsMessage(msg, data = {}) {\n let message = `Index[${this.label}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n\n ///\n /// DB Migrations\n ///\n\n migrateCreate() {\n return this.AB.Network.post({\n url: `/definition/migrate/object/${this.object.id}/index/${this.id}`,\n // data: this.toObj(),\n });\n }\n\n migrateDrop() {\n return this.AB.Network[\"delete\"]({\n url: `/definition/migrate/object/${this.object.id}/index/${this.id}`,\n });\n }\n};\n","/**\n * ABMLClass\n * manage the multilingual information of an instance of a AB Defined Class.\n *\n * these classes have certain fields (\"label\", \"description\"), that can be\n * represented in different language options as defined by our platform.\n *\n * This platform ABMLClass will define 2 methods that allow for the translation\n * untranslation of this data.\n */\nvar ABMLClassCore = require(\"../core/ABMLClassCore\");\n\nmodule.exports = class ABMLClass extends ABMLClassCore {\n constructor(fieldList, AB) {\n super(fieldList, AB);\n\n this._warnings = [];\n // {array}\n // an array of warning messages for this object.\n // each warning entry should be in the format:\n // WarningMessage: {\n // message: {string} \"message to display\"\n // data: {json} additional debugging information\n // }\n }\n\n // fromValues(attributes) {\n // super.fromValues(attributes);\n // }\n\n /**\n * @method warnings()\n * returns the stored warnings for this ONE object.\n * @return {array} WarningMessage\n */\n warnings() {\n return this._warnings;\n }\n\n /**\n * @method warningsEval()\n * This method causes an object to re-evaluate it's settings to see if there\n * are any potential errors.\n */\n warningsEval() {\n this._warnings = [];\n }\n\n /**\n * @method warningsAll()\n * returns all relevant warnings for the current Object. This includes any\n * sub fields, links, views, etc...\n * @return {array} warning structures\n * [ {WarningMessage}, ... ]\n */\n warningsAll() {\n return this.warnings();\n }\n\n /**\n * @method languageDefault\n * return a default language code.\n * @return {string}\n */\n languageDefault() {\n return this.AB.Account.language() || \"en\";\n }\n\n /**\n * @method destroy()\n * remove this definition.\n * @return {Promise}\n */\n async destroy() {\n var def = this.toDefinition();\n if (def.id) {\n return def.destroy().catch((err) => {\n if (err.toString().indexOf(\"No record found\") > -1) {\n // this is weird, but not breaking:\n console.log(\n `ABMLClass.destroy(): could not find record for id[${def.id}]`\n );\n console.log(def);\n return;\n }\n throw err;\n });\n }\n return Promise.resolve();\n }\n\n /**\n * @method save()\n * persist this definition of our {ABxxx} Object\n * @return {Promise}\n */\n async save() {\n var def = this.toDefinition();\n // if not name, try to use our label as the name\n def.name = def.name || this.name || this.label || \"name\";\n var data = await def.save();\n if (!this.id) {\n this.id = data.id;\n }\n }\n};\n","const ABModelCore = require(\"../core/ABModelCore\");\n\n//\n// ABModel\n//\n// Represents the Data interface for an ABObject data.\n//\n// 2 ways to use an ABModel to load a DataTable:\n// \tMethod 1:\n// \tgather all the data externally and send to the DataTable\n//\t\tModel.findAll()\n//\t\t.then((data)=>{\n//\t\t\tDataTable.parse(data);\n//\t\t})\n//\n// \tMethod 2:\n// \tSet the Model object with a condition / skip / limit, then\n// \tuse it to load the DataTable:\n//\t\tModel.where({})\n//\t\t.skip(XX)\n//\t\t.limit(XX)\n//\t\t.loadInto(DataTable);\n\nfunction errorPopup(error) {\n // Show the pop up\n if (error && error.data && error.data.error == \"READONLY\") {\n webix.alert({\n title: \"Your action is blocked\",\n ok: \"Ok\",\n text: error.data.message || \"\",\n type: \"alert-warning\",\n });\n }\n}\n\n/*\n * @function no_socket_trigger()\n * a common routine to trigger an update.\n * In the case where our AB.Network.type() isn't a socket implementation\n * we need to manually trigger the expected socket events ourselves.\n * This fn() attempts to simulate the socket responses in such a case.\n * @param {ABModel} model\n * The ABModel currently processing the network transaction.\n * @param {string} key\n * The socket update trigger we are simulating.\n * @param {json} data\n * The relevant response from our network transaction.\n */\nfunction no_socket_trigger(model, key, data) {\n // If we do not have socket updates available, then trigger an\n // update event with this data.\n if (model.AB.Network.type() != \"socket\") {\n model.AB.emit(key, {\n objectId: model.object.id,\n data,\n });\n }\n}\n\nmodule.exports = class ABModel extends ABModelCore {\n constructor(object) {\n super(object);\n\n this.handler_create = (...params) => {\n this.handler_common(\"ab.datacollection.create\", ...params);\n };\n\n this.handler_delete = (...params) => {\n this.handler_common(\"ab.datacollection.delete\", ...params);\n };\n\n this.handler_findAll = (...params) => {\n this.handler_common(null, ...params);\n };\n\n this.handler_logs = (context, err, data) => {\n if (err) {\n context.reject?.(err);\n return;\n }\n context.resolve?.(data);\n };\n\n this.handler_update = (...params) => {\n this.handler_common(\"ab.datacollection.update\", ...params);\n };\n\n this.handler_common = (key, context, err, data) => {\n // key: {string} the relevant socket event key\n // can be null if not relevant.\n // context : {obj} any provided context data provided on the\n // this.AB.Network.get() call.\n // err: {Error} any returned error message from api\n // data: {obj} returned data from the model-get api in format:\n // {data: [], total_count: 1, pos: 0, offset: 0, limit: 0}\n if (err) {\n context.reject?.(err);\n return;\n }\n\n if (this.isCsvPacked(data)) {\n let lengthPacked = JSON.stringify(data).length;\n data = this.csvUnpack(data);\n\n // JOHNNY: getting \"RangeError: Invalid string length\"\n // when data.data is too large. So we are just going\n // to .stringify() the rows individually and count the\n // length of each one.\n\n let lengthUnpacked = 0;\n if (Array.isArray(data.data)) {\n for (var d = 0; d < data.data.length; d++) {\n lengthUnpacked += JSON.stringify(data.data[d]).length;\n }\n } else {\n lengthUnpacked += JSON.stringify(data.data).length;\n }\n\n Object.keys(data)\n .filter((k) => k != \"data\")\n .map((k) => {\n lengthUnpacked += `${k}:${data[k]},`.length;\n });\n\n lengthUnpacked += 5; // for the brackets\n\n console.log(\n `CSV Pack: ${lengthUnpacked} -> ${lengthPacked} (${(\n (lengthPacked / lengthUnpacked) *\n 100\n ).toFixed(2)}%)`\n );\n }\n\n // let jobID = this.AB.jobID();\n // console.log(`${jobID} : normalization begin`);\n // let timeFrom = performance.now();\n if (key) {\n // on \"update\" & \"create\" we want to normalizeData()\n if (key.indexOf(\"delete\") == -1) {\n // on anything with a key, we shouldn't have data.data\n data = data.data || data;\n\n this.normalizeData(data);\n } else {\n // triggers to ab.datacollection.delete need to send the .id\n // of the item deleted:\n data = data.data || context.id;\n }\n } else {\n // on a findAll we normalize data.data\n this.normalizeData(data.data);\n }\n // let timeTo = performance.now();\n // console.log(`${jobID} : normalization end: ${timeTo - timeFrom}ms`);\n\n context.resolve?.(data);\n\n // if (key) {\n // no_socket_trigger(this, key, data);\n // }\n };\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n ///\n /// Instance Methods\n ///\n\n // Prepare multilingual fields to be untranslated\n // Before untranslating we need to ensure that values.translations is set.\n prepareMultilingualData(values) {\n // if this object has some multilingual fields, translate the data:\n var mlFields = this.object.multilingualFields();\n // if mlFields are inside of the values saved we want to translate otherwise do not because it will reset the translation field and you may loose unchanged translations\n var shouldTranslate = false;\n if (mlFields.length) {\n mlFields.forEach(function (field) {\n if (values[field] != null) {\n shouldTranslate = true;\n }\n });\n }\n if (shouldTranslate) {\n if (\n values.translations == null ||\n typeof values.translations == \"undefined\" ||\n values.translations == \"\"\n ) {\n values.translations = [];\n }\n this.object.unTranslate(values, values, mlFields);\n }\n }\n\n request(method, params) {\n return this.AB.Network[method](params);\n }\n\n /**\n * @method batchCreate\n * update model values on the server.\n */\n batchCreate(values) {\n values.batch.map((vals) => {\n return this.prepareMultilingualData(vals.data);\n });\n\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, (context, err, data) => {\n if (err) {\n reject(err);\n return;\n }\n this.normalizeData(data);\n resolve(data);\n // FIX: now with sockets, the triggers are fired from socket updates.\n // trigger a create event\n // triggerEvent('create', this.object, data);\n });\n\n this.AB.Network.post(\n {\n url: this.object.urlRestBatch(),\n params: values,\n },\n {\n key: jobID,\n context: {},\n }\n )\n // .then((data) => {\n // this.normalizeData(data);\n\n // resolve(data);\n\n // // FIX: now with sockets, the triggers are fired from socket updates.\n // // trigger a create event\n // // triggerEvent('create', this.object, data);\n // })\n .catch(reject);\n });\n }\n\n /**\n * @method create\n * update model values on the server.\n */\n create(values) {\n this.prepareMultilingualData(values);\n\n // add default values record if no value is passed for column\n this.object.fields().forEach((f) => {\n if (values[f.columnName] === undefined) {\n f.defaultValue(values);\n }\n });\n\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, this.handler_create);\n this.AB.Network.post(\n {\n url: this.object.urlRest(),\n params: values,\n },\n {\n key: jobID,\n context: { resolve, reject },\n }\n )\n .then((newVal) => {})\n .catch((err) => {\n errorPopup(err);\n reject(err);\n });\n }).then((newVal) => {\n no_socket_trigger(this, \"ab.datacollection.create\", newVal);\n return newVal;\n });\n }\n\n /**\n * @method delete\n * remove this model instance from the server\n * @param {integer|UUID} id the .id of the instance to remove.\n * @return {Promise}\n */\n delete(id) {\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, this.handler_delete);\n this.AB.Network[\"delete\"](\n {\n url: this.object.urlRestItem(id),\n },\n {\n key: jobID,\n id,\n context: { resolve, reject },\n }\n ).catch((err) => {\n errorPopup(err);\n reject(err);\n });\n }).then((res) => {\n // properly issue the delete\n no_socket_trigger(this, \"ab.datacollection.delete\", id);\n return res;\n });\n }\n\n /**\n * @method findAll\n * performs a data find with the provided condition.\n */\n async findAll(cond) {\n cond = cond || {};\n\n // scan the rules and convert any is_current_date rules to UTC daytime range.\n let rules = cond.where?.rules;\n while (rules?.length) {\n let nestedRules = [];\n rules.forEach((rule) => {\n if (rule.rule === \"is_current_date\")\n rule.value = this.AB.rules.getUTCDayTimeRange();\n else if (rule.rules?.length)\n nestedRules = nestedRules.concat(rule.rules);\n });\n\n rules = nestedRules;\n }\n\n // \t\t// prepare our condition:\n // \t\tvar newCond = {};\n\n // \t\t// if the provided cond looks like our { where:{}, skip:xx, limit:xx } format,\n // \t\t// just use this one.\n // \t\tif (cond.where) {\n // \t\t\tnewCond = cond;\n // \t\t} else {\n\n // \t\t\t// else, assume the provided condition is the .where clause.\n // \t\t\tnewCond.where = cond;\n // \t\t}\n\n // /// if this is our depreciated format:\n // if (newCond.where.where) {\n // \tOP.Error.log('Depreciated Embedded .where condition.');\n // }\n\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, this.handler_findAll);\n this.AB.Network.get(\n {\n url: this.object.urlRest(),\n params: cond,\n // params: newCond\n },\n {\n key: jobID,\n context: { resolve, reject },\n }\n )\n // .then((data) => {\n // this.normalizeData(data.data);\n\n // resolve(data);\n // })\n .catch((err) => {\n if (err && err.code) {\n switch (err.code) {\n case \"ER_PARSE_ERROR\":\n this.AB.notify.developer(err, {\n message:\n \"AppBuilder:ABModel:findAll(): Parse Error with provided condition\",\n condition: cond,\n });\n break;\n\n default:\n this.AB.notify.developer(err, {\n message:\n \"AppBuilder:ABModel:findAll(): Unknown Error with provided condition\",\n condition: cond,\n });\n break;\n }\n }\n reject(err);\n });\n });\n }\n\n /**\n * @method loadInto\n * loads the current values into the provided Webix DataTable\n * @param {DataTable} DT A Webix component that can dynamically load data.\n */\n loadInto(DT) {\n // if a limit was applied, then this component should be loading dynamically\n if (this._limit) {\n DT.define(\"datafetch\", this._limit);\n DT.define(\"datathrottle\", 250); // 250ms???\n\n // catch the event where data is requested:\n // here we will do our own findAll() so we can persist\n // the provided .where condition.\n\n // oh yeah, and make sure to remove any existing event handler when we\n // perform a new .loadInto()\n DT.___AD = DT.___AD || {};\n if (DT.___AD.onDataRequestEvent) {\n DT.detachEvent(DT.___AD.onDataRequestEvent);\n }\n DT.___AD.onDataRequestEvent = DT.attachEvent(\n \"onDataRequest\",\n (start, count) => {\n var cond = {\n where: this._where,\n sort: this._sort,\n limit: count,\n skip: start,\n };\n\n if (DT.showProgress) DT.showProgress({ type: \"icon\" });\n\n this.findAll(cond).then((data) => {\n /*\n // In V2: we move the row height processing into \n // the interface designer \n\n data.data.forEach((item) => {\n if (\n item.properties != null &&\n item.properties.height != \"undefined\" &&\n parseInt(item.properties.height) > 0\n ) {\n item.$height = parseInt(item.properties.height);\n } else if (parseInt(this._where.height) > 0) {\n item.$height = parseInt(this._where.height);\n }\n });\n */\n DT.parse(data);\n\n if (DT.hideProgress) DT.hideProgress();\n });\n\n return false; // <-- prevent the default \"onDataRequest\"\n }\n );\n\n DT.refresh();\n }\n\n // else just load it all at once:\n var cond = {};\n if (this._where) cond.where = this._where;\n if (this._sort) cond.sort = this._sort;\n if (this._limit != null) cond.limit = this._limit;\n if (this._skip != null) cond.skip = this._skip;\n\n if (DT.showProgress) DT.showProgress({ type: \"icon\" });\n\n this.findAll(cond)\n .then((data) => {\n // v2: we no longer process item $height\n /*\n data.data.forEach((item) => {\n if (\n item.properties != null &&\n item.properties.height != \"undefined\" &&\n parseInt(item.properties.height) > 0\n ) {\n item.$height = parseInt(item.properties.height);\n } else if (parseInt(this._where.height) > 0) {\n item.$height = parseInt(this._where.height);\n }\n });\n */\n\n DT.parse(data);\n\n if (DT.hideProgress) DT.hideProgress();\n })\n .catch((err) => {\n console.error(\"!!!!!\", err);\n });\n }\n\n /**\n * @method logs()\n * return the log history related to this model's ABObject.\n * @param {hash} options\n * a key=>value hash of optional search criteria\n * .rowId {string} the uuid of the individual entry we are querying\n * .levelName {string} the type of entry [\"insert\", \"update\", \"delete\"]\n * .username {string} the entries associated with the given user\n * .startDate {date} entries that happened ON or AFTER this date\n * .endDate {date} entries that happened ON or BEFORE this date\n * .start {integer} paging control: how many entries to skip\n * .limit {integer} paging control: only return this # entries\n * @return {Promise}\n */\n logs(options) {\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, this.handler_logs);\n this.AB.Network.get(\n {\n url: this.object.urlRestLog(),\n params: options,\n // params: newCond\n },\n {\n key: jobID,\n context: { resolve, reject },\n }\n ).catch((err) => {\n if (err && err.code) {\n this.AB.notify.developer(err, {\n context: \"AppBuilder:ABModel:logs(): Error\",\n options,\n });\n }\n reject(err);\n });\n });\n }\n\n /**\n * @method limit\n * set the limit value for this set of data\n * @param {integer} limit the number or elements to return in this call\n * @return {ABModel} this object that is chainable.\n */\n limit(limit) {\n this._limit = limit;\n return this;\n }\n\n /**\n * @method skip\n * set the skip value for this set of data\n * @param {integer} skip the number or elements to skip\n * @return {ABModel} this object that is chainable.\n */\n skip(skip) {\n this._skip = skip;\n return this;\n }\n\n /**\n * @method update\n * update model values on the server.\n */\n update(id, values) {\n this.prepareMultilingualData(values);\n\n // remove empty properties\n for (var key in values) {\n if (values[key] == null) delete values[key];\n }\n\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, this.handler_update);\n this.AB.Network.put(\n {\n url: this.object.urlRestItem(id),\n params: values,\n },\n { key: jobID, context: { resolve, reject } }\n )\n // .then((data) => {\n // this.normalizeData(data);\n\n // resolve(data);\n\n // // If we do not have socket updates available, then trigger an\n // // update event with this data.\n // if (this.AB.Network.type() != \"socket\") {\n // this.AB.emit(\"ab.datacollection.update\", {\n // objectId: this.object.id,\n // data,\n // });\n // }\n // })\n .catch((err) => {\n errorPopup(err);\n reject(err);\n });\n }).then((newVal) => {\n // properly issue the update\n no_socket_trigger(this, \"ab.datacollection.update\", newVal);\n return newVal;\n });\n }\n\n /**\n * @method batchUpdate\n * update value to many rows on the server.\n */\n batchUpdate({ rowIds, values }) {\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, (context, err /*, data */) => {\n if (err) {\n reject(err);\n return;\n }\n // this.normalizeData(data);\n resolve(true);\n // what about checking for socket updates?\n });\n this.AB.Network.put(\n {\n url: this.object.urlRestBatch(),\n params: {\n rowIds,\n values,\n },\n },\n { key: jobID, context: {} }\n )\n // .then(() => {\n // resolve(true);\n // })\n .catch(reject);\n });\n }\n};\n","//\n// ABModelAPI\n//\n// Represents the Data interface for an ABObjectQuery data.\n\nconst ABModel = require(\"./ABModel\");\n\nmodule.exports = class ABModelAPI extends ABModel {\n ///\n /// Instance Methods\n ///\n\n /**\n * @method findAll\n * performs a data find with the provided condition.\n */\n async findAll(cond = {}) {\n cond.isAPI = true;\n cond.url = this.object?.request?.url;\n\n return super.findAll(cond);\n }\n\n /**\n * @method batchCreate\n * update model values on the server.\n */\n batchCreate(values) {\n const error = new Error(\n \"ABObjectApi.ABModelAPI.batchCreate() does not be implemented.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method create\n * update model values on the server.\n */\n async create(values) {\n const error = new Error(\n \"ABObjectApi.ABModelAPI.create() does not be implemented.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method delete\n * remove this model instance from the server\n * @param {integer|UUID} id the .id of the instance to remove.\n * @return {Promise}\n */\n delete(id) {\n const error = new Error(\n \"ABObjectApi.ABModelAPI.delete() does not be implemented.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method update\n * update model values on the server.\n */\n update(id, values) {\n const error = new Error(\n \"ABObjectApi.ABModelAPI.update() does not be implemented.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method batchUpdate\n * update value to many rows on the server.\n */\n batchUpdate({ rowIds, values }) {\n const error = new Error(\n \"ABObjectApi.ABModelAPI.batchUpdate() does not be implemented.\"\n );\n return Promise.reject(error);\n }\n};\n","//\n// ABModelAPINetsuite\n//\n// Represents the Data interface for a connection to Netsuite.\n\nconst ABModel = require(\"./ABModel\");\n\nmodule.exports = class ABModelAPINetsuite extends ABModel {\n ///\n /// Instance Methods\n ///\n\n /**\n * @method normalizeData()\n * For a Netsuite object, there are additional steps we need to handle\n * to normalize our data.\n */\n normalizeData(data) {\n super.normalizeData(data);\n\n if (!Array.isArray(data)) {\n data = [data];\n }\n\n var boolFields = this.object.fields((f) => f.key == \"boolean\");\n let allFields = this.object.fields();\n\n data.forEach((d) => {\n // Netsuite sometimes keeps keys all lowercase\n // which might not match up with what it told us in the meta-catalog\n // which we need:\n for (var i = 0; i < allFields.length; i++) {\n let actualColumn = allFields[i].columnName;\n let lcColumn = actualColumn.toLowerCase();\n\n if (\n typeof d[actualColumn] == \"undefined\" &&\n typeof d[lcColumn] != \"undefined\"\n ) {\n d[actualColumn] = d[lcColumn];\n delete d[lcColumn];\n }\n }\n\n // Netsuite Booleans are \"T\" or \"F\"\n boolFields.forEach((bField) => {\n let val = d[bField.columnName];\n // just how many ways can a DB indicate True/False?\n if (typeof val == \"string\") {\n val = val.toLowerCase();\n\n if (val === \"t\") val = true;\n else val = false;\n\n d[bField.columnName] = val;\n }\n });\n });\n }\n};\n","//\n// ABModelQuery\n//\n// Represents the Data interface for an ABObjectQuery data.\n\nconst ABModel = require(\"./ABModel\");\n\nmodule.exports = class ABModelQuery extends ABModel {\n ///\n /// Instance Methods\n ///\n\n /**\n * @method batchCreate\n * update model values on the server.\n */\n batchCreate(values) {\n var error = new Error(\n \"ABObjectQuery.ABModelQuery.batchCreate() should not be called.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method create\n * update model values on the server.\n */\n create(values) {\n var error = new Error(\n \"ABObjectQuery.ABModelQuery.create() should not be called.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method delete\n * remove this model instance from the server\n * @param {integer|UUID} id the .id of the instance to remove.\n * @return {Promise}\n */\n delete(id) {\n var error = new Error(\n \"ABObjectQuery.ABModelQuery.delete() should not be called.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method update\n * update model values on the server.\n */\n update(id, values) {\n var error = new Error(\n \"ABObjectQuery.ABModelQuery.update() should not be called.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method batchUpdate\n * update value to many rows on the server.\n */\n batchUpdate({ rowIds, values }) {\n var error = new Error(\n \"ABObjectQuery.ABModelQuery.batchUpdate() should not be called.\"\n );\n return Promise.reject(error);\n }\n};\n","const ABObjectCore = require(\"../core/ABObjectCore\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\n// NOTE: this has been moved to NetworkRestSocket:\n//\n// // Start listening for server events for object updates and call triggerEvent as the callback\n// if (typeof io != \"undefined\") {\n// io.socket.on(\"ab.object.update\", function (msg) {\n// AB.emit(\"ab.object.update\", {\n// objectId: msg.objectId,\n// data: msg.data,\n// });\n// });\n// } else {\n// console.error(\"TODO: ABObject: configure Socket.io\");\n// }\n\n// io.socket.on(\"ab.object.delete\", function (msg) {\n// });\n\nmodule.exports = class ABObject extends ABObjectCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n // listen for our ABFields.\"definition.updated\"\n this.fields().forEach((f) => {\n f.on(\"definition.updated\", (field) => {\n // create a new Field with the updated def\n var def = this.AB.definitionByID(field.id);\n if (!def) return;\n\n var newField = this.AB.fieldNew(def, this);\n\n // we want to keep the same fieldID order:\n var newFields = [];\n this.fields().forEach((f) => {\n if (f.id === field.id) {\n newFields.push(newField);\n return;\n }\n newFields.push(f);\n });\n\n this._fields = newFields;\n });\n });\n\n // listen\n // this.AB.on(\"ab.object.update\", (data) => {\n // if (this.id == data.objectId) this.fromValues(data.data);\n // });\n\n this._pendingNetworkRequests = {};\n // {hash} uuid : {Promise}\n // convert our migrateXXXX() operations to be Relay/offline compatible.\n // if a queued operation is sent after a web browser refresh, then\n // we will NOT have a pending promise to .resolve()/.reject()\n\n this._handler_object_migrate = (context, err, response) => {\n // NOTE:\n var pending = this._pendingNetworkRequests?.[context.uuid];\n if (err) {\n pending?.reject(err);\n return;\n }\n pending?.resolve(response);\n };\n this.AB.Network.on(\"object.migrate\", this._handler_object_migrate);\n }\n\n /**\n * @method refreshInstance()\n * Used when a definition.updated message is detected on this ABObject.\n * This method will return a new instance based upon the current definition\n * and properly resolve any handlers and pending network Requests.\n * @return {ABObject}\n */\n refreshInstance() {\n var newObj = this.AB.objectByID(this.id);\n\n // prevent doing this multiple times:\n if (this._pendingNetworkRequests) {\n // remove object.migrate listener\n this.AB.Network.removeListener(\n \"object.migrate\",\n this._handler_object_migrate\n );\n\n // transfer the pending network requests\n newObj._pendingNetworkRequests = this._pendingNetworkRequests;\n this._pendingNetworkRequests = null;\n }\n\n return newObj;\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n fromValues(attributes) {\n /*\n\t\t{\n\t\t\tid: uuid(),\n\t\t\tname: 'name',\n\t\t\tlabelFormat: 'xxxxx',\n\t\t\tisImported: 1/0,\n\t\t\tisExternal: 1/0,\n\t\t\turlPath:'string',\n\t\t\timportFromObject: 'string', // JSON Schema style reference: '#[ABApplication.id]/objects/[ABObject.id]'\n\t\t\t\t\t\t\t\t\t\t// to get other object: ABApplication.objectFromRef(obj.importFromObject);\n\t\t\ttranslations:[\n\t\t\t\t{}\n\t\t\t],\n\t\t\tfields:[\n\t\t\t\t{ABDataField}\n\t\t\t]\n\t\t}\n\t\t*/\n\n super.fromValues(attributes);\n\n if (this.workspaceViews) this.workspaceViews.fromObj(attributes);\n }\n\n //// TODO: Refactor isValid() to ignore op and not error if duplicateName is own .id\n\n isValid() {\n var validator = this.AB.Validation.validator();\n\n // label/name must be unique:\n var isNameUnique =\n this.AB.objects((o) => {\n return (\n o.id != this.id &&\n o.name.toLowerCase() == this.name.toLowerCase()\n );\n }).length == 0;\n if (!isNameUnique) {\n validator.addError(\n \"name\",\n L('Object name must be unique (\"{0}\" already in use)', [this.name])\n );\n }\n\n // Check the common validations:\n // TODO:\n // if (!inputValidator.validate(values.label)) {\n // \t_logic.buttonSaveEnable();\n // \treturn false;\n // }\n\n return validator;\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an array of any invalid\n * value errors.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @return {array}\n */\n isValidData(data) {\n var validator = this.AB.Validation.validator();\n this.fields().forEach((f) => {\n // check if value was passed, if so validate it\n if (Object.prototype.hasOwnProperty.call(data, f.columnName))\n f.isValidData(data, validator);\n });\n\n return validator;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fieldNew()\n *\n * return an instance of a new (unsaved) ABField that is tied to this\n * ABObject.\n *\n * NOTE: this new field is not included in our this.fields until a .save()\n * is performed on the field.\n *\n * @param {obj} values the initial values for this field.\n *\t\t\t\t\t\t{ key:'{string}'} is required\n * @return {ABField}\n */\n // fieldNew ( values ) {\n // \t// NOTE: ABFieldManager returns the proper ABFieldXXXX instance.\n // \treturn ABFieldManager.newField( values, this );\n // }\n\n /// ABApplication data methods\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABObject\n *\n * also remove it from our parent application\n *\n * @return {Promise}\n */\n async destroy() {\n /*\n return new Promise((resolve, reject) => {\n // Remove the import object, then its model will not be destroyed\n if (this.isImported) {\n this.application\n .objectDestroy(this)\n .catch(reject)\n .then(() => {\n resolve();\n });\n\n return;\n }\n\n // OK, some of our Fields have special follow up actions that need to be\n // considered when they no longer exist, so before we simply drop this\n // object/table, drop each of our fields and give them a chance to clean up\n // what needs cleaning up.\n\n // ==> More work, but safer.\n var fieldDrops = [];\n this.fields().forEach((f) => {\n fieldDrops.push(f.destroy());\n });\n\n Promise.all(fieldDrops)\n .then(() => {\n return new Promise((next, err) => {\n // now drop our table\n // NOTE: our .migrateXXX() routines expect the object to currently exist\n // in the DB before we perform the DB operations. So we need to\n // .migrateDrop() before we actually .objectDestroy() this.\n this.migrateDrop()\n .then(() => {\n // finally remove us from the application storage\n return this.application.objectDestroy(this);\n })\n .then(next)\n .catch(err);\n });\n })\n\n // flag .disable to queries who contains this removed object\n .then(() => {\n return new Promise((next, err) => {\n this.application\n .queries(\n (q) =>\n q.objects((o) => o.id == this.id).length > 0\n )\n .forEach((q) => {\n q._objects = q.objects((o) => o.id != this.id);\n\n q.disabled = true;\n });\n\n next();\n });\n })\n .then(resolve)\n .catch(reject);\n });\n */\n\n var removeFromApplications = () => {\n var allRemoves = [];\n this.AB.applications().forEach((app) => {\n allRemoves.push(app.objectRemove(this));\n });\n return Promise.all(allRemoves);\n };\n\n var disableRelatedQueries = () => {\n return new Promise((next /*, err */) => {\n this.AB.queries(\n (q) => q.objects((o) => o.id == this.id).length > 0\n ).forEach((q) => {\n // q._objects = q.objects((o) => o.id != this.id);\n\n q.disabled = true;\n });\n\n next();\n });\n };\n\n try {\n // 1) remove us from all Application:\n await removeFromApplications();\n\n // 2) disable any connected Queries\n await disableRelatedQueries();\n\n // if an imported Object (FederatedTable, Existing Table, etc...)\n // then skip this step\n if (this.isImported) {\n return Promise.resolve();\n }\n\n // time to remove my table:\n // NOTE: our .migrateXXX() routines expect the object to currently exist\n // in the DB before we perform the DB operations. So we need to\n // .migrateDrop() before we actually .destroy() this.\n await this.migrateDrop();\n\n // now remove my definition\n\n // start with my fields:\n var fieldDrops = [];\n\n // Only ABObjects should attempt any fieldDrops.\n // ABObjectQueries can safely skip this step:\n if (this.type == \"object\") {\n var allFields = this.fields();\n this._fields = []; // clear our field counter so we don't retrigger\n // this.save() on each field.destroy();\n\n allFields.forEach((f) => {\n fieldDrops.push(f.destroy());\n });\n }\n await Promise.all(fieldDrops);\n\n await super.destroy();\n this.emit(\"destroyed\");\n } catch (err) {\n this.AB.notify.developer(err, {\n context: \"ABObject.destroy(): error destroying object.\",\n });\n }\n\n // return Promise.resolve()\n // .then(() => {\n // // 1) remove us from all Application:\n // return removeFromApplications();\n // })\n // .then(() => {\n // // 2) disable any connected Queries\n // return disableRelatedQueries();\n // })\n // .then(() => {\n // // if an imported Object (FederatedTable, Existing Table, etc...)\n // // then skip this step\n // if (this.isImported) {\n // return Promise.resolve();\n // }\n\n // // time to remove my table:\n // // NOTE: our .migrateXXX() routines expect the object to currently exist\n // // in the DB before we perform the DB operations. So we need to\n // // .migrateDrop() before we actually .destroy() this.\n // return this.migrateDrop();\n // })\n // .then(() => {\n // // now remove my definition\n\n // // start with my fields:\n // var fieldDrops = [];\n\n // // Only ABObjects should attempt any fieldDrops.\n // // ABObjectQueries can safely skip this step:\n // if (this.type == \"object\") {\n // var allFields = this.fields();\n // this._fields = []; // clear our field counter so we don't retrigger\n // // this.save() on each field.destroy();\n\n // allFields.forEach((f) => {\n // fieldDrops.push(f.destroy());\n // });\n // }\n\n // return Promise.all(fieldDrops)\n // .then(() => {\n // // now me.\n // return super.destroy();\n // })\n // .then(() => {\n // this.emit(\"destroyed\");\n // });\n // });\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABObject with it's parent ABApplication\n *\n *\n * @return {Promise}\n *\t\t\t\t\t\t.resolve( {this} )\n */\n async save(skipMigrate = false) {\n var isAdd = false;\n\n // if this is our initial save()\n if (!this.id) {\n this.label = this.label || this.name;\n isAdd = true;\n }\n\n try {\n await super.save();\n if (isAdd && !skipMigrate) {\n await this.migrateCreate();\n }\n return this;\n } catch (err) {\n this.AB.notify.developer(err, {\n context: \"ABObject.save()\",\n obj: this.toObj(),\n });\n throw err;\n }\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var result = super.toObj();\n\n result.objectWorkspaceViews = this.workspaceViews?.toObj();\n\n return result;\n }\n\n ///\n /// DB Migrations\n ///\n\n migrateCreate() {\n return new Promise((resolve, reject) => {\n var uuid = this.AB.uuid();\n this._pendingNetworkRequests[uuid] = { resolve, reject };\n var jobResponse = {\n key: \"object.migrate\",\n context: { uuid, id: this.id },\n };\n this.AB.Network.post(\n {\n url: `/definition/migrate/object/${this.id}`,\n },\n jobResponse\n );\n });\n }\n\n migrateDrop() {\n return new Promise((resolve, reject) => {\n var uuid = this.AB.uuid();\n this._pendingNetworkRequests[uuid] = { resolve, reject };\n var jobResponse = {\n key: \"object.migrate\",\n context: { uuid, id: this.id },\n };\n this.AB.Network[\"delete\"](\n {\n url: `/definition/migrate/object/${this.id}`,\n },\n jobResponse\n );\n });\n }\n\n ///\n /// Working with Client Components:\n ///\n\n /**\n * @method columnResize()\n *\n * save the new width of a column\n *\n * @param {} id The instance of the field to save.\n * @param {int} newWidth the new width of the field\n * @param {int} oldWidth the old width of the field\n * @return {Promise}\n */\n columnResize(columnName, newWidth /*, oldWidth */) {\n var fieldID = null;\n for (var i = 0; i < this._fields.length; i++) {\n if (this._fields[i].columnName == columnName) {\n fieldID = this._fields[i].id;\n break;\n // this._fields[i].settings.width = newWidth;\n }\n }\n\n // Johnny: This is better but still not right. the ABObject should not be\n // storing sizes for field widths. That is a function of the UI and which\n // Grid is being displayed. THAT GRID should be storing a column width\n // locally.\n // TODO: once we have v2 in place.\n\n var fieldSettings = this.AB.localSettings(fieldID);\n fieldSettings = fieldSettings || {};\n fieldSettings.width = newWidth;\n\n return this.AB.localSettings(fieldID, fieldSettings);\n // return this.save();\n }\n\n // return the column headers for this object\n // @param {bool} isObjectWorkspace return the settings saved for the object workspace\n columnHeaders(\n isObjectWorkspace,\n isEditable,\n summaryColumns,\n countColumns,\n hiddenFieldNames\n ) {\n summaryColumns = summaryColumns || [];\n countColumns = countColumns || [];\n\n var headers = [];\n // var columnNameLookup = {};\n\n // get the header for each of our fields:\n this.fields().forEach((f) => {\n var header = f.columnHeader({\n isObjectWorkspace: isObjectWorkspace,\n editable: isEditable,\n });\n\n if (isEditable) {\n header.validationRules = f.settings.validationRules;\n }\n\n header.alias = f.alias || undefined; // query type\n header.fieldID = f.id;\n // header.fieldURL = f.urlPointer();\n\n // if the field specifies a width\n if (f.settings.width != 0) {\n header.width = f.settings.width;\n }\n\n // if the User has already updated a local width for this\n var fieldSettings = this.AB.localSettings(f.id);\n if (fieldSettings && fieldSettings.width) {\n if (!header.width || fieldSettings.width > header.width) {\n // set column width to the customized width\n header.width = fieldSettings.width;\n }\n }\n\n if (!header.width) {\n // set column width to adjust:true by default;\n header.adjust = true;\n }\n\n // add the summary footer\n if (summaryColumns.indexOf(f.id) > -1) {\n if (f.key == \"calculate\" || f.key == \"formula\") {\n header.footer = { content: \"totalColumn\", field: f };\n } else {\n header.footer = { content: \"summColumn\" };\n }\n }\n // add the count footer\n else if (countColumns.indexOf(f.id) > -1)\n header.footer = { content: \"countColumn\" };\n\n headers.push(header);\n // columnNameLookup[header.id] = f.columnName; // name => id\n });\n\n // update our headers with any settings applied in the Object Workspace\n /*\n // In v2: this is handled by the ABDesigner\n //\n if (isObjectWorkspace) {\n let hiddenFieldList = [];\n\n if (hiddenFieldNames && hiddenFieldNames.length > 0)\n hiddenFieldList = hiddenFieldNames;\n // else if (this.workspaceHiddenFields)\n // hiddenFieldList = this.workspaceHiddenFields;\n\n if (hiddenFieldList.length > 0) {\n hiddenFieldList.forEach((hfID) => {\n headers.forEach((h) => {\n if (columnNameLookup[h.id] == hfID) {\n h.hidden = true;\n }\n });\n });\n }\n }\n */\n\n return headers;\n }\n\n // after a component has rendered, tell each of our fields to perform\n // any custom display operations\n // @param {Webix.DataStore} data a webix datastore of all the rows effected\n // by the render.\n customDisplays(data, App, DataTable, rowIds, isEditable) {\n if (!data || !data.getFirstId) return;\n\n // var fields = this.fields(f => this.workspaceHiddenFields.indexOf(f.columnName) < 0);\n let fields = [];\n DataTable.eachColumn((columnName) => {\n let field = this.fields((f) => f.columnName == columnName)[0];\n if (field) fields.push(field);\n });\n\n if (rowIds != null) {\n rowIds.forEach((id) => {\n let row = data.getItem(id);\n if (row) {\n fields.forEach((f) => {\n let node = DataTable.getItemNode({\n row: row.id,\n column: f.columnName,\n });\n f.customDisplay(row, App, node, {\n editable: isEditable,\n });\n });\n }\n });\n } else {\n let id = data.getFirstId();\n while (id) {\n var row = data.getItem(id);\n if (row) {\n fields.forEach((f) => {\n var node = DataTable.getItemNode({\n row: row.id,\n column: f.columnName,\n });\n f.customDisplay(row, App, node, {\n editable: isEditable,\n });\n });\n }\n id = data.getNextId(id);\n }\n }\n }\n\n // Display data with label format of object\n displayData(rowData) {\n if (rowData == null) return \"\";\n\n // translate multilingual\n //// TODO: isn't this a MLObject?? use this.translate()\n var mlFields = this.multilingualFields();\n this.translate(rowData, rowData, mlFields);\n\n var labelData = this.labelFormat || \"\";\n\n // default label\n if (!labelData && this.fields().length > 0) {\n var defaultField = this.fields((f) => f.fieldUseAsLabel())[0];\n if (defaultField) labelData = `{${defaultField.id}}`;\n else\n labelData = `${this.AB.isUUID(rowData.id) ? \"ID: \" : \"\"}${\n rowData.id\n }`; // show id of row\n }\n\n // get column ids in {colId} template\n // ['{colId1}', ..., '{colIdN}']\n var colIds = labelData.match(/\\{[^}]+\\}/g);\n\n if (colIds && colIds.forEach) {\n colIds.forEach((colId) => {\n var colIdNoBracket = colId.replace(\"{\", \"\").replace(\"}\", \"\");\n\n var field = this.fieldByID(colIdNoBracket);\n if (field == null) return;\n\n labelData = labelData.replace(colId, field.format(rowData) || \"\");\n });\n }\n\n // if label is empty, then show .id\n if (!labelData.trim()) {\n let labelSettings = this.labelSettings || {};\n if (labelSettings && labelSettings.isNoLabelDisplay) {\n labelData = L(labelSettings.noLabelText || \"[No Label]\");\n } else {\n // show id of row\n labelData = `${this.AB.isUUID(rowData.id) ? \"ID: \" : \"\"}${\n rowData.id\n }`;\n }\n }\n\n return labelData;\n }\n\n currentView() {\n return this.workspaceViews.getCurrentView();\n }\n\n warningsAll() {\n // report both OUR warnings, and any warnings from any of our fields\n var allWarnings = super.warningsAll();\n this.fields().forEach((f) => {\n if (!f) return;\n allWarnings = allWarnings.concat(f?.warnings());\n });\n\n this.indexes().forEach((i) => {\n if (!i) return;\n allWarnings = allWarnings.concat(i?.warnings());\n });\n\n return allWarnings.filter((w) => w);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let allFields = this.fields();\n\n if (allFields.length == 0) {\n this.warningsMessage(\"has no fields\");\n }\n\n (this._unknownFieldIDs || []).forEach((id) => {\n this.warningsMessage(`is referencing an unknown field id[${id}]`);\n });\n\n (this._unknownIndex || []).forEach((id) => {\n this.warningsMessage(`is referencing an unknown index id[${id}]`);\n });\n\n allFields.forEach((f) => {\n f?.warningsEval();\n });\n\n this.indexes().forEach((i) => {\n i?.warningsEval();\n });\n }\n\n warningsMessage(msg, data = {}) {\n let message = `Object[${this.label}]: ${msg}`;\n this._warnings.push({ message, data });\n // this.emit(\"warning\", warnMsg, data);\n }\n\n isUuid(text) {\n console.error(\n \"ABObject.isUuid(): is depreciated. directly reference AB.Rules.isUUID() instead.\"\n );\n return this.AB.isUUID(text);\n }\n\n async getDbInfo() {\n return this.AB.Network.get({\n url: `/definition/info/object/${this.id}`,\n });\n }\n\n /**\n * @method formCleanValues()\n * perform a final review of the data a form will try to submit for\n * this object. The lets individual fields have a chance to update or\n * remove values before they are sent.\n * @param {obj} rowData\n * The {data} a form has collected and is about to save.\n * @return {undefined}\n */\n formCleanValues(rowData) {\n this.fields().forEach((f) => {\n f.formCleanData(rowData);\n });\n }\n};\n","const atomicjs = require(\"atomicjs\");\nconst ABObjectApiCore = require(\"../core/ABObjectApiCore\");\n\nmodule.exports = class ABObjectApi extends ABObjectApiCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n }\n\n async fetchData(insertDataMax = 20) {\n if (this.isFetched) return;\n\n const headers = this.headers;\n\n const response = await atomicjs(this.request.url, {\n method: this.request.verb,\n headers,\n data: {},\n timeout: null,\n withCredentials: false,\n });\n\n let parsedResponse = this.dataFromKey(response);\n\n const model = this.model();\n\n if (parsedResponse.length == null || parsedResponse.length === 0) {\n const data = {};\n\n this.response.fields.forEach((f) => {\n data[f.columnName] = parsedResponse[f.columnName];\n });\n\n await model.create(data);\n\n return;\n }\n\n let pendingModelCreate = [];\n\n for (let i = 0; i < parsedResponse.length; i++) {\n const data = {};\n\n this.response.fields.forEach((f) => {\n data[f.columnName] = parsedResponse[i][f.columnName];\n });\n\n pendingModelCreate.push(model.create(data));\n\n if (pendingModelCreate.length % insertDataMax === 0)\n await Promise.all(pendingModelCreate);\n }\n\n if (pendingModelCreate.length > 0) await Promise.all(pendingModelCreate);\n\n this.isFetched = true;\n\n await this.save();\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABObject with it's parent ABApplication\n *\n *\n * @return {Promise}\n *\t\t\t\t\t\t.resolve( {this} )\n */\n async save() {\n return await super.save(true);\n }\n\n migrateCreate() {\n return Promise.resolve();\n }\n\n migrateDrop() {\n return Promise.resolve();\n }\n};\n","const ABObjectApiNetsuiteCore = require(\"../core/ABObjectApiNetsuiteCore\");\n\nmodule.exports = class ABObjectApiNetsuite extends ABObjectApiNetsuiteCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n }\n\n async getDbInfo() {\n /*\n // Data format:\n {\n \"definitionId\": \"f2416a1a-d75c-40f2-8180-bad9b5f8b9cc\",\n \"tableName\": \"AB_MockupHR_TeamTargetLocation\",\n \"fields\": [\n {\n \"Field\": \"uuid\",\n \"Type\": \"varchar(255)\",\n \"Null\": \"NO\",\n \"Key\": \"PRI\",\n \"Default\": null,\n \"Extra\": \"\"\n },\n {\n \"Field\": \"created_at\",\n \"Type\": \"datetime\",\n \"Null\": \"YES\",\n \"Key\": \"\",\n \"Default\": null,\n \"Extra\": \"\"\n },\n {\n \"Field\": \"updated_at\",\n \"Type\": \"datetime\",\n \"Null\": \"YES\",\n \"Key\": \"\",\n \"Default\": null,\n \"Extra\": \"\"\n },\n {\n \"Field\": \"properties\",\n \"Type\": \"text\",\n \"Null\": \"YES\",\n \"Key\": \"\",\n \"Default\": null,\n \"Extra\": \"\"\n }\n ]\n }\n */\n let PK = this.PK();\n let fieldInfo = [];\n this.fields().forEach((f) => {\n let field = {\n Field: f.columnName,\n Type: f.key,\n Null: f.settings.required ? \"NO\" : \"YES\",\n Key: PK == f.columnName ? \"PRI\" : \"\",\n Default: \"\",\n Extra: \"\",\n };\n fieldInfo.push(field);\n });\n\n let TableInfo = {\n definitionId: this.id,\n tableName: this.tableName,\n fields: fieldInfo,\n };\n\n return TableInfo;\n }\n};\n","const ABObject = require(\"./ABObject\");\n\n/**\n * ABObjectExternal\n * These are ABObjects that ... (might need to be refactored out?)\n * NOTE: on the web client, these should function just like ABObjects\n */\nmodule.exports = class ABObjectExternal extends ABObject {};\n","const ABObject = require(\"./ABObject\");\n\n/**\n * ABObjectImport\n * These are ABObjects that were Imported from existing Tables in the\n * system.\n *\n * NOTE: on the web client, these should function just like ABObjects\n */\nmodule.exports = class ABObjectImport extends ABObject {};\n","//\n// ABObjectQuery\n//\n// A type of Object in our system that is based upon a complex relationship of multiple\n// existing Objects.\n//\n// In the QueryBuilder section of App Builder, a new Query Object can be created.\n// An initial Object can be chosen from our current list of Objects. After that, additional Objects\n// and a specified join type can be specified.\n//\n// A list of fields from each specified Object can also be included as the data to be returned.\n//\n// A where statement is also part of the definition.\n//\n\nconst ABObjectQueryCore = require(\"../core/ABObjectQueryCore\");\n\nvar ABFactory = null;\nif (typeof io != \"undefined\") {\n io.socket.on(\"ab.query.update\", function (msg) {\n if (ABFactory) {\n ABFactory.emit(\"ab.query.update\", {\n queryId: msg.queryId,\n data: msg.data,\n });\n } else {\n console.error(\n \"ABObjectQuery:: received io.socket msg before ABFactory is defined\"\n );\n console.error(\"TODO: move this to ABFactory!\");\n }\n });\n} else {\n console.error(\"TODO: install socket.io client for sails updates.\");\n}\n\n// io.socket.on(\"ab.query.delete\", function (msg) {\n// });\n\nmodule.exports = class ABObjectQuery extends ABObjectQueryCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n if (!ABFactory) {\n ABFactory = AB;\n }\n // listen\n this.AB.on(\"ab.query.update\", (data) => {\n if (this.id == data.queryId) this.fromValues(data.data);\n });\n\n // .fromValues() should already have been called in super()\n // so now add in our conditionScan()\n // NOTE: this can be folded into the Core once filterComplex\n // is fully implemented and not on Platform only.\n\n // now scan our conditions to make sure they are\n // 1) reference fields that exist in our Query\n // 2) completely filled out conditions.\n this.conditionScan(this.where);\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n ///\n /// Instance Methods\n ///\n\n /// ABApplication data methods\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABObjectQuery\n *\n * also remove it from our parent application\n *\n * @return {Promise}\n */\n // destroy() {\n // return super.destroy().then(() => {\n // console.error(\"Move .queryRemove() to Appbuilder Designer.\");\n // // return this.AB.queryRemove(this);\n // });\n // }\n\n /**\n * @method save()\n *\n * persist this instance of ABObjectQuery with it's parent ABApplication\n *\n * @return {Promise}\n *\t\t\t\t\t\t.resolve( {this} )\n */\n // async save() {\n // try {\n // await super.save();\n // return this;\n // } catch (err) {\n // this.AB.notify.developer(err, {\n // context: \"ABObjectQuery.save()\",\n // query: this.toObj(),\n // });\n // throw err;\n // }\n // }\n\n ///\n /// Fields\n ///\n\n /**\n * @method importFields\n * instantiate a set of fields from the given attributes.\n * Our attributes are a set of field URLs That should already be created in their respective\n * ABObjects.\n * @param {array} fieldSettings The different field urls for each field\n * { }\n * @param {bool} shouldAliasColumn\n * should we add the object alias to the columnNames?\n * this is primarily used on the web client\n */\n importFields(fieldSettings) {\n super.importFields(fieldSettings);\n\n this._fields.forEach((fieldEntry) => {\n // include object name {aliasName}.{columnName}\n // to use it in grid headers & hidden fields\n fieldEntry.field.columnName = `${fieldEntry.alias}.${fieldEntry.field.columnName}`;\n });\n }\n\n /**\n * @method columnResize()\n *\n * save the new width of a column\n *\n * @param {} id The instance of the field to save.\n * @param {int} newWidth the new width of the field\n * @param {int} oldWidth the old width of the field\n * @return {Promise}\n */\n columnResize(columnName, newWidth, oldWidth) {\n let field = this.fields((f) => f.columnName == columnName)[0];\n if (field) {\n field.settings.width = newWidth;\n\n return this.save();\n } else {\n return Promise.resolve();\n }\n }\n\n ///\n /// Working with Client Components:\n ///\n\n // return the column headers for this object\n // @param {bool} isObjectWorkspace return the settings saved for the object workspace\n columnHeaders(\n isObjectWorkspace,\n isEditable,\n summaryColumns,\n countColumns,\n hiddenFieldNames\n ) {\n var headers = super.columnHeaders(\n isObjectWorkspace,\n isEditable,\n summaryColumns,\n countColumns,\n hiddenFieldNames\n );\n\n headers.forEach((h) => {\n // pull object by alias\n let object = this.objectByAlias(h.alias);\n if (!object) return;\n\n let field = object.fieldByID(h.fieldID);\n if (!field) return;\n\n // NOTE: query v1\n let alias = \"\";\n if (Array.isArray(this.joins())) {\n alias = field.object.name;\n } else {\n alias = h.alias;\n }\n\n // include object name {aliasName}.{columnName}\n // to use it in grid headers & hidden fields\n h.id = `${alias}.${field.columnName}`;\n\n // label\n if (this.settings && this.settings.hidePrefix) {\n h.header = `${field.label || \"\"}`;\n } else {\n h.header = `${field.object.label || \"\"}.${field.label || \"\"}`;\n }\n\n // icon\n if (field.settings && field.settings.showIcon) {\n h.header = `${\n h.header\n }`;\n }\n\n // If this query supports grouping, then add folder icon to display in grid\n if (this.isGroup) {\n let originTemplate = h.template;\n\n h.template = (item, common) => {\n if (item[h.id])\n return (\n common.icon(item, common) +\n (originTemplate\n ? originTemplate(item, common, item[h.id])\n : item[h.id])\n );\n else return \"\";\n };\n }\n\n h.adjust = true;\n h.minWidth = 220;\n });\n\n return headers;\n }\n\n /**\n * @method conditionScan()\n * Scan the provided condition object and determine if there are any\n * configuration issues.\n * @param {obj} rule\n * the QueryBuilder rule that we are scanning.\n * @param {array} listWarnings\n * An array of warnings that we should add our notices to.\n */\n conditionScan(rule) {\n if (!rule) {\n return;\n }\n\n if (rule.glue) {\n (rule.rules || []).forEach((r) => {\n this.conditionScan(r);\n });\n return;\n }\n\n // 1) we need to have any key as one of our fields.\n let field = this.fieldByID(rule.key);\n if (!field && rule.key != \"this_object\") {\n this.warningsMessage(\n \"condition does not reference one of our fields\",\n {\n rule,\n }\n );\n }\n\n // 2) completely filled out conditions.\n if (!this._conditionCheck) {\n this._conditionCheck = this.AB.filterComplexNew(\n `${this.id}_conditionCheck`\n );\n // {FilterComplex} ._conditionCheck\n // has our .isConditionComplete() method.\n }\n if (!this._conditionCheck.isConditionComplete(rule)) {\n this.warningsMessage(\"incomplete condition definition\", {\n rule,\n });\n }\n }\n\n warningsEval() {\n super.warningsEval();\n\n this.conditionScan(this.where);\n\n /// include importFields() warnings:\n this.__missingObject.forEach((f) => {\n this.warningsMessage(\n `IMPORT FIELDS: could not resolve object[${\n f.objectID\n }] for fieldSetting ${JSON.stringify(f)}`,\n {\n fieldInfo: f,\n }\n );\n });\n\n this.__missingFields.forEach((f) => {\n this.warningsMessage(\n `IMPORT FIELDS: Object[${f.objID}] could not find field[${\n f.fieldID\n }] for fieldSetting ${JSON.stringify(f.fieldInfo)}`,\n {\n object: f.objID,\n fieldInfo: f.fieldInfo,\n }\n );\n });\n\n this.__cantFilter.forEach((f) => {\n this.warningsMessage(\n `Field[${f.field.id}] referenced in fieldSetting[${JSON.stringify(\n f.fieldInfo\n )}] did not pass .canFilterField`,\n {\n field: f.field.toObj(),\n fieldInfo: f.fieldInfo,\n }\n );\n });\n\n this.__duplicateFields.forEach((f) => {\n this.warningsMessage(\n `Field[${\n f.fieldInfo.fieldID\n }] referenced in fieldSetting[${JSON.stringify(\n f.fieldInfo\n )}] is a duplicate`,\n {\n fieldInfo: f.fieldInfo,\n }\n );\n });\n\n this.__linkProblems.forEach((f) => {\n this.warningsMessage(f.message, f.data);\n });\n }\n\n warningsMessage(msg, data = {}) {\n let message = `Query[${this.label}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n\n isUuid(text) {\n console.error(\n \"ABObject.isUuid(): is depreciated. directly reference AB.Rules.isUUID() instead.\"\n );\n return this.AB.isUUID(text);\n }\n};\n","const ABProcessCore = require(\"../core/ABProcessCore\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABProcess extends ABProcessCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n this._unknownShapes = [];\n // {array} [ BPMN:Shape, ... ]\n // Generic Shapes that are added to the Process are registered here.\n // We will list these as warnings to the ABDesigner.\n\n // listen\n this.AB.on(\"ab.abprocess.update\", (data) => {\n if (this.id == data.objectId) this.fromValues(data.data);\n });\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABObject\n *\n * also remove it from our parent application\n *\n * @return {Promise}\n */\n destroy() {\n // remove all my Elements\n var allElements = this.elements();\n var allDestroy = [];\n allElements.forEach((e) => {\n allDestroy.push(e.destroy());\n });\n\n return Promise.all(allDestroy).then(() => {\n // now remove myself\n return new Promise((resolve, reject) => {\n this.toDefinition()\n .destroy()\n .then(() => {\n // allow normal processing to contine now:\n resolve();\n })\n .then(() => {\n // in the background\n // remove this reference from ALL Applications that link\n // to me:\n console.error(\n \"TODO: ABProcess.destroy(): refactor to .emit('destroyed') and let containing Apps self remove.\"\n );\n var appsWithProcess = this.AB.applications().find((a) => {\n return a.hasProcess(this);\n });\n if (appsWithProcess.length > 0) {\n appsWithProcess.forEach((a) => {\n a.processRemove(this);\n });\n }\n })\n .catch((err) => {\n reject(err);\n });\n });\n });\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABObject with it's parent ABApplication\n *\n *\n * @return {Promise}\n *\t\t\t\t\t\t.resolve( {this} )\n */\n save(skipElements = false) {\n // if this is an update:\n // if (this.id) {\n // \treturn ABDefinition.update(this.id, this.toDefinition());\n // } else {\n\n // \treturn ABDefinition.create(this.toDefinition());\n // }\n\n // make sure all our tasks have save()ed.\n var allSaves = [];\n if (!skipElements) {\n var allTasks = this.elements();\n allTasks.forEach((t) => {\n allSaves.push(t.save());\n });\n }\n return Promise.all(allSaves).then(() => {\n // now we can save our Process definition\n return this.toDefinition()\n .save()\n .then((data) => {\n // if I didn't have an .id then this was a create()\n // and I need to update my data with the generated .id\n\n if (!this.id) {\n this.id = data.id;\n }\n\n // Also, our embedded elements now all have .ids\n // where they might not have before. So now\n // rebuild our this._elements hash with all id\n var _new = {};\n let _old = this._elements;\n Object.keys(this._elements).forEach((k) => {\n _new[this._elements[k].id] = this._elements[k];\n });\n this._elements = _new;\n\n // check to see if an update happened and then make\n // sure we have that saved.\n let needSave = false;\n Object.keys(_new).forEach((k) => {\n if (!_old[k]) {\n needSave = true;\n }\n });\n\n if (needSave) {\n return this.save(true);\n }\n });\n });\n }\n\n isValid() {\n var validator = this.AB.Validation.validator();\n\n // label/name must be unique:\n var isNameUnique =\n this.AB.processes((o) => {\n return o.name.toLowerCase() == this.name.toLowerCase();\n }).length == 0;\n if (!isNameUnique) {\n validator.addError(\n \"name\",\n L(`Process name must be unique (\"{0}\" already in use)`, [this.name])\n );\n }\n\n return validator;\n }\n\n /**\n * @method elementNewForModelDefinition()\n * create a new process element defined by the given BPMN:Element\n *\n * the BPMN:Element definition comes from the BPMN Modeler when a new\n * diagram element is created.\n *\n * @param {BPMN:Element} element\n * the BPMN modeler diagram element definition\n * @return {ABProcess[OBJ]}\n */\n elementNewForModelDefinition(element) {\n var task = this.AB.processElementNewForModelDefinition(element, this);\n if (task) {\n this.elementAdd(task);\n }\n return task;\n }\n\n /**\n * @method unknownShape()\n * store a reference to a BPMN Shape that is in our XML diagram,\n * but we don't have an element for.\n * @param {BPMN:Shape} shape\n */\n unknownShape(shape) {\n this.unknownShapeRemove(shape);\n this._unknownShapes.push(shape);\n }\n\n /**\n * @method unknownShapeRemove()\n * make sure we no longer track the provided BPMN Shape as an unknown shape.\n * @param {BPMN:Shape} shape\n */\n unknownShapeRemove(shape) {\n this._unknownShapes = this._unknownShapes.filter((s) => s.id != shape.id);\n }\n\n /**\n * @method warningsAll()\n * Return an array of mis configuration warnings for our object or any\n * of our sub elements.\n * @return {array} [ { message: \"warning message\", data:{} } ]\n */\n warningsAll() {\n // report both OUR warnings, and any warnings from any of our fields\n var allWarnings = [].concat(this._warnings);\n this.elements().forEach((e) => {\n e.warningsEval();\n allWarnings = allWarnings.concat(e.warnings());\n });\n\n if (this.elements().length == 0) {\n allWarnings.push({ message: \"No process Tasks defined.\", data: {} });\n }\n\n // perform a check of our xml document to see if we have any unknown\n // shapes\n if (!this._DOMParser) {\n if (window.DOMParser) {\n // Handy snippet from https://stackoverflow.com/questions/17604071/parse-xml-using-javascript\n this._DOMParser = function (xmlStr) {\n return new window.DOMParser().parseFromString(\n xmlStr,\n \"text/xml\"\n );\n };\n } else if (\n typeof window.ActiveXObject != \"undefined\" &&\n new window.ActiveXObject(\"Microsoft.XMLDOM\")\n ) {\n this._DOMParser = function (xmlStr) {\n var xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n xmlDoc.async = \"false\";\n xmlDoc.loadXML(xmlStr);\n return xmlDoc;\n };\n } else {\n throw new Error(\"No XML parser found\");\n }\n }\n\n // find any references to our generic shapes\n let xml = this._DOMParser(this.xmlDefinition);\n const genericShapes = [\n \"bpmn2:startEvent\",\n \"bpmn2:task\",\n \"bpmn2:endEvent\",\n ];\n genericShapes.forEach((s) => {\n let allElements = xml.getElementsByTagName(s);\n for (let x = 0; x < allElements.length; x++) {\n // if we don't know about this shape\n let ele = allElements[x];\n let myEle = this.elementForDiagramID(allElements[x].id);\n if (!myEle) {\n this.unknownShape(allElements[x]);\n }\n }\n });\n\n // if any unknown shapes have been reported:\n if (this._unknownShapes.length) {\n allWarnings.push({\n message: \"Generic Tasks still undefined.\",\n data: {},\n });\n }\n\n return allWarnings;\n }\n};\n","const ABStepCore = require(\"../core/ABStepCore\");\n\n// let L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABStep extends ABStepCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n // listen\n // this.AB.on(\"ab.abprocess.update\", (data) => {\n // if (this.id == data.objectId) this.fromValues(data.data);\n // });\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABObject\n *\n * also remove it from our parent application\n *\n * @return {Promise}\n */\n destroy() {\n // debugger;\n\n return new Promise((resolve, reject) => {\n this.toDefinition()\n .destroy()\n .then(() => {\n resolve();\n })\n .catch((err) => {\n reject(err);\n });\n });\n\n // remove all my Elements\n // var allElements = this.elements();\n // var allDestroy = [];\n // allElements.forEach((e) => {\n // allDestroy.push(e.destroy());\n // });\n\n // return Promise.all(allDestroy).then(() => {\n // // now remove myself\n // return new Promise((resolve, reject) => {\n // this.toDefinition()\n // .destroy()\n // .then(() => {\n // // allow normal processing to contine now:\n // resolve();\n // })\n // .then(() => {\n // // in the background\n // // remove this reference from ALL Applications that link\n // // to me:\n // console.error(\n // \"TODO: ABProcess.destroy(): refactor to .emit('destroyed') and let containing Apps self remove.\"\n // );\n // var appsWithProcess = this.AB.applications().find((a) => {\n // return a.hasProcess(this);\n // });\n // if (appsWithProcess.length > 0) {\n // appsWithProcess.forEach((a) => {\n // a.processRemove(this);\n // });\n // }\n // })\n // .catch((err) => {\n // reject(err);\n // });\n // });\n // });\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABObject with it's parent ABApplication\n *\n *\n * @return {Promise}\n * .resolve( {this} )\n */\n save() {\n // debugger;\n return this.toDefinition()\n .save()\n .then((data) => {\n // if I didn't have an .id then this was a create()\n // and I need to update my data with the generated .id\n\n if (!this.id) {\n this.id = data.id;\n }\n return this;\n });\n }\n\n isValid() {\n // debugger;\n return true;\n // var validator = this.AB.Validation.validator();\n\n // // label/name must be unique:\n // var isNameUnique =\n // this.AB.processes((o) => {\n // return o.name.toLowerCase() == this.name.toLowerCase();\n // }).length == 0;\n // if (!isNameUnique) {\n // validator.addError(\n // \"name\",\n // L(`Process name must be unique (\"{0}\" already in use)`, [this.name])\n // );\n // }\n\n // return validator;\n }\n\n /**\n * @method warningsAll()\n * Return an array of mis configuration warnings for our object or any\n * of our sub elements.\n * @return {array} [ { message: \"warning message\", data:{} } ]\n */\n warningsAll() {\n // debugger;\n // report both OUR warnings, and any warnings from any of our fields\n // var allWarnings = [].concat(this._warnings);\n // this.elements().forEach((e) => {\n // e.warningsEval();\n // allWarnings = allWarnings.concat(e.warnings());\n // });\n // if (this.elements().length == 0) {\n // allWarnings.push({ message: \"No process Tasks defined.\", data: {} });\n // }\n // // perform a check of our xml document to see if we have any unknown\n // // shapes\n // if (!this._DOMParser) {\n // if (window.DOMParser) {\n // // Handy snippet from https://stackoverflow.com/questions/17604071/parse-xml-using-javascript\n // this._DOMParser = function (xmlStr) {\n // return new window.DOMParser().parseFromString(\n // xmlStr,\n // \"text/xml\"\n // );\n // };\n // } else if (\n // typeof window.ActiveXObject != \"undefined\" &&\n // new window.ActiveXObject(\"Microsoft.XMLDOM\")\n // ) {\n // this._DOMParser = function (xmlStr) {\n // var xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n // xmlDoc.async = \"false\";\n // xmlDoc.loadXML(xmlStr);\n // return xmlDoc;\n // };\n // } else {\n // throw new Error(\"No XML parser found\");\n // }\n // }\n // // find any references to our generic shapes\n // let xml = this._DOMParser(this.xmlDefinition);\n // const genericShapes = [\n // \"bpmn2:startEvent\",\n // \"bpmn2:task\",\n // \"bpmn2:endEvent\",\n // ];\n // genericShapes.forEach((s) => {\n // let allElements = xml.getElementsByTagName(s);\n // for (let x = 0; x < allElements.length; x++) {\n // // if we don't know about this shape\n // let ele = allElements[x];\n // let myEle = this.elementForDiagramID(allElements[x].id);\n // if (!myEle) {\n // this.unknownShape(allElements[x]);\n // }\n // }\n // });\n // // if any unknown shapes have been reported:\n // if (this._unknownShapes.length) {\n // allWarnings.push({\n // message: \"Generic Tasks still undefined.\",\n // data: {},\n // });\n // }\n //\n // return allWarnings;\n }\n};\n","const ABViewManagerCore = require(\"../core/ABViewManagerCore\");\n\nmodule.exports = class ABViewManager extends ABViewManagerCore {};\n","const ABViewManagerMobileCore = require(\"../core/ABViewManagerMobileCore\");\n\nmodule.exports = class ABViewManagerMobile extends ABViewManagerMobileCore {};\n","var L = null;\n// multilingual Label fn()\n\nmodule.exports = class CSVImporter {\n constructor(Label) {\n // {ABMultilingual.label()} function.\n //\n if (!L) {\n L = Label;\n\n // if this was a v1: App param:\n if (Label.Label) {\n L = Label.Label;\n }\n }\n }\n\n /**\n * @method getSeparateItems()\n * Return the options of how the CSV values are separated.\n * @return {array} [ {id, value} ... ]\n */\n getSeparateItems() {\n return [\n { id: \",\", value: L(\"Comma (,)\") },\n { id: \"\\t\", value: L(\"Tab (      )\") },\n { id: \";\", value: L(\"Semicolon (;)\") },\n { id: \"s\", value: L(\"Space ( )\") },\n ];\n }\n\n /**\n * @method validateFile\n * Validate file extension\n * @param {*} fileInfo\n * https://docs.webix.com/api__ui.uploader_onbeforefileadd_event.html\n * @return {boolean}\n */\n validateFile(fileInfo) {\n if (!fileInfo || !fileInfo.file || !fileInfo.file.type) return false;\n\n // validate file type\n let extensionType = fileInfo.file.type.toLowerCase();\n if (\n extensionType == \"text/csv\" ||\n extensionType == \"application/vnd.ms-excel\"\n ) {\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @method getDataRows\n * Pull data rows from the CSV file\n *\n * @param {Object} fileInfo - https://docs.webix.com/api__ui.uploader_onbeforefileadd_event.html\n * @param {string} separatedBy\n *\n * @return {Promise} -[\n * \t\t\t\t\t\t[\"Value 1.1\", \"Value 1.2\", \"Value 1.3\"],\n * \t\t\t\t\t\t[\"Value 2.1\", \"Value 2.2\", \"Value 2.3\"],\n * \t\t\t\t\t]\n */\n getDataRows(fileInfo, separatedBy) {\n if (!this.validateFile(fileInfo)) return Promise.reject();\n\n return new Promise((resolve, reject) => {\n // read CSV file\n let reader = new window.FileReader();\n reader.onload = (e) => {\n let result = [];\n\n // split lines\n let dataRows = reader.result\n .split(/\\r\\n|\\n|\\r/) // CRLF = \\r\\n; LF = \\n; CR = \\r;\n .filter((row) => row && row.length > 0);\n\n // split columns\n (dataRows || []).forEach((row) => {\n let dataCols = [];\n if (separatedBy == \",\") {\n // NOTE: if the file contains ,, .match() can not reconize this empty string\n row = row.replace(/,,/g, \", ,\");\n\n // https://stackoverflow.com/questions/11456850/split-a-string-by-commas-but-ignore-commas-within-double-quotes-using-javascript#answer-11457952\n dataCols = row.match(/(\".*?\"|[^\",]+)(?=\\s*,|\\s*$)/g);\n } else {\n dataCols = row.split(separatedBy);\n }\n\n result.push(dataCols.map((dCol) => this.reformat(dCol)));\n });\n\n resolve(result);\n };\n reader.readAsText(fileInfo.file);\n });\n }\n\n /**\n * @method getGuessDataType\n * return our best guess of what type of data for the requested column.\n * @param {array} dataRows\n * The data we are evaluating:\n * [\n * [\"Value 1.1\", \"Value 1.2\", \"Value 1.3\"],\n * [\"Value 2.1\", \"Value 2.2\", \"Value 2.3\"],\n * \t\t ]\n * @param colIndex {Number}\n * @return {string}\n */\n getGuessDataType(dataRows, colIndex) {\n var data,\n // {various} the data pulled from the requested row/column\n repeatNum = 10;\n // {integer} how many rows do we want to scan trying to find a value\n\n // Loop to find a value\n for (var i = 1; i <= repeatNum; i++) {\n var line = dataRows[i];\n if (!line) break;\n\n data = line[colIndex];\n\n if (data != null && data.length > 0) break;\n }\n\n if (data == null || data == \"\") {\n return \"string\";\n } else if (\n data == 0 ||\n data == 1 ||\n data == true ||\n data == false ||\n data == \"checked\" ||\n data == \"unchecked\"\n ) {\n return \"boolean\";\n } else if (!isNaN(data)) {\n return \"number\";\n } else if (Date.parse(data)) {\n return \"date\";\n } else {\n // determine which type of string this might be:\n if (data.length > 100) return \"LongText\";\n else return \"string\";\n }\n }\n\n /**\n * @method reformat\n * @param {string} str\n */\n reformat(str) {\n if (!str) return \"\";\n\n return str.trim().replace(/\"/g, \"\").replace(/'/g, \"\");\n }\n};\n","const FilterComplexCore = require(\"../core/FilterComplexCore\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\n/**\n * @function _toInternal()\n * translate our external QB conditions into our internal format that\n * makes the cond.rule unique by adding the field.id to the rule.\n * @param {obj} cond - {\n * rules: [\n * {\n * alias: string || undefined,\n * key: uuid,\n * rule: string,\n * value: object,\n * }\n * ]\n * }\n * the QB condition format we use exernally in our AB system.\n */\nfunction _toInternal(cond, fields = []) {\n if (!cond) return;\n if (cond.key) {\n // Convert to format\n // {\n // glue: \"and\",\n // rules: [\n // {\n // field: \"test_col\",\n // condition: { type: \"greater\", filter: 100 },\n // },\n // ],\n // }\n const field = fields.filter((f) => f.id == cond.key)[0];\n cond.field = field?.id;\n\n cond.condition = {\n type: cond.rule,\n filter: cond.value,\n };\n\n if (Array.isArray(cond.value)) cond.includes = cond.value;\n if (\n cond.rule === \"in_query_field\" ||\n cond.rule === \"not_in_query_field\"\n ) {\n cond.includes = cond.value.split(\":\");\n }\n\n // else cond.includes = cond.value?.split?.(/,|:/) ?? [];\n\n // if (field?.key == \"date\" || field?.key == \"datetime\") {\n // cond.condition.filter = cond.condition.filter\n // ? AB.rules.toDate(cond.condition.filter)\n // : null;\n //\n // cond.includes = cond.includes.map((v) => AB.rules.toDate(v));\n // }\n\n delete cond.key;\n delete cond.rule;\n delete cond.value;\n }\n\n if (cond.rules && cond.rules.length) {\n (cond.rules ?? []).forEach((r) => {\n _toInternal(r, fields);\n });\n }\n}\n\n/**\n * @function _toExternal()\n * translate our internal QB conditions into our external format that\n * where the cond.rule no longer has the field.id.\n * @param {obj} cond - {\n * glue: \"and\",\n * rules: [\n * {\n * field: \"test_col\",\n * condition: { type: \"greater\", filter: 100 },\n * },\n * ],\n * }\n * the QB condition format we use internally\n */\nfunction _toExternal(cond, fields = []) {\n if (!cond) return;\n if (cond.field) {\n let field = fields.filter((f) => f.id == cond.field)[0];\n // cond.alias = alias || undefined;\n cond.key = field?.id ?? cond.field;\n cond.condition = cond.condition ?? {};\n cond.rule = cond.condition.type;\n\n let values =\n cond.includes?.map((v) => (v instanceof Date ? v.toISOString() : v)) ??\n [];\n\n // Convert multi-values to a string\n if (cond.condition.filter) {\n if (cond.condition.filter instanceof Date) {\n if (values.indexOf(cond.condition.filter.toISOString()) < 0) {\n values.push(cond.condition.filter);\n }\n } else if (values.indexOf(cond.condition.filter) < 0)\n values.push(cond.condition.filter);\n }\n\n if (cond.rule === \"is_current_date\") {\n cond.value = AB.rules.getUTCDayTimeRange();\n } else if (\n cond.rule === \"in_query_field\" ||\n cond.rule === \"not_in_query_field\"\n ) {\n cond.value =\n cond.includes?.length == 2 ? cond.includes.join(\":\") : null;\n } else {\n cond.value = values\n .map((v) => {\n // Convert date format\n if (\n field &&\n (field.key === \"date\" || field.key === \"datetime\") &&\n cond.rule != \"last_days\"\n ) {\n return field.exportValue(new Date(v));\n }\n return v;\n })\n .join(\",\");\n }\n\n delete cond.field;\n delete cond.type;\n delete cond.includes;\n delete cond.condition;\n }\n\n if (cond.rules && cond.rules.length) {\n (cond.rules ?? []).forEach((r) => {\n _toExternal(r, fields);\n });\n }\n}\n\nfunction _uiQueryOptionId(fieldId) {\n return `byQueryField-query-option-${fieldId}`;\n}\n\nfunction _uiFieldOptionId(fieldId) {\n return `byQueryField-field-option-${fieldId}`;\n}\n\nmodule.exports = class FilterComplex extends FilterComplexCore {\n constructor(idBase, AB, options = {}) {\n idBase = idBase ?? \"ab_filterComplex\";\n\n super(idBase, AB);\n\n this._options = options ?? {};\n\n this._initComplete = false;\n // {bool}\n // trying to prevent multiple .init() from being called due to\n // various ways of initializing the component.\n\n this.observing = false;\n // {bool}\n // try to prevent multiple observers generating >1 \"changed\"\n // event.\n\n let labels = (this.labels = {\n common: (AB._App ?? {}).labels,\n component: {\n and: L(\"And\"),\n or: L(\"Or\"),\n\n thisObject: L(\"This Object\"),\n inQuery: L(\"In Query\"),\n notInQuery: L(\"Not In Query\"),\n inQueryField: L(\"By Query Field\"),\n notInQueryField: L(\"Not By Query Field\"),\n\n inQueryFieldQueryPlaceholder: L(\"Choose a Query\"),\n inQueryFieldFieldPlaceholder: L(\"Choose a Field\"),\n\n sameAsUser: L(\"Same As User\"),\n notSameAsUser: L(\"Not Same As User\"),\n\n sameAsField: L(\"Same As Field\"),\n notSameAsField: L(\"Not Field\"),\n\n inDataCollection: L(\"In Data Collection\"),\n notInDataCollection: L(\"Not In Data Collection\"),\n\n containsCondition: L(\"contains\"),\n notContainsCondition: L(\"doesn't contain\"),\n isCondition: L(\"is\"),\n isNotCondition: L(\"is not\"),\n isEmpty: L(\"is empty\"),\n isNotEmpty: L(\"is not empty\"),\n isCurrentDateCondition: L(\"is current date\"),\n beforeCondition: L(\"is before\"),\n afterCondition: L(\"is after\"),\n onOrBeforeCondition: L(\"is on or before\"),\n onOrAfterCondition: L(\"is on or after\"),\n beforeCurrentCondition: L(\"is before current date\"),\n afterCurrentCondition: L(\"is after current date\"),\n onOrBeforeCurrentCondition: L(\"is on or before current date\"),\n onOrAfterCurrentCondition: L(\"is on or after current date\"),\n onLastDaysCondition: L(\"last ... days\"),\n onNextDaysCondition: L(\"next ... days\"),\n\n equalCondition: L(\":\"),\n notEqualCondition: L(\"≠\"),\n lessThanCondition: L(\"<\"),\n moreThanCondition: L(\">\"),\n lessThanOrEqualCondition: L(\"≤\"),\n moreThanOrEqualCondition: L(\"≥\"),\n\n equalListCondition: L(\"equals\"),\n notEqualListCondition: L(\"does not equal\"),\n\n checkedCondition: L(\"is checked\"),\n notCheckedCondition: L(\"is unchecked\"),\n\n isCurrentUserCondition: L(\"is current user\"),\n isNotCurrentUserCondition: L(\"is not current user\"),\n containsCurrentUserCondition: L(\"contains current user\"),\n notContainsCurrentUserCondition: L(\"does not contain current user\"),\n\n isCurrentUserEmailCondition: L(\"is current user's email\"),\n isNotCurrentUserEmailCondition: L(\"is not current user's email\"),\n\n contextDefaultOption: L(\"choose option\"),\n equalsProcessValue: L(\"equals process value\"),\n notEqualsProcessValueCondition: L(\"not equals process value\"),\n inProcessValueCondition: L(\"in process value\"),\n notInProcessValueCondition: L(\"not in process value\"),\n },\n });\n\n // internal list of Webix IDs to reference our UI components.\n let ids = (this.ids = {\n popup: this.unique(`${idBase}_popup`),\n querybuilder: this.unique(`${idBase}_querybuilder`),\n save: this.unique(`${idBase}_save`),\n });\n\n // Set current username\n this.Account.username = this.AB.Account.username();\n\n this._settings.recordRuleFieldOptions = [];\n\n // webix UI definition:\n this.ui = {\n rows: [\n {\n view: \"layout\",\n type: \"clean\",\n borderless: this._options.borderless ?? true,\n rows: [\n {\n id: ids.querybuilder,\n view: \"query\",\n data: () => [],\n // data: async (field) => await this.pullOptions(field),\n fields: [],\n disabled: true,\n height: this._options.height,\n },\n ],\n },\n {\n id: ids.save,\n view: \"button\",\n css: \"webix_primary\",\n value: L(\"Save\"),\n hidden: this._options.isSaveHidden ?? false,\n click: () => {\n if (this.myPopup) this.myPopup.hide();\n this.emit(\"save\", this.getValue());\n },\n },\n ],\n };\n }\n\n // setting up UI\n init(options) {\n if (this._initComplete) return;\n\n super.init(options);\n\n const el = $$(this.ids.querybuilder);\n\n if (el) {\n if (!this.observing) {\n this.__blockOnChange = true;\n el.getState().$observe(\"value\", (v) => {\n if (this.__blockOnChange) return false;\n\n this.emit(\"changed\", this.getValue());\n });\n this.__blockOnChange = false;\n\n // HACK!! The process of setting the $observe() is actually\n // calling the cb() when set. This is clearing our .condition\n // if we call init() after we have setValues(). which can happen\n // when using the popUp() method.\n let _cond = this.condition;\n this.condition = _cond;\n this.observing = true;\n }\n this._initComplete = true;\n }\n }\n\n /**\n * @method isValid\n * validate the row data is valid filter condition\n *\n * @param rowData {Object} - data row\n * @param condition {Object} - [Optional] {\n * glue: \"and\" | \"or\",\n * rules: []\n * }\n */\n isValid(rowData, condition = this.condition) {\n let helper = () => true;\n\n let $query = $$(this.ids.querybuilder);\n if ($query) {\n helper = $query.getFilterFunction();\n return helper(rowData);\n } else {\n return super.isValid(rowData, condition);\n }\n }\n\n /**\n * @method isConditionComplete()\n * Check a given condition entry and indicate if it is fully\n * filled out.\n * @param {obj} cond\n * The Condition object we are checking. If a Macro\n * condition if provided: { glue:\"and\", rules:[] } then\n * this method will return True/False if All rules are\n * complete.\n * If an individual rule is provided, then it evaluates\n * the completness of that rule. { key, rule, value }\n * @return {bool}\n */\n isConditionComplete(cond) {\n if (!cond) return false;\n\n let isComplete = true;\n // start optimistically.\n\n if (cond?.glue) {\n (cond.rules ?? []).forEach((r) => {\n isComplete = isComplete && this.isConditionComplete(r);\n });\n } else {\n // every condition needs a .key & .rule\n if (!cond.key || cond.key == \"\") {\n isComplete = false;\n }\n\n if (!cond.rule || cond.rule == \"\") {\n isComplete = false;\n }\n\n if (isComplete) {\n switch (cond.rule) {\n case \"is_current_user\":\n case \"is_not_current_user\":\n case \"contain_current_user\":\n case \"not_contain_current_user\":\n case \"is_current_email\":\n case \"is_not_current_email\":\n case \"same_as_user\":\n case \"not_same_as_user\":\n case \"less_current\":\n case \"greater_current\":\n case \"less_or_equal_current\":\n case \"greater_or_equal_current\":\n case \"is_empty\":\n case \"is_not_empty\":\n case \"checked\":\n case \"unchecked\":\n case \"is_current_date\":\n // There are only a few rules that don't need a\n // value\n break;\n\n case \"in_data_collection\":\n case \"not_in_data_collection\":\n // a value needs to exist\n if (!cond.value || cond.value == \"\") {\n isComplete = false;\n }\n // and it needs to reference a valid DC\n if (isComplete) {\n let dc = this.AB.datacollectionByID(cond.value);\n if (!dc) {\n isComplete = false;\n }\n }\n break;\n\n case \"in_query\":\n case \"not_in_query\":\n // a value needs to exist\n if (!cond.value || cond.value == \"\") {\n isComplete = false;\n }\n // and it needs to reference a valid query\n if (isComplete) {\n let query = this.AB.queryByID(cond.value);\n if (!query) {\n isComplete = false;\n }\n }\n break;\n\n case \"in_query_field\":\n case \"not_in_query_field\":\n // a value needs to exist\n if (!cond.value || cond.value == \"\") {\n isComplete = false;\n }\n // and it needs to reference a valid query\n if (isComplete) {\n let queryId = cond.value.split(\":\")[0],\n fieldId = cond.value.split(\":\")[1];\n let query = this.AB.queryByID(queryId);\n if (!query) {\n isComplete = false;\n } else {\n // and a valid field\n let field = query.fieldByID(fieldId);\n if (!field) {\n isComplete = false;\n }\n }\n }\n break;\n\n default:\n // The rest do need a .value\n if (!cond.value || cond.value == \"\") {\n isComplete = false;\n }\n break;\n }\n }\n }\n\n return isComplete;\n }\n\n setValue(settings) {\n super.setValue(settings);\n this.condition = settings;\n\n const el = $$(this.ids.querybuilder);\n if (el) {\n if (!settings) {\n // Clear settings value of webix.query\n el.define(\"value\", {\n glue: \"and\",\n rules: [],\n });\n return;\n }\n\n let qbSettings = this.AB.cloneDeep(settings);\n\n // Settings should match a condition built upon our QB format:\n // {\n // glue:\"and\",\n // rules:[\n // {\n // key:\"uuid\",\n // rule:\"\",\n // value:\"\"\n // }\n // ]\n // }\n // externally our key should be the field.id and the rules should be\n // the \"contains\", \"not_contains\", \"equal\" ... keywords.\n // However, internally, we convert these rules into .ids that are\n // unique for each field (see uiInit()). So when we bring in settings\n // we need to translate them into our internal format:\n\n _toInternal(qbSettings, this._Fields);\n\n this.__blockOnChange = true;\n el.define(\"value\", qbSettings);\n this.__blockOnChange = false;\n }\n }\n\n getValue() {\n if ($$(this.ids.querybuilder)) {\n let settings = this.AB.cloneDeep(\n $$(this.ids.querybuilder).getState().value ?? {}\n );\n\n // what we pull out of the QB will have .rules in our internal format:\n // {field.id}_{rule} (see uiInit() )\n // But we need to store them in our generic QB format for use outside\n // our FilterComplex widget.\n _toExternal(settings, this._Fields);\n this.condition = settings;\n }\n\n return super.getValue();\n }\n\n fieldsLoad(fields = [], object = null) {\n super.fieldsLoad(fields, object);\n // Format date types\n fields.forEach((f) => {\n if (f.type === \"date\")\n f.format = (v) => this.AB.Webix.il8n.dateFormatStr(v);\n });\n this.uiInit();\n }\n\n toShortHand() {\n return \"Add Filters\";\n }\n\n uiInit() {\n this.uiQueryCustomValue();\n\n let el = $$(this.ids.querybuilder);\n if (el) {\n // Clear fields\n while (el.config.fields.length > 0) {\n el.config.fields.pop();\n }\n // Set fields\n (this.fieldsToQB() ?? []).forEach((f) => {\n el.config.fields.push(f);\n });\n if (el.config.fields.length) {\n el.enable();\n } else {\n this.setValue(\"\");\n el.disable();\n }\n }\n }\n\n // HACK: have to overwrite Webix Query's function to support our custom input requirement.\n // HooWoo\n uiQueryCustomValue() {\n const $el = $$(this.ids.querybuilder);\n if (!$el) return;\n\n const _this = this;\n const $filterView = $el.$app.require(\"jet-views\", \"filter\");\n\n if (!this._fnBaseGetValue)\n this._fnBaseGetValue = $filterView.prototype.GetValue;\n $filterView.prototype.GetValue = function () {\n const rule = _this._fnBaseGetValue.call(this);\n if (!rule) {\n // Not sure if its a problem, so report in case it is.\n _this.AB.notify.developer(new Error(\"No rule found\"), {\n context: \"No rule from $filterView.GetValue()\",\n });\n return;\n }\n\n if (\n rule.condition.type == \"in_query_field\" ||\n rule.condition.type == \"not_in_query_field\"\n ) {\n const queryOptId = _uiQueryOptionId(rule.field);\n const fieldOptId = _uiFieldOptionId(rule.field);\n const selectedQueryId = $$(queryOptId)?.getValue();\n const selectedFieldId = $$(fieldOptId)?.getValue();\n\n if (selectedQueryId && selectedFieldId) {\n rule.includes = [selectedQueryId, selectedFieldId];\n }\n }\n\n return rule;\n };\n\n // window.query.views.filter.prototype.CreateFilter = (\n $filterView.prototype.CreateFilter = async function (\n fieldId,\n type,\n format,\n conditions,\n place\n ) {\n let inputs = _this.uiValue(fieldId);\n\n let ui = {\n id: place.config.id,\n view: \"filter\",\n localId: \"filter\",\n conditions: conditions,\n field: fieldId,\n mode: type,\n template: function (o) {\n let str = o[fieldId];\n let parser =\n format ?? (type == \"date\" ? webix.i18n.dateFormatStr : null);\n if (parser) str = parser(str);\n return str;\n },\n inputs: inputs,\n margin: 6,\n };\n\n let filter = webix.ui(ui, place);\n\n // NOTE: Need this to have filter.config.value?.includes value\n // let data = [];\n if ($el) {\n await $el.$app.getService(\"backend\").data(fieldId);\n // data = await $query.getService(\"backend\").data(fieldId);\n }\n // filter.parse(data);\n\n // Populate options of \"in_query_field\" and \"not_in_query_field\"\n if (\n conditions.filter(\n (cond) =>\n cond.id == \"in_query_field\" || cond.id == \"not_in_query_field\"\n ).length &&\n filter.config.value?.includes?.length == 2\n ) {\n // inputs = _this.uiValue(fieldId, filter.config.value.includes);\n // filter.define(\"inputs\", inputs);\n const queryOptId = _uiQueryOptionId(fieldId);\n const fieldOptId = _uiFieldOptionId(fieldId);\n const $queryOpt = $$(queryOptId);\n const $fieldOpt = $$(fieldOptId);\n const vals = filter.config.value?.includes ?? [];\n if (vals?.length > 1 && $queryOpt && $fieldOpt) {\n $queryOpt.setValue(vals[0]);\n $fieldOpt.setValue(vals[1]);\n $queryOpt.refresh();\n $fieldOpt.refresh();\n }\n }\n\n return filter;\n };\n }\n\n uiValue(fieldColumnName, defaultValue = null) {\n let result;\n\n // Special case: this_object\n if (fieldColumnName == \"this_object\") {\n return []\n .concat(this.uiQueryValue(\"this_object\"))\n .concat(this.uiDataCollectionValue(\"this_object\"))\n .concat(this.uiCustomValue(\"this_object\"))\n .concat(this.uiContextValue(\"this_object\", \"uuid\"));\n }\n\n let field = (this._Fields ?? []).filter(\n (f) => f.id == fieldColumnName\n )[0];\n\n switch (field?.key) {\n case \"boolean\":\n result = this.uiNoneValue(field);\n break;\n case \"connectObject\":\n result = []\n .concat(this.uiQueryValue(field))\n .concat(this.uiUserValue(field))\n .concat(this.uiDataCollectionValue(field))\n .concat(this.uiContextValue(field))\n .concat(this.uiNoneValue());\n break;\n case \"date\":\n case \"datetime\":\n result = [\"datepicker\", \"daterangepicker\"]\n .concat(this.uiNoneValue())\n .concat(this.uiContextValue(field));\n break;\n case \"list\":\n result = this.uiListValue(field);\n break;\n case \"user\":\n result = []\n .concat(this.uiNoneValue())\n .concat(this.uiUserValue(field));\n break;\n // case \"number\":\n // result = [\"text\"];\n // break;\n case \"string\":\n case \"LongText\":\n case \"email\":\n result = this.uiNoneValue();\n break;\n }\n\n // Add filter options to Custom index\n const LinkType = `${field?.settings?.linkType}:${field?.settings?.linkViaType}`;\n if (\n // 1:M\n LinkType == \"one:many\" ||\n // 1:1 isSource = true\n (LinkType == \"one:one\" && field?.settings?.isSource)\n ) {\n result = result ?? [];\n\n if (field?.settings?.isCustomFK)\n result = result.concat(this.uiTextValue(field));\n\n result = result.concat(this.uiQueryFieldValue(field, defaultValue));\n } else if (field?.key != \"connectObject\") {\n result = (result ?? [])\n .concat(this.uiTextValue(field))\n .concat(this.uiQueryFieldValue(field, defaultValue))\n .concat(this.uiContextValue(field));\n }\n // Special case: from Process builder\n // .processFieldsLoad()\n else if (fieldColumnName.indexOf(\"uuid\") > -1) {\n result = this.uiContextValue(null, fieldColumnName);\n }\n\n if (this._settings.isRecordRule) {\n result = (result ?? []).concat(this.uiRecordRuleValue(field));\n }\n\n result = (result ?? []).concat(this.uiCustomValue(field));\n\n return result;\n }\n\n uiNoneValue() {\n return [\n {\n batch: \"none\",\n borderless: true,\n view: \"template\",\n template: \"\",\n },\n ];\n }\n\n uiBooleanValue(field) {\n return [\n {\n batch: \"boolean\",\n view: \"checkbox\",\n },\n ];\n }\n\n uiTextValue(field) {\n return [\n {\n batch: \"text\",\n view: \"text\",\n on: {\n onAfterRender: function () {\n // HACK: focus on webix.text and webix.textarea\n // Why!! If the parent layout has zIndex lower than 101,\n // then is not able to focus to webix.text and webix.textarea\n let $layout =\n this.queryView(function (a) {\n return !a.getParentView();\n }, \"parent\") ?? this;\n $layout.$view.style.zIndex = 202;\n },\n },\n },\n ];\n }\n\n uiQueryValue(field) {\n let options = [];\n\n let isQueryField =\n this._QueryFields?.filter((f) => f.id == field.id).length > 0;\n\n // populate the list of Queries for this_object:\n if (field == \"this_object\" && this._Object) {\n options = this.queries((q) => q.canFilterObject(this._Object));\n }\n // populate the list of Queries for a query field\n else if (isQueryField) {\n options = this.queries(\n (q) =>\n (this._Object ? this._Object.id : \"\") != q.id && // Prevent filter looping\n q.canFilterObject(field.datasourceLink)\n );\n }\n\n options?.forEach((q) => {\n options.push({\n id: q.id,\n value: q.label,\n });\n });\n\n return [\n {\n batch: \"query\",\n view: \"combo\",\n options: options ?? [],\n },\n ];\n }\n\n uiListValue(field) {\n return [\n {\n batch: \"list\",\n view: \"combo\",\n options: field?.settings?.options?.map(function (x) {\n return {\n id: x.id,\n value: x.text,\n };\n }),\n },\n ];\n }\n\n uiUserValue(field) {\n return [\n {\n batch: \"user\",\n view: \"combo\",\n options: this.AB.Account.userList().map((u) => {\n return {\n id: u.username,\n value: u.username,\n };\n }),\n },\n ];\n }\n\n uiDataCollectionValue(field) {\n let linkObjectId;\n if (field == \"this_object\" && this._Object) {\n linkObjectId = this._Object.id;\n } else {\n linkObjectId = field?.settings?.linkObject;\n }\n\n return [\n {\n batch: \"datacollection\",\n view: \"combo\",\n options: linkObjectId\n ? this.AB.datacollections(\n (dc) => dc?.datasource?.id == linkObjectId\n ).map((dc) => {\n return {\n id: dc.id,\n value: dc.label,\n };\n })\n : [],\n },\n ];\n }\n\n uiQueryFieldValue(field, defaultValue) {\n // ABQuery Options\n const qOpts = this.queries(\n (q) => this._Object == null || q.id != this._Object.id\n ).map((q) => {\n return {\n id: q.id,\n value: q.label,\n };\n });\n\n const pullFieldOption = (queryId) => {\n const options = [];\n\n // Get fields of the query\n const Query = this.AB.queryByID(queryId);\n if (Query) {\n Query.fields((f) => !f.isConnection).forEach((q) => {\n options.push({\n id: q.id,\n value: `${q.object.label}.${q.label}`,\n });\n });\n }\n\n return options;\n };\n\n const refreshFieldOption = ($queryOpt, queryId) => {\n const options = pullFieldOption(queryId);\n\n // Update UI\n if ($queryOpt) {\n const $queryContainer = $queryOpt.getParentView();\n const $fieldOption = $queryContainer.getChildViews()[1];\n $fieldOption?.define(\"options\", options);\n $fieldOption?.refresh();\n }\n };\n\n let queryId;\n let fieldId;\n let fieldOptions = [];\n if (defaultValue?.length == 2) {\n queryId = defaultValue[0];\n fieldId = defaultValue[1];\n\n fieldOptions = pullFieldOption(queryId);\n }\n\n return [\n {\n batch: \"queryField\",\n view: \"form\",\n borderless: true,\n padding: 0,\n elements: [\n {\n id: _uiQueryOptionId(field?.id),\n name: \"query\",\n view: \"combo\",\n placeholder:\n this.labels.component.inQueryFieldQueryPlaceholder,\n options: qOpts,\n value: queryId,\n on: {\n onChange: function (qVal) {\n refreshFieldOption(this, qVal);\n },\n },\n },\n {\n id: _uiFieldOptionId(field?.id),\n name: \"field\",\n view: \"combo\",\n placeholder: L(\"Choose a Field\"),\n options: fieldOptions,\n value: fieldId,\n },\n ],\n },\n ];\n }\n\n uiRecordRuleValue(field) {\n return [\n {\n batch: \"recordRule\",\n view: \"select\",\n options: this._settings.recordRuleFieldOptions ?? [],\n },\n ];\n }\n\n uiContextValue(field, processFieldKey = null) {\n const processFields = (this._ProcessFields ?? [])\n .filter((pField) => {\n if (!pField) return false;\n\n let result = false;\n switch (field) {\n case \"this_object\":\n result =\n this._Object.id === pField.object?.id && !pField.field;\n\n break;\n\n default:\n switch (field.key) {\n case \"boolean\":\n result = [\"boolean\"].includes(pField.field?.key);\n\n break;\n\n case \"connectObject\":\n result =\n field.settings.linkObject ===\n (pField.field?.object.id ?? pField.object.id);\n\n if (!field.settings.isCustomFK) {\n result = result && !pField.field;\n\n break;\n }\n\n result =\n result &&\n (field.settings.indexField ||\n field.settings.indexField2) === pField.field?.id;\n\n break;\n\n case \"date\":\n case \"datetime\":\n result = [\"date\", \"datetime\"].includes(\n pField.field?.key\n );\n\n break;\n\n case \"calculate\":\n case \"formula\":\n case \"number\":\n result = [\"calculate\", \"formula\", \"number\"].includes(\n pField.field?.key\n );\n\n break;\n\n case \"string\":\n case \"LongText\":\n case \"email\":\n case \"AutoIndex\":\n case \"list\":\n result = [\n \"string\",\n \"LongText\",\n \"email\",\n \"AutoIndex\",\n \"list\",\n ].includes(pField.field?.key);\n\n break;\n\n case \"user\":\n result = [\"user\"].includes(pField.field?.key);\n\n break;\n\n default:\n if (pField.key) {\n // uuid\n const processFieldId = pField.key.split(\".\").pop();\n\n result =\n processFieldId === field.id ||\n processFieldId === field.key ||\n processFieldId === processFieldKey ||\n pField.key === processFieldKey;\n }\n\n break;\n }\n\n break;\n }\n\n return result;\n })\n .map((e) => {\n return {\n id: e.key,\n value: L(\"context({0})\", [e.label]),\n };\n });\n\n if (!processFields) return [];\n\n return [\n {\n batch: \"context\",\n view: \"select\",\n options: [\n {\n id: \"empty\",\n value: this.labels.component.contextDefaultOption,\n },\n ...processFields,\n ],\n },\n ];\n }\n\n uiCustomValue(field) {\n if (!field) return [];\n\n const customOptions = this._customOptions ?? {};\n const options = customOptions[field.id ?? field] ?? {};\n return options.values ?? [];\n }\n\n popUp(...options) {\n const condition = Object.assign({}, this.condition);\n\n if (!this.myPopup) {\n let ui = {\n id: this.ids.popup,\n view: \"popup\",\n height: 400,\n width: 800,\n body: this.ui,\n };\n\n if (!$$(this.ids.popup)) {\n this.myPopup = webix.ui(ui);\n this.init(this._settings);\n if (this._Fields) {\n this.fieldsLoad(this._Fields, this._Object);\n }\n\n // NOTE: do this, before the .setValue() operation, as we need to have\n // our fields and filters defined BEFORE a setValue() is performed.\n // this.uiInit();\n\n if (condition) {\n this.setValue(condition);\n }\n\n this.myPopup.show(...options);\n } else {\n $$(this.ids.popup).show(...options);\n }\n } else {\n this.myPopup.show(...options);\n }\n }\n\n /**\n * @method addCustomOption\n *\n * @param {string|uuid} fieldId\n * @param {Object} options - {\n * conditions: [],\n * values: []\n * }\n */\n addCustomOption(fieldId, options = {}) {\n this._customOptions = this._customOptions ?? {};\n this._customOptions[fieldId] = options;\n }\n};\n","const RowFilterCore = require(\"../core/RowFilterCore\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class RowFilter extends RowFilterCore {\n constructor(App, idBase, AB) {\n super(App, idBase, AB);\n\n console.error(\"TODO: Switch RowFilter => FilterComplex\");\n\n // internal list of Webix IDs to reference our UI components.\n let ids = (this.ids = {\n component: this.unique(`${idBase}_rowFilter`),\n filterForm: this.unique(`${idBase}_rowFilter_form`),\n addNewFilter: this.unique(`${idBase}_rowFilter_addNewFilter`),\n\n glue: this.unique(`${idBase}_rowFilter_glue`),\n field: this.unique(`${idBase}_rowFilter_field`),\n rule: this.unique(`${idBase}_rowFilter_rule`),\n inputValue: this.unique(`${idBase}_rowFilter_inputValue`),\n\n queryCombo: this.unique(`${idBase}_rowFilter_queryCombo`),\n queryFieldCombo: this.unique(`${idBase}_rowFilter_queryFieldCombo`),\n queryFieldComboQuery: this.unique(\n `${idBase}_rowFilter_queryFieldComboQuery`\n ),\n queryFieldComboField: this.unique(\n `${idBase}_rowFilter_queryFieldComboField`\n ),\n fieldMatch: this.unique(`${idBase}_rowFilter_fieldMatchCombo`),\n\n dataCollection: this.unique(`${idBase}_rowFilter_dataCollection`),\n\n listOptions: this.unique(`${idBase}_rowFilter_listOptions`),\n\n datePicker: this.unique(`${idBase}_rowFilter_datePicker`),\n });\n\n // Set current username\n // this.Account.username = this.AB.Account.username();\n\n var batchName; // we need to revert to this default when switching away from a in/by query field\n\n // Default options list to push to all fields\n this.queryFieldOptions = [\n {\n value: L(\"By Query Field\"),\n id: \"in_query_field\",\n },\n {\n value: L(\"Not In Query\"),\n id: \"not_in_query_field\",\n },\n ];\n\n this.recordRuleOptions = [];\n this.recordRuleFieldOptions = [];\n\n let _logic = this._logic || {};\n\n /**\n * @method getFieldList\n * return field list to render options\n */\n _logic.getFieldList = () => {\n return (this._Fields || []).map((f) => {\n let label = f.label;\n\n // include object's name to options\n if (this._settings.showObjectName && f.object) {\n label = f.object.label + \".\" + f.label;\n }\n\n return {\n id: f.id,\n value: label,\n alias: f.alias || undefined, // ABObjectQuery\n };\n });\n };\n\n _logic.getFilterUI = () => {\n let instance = this;\n let config_settings = this.config_settings || {};\n\n return {\n id: \"f\" + webix.uid(),\n isolate: true,\n cols: [\n {\n // Add / Or\n view: \"combo\",\n id: ids.glue,\n width: 80,\n value: config_settings.glue || \"and\",\n options: [\n {\n value: L(\"And\"),\n id: \"and\",\n },\n {\n value: L(\"Or\"),\n id: \"or\",\n },\n ],\n on: {\n onChange: function (newVal, oldVal) {\n _logic.selectCombineCondition(newVal);\n },\n },\n },\n {\n // Field list\n view: \"combo\",\n id: ids.field,\n suggest: {\n on: {\n onBeforeShow: function () {\n this.define(\"width\", 400);\n this.resize();\n },\n },\n data: _logic.getFieldList(),\n },\n on: {\n onChange: function (columnId) {\n var $viewCond = this.getParentView();\n _logic.selectField(columnId, $viewCond);\n },\n },\n },\n // Comparer\n {\n id: ids.rule,\n width: 220,\n cells: [\n {},\n // Query\n {\n batch: \"query\",\n view: \"combo\",\n value: \"in_query\",\n options: [\n {\n value: L(\"In Query\"),\n id: \"in_query\",\n },\n {\n value: L(\"Not In Query\"),\n id: \"not_in_query\",\n },\n {\n value: L(\"contains\"),\n id: \"contains\",\n },\n {\n value: L(\"doesn't contain\"),\n id: \"not_contains\",\n },\n {\n value: L(\"is\"),\n id: \"equals\",\n },\n {\n value: L(\"is not\"),\n id: \"not_equal\",\n },\n {\n value: L(\"is empty\"),\n id: \"is_empty\",\n },\n {\n value: L(\"is not empty\"),\n id: \"is_not_empty\",\n },\n {\n value: L(\"Same As User\"),\n id: \"same_as_user\",\n },\n {\n value: L(\"Not Same As User\"),\n id: \"not_same_as_user\",\n },\n {\n value: L(\"In Data Collection\"),\n id: \"in_data_collection\",\n },\n {\n value: L(\"Not In Data Collection\"),\n id: \"not_in_data_collection\",\n },\n ].concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition, oldValue) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n\n // Date\n {\n batch: \"date\",\n view: \"combo\",\n value: \"less\",\n options: [\n {\n value: L(\"equals\"),\n id: \"equals\",\n },\n {\n value: L(\"does not equal\"),\n id: \"not_equal\",\n },\n {\n value: L(\"is before\"),\n id: \"less\",\n },\n {\n value: L(\"is after\"),\n id: \"greater\",\n },\n {\n value: L(\"is on or before\"),\n id: \"less_or_equal\",\n },\n {\n value: L(\"is on or after\"),\n id: \"greater_or_equal\",\n },\n {\n value: L(\"is before current date\"),\n id: \"less_current\",\n },\n {\n value: L(\"is after current date\"),\n id: \"greater_current\",\n },\n {\n value: L(\"is on or before current date\"),\n id: \"less_or_equal_current\",\n },\n {\n value: L(\"is on or after current date\"),\n id: \"greater_or_equal_current\",\n },\n {\n value: L(\"last ... days\"),\n id: \"last_days\",\n },\n {\n value: L(\"next ... days\"),\n id: \"next_days\",\n },\n {\n value: L(\"is current date\"),\n id: \"is_current_date\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n // Number\n {\n batch: \"number\",\n view: \"combo\",\n value: \"equals\",\n options: [\n {\n value: L(\":\"),\n id: \"equals\",\n },\n {\n value: L(\"≠\"),\n id: \"not_equal\",\n },\n {\n value: L(\"<\"),\n id: \"less\",\n },\n {\n value: L(\">\"),\n id: \"greater\",\n },\n {\n value: L(\"≤\"),\n id: \"less_or_equal\",\n },\n {\n value: L(\"≥\"),\n id: \"greater_or_equal\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n // List\n {\n batch: \"list\",\n view: \"combo\",\n value: \"equals\",\n options: [\n {\n value: L(\"equals\"),\n id: \"equals\",\n },\n {\n value: L(\"does not equal\"),\n id: \"not_equal\",\n },\n {\n value: L(\"Same As User\"),\n id: \"same_as_user\",\n },\n {\n value: L(\"Not Same As User\"),\n id: \"not_same_as_user\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition, oldValue) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n // Boolean\n {\n batch: \"boolean\",\n view: \"combo\",\n value: \"equals\",\n options: [\n {\n value: L(\"equals\"),\n id: \"equals\",\n },\n {\n value: L(\"does not equal\"),\n id: \"not_equal\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n // User\n {\n batch: \"user\",\n view: \"combo\",\n value: \"is_current_user\",\n options: [\n {\n value: L(\"is current user\"),\n id: \"is_current_user\",\n },\n {\n value: L(\"is not current user\"),\n id: \"is_not_current_user\",\n },\n {\n value: L(\"contains current user\"),\n id: \"contain_current_user\",\n },\n {\n value: L(\"does not contain current user\"),\n id: \"not_contain_current_user\",\n },\n {\n value: L(\"equals\"),\n id: \"equals\",\n },\n {\n value: L(\"does not equal\"),\n id: \"not_equal\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n // String\n {\n batch: \"string\",\n view: \"combo\",\n value: \"contains\",\n options: [\n {\n value: L(\"contains\"),\n id: \"contains\",\n },\n {\n value: L(\"doesn't contain\"),\n id: \"not_contains\",\n },\n {\n value: L(\"is\"),\n id: \"equals\",\n },\n {\n value: L(\"is not\"),\n id: \"not_equal\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n // Email\n {\n batch: \"email\",\n view: \"combo\",\n value: \"contains\",\n options: [\n {\n value: L(\"contains\"),\n id: \"contains\",\n },\n {\n value: L(\"doesn't contain\"),\n id: \"not_contains\",\n },\n {\n value: L(\"is\"),\n id: \"equals\",\n },\n {\n value: L(\"is not\"),\n id: \"not_equal\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n ],\n },\n // Value\n {\n id: ids.inputValue,\n isolate: true,\n cells: [\n {\n batch: \"empty\",\n },\n\n // Query\n {\n id: ids.queryCombo,\n\n batch: \"query\",\n view: \"combo\",\n options: [],\n on: {\n onChange: _logic.onChange,\n },\n },\n\n // Query Field\n {\n id: ids.queryFieldCombo,\n batch: \"queryField\",\n rows: [\n {\n id: ids.queryFieldComboQuery,\n view: \"combo\",\n options: [],\n placeholder: L(\"Choose a Query\"),\n on: {\n onChange: function (value) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer\n .getParentView()\n .getParentView();\n _logic.onChangeQueryFieldCombo(\n value,\n $viewCond\n );\n\n _logic.onChange();\n },\n },\n },\n {\n id: ids.queryFieldComboField,\n view: \"combo\",\n options: [],\n placeholder: L(\"Choose a Field\"),\n on: {\n onChange: _logic.onChange,\n },\n },\n ],\n },\n\n // Field match\n {\n id: ids.fieldMatch,\n batch: \"fieldMatch\",\n view: \"combo\",\n options: [],\n on: {\n onChange: _logic.onChange,\n },\n },\n\n // Data collection\n {\n id: ids.dataCollection,\n batch: \"dataCollection\",\n view: \"richselect\",\n options: [],\n on: {\n onChange: _logic.onChange,\n },\n },\n\n // Date\n {\n // inputView.format = field.getDateFormat();\n batch: \"date\",\n id: ids.datePicker,\n view: \"datepicker\",\n on: {\n onChange: function () {\n _logic.onChange();\n },\n },\n },\n // Number\n {\n batch: \"number\",\n view: \"text\",\n validate: webix.rules.isNumber,\n on: {\n onTimedKeyPress: function () {\n if (this.validate()) _logic.onChange();\n },\n },\n },\n // List\n {\n batch: \"list\",\n id: ids.listOptions,\n view: \"combo\",\n options: [],\n on: {\n onChange: function () {\n _logic.onChange();\n },\n },\n },\n // Boolean\n {\n batch: \"boolean\",\n view: \"checkbox\",\n on: {\n onChange: function () {\n _logic.onChange();\n },\n },\n },\n // User\n {\n batch: \"user\",\n view: \"combo\",\n options: this.AB.Account.userList().map((u) => {\n return {\n id: u.username,\n value: u.username,\n };\n }),\n on: {\n onChange: function () {\n _logic.onChange();\n },\n },\n },\n // String\n {\n batch: \"string\",\n view: \"text\",\n on: {\n onTimedKeyPress: function () {\n _logic.onChange();\n },\n },\n },\n // Email\n {\n batch: \"email\",\n view: \"text\",\n on: {\n onTimedKeyPress: function () {\n _logic.onChange();\n },\n },\n },\n ],\n },\n {\n view: \"button\",\n css: \"webix_primary\",\n icon: \"fa fa-plus\",\n type: \"icon\",\n autowidth: true,\n click: function () {\n var $viewForm = this.getFormView();\n\n var indexView = $viewForm.index(this.getParentView());\n\n _logic.addNewFilter(indexView + 1);\n },\n },\n {\n view: \"button\",\n css: \"webix_danger\",\n icon: \"fa fa-trash\",\n type: \"icon\",\n autowidth: true,\n click: function () {\n var $viewCond = this.getParentView();\n\n _logic.removeNewFilter($viewCond);\n },\n },\n ],\n };\n };\n\n _logic.getAddButtonUI = () => {\n return {\n view: \"button\",\n id: ids.addNewFilter,\n css: \"webix_primary\",\n type: \"form\",\n label: L(\"Add a filter\"),\n click: () => {\n _logic.addNewFilter();\n },\n };\n };\n\n _logic.addNewFilter = (index, fieldId) => {\n var viewId;\n var ui = _logic.getFilterUI();\n\n var $viewForm = $$(ids.filterForm);\n if ($viewForm) {\n viewId = $viewForm.addView(ui, index);\n\n _logic.toggleAddNewButton();\n\n // select a option of field\n if (fieldId) _logic.selectField(fieldId, $$(viewId), true);\n }\n\n return viewId;\n };\n\n _logic.removeNewFilter = function ($viewCond) {\n var $viewForm = $$(ids.filterForm);\n\n $viewForm.removeView($viewCond);\n\n _logic.toggleAddNewButton();\n\n _logic.onChange();\n };\n\n _logic.toggleAddNewButton = function () {\n if (!$$(ids.filterForm)) return;\n\n // Show \"Add new filter\" button\n if ($$(ids.filterForm).getChildViews().length < 1) {\n $$(ids.filterForm).hide();\n $$(ids.addNewFilter).show();\n }\n // Hide \"Add new filter\" button\n else {\n $$(ids.filterForm).show();\n $$(ids.addNewFilter).hide();\n }\n };\n\n _logic.selectCombineCondition = (val, ignoreNotify) => {\n // define combine value to configuration\n this.config_settings.glue = val;\n\n // update value of every combine conditions\n var $viewConds = $$(ids.filterForm).getChildViews();\n $viewConds.forEach((v) => {\n if (v.$$ && v.$$(ids.glue)) v.$$(ids.glue).setValue(val);\n });\n\n if (!ignoreNotify) _logic.onChange();\n };\n\n _logic.selectField = (columnId, $viewCond, ignoreNotify) => {\n if (!this._Fields) return;\n\n var field = this._Fields.filter((f) => f.id == columnId)[0];\n if (!field) return;\n\n // switch view\n batchName = field.key;\n if (field.id == \"this_object\") batchName = \"query\";\n // Special this object query\n else if (batchName == \"LongText\" || batchName == \"combined\")\n batchName = \"string\";\n else if (field.key == \"formula\") batchName = \"number\";\n var isQueryField =\n this._QueryFields.filter((f) => {\n return f.id == field.id;\n }).length > 0;\n if (isQueryField) {\n // we chose a connectField which is now a Query type\n batchName = \"query\";\n }\n $viewCond.$$(ids.rule).showBatch(batchName);\n $viewCond.$$(ids.inputValue).showBatch(batchName);\n\n let options = [];\n let Queries = [];\n\n // populate the list of Queries for this_object:\n if (field.id == \"this_object\" && this._Object) {\n Queries = this.queries((q) => q.canFilterObject(this._Object));\n }\n // populate the list of Queries for a query field\n else if (isQueryField) {\n Queries = this.queries((q) => {\n return (\n (this._Object ? this._Object.id : \"\") != q.id && // Prevent filter looping\n q.canFilterObject(field.datasourceLink)\n );\n });\n }\n\n Queries.forEach((q) => {\n options.push({\n id: q.id,\n value: q.label,\n });\n });\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.queryCombo)\n .define(\"options\", options);\n $viewCond.$$(ids.inputValue).$$(ids.queryCombo).refresh();\n\n // populate options of list\n if (field.key == \"list\") {\n let listOptions = field.settings.options.map(function (x) {\n return {\n id: x.id,\n value: x.text,\n };\n });\n\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.listOptions)\n .define(\"options\", listOptions);\n $viewCond.$$(ids.inputValue).$$(ids.listOptions).refresh();\n }\n // set format of datepicker\n else if (field.key == \"date\") {\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.datePicker)\n .define(\"format\", field.getFormat());\n $viewCond.$$(ids.inputValue).$$(ids.datePicker).refresh();\n }\n\n var rule = null,\n ruleViewId = $viewCond.$$(ids.rule).getActiveId(),\n $viewComparer = $viewCond\n .$$(ids.rule)\n .queryView({ id: ruleViewId });\n if ($viewComparer && $viewComparer.getList) {\n let defaultOpt = ($viewComparer.getList().config.data || [])[0];\n if (defaultOpt) {\n $viewComparer.setValue(defaultOpt.id);\n }\n\n // rule = $viewComparer.getValue();\n // if (rule == \"in_query_field\" || rule == \"not_in_query_field\") {\n // \t// Show the new value inputs\n // \t$viewCond.$$(ids.inputValue).showBatch(\"queryField\");\n // } else if (rule == \"same_as_field\" || rule == \"not_same_as_field\") {\n // \t// Show the new value inputs\n // \t$viewCond.$$(ids.inputValue).showBatch(\"fieldMatch\");\n // }\n }\n\n if (!ignoreNotify) _logic.onChange();\n };\n\n _logic.onChangeRule = (rule, $viewCond, notify = false) => {\n switch (rule) {\n case \"contains\":\n case \"not_contains\":\n case \"equals\":\n case \"not_equal\":\n // For \"connect_fields\" search by CUSTOM index value\n if (batchName == \"query\") {\n $viewCond.$$(ids.inputValue).showBatch(\"string\");\n }\n // If want to call notify or call .onChange(), then pass notify is true.\n // _logic.onChange();\n break;\n\n case \"is_current_user\":\n case \"is_not_current_user\":\n case \"contain_current_user\":\n case \"not_contain_current_user\":\n case \"same_as_user\":\n case \"not_same_as_user\":\n case \"less_current\":\n case \"greater_current\":\n case \"less_or_equal_current\":\n case \"greater_or_equal_current\":\n case \"is_empty\":\n case \"is_not_empty\":\n case \"is_current_date\":\n // clear and disable the value field\n $viewCond.$$(ids.inputValue).showBatch(\"empty\");\n _logic.onChange();\n break;\n\n case \"last_days\":\n case \"next_days\":\n // Show the number input\n $viewCond.$$(ids.inputValue).showBatch(\"number\");\n break;\n\n case \"in_query_field\":\n case \"not_in_query_field\":\n // populate the list of Queries for this_object:\n var options = [];\n\n // Get all application's queries\n this.queries(\n (q) => this._Object == null || q.id != this._Object.id\n ).forEach((q) => {\n options.push({\n id: q.id,\n value: q.label,\n });\n });\n\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.queryFieldComboQuery)\n .define(\"options\", options);\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.queryFieldComboQuery)\n .refresh();\n\n // Show the new value inputs\n $viewCond.$$(ids.inputValue).showBatch(\"queryField\");\n break;\n\n case \"same_as_field\":\n case \"not_same_as_field\":\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.fieldMatch)\n .define(\"options\", this.recordRuleFieldOptions);\n $viewCond.$$(ids.inputValue).$$(ids.fieldMatch).refresh();\n\n // Show the new value inputs\n $viewCond.$$(ids.inputValue).showBatch(\"fieldMatch\");\n break;\n\n case \"in_data_collection\":\n case \"not_in_data_collection\": {\n let dcOptions = [];\n\n // pull data collection list\n\n // get id of the link object\n let linkObjectId,\n columnId = $viewCond.$$(ids.field).getValue();\n if (columnId == \"this_object\" && this._Object) {\n linkObjectId = this._Object.id;\n } else {\n let field = this._Fields.filter((f) => f.id == columnId)[0];\n if (field) linkObjectId = field.settings.linkObject;\n }\n\n if (this._Application && linkObjectId) {\n this._Application\n .datacollections(\n (dc) =>\n dc.datasource && dc.datasource.id == linkObjectId\n )\n .forEach((dc) => {\n dcOptions.push({\n id: dc.id,\n value: dc.label,\n });\n });\n }\n\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.dataCollection)\n .define(\"options\", dcOptions);\n $viewCond.$$(ids.inputValue).$$(ids.dataCollection).refresh();\n\n // Show the new value inputs\n $viewCond.$$(ids.inputValue).showBatch(\"dataCollection\");\n break;\n }\n\n default:\n // Show the default value inputs\n $viewCond.$$(ids.inputValue).showBatch(batchName);\n\n if (notify) _logic.onChange();\n\n break;\n }\n };\n\n _logic.onChangeQueryFieldCombo = (value, $viewCond) => {\n // populate the list of Queries for this_object:\n let options = [];\n // Get all queries fields\n let Query = this.queries((q) => {\n return q.id == value;\n })[0];\n if (Query) {\n Query.fields((f) => {\n return !f.isConnection;\n }).forEach((q) => {\n options.push({\n id: q.id,\n value: q.object.label + \".\" + q.label,\n });\n });\n\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.queryFieldComboField)\n .define(\"options\", options);\n $viewCond.$$(ids.inputValue).$$(ids.queryFieldComboField).refresh();\n }\n\n // _logic.onChange();\n };\n\n _logic.onChange = () => {\n if (!this.__blockOnChange) {\n // refresh config settings before notify\n _logic.getValue();\n\n console.warn(\"convert RowFilter.callback.onChange() to .emit()\");\n _logic.callbacks.onChange();\n this.emit(\"change\");\n }\n\n return false;\n };\n\n _logic.blockOnChange = () => {\n this.__blockOnChange = true;\n };\n\n _logic.unblockOnChange = () => {\n this.__blockOnChange = false;\n };\n\n /**\n * @method getValue\n *\n * @return {JSON} -\n * {\n * \t\tglue: '', // 'and', 'or'\n *\t\trules: [\n *\t\t\t{\n *\t\t\t\tkey:\t'column name',\n *\t\t\t\trule:\t'rule',\n *\t\t\t\tvalue:\t'value'\n *\t\t\t}\n *\t\t]\n * }\n */\n _logic.getValue = () => {\n let config_settings = {\n glue: \"and\",\n rules: [],\n };\n\n var $viewForm = $$(ids.filterForm);\n if ($viewForm) {\n $viewForm.getChildViews().forEach(($viewCond, index) => {\n if (index == 0) {\n config_settings.glue = $viewCond.$$(ids.glue).getValue();\n }\n\n var $fieldElem = $viewCond.$$(ids.field);\n if (!$fieldElem) return;\n\n /* field id */\n var fieldId = $fieldElem.getValue();\n if (!fieldId) return;\n\n /* alias */\n var alias;\n var selectedOpt = $viewCond\n .$$(ids.field)\n .getPopup()\n .config.body.data.filter((opt) => opt.id == fieldId)[0];\n if (selectedOpt) alias = selectedOpt.alias || undefined;\n\n /* rule */\n var rule = null,\n ruleViewId = $viewCond.$$(ids.rule).getActiveId(),\n $viewComparer = $viewCond\n .$$(ids.rule)\n .queryView({ id: ruleViewId });\n if ($viewComparer && $viewComparer.getValue)\n rule = $viewComparer.getValue();\n\n /* value */\n var value = null,\n valueViewId = $viewCond.$$(ids.inputValue).getActiveId(),\n $viewConditionValue = $viewCond\n .$$(ids.inputValue)\n .queryView({ id: valueViewId });\n if ($viewConditionValue && $viewConditionValue.getValue) {\n value = $viewConditionValue.getValue();\n } else if (\n $viewConditionValue &&\n $viewConditionValue.getChildViews()\n ) {\n var vals = [];\n $viewConditionValue.getChildViews().forEach((element) => {\n vals.push($$(element).getValue());\n });\n value = vals.join(\":\");\n }\n\n // Convert date format\n if (value instanceof Date) {\n let dateField = this._Fields.filter(\n (f) => f.id == fieldId\n )[0];\n if (dateField) {\n value = dateField.exportValue(value);\n } else {\n value = value.toISOString();\n }\n }\n\n config_settings.rules.push({\n alias: alias || undefined,\n key: fieldId,\n rule: rule,\n value: value,\n });\n });\n }\n\n this.config_settings = config_settings;\n\n return this.config_settings;\n };\n\n // webix UI definition:\n this.ui = {\n id: ids.component,\n rows: [\n {\n view: \"form\",\n id: ids.filterForm,\n hidden: true,\n elements: [],\n },\n _logic.getAddButtonUI(),\n ],\n };\n }\n\n // setting up UI\n init(options = {}) {\n super.init(options);\n\n // register our callbacks:\n for (var c in this._logic.callbacks) {\n this._logic.callbacks[c] = options[c] || this._logic.callbacks[c];\n }\n\n if (options.showObjectName)\n this._settings.showObjectName = options.showObjectName;\n\n if (options.isRecordRule) {\n this.recordRuleOptions = [\n {\n value: L(\"Same As Field\"),\n id: \"same_as_field\",\n },\n {\n value: L(\"Not Field\"),\n id: \"not_same_as_field\",\n },\n ];\n this.recordRuleFieldOptions = options.fieldOptions;\n }\n }\n\n setValue(settings) {\n settings = settings || {};\n\n super.setValue(settings);\n\n let ids = this.ids;\n let logic = this._logic;\n\n // block .onChange event\n logic.blockOnChange();\n\n let config_settings = this.AB.cloneDeep(settings);\n config_settings.rules = config_settings.rules || [];\n\n // Redraw form with no elements\n var $viewForm = $$(ids.filterForm);\n if ($viewForm) webix.ui([], $viewForm);\n\n // Add \"new filter\" button\n if (config_settings.rules.length == 0) {\n logic.toggleAddNewButton();\n }\n\n config_settings.rules.forEach((f) => {\n var viewId = logic.addNewFilter(),\n $viewCond = $$(viewId);\n\n if ($viewCond == null) return;\n\n var field = this._Fields.filter((col) => col.id == f.key)[0];\n\n // \"and\" \"or\"\n $viewCond.$$(ids.glue).define(\"value\", config_settings.glue);\n $viewCond.$$(ids.glue).refresh();\n\n // Select Field\n $viewCond.$$(ids.field).define(\"value\", f.key);\n $viewCond.$$(ids.field).refresh();\n logic.selectField(f.key, $viewCond, true);\n\n // Comparer\n var ruleViewId = $viewCond.$$(ids.rule).getActiveId(),\n $viewComparer = $viewCond\n .$$(ids.rule)\n .queryView({ id: ruleViewId });\n if ($viewComparer && $viewComparer.setValue) {\n $viewComparer.define(\"value\", f.rule);\n $viewComparer.refresh();\n }\n\n // if (f.rule == \"in_query_field\" || f.rule == \"not_in_query_field\" || f.rule == \"same_as_field\" || f.rule == \"not_same_as_field\") {\n $viewCond.blockEvent();\n logic.onChangeRule(f.rule, $viewCond);\n $viewCond.unblockEvent();\n // }\n\n // Input\n var valueViewId = $viewCond.$$(ids.inputValue).getActiveId(),\n $viewConditionValue = $viewCond\n .$$(ids.inputValue)\n .queryView({ id: valueViewId });\n if ($viewConditionValue && $viewConditionValue.setValue) {\n // convert to Date object\n if (\n field &&\n field.key == \"date\" &&\n f.value &&\n (f.rule == \"less\" ||\n f.rule == \"greater\" ||\n f.rule == \"less_or_equal\" ||\n f.rule == \"greater_or_equal\")\n ) {\n $viewConditionValue.define(\"value\", new Date(f.value));\n } else {\n $viewConditionValue.define(\"value\", f.value);\n }\n\n $viewConditionValue.refresh();\n } else if (\n $viewConditionValue &&\n $viewConditionValue.getChildViews()\n ) {\n let vals = (f.value || \"\").split(\":\");\n let index = 0;\n $viewConditionValue.getChildViews().forEach((element) => {\n $$(element).blockEvent();\n $$(element).setValue(vals[index]);\n if (index == 0) {\n logic.onChangeQueryFieldCombo(vals[index], $viewCond);\n }\n $$(element).unblockEvent();\n // $$(element).refresh();\n index++;\n });\n }\n\n if (field && field.key == \"user\") {\n $viewCond.blockEvent();\n logic.onChangeRule(f.rule, $viewCond);\n $viewCond.blockEvent();\n }\n });\n\n // unblock .onChange event\n logic.unblockOnChange();\n }\n\n /**\n * @method isComplete()\n * returns a truthy value representing whether or not our current condition\n * expression is fully completed. Then externally checks can be made to\n * verify if the data is complete.\n * @return {bool}\n */\n isComplete() {\n if (!this._completeConditions) {\n this._completeConditions = this.AB.filterComplexNew(\n `${this.ids.component}_iscomplete`\n );\n }\n\n return this._completeConditions.isConditionComplete(this.getValue());\n }\n};\n","// const ABComponent = require(\"./ABComponent\");\nimport ClassUI from \"../../ui/ClassUI\";\nconst ABViewForm = require(\"../platform/views/ABViewForm\");\n\nlet L = null;\n\nclass RowUpdater extends ClassUI {\n constructor(idBase, AB) {\n super(idBase, {\n form: `${idBase}_rowUpdaterForm`,\n addNew: `${idBase}_rowUpdaterAddNew`,\n field: `${idBase}_rowUpdaterField`,\n });\n\n this.idBase = idBase;\n\n this._Object = null;\n // {ABObject}\n // The ABObject we are building a form for.\n\n this._mockFormWidget = null;\n // {ABViewForm}\n // When building our form components to display, they need a\n // ABViewForm to be associated with.\n\n this.AB = AB;\n\n if (!L) {\n L = (...params) => {\n return this.AB.Multilingual.label(...params);\n };\n }\n }\n\n /**\n * @method uiItem()\n * Return the webix description of a new field/value row.\n * @return {json}\n */\n uiItem() {\n const self = this;\n\n return {\n rows: [\n {\n view: \"layout\",\n isolate: true,\n cols: [\n {\n // Label\n view: \"label\",\n width: 40,\n label: L(\"Set\"),\n },\n {\n // Field list\n view: \"combo\",\n id: this.ids.field,\n options: this.getFieldList(true),\n on: {\n onChange: async function (columnId) {\n const $viewItem = this.getParentView();\n\n await self.selectField(columnId, $viewItem);\n },\n },\n },\n {\n // Label\n view: \"label\",\n width: 40,\n label: L(\"To\"),\n },\n {\n view: \"segmented\",\n value: \"custom\",\n height: 40,\n maxWidth: 160,\n options: [\n { id: \"custom\", value: L(\"Custom\") },\n { id: \"process\", value: L(\"Process\") },\n ],\n hidden:\n this._extendedOptions == null ||\n !this._extendedOptions.length,\n on: {\n onChange: function (val) {\n const $viewItem = this.getParentView();\n\n self.toggleCustomProcessOption(\n $viewItem,\n val == \"process\"\n );\n },\n },\n },\n // Field value\n {},\n // Extended value\n {\n hidden: true,\n },\n {\n // \"Remove\" button\n view: \"button\",\n css: \"webix_danger\",\n icon: \"fa fa-trash\",\n type: \"icon\",\n autowidth: true,\n\n click: function () {\n const $viewCond = this.getParentView().getParentView();\n\n self.removeItem($viewCond);\n },\n },\n ],\n },\n ],\n };\n }\n\n /**\n * @method ui()\n * return the webix description of our Entry form.\n * @return {json}\n */\n ui() {\n // webix UI definition:\n return {\n rows: [\n {\n view: \"form\",\n id: this.ids.form,\n hidden: true,\n borderless: true,\n elements: [],\n },\n {\n view: \"button\",\n id: this.ids.addNew,\n icon: \"fa fa-plus\",\n type: \"iconButton\",\n label: L(\"Add field to edit\"),\n click: () => {\n this.addItem();\n },\n },\n ],\n };\n }\n\n init(AB) {\n const $form = $$(this.ids.form);\n if ($form) AB.Webix.extend($form, AB.Webix.ProgressBar);\n\n return Promise.resolve();\n }\n\n /**\n * @method addItem()\n * Add another field/value entry item to our form.\n * @param {integer} index\n * which position in the list of form elements do we want to\n * insert the new row.\n * @return {string} the webix .id of the new row we just added.\n */\n addItem(index) {\n const $form = $$(this.ids.form);\n const remainFields = this.getFieldList(true);\n\n if (remainFields.length < 1) return;\n\n const ui = this.uiItem();\n const viewId = $form.addView(ui, index);\n\n this.toggleForm();\n\n return viewId;\n }\n\n /**\n * @method getFieldList()\n * Return an array of options in a webix.list format that represents the\n * possible fields that can be selected on the current ABObject.\n * @param {bool} excludeSelected\n * should we exclude from the list the fields that are ALREADY\n * displayed on the form?\n * @return {array} [ { id, value }, ... ]\n * id: ABField.id\n * value: ABField.label\n */\n getFieldList(excludeSelected) {\n let options = (this._Object.fields() || []).map((f) => {\n return {\n id: f.id,\n value: f.label,\n };\n });\n\n if (excludeSelected) {\n const $form = $$(this.ids.form);\n\n $form.getChildViews().forEach(($viewCond) => {\n // Ignore \"Add new\" button\n if (!$viewCond || !$viewCond.$$) return;\n\n const $fieldElem = $viewCond.$$(this.ids.field);\n\n if (!$fieldElem) return;\n\n const fieldId = $fieldElem.getValue();\n\n if (!fieldId) return;\n\n options = options.filter((opt) => opt.id != fieldId);\n });\n }\n return options;\n }\n\n /**\n * @method getValue\n * Return an array of field:value results that have been entered on this\n * form.\n * @return {Array}\n * [\n * {\n * fieldId: {UUID}\n * isProcessValue: {Boolean} - If it is true, then value is from Process parameter\n * value: {Object}\n * },\n * ...\n * ]\n */\n getValue() {\n const result = [];\n const $form = $$(this.ids.form);\n\n if ($form) {\n $form.getChildViews().forEach(($viewContainer) => {\n const $viewItem = $viewContainer.getChildViews()[0];\n\n // Ignore \"Add new\" button\n if (!$viewItem || !$viewItem.$$) return;\n\n const $fieldElem = $viewItem.$$(this.ids.field);\n\n if (!$fieldElem) return;\n\n const fieldId = $fieldElem.getValue();\n\n if (!fieldId) return;\n\n let $customValueElem = $viewItem.getChildViews()[4];\n $customValueElem = this._pullInputElement($customValueElem);\n\n const $processValueElem = $viewItem.getChildViews()[5];\n\n if (!$customValueElem && !$processValueElem) return;\n\n const fieldInfo = this._Object.fieldByID(fieldId);\n const val = {\n fieldId: fieldId,\n };\n\n // Custom value\n if ($customValueElem && $customValueElem.isVisible()) {\n if (\n fieldInfo.key === \"connectObject\" ||\n fieldInfo.key === \"user\"\n )\n val.value = fieldInfo.getValue($customValueElem);\n else if (\n fieldInfo.key === \"date\" ||\n fieldInfo.key === \"datetime\"\n ) {\n const currDateCheckbox =\n $customValueElem.getChildViews()[0] ?? $customValueElem;\n\n if (currDateCheckbox.getValue() == true)\n val.value = \"ab-current-date\";\n else {\n const datePicker =\n $customValueElem.getChildViews()[1] ?? $customValueElem;\n\n val.value = fieldInfo.getValue(datePicker);\n }\n }\n // Get value from data field manager\n else val.value = fieldInfo.getValue($customValueElem);\n }\n // Process value\n else if ($processValueElem && $processValueElem.isVisible()) {\n val.isProcessValue = true;\n val.value = $processValueElem.getValue();\n }\n\n // Add to output\n result.push(val);\n });\n }\n\n return result;\n }\n\n /**\n * @method objectLoad\n * Load the Object we are currently working with.\n * @param {ABObject} object\n */\n objectLoad(object) {\n this._Object = object;\n\n this._mockApp = this.AB.applicationNew({});\n this._mockFormWidget = new ABViewForm(\n {\n settings: {\n showLabel: false,\n labelWidth: 0,\n },\n },\n this._mockApp // just need any ABApplication here\n );\n this._mockFormWidget.objectLoad(object);\n\n this.setValue(null); // clear\n }\n\n /**\n * @method removeItem\n * Remove the current form row.\n * @param {webix.view} $viewCond\n * This is the webix.view that contains the whole value row\n * we are removing.\n */\n removeItem($viewCond) {\n const $form = $$(this.ids.form);\n\n $form.removeView($viewCond);\n this.toggleForm();\n }\n\n /**\n * @method selectField\n * Update the value display when a field is selected. Changing to a\n * different field will change the types of values that can be entered.\n * @param {string} columnId\n * The field.uuid of the object that was selected.\n * @param {webix.view} $viewItem\n * The webix.view that contains the value expression of the field\n * that was selected.\n */\n async selectField(columnId, $viewItem) {\n const field = this._Object.fieldByID(columnId);\n\n if (!field) {\n this.AB.notify.builder(\n new Error(`could not find field for id[${columnId}]`),\n {\n context: \"RowUpdater.selectField() could not find a field\",\n fieldID: columnId,\n }\n );\n\n return;\n }\n\n const fieldComponent = field.formComponent(),\n formFieldWidget = fieldComponent.newInstance(\n this._mockApp,\n this._mockFormWidget\n ),\n formFieldComponent = formFieldWidget.component(\n this.AB._App,\n this.idBase\n );\n const childViews = $viewItem.getChildViews();\n\n let inputView =\n typeof formFieldComponent.ui == \"function\"\n ? formFieldComponent.ui()\n : formFieldComponent.ui;\n\n // Add extended value options\n $viewItem.removeView(childViews[5]);\n\n if (this._extendedOptions?.length)\n $viewItem.addView(\n {\n view: \"richselect\",\n options: this._extendedOptions,\n hidden: true,\n },\n 5\n );\n else\n $viewItem.addView(\n {\n hidden: true,\n },\n 5\n );\n\n await this.busy();\n\n // WORKAROUND: add '[Current User]' option to the user data field\n switch (field.key) {\n case \"connectObject\":\n case \"user\":\n inputView = inputView.rows[0].rows[0];\n inputView.suggest.body.data =\n (await field.getOptions()).map((e) => {\n return {\n id: field.getRelationValue(e),\n value: e.text,\n };\n }) ?? [];\n\n if (field.key === \"user\")\n inputView.suggest.body.data.unshift({\n id: \"ab-current-user\",\n value: \"ab-current-user\",\n // This one is saved with the \"value\" not \"id\".\n // value: L(\"Current User\"),\n });\n\n break;\n\n case \"date\":\n case \"datetime\":\n inputView = {\n view: \"layout\",\n rows: [\n {\n view: \"checkbox\",\n labelWidth: 0,\n labelRight: L(\"Current Date/Time\"),\n on: {\n onChange: function (newVal) {\n const layout = this.getParentView();\n\n if (!layout) return;\n\n const datePicker = layout.getChildViews()[1];\n\n if (!datePicker) return;\n\n newVal ? datePicker.hide() : datePicker.show();\n },\n },\n },\n inputView,\n ],\n };\n\n break;\n }\n\n // Change component to display value\n $viewItem.removeView(childViews[4]);\n $viewItem.addView(inputView, 4);\n\n formFieldComponent.init();\n\n // Show custom display of data field\n if (field.customDisplay)\n field.customDisplay({}, this.AB._App, childViews[4].$view);\n\n this.toggleCustomProcessOption(\n $viewItem,\n childViews[3].getValue() === \"process\"\n );\n $$($viewItem).adjust();\n $viewItem.getFormView().adjust();\n\n this.ready();\n }\n\n /**\n * @method setValue\n * Given the previous settings, redraw the form with the field/value\n * entries.\n * @param {array} settings\n * [\n * {\n * fieldId: {UUID}\n * value: {Object|String}\n * }, ...\n * ]\n */\n setValue(settings) {\n const $form = $$(this.ids.form);\n\n if (!$form) return;\n\n // Redraw form with no elements\n webix.ui([], $form);\n\n settings = settings || [];\n if (settings.length < 1) return;\n\n settings.forEach(async (item) => {\n const $viewContainer = $$(this.addItem());\n const $viewItem = $viewContainer.getChildViews()[0];\n const $valueTypeButton = $viewItem.queryView(\n { view: \"segmented\" },\n \"self\"\n );\n\n $valueTypeButton.setValue(item.isProcessValue ? \"process\" : \"custom\");\n\n const $field = $viewItem.$$(this.ids.field);\n\n $field.define(\"value\", item.fieldId);\n $field.refresh();\n\n await this.selectField(item.fieldId, $viewItem);\n\n const fieldInfo = this._Object.fieldByID(item.fieldId);\n\n if (!fieldInfo) return;\n\n // Set process value\n if (item.isProcessValue) {\n const $processValueElem = $viewItem.getChildViews()[5];\n\n $processValueElem.setValue?.(item.value);\n\n return;\n }\n\n // Set custom value\n let $customValueElem = $viewItem.getChildViews()[4];\n $customValueElem = this._pullInputElement($customValueElem);\n const rowData = {};\n\n rowData[fieldInfo.columnName] = item.value?.value ?? item.value;\n fieldInfo.setValue($customValueElem, rowData);\n\n // Set \"Current Date/Time\" check box\n if (\n (fieldInfo.key == \"date\" || fieldInfo.key == \"datetime\") &&\n rowData[fieldInfo.columnName] == \"ab-current-date\" &&\n $customValueElem.config.view == \"checkbox\"\n ) {\n $customValueElem.setValue(true);\n }\n });\n\n this.toggleForm();\n }\n\n /**\n * @method toggleForm\n * decide if the form with the field/value elements should be displayed.\n */\n toggleForm() {\n const $form = $$(this.ids.form);\n\n if ($form) {\n const childViews = $form.getChildViews();\n\n if (childViews && childViews.length) $form.show();\n else $form.hide();\n $form.adjust();\n }\n }\n\n setExtendedOptions(options) {\n this._extendedOptions = options;\n }\n\n toggleCustomProcessOption($viewItem, showProcessOption) {\n const $customOption = $viewItem.getChildViews()[4];\n const $processOption = $viewItem.getChildViews()[5];\n\n if (showProcessOption) {\n $customOption.hide();\n $processOption.show();\n } else {\n $customOption.show();\n $processOption.hide();\n }\n }\n\n async busy() {\n $$(this.ids.addNew).disable();\n\n const $form = $$(this.ids.form);\n\n if (!$form) return;\n\n if (!$form.showProgress) await this.init(this.AB);\n\n $form.showProgress({ type: \"icon\" });\n }\n\n ready() {\n $$(this.ids.addNew).enable();\n $$(this.ids.form).hideProgress();\n }\n\n _pullInputElement($elem) {\n if (!$elem?.getValue && $elem?.getChildViews) {\n return (\n $elem\n .getChildViews()\n .filter((childView) => childView.getValue)[0] ?? $elem\n );\n } else {\n return $elem;\n }\n }\n}\n\nexport default RowUpdater;\n","/*\n * ABField\n *\n * An ABField defines a single unique Field/Column in a ABObject.\n *\n */\n\nconst ABFieldCore = require(\"../../core/dataFields/ABFieldCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABField extends ABFieldCore {\n constructor(values, object, fieldDefaults) {\n super(values, object, fieldDefaults);\n\n this.AB.on(\"ab.abdefinition.update\", (def) => {\n if (def.id == this.id) {\n this.emit(\"definition.updated\", this);\n }\n });\n\n // \t// NOTE: setup this first so later we can use .fieldType(), .fieldIcon()\n // \tthis.defaults = fieldDefaults;\n\n // \t{\n // \t\tid:'uuid',\t\t\t\t\t// uuid value for this obj\n // \t\tkey:'fieldKey',\t\t\t\t// unique key for this Field\n // \t\ticon:'font',\t\t\t\t// fa-[icon] reference for an icon for this Field Type\n // \t\tlabel:'',\t\t\t\t\t// pulled from translation\n // \t\tcolumnName:'column_name',\t// a valid mysql table.column name\n //\t\tsettings: {\t\t\t\t\t// unique settings for the type of field\n // \t\t\tshowIcon:true/false,\t// only useful in Object Workspace DataTable\n // \t\t\tisImported: 1/0,\t\t// flag to mark is import from other object\n // \t\t\trequired: 1/0,\t\t\t// field allows does not allow NULL or it does allow NULL\n // \t\t\twidth: {int}\t\t\t// width of display column\n\n // \t\t// specific for dataField\n // \t\t},\n // \t\ttranslations:[]\n // \t}\n\n // \tthis.fromValues(values);\n\n // this.object = object;\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n static editorValues(settings) {\n const obj = {\n label: settings.label,\n columnName: settings.columnName,\n settings: settings,\n };\n\n delete settings.label;\n delete settings.columnName;\n\n return obj;\n }\n\n addValidation(ids, settings) {\n const App = this.object.application.App;\n const Filter = this.AB.filterComplexNew(\n `${this.id}_field_validation_rules`\n );\n $$(ids.filterComplex).addView({\n view: \"form\",\n css: \"abValidationForm\",\n cols: [\n {\n rows: [\n {\n view: \"text\",\n name: \"invalidMessage\",\n labelWidth: this.AB.UISettings.config().labelWidthLarge,\n value:\n settings && settings.invalidMessage\n ? settings.invalidMessage\n : \"\",\n label: L(\"Invalid Message\"),\n },\n Filter.ui,\n ],\n },\n {\n view: \"button\",\n css: \"webix_danger\",\n icon: \"fa fa-trash\",\n type: \"icon\",\n autowidth: true,\n click: function () {\n const $viewCond = this.getParentView();\n $$(ids.filterComplex).removeView($viewCond);\n },\n },\n ],\n });\n $$(Filter.ids.save).hide();\n // Filter.applicationLoad(this.object.application);\n Filter.fieldsLoad(this.object.fields());\n if (settings && settings.rules) Filter.setValue(settings.rules);\n }\n\n /*\n * @method isValid\n * check the current values to make sure they are valid.\n * Here we check the default values provided by ABField.\n *\n * @return null or [{OP.Validation.validator()}] objects.\n */\n isValid() {\n const validator = this.AB.Validation.validator();\n\n // .columnName must be unique among fileds on the same object\n const isNameUnique =\n this.object.fields((f) => {\n return (\n f.id != this.id &&\n f.columnName.toLowerCase() == this.columnName.toLowerCase()\n );\n }).length == 0;\n if (!isNameUnique) {\n validator.addError(\n \"columnName\",\n L(\n \"Field columnName must be unique ({0} already used in this Object)\",\n [this.columnName]\n )\n );\n }\n\n return validator;\n }\n\n ///\n /// Instance Methods\n ///\n\n /// ABApplication data methods\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABApplication\n *\n * also remove it from our _AllApplications\n *\n * @return {Promise}\n */\n async destroy() {\n // verify we have been .save() before:\n if (!this.id) return;\n\n // NOTE: our .migrateXXX() routines expect the object to currently exist\n // in the DB before we perform the DB operations. So we need to\n // .migrateDrop() before we actually .objectDestroy() this.\n if (!this.object.isAPI) {\n await this.migrateDrop();\n }\n\n // the server still references an ABField in relationship to it's\n // ABObject, so we need to destroy the Field 1st, then remove it\n // from it's object.\n await super.destroy();\n\n await this.object.fieldRemove(this);\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABField with it's parent ABObject\n *\n *\n * @return {Promise}\n *\t\t\t\t\t\t.resolve( {this} )\n */\n async save(skipMigrate = false) {\n let isAdd = false;\n // if this is our initial save()\n if (!this.id) {\n isAdd = true;\n }\n\n // Whenever we update our settings, make sure any\n // existing rows that have NULL values for this field\n // are updated to have our current .default value.\n if (!isAdd && this.settings.required && this.settings.default) {\n const model = this.object.model();\n\n // pull rows that has null value\n const result = await model.findAll({\n where: {\n glue: \"and\",\n rules: [\n {\n key: this.id,\n rule: \"is_null\",\n },\n ],\n },\n });\n\n const tasks = [];\n\n // updating ...\n result.data.forEach((d) => {\n if (!d[this.columnName]) d[this.columnName] = this.settings.default;\n\n tasks.push(model.update(d.id, d));\n });\n\n await Promise.all(tasks);\n }\n\n // New ABDefinition method of saving:\n // when this is done, we now have an .id\n await super.save();\n\n // incase this was an ADD operation, make sure the\n // parent Obj now includes this object:\n // NOTE: must be done after the .save() so we have an .id\n await this.object.fieldAdd(this);\n\n // perform any server side migrations for this Field:\n\n // but not connectObject fields:\n // ABFieldConnect.migrateXXX() gets called from the UI popupNewDataField\n // in order to handle the timings of the 2 fields that need to be created\n if (!this.isConnection && !skipMigrate && !this.object.isAPI) {\n const fnMigrate = isAdd ? this.migrateCreate() : this.migrateUpdate();\n await fnMigrate;\n }\n\n return this;\n }\n\n ///\n /// DB Migrations\n ///\n\n migrateCreate() {\n return this.AB.Network.post({\n url: `/definition/migrate/object/${this.object.id}/field/${this.id}`,\n });\n }\n\n migrateUpdate() {\n return this.AB.Network.put({\n url: `/definition/migrate/object/${this.object.id}/field/${this.id}`,\n });\n }\n\n migrateDrop() {\n return this.AB.Network[\"delete\"]({\n url: `/definition/migrate/object/${this.object.id}/field/${this.id}`,\n });\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @function columnHeader\n * Return the column header for a webix grid component for this specific\n * data field.\n * @param {Object} options\n * {\n * isObjectWorkspace: {bool}, is this being used in the Object workspace.\n * width: {int},\n * height: {int},\n * editable: {bool}\n * }\n * @return {obj} configuration obj\n */\n columnHeader(options) {\n options = options || {};\n\n const config = {\n id: this.columnName, // this.id,\n header: this.label,\n };\n\n if (options.isObjectWorkspace && this.settings.showIcon) {\n config.header = `${\n config.header\n }`;\n }\n\n return config;\n }\n\n /*\n * @function customDisplay\n * perform any custom display modifications for this field. If this isn't\n * a standard value display (think image, Map, graph, etc...) then use this\n * method to create the display in the table/grid cell.\n * @param {object} row\n * is the {name=>value} hash of the current row of data.\n * @param {App} App\n * the shared ui App object useful more making globally\n *\t\t\t unique id references.\n * @param {HtmlDOM} node\n * the HTML Dom object for this field's display.\n * @param {object} options\n * option of additional settings\n */\n customDisplay(row, App, node, options) {}\n\n /*\n * @function customEdit\n *\n *\n *\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customEdit(row, App, node) {\n return true;\n }\n\n /**\n * @method getValue\n * this function uses for form component and mass update popup\n * to get value of fields that apply custom editor\n *\n * @param {Object} item - Webix element\n * @param {Object} rowData - data of row\n *\n * @return {Object}\n */\n getValue(item, rowData) {\n return item.getValue();\n }\n\n /**\n * @method setValue\n * this function uses for form component and mass update popup\n * to get value of fields that apply custom editor\n *\n * @param {Object} item - Webix element\n * @param {Object} rowData - data of row\n *\n */\n setValue(item, rowData, defaultValue) {\n if (!item) return;\n\n let val;\n\n if (\n (rowData == null || rowData[this.columnName] == null) &&\n defaultValue != null\n ) {\n val = defaultValue;\n } else if (rowData && rowData[this.columnName] != null) {\n val = rowData[this.columnName];\n } else {\n val = rowData;\n }\n\n try {\n item.setValue(val);\n } catch (err) {\n // this error is fine because we handled it already\n }\n }\n\n /**\n * @method formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent(formKey) {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n\n let FC = {\n // .common() is used to create the display in the list\n common: () => {\n return {\n key: formKey,\n\n // // but since this is a common place holder: use the\n // // multilingual label here:\n // labelKey: 'ab.abfield.labelPlaceholder',\n // icon: 'square'\n };\n },\n\n // .newInstance() is used to create the view instance when the component\n // \t\tis dropped onto the ABView list.\n newInstance: (application, parent) => {\n application = application ?? this.AB._mockApp;\n\n // NOTE: in case you were wondering, the base ABField\n // \t\t will just return a label with 'ABFieldPlaceholder'\n // \t\t as the text. Any sub class of ABField should overwrite\n // \t\t this and return an actual Form Component.\n\n // store object id and field id to field component\n const values = FC.common();\n values.settings = values.settings || {};\n values.settings.objectId = this.object.id;\n values.settings.fieldId = this.id;\n\n const ABFieldPlaceholder = application.viewNew(\n values,\n application,\n parent\n ); // ABViewManager.newView(values, application, parent);\n // ABFieldPlaceholder.formatTitle();\n // ABFieldPlaceholder.text = \"ABFieldPlaceholder\";\n\n return ABFieldPlaceholder;\n },\n };\n return FC;\n }\n\n /**\n * @method detailComponent\n */\n detailComponent() {\n return {\n common: () => {\n return {\n icon: \"square\",\n };\n },\n\n // .newInstance() is used to create the view instance when the component\n // \t\tis dropped onto the ABView list.\n newInstance: (application, parent) => {\n application = application ?? this.AB._mockApp;\n\n // store object id and field id to field component\n const values = this.detailComponent().common();\n values.settings = values.settings || {};\n values.settings.objectId = this.object.id;\n values.settings.fieldId = this.id;\n\n const ABFieldPlaceholder = application.viewNew(\n values,\n application,\n parent\n ); // ABViewManager.newView(values, application, parent);\n\n return ABFieldPlaceholder;\n },\n };\n }\n\n /**\n * @method getSettings()\n * return a copy of this.settings.\n * @return {object}\n */\n getSettings() {\n return Object.assign({}, this.settings);\n }\n\n /**\n * @method warningsMessage()\n * generate a commonly formatted warning message for this ABField.\n * This is expected to be called from within a .warningsEval()\n * method when generating warnings.\n * @param {string} msg\n * the warning string to display\n * @param {json} data\n * any relevant additional information for a developer to refer to.\n */\n warningsMessage(msg, data = {}) {\n let message = `${this.fieldKey()}[${this.label}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n\n async getDbInfo() {\n return this.AB.Network.get({\n url: `/definition/info/object/${this.object.id}/field/${this.id}`,\n });\n }\n\n /**\n * @method formCleanData()\n * Review the data a form is about to submit and change/remove it as\n * appropriate.\n * @param {obj} rowData\n * The {data} a form has collected and is about to save.\n * @return {undefined}\n */\n formCleanData(rowData) {\n // default is to just leave data as is.\n }\n};\n","const ABFieldAutoIndexCore = require(\"../../core/dataFields/ABFieldAutoIndexCore\");\n\nmodule.exports = class ABFieldAutoIndex extends ABFieldAutoIndexCore {\n // constructor(values, object) {\n // super(values, object);\n // }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldAutoIndex\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = null; // read only\n config.css = \"textCell\";\n config.template = (rowData) => {\n // if this isn't part of a group header display the default format\n if (!rowData.$group) {\n return this.format(rowData);\n } else {\n return \"\";\n }\n };\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"fieldreadonly\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-fieldreadonly\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","const ABFieldBooleanCore = require(\"../../core/dataFields/ABFieldBooleanCore\");\n\nmodule.exports = class ABFieldBoolean extends ABFieldBooleanCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldBoolean\n columnHeader(options) {\n options = options || {};\n\n const config = super.columnHeader(options);\n\n config.editor = \"template\";\n config.css = \"center\";\n config.template = (row, common, value, config) => {\n // Group header\n if (row.$group) return row[this.columnName];\n\n // editable\n if (options.editable) {\n return (\n '
' +\n common.checkbox(row, common, value, config) +\n \"
\"\n );\n }\n\n // readonly\n else {\n if (value)\n return \"
\";\n else return \"
\";\n }\n };\n\n return config;\n }\n\n /**\n * @method formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"checkbox\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-checkbox\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailcheckbox\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","const ABFieldCalculateCore = require(\"../../core/dataFields/ABFieldCalculateCore\");\n\nmodule.exports = class ABFieldCalculate extends ABFieldCalculateCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldCalculate\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = null; // read only\n config.css = \"textCell\";\n config.template = (rowData) => {\n if (rowData.$group) return rowData[this.columnName];\n\n return this.format(rowData);\n };\n\n return config;\n }\n\n /**\n * @method formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"fieldreadonly\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-fieldreadonly\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","const ABFieldCombineCore = require(\"../../core/dataFields/ABFieldCombineCore\");\n\nmodule.exports = class ABFieldCombine extends ABFieldCombineCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldCombine\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = null; // read only\n config.css = \"textCell\";\n config.template = (rowData) => {\n // if this isn't part of a group header display the default format\n if (!rowData.$group) {\n return this.format(rowData);\n } else {\n return \"\";\n }\n };\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"fieldreadonly\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-fieldreadonly\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n warningsEval() {\n super.warningsEval();\n\n (this.settings.combinedFields.split(\",\") || []).forEach((id) => {\n var field = this.object.fieldByID(id);\n if (!field) {\n this.warningsMessage(`dependent field[${id}] not found.`, {\n fieldID: id,\n combinedFields: this.settings.combinedFields,\n });\n }\n });\n }\n};\n","const ABFieldConnectCore = require(\"../../core/dataFields/ABFieldConnectCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABFieldConnect extends ABFieldConnectCore {\n constructor(values, object, fieldDefaults) {\n super(values, object, fieldDefaults);\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABApplication\n *\n * also remove it from our _AllApplications\n *\n * @return {Promise}\n */\n async destroy() {\n // verify we have been .save()d before:\n if (!this.id) return Promise.resolve();\n\n // NOTE: our .migrateXXX() routines expect the object to currently exist\n // in the DB before we perform the DB operations. So we need to\n // .migrateDrop() before we actually .objectDestroy() this.\n // this.migrateDrop()\n // // .then(() => {\n // // // NOTE : prevent recursive remove connected fields\n // // // - remove this field from JSON\n // // this.object._fields = this.object.fields((f) => {\n // // return f.id != this.id;\n // // });\n // // })\n // .then(() => {\n // // Save JSON of the object\n // return this.object.fieldRemove(this);\n // })\n await super.destroy();\n\n // Now we need to remove our linked Object->field\n\n const linkObject = this.datasourceLink;\n if (!linkObject) return Promise.resolve(); // already notified\n\n const linkField = this.fieldLink;\n if (!linkField) return Promise.resolve(); // already notified\n\n // destroy linked field\n return linkField.destroy();\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method pullRelationValues\n *\n * On the Web client, we want our returned relation values to be\n * ready for Webix objects that require a .text and .value field.\n *\n * @param {*} row\n * @return {array}\n */\n pullRelationValues(row) {\n let selectedData = [];\n\n const data = super.pullRelationValues(row);\n const linkedObject = this.datasourceLink;\n\n if (data && linkedObject) {\n // if this select value is array\n if (Array.isArray(data)) {\n selectedData = data.map(function (d) {\n // display label in format\n if (d) {\n d.text = d.text || linkedObject.displayData(d);\n d.value = d.text;\n }\n\n return d;\n });\n } else if (data.id || data.uuid) {\n selectedData = data;\n selectedData.text =\n selectedData.text || linkedObject.displayData(selectedData);\n selectedData.value = selectedData.text;\n } else if (typeof data == \"string\") {\n selectedData = { text: data };\n }\n }\n\n return selectedData;\n }\n\n columnHeader(options) {\n options = options || {};\n const config = super.columnHeader(options);\n const field = this;\n const App = field.AB._App;\n\n if (options.filters == null) {\n options.filters = {};\n }\n\n var multiselect = this.settings.linkType == \"many\";\n\n config.editor = multiselect ? \"multiselect\" : \"combo\";\n config.editFormat = (value) => {\n return this.editFormat(value);\n };\n config.editParse = (value) => {\n return this.editParse(value);\n };\n config.template = (row) => {\n var selectedData = field.pullRelationValues(row);\n var values = [];\n values.push('
');\n if (\n selectedData &&\n Array.isArray(selectedData) &&\n selectedData.length\n ) {\n selectedData.forEach((val) => {\n values.push(\n `
${val.value}
`\n );\n });\n if (selectedData.length > 1) {\n values.push(\n `${selectedData.length}`\n );\n }\n } else if (selectedData.value) {\n let clear = \"\";\n if (options.editable) {\n clear = ``;\n }\n values.push(\n `
${clear}${selectedData.value}
`\n );\n } else {\n return \"\";\n }\n values.push(\"
\");\n return values.join(\"\");\n };\n\n config.suggest = {\n on: {\n onBeforeShow: function () {\n field.openOptions(this);\n },\n },\n\n // Support partial matches\n filter: ({ value }, search) =>\n (value ?? \"\").toLowerCase().includes((search ?? \"\").toLowerCase()),\n };\n\n if (multiselect) {\n config.suggest.view = \"checksuggest\";\n config.suggest.button = true;\n }\n\n return config;\n }\n\n openOptions($suggest) {\n // PREVENT repeatedly pull data:\n // If not a x->1 relation and the options list was populated, then skip\n const $list = $suggest.getList();\n if (this.settings.linkViaType != \"one\") {\n if (($list?.find({}) ?? []).length) return;\n }\n\n // Listen create/update events of the linked object, then clear data list to re-populate\n [\"create\", \"update\"].forEach((key) => {\n if (this[`_dc_${key}_event`]) return;\n\n this[`_dc_${key}_event`] = this.AB.on(\n `ab.datacollection.${key}`,\n (res) => {\n if (this.datasourceLink.id == res.objectId) $list.clearAll();\n }\n );\n });\n\n this.getAndPopulateOptions($suggest, null, this);\n }\n\n /*\n * @function customEdit\n *\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n * unique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n\n //// NOTE: why do we pass in row, App, and node? is this something we do in our external components?\n //// are these values present when this Object is instanciated? Can't we just pass these into the\n //// object constructor and have it internally track these things?\n customEdit(row, /*App,*/ node) {\n // var selectedData = this.pullRelationValues(row);\n // this._selectedData = selectedData;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"connect\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-connect\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailconnect\",\n };\n };\n\n return detailComponentSetting;\n }\n\n /**\n * @method getOptions\n * show options list in selectivity\n *\n * @return {Promise}\n */\n async getOptions(whereClause, term, sort, editor, populate = false) {\n const theEditor = editor;\n\n if (theEditor) {\n // PREVENT: repeatly refresh data too often\n if (theEditor._getOptionsThrottle) {\n clearTimeout(theEditor._getOptionsThrottle);\n // NOTE: remove variables that reference the Promise and Resolve to let GC cleans up.\n // https://dev.to/xnimorz/js-promises-3-garbage-collection-and-memory-leaks-2oi7?fbclid=IwAR1wqgNz2KqchaM7eRkclR6YWHT01eva4y5IWpnaY0in6BrxmTAtpNCnEXM\n delete theEditor._timeToPullData;\n delete theEditor._getOptionsResolve;\n }\n theEditor._timeToPullData = await new Promise((resolve) => {\n theEditor._getOptionsResolve = resolve;\n theEditor._getOptionsThrottle = setTimeout(() => {\n resolve(true);\n }, 100);\n });\n if (!theEditor._timeToPullData) return;\n }\n\n return new Promise((resolve, reject) => {\n let haveResolved = false;\n // {bool}\n // have we already passed back a result?\n\n const respond = (options) => {\n // filter the raw lookup with the provided search term\n options = options.filter((item) => {\n if (item.text.toLowerCase().includes(term.toLowerCase())) {\n return true;\n }\n });\n\n if (!haveResolved) {\n haveResolved = true;\n resolve(options);\n } else {\n // if we have already resolved() then .emit() that we have\n // updated \"option.data\".\n this.emit(\"option.data\", options);\n }\n };\n\n // Prepare Where clause\n\n const where = this.AB.cloneDeep(whereClause || {});\n sort = sort || [];\n\n if (!where.glue) where.glue = \"and\";\n\n if (!where.rules) where.rules = [];\n\n term = term || \"\";\n\n // check if linked object value is not define, should return a empty array\n if (!this.settings.linkObject) return [];\n\n // if options was cached\n // if (this._options != null) return resolve(this._options);\n\n const linkedObj = this.datasourceLink;\n\n // System could not found the linked object - It may be deleted ?\n if (linkedObj == null) throw new Error(\"No linked object\");\n\n const linkedCol = this.fieldLink;\n\n // System could not found the linked field - It may be deleted ?\n if (linkedCol == null) throw new Error(\"No linked column\");\n\n // Get linked object model\n const linkedModel = linkedObj.model();\n\n // M:1 - get data that's only empty relation value\n if (\n this.settings.linkType == \"many\" &&\n this.settings.linkViaType == \"one\" &&\n editor?.config?.showAllOptions != true\n ) {\n where.rules.push({\n key: linkedCol.id,\n rule: \"is_null\",\n });\n // where[linkedCol.columnName] = null;\n }\n // 1:1\n else if (\n this.settings.linkType == \"one\" &&\n this.settings.linkViaType == \"one\" &&\n editor?.config?.showAllOptions != true\n ) {\n // 1:1 - get data is not match link id that we have\n if (this.settings.isSource == true) {\n // NOTE: make sure \"haveNoRelation\" shows up as an operator\n // the value \":0\" doesn't matter, we just need 'haveNoRelation' as an operator.\n // newRule[linkedCol.id] = { 'haveNoRelation': 0 };\n where.rules.push({\n key: linkedCol.id,\n rule: \"have_no_relation\",\n });\n }\n // 1:1 - get data that's only empty relation value by query null value from link table\n else {\n where.rules.push({\n key: linkedCol.id,\n rule: \"is_null\",\n });\n // newRule[linkedCol.id] = 'null';\n // where[linkedCol.id] = null;\n }\n }\n\n const storageID = this.getStorageID(where);\n\n Promise.resolve()\n .then(async () => {\n // Mar 23, 2023 disabling local storage of options because users\n // were reporting not seeing the correct options list with either\n // new, updated or deleted records that should or should not appear\n return false;\n // Get Local Storage unless xxx->one connected field\n // if (this?.settings?.linkViaType != \"one\") {\n // // We store the .findAll() results locally and return that for a\n // // quick response:\n // return await this.AB.Storage.get(storageID);\n // }\n })\n .then(async (storedOptions) => {\n if (storedOptions) {\n // immediately respond with our stored options.\n this._options = storedOptions;\n return respond(this._options);\n }\n // Pull linked object data\n let options = function () {\n return linkedModel.findAll({\n where: where,\n sort: sort,\n populate,\n });\n };\n\n // placeholder for selected options\n let selected = function () {\n return new Promise((resolve, reject) => {\n // empty data array to pass to all()\n resolve({ data: [] });\n });\n };\n\n const selectedValue = theEditor?.config?.value;\n\n // we also need to get selected values of xxx->one connections\n // if we are looking at a field in a form we look at linkViaOneValues\n // if we are looking at a grid we are editing we look at theEditor?.config?.value\n if (\n // this?.settings?.linkViaType == \"one\" &&\n this?.linkViaOneValues ||\n (!Array.isArray(selectedValue) && selectedValue) ||\n (Array.isArray(selectedValue) && selectedValue.length)\n ) {\n let values = \"\";\n // determine if we are looking in a grid or at a form field\n if (\n (theEditor?.config?.view == \"multicombo\" ||\n theEditor?.config?.view == \"combo\") &&\n this?.linkViaOneValues\n ) {\n values = this?.linkViaOneValues;\n } else if (theEditor?.config?.value) {\n if (Array.isArray(theEditor.config.value)) {\n values = theEditor?.config?.value.join();\n } else {\n values = theEditor?.config?.value;\n }\n }\n let whereRels = {};\n let sortRels = [];\n\n whereRels.glue = \"or\";\n whereRels.rules = [];\n\n // make sure values are unique:\n let valHash = {};\n values.split(\",\").forEach((v) => {\n if (v) valHash[v] = v;\n });\n Object.keys(valHash).forEach((v) => {\n whereRels.rules.push({\n key: linkedObj.PK(),\n rule: \"equals\",\n value: v,\n });\n });\n selected = function () {\n return linkedModel.findAll({\n where: whereRels,\n sort: sortRels,\n populate: false,\n });\n };\n }\n try {\n const results = await Promise.all([options(), selected()]);\n\n // combine options and selected items and\n // put the selected options at the top of the list\n const result = results[1].data.concat(results[0].data);\n\n // store results in _options\n this._options = result.data || result || [];\n\n // populate display text\n (this._options || []).forEach((opt) => {\n opt.text = linkedObj.displayData(opt);\n opt.value = opt.text;\n });\n\n // 8/10/2023 - We are not actually using this (see line 338) - If we need to store\n // user data in local storage we should encrypt it.\n // cache options if not a xxx->one connection\n // if (this?.settings?.linkViaType != \"one\") {\n // this.AB.Storage.set(storageID, this._options);\n // }\n return respond(this._options);\n } catch (err) {\n this.AB.notify.developer(err, {\n context:\n \"ABFieldConnect:getOptions(): unable to retrieve options from server\",\n field: this.toObj(),\n where,\n });\n\n haveResolved = true;\n throw err;\n }\n });\n });\n }\n\n getStorageID(where) {\n return `${this.id}-${JSON.stringify(where)}`;\n }\n\n async clearStorage(where) {\n const storageID = this.getStorageID(where);\n await this.AB.Storage.set(storageID, null);\n }\n\n editFormat(value) {\n if (!value) return \"\";\n let vals = [];\n if (Array.isArray(value)) {\n value.forEach((val) => {\n if (typeof val == \"object\") {\n vals.push(val.id);\n } else {\n let itemObj = this.getItemFromVal(val);\n if (itemObj && itemObj.id) {\n vals.push(itemObj.id);\n } else {\n vals.push(val);\n }\n }\n });\n } else {\n if (typeof value == \"object\") {\n vals.push(value.id);\n } else {\n let itemObj = this.getItemFromVal(value);\n if (itemObj && itemObj.id) {\n vals.push(itemObj.id);\n } else {\n vals.push(value);\n }\n }\n }\n return vals.join();\n }\n\n editParse(value) {\n var multiselect = this.settings.linkType == \"many\";\n if (multiselect) {\n if (!value) {\n return [];\n } else {\n let returnVals = [];\n let vals = value;\n if (typeof value == \"string\") vals = value.split(\",\");\n vals.forEach((val) => {\n returnVals.push(this.getItemFromVal(val));\n });\n return returnVals;\n }\n } else {\n let item = this.getItemFromVal(value);\n return item;\n }\n }\n\n getAndPopulateOptions(editor, options, field, form) {\n if (!editor) return Promise.resolve([]);\n\n const theEditor = editor;\n // if editor has options and is xxx->one store the options on the field\n if (\n this?.settings?.linkViaType == \"one\" &&\n theEditor.getValue() &&\n !field.linkViaOneValues\n ) {\n field.linkViaOneValues = theEditor.getValue();\n }\n\n // if we are filtering based off another selectivity's value we\n // need to do it on fetch each time because the value can change\n // copy the filters so we don't add to them every time there is a change\n const combineFilters = options?.filters\n ? Object.assign({}, options.filters)\n : { glue: \"and\", rules: [] };\n\n if (options?.filterByConnectValues) {\n const parseFilterByConnectValues = (conditions, values, depth = 0) => {\n const valuesByDepth = values.filter((e) => e?.depth === depth);\n\n return [\n ...conditions.rules.map((e) => {\n if (e.glue)\n return {\n glue: e.glue,\n rules: parseFilterByConnectValues(e, values, depth + 1),\n };\n\n const value = valuesByDepth.filter(\n (ef) => ef.key === e.key && ef.value === e.value\n )[0];\n\n if (!value) return e;\n\n const $parentField = value?.filterValue?.config.id\n ? $$(value.filterValue.config.id)\n : null;\n\n if (!$parentField)\n throw Error(\n \"Some parent field's view components don't exist\"\n );\n\n const parentValue = value?.filterValue\n ? $parentField.getValue() ?? \"\"\n : \"\";\n\n let newVal = \"\";\n\n if (parentValue) {\n if (value.filterColumn) {\n const filterField = field.object.fieldByID(\n value.filterValue.config.dataFieldId\n );\n let valItem;\n\n // When options does not load yet, then pull select value from DC\n if (!filterField._options?.length) {\n const linkedField =\n (form.datacollection.datasource?.fields(\n (f) =>\n f.id == value.value ||\n f.columnName == value.value\n ) ?? [])[0];\n\n if (linkedField) {\n // Get values from DC\n const formVals = form.datacollection?.getCursor();\n\n valItem =\n formVals[linkedField.relationName()] ??\n formVals[value.value];\n }\n } else {\n valItem = filterField.getItemFromVal(parentValue);\n }\n\n if (valItem) {\n newVal = valItem[value.filterColumn];\n } else {\n newVal = parentValue;\n }\n } else {\n newVal = parentValue;\n }\n }\n\n return {\n key: e.key,\n rule: \"equals\",\n value: newVal,\n };\n }),\n ];\n };\n\n combineFilters.rules = parseFilterByConnectValues(\n combineFilters,\n options.filterByConnectValues\n );\n }\n\n if (!this.handlerOptionData) {\n this.handlerOptionData = (data) => {\n if (theEditor.$destructed) {\n this.removeListener(\"option.data\", this.handlerOptionData);\n return;\n }\n this.populateOptions(theEditor, data, field, form, true);\n };\n }\n\n // try to make sure we don't continually add up listeners.\n this.removeListener(\"option.data\", this.handlerOptionData).once(\n \"option.data\",\n this.handlerOptionData\n );\n\n return new Promise((resolve, reject) => {\n this.getOptions(\n combineFilters,\n \"\",\n options?.sort ?? \"\",\n theEditor\n ).then(async (data) => {\n await this.populateOptions(theEditor, data, field, form, true);\n resolve(data);\n });\n });\n }\n\n async populateOptions(theEditor, data, field, form, addCy) {\n if (theEditor == null || theEditor.$destructed) return;\n\n await this._sortByRecent(data);\n\n theEditor.blockEvent();\n theEditor.getList().clearAll();\n theEditor.getList().define(\"data\", data);\n if (addCy) {\n this.populateOptionsDataCy(theEditor, field, form);\n }\n if (theEditor.getValue?.() && data?.length) {\n let currVal = theEditor.getValue();\n // in a multiselect environment, the current val can be an encoded string:\n // \"id1,id2\". Break this into an array:\n if (field.linkType() == \"many\" && typeof currVal == \"string\") {\n currVal = currVal.split(\",\");\n }\n if (!Array.isArray(currVal)) {\n currVal = [currVal];\n }\n\n let selectedVals = [];\n currVal.forEach((cVal) => {\n // Check exists item\n const isExists = data.some((d) => d.id == cVal);\n\n if (isExists) {\n selectedVals.push(cVal);\n }\n\n // if we couldn't find it by it's .id, then check to see\n // if there is a custom index (.indexField .indexField2)\n // that does match.\n // Select option item from custom index value\n if (\n !isExists &&\n field.isConnection &&\n (field.indexField || field.indexField2)\n ) {\n const selectedItem = data.filter(\n (d) =>\n d[field.indexField?.columnName ?? \"\"] == cVal ||\n d[field.indexField2?.columnName ?? \"\"] == cVal\n )[0];\n\n if (selectedItem) selectedVals.push(selectedItem.id);\n }\n });\n\n theEditor.setValue(selectedVals);\n }\n theEditor.unblockEvent();\n }\n\n populateOptionsDataCy(theEditor, field, form) {\n if (theEditor?.$destructed) return;\n\n // Add data-cy attributes\n if (theEditor?.getList) {\n if (!theEditor.getPopup) return;\n var popup = theEditor.getPopup();\n if (!popup) return;\n theEditor.getList().data.each((option) => {\n if (!option) return;\n var node = popup.$view.querySelector(\n \"[webix_l_id='\" + option.id + \"']\"\n );\n if (!node) return;\n node.setAttribute(\n \"data-cy\",\n `${field.key} options ${option.id} ${field.id} ${form?.id}`\n );\n });\n }\n }\n\n getItemFromVal(val) {\n let item;\n let options = this._options || [];\n if (options.length > 0) {\n for (let i = 0; i < options.length; i++) {\n if (\n this.indexField &&\n options[i][this.indexField.object.PK()] == val\n ) {\n item = options[i];\n break;\n } else if (\n this.indexField2 &&\n options[i][this.indexField2.object.PK()] == val\n ) {\n item = options[i];\n break;\n } else {\n if (\n options[i].id == val ||\n options[i].value == val ||\n options[i][this.indexField?.columnName ?? \"\"] == val ||\n options[i][this.indexField2?.columnName ?? \"\"] == val\n ) {\n item = options[i];\n break;\n }\n }\n }\n return item;\n } else {\n return \"\";\n }\n }\n\n getValue(item) {\n let val = item.getValue();\n var multiselect = this.settings.linkType == \"many\";\n if (multiselect) {\n let vals = [];\n if (!Array.isArray(val)) {\n if (val) {\n val = val.split(\",\");\n val.forEach((record) => {\n // make sure we are returning the .uuid values and\n // not full {Record} values.\n vals.push(\n this.getRelationValue(item.getList().getItem(record), {\n forUpdate: true,\n })\n );\n });\n }\n } else {\n vals = val;\n }\n\n return vals;\n } else {\n if (val) {\n // return just the .uuid and not the full {Record}\n return this.getRelationValue(item.getList().getItem(val));\n } else {\n return \"\";\n }\n }\n }\n\n setValue(item, rowData) {\n if (!item) return;\n // if (AB.isEmpty(rowData)) return; removed because sometimes we will\n // want to set this to empty\n let val = this.pullRelationValues(rowData);\n // put in current values as options so we can display them before\n // the rest of the options are fetched when field is clicked\n if (item.getList && item.getList().count() == 0) {\n if (this.settings.linkType !== \"one\" && !Array.isArray(val)) {\n val = [val];\n }\n\n const $list = item.getList();\n\n $list.define(\"data\", val);\n $list.refresh();\n }\n\n // try to prevent form flicker:\n // Only reset the value if the value changes:\n let currVal = item.getValue();\n let newVal = Array.isArray(val)\n ? val\n .map(\n (e) =>\n this.getRelationValue(e, { forUpdate: true }) ??\n e.id ??\n e.uuid ??\n e\n )\n .join(\",\")\n : this.getRelationValue(val, { forUpdate: true }) ??\n val.id ??\n val.uuid ??\n val;\n if (currVal != newVal) {\n item.setValue(newVal);\n }\n }\n\n /**\n * @method pullRecordRelationValues\n *\n * On the Web client, we want our returned relation values to be\n * ready for Webix objects that require a .text and .value field.\n *\n * @param {*} row\n * @return {array}\n */\n pullRecordRelationValues(record) {\n var selectedData = [];\n\n var data = record;\n var linkedObject = this.datasourceLink;\n\n if (data && linkedObject) {\n // if this select value is array\n if (Array.isArray(data)) {\n selectedData = data.map(function (d) {\n // display label in format\n if (d) {\n d.text = d.text || linkedObject.displayData(d);\n d.value = d.text;\n }\n\n return d;\n });\n } else if (data.id || data.uuid) {\n selectedData = data;\n selectedData.text =\n selectedData.text || linkedObject.displayData(selectedData);\n selectedData.value = selectedData.text;\n }\n }\n\n return selectedData;\n }\n\n warningsEval() {\n super.warningsEval();\n\n var linkField = this.fieldLink;\n if (!linkField) {\n this.warningsMessage(\n `is unable to find linked field[${this.settings.linkColumn}]`,\n {\n linkColumn: this.settings.linkColumn,\n }\n );\n }\n\n let linkObj = this.datasourceLink;\n if (!linkObj) {\n this.warningsMessage(\n `is unable to find linked object[${this.settings.linkObject}]`,\n {\n linkObject: this.settings.linkObject,\n }\n );\n }\n }\n\n get _recentStorageId() {\n return `${this.id}_recent_selected`;\n }\n\n /**\n * @method saveSelect\n * This function stores the user's selected option in local storage.\n * It ensures that the user's recent selection is saved, allowing the system\n * to retrieve it and provide a more personalized experience during future visits.\n * @param {Array} selectedItems\n * @return {Promise}\n */\n async saveSelect(selectedItems) {\n if (!selectedItems) return;\n\n if (!Array.isArray(selectedItems)) selectedItems = [selectedItems];\n\n let recentSelected =\n (await this.AB.Storage.get(this._recentStorageId)) ?? [];\n\n selectedItems.forEach((item) => {\n if (item == null) return;\n\n const itemId = item.uuid ?? item.id ?? item;\n recentSelected = recentSelected.filter((id) => id != itemId);\n recentSelected.unshift(itemId);\n });\n\n return this.AB.Storage.set(this._recentStorageId, recentSelected);\n }\n\n /**\n * @method _sortByRecent\n * This function sorts the options based on the user's most recently selected item, which is retrieved from local storage.\n *\n * @param {Array} options\n */\n async _sortByRecent(options) {\n if (!options?.length) return options;\n\n const recentSelected = await this.AB.Storage.get(this._recentStorageId);\n if (!recentSelected?.length) return options;\n\n if (!Array.isArray(options)) options = [options];\n\n options.sort((a, b) => {\n const aId = a.uuid ?? a.id ?? a;\n const bId = b.uuid ?? b.id ?? b;\n\n return recentSelected.indexOf(bId) - recentSelected.indexOf(aId);\n });\n }\n};\n","const ABFieldDateCore = require(\"../../core/dataFields/ABFieldDateCore\");\n\nmodule.exports = class ABFieldDate extends ABFieldDateCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldDate\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n // if (this.settings.includeTime)\n // config.editor = \"datetime\";\n // else\n config.editor = this.AB.Account?.language() == \"th\" ? \"thaidate\" : \"date\";\n\n // allows entering characters in datepicker input, false by default\n config.editable = true;\n\n // NOTE: it seems that the default value is a string in ISO format.\n\n //// NOTE: webix seems unable to parse ISO string into => date here.\n // config.map = '(date)#'+this.columnName+'#'; // so don't use this.\n\n config.template = (row) => {\n if (row.$group) return row[this.columnName];\n\n return this.format(row);\n };\n\n config.format = (d) => {\n const rowData = {};\n rowData[this.columnName] = d;\n\n return this.format(rowData);\n };\n\n config.editFormat = (d) => {\n // this routine needs to return a Date() object for the editor to work with.\n\n if (d == \"\" || d == null) {\n return \"\";\n }\n\n // else retun the actual ISO string => Date() value\n return this.AB.rules.toDate(d);\n };\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent(\"datepicker\");\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"datepicker\",\n };\n };\n\n return formComponentSetting;\n }\n\n formComponentMobile() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent(\"mobile-date\");\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"mobile-date\",\n };\n };\n\n return formComponentSetting;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n dateToString(dateFormat, dateData) {\n return webix.Date.dateToStr(dateFormat)(dateData);\n }\n\n // Overwrite core.format to use webix locales.\n format(rowData) {\n if (!window.webixLocale) return super.format(rowData);\n const d = this.dataValue(rowData);\n\n if (d == \"\" || d == null) {\n return \"\";\n }\n const dateObj = this.AB.rules.toDate(d);\n\n const dateFormat = this.settings.dateFormat;\n // @const {int} dateFormat AB Date Format\n // 1 - ignore, 2 - dd/mm/yyyy, 3 - mm/dd/yyyy, 4 - M D, yyyy, 5 - D M, yyyy\n\n // Return longdate if option 4 or 5\n if (dateFormat >= 4) {\n return webix.i18n.longDateFormatStr(dateObj);\n } else {\n return webix.i18n.dateFormatStr(dateObj);\n }\n }\n};\n","const ABFieldDateTimeCore = require(\"../../core/dataFields/ABFieldDateTimeCore\");\n\nmodule.exports = class ABFieldDateTime extends ABFieldDateTimeCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n // isValid() {\n // const validator = super.isValid();\n\n // // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n // return validator;\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldDate\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n // Ignore date\n if (this.settings.dateFormat == 1) {\n config.editor = \"time\";\n } else {\n config.editor =\n this.AB.Account?._config?.languageCode == \"th\"\n ? \"thaidatetime\"\n : \"datetime\";\n }\n\n // allows entering characters in datepicker input, false by default\n config.editable = true;\n\n // NOTE: it seems that the default value is a string in ISO format.\n\n //// NOTE: webix seems unable to parse ISO string into => date here.\n // config.map = '(date)#'+this.columnName+'#'; // so don't use this.\n\n config.template = (row) => {\n if (row.$group) return row[this.columnName];\n\n return this.format(row);\n };\n\n config.format = (d) => {\n const rowData = {};\n rowData[this.columnName] = d;\n\n return this.format(rowData);\n };\n\n config.editFormat = (d) => {\n // this routine needs to return a Date() object for the editor to work with.\n\n if (d == \"\" || d == null) {\n return \"\";\n }\n\n // else retun the actual ISO string => Date() value\n return this.AB.rules.toDate(d);\n };\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent(\"datepicker\");\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"datepicker\",\n };\n };\n\n return formComponentSetting;\n }\n\n formComponentMobile() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent(\"mobile-datetime\");\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"mobile-datetime\",\n };\n };\n\n return formComponentSetting;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n // Overwrite core.format to use webix locales.\n format(rowData) {\n if (!window.webixLocale) return super.format(rowData);\n const d = this.dataValue(rowData);\n\n if (d == \"\" || d == null) {\n return \"\";\n }\n const dateObj = this.AB.rules.toDate(d);\n\n const dateFormat = this.settings.dateFormat;\n // @const {int} dateFormat AB Date Format\n // 1 - ignore, 2 - dd/mm/yyyy, 3 - mm/dd/yyyy, 4 - M D, yyyy, 5 - D M, yyyy\n const timeToStr = webix.Date.dateToStr(this.getTimeFormat());\n\n if (dateFormat >= 4) {\n return `${webix.i18n.longDateFormatStr(dateObj)} ${timeToStr(\n dateObj\n )}`;\n } else {\n return `${webix.i18n.dateFormatStr(dateObj)} ${timeToStr(dateObj)}`;\n }\n }\n};\n","const ABFieldEmailCore = require(\"../../core/dataFields/ABFieldEmailCore\");\n\nmodule.exports = class ABFieldEmail extends ABFieldEmailCore {\n // constructor(values, object) {\n // super(values, object);\n // }\n\n ///\n /// Instance Methods\n ///\n\n // isValid() {\n // const validator = super.isValid();\n\n // // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n // return validator;\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldBoolean\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = \"text\";\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"textbox\",\n settings: {\n type: \"single\",\n },\n };\n };\n\n return formComponentSetting;\n }\n\n formComponentMobile() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"mobile-email\",\n settings: {},\n };\n };\n\n return formComponentSetting;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","const ABFieldFileCore = require(\"../../core/dataFields/ABFieldFileCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABFieldFile extends ABFieldFileCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n /**\n * @function destroy\n * On a destroy operation, ask if the user wants to keep the related file.\n */\n async destroy() {\n return new Promise((resolve, reject) => {\n // verify we have been .save()d before:\n if (!this.id) {\n resolve();\n return;\n }\n\n // Ask the user what to do about the existing file:\n webix.confirm({\n title: L(\"Keep Files?\"),\n message: L(\"Do you want to keep the files referenced by {0}?\", [\n this.label,\n ]),\n callback: async (result) => {\n // update this setting so the server can respond correctly in\n // ABFieldFile.migrateDrop()\n this.settings.removeExistingData = result ? 0 : 1;\n\n try {\n await this.save();\n\n // TODO: a reminder that you still got alot on the server to do!\n webix.alert({\n title: \"!! TODO !!\",\n text: \"Tell a Developer to actually pay attention to this!\",\n });\n\n // now the default .destroy()\n await super.destroy();\n\n resolve();\n } catch (err) {\n reject(err);\n }\n },\n });\n });\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldFile\n columnHeader(options) {\n options = options || {};\n\n const config = super.columnHeader(options);\n\n config.editor = false;\n\n const editable = options.editable;\n\n // populate our default template:\n config.template = (obj) => {\n if (obj.$group) return this.dataValue(obj);\n\n const fileDiv = [\n '
',\n '
',\n '
',\n this.fileTemplate(obj, editable),\n \"
\",\n \"
\",\n \"
\",\n ].join(\"\");\n\n return fileDiv;\n };\n\n return config;\n }\n\n /*\n * @function customDisplay\n * perform any custom display modifications for this field.\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customDisplay(row, App, node, options) {\n // sanity check.\n if (!node) {\n return;\n }\n options = options || {};\n\n let typesList = [];\n let maximumSize = 0;\n\n if (this.settings.limitFileType && this.settings.fileType) {\n typesList = this.settings.fileType.split(\",\");\n }\n\n if (this.settings.limitFileSize && this.settings.fileSize) {\n maximumSize = this.settings.fileSize;\n }\n\n // \t\t// safety check:\n // \t\t// webix seems to crash if you specify a .container that doesn't exists:\n // \t\t// Note: when the template is first created, we don't have App.unique()\n const parentContainer = node.querySelector(\".ab-file-holder\");\n if (parentContainer) {\n parentContainer.innerHTML = \"\";\n // parentContainer.id = idBase;\t// change it to the unique one.\n\n // \t\t\t// use a webix component for displaying the content.\n // \t\t\t// do this so I can use the progress spinner\n\n const webixContainer = webix.ui({\n view: \"template\",\n container: parentContainer,\n\n template: this.fileTemplate(row, options.editable),\n\n borderless: true,\n width: 160,\n height: 60,\n });\n webix.extend(webixContainer, webix.ProgressBar);\n\n // \t\t\t////\n // \t\t\t//// Prepare the Uploader\n // \t\t\t////\n\n if (!options.editable) {\n const domNode = parentContainer.querySelector(\".delete-image\");\n if (domNode) domNode.style.display = \"none\";\n\n return;\n }\n\n const url = this.urlUpload(true);\n\n const uploader = webix.ui({\n view: \"uploader\",\n apiOnly: true,\n upload: url,\n inputName: \"file\",\n multiple: false,\n on: {\n // when a file is added to the uploader\n onBeforeFileAdd: function (item) {\n node.classList.remove(\"webix_invalid\");\n node.classList.remove(\"webix_invalid_cell\");\n\n // verify file type\n const acceptableTypes = typesList;\n if (acceptableTypes && acceptableTypes != \"\") {\n const type = item.type.toLowerCase();\n if (acceptableTypes.indexOf(type) == -1) {\n webix.message(\n L(\"Only [{0}] files are supported\", [\n acceptableTypes.join(\", \"),\n ])\n );\n return false;\n }\n }\n\n //verify file size\n //Convert to MegaBytes\n if (maximumSize > 0) {\n const acceptableSizes = maximumSize * 1000000;\n if (item.size > acceptableSizes) {\n webix.message(\n L(\"Maximum file size is {0}MB\", [maximumSize])\n );\n return false;\n }\n }\n\n // start progress indicator\n webixContainer.showProgress({\n type: \"icon\",\n delay: 2000,\n });\n },\n\n // when upload is complete:\n onFileUpload: async (item, response) => {\n webixContainer.hideProgress();\n // this.showFile(idBase, response.data.uuid);\n\n const values = {};\n values[this.columnName] = {};\n values[this.columnName].uuid = response.data.uuid;\n values[this.columnName].filename = item.name;\n\n // update just this value on our current object.model\n if (row.id) {\n try {\n await this.object.model().update(row.id, values);\n\n // update the client side data object as well so other data changes won't cause this save to be reverted\n if ($$(node) && $$(node).updateItem)\n $$(node).updateItem(row.id, values);\n } catch (err) {\n node.classList.add(\"webix_invalid\");\n node.classList.add(\"webix_invalid_cell\");\n\n this.AB.notify.developer(err, {\n context:\n \"ABFieldFile.onFileUpload(): Error updating our entry.\",\n row: row,\n values: values,\n });\n }\n }\n\n // update value in the form component\n this.setValue($$(node), values);\n },\n\n // if an error was returned\n onFileUploadError: (item, response) => {\n this.AB.notify.developer(new Error(\"Error loading file\"), {\n message:\n \"ABFieldFile:onFileUploadError(): Error loading file\",\n response,\n });\n webixContainer.hideProgress();\n },\n },\n });\n uploader.addDropZone(webixContainer.$view);\n\n // store upload id into html element (it will be used in .customEdit)\n node.dataset[\"uploaderId\"] = uploader.config.id;\n\n // open file upload dialog when's click\n node.addEventListener(\"click\", (e) => {\n if (e.target.className.indexOf(\"delete-image\") > -1) {\n this.deleteFile = true;\n }\n });\n }\n }\n\n /*\n * @function customEdit\n *\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customEdit(row, App, node) {\n if (this.deleteFile == true) {\n // remove the property because it is only needed to prevent the file dialog from showing\n delete this.deleteFile;\n\n // Ask the user if they really want to delete the photo\n webix.confirm({\n title: \"\",\n text: L(\"Are you sure you want to remove this file?\"),\n callback: async (result) => {\n const confirmDelete = result ? 1 : 0;\n if (confirmDelete) {\n // update just this value on our current object.model\n const values = {};\n\n values[this.columnName] = {};\n\n if (row.id) {\n try {\n await this.object.model().update(row.id, values);\n\n // update the client side data object as well so other data changes won't cause this save to be reverted\n if ($$(node) && $$(node).updateItem)\n $$(node).updateItem(row.id, values);\n } catch (err) {\n node.classList.add(\"webix_invalid\");\n node.classList.add(\"webix_invalid_cell\");\n\n this.AB.notify.developer(err, {\n message:\n \"ABFieldFile:customEdit(): Error updating our entry.\",\n row: row,\n values: values,\n });\n }\n }\n // update value in the form component\n else {\n this.setValue($$(node), values);\n }\n }\n },\n });\n } else {\n const rowData = this.dataValue(row);\n if (!rowData || !rowData.uuid) {\n const uploaderId = node.dataset[\"uploaderId\"],\n uploader = $$(uploaderId);\n\n if (uploader && uploader.fileDialog)\n uploader.fileDialog({ rowid: row.id });\n }\n }\n\n return false;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"fieldcustom\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-file\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailcustom\",\n };\n };\n\n return detailComponentSetting;\n }\n\n //File Template\n\n fileTemplate(obj, editable) {\n let iconDisplay = \"\";\n let fileDisplay = \"display:none;\";\n let fileURL = \"\";\n\n let value = \"\";\n let name = \"\";\n\n const rowData = this.dataValue(obj);\n if (rowData) {\n value = rowData.uuid;\n name = rowData.filename;\n }\n\n if (value && name) {\n iconDisplay = \"display:none;\";\n fileDisplay = \"\";\n fileURL = \"/file/\" + value;\n }\n\n const html = [\n `
${\n editable ? `
${L(\"Drag and drop or click here\")}` : \"\"\n }
`,\n `
${\n name || \"\"\n }${\n editable\n ? ``\n : \"\"\n }
`,\n ].join(\"\");\n\n return html;\n }\n\n getValue(item, rowData) {\n const file = item.$view.querySelector(\".file-data-field-name\");\n const fileLink = file.querySelector(\"a\");\n\n return {\n uuid: file.getAttribute(\"file-uuid\"),\n filename: fileLink.innerHTML,\n };\n }\n\n setValue(item, rowData) {\n if (!item) return;\n\n const domNode = item.$view;\n if (!domNode) return;\n\n let val = null;\n if (rowData) {\n val = this.dataValue(rowData);\n\n // if (val == null) {\n // \t// assume they just sent us a single value\n // \tval = rowData;\n // }\n }\n\n const fileicon = domNode.querySelector(\".file-data-field-icon\");\n if (fileicon) fileicon.style.display = val && val.uuid ? \"none\" : \"block\";\n\n const file = domNode.querySelector(\".file-data-field-name\");\n if (file) {\n const fileDeleteIcon = file.querySelector(\".ab-delete-photo\");\n if (fileDeleteIcon)\n fileDeleteIcon.style.display = val && val.uuid ? \"block\" : \"none\";\n\n file.style.display = val && val.uuid ? \"block\" : \"none\";\n if (val && val.uuid) file.setAttribute(\"file-uuid\", val.uuid);\n else file.removeAttribute(\"file-uuid\");\n\n const fileLink = file.querySelector(\"a\");\n const fileURL = \"/file/\" + (val ? val.uuid : \"\");\n fileLink.href = fileURL;\n fileLink.innerHTML = val ? val.filename : \"\";\n }\n }\n\n /**\n * @method urlUpload()\n * return the url for uploading a file.\n * When used in a webix widget, the response is different than our normal\n * API, so we can pass in a param to indicate a response compatible with\n * webix.\n * @param {bool} isWebix\n * Is this url being used by a webix component?\n * @return {string}\n */\n urlUpload(isWebix = true) {\n return `/file/upload/${this.object.id}/${this.id}/${isWebix ? \"1\" : \"0\"}`;\n }\n\n /**\n * @method urlFile\n * return the url to use to reference the file by it's id.\n * @param {string} id uuid reference of this file.\n * @return {string}\n */\n urlFile(id) {\n return `/file/${id}`;\n }\n};\n","const ABFieldFormulaCore = require(\"../../core/dataFields/ABFieldFormulaCore\");\n\nmodule.exports = class ABFieldFormula extends ABFieldFormulaCore {\n // constructor(values, object) {\n // super(values, object);\n // }\n\n ///\n /// Instance Methods\n ///\n\n // isValid() {\n // const validator = super.isValid();\n\n // // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n // return validator;\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldFormula\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = null; // read only\n config.css = \"textCell\";\n config.template = (rowData) => {\n if (rowData.$group) return rowData[this.columnName];\n\n return this.format(rowData);\n };\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // not support in the form widget\n return super.formComponent(\"fieldreadonly\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-fieldreadonly\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","const ABFieldImageCore = require(\"../../core/dataFields/ABFieldImageCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABFieldImage extends ABFieldImageCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @function destroy\n * On a destroy operation, ask if the user wants to keep the related images.\n */\n async destroy() {\n return new Promise((resolve, reject) => {\n // verify we have been .save()d before:\n if (this.id) {\n // Ask the user what to do about the existing images:\n webix.confirm({\n title: L(\"Keep Images?\"),\n message: L(\"Do you want to keep the images referenced by {0}?\", [\n this.label,\n ]),\n callback: async (result) => {\n // update this setting so the server can respond correctly in\n // ABFieldImage.migrateDrop()\n this.settings.removeExistingData = result ? 0 : 1;\n\n try {\n await this.save();\n\n // TODO: a reminder that you still got alot on the server to do!\n webix.alert({\n title: \"!! TODO !!\",\n text: \"ABFieldImage.destroy(): Tell a Developer to actually pay attention to this!\",\n });\n\n await super.destroy();\n\n resolve();\n } catch (err) {\n reject(err);\n }\n },\n });\n } else {\n resolve(); // nothing to do really\n }\n });\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n idCustomContainer(obj, formId) {\n // if formId is passed the field is in a form view not a grid and\n // we won't have the obj and each time this\n // field is in a form it will conflict with the last one rendered\n if (formId) {\n return `${this.columnName.replace(/ /g, \"_\")}-${formId}-image`;\n } else {\n return `${this.columnName.replace(/ /g, \"_\")}-${obj.id}-image`;\n }\n }\n\n // return the grid column header definition for this instance of ABFieldImage\n columnHeader(options) {\n options = options || {};\n\n const config = super.columnHeader(options);\n const field = this;\n\n config.editor = false; // 'text'; // '[edit_type]' for your unique situation\n // config.sort = 'string' // '[sort_type]' for your unique situation\n\n let containerHeight = \"100%\";\n let imageHeight = \"100%\";\n let width = \"100%\";\n let imageSrcHeight = \"100%\";\n if (field.settings.useWidth) {\n config.width = field.settings.imageWidth || 100;\n const heightVal =\n field.settings.useHeight && field.settings.imageHeight\n ? field.settings.imageHeight + 20\n : 80;\n containerHeight = `${heightVal}px`;\n width = `${field.settings.imageWidth || 100}px`;\n imageHeight =\n field.settings.useHeight && field.settings.imageHeight\n ? field.settings.imageHeight\n : 80;\n imageHeight = `${imageHeight}px`;\n imageSrcHeight =\n field.settings.useHeight && field.settings.imageHeight\n ? field.settings.imageHeight\n : 60;\n imageSrcHeight = `${imageSrcHeight}px`;\n } else if (options.width) {\n config.width = options.width || 100;\n width = `${options.width || 100}px`;\n imageHeight = options.width;\n imageHeight = `${imageHeight}px`;\n imageSrcHeight = options.width;\n imageSrcHeight = `${imageSrcHeight}px`;\n }\n if (\n field.settings.useHeight &&\n field.settings.imageHeight &&\n field.settings.imageHeight != \"NaN\"\n ) {\n config.height = field.settings.imageHeight || 0;\n containerHeight = parseInt(config.height) + 20;\n containerHeight = `${containerHeight}px`;\n imageHeight = parseInt(config.height);\n imageHeight = `${imageHeight}px`;\n imageSrcHeight = parseInt(config.height);\n imageSrcHeight = `${imageSrcHeight}px`;\n }\n\n const editable = options.editable;\n\n // populate our default template:\n // debugger;\n config.template = (obj) => {\n if (obj.$group) return obj[this.columnName];\n\n const widthStyle = `width: ${width}; height: ${containerHeight}`;\n\n const imageStyle = `width: ${width}; height: ${imageHeight}`;\n\n const imgDiv = [\n `
`,\n `
`,\n '
',\n this.imageTemplate(obj, {\n editable: editable,\n height: imageSrcHeight,\n width: width,\n }),\n \"
\",\n \"
\",\n \"
\",\n ].join(\"\");\n\n return imgDiv;\n };\n\n return config;\n }\n\n /*\n * @function customDisplay\n * perform any custom display modifications for this field.\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n * @param {object} options - {\n * \t\teditable {Bool} where or not this field is currently editable\n * \t\tformId {string} the id of the presenting form if any\n * }\n */\n customDisplay(row, App, node, options) {\n // sanity check.\n if (!node) {\n return;\n }\n\n options = options || {};\n\n // safety check:\n // webix seems to crash if you specify a .container that doesn't exists:\n // Note: when the template is first created, we don't have App.unique()\n const parentContainer = node.querySelector(\".ab-image-holder\");\n if (parentContainer) {\n parentContainer.innerHTML = \"\";\n // parentContainer.id = idBase;\t// change it to the unique one.\n\n let imgHeight = 0;\n if (this.settings.useHeight) {\n imgHeight = parseInt(this.settings.imageHeight) || imgHeight;\n }\n\n let imgWidth = 0;\n if (this.settings.useWidth) {\n imgWidth = parseInt(this.settings.imageWidth) || imgWidth;\n }\n\n if (options.height) imgHeight = options.height;\n\n if (options.width) imgWidth = options.width;\n //// TODO: actually pay attention to the height and width when\n //// displaying the images.\n\n // use a webix component for displaying the content.\n // do this so I can use the progress spinner\n const webixContainer = webix.ui({\n view: \"template\",\n css: \"ab-image-holder\",\n // id: ids.container,\n container: parentContainer,\n\n template: this.imageTemplate(row, {\n editable: options.editable,\n height: imgHeight ? imgHeight + \"px\" : 0,\n width: imgWidth ? imgWidth + \"px\" : 0,\n }),\n\n borderless: true,\n height: imgHeight,\n width: imgWidth,\n });\n webix.extend(webixContainer, webix.ProgressBar);\n\n ////\n //// Prepare the Uploader\n ////\n\n if (!options.editable) {\n const domNode = parentContainer.querySelector(\".delete-image\");\n if (domNode) domNode.style.display = \"none\";\n return;\n }\n\n const url = this.urlUpload();\n\n const uploader = webix.ui({\n view: \"uploader\",\n // id:ids.uploader,\n apiOnly: true,\n upload: url,\n inputName: \"file\",\n multiple: false,\n status: (f) => {\n if (f.percent) {\n webixContainer.hideProgress();\n webixContainer.showProgress({\n type: \"top\",\n position: f.percent / 100,\n });\n }\n },\n // formData:{\n // \tappKey:application.name,\n // \tpermission:actionKey,\n // \tisWebix:true,\n // \timageParam:'upload'\n // },\n on: {\n // when a file is added to the uploader\n onBeforeFileAdd: (item) => {\n node.classList.remove(\"webix_invalid\");\n node.classList.remove(\"webix_invalid_cell\");\n\n // verify file type\n const acceptableTypes = [\n \"jpg\",\n \"jpeg\",\n \"bmp\",\n \"png\",\n \"gif\",\n \"webp\",\n ];\n const type = item.type.toLowerCase();\n if (acceptableTypes.indexOf(type) == -1) {\n webix.message(\n L(\"Only [{0}] images are supported\", [\n acceptableTypes.join(\", \"),\n ])\n );\n return false;\n }\n this.uploadInProgress = true;\n // Display the image from local file\n var reader = new FileReader();\n reader.onload = (e) => {\n this.showImage(null, node, e.target.result);\n webixContainer.showProgress({\n type: \"top\",\n delay: 2000,\n });\n };\n reader.readAsDataURL(item.file);\n },\n\n // when upload is complete:\n onFileUpload: async (item, response) => {\n webixContainer.hideProgress();\n this.showImage(response.data.uuid, node);\n this.uploadInProgress = false;\n\n const values = {};\n values[this.columnName] = response.data.uuid;\n\n // update just this value on our current object.model\n if (row.id) {\n try {\n await this.object.model().update(row.id, values);\n\n // update the client side data object as well so other data changes won't cause this save to be reverted\n if (\n $$(node) &&\n $$(node).getItem &&\n $$(node).getItem(row.id)\n ) {\n $$(node).updateItem(row.id, values);\n } else {\n // if you scroll the table the connection to the datatable is lost so we need to find it again\n const dataTable =\n document.querySelector(\".webix_dtable\");\n if ($$(dataTable) && $$(dataTable).getItem(row.id))\n $$(dataTable).updateItem(row.id, values);\n }\n } catch (err) {\n node.classList.add(\"webix_invalid\");\n node.classList.add(\"webix_invalid_cell\");\n\n this.AB.notify.developer(err, {\n context:\n \"ABFieldImage.onFileUpload(): model.update(): error updating our entry\",\n field: this.toObj(),\n row,\n values,\n });\n }\n }\n\n // update value in the form component\n this.setValue($$(node), values);\n },\n\n // if an error was returned\n onFileUploadError: (item, response) => {\n this.AB.notify.developer(new Error(\"Error uploading image\"), {\n context: \"ABFieldImage. uploader. onFileUploadError():\",\n field: this.toObj(),\n response,\n });\n webixContainer.hideProgress();\n },\n },\n });\n uploader.addDropZone(webixContainer.$view);\n\n // store upload id into html element (it will be used in .customEdit)\n node.dataset[\"uploaderId\"] = uploader.config.id;\n\n // if we are working in a datagrid we need to add a click event to\n // check if the user is clicking on the delete button\n if (node.className == \"webix_cell\") {\n node.addEventListener(\"click\", (e) => {\n if (e.target.className.indexOf(\"delete-image\") > -1) {\n this.deleteImage = true;\n }\n });\n }\n }\n }\n\n /*\n * @function customEdit\n *\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customEdit(row, App, node, id, evt) {\n if (\n (evt && evt.target.className.indexOf(\"delete-image\") > -1) ||\n this.deleteImage\n ) {\n delete this.deleteImage;\n if (!row.removeDefaultImage) {\n row.removeDefaultImage = [];\n }\n row.removeDefaultImage[this.columnName] = true;\n\n // Ask the user if they really want to delete the photo\n webix.confirm({\n title: L(\"Are you sure you want to remove this image?\"),\n callback: async (result) => {\n const confirmDelete = result ? 1 : 0;\n if (confirmDelete) {\n // update just this value on our current object.model\n const values = {};\n values[this.columnName] = \"\"; // removing the reference to the image here\n\n try {\n await this.object.model().update(row.id, values);\n\n // update the client side data object as well so other data changes won't cause this save to be reverted\n if ($$(node) && $$(node).updateItem)\n $$(node).updateItem(row.id, values);\n\n // update value in the form component\n this.setValue($$(node), values);\n } catch (err) {\n node.classList.add(\"webix_invalid\");\n node.classList.add(\"webix_invalid_cell\");\n\n this.AB.notify.developer(err, {\n context:\n \"ABFieldImage: customEdit(): Error updating our entry\",\n field: this.toObj(),\n row: row,\n values: values,\n });\n }\n }\n },\n });\n } else {\n const uploaderId = node.dataset[\"uploaderId\"],\n uploader = $$(uploaderId);\n\n if (uploader && uploader.fileDialog)\n uploader.fileDialog({ rowid: row.id });\n }\n\n return false;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"fieldcustom\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-image\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailimage\",\n };\n };\n\n return detailComponentSetting;\n }\n\n imageTemplate(obj, options) {\n options = options || {};\n options.height = options.height || \"100%\";\n options.width = options.width || \"100%\";\n\n // deault view is icon:\n let iconDisplay = \"\";\n let imageDisplay = \"display:none;\";\n let imageURL = \"\";\n\n let value = \"\";\n let isRemoveDefaultImage = false;\n if (obj[this.columnName]) {\n value = obj[this.columnName];\n }\n if (obj.removeDefaultImage) {\n if (obj.removeDefaultImage[this.columnName]) {\n isRemoveDefaultImage = obj.removeDefaultImage[this.columnName];\n }\n }\n\n if (value) {\n iconDisplay = \"display:none;\";\n imageDisplay = \"\";\n imageURL = `background-image:url('${this.urlImage(value)}');`;\n } else {\n if (this.settings.useDefaultImage && !isRemoveDefaultImage) {\n iconDisplay = \"display:none;\";\n imageDisplay = \"\";\n imageURL = `background-image:url('${this.urlImage(\n this.settings.defaultImageUrl\n )}');`;\n }\n }\n\n let html = [\n `
#drag#
` +\n `
#remove#
`,\n ].join(\"\");\n\n html = html.replace(\n \"#drag#\",\n options.editable\n ? `
${L(\"Drag and drop or click here\")}
`\n : \"\"\n );\n html = html.replace(\n \"#remove#\",\n options.editable\n ? ``\n : \"\"\n );\n\n return html;\n }\n\n showImage(uuid, node, url) {\n const parentContainer = node.querySelector(\".ab-image-holder\");\n if (parentContainer) {\n parentContainer.querySelector(\".image-data-field-icon\").style.display =\n \"none\";\n const image = parentContainer.querySelector(\".image-data-field-image\");\n image.style.display = \"\";\n image.style.backgroundImage = `url('${url ?? this.urlImage(uuid)}')`;\n image.setAttribute(\"image-uuid\", uuid);\n }\n }\n\n getValue(item, rowData) {\n const image = item.$view.querySelector(\".image-data-field-image\");\n return image.getAttribute(\"image-uuid\");\n }\n\n setValue(item, rowData) {\n if (!item) return;\n\n const domNode = item.$view;\n if (!domNode) return;\n\n let val = null;\n if (rowData) {\n val = this.dataValue(rowData);\n\n // if (val == null) {\n // \t// assume they just sent us a single value\n // \tval = rowData;\n // }\n }\n\n const imageIcon = domNode.querySelector(\".image-data-field-icon\");\n if (imageIcon) imageIcon.style.display = val ? \"none\" : \"\";\n\n const image = domNode.querySelector(\".image-data-field-image\");\n if (image) {\n const imageDeleteIcon = image.querySelector(\".ab-delete-photo\");\n if (imageDeleteIcon)\n imageDeleteIcon.style.display = val ? \"block\" : \"none\";\n\n image.style.display = val ? \"block\" : \"none\";\n\n if (val) {\n image.style.backgroundImage = `url('${this.urlImage(val)}')`;\n image.setAttribute(\"image-uuid\", val);\n } else {\n image.removeAttribute(\"image-uuid\");\n }\n }\n }\n\n /**\n * @method toBase64\n *\n * @param {Object} rowData\n *\n * @return {Promise} - {\n * \t\tdata: string,\n * \t\twidth: number,\n * \t\theight: number\n * }\n */\n toBase64(rowData) {\n return new Promise((resolve, reject) => {\n if (!rowData[this.columnName]) return resolve(null);\n\n const img = new Image();\n img.crossOrigin = \"Anonymous\";\n img.onerror = function (err) {\n reject(err);\n };\n img.onload = function () {\n const canvas = document.createElement(\"canvas\");\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext(\"2d\");\n ctx.drawImage(img, 0, 0);\n const dataURL = canvas.toDataURL();\n const imageData = {\n data: dataURL,\n width: img.width,\n height: img.height,\n };\n resolve(imageData);\n };\n\n img.src = this.urlImage(rowData[this.columnName]);\n });\n }\n\n /**\n * @method urlImage()\n * return the url to use to reference the image by it's id.\n * @param {string} id\n * the file.uuid reference of this image.\n * @return {string}\n */\n urlImage(id) {\n return `/file/${id}`;\n }\n\n /**\n * @method urlUpload()\n * return the url for uploading a file.\n * When used in a webix widget, the response is different than our normal\n * API, so we can pass in a param to indicate a response compatible with\n * webix.\n * @param {bool} isWebix\n * Is this url being used by a webix component?\n * @return {string}\n */\n urlUpload(isWebix = true) {\n return `/file/upload/${this.object.id}/${this.id}/${isWebix ? \"1\" : \"0\"}`;\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n if (this.uploadInProgress)\n validator.addError(this.columnName, L(\"Image still uploading\"));\n }\n\n rotateLeft(imgFile) {\n return this.AB.Network.put({\n url: `/image/rotate/${imgFile}?direction=left`,\n });\n }\n\n rotateRight(imgFile) {\n return this.AB.Network.put({\n url: `/image/rotate/${imgFile}?direction=right`,\n });\n }\n};\n","const ABFieldJsonCore = require(\"../../core/dataFields/ABFieldJsonCore\");\n\nmodule.exports = class ABFieldJson extends ABFieldJsonCore {\n // constructor(values, object) {\n // super(values, object);\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldJson\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n // config.editor = null; // read only for now\n config.editor = \"text\";\n config.css = \"textCell\";\n\n // when called by ABViewFormCustom, will need a .template() fn.\n // currently we don't need to return anything so ...\n config.template = () => \"\";\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // read-only for now\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"json\",\n settings: {\n type: \"string\",\n },\n };\n };\n\n return formComponentSetting;\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-fieldreadonly\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n setValue(item, rowData) {\n super.setValue(item, rowData, \"\");\n if (item) {\n item.config.value = rowData[this.columnName];\n }\n }\n\n /**\n * @method formCleanData()\n * Review the data a form is about to submit and change/remove it as\n * appropriate.\n * @param {obj} rowData\n * The {data} a form has collected and is about to save.\n * @return {undefined}\n */\n formCleanData(rowData) {\n let val = rowData[this.columnName];\n if (val === \"\") {\n // \"\" isn't a valid json value, so just remove the data and\n // let the DB handle the default value.\n delete rowData[this.columnName];\n }\n }\n};\n","const ABFieldListCore = require(\"../../core/dataFields/ABFieldListCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABFieldList extends ABFieldListCore {\n constructor(values, object) {\n super(values, object);\n\n // this._Selectivity = new ABFieldSelectivity(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n save() {\n return super.save().then(() => {\n // Now we want to clear out any entries that had values == to item removed from our list:\n if (this.pendingDeletions.length) {\n const model = this.object.model();\n\n if (this.settings.isMultiple == true) {\n // find all the entries that have one of the deleted values:\n // use Promise to prevent issues with data being loaded before it is deleted on client side\n return new Promise((resolve, reject) => {\n let numDone = 0;\n let numToDo = 0;\n\n model\n .findAll({})\n .then((list) => {\n list = list.data || list;\n\n // for each list item\n list.forEach((item) => {\n if (Array.isArray(item[this.columnName])) {\n // get fields not in pendingDeletions\n let remainingFields = item[\n this.columnName\n ].filter((i) => {\n return (\n this.pendingDeletions.indexOf(i.id) == -1\n );\n });\n\n if (\n remainingFields.length !=\n item[this.columnName].length\n ) {\n numToDo++;\n\n // update value to new field list\n if (remainingFields.length == 0) {\n remainingFields = \"\";\n }\n const value = {};\n value[this.columnName] = remainingFields;\n model.update(item.id, value).then(() => {\n // if ($$(node) && $$(node).updateItem)\n // $$(node).updateItem(value.id, value);\n numDone++;\n if (numDone >= numToDo) {\n resolve();\n }\n });\n }\n }\n });\n if (numToDo == 0) {\n resolve();\n }\n })\n .catch(reject);\n });\n } else {\n // find all the entries that have one of the deleted values:\n const where = {};\n where[this.columnName] = this.pendingDeletions;\n return new Promise((resolve, reject) => {\n let numDone = 0;\n\n model\n .findAll(where)\n .then((list) => {\n // make sure we just work with the { data:[] } that was returned\n list = list.data || list;\n\n // for each one, set the value to ''\n // NOTE: jQuery ajax routines filter out null values, so we can't\n // set them to null. :(\n // const numDone = 0;\n const value = {};\n value[this.columnName] = \"\";\n\n list.forEach((item) => {\n model.update(item.id, value).then(() => {\n numDone++;\n if (numDone >= list.length) {\n resolve();\n }\n });\n });\n if (list.length == 0) {\n resolve();\n }\n })\n .catch(reject);\n });\n }\n }\n });\n }\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldList\n columnHeader(options) {\n options = options || {};\n\n const config = super.columnHeader(options);\n const field = this;\n const App = field.AB._App;\n\n var formClass = \"\";\n var placeHolder = \"\";\n if (options.editable) {\n formClass = \" form-entry\";\n placeHolder = `${L(\n \"Select item\"\n )}`;\n }\n var isRemovable = options.editable && !this.settings.required;\n\n config.editFormat = (value) => {\n return this.editFormat(value);\n };\n config.editParse = (value) => {\n return this.editParse(value);\n };\n\n config.template = (rowData) => {\n let selectedData = rowData[this.columnName];\n if (selectedData == null) return \"\";\n if (this.settings.isMultiple) {\n selectedData = _getSelectedOptions(this, rowData);\n }\n var values = [];\n values.push('
');\n let hasCustomColor = \"\";\n let optionHex = \"\";\n if (\n selectedData &&\n Array.isArray(selectedData) &&\n selectedData.length\n ) {\n selectedData.forEach((val) => {\n if (this.settings.hasColors && val.hex) {\n hasCustomColor = \"hascustomcolor\";\n optionHex = `background: ${val.hex};`;\n }\n if (val.text) {\n values.push(\n `
${val.text}
`\n );\n }\n });\n if (selectedData.length > 1) {\n values.push(\n `${selectedData.length}`\n );\n }\n } else if (selectedData) {\n let selectedObj = selectedData;\n if (typeof selectedData == \"string\") {\n selectedObj = this.getItemFromVal(selectedData);\n }\n if (!selectedObj) return \"\";\n if (this.settings.hasColors && selectedObj.hex) {\n hasCustomColor = \"hascustomcolor\";\n optionHex = `background: ${selectedObj.hex};`;\n }\n if (selectedObj.text) {\n let clear = \"\";\n if (options.editable && !this.settings.required) {\n clear = ``;\n }\n values.push(\n `
${clear}${selectedObj.text}
`\n );\n }\n } else {\n return \"\";\n }\n values.push(\"
\");\n return values.join(\"\");\n };\n config.editor = this.settings.isMultiple ? \"multiselect\" : \"combo\";\n config.suggest = {\n button: true,\n data: this.settings.options.map(function (opt) {\n return {\n id: opt.id,\n value: opt.text,\n hex: opt.hex,\n };\n }),\n };\n if (this.settings.isMultiple) {\n config.suggest.view = \"checksuggest\";\n }\n\n return config;\n }\n\n /*\n * @function customDisplay\n * perform any custom display modifications for this field.\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n * unique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customDisplay(row, App, node, options) {\n // sanity check.\n if (!node) {\n return;\n }\n\n options = options || {};\n\n if (!node.querySelector) return;\n\n var clearButton = node.querySelector(\n \".selectivity-single-selected-item-remove\"\n );\n if (clearButton) {\n clearButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n var values = {};\n values[this.columnName] = \"\";\n this.object\n .model()\n .update(row.id, values)\n .then(() => {\n // update the client side data object as well so other data changes won't cause this save to be reverted\n $$(node)?.updateItem?.(row.id, values);\n })\n .catch((err) => {\n node.classList.add(\"webix_invalid\");\n node.classList.add(\"webix_invalid_cell\");\n\n this.AB.notify.developer(err, {\n message:\n \"ABFieldList:customDisplay(): Error updating our entry.\",\n row: row,\n values: \"\",\n field: this.toObj(),\n });\n });\n });\n }\n }\n\n /*\n * @function customEdit\n *\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n * unique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n // customEdit(row, App, node) {\n // return super.customEdit(row, App, node);\n // }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: this.settings.isMultiple ? \"selectmultiple\" : \"selectsingle\",\n settings: {\n options: this.settings.options.map(function (opt) {\n return {\n id: opt.id,\n value: opt.text,\n hex: opt.hex,\n };\n }),\n },\n };\n };\n\n return formComponentSetting;\n }\n\n formComponentMobile() {\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: this.settings.isMultiple\n ? \"mobile-selectmultiple\"\n : \"mobile-selectsingle\",\n settings: {\n options: this.settings.options.map(function (opt) {\n return {\n id: opt.id,\n value: opt.text,\n hex: opt.hex,\n };\n }),\n },\n };\n };\n\n return formComponentSetting;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: this.settings.isMultiple ? \"detailtext\" : \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n editFormat(value) {\n if (!value) return \"\";\n let vals = [];\n if (Array.isArray(value)) {\n value.forEach((val) => {\n if (typeof val == \"object\") {\n vals.push(val.id);\n } else {\n let itemObj = this.getItemFromVal(val);\n vals.push(itemObj.id);\n }\n });\n } else {\n if (typeof value == \"object\") {\n vals.push(value.id);\n } else {\n let itemObj = this.getItemFromVal(value);\n if (itemObj && itemObj.id) {\n vals.push(itemObj.id);\n }\n }\n }\n return vals.join();\n }\n\n editParse(value) {\n if (this.settings.isMultiple) {\n let returnVals = [];\n let vals = value.split(\",\");\n vals.forEach((val) => {\n returnVals.push(this.getItemFromVal(val));\n });\n return returnVals;\n } else {\n return value;\n }\n }\n\n getItemFromVal(val) {\n let item;\n let options = this.options();\n if (options.length > 1) {\n options.forEach((option) => {\n if (option.id == val) {\n item = option;\n return false;\n }\n });\n return item;\n } else {\n return \"\";\n }\n }\n\n getValue(item, rowData) {\n return this.editParse(item.getValue());\n }\n\n getSelectedOptions(field, rowData = {}) {\n let result = [];\n if (rowData[this.columnName] != null) {\n result = rowData[this.columnName];\n } else if (rowData) {\n if (Array.isArray(rowData)) {\n result = rowData;\n } else {\n result.push(rowData);\n }\n }\n if (result.length) {\n if (typeof result == \"string\") result = JSON.parse(result);\n\n // Pull text with current language\n if (this.settings) {\n result = (this.settings.options || []).filter((opt) => {\n return (\n (result || []).filter((v) => (opt.id || opt) == (v.id || v))\n .length > 0\n );\n });\n }\n }\n\n return result;\n }\n\n setValue(item, rowData) {\n if (!item) return;\n\n if (this.settings.isMultiple) {\n // do we need anything here?\n } else {\n super.setValue(item, rowData);\n }\n }\n};\n\n// == Private methods ==\nfunction _getSelectedOptions(field, rowData = {}) {\n let result = [];\n if (rowData[field.columnName] != null) {\n result = rowData[field.columnName];\n\n try {\n if (typeof result == \"string\") result = JSON.parse(result);\n } catch (e) {\n console.error(`Error JSON.pars()ing result [${result}]: `, e);\n // just go with what is there\n result = rowData[field.columnName];\n }\n\n // Pull text with current language\n if (field.settings) {\n result = (field.settings.options || []).filter((opt) => {\n return (\n (result || []).filter(\n (v) => opt && v && (opt.id || opt) == (v.id || v)\n ).length > 0\n );\n });\n }\n }\n\n return result;\n}\n","const ABFieldLongTextCore = require(\"../../core/dataFields/ABFieldLongTextCore\");\n\nmodule.exports = class ABFieldLongText extends ABFieldLongTextCore {\n constructor(values, object) {\n super(values, object);\n\n /*\n\t\t{\n\t\t\tsettings: {\n\t\t\t\tdefault: 'string',\n\t\t\t\tsupportMultilingual: 1/0\n\t\t\t}\n\t\t}\n\t\t*/\n }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldLongText\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = \"text\"; // '[edit_type]' for your unique situation\n // config.sort = 'string' // '[sort_type]' for your unique situation\n config.template = (obj, common, value, col, ind) => {\n return (value || \"\").toString().replace(/[<]/g, \"<\");\n };\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"textbox\",\n settings: {\n type: \"multiple\",\n },\n };\n };\n\n return formComponentSetting;\n }\n\n formComponentMobile() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"mobile-textbox\",\n settings: {\n type: \"multiple\",\n },\n };\n };\n\n return formComponentSetting;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n /**\n * @method setValue\n * this function uses for form component and mass update popup\n * to get value of fields that apply custom editor\n *\n * @param {Object} item - Webix element\n * @param {Object} rowData - data of row\n *\n * @return {Object}\n */\n setValue(item, rowData) {\n super.setValue(item, rowData, \"\");\n }\n};\n","const ABFieldNumberCore = require(\"../../core/dataFields/ABFieldNumberCore\");\n\nlet INIT_EDITOR = false;\n// {bool} INIT_EDITOR\n// Transition code between previous Framework and current.\n// we now need to wait until webix is declared or accessible globally.\n\nmodule.exports = class ABFieldNumber extends ABFieldNumberCore {\n constructor(values, object) {\n if (!INIT_EDITOR) {\n // NOTE: if you need a unique [edit_type] by your returned config.editor above:\n webix.editors.number = webix.extend(\n {\n // TODO : Validate number only\n },\n webix.editors.text\n );\n INIT_EDITOR = true;\n }\n super(values, object);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n // return the grid column header definition for this instance of ABFieldNumber\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = \"number\"; // [edit_type] simple inline editing.\n\n config.format = (d) => {\n const rowData = {};\n rowData[this.columnName] = d;\n\n return this.format(rowData);\n };\n\n return config;\n }\n\n /**\n * @method formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"numberbox\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-numberbox\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","/*\n * ABFieldSelectivity\n *\n * An ABFieldSelectivity defines a single unique Field/Column in a ABObject.\n *\n */\n\nconst ABField = require(\"./ABField\");\n\nconst defaultSettings = {\n allowClear: true,\n removeOnly: false,\n readOnly: false,\n showDropdown: true,\n placeholder: \"\",\n multiple: false,\n};\n\nconst ABFieldSelectivityDefaults = {\n key: \"selectivity\",\n};\n\nmodule.exports = class ABFieldSelectivity extends ABField {\n constructor(values, object, fieldDefaults = ABFieldSelectivityDefaults) {\n super(values, object, fieldDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return {\n key: \"selectivity\",\n icon: \"bars\",\n menuName: \"\",\n description: \"\",\n };\n }\n\n selectivityRender(domNode, settings, App, row) {\n if (domNode == null) return;\n\n const cypress = settings.dataCy || \"\";\n domNode.setAttribute(\"data-cy\", cypress);\n\n // setting up our specific settings:\n settings = settings || {};\n for (const dv in defaultSettings) {\n if (settings[dv] === null) {\n settings[dv] = null;\n } else {\n settings[dv] = settings[dv] || defaultSettings[dv];\n }\n }\n\n if (\n settings.multiple &&\n settings.items &&\n settings.data &&\n settings.data.length\n ) {\n settings.data.forEach(function (d) {\n settings.items.map(function (i) {\n if (i.id == d.id) d.hex = i.hex;\n });\n });\n settings[\"data\"] = this.prepareData(\n settings[\"data\"],\n settings.multiple\n );\n } else if (settings[\"data\"] == null || settings[\"data\"] == \"\") {\n settings[\"data\"] = this.prepareData([], settings.multiple);\n } else {\n settings[\"data\"] = this.prepareData(\n settings[\"data\"],\n settings.multiple\n );\n }\n\n // store the field id so we can look it up on click events later\n settings[\"field\"] = this.id;\n\n // Prevent render selectivity duplicate\n if (domNode.selectivity != null) {\n // Refresh selectivity settings\n domNode.selectivity.setOptions(settings);\n\n return;\n }\n\n settings.element = domNode;\n\n // Render selectivity\n let selectivityInput;\n if (settings.multiple) {\n if (settings.isUsers) {\n settings.templates = {\n multipleSelectedItem: function (options) {\n return `\n\t\t\t\t\t\t\t\t \n ${\n settings.additionalText\n ? settings.additionalText(options)\n : \"\"\n }\n\t\t\t\t\t\t\t\t${!settings.isLabelHidden ? options.text : \"\"}\n\t\t\t\t\t\t\t\t${\n options.removable\n ? ` `\n : \"\"\n }\n\t\t\t\t\t\t\t`;\n },\n };\n } else {\n settings.templates = {\n multipleSelectedItem: function (options) {\n return `\n ${\n settings.editPage\n ? ` `\n : \"\"\n }\n ${\n settings.additionalText\n ? settings.additionalText(options)\n : \"\"\n }\n ${!settings.isLabelHidden ? options.text : \"\"}\n ${\n options.removable\n ? ` `\n : \"\"\n }\n\t\t\t\t\t\t\t`;\n },\n };\n }\n selectivityInput = new Selectivity.Inputs.Multiple(settings);\n\n domNode.selectivity = selectivityInput;\n this.selectivitySetBadge(domNode, App, row);\n } else {\n settings.templates = {\n singleSelectedItem: function (options) {\n return `\n\t\t\t\t\t\t\t${\n settings.editPage\n ? ''\n : \"\"\n }\n ${\n settings.additionalText\n ? settings.additionalText(options)\n : \"\"\n }\n ${!settings.isLabelHidden ? options.text : \"\"}\n ${\n options.removable\n ? ''\n : \"\"\n }\n\t\t\t\t\t\t`;\n },\n };\n\n selectivityInput = new Selectivity.Inputs.Single(settings);\n domNode.selectivity = selectivityInput;\n }\n\n if (settings.editPage) {\n const trigerEditPageEvent = () => {\n const instance = this;\n const editMenus = document.querySelectorAll(\n \".selectivity-single-selected-item-edit, .selectivity-multiple-selected-item-edit\"\n );\n for (let i = 0; i < editMenus.length; i++) {\n const eMenu = editMenus[i];\n if (eMenu && !eMenu.__hasClickEvent) {\n eMenu.addEventListener(\n \"click\",\n function (e) {\n e.stopPropagation();\n e.preventDefault();\n\n const parentElm = this.parentElement;\n if (!parentElm) return;\n\n const rowId = parentElm.getAttribute(\"data-item-id\");\n if (!rowId) return;\n\n const fieldId = parentElm.getAttribute(\"data-field-id\");\n if (!fieldId) return;\n\n const thisField = instance.object.fieldByID(fieldId);\n if (!thisField) return;\n\n thisField.emit(\"editPage\", rowId);\n },\n true\n );\n eMenu.__hasClickEvent = true;\n }\n }\n };\n\n setTimeout(() => {\n trigerEditPageEvent();\n\n domNode.addEventListener(\"change\", () => {\n trigerEditPageEvent();\n });\n }, 500);\n }\n\n // WORKAROUND : remove caret icon of selectivity\n if (settings.readOnly) {\n const caretElems = domNode.getElementsByClassName(\"selectivity-caret\");\n for (let i = 0; i < caretElems.length; i++) {\n const caretElm = caretElems[i];\n if (caretElm) {\n caretElm.parentNode.removeChild(caretElm);\n }\n }\n }\n\n // remember our settings values\n this.selectivitySettings = settings;\n }\n\n selectivityGet(domNode) {\n if (domNode && domNode.selectivity) {\n if (this.selectivitySettings && this.selectivitySettings.multiple) {\n // on a multiple select, return an array of results, or empty array\n return domNode.selectivity.getData() || [];\n } else {\n // if a single select, return the object or null\n return domNode.selectivity.getData() || null;\n }\n } else {\n if (this.selectivitySettings && this.selectivitySettings.multiple)\n return [];\n else return null;\n }\n }\n\n selectivitySet(domNode, data) {\n if (!domNode || !domNode.selectivity) return;\n\n data = this.prepareData(data, domNode.selectivity.options.multiple);\n\n if (\n (Array.isArray(data) && data[0]) || // Check Array\n (data && data.id)\n )\n // Check a object\n domNode.selectivity.setData(data);\n else domNode.selectivity.clear();\n }\n\n selectivityDestroy(domNode) {\n if (domNode && domNode.selectivity) {\n domNode.selectivity.destroy();\n\n delete domNode.selectivity;\n }\n }\n\n prepareData(data, multiple = true) {\n if (!data && multiple) {\n return [];\n } else if (multiple && data && Array.isArray(data) && data.length == 0) {\n return [];\n } else if (!multiple && data && Array.isArray(data) && data.length == 0) {\n return null;\n } else if (!data && !multiple) {\n return null;\n }\n\n if (typeof data == \"string\" && data.length > 0) {\n try {\n data = JSON.parse(data);\n } catch (e) {\n // not JSON parsable, so convert to\n data = { id: data, text: data };\n }\n }\n\n // if single select, then it should be object\n if (!multiple && Array.isArray(data)) {\n data = data[0];\n } else if (multiple && !Array.isArray(data)) {\n data = [data];\n }\n\n // check to see if id is present on each item\n if (multiple) {\n data.forEach((d) => {\n if (!d.id && d.uuid) {\n d.id = d.uuid;\n }\n });\n } else {\n if (!data.id && data.uuid) data.id = data.uuid;\n }\n\n if (data == null && multiple) {\n data = [];\n }\n\n return data;\n }\n\n selectivitySetBadge(domNode) {\n if (!domNode.clientHeight) return;\n const innerHeight = domNode.clientHeight;\n const outerHeight = domNode.parentElement.clientHeight;\n if (innerHeight - outerHeight > 5) {\n let count = 0;\n let values = [];\n if (domNode && domNode.selectivity)\n values = domNode.selectivity.getValue() || [];\n\n count = values.length;\n if (count > 1) {\n const badge = domNode.querySelector(\n \".webix_badge.selectivityBadge\"\n );\n if (badge != null) {\n badge.innerHTML = count;\n } else {\n const anchor = document.createElement(\"A\");\n anchor.href = \"javascript:void(0);\";\n // v2: this just updated the $height property for this row\n // we don't do that anymore:\n // anchor.addEventListener(\"click\", function () {\n // App.actions.onRowResizeAuto(row.id, innerHeight);\n // });\n const node = document.createElement(\"SPAN\");\n const textnode = document.createTextNode(count);\n node.classList.add(\"webix_badge\", \"selectivityBadge\");\n node.appendChild(textnode);\n anchor.appendChild(node);\n domNode.appendChild(anchor);\n }\n }\n }\n }\n};\n","const ABFieldStringCore = require(\"../../core/dataFields/ABFieldStringCore\");\n\nmodule.exports = class ABFieldString extends ABFieldStringCore {\n // constructor(values, object) {\n // super(values, object);\n\n // {\n // settings: {\n // \t default: 'string',\n // \t supportMultilingual: 1/0\n // }\n // }\n\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldString\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = \"text\";\n config.css = \"textCell\";\n // config.sort = 'string'\n config.template = (obj, common, value /* , col, ind */) => {\n // if this isn't part of a group header display the default format\n if (!obj.$group) {\n return (value || \"\").toString().replace(/[<]/g, \"<\");\n } else {\n return \"\";\n }\n };\n\n return config;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // if no default value is set, then don't insert a value.\n if (!values[this.columnName]) {\n // Set default string\n if (this.settings.default) {\n if (this.settings.default.indexOf(\"{uuid}\") >= 0) {\n values[this.columnName] = this.AB.uuid();\n } else {\n values[this.columnName] = this.settings.default;\n }\n }\n }\n }\n\n /**\n * @method formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"textbox\",\n settings: {\n type: \"single\",\n },\n };\n };\n\n return formComponentSetting;\n }\n\n // formComponentMobile() {\n // // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // // primarily the .common() and .newInstance() methods.\n // const formComponentSetting = super.formComponent();\n\n // // .common() is used to create the display in the list\n // formComponentSetting.common = () => {\n // return {\n // key: \"mobile-textbox\",\n // settings: {\n // type: \"single\",\n // },\n // };\n // };\n\n // return formComponentSetting;\n // }\n\n /**\n * @method formComponentMobile\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponentMobile() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"mobile-textbox\",\n settings: {\n type: \"single\",\n },\n };\n };\n\n return formComponentSetting;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n /**\n * @method setValue\n * this function uses for form component and mass update popup\n * to get value of fields that apply custom editor\n *\n * @param {Object} item - Webix element\n * @param {Object} rowData - data of row\n *\n * @return {Object}\n */\n setValue(item, rowData) {\n super.setValue(item, rowData, \"\");\n }\n};\n","const ABFieldTextFormulaCore = require(\"../../core/dataFields/ABFieldTextFormulaCore\");\n\nmodule.exports = class ABFieldTextFormula extends ABFieldTextFormulaCore {\n // constructor(values, object) {\n // super(values, object);\n // }\n\n ///\n /// Instance Methods\n ///\n\n // isValid() {\n // const validator = super.isValid();\n\n // // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n // return validator;\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldTextFormula\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = null; // read only\n config.css = \"textCell\";\n config.template = (rowData) => {\n // if this isn't part of a group header display the default format\n if (!rowData.$group) {\n return this.format(rowData);\n } else {\n return \"\";\n }\n };\n\n return config;\n }\n\n /*\n * @function customDisplay\n * perform any custom display modifications for this field.\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customDisplay(/* row, App, node, options */) {}\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // not support in the form widget\n return null;\n }\n\n formComponentMobile() {\n return null;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","const ABFieldTreeCore = require(\"../../core/dataFields/ABFieldTreeCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABFieldTree extends ABFieldTreeCore {\n // constructor(values, object) {\n // super(values, object);\n // }\n\n ///\n /// Instance Methods\n ///\n\n // isValid() {\n // const validator = super.isValid();\n\n // // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n // return validator;\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n idCustomContainer(obj) {\n return `${this.columnName.replace(/ /g, \"_\")}-${obj.id}-tree`;\n }\n\n // return the grid column header definition for this instance of ABFieldTree\n columnHeader(options) {\n options = options || {};\n\n const config = super.columnHeader(options);\n const field = this;\n\n let formClass = \"\";\n let placeHolder = \"\";\n if (options.isForm) {\n formClass = \" form-entry\";\n placeHolder =\n \"\" +\n L(\"Select items\") +\n \"\";\n }\n\n const width = options.width;\n\n config.template = (obj) => {\n if (obj.$group) return obj[field.columnName];\n\n const branches = [];\n let selectOptions = this.AB.cloneDeep(field.settings.options);\n selectOptions = new webix.TreeCollection({\n data: selectOptions,\n });\n\n let values = obj;\n if (obj[field.columnName] != null) {\n values = obj[field.columnName];\n }\n\n selectOptions.data.each(function (obj) {\n if (\n typeof values.indexOf != \"undefined\" &&\n values.indexOf(obj.id) != -1\n ) {\n let html = \"\";\n\n let rootid = obj.id;\n while (this.getParentId(rootid)) {\n selectOptions.data.each(function (par) {\n if (selectOptions.data.getParentId(rootid) == par.id) {\n html = par.text + \": \" + html;\n }\n });\n rootid = this.getParentId(rootid);\n }\n\n html += obj.text;\n branches.push(html);\n }\n });\n\n const myHex = \"#4CAF50\";\n let nodeHTML = \"\";\n nodeHTML += \"
\";\n if (branches.length == 0) {\n nodeHTML += placeHolder;\n } else {\n branches.forEach(function (item) {\n nodeHTML +=\n '' +\n item +\n \"\";\n });\n }\n nodeHTML += \"
\";\n\n // field.setBadge(node, App, row);\n\n if (width) {\n return (\n '
' +\n nodeHTML +\n \"
\"\n );\n } else {\n return (\n '
' +\n nodeHTML +\n \"
\"\n );\n }\n };\n\n return config;\n }\n\n /*\n * @function customDisplay\n * perform any custom display modifications for this field.\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customDisplay(row, App, node, options) {\n // sanity check.\n if (!node) {\n return;\n }\n\n options = options || {};\n\n const field = this;\n\n if (options.isForm) {\n if (!row || row.length == 0) {\n node.innerHTML =\n \"
\" +\n L(\"Select items\") +\n \"
\";\n return;\n }\n\n const branches = [];\n options = this.AB.cloneDeep(field.settings.options);\n options = new webix.TreeCollection({\n data: options,\n });\n\n let values = row;\n if (row[field.columnName] != null) {\n values = row[field.columnName];\n }\n\n options.data.each(function (obj) {\n if (\n typeof values.indexOf != \"undefined\" &&\n values.indexOf(obj.id) != -1\n ) {\n let html = \"\";\n\n let rootid = obj.id;\n while (this.getParentId(rootid)) {\n options.data.each(function (par) {\n if (options.data.getParentId(rootid) == par.id) {\n html = par.text + \": \" + html;\n }\n });\n rootid = this.getParentId(rootid);\n }\n\n html += obj.text;\n branches.push(html);\n }\n });\n\n const myHex = \"#4CAF50\";\n let nodeHTML = \"\";\n nodeHTML += \"
\";\n branches.forEach(function (item) {\n nodeHTML +=\n '' +\n item +\n \"\";\n });\n nodeHTML += \"
\";\n\n node.innerHTML = nodeHTML;\n }\n\n field.setBadge(node, App, row);\n }\n\n /*\n * @function customEdit\n *\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customEdit(row, App, node, component) {\n const idBase = App.unique(this.idCustomContainer(row));\n const idPopup = `${idBase}-popup`;\n const idTree = `${idBase}-tree`;\n const view = $$(node);\n const field = this;\n const parentComponent = component;\n let values = {};\n let firstRender = true;\n\n function getValues(field, row) {\n let values = {};\n if (\n typeof field != \"undefined\" &&\n typeof field.columnName != \"undefined\" &&\n typeof row[field.columnName] != \"undefined\"\n ) {\n values = row[field.columnName];\n }\n return values;\n }\n\n function populateTree(field, vals) {\n values = getValues(field, vals);\n\n const $Tree = $$(idTree);\n $Tree.blockEvent(); // prevents endless loop\n\n const options = field.AB.cloneDeep(field.settings.options);\n $Tree.clearAll();\n $Tree.parse(options);\n $Tree.refresh();\n $Tree.uncheckAll();\n $Tree.openAll();\n\n if (values != null && values.length) {\n values.forEach(function (id) {\n if ($Tree.exists(id)) {\n $Tree.checkItem(id);\n const dom = $Tree.getItemNode(id);\n dom.classList.add(\"selected\");\n }\n });\n }\n $Tree.unblockEvent();\n }\n\n if ($$(idPopup)) {\n $$(idPopup).show();\n populateTree(this, row);\n } else {\n webix\n .ui({\n id: idPopup,\n view: \"popup\",\n width: 500,\n height: 400,\n on: {\n onShow: () => {\n if (firstRender == true) populateTree(this, row);\n\n firstRender = false;\n },\n },\n body: {\n id: idTree,\n view: \"tree\",\n css: \"ab-data-tree\",\n template: function (obj, common) {\n return (\n \"\"\n );\n },\n on: {\n onItemCheck: async function (id, value, event) {\n const dom = this.getItemNode(id);\n const tree = this;\n if (value == true) {\n dom.classList.add(\"selected\");\n } else {\n dom.classList.remove(\"selected\");\n }\n // works for the same-level children only\n // except root items\n if (this.getParentId(id)) {\n tree.blockEvent(); // prevents endless loop\n\n let rootid = id;\n while (this.getParentId(rootid)) {\n rootid = this.getParentId(rootid);\n if (rootid != id) tree.uncheckItem(rootid);\n }\n\n this.data.eachSubItem(rootid, function (item) {\n if (item.id != id) tree.uncheckItem(item.id);\n });\n\n tree.unblockEvent();\n } else {\n tree.blockEvent(); // prevents endless loop\n this.data.eachSubItem(id, function (obj) {\n if (obj.id != id) tree.uncheckItem(obj.id);\n });\n tree.unblockEvent();\n }\n const values = {};\n values[field.columnName] = $$(idTree).getChecked();\n\n if (row.id) {\n // pass null because it could not put empty array in REST api\n if (values[field.columnName].length == 0)\n values[field.columnName] = \"\";\n\n try {\n await field.object.model().update(row.id, values);\n\n // update the client side data object as well so other data changes won't cause this save to be reverted\n if (view && view.updateItem) {\n view.updateItem(row.id, values);\n }\n } catch (err) {\n node.classList.add(\"webix_invalid\");\n node.classList.add(\"webix_invalid_cell\");\n\n this.AB.notify.developer(err, {\n message:\n \"ABFieldTree:onItemClick(): Error updating our entry.\",\n row: row,\n values: values,\n });\n }\n } else {\n const rowData = {};\n rowData[field.columnName] = $$(idTree).getChecked();\n\n field.setValue($$(parentComponent.ui.id), rowData);\n }\n },\n },\n },\n })\n .show(node, {\n x: -7,\n });\n }\n return false;\n }\n\n setBadge(domNode, row) {\n const field = this;\n domNode = domNode.querySelector(\".list-data-values\");\n const innerHeight = domNode.scrollHeight;\n const outerHeight = domNode.parentElement.clientHeight;\n if (innerHeight - outerHeight > 5) {\n let count = 0;\n if (row[field.columnName] && row[field.columnName].length)\n count = row[field.columnName].length;\n else count = 0;\n\n if (count > 1) {\n const badge = domNode.querySelector(\n \".webix_badge.selectivityBadge\"\n );\n if (badge != null) {\n badge.innerHTML = count;\n } else {\n const anchor = document.createElement(\"A\");\n anchor.href = \"javascript:void(0);\";\n anchor.addEventListener(\"click\", function (event) {\n // v2: this was just saving the new height to the\n // field properties. We don't do that anymore:\n // App.actions.onRowResizeAuto(row.id, innerHeight);\n event.stopPropagation();\n });\n const node = document.createElement(\"SPAN\");\n const textnode = document.createTextNode(count);\n node.classList.add(\"webix_badge\", \"selectivityBadge\");\n node.appendChild(textnode);\n anchor.appendChild(node);\n domNode.appendChild(anchor);\n }\n }\n }\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"formtree\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtree\",\n };\n };\n\n return detailComponentSetting;\n }\n\n getValue(item, rowData) {\n let values = {};\n values = item.getValues();\n return values;\n }\n\n setValue(item, rowData) {\n if (!item) return false;\n\n const val = rowData[this.columnName] || [];\n\n item.setValues(val);\n // get dom\n const dom = item.$view.querySelector(\".list-data-values\");\n\n if (!dom) return false;\n\n // set value to selectivity\n this.customDisplay(val, this.App, dom, {\n editable: true,\n isForm: true,\n });\n\n setTimeout(function () {\n let height = 33;\n if (dom.scrollHeight > 33) {\n height = dom.scrollHeight;\n }\n item.config.height = height + 5;\n item.resize();\n }, 200);\n }\n};\n","const ABFieldConnectCore = require(\"../../core/dataFields/ABFieldConnectCore\");\nconst ABFieldUserCore = require(\"../../core/dataFields/ABFieldUserCore\");\n\nmodule.exports = class ABFieldUser extends ABFieldUserCore {\n constructor(values, object, fieldDefaults) {\n super(values, object, fieldDefaults);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n async save() {\n // Add new\n if (this.id == null) {\n const SiteUser = this.AB.objectUser();\n const Defaults = ABFieldUserCore.defaults();\n\n this.settings.linkObject = SiteUser.id;\n this.settings.isCustomFK = 1;\n\n if (this.settings.isMultiple) {\n this.settings.indexField2 = Defaults.USERNAME_FIELD_ID;\n this.settings.linkType = \"many\";\n this.settings.linkViaType = \"many\";\n this.settings.isSource = 1;\n } else {\n this.settings.indexField = Defaults.USERNAME_FIELD_ID;\n this.settings.linkType = \"one\";\n this.settings.linkViaType = \"many\";\n this.settings.isSource = 1;\n }\n\n // TODO: .fieldCustomNew() for saving \"local\" changes.\n // NOTE: The Object adding this Field sees it's data as a ABFieldUser\n // connection.\n // However, the SiteUser will see the data as a ABFieldConnect\n // connection\n const linkCol = SiteUser.fieldNew({\n key: ABFieldConnectCore.defaults().key,\n columnName: `${this.object.name}_${this.label}`,\n label: this.object.label,\n settings: {\n showIcon: this.settings.showIcon,\n linkObject: this.object.id,\n linkType: this.settings.linkViaType,\n linkViaType: this.settings.linkType,\n isCustomFK: this.settings.isCustomFK,\n indexField: this.settings.indexField,\n indexField2: this.settings.indexField2,\n isSource: 0,\n },\n });\n\n // // Create definitions of the connected fields\n // // NOTE: skip directly to the ABMLClass.save() to avoid the\n // // migrations caused during the ABField.save() operations.\n // await ABFieldUserCore.prototype.save.call(this);\n\n // linkCol.settings.linkColumn = this.id;\n // await ABFieldUserCore.prototype.save.call(linkCol);\n\n // // Update the id value of linked field to connect together\n // this.settings.linkColumn = linkCol.id;\n // await ABFieldUserCore.prototype.save.call(this);\n\n let newDef = await this.toDefinition().save();\n this.id = newDef.id;\n\n linkCol.settings.linkColumn = this.id;\n let newLinkDef = await linkCol.toDefinition().save();\n linkCol.id = newLinkDef.id;\n\n this.settings.linkColumn = linkCol.id;\n await this.toDefinition().save();\n\n // Add fields to Objects\n await this.object.fieldAdd(this);\n\n await SiteUser.fieldAdd(linkCol);\n\n // Create column to DB\n await this.migrateCreate();\n\n await linkCol.migrateCreate();\n\n return this;\n } else {\n return super.save();\n }\n }\n\n // return the grid column header definition for this instance of ABFieldUser\n\n columnHeader(options) {\n // debugger;\n options = this.setDisplayOptions(options);\n return super.columnHeader(options);\n }\n\n /**\n * @function customDisplay\n * perform any custom display modifications for this field.\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n * unique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n // customDisplay(row, App, node, options = {}) {\n // debugger;\n // options = this.setDisplayOptions(options);\n //\n // return super.customDisplay(row, App, node, options);\n // }\n\n setDisplayOptions(options) {\n options = options || {};\n options.editable =\n this.settings.editable != null ? this.settings.editable : true;\n\n options.isLabelHidden =\n this.settings.isShowUsername != null\n ? !this.settings.isShowUsername\n : false;\n\n options.additionalText = (opt) => {\n if (!this.settings.isShowProfileImage) return \"\";\n\n if (opt.image_id)\n return ``;\n else return ' ';\n };\n\n return options;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n if (this.settings.isCurrentUser) {\n if (this.settings.isMultiple) {\n values[this.columnName] = [\n {\n id: this.AB.Account.username(),\n text: this.AB.Account.username(),\n },\n ];\n } else {\n values[this.columnName] = this.AB.Account.username();\n }\n }\n }\n\n getValue(item) {\n let val = super.getValue(item);\n\n if (val) {\n if (typeof val == \"string\")\n val = val.replace(/ab-current-user/g, this.AB.Account.username());\n else if (Array.isArray(val))\n val = val.map((v) =>\n (v?.username ?? v?.uuid ?? v?.id ?? v)?.replace(\n /ab-current-user/g,\n this.AB.Account.username()\n )\n );\n }\n\n return val;\n }\n\n setValue(item, rowData) {\n let val = rowData[this.columnName];\n if (val === \"\") {\n // this means this value isn't set.\n // can we remove this from the data?\n delete rowData[this.columnName];\n super.setValue(item, rowData);\n return;\n }\n\n if (this.linkType() == \"many\") {\n // val should be an array.\n if (!Array.isArray(val)) {\n val = [val];\n }\n // if any of those contain \"ab-current-user\" replace it:\n val = val.map((v) =>\n v == \"ab-current-user\" ? this.AB.Account.username() : v\n );\n } else {\n // val is a single entry string\n // Select \"[Current user]\" to update\n if (val == \"ab-current-user\") val = this.AB.Account.username();\n }\n\n rowData[this.columnName] = val;\n\n super.setValue(item, rowData);\n }\n\n getUsers() {\n return this.AB.Account.userList().map((u) => {\n const result = {\n id: u.username,\n image: u.image_id,\n };\n\n if (this.settings.isMultiple) {\n result.text = u.username;\n } else {\n result.value = u.username;\n }\n\n return result;\n });\n }\n\n getOptions(...params) {\n return super.getOptions(...params).then((options) => {\n // in a ABFieldUser, our options.id elements need to have\n // the username, not the .uuid:\n (options || []).forEach((o) => {\n if (o.username) {\n o.id = o.username;\n }\n });\n\n return options;\n });\n }\n\n pullRelationValues(row) {\n let values = super.pullRelationValues(row);\n\n // remember, our .id == .username\n if (Array.isArray(values)) {\n // prevent any null or undefined:\n values = values.filter((v) => v);\n values = values.map((v) => {\n v.id = v.username || v.id;\n return v;\n });\n } else {\n if (values) {\n values.id = values.username || values.id;\n }\n }\n\n return values;\n }\n\n pullRecordRelationValues(record) {\n let data = super.pullRecordRelationValues(record);\n if (Array.isArray(data)) {\n data = data.map((d) => {\n d.id = d.username ?? d.id;\n return d;\n });\n } else {\n data.id = data.username || data.id;\n }\n\n return data;\n }\n};\n","const ABMobilePageCore = require(\"../../core/mobile/ABMobilePageCore\");\n\nmodule.exports = class ABMobilePage extends ABMobilePageCore {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n\n // check to see if I've been updated, if so, alert my parent:\n this.__Handler_ABDEF_UPDATED = (def) => {\n if (def.id == this.id) {\n this.emit(\"definition.updated\", this);\n this.AB.off(\"ab.abdefinition.update\", this.__Handler_ABDEF_UPDATED);\n }\n };\n this.AB.on(\"ab.abdefinition.update\", this.__Handler_ABDEF_UPDATED);\n\n // check to see if any of my child pages have been updated and\n // update my defintion of them:\n this.__Handler_DEF_UPDATED = (page) => {\n // create a new Field with the updated def\n var def = this.AB.definitionByID(page.id);\n if (!def) return;\n\n var newPage = this.pageNew(def);\n\n // we want to keep the same pageID order:\n var newPages = [];\n this.pages().forEach((pg) => {\n if (pg.id === page.id) {\n newPages.push(newPage);\n return;\n }\n newPages.push(pg);\n });\n\n this._pages = newPages;\n\n page.off(\"definition.updated\", this.__Handler_DEF_UPDATED);\n };\n this.pages().forEach((p) => {\n p.on(\"definition.updated\", this.__Handler_DEF_UPDATED);\n });\n }\n\n /**\n * @method refreshInstance()\n * This returns a NEW instance of a ABMobilePage based upon the latest\n * version of it's Definition. It also resolves any current listeners\n * this copy currently has and prepare this to discard itself.\n */\n refreshInstance(parent) {\n // create a new Field with the updated def\n var def = this.AB.definitionByID(this.id);\n if (!def) return;\n\n var newPage = (parent ?? this.parent)?.pageNew(def);\n\n try {\n // detatch ourself from other emitters:\n this.AB.off(\"ab.abdefinition.update\", this.__Handler_ABDEF_UPDATED);\n this.pages().forEach((pg) => {\n pg.removeAllListeners(\"definition.updated\");\n });\n } catch (e) {\n // debugger;\n console.error(e);\n }\n\n return newPage;\n }\n\n warningsEval() {\n super.warningsEval();\n let allViews = this.views();\n if (allViews.length == 0) {\n this.warningsMessage(\"has no widgets\");\n }\n (this.pages() || []).forEach((p) => {\n p.warningsEval();\n });\n }\n};\n","const ABMobileViewCore = require(\"../../core/mobile/ABMobileViewCore.js\");\n\nmodule.exports = class ABMobileView extends ABMobileViewCore {\n // constructor(attributes, application, parent) {\n // super(attributes, application, parent);\n // }\n\n /**\n\n\n /*\n * @method componentList\n * return the list of components available on this view to display in the editor.\n * @param {bool} isEdited is this component currently in the Interface Editor\n * @return {array} of ABView objects.\n */\n componentList(isEdited) {\n // views not allowed to drop onto this View:\n var viewsToIgnore = [\n \"mobile-view\",\n \"mobile-page\",\n // \"formpanel\",\n // \"viewcontainer\",\n // // not allowed Detail's widgets\n // \"detailcheckbox\",\n // \"detailcustom\",\n // \"detailconnect\",\n // \"detailimage\",\n // \"detailselectivity\",\n // \"detailtext\",\n // \"detailtree\",\n // // not allowed Form's widgets\n // \"button\",\n // \"checkbox\",\n // \"connect\",\n // \"datepicker\",\n // \"fieldcustom\",\n // \"textbox\",\n // \"numberbox\",\n // \"selectsingle\",\n // \"selectmultiple\",\n // \"formtree\",\n // \"fieldreadonly\",\n // // not allowed Chart's Widgets\n // \"pie\",\n // \"bar\",\n // \"line\",\n // \"area\",\n // // not allowed Report page\n // \"report\",\n // \"reportPage\",\n // \"reportPanel\",\n ];\n\n var allComponents = this.application.viewAll();\n var allowedComponents = allComponents.filter((c) => {\n return viewsToIgnore.indexOf(c.common().key) == -1;\n });\n\n return allowedComponents;\n }\n\n warningsAll() {\n // report both OUR warnings, and any warnings from any of our sub views\n var allWarnings = super.warningsAll();\n this.views().forEach((v) => {\n allWarnings = allWarnings.concat(v.warningsAll());\n });\n\n (this.pages?.() || []).forEach((p) => {\n allWarnings = allWarnings.concat(p.warningsAll());\n });\n\n return allWarnings.filter((w) => w);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let allViews = this.views();\n\n (this.__missingViews || []).forEach((id) => {\n this.warningsMessage(`references unknown View[${id}]`);\n });\n\n allViews.forEach((v) => {\n v.warningsEval();\n });\n\n // if a datacollection is specified, verify it can be accessed.\n if (this.settings.dataviewID) {\n let dc = this.datacollections || this.datacollection;\n if (!dc) {\n this.warningsMessage(\n `references unknown dataviewID[${this.settings.dataviewID}]`\n );\n }\n }\n }\n\n warningsMessage(msg, data = {}) {\n let message = `${this.key}[${this.name}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n};\n","const ABMobileViewCustomCore = require(\"../../core/mobile/ABMobileViewCustomCore\");\n\nmodule.exports = class ABMobileViewCustom extends ABMobileViewCustomCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n warningsEval() {\n super.warningsEval();\n\n // Add in here any missing or unfindable setting reference\n // like datacollection ...\n }\n};\n","const ABMobileViewFormCore = require(\"../../core/mobile/ABMobileViewFormCore\");\n\nconst ABMobileViewFormButton = require(\"./ABMobileViewFormButton\");\n\nmodule.exports = class ABMobileViewForm extends ABMobileViewFormCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method refreshDefaultButton()\n * On the ABDesigner once a Form Field is added/removed from a form, we want\n * to make sure the default Form Button is pushed down to the bottom of the\n * list of form Items.\n * @param {obj} ids\n * The id hash of the webix widgets that show the fields.\n * @return {ABMobileViewFormButton}\n */\n refreshDefaultButton(ids) {\n // If default button is not exists, then skip this\n let defaultButton = this.views(\n (v) => v instanceof ABMobileViewFormButton && v.settings.isDefault\n )[0];\n\n // Add a default button\n if (defaultButton == null) {\n defaultButton = ABMobileViewFormButton.newInstance(\n this.application,\n this\n );\n defaultButton.settings.isDefault = true;\n }\n // Remove default button from array, then we will add it to be the last item later (.push)\n else {\n this._views = this.views((v) => v.id != defaultButton.id);\n }\n\n // Calculate position Y of the default button\n let yList = this.views().map((v) => (v.position.y || 0) + 1);\n yList.push(this._views.length || 0);\n yList.push($$(ids.fields).length || 0);\n let posY = Math.max(...yList);\n\n // Update to be the last item\n defaultButton.position.y = posY;\n\n // Keep the default button is always the last item of array\n this._views.push(defaultButton);\n\n return defaultButton;\n }\n\n warningsEval() {\n super.warningsEval();\n\n if (!this.settings.dataviewID) {\n this.warningsMessage(`does not have a DataCollection assigned.`);\n } else {\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `references an unknown DataCollection [${this.settings.dataviewID}].`\n );\n }\n }\n }\n};\n","const ABMobileViewFormButtonCore = require(\"../../core/mobile/ABMobileViewFormButtonCore\");\n\nmodule.exports = class ABMobileViewFormButton extends (\n ABMobileViewFormButtonCore\n) {};\n","const ABMobileViewFormCheckboxCore = require(\"../../core/mobile/ABMobileViewFormCheckboxCore\");\n\nmodule.exports = class ABMobileViewFormCheckbox extends (\n ABMobileViewFormCheckboxCore\n) {};\n","const ABMobileViewFormConnectCore = require(\"../../core/mobile/ABMobileViewFormConnectCore\");\n\n// const ABViewPropertyAddPage =\n// require(\"./viewProperties/ABViewPropertyAddPage\").default;\n// const ABViewPropertyEditPage =\n// require(\"./viewProperties/ABViewPropertyEditPage\").default;\n\n// const ABViewFormConnectPropertyComponentDefaults =\n// ABMobileViewFormConnectCore.defaultValues();\n\n// const ABPopupSort = require(\"../../../ABDesigner/ab_work_object_workspace_popupSortFields\");\n\n// let FilterComponent = null;\n// let SortComponent = null;\n\nmodule.exports = class ABMobileViewFormConnect extends (\n ABMobileViewFormConnectCore\n) {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n\n // Set filter value\n this.__filterComponent = this.AB.filterComplexNew(\n `${this.id}__filterComponent`\n );\n // this.__filterComponent.applicationLoad(application);\n this.__filterComponent.fieldsLoad(\n this.datasource ? this.datasource.fields() : [],\n this.datasource ? this.datasource : null\n );\n\n this.__filterComponent.setValue(\n this.settings.filterConditions\n /* ??\n ABViewFormConnectPropertyComponentDefaults.filterConditions\n */\n );\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // Does this do anything here?\n // this.addPageTool.fromSettings(this.settings);\n // this.editPageTool.fromSettings(this.settings);\n }\n\n // static get addPageProperty() {\n // return ABViewPropertyAddPage.propertyComponent(this.App, this.idBase);\n // }\n\n // static get editPageProperty() {\n // return ABViewPropertyEditPage.propertyComponent(this.App, this.idBase);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n // component() {\n // return new ABViewFormConnectComponent(this);\n // }\n\n // get addPageTool() {\n // if (this.__addPageTool == null)\n // this.__addPageTool = new ABViewPropertyAddPage();\n\n // return this.__addPageTool;\n // }\n\n // get editPageTool() {\n // if (this.__editPageTool == null)\n // this.__editPageTool = new ABViewPropertyEditPage();\n\n // return this.__editPageTool;\n // }\n};\n","const ABMobileViewFormCustomCore = require(\"../../core/mobile/ABMobileViewFormCustomCore\");\n\nmodule.exports = class ABMobileViewFormCustom extends (\n ABMobileViewFormCustomCore\n) {};\n","const ABMobileViewFormDateCore = require(\"../../core/mobile/ABMobileViewFormDateCore\");\n\nmodule.exports = class ABMobileViewFormDate extends ABMobileViewFormDateCore {};\n","const ABMobileViewFormDatetimeCore = require(\"../../core/mobile/ABMobileViewFormDatetimeCore\");\n\nmodule.exports = class ABMobileViewFormDatetime extends (\n ABMobileViewFormDatetimeCore\n) {};\n","const ABMobileViewFormEmailCore = require(\"../../core/mobile/ABMobileViewFormEmailCore\");\n\nmodule.exports = class ABMobileViewFormEmail extends (\n ABMobileViewFormEmailCore\n) {};\n","const ABMobileViewFormFileCore = require(\"../../core/mobile/ABMobileViewFormFileCore\");\n\nmodule.exports = class ABMobileViewFormFile extends ABMobileViewFormFileCore {};\n","const ABMobileViewFormFormulaCore = require(\"../../core/mobile/ABMobileViewFormFormulaCore\");\n\nmodule.exports = class ABMobileViewFormFormula extends (\n ABMobileViewFormFormulaCore\n) {};\n","const ABMobileViewFormImageCore = require(\"../../core/mobile/ABMobileViewFormImageCore\");\n\nmodule.exports = class ABMobileViewFormImage extends (\n ABMobileViewFormImageCore\n) {};\n","const ABMobileViewFormItemCore = require(\"../../core/mobile/ABMobileViewFormItemCore\");\n\nmodule.exports = class ABMobileViewFormItem extends ABMobileViewFormItemCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n // warningsEval() {\n // super.warningsEval();\n // this.warningsMessage(`FormItem Test Warning.`);\n // }\n};\n","const ABMobileViewFormNumberCore = require(\"../../core/mobile/ABMobileViewFormNumberCore\");\n\nmodule.exports = class ABMobileViewFormNumber extends (\n ABMobileViewFormNumberCore\n) {};\n","const ABMobileViewFormReadonlyCore = require(\"../../core/mobile/ABMobileViewFormReadonlyCore\");\n\nmodule.exports = class ABMobileViewFormReadonly extends (\n ABMobileViewFormReadonlyCore\n) {};\n","const ABMobileViewFormSelectMultipleCore = require(\"../../core/mobile/ABMobileViewFormSelectMultipleCore\");\n\nmodule.exports = class ABMobileViewFormSelectMultiple extends (\n ABMobileViewFormSelectMultipleCore\n) {};\n","const ABMobileViewFormSelectSingleCore = require(\"../../core/mobile/ABMobileViewFormSelectSingleCore\");\n\nmodule.exports = class ABMobileViewFormSelectSingle extends (\n ABMobileViewFormSelectSingleCore\n) {};\n","const ABMobileViewFormTextboxCore = require(\"../../core/mobile/ABMobileViewFormTextboxCore\");\n\nmodule.exports = class ABMobileViewFormTextbox extends (\n ABMobileViewFormTextboxCore\n) {\n // warningsEval() {\n // super.warningsEval();\n // this.warningsMessage(`${k} references an unknown Page.`);\n // }\n};\n","const ABMobileViewLabelCore = require(\"../../core/mobile/ABMobileViewLabelCore\");\n// const ABViewLabelComponent = require(\"./viewComponent/ABViewLabelComponent\");\n\nmodule.exports = class ABMobileViewLabel extends ABMobileViewLabelCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n // component() {\n\n // // return new ABViewLabelComponent(this);\n // }\n\n warningsEval() {\n super.warningsEval();\n\n if (!this.text) {\n this.warningsMessage(\"has no text value set.\");\n }\n }\n};\n","const ABMobileViewListCore = require(\"../../core/mobile/ABMobileViewListCore\");\n\nmodule.exports = class ABMobileViewList extends ABMobileViewListCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n warningsEval() {\n super.warningsEval();\n\n [\"linkPageAdd\", \"linkPageDetail\"].forEach((k) => {\n if (this.settings[k]) {\n let page = this.application.pageByID(this.settings[k], true);\n if (!page) {\n this.warningsMessage(`${k} references an unknown Page.`);\n }\n }\n });\n }\n};\n","const ABMobileViewTimelineCore = require(\"../../core/mobile/ABMobileViewTimelineCore\");\n\nmodule.exports = class ABMobileViewTimeline extends ABMobileViewTimelineCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n warningsEval() {\n super.warningsEval();\n\n [\"linkPageAdd\", \"linkPageDetail\"].forEach((k) => {\n if (this.settings[k]) {\n let page = this.application.pageByID(this.settings[k], true);\n if (!page) {\n this.warningsMessage(`${k} references an unknown Page.`);\n }\n }\n });\n }\n};\n","/**\n * ABProcessLane\n * manages a lane in a Process Diagram.\n *\n * Lanes manage users in the system, and provide a way to lookup a SiteUser.\n */\nvar ABProcessLaneCore = require(\"../../core/process/ABProcessLaneCore\");\n\nmodule.exports = class ABProcessLane extends ABProcessLaneCore {\n // constructor(attributes, process, application) {\n // super(attributes, process, application);\n // }\n\n ////\n //// Modeler Instance Methods\n ////\n\n transferParticipantWhereToMe(id) {\n var myParticipant = this.process.elementForDiagramID(id);\n if (myParticipant) {\n // if I haven't already set my where clause, and my Participant\n // has one, then take it:\n if (!this.stashed && myParticipant.stashed) {\n var copyParams = [\n \"stashed\",\n \"useRole\",\n \"role\",\n \"useAccount\",\n \"account\",\n ];\n copyParams.forEach((p) => {\n var swap = this[p];\n this[p] = myParticipant[p];\n myParticipant[p] = swap; // ?? do this ??\n });\n }\n }\n }\n\n /**\n * fromElement()\n * initialize this Lane's values from the given BPMN:Lane\n * @param {BPMNParticipant}\n */\n fromElement(element) {\n this.diagramID = element.id || this.diagramID;\n\n // on creation, if I have child objects, then move the .where definition\n // from my parent Participant to ME\n if (element.children && element.children.length > 0) {\n if (element.parent && element.parent.type == \"bpmn:Participant\") {\n this.transferParticipantWhereToMe(element.parent.id);\n }\n } else {\n // this info might just reside in the .parent.children[]\n if (\n element.parent &&\n element.parent.children &&\n element.parent.children.length > 0\n ) {\n element.parent.children.forEach((child) => {\n if (child.type != \"bpmn:Lane\") {\n // if child has lanes\n if (\n child.businessObject.lanes &&\n child.businessObject.lanes.length > 0\n ) {\n // if lane is me\n var myLane = child.businessObject.lanes.find((l) => {\n return l.id == this.diagramID;\n });\n if (myLane) {\n this.transferParticipantWhereToMe(element.parent.id);\n\n // tell child I'm it's lane:\n var objChild = this.process.elementForDiagramID(\n child.id\n );\n if (objChild) {\n objChild.setLane(this);\n }\n }\n }\n }\n });\n }\n }\n\n this.onChange(element);\n }\n\n /**\n * onChange()\n * update the current Lane with information that was relevant\n * from the provided BPMN:Lane\n * @param {BPMNParticipant}\n */\n onChange(defElement) {\n /*\n Sample DefElement:\n {\n \"labels\": [],\n \"children\": [],\n \"id\": \"Participant_185ljkg\",\n \"width\": 958,\n \"height\": 240,\n \"type\": \"bpmn:Participant\",\n \"x\": -810,\n \"y\": -2010,\n \"order\": {\n \"level\": -2\n },\n \"businessObject\": {\n \"$type\": \"bpmn:Participant\",\n \"id\": \"Participant_185ljkg\",\n \"di\": {\n \"$type\": \"bpmndi:BPMNShape\",\n \"bounds\": {\n \"$type\": \"dc:Bounds\",\n \"x\": -810,\n \"y\": -2010,\n \"width\": 958,\n \"height\": 240\n },\n \"id\": \"Participant_185ljkg_di\",\n \"isHorizontal\": true\n },\n \"processRef\": {\n \"$type\": \"bpmn:Process\",\n \"id\": \"Process_0x3sul5\"\n }\n }\n */\n\n // from the BPMI modeler we can gather a label for this:\n if (\n defElement.businessObject.name &&\n defElement.businessObject.name != \"\"\n ) {\n this.label = defElement.businessObject.name;\n }\n\n // if I picked up a new task, inform it I am it's lane:\n }\n};\n","/**\n * ABProcessParticipant\n * manages the participant lanes in a Process Diagram.\n *\n * Participants manage users in the system (when there are no lanes defined)\n * and provide a way to lookup a SiteUser.\n */\nvar ABProcessParticipantCore = require(\"../../core/process/ABProcessParticipantCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABProcessParticipant extends ABProcessParticipantCore {\n // constructor(attributes, process, AB) {\n // super(attributes, process, AB);\n // }\n\n ////\n //// Modeler Instance Methods\n ////\n\n /**\n * fromElement()\n * initialize this Participant's values from the given BPMN:Participant\n * @param {BPMNParticipant}\n */\n fromElement(element) {\n this.diagramID = element.id || this.diagramID;\n this.onChange(element);\n }\n\n /**\n * onChange()\n * update the current Participant with information that was relevant\n * from the provided BPMN:Participant\n * @param {BPMNParticipant}\n */\n onChange(defElement) {\n /*\n Sample DefElement:\n {\n \"labels\": [],\n \"children\": [],\n \"id\": \"Participant_185ljkg\",\n \"width\": 958,\n \"height\": 240,\n \"type\": \"bpmn:Participant\",\n \"x\": -810,\n \"y\": -2010,\n \"order\": {\n \"level\": -2\n },\n \"businessObject\": {\n \"$type\": \"bpmn:Participant\",\n \"id\": \"Participant_185ljkg\",\n \"di\": {\n \"$type\": \"bpmndi:BPMNShape\",\n \"bounds\": {\n \"$type\": \"dc:Bounds\",\n \"x\": -810,\n \"y\": -2010,\n \"width\": 958,\n \"height\": 240\n },\n \"id\": \"Participant_185ljkg_di\",\n \"isHorizontal\": true\n },\n \"processRef\": {\n \"$type\": \"bpmn:Process\",\n \"id\": \"Process_0x3sul5\"\n }\n }\n */\n\n // from the BPMI modeler we can gather a label for this:\n if (\n defElement.businessObject.name &&\n defElement.businessObject.name != \"\"\n ) {\n this.label = defElement.businessObject.name;\n }\n\n if (defElement.children) {\n var laneIDs = [];\n defElement.children.forEach((c) => {\n if (c.type == \"bpmn:Lane\") {\n laneIDs.push(c.id);\n }\n });\n this.laneIDs = laneIDs;\n }\n }\n\n /**\n * diagramProperties()\n * return a set of values for the XML shape definition based upon\n * the current values of this objec.\n * @return {json}\n */\n diagramProperties() {\n return [\n {\n id: this.diagramID,\n def: {\n name: this.name,\n },\n },\n ];\n }\n};\n","const ABProcessElementCore = require(\"../../../core/process/tasks/ABProcessElementCore.js\");\n\nmodule.exports = class ABProcessElement extends ABProcessElementCore {\n // constructor(attributes, process, AB, defaultValues) {\n // super(attributes, process, AB, defaultValues);\n\n // // listen\n // }\n\n /**\n * @method destroy()\n * remove this task definition.\n * @return {Promise}\n */\n destroy() {\n ////\n //// TODO: once our core conversion is complete, this .save() can be\n //// moved to ABProcessTaskCore, and our ABDefinition.save() can take\n //// care of the proper method to save depending on the current Platform.\n ////\n // return this.toDefinition()\n // .destroy()\n\n return super.destroy().then(() => {\n return this.process.elementRemove(this);\n });\n }\n\n isValid() {\n /*\n var validator = OP.Validation.validator();\n\n // label/name must be unique:\n var isNameUnique =\n this.AB.processes((o) => {\n return o.name.toLowerCase() == this.name.toLowerCase();\n }).length == 0;\n if (!isNameUnique) {\n validator.addError(\n \"name\",\n L(\n \"ab.validation.object.name.unique\",\n `Process name must be unique (\"${this.name}\"\" already used in this Application)`\n )\n );\n }\n\n return validator;\n */\n\n // var isValid =\n // this.AB.processes((o) => {\n // return o.name.toLowerCase() == this.name.toLowerCase();\n // }).length == 0;\n // return isValid;\n\n return true;\n }\n\n ////\n //// Modeler Instance Methods\n ////\n\n findLane(curr, cb) {\n if (!curr) {\n cb(null, null);\n return;\n }\n\n // if current object has a LANE definition, use that one:\n if (curr.lanes && curr.lanes.length > 0) {\n cb(null, curr.lanes[0]);\n } else if (curr.$type == \"bpmn:Participant\") {\n // if the current is a Participant, take that one\n cb(null, curr);\n } else {\n // else move upwards and check again:\n curr = curr.$parent;\n this.findLane(curr, cb);\n }\n }\n\n setLane(Lane) {\n this.laneDiagramID = Lane.diagramID;\n }\n\n /**\n * fromElement()\n * initialize this Task's values from the given BPMN:Element\n * @param {BPMNElement}\n */\n fromElement(element) {\n this.diagramID = element.id || this.diagramID;\n this.onChange(element);\n }\n\n /**\n * onChange()\n * update the current Task with information that was relevant\n * from the provided BPMN:Element\n * @param {BPMNElement}\n */\n onChange(defElement) {\n /*\n Sample DefElement:\n {\n \"labels\": [],\n \"children\": [],\n \"id\": \"Task_08j07ni\",\n \"width\": 100,\n \"height\": 80,\n \"type\": \"bpmn:SendTask\",\n \"x\": 20,\n \"y\": -2130,\n \"order\": {\n \"level\": 5\n },\n \"businessObject\": {\n \"$type\": \"bpmn:SendTask\",\n \"id\": \"Task_08j07ni\",\n \"name\": \"ffff\",\n \"di\": {\n \"$type\": \"bpmndi:BPMNShape\",\n \"bounds\": {\n \"$type\": \"dc:Bounds\",\n \"x\": 20,\n \"y\": -2130,\n \"width\": 100,\n \"height\": 80\n },\n \"id\": \"SendTask_0iidv6o_di\"\n }\n\n // Some elements (like EndEvents) have:\n .eventDefinitions: [\n {\n $type: \"actual bpmn:ElementType\",\n ...\n }\n ]\n },\n \"incoming\":[],\n \"outgoing\":[]\n }\n */\n\n // from the BPMI modeler we can gather a label for this:\n if (\n defElement.businessObject.name &&\n defElement.businessObject.name != \"\"\n ) {\n this.label = defElement.businessObject.name;\n }\n\n // our lane may have changed:\n var currObj = defElement.businessObject;\n this.findLane(currObj, (err, obj) => {\n if (obj) {\n this.laneDiagramID = obj.id;\n } else {\n // if my parent shape is a Participant, then use that:\n if (\n defElement.parent &&\n defElement.parent.type == \"bpmn:Participant\"\n ) {\n this.laneDiagramID = defElement.parent.id;\n } else {\n this.laneDiagramID = null;\n }\n }\n });\n }\n\n /**\n * diagramProperties()\n * return a set of values for the XML shape definition based upon\n * the current values of this object.\n * @return {json}\n */\n diagramProperties() {\n const warnings = this.warnings();\n return [\n {\n id: this.diagramID,\n def: {\n name: this.name,\n },\n warn: warnings.length ? warnings : null,\n },\n ];\n }\n\n /**\n * propertiesShow()\n * display the properties panel for this Process Element.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesShow(id) {\n var ui = {\n id: id,\n view: \"label\",\n label: \"this task has not implement properties yet...\",\n };\n\n webix.ui(ui, $$(id));\n\n $$(id).show();\n }\n\n /**\n * propertiesStash()\n * pull our values from our property panel.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesStash(id) {}\n\n /**\n * property()\n * return the specific property value if it exists.\n * @return {mixed} | undefined\n */\n property(id) {\n if ($$(id)) {\n return $$(id).getValue();\n }\n }\n\n /**\n * switchTo()\n * replace this object with an instance of one of our child classes:\n * @param {ABProcessTask*} child\n * an instance of the new Process Task we are replaced with.\n * @param {string} propertiesID\n * the webix ui.id container for the properties panel.\n */\n switchTo(child, propertiesID) {\n // remove myself from our containing process's elements\n this.process.elementRemove(this);\n\n // add the new Process WITH the same id\n this.process.elementAdd(child);\n\n // show the child properties:\n child.propertiesShow(propertiesID);\n\n this.emit(\"switchTo\", child);\n }\n\n /**\n * @method warningsEval()\n * re-evaluate our warnings for this Process Task.\n * Most of our ProcessTasks need to also verify data related to\n * other available tasks, so we need to call the onProcessReady()\n * so we can access those values.\n */\n warningsEval() {\n super.warningsEval();\n this.onProcessReady();\n\n // if this isn't an end type of task, then there must be\n // > 0 next tasks\n if (!this.isEndTask()) {\n const myOutgoingConnections = this.process.connectionsOutgoing(\n this.diagramID\n );\n if (myOutgoingConnections.length < 1) {\n this.warningMessage(\"should have another task after this one\");\n }\n }\n }\n\n /**\n * @method warningMessage(message)\n * Save a warning message in a common format for our ProcessTasks.\n */\n warningMessage(msg, data = {}) {\n let message = `${this.defaults.key}[${\n this.label ? this.label : this.name\n }]: ${msg}`;\n this._warnings.push({ message, data });\n }\n};\n","const ABProcessEndCore = require(\"../../../core/process/tasks/ABProcessEndCore.js\");\n\nmodule.exports = class ABProcessEnd extends ABProcessEndCore {\n /**\n * do()\n * this method actually performs the action for this task.\n * @param {obj} instance the instance data of the running process\n * @return {Promise}\n * resolve(true/false) : true if the task is completed.\n * false if task is still waiting\n */\n // do(instance) {\n // return new Promise((resolve, reject) => {\n // // An End Event doesn't perform any other actions\n // // than to signal it has successfully completed.\n // // But it provides no Additional Tasks to work on.\n // // for testing:\n // this.stateCompleted(instance);\n // this.log(instance, \"End Event Reached\");\n // resolve(true);\n // });\n // }\n};\n","const ABProcessGatewayExclusiveCore = require(\"../../../core/process/tasks/ABProcessGatewayExclusiveCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABProcessGatewayExclusive extends (\n ABProcessGatewayExclusiveCore\n) {\n ////\n //// Process Instance Methods\n ////\n\n /**\n * diagramProperties()\n * return a set of values for the XML shape definition based upon\n * the current values of this object.\n * @return {json}\n */\n diagramProperties() {\n // the first entry is for the gateway element itself\n var properties = super.diagramProperties();\n /*[\n {\n id: this.diagramID,\n def: {\n name: this.name,\n },\n },\n ];\n */\n\n // now add any additional updates for each of our connections:\n var myOutgoingConnections = this.process.connectionsOutgoing(\n this.diagramID\n );\n myOutgoingConnections.forEach((conn) => {\n properties.push({\n id: conn.id,\n def: {\n name: this.conditions[conn.id]?.label ?? \"\",\n },\n });\n });\n return properties;\n }\n\n warningsEval() {\n super.warningsEval();\n\n // make sure we have > 1 connection.\n const myOutgoingConnections = this.process.connectionsOutgoing(\n this.diagramID\n );\n if (myOutgoingConnections.length < 2) {\n this.warningMessage(\"should have multiple outgoing connections\");\n }\n\n // make sure there is no more then 1 connection that doesn't have\n // a condition:\n let numCondWithOne = 0;\n myOutgoingConnections.forEach((c) => {\n this.conditions[c.id] = this.conditions[c.id] ?? {};\n this.conditions[c.id].filterValue = this.conditions[c.id]\n .filterValue ?? { glue: \"and\", rules: [] };\n if ((this.conditions[c.id]?.filterValue.rules?.length ?? 0) == 0) {\n numCondWithOne++;\n }\n });\n\n if (numCondWithOne > 1) {\n this.warningMessage(\n \"should not have more than 1 unfiltered connection.\"\n );\n }\n }\n};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessTaskEmailCore = require(\"../../../core/process/tasks/ABProcessTaskEmailCore.js\");\n\nmodule.exports = class ABProcessTaskEmail extends ABProcessTaskEmailCore {\n ////\n //// Process Instance Methods\n ////\n\n warningsEval() {\n super.warningsEval();\n\n // check for warnings:\n\n if (!this.subject) {\n this.warningMessage(\"is missing a subject\");\n }\n\n if (!this.message) {\n this.warningMessage(\"is missing a message\");\n }\n\n this.verifySetting(\"to\");\n this.verifySetting(\"from\");\n this.verifyNextLane(\"to\");\n if (this.from == \"0\") {\n let thisLane = this.myLane();\n if (!thisLane) {\n this.warningMessage(\n \"can not resolve the lane participant for [.from] field.\"\n );\n }\n }\n this.verifyRoleAccount(\"to\", \"toUsers\");\n this.verifyRoleAccount(\"from\", \"fromUsers\");\n }\n\n /**\n * @method verifySetting()\n * make sure the given field key has a value assigned.\n * @param {string} key\n * the property of this object to check. (to, from)\n */\n verifySetting(key) {\n if (this[key] == \"\") {\n this.warningMessage(`does not have a [${key}] setting.`);\n }\n }\n\n /**\n * @method verifyNextLane()\n * make sure we can access a Lane for the given property key.\n * The \"to\" field can reference the \"Next Participant\". This checks to\n * see if we can reference a lane for the next task.\n * @param {string} key\n * the property that has the value for Next Participant. [to]\n */\n verifyNextLane(key) {\n if (this[key] === \"0\") {\n // Next Participant\n // we need to resolve our next task and see if we can pull the participant info from it.\n\n let nextTasks = this.process.connectionNextTask(this);\n let nextLanesResolved = true;\n nextTasks.forEach((t) => {\n let lane = t.myLane();\n if (!lane) {\n nextLanesResolved = false;\n }\n });\n if (!nextLanesResolved || nextTasks.length == 0) {\n this.warningMessage(\n `can not resolve next lane participant for [${key}] field.`\n );\n }\n }\n }\n\n /**\n * @method verifyRoleAccount()\n * Check to see if the provided property is set to use a Role/Account for\n * the email, and make sure there are values set for what is chosen.\n * @param {string} key\n * the property we are currently validating.\n * @param {string} valKey\n * the property that contains the specific value object.\n */\n verifyRoleAccount(key, valKey) {\n if (this[key] == \"1\") {\n if (this[valKey]) {\n if (this[valKey].useRole) {\n if (this[valKey].role.length == 0) {\n this.warningMessage(`can not resolve [${key}] Role setting.`);\n }\n }\n if (this[valKey].useAccount) {\n if (this[valKey].account.length == 0) {\n this.warningMessage(\n `can not resolve [${key}] Account setting.`\n );\n }\n }\n // TODO:\n // if (this[valKey].userFields.length > 0) {\n // // how to know if this is a problem?\n // }\n }\n }\n }\n};\n","const ABProcessTaskServiceCore = require(\"../../../core/process/tasks/ABProcessTaskServiceCore.js\");\n\nmodule.exports = class ABProcessTaskService extends ABProcessTaskServiceCore {};\n","const AccountingBatchProcessingCore = require(\"../../../core/process/tasks/ABProcessTaskServiceAccountingBatchProcessingCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class AccountingBatchProcessing extends (\n AccountingBatchProcessingCore\n) {\n ////\n //// Process Instance Methods\n ////\n\n propertyIDs(id) {\n return {\n name: `${id}_name`,\n processBatchValue: `${id}_processBatchValue`,\n objectBatch: `${id}_objectBatch`,\n fieldBatchEntries: `${id}_fieldBatchEntries`,\n fieldBatchFinancialPeriod: `${id}_fieldBatchFinancialPeriod`,\n objectJE: `${id}_objectJE`,\n fieldJEAccount: `${id}_fieldJEAccount`,\n fieldJERC: `${id}_fieldJERC`,\n fieldJEStatus: `${id}_fieldJEStatus`,\n fieldJEStatusComplete: `${id}_fieldJEStatusComplete`,\n objectBR: `${id}_objectBR`,\n fieldBRFinancialPeriod: `${id}_fieldBRFinancialPeriod`,\n fieldBRAccount: `${id}_fieldBRAccount`,\n fieldBRRC: `${id}_fieldBRRC`,\n fieldBREntries: `${id}_fieldBREntries`,\n };\n }\n\n /**\n * propertiesShow()\n * display the properties panel for this Process Element.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesShow(id) {\n var ids = this.propertyIDs(id);\n\n var processValues = [{ id: 0, value: L(\"Select a Process Value\") }];\n var processDataFields = this.process.processDataFields(this);\n (processDataFields || []).forEach((row) => {\n processValues.push({ id: row.key, value: row.label });\n });\n\n var objectList = this.AB.objects().map((o) => {\n return { id: o.id, value: o.label || o.name, object: o };\n });\n objectList.unshift({\n id: 0,\n value: L(\"Select an Object\"),\n });\n\n //\n // set up field settings:\n //\n\n var blankField = {\n id: 0,\n value: L(\"Select a Field\"),\n };\n // blankField : generic Select a field entry\n\n function defaultFields(objID) {\n // create a new options array of Field Choices for the given obj.id\n\n var fields = [blankField];\n if (objID) {\n var entry = objectList.find((o) => o.id == objID);\n if (entry && entry.object) {\n entry.object.fields().forEach((f) => {\n fields.push({ id: f.id, value: f.label, field: f });\n });\n }\n }\n return fields;\n }\n\n function updateFields(fieldPickers, fieldValues, defaultValue) {\n // update the list of field select choices with the new field choices\n\n fieldPickers.forEach((fp) => {\n var picker = $$(fp);\n if (picker) {\n picker.define(\"options\", fieldValues);\n // if (defaultValue) {\n // picker.define(\"value\", defaultValue);\n // } else {\n // picker.define(\"value\", fieldValues[0].value);\n // }\n picker.refresh();\n picker.show();\n }\n });\n }\n\n var batchFields = defaultFields(this.objectBatch);\n // batchFields : the default list of fields for the Batch Object\n\n var fieldPickersBatch = [\n ids.fieldBatchEntries,\n ids.fieldBatchFinancialPeriod,\n ];\n // fieldPickersBatch : the list of field selects to update for the Batch\n // object.\n\n var jeFields = defaultFields(this.objectJE);\n // jeFields : the default list of fields for the Journal Entry Object\n\n var fieldPickersJE = [\n ids.fieldJEAccount,\n ids.fieldJERC,\n ids.fieldJEStatus,\n ];\n // fieldPickersJE : the list of field selects to update for the Journal Entry\n // object.\n\n function compileStatusValues(statusField) {\n var values = [{ id: 0, value: L(\"Select the Complete Value\") }];\n if (statusField && statusField.options) {\n statusField.options().forEach((o) => {\n values.push({ id: o.id, value: o.text });\n });\n }\n return values;\n }\n\n function updatePickerStatusComplete(values) {\n var wbxComplete = $$(ids.fieldJEStatusComplete);\n if (wbxComplete) {\n // update fieldJEStatusComplete options\n wbxComplete.define(\"options\", values);\n wbxComplete.refresh();\n // show fieldJEStatusComplete\n wbxComplete.show();\n }\n }\n\n function onStatusComplete(newVal) {\n // pull the ABField object from newValue\n var jeEntryID = $$(ids.objectJE).getValue();\n var jeEntry = objectList.find((o) => o.id == jeEntryID);\n if (jeEntry && jeEntry.object) {\n var statusField = jeEntry.object.fieldByID(newVal);\n if (statusField && statusField.options) {\n // get the options as an []\n jeFieldStatusValues = compileStatusValues(statusField);\n\n updatePickerStatusComplete(jeFieldStatusValues);\n }\n }\n }\n\n var jeFieldStatusValues = compileStatusValues();\n // jeFieldStatusValues : the list of status options from the fieldJEStatus\n // selected entry.\n\n var brFields = defaultFields(this.objectBR);\n // jeFields : the default list of fields for the Journal Entry Object\n\n var fieldPickersBR = [\n ids.fieldBRFinancialPeriod,\n ids.fieldBRAccount,\n ids.fieldBRRC,\n ids.fieldBREntries,\n ];\n // fieldPickersBR : the list of field selects to update for the Balance Record\n // object.\n\n var ui = {\n id: id,\n view: \"form\",\n elements: [\n {\n id: ids.name,\n view: \"text\",\n label: L(\"Name\"),\n name: \"name\",\n value: this.name,\n },\n {\n id: ids.processBatchValue,\n view: \"select\",\n label: L(\"Process Batch Value\"),\n value: this.processBatchValue,\n name: \"processBatchValue\",\n options: processValues,\n },\n {\n id: ids.objectBatch,\n view: \"select\",\n label: L(\"Batch Object\"),\n value: this.objectBatch,\n name: \"objectBatch\",\n options: objectList,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n // gather new set of batchFields\n batchFields = defaultFields(newVal);\n // rebuild the associated list of Fields to pick\n updateFields(fieldPickersBatch, batchFields);\n }\n },\n },\n },\n {\n id: ids.fieldBatchEntries,\n view: \"select\",\n label: L(\"Batch->JE[]\"),\n value: this.fieldBatchEntries,\n name: \"fieldBatchEntries\",\n options: batchFields,\n hidden: true,\n },\n {\n id: ids.fieldBatchFinancialPeriod,\n view: \"select\",\n label: L(\"Batch->FinancialPeriod\"),\n value: this.fieldBatchFinancialPeriod,\n name: \"fieldBatchFinancialPeriod\",\n options: batchFields,\n hidden: true,\n },\n {\n id: ids.objectJE,\n view: \"select\",\n label: L(\"Journal Entry Object\"),\n value: this.objectJE,\n name: \"objectJE\",\n options: objectList,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n // gather new set of jeFields\n jeFields = defaultFields(newVal);\n // rebuild the associated list of Fields to pick\n updateFields(fieldPickersJE, jeFields);\n }\n },\n },\n },\n {\n id: ids.fieldJEAccount,\n view: \"select\",\n label: L(\"JE->Account\"),\n value: this.fieldJEAccount,\n name: \"fieldJEAccount\",\n options: jeFields,\n hidden: true,\n },\n {\n id: ids.fieldJERC,\n view: \"select\",\n label: L(\"JE->RC\"),\n value: this.fieldJERC,\n name: \"fieldJERC\",\n options: jeFields,\n hidden: true,\n },\n {\n id: ids.fieldJEStatus,\n view: \"select\",\n label: L(\"JE->Status\"),\n value: this.fieldJEStatus,\n name: \"fieldJEStatus\",\n options: jeFields,\n hidden: true,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n onStatusComplete(newVal);\n }\n },\n },\n },\n {\n id: ids.fieldJEStatusComplete,\n view: \"select\",\n label: L(\"JE->Status->Complete\"),\n value: this.fieldJEStatusComplete,\n name: \"fieldJEStatusComplete\",\n options: jeFieldStatusValues,\n hidden: true,\n },\n {\n id: ids.objectBR,\n view: \"select\",\n label: L(\"Balance Record\"),\n value: this.objectBR,\n name: \"objectBR\",\n options: objectList,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n // gather new set of jeFields\n brFields = defaultFields(newVal);\n // rebuild the associated list of Fields to pick\n updateFields(fieldPickersBR, brFields);\n }\n },\n },\n },\n {\n id: ids.fieldBRFinancialPeriod,\n view: \"select\",\n label: L(\"BR->FP\"),\n value: this.fieldBRFinancialPeriod,\n name: \"fieldBRFinancialPeriod\",\n options: brFields,\n hidden: true,\n },\n {\n id: ids.fieldBRAccount,\n view: \"select\",\n label: L(\"BR->Account\"),\n value: this.fieldBRAccount,\n name: \"fieldBRAccount\",\n options: brFields,\n hidden: true,\n },\n {\n id: ids.fieldBRRC,\n view: \"select\",\n label: L(\"BR->RC\"),\n value: this.fieldBRRC,\n name: \"fieldBRRC\",\n options: brFields,\n hidden: true,\n },\n {\n id: ids.fieldBREntries,\n view: \"select\",\n label: L(\"BR->Entries\"),\n value: this.fieldBREntries,\n name: \"fieldBREntries\",\n options: brFields,\n hidden: true,\n },\n ],\n };\n\n webix.ui(ui, $$(id));\n\n // if there are already default values for our Objects,\n // unhide the field selectors:\n if (this.objectBatch && this.objectBatch != 0) {\n updateFields(fieldPickersBatch, batchFields);\n }\n\n if (this.objectJE && this.objectJE != 0) {\n updateFields(fieldPickersJE, jeFields);\n }\n\n if (this.fieldJEStatus) {\n onStatusComplete(this.fieldJEStatus);\n }\n\n if (this.objectBR && this.objectBR != 0) {\n updateFields(fieldPickersBR, brFields);\n }\n\n $$(id).show();\n }\n\n /**\n * propertiesStash()\n * pull our values from our property panel.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesStash(id) {\n var ids = this.propertyIDs(id);\n this.name = this.property(ids.name);\n\n this.defaults.settings.forEach((s) => {\n this[s] = this.property(ids[s]);\n });\n }\n};\n","const AccountingFPCloseCore = require(\"../../../core/process/tasks/ABProcessTaskServiceAccountingFPCloseCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class AccountingFPClose extends AccountingFPCloseCore {\n ////\n //// Process Instance Methods\n ////\n\n propertyIDs(id) {\n return {\n name: `${id}_name`,\n processFPValue: `${id}_processFPValue`,\n objectFP: `${id}_objectFP`,\n objectGL: `${id}_objectGL`,\n objectAcc: `${id}_objectAcc`,\n fieldFPStart: `${id}_fieldFPStart`,\n fieldFPOpen: `${id}_fieldFPOpen`,\n fieldFPStatus: `${id}_fieldFPStatus`,\n fieldFPActive: `${id}_fieldFPActive`,\n fieldGLStarting: `${id}_fieldGLStarting`,\n fieldGLRunning: `${id}_fieldGLRunning`,\n fieldGLAccount: `${id}_fieldGLAccount`,\n fieldGLRc: `${id}_fieldGLRc`,\n fieldGLDebit: `${id}fieldGLDebit`,\n fieldGLCredit: `${id}_fieldGLCredit`,\n fieldAccType: `${id}_fieldAccType`,\n fieldAccAsset: `${id}_fieldAccAsset`,\n fieldAccExpense: `${id}_fieldAccExpense`,\n fieldAccLiabilities: `${id}_fieldAccLiabilities`,\n fieldAccEquity: `${id}_fieldAccEquity`,\n fieldAccIncome: `${id}_fieldAccIncome`,\n };\n }\n\n /**\n * propertiesShow()\n * display the properties panel for this Process Element.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesShow(id) {\n var ids = this.propertyIDs(id);\n\n var processValues = [{ id: 0, value: L(\"Select a Process Value\") }];\n var processDataFields = this.process.processDataFields(this);\n (processDataFields || []).forEach((row) => {\n processValues.push({ id: row.key, value: row.label });\n });\n\n var objectList = this.AB.objects().map((o) => {\n return { id: o.id, value: o.label || o.name, object: o };\n });\n objectList.unshift({\n id: 0,\n value: L(\"Select an Object\"),\n });\n\n let getFieldOptions = (objID) => {\n let fields = [\n {\n id: 0,\n value: L(\"Select a Field\"),\n },\n ];\n\n if (objID) {\n var entry = objectList.find((o) => o.id == objID);\n if (entry && entry.object) {\n entry.object.fields().forEach((f) => {\n fields.push({ id: f.id, value: f.label, field: f });\n });\n }\n }\n return fields;\n };\n\n let getStatusFieldOptions = (statusFieldId) => {\n let result = [];\n let fpObject = this.AB.objectByID(this.objectFP);\n if (!fpObject) return result;\n\n let fpStatusField = fpObject.fieldByID(statusFieldId);\n if (\n !fpStatusField ||\n !fpStatusField.settings ||\n !fpStatusField.settings.options\n )\n return result;\n\n result = (fpStatusField.settings.options || []).map((opt) => {\n return {\n id: opt.id,\n value: opt.text,\n };\n });\n\n return result;\n };\n\n let updateFPFields = (fpFields) => {\n [ids.fieldFPStart, ids.fieldFPOpen, ids.fieldFPStatus].forEach(\n (fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", fpFields);\n $$(fieldGLElem).refresh();\n }\n );\n };\n\n let updateFPStatusFields = (fpStatusOptions) => {\n $$(ids.fieldFPActive).define(\"options\", fpStatusOptions);\n $$(ids.fieldFPActive).refresh();\n };\n\n let updateGLFields = (glFields) => {\n [\n ids.fieldGLRunning,\n ids.fieldGLAccount,\n ids.fieldGLRc,\n ids.fieldGLDebit,\n ids.fieldGLCredit,\n ].forEach((fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", glFields);\n $$(fieldGLElem).refresh();\n });\n };\n\n let updateAccFields = (accFields) => {\n $$(ids.fieldAccType).define(\"options\", accFields);\n $$(ids.fieldAccType).refresh();\n };\n\n let updateAccTypeOptions = (accTypeOptions) => {\n [\n ids.fieldAccAsset,\n ids.fieldAccExpense,\n ids.fieldAccLiabilities,\n ids.fieldAccEquity,\n ids.fieldAccIncome,\n ].forEach((fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", accTypeOptions);\n $$(fieldGLElem).refresh();\n });\n };\n\n let getListOptions = (objectId, fieldId) => {\n let result = [];\n let object = this.AB.objectByID(objectId);\n if (!object) return result;\n\n let fpStatusField = object.fieldByID(fieldId);\n if (\n !fpStatusField ||\n !fpStatusField.settings ||\n !fpStatusField.settings.options\n )\n return result;\n\n result = (fpStatusField.settings.options || []).map((opt) => {\n return {\n id: opt.id,\n value: opt.text,\n };\n });\n\n return result;\n };\n\n let fpFields = getFieldOptions(this.objectFP);\n let glFields = getFieldOptions(this.objectGL);\n let accFields = getFieldOptions(this.objectAcc);\n let fpStatusFields = getStatusFieldOptions(this.fieldFPStatus);\n let accTypeOptions = getListOptions(this.objectAcc, this.fieldAccType);\n\n var ui = {\n id: id,\n view: \"form\",\n elementsConfig: {\n labelWidth: 200,\n },\n elements: [\n {\n id: ids.name,\n view: \"text\",\n label: L(\"Name\"),\n name: \"name\",\n value: this.name,\n },\n {\n id: ids.processFPValue,\n view: \"select\",\n label: L(\"Process Fiscal Period Value\"),\n value: this.processFPValue,\n name: \"processFPValue\",\n options: processValues,\n },\n {\n id: ids.objectFP,\n view: \"select\",\n label: L(\"FP Object\"),\n value: this.objectFP,\n name: \"objectFP\",\n options: objectList,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n // gather new set of batchFields\n fpFields = getFieldOptions(newVal);\n // rebuild the associated list of Fields to pick\n updateFPFields(fpFields);\n }\n },\n },\n },\n {\n id: ids.objectGL,\n view: \"select\",\n label: L(\"GL Object\"),\n value: this.objectGL,\n name: \"objectGL\",\n options: objectList,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n // gather new set of batchFields\n glFields = getFieldOptions(newVal);\n // rebuild the associated list of Fields to pick\n updateGLFields(glFields);\n }\n },\n },\n },\n {\n id: ids.objectAcc,\n view: \"select\",\n label: L(\"Account Object\"),\n value: this.objectAcc,\n name: \"objectAcc\",\n options: objectList,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n accFields = getFieldOptions(newVal);\n updateAccFields(accFields);\n }\n },\n },\n },\n {\n id: ids.fieldFPStart,\n view: \"select\",\n label: L(\"FP -> Start\"),\n value: this.fieldFPStart,\n name: \"fieldFPStart\",\n options: fpFields,\n },\n {\n id: ids.fieldFPOpen,\n view: \"select\",\n label: L(\"FP -> Open\"),\n value: this.fieldFPOpen,\n name: \"fieldFPOpen\",\n options: fpFields,\n },\n {\n id: ids.fieldFPStatus,\n view: \"select\",\n label: L(\"FP -> Status\"),\n value: this.fieldFPStatus,\n name: \"fieldFPStatus\",\n options: fpFields,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n fpStatusFields = getStatusFieldOptions(newVal);\n updateFPStatusFields(fpStatusFields);\n }\n },\n },\n },\n {\n id: ids.fieldFPActive,\n view: \"select\",\n label: L(\"FP -> Active\"),\n value: this.fieldFPActive,\n name: \"fieldFPActive\",\n options: fpStatusFields,\n },\n {\n id: ids.fieldGLStarting,\n view: \"select\",\n label: L(\"GL -> Starting BL\"),\n value: this.fieldGLStarting,\n name: \"fieldGLStarting\",\n options: glFields,\n },\n {\n id: ids.fieldGLRunning,\n view: \"select\",\n label: L(\"GL -> Running BL\"),\n value: this.fieldGLRunning,\n name: \"fieldGLRunning\",\n options: glFields,\n },\n {\n id: ids.fieldGLAccount,\n view: \"select\",\n label: L(\"GL -> Account\"),\n value: this.fieldGLAccount,\n name: \"fieldGLAccount\",\n options: glFields,\n },\n {\n id: ids.fieldGLRc,\n view: \"select\",\n label: L(\"GL -> RC\"),\n value: this.fieldGLRc,\n name: \"fieldGLRc\",\n options: glFields,\n },\n {\n id: ids.fieldGLDebit,\n view: \"select\",\n label: L(\"GL -> Debit\"),\n value: this.fieldGLDebit,\n name: \"fieldGLDebit\",\n options: glFields,\n },\n {\n id: ids.fieldGLCredit,\n view: \"select\",\n label: L(\"GL -> Credit\"),\n value: this.fieldGLCredit,\n name: \"fieldGLCredit\",\n options: glFields,\n },\n {\n id: ids.fieldAccType,\n view: \"select\",\n label: L(\"Acc -> Type\"),\n value: this.fieldAccType,\n name: \"fieldAccType\",\n options: accFields,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n accTypeOptions = getListOptions(\n this.objectAcc || $$(ids.objectAcc).getValue(),\n newVal\n );\n updateAccTypeOptions(accTypeOptions);\n }\n },\n },\n },\n {\n id: ids.fieldAccAsset,\n view: \"select\",\n label: L(\"Acc -> Asset\"),\n value: this.fieldAccAsset,\n name: \"fieldAccAsset\",\n options: accTypeOptions,\n },\n {\n id: ids.fieldAccExpense,\n view: \"select\",\n label: L(\"Acc -> Expense\"),\n value: this.fieldAccExpense,\n name: \"fieldAccExpense\",\n options: accTypeOptions,\n },\n {\n id: ids.fieldAccLiabilities,\n view: \"select\",\n label: L(\"Acc -> Liabilities\"),\n value: this.fieldAccLiabilities,\n name: \"fieldAccLiabilities\",\n options: accTypeOptions,\n },\n {\n id: ids.fieldAccEquity,\n view: \"select\",\n label: L(\"Acc -> Equity\"),\n value: this.fieldAccEquity,\n name: \"fieldAccEquity\",\n options: accTypeOptions,\n },\n {\n id: ids.fieldAccIncome,\n view: \"select\",\n label: L(\"Acc -> Income\"),\n value: this.fieldAccIncome,\n name: \"fieldAccIncome\",\n options: accTypeOptions,\n },\n ],\n };\n\n webix.ui(ui, $$(id));\n\n $$(id).show();\n }\n\n /**\n * propertiesStash()\n * pull our values from our property panel.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesStash(id) {\n var ids = this.propertyIDs(id);\n this.name = this.property(ids.name);\n\n // TIP: keep the .settings entries == ids[s] keys and this will\n // remain simple:\n this.defaults.settings.forEach((s) => {\n this[s] = this.property(ids[s]);\n });\n }\n};\n","const AccountingFPYearCloseCore = require(\"../../../core/process/tasks/ABProcessTaskServiceAccountingFPYearCloseCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class AccountingFPYearClose extends AccountingFPYearCloseCore {\n ////\n //// Process Instance Methods\n ////\n propertyIDs(id) {\n return {\n name: `${id}_name`,\n processFPYearValue: `${id}_processFPYearValue`,\n objectFPYear: `${id}_objectFPYear`,\n objectFPMonth: `${id}_objectFPMonth`,\n objectGL: `${id}_objectGL`,\n objectAccount: `${id}_objectAccount`,\n valueFundBalances: `${id}_valueFundBalances`,\n valueNetIncome: `${id}_valueNetIncome`,\n fieldFPYearStart: `${id}_fieldFPYearStart`,\n fieldFPYearEnd: `${id}_fieldFPYearEnd`,\n fieldFPYearStatus: `${id}_fieldFPYearStatus`,\n fieldFPYearActive: `${id}_fieldFPYearActive`,\n fieldFPMonthStart: `${id}_fieldFPMonthStart`,\n fieldFPMonthEnd: `${id}_fieldFPMonthEnd`,\n fieldGLStartBalance: `${id}_fieldGLStartBalance`,\n fieldGLRunningBalance: `${id}_fieldGLRunningBalance`,\n fieldGLrc: `${id}_fieldGLrc`,\n fieldAccNumber: `${id}_fieldAccNumber`,\n fieldAccType: `${id}_fieldAccType`,\n fieldAccTypeIncome: `${id}_fieldAccTypeIncome`,\n fieldAccTypeExpense: `${id}_fieldAccTypeExpense`,\n fieldAccTypeEquity: `${id}_fieldAccTypeEquity`,\n };\n }\n\n /**\n * propertiesShow()\n * display the properties panel for this Process Element.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesShow(id) {\n var ids = this.propertyIDs(id);\n\n var processValues = [{ id: 0, value: L(\"Select a Process Value\") }];\n var processDataFields = this.process.processDataFields(this);\n (processDataFields || []).forEach((row) => {\n processValues.push({ id: row.key, value: row.label });\n });\n\n var objectList = this.AB.objects().map((o) => {\n return { id: o.id, value: o.label || o.name, object: o };\n });\n objectList.unshift({\n id: 0,\n value: L(\"Select an Object\"),\n });\n\n let getFieldOptions = (objID, fieldKey) => {\n let fields = [\n {\n id: 0,\n value: L(\"Select a Field\"),\n },\n ];\n\n if (objID) {\n var entry = objectList.find((o) => o.id == objID);\n if (entry && entry.object) {\n entry.object\n .fields((f) => f.key == fieldKey)\n .forEach((f) => {\n fields.push({ id: f.id, value: f.label, field: f });\n });\n }\n }\n return fields;\n };\n\n let getListOptions = (objectId, fieldId) => {\n let result = [];\n let object = this.AB.objectByID(objectId);\n if (!object) return result;\n\n let fpStatusField = object.fieldByID(fieldId);\n if (\n !fpStatusField ||\n !fpStatusField.settings ||\n !fpStatusField.settings.options\n )\n return result;\n\n result = (fpStatusField.settings.options || []).map((opt) => {\n return {\n id: opt.id,\n value: opt.text,\n };\n });\n\n return result;\n };\n\n let updateAccNumberFields = (accNumberFields) => {\n $$(ids.fieldAccNumber).define(\"options\", accNumberFields);\n $$(ids.fieldAccNumber).refresh();\n };\n\n let updateAccFields = (accFields) => {\n $$(ids.fieldAccType).define(\"options\", accFields);\n $$(ids.fieldAccType).refresh();\n };\n\n let updateAccTypeOptions = (accTypeOptions) => {\n [\n ids.fieldAccTypeIncome,\n ids.fieldAccTypeExpense,\n ids.fieldAccTypeEquity,\n ].forEach((fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", accTypeOptions);\n $$(fieldGLElem).refresh();\n });\n };\n\n let updateFPYearDateOptions = (fpYearDateOptions) => {\n [ids.fieldFPYearStart, ids.fieldFPYearEnd].forEach((fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", fpYearDateOptions);\n $$(fieldGLElem).refresh();\n });\n };\n\n let updateFPYearStatusOptions = (fpYearStatusFields) => {\n $$(ids.fieldFPYearStatus).define(\"options\", fpYearStatusFields);\n $$(ids.fieldFPYearStatus).refresh();\n };\n\n let updateFPYearActiveOptions = (fpYearStatusOptions) => {\n $$(ids.fieldFPYearActive).define(\"options\", fpYearStatusOptions);\n $$(ids.fieldFPYearActive).refresh();\n };\n\n let updateFPMonthDateFields = (fpMonthDateOpts) => {\n [ids.fieldFPMonthStart, ids.fieldFPMonthEnd].forEach((fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", fpMonthDateOpts);\n $$(fieldGLElem).refresh();\n });\n };\n\n let updateGlNumberFields = (glNumberOptions) => {\n [ids.fieldGLStartBalance, ids.fieldGLRunningBalance].forEach(\n (fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", glNumberOptions);\n $$(fieldGLElem).refresh();\n }\n );\n };\n\n let updateGlConnectFields = (glRcOptions) => {\n $$(ids.fieldGLrc).define(\"options\", glRcOptions);\n $$(ids.fieldGLrc).refresh();\n };\n\n let fpYearDateFields = getFieldOptions(this.objectFPYear, \"date\");\n let fpYearStatusFields = getFieldOptions(this.objectFPYear, \"list\");\n let fpYearStatusOptions = getListOptions(\n this.objectFPYear,\n this.fieldFPYearStatus\n );\n let fpMonthDateFields = getFieldOptions(this.objectFPMonth, \"date\");\n let glNumberFields = getFieldOptions(this.objectGL, \"number\");\n let glRcFields = getFieldOptions(this.objectGL, \"connectObject\");\n let accNumberFields = getFieldOptions(this.objectAccount, \"number\");\n let accTypeFields = getFieldOptions(this.objectAccount, \"list\");\n let accTypeOptions = getListOptions(\n this.objectAccount,\n this.fieldAccType\n );\n\n var ui = {\n id: id,\n view: \"form\",\n elementsConfig: {\n labelWidth: 200,\n },\n elements: [\n {\n id: ids.name,\n view: \"text\",\n label: L(\"Name\"),\n name: \"name\",\n value: this.name,\n },\n {\n id: ids.processFPYearValue,\n view: \"select\",\n label: L(\"Process Fiscal Period Year Value\"),\n value: this.processFPYearValue,\n name: \"processFPYearValue\",\n options: processValues,\n },\n {\n id: ids.objectFPYear,\n view: \"select\",\n label: L(\"FP Year Object\"),\n value: this.objectFPYear,\n name: \"objectFPYear\",\n options: objectList,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n fpYearDateFields = getFieldOptions(newVal, \"date\");\n updateFPYearDateOptions(fpYearDateFields);\n\n accTypeFields = getFieldOptions(newVal, \"list\");\n updateFPYearStatusOptions(accTypeFields);\n }\n },\n },\n },\n {\n id: ids.objectFPMonth,\n view: \"select\",\n label: L(\"FP Month Object\"),\n value: this.objectFPMonth,\n name: \"objectFPMonth\",\n options: objectList,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n fpMonthDateFields = getFieldOptions(newVal, \"date\");\n updateFPMonthDateFields(fpMonthDateFields);\n }\n },\n },\n },\n {\n id: ids.objectGL,\n view: \"select\",\n label: L(\"Balance Object\"),\n value: this.objectGL,\n name: \"objectGL\",\n options: objectList,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n glNumberFields = getFieldOptions(newVal, \"number\");\n updateGlNumberFields(glNumberFields);\n\n glRcFields = getFieldOptions(newVal, \"connectObject\");\n updateGlConnectFields(glRcFields);\n }\n },\n },\n },\n {\n id: ids.objectAccount,\n view: \"select\",\n label: L(\"Account Object\"),\n value: this.objectAccount,\n name: \"objectAccount\",\n options: objectList,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n accTypeFields = getFieldOptions(newVal, \"list\");\n updateAccFields(accTypeFields);\n\n accNumberFields = getFieldOptions(newVal, \"number\");\n updateAccNumberFields(accNumberFields);\n }\n },\n },\n },\n {\n id: ids.valueFundBalances,\n view: \"text\",\n label: L(\"Fund Balances Code\"),\n value: this.valueFundBalances,\n name: \"valueFundBalances\",\n },\n {\n id: ids.valueNetIncome,\n view: \"text\",\n label: L(\"Net Income Code\"),\n value: this.valueNetIncome,\n name: \"valueNetIncome\",\n },\n {\n id: ids.fieldFPYearStart,\n view: \"select\",\n label: L(\"FP Year -> Start\"),\n value: this.fieldFPYearStart,\n name: \"fieldFPYearStart\",\n options: fpYearDateFields,\n },\n {\n id: ids.fieldFPYearEnd,\n view: \"select\",\n label: L(\"FP Year -> End\"),\n value: this.fieldFPYearEnd,\n name: \"fieldFPYearEnd\",\n options: fpYearDateFields,\n },\n {\n id: ids.fieldFPYearStatus,\n view: \"select\",\n label: L(\"FP Year -> Status\"),\n value: this.fieldFPYearStatus,\n name: \"fieldFPYearStatus\",\n options: fpYearStatusFields,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n fpYearStatusOptions = getListOptions(\n this.objectFPYear || $$(ids.objectFPYear).getValue(),\n newVal\n );\n updateFPYearActiveOptions(fpYearStatusOptions);\n }\n },\n },\n },\n {\n id: ids.fieldFPYearActive,\n view: \"select\",\n label: L(\"FP Year -> Active\"),\n value: this.fieldFPYearActive,\n name: \"fieldFPYearActive\",\n options: fpYearStatusOptions,\n },\n {\n id: ids.fieldFPMonthStart,\n view: \"select\",\n label: L(\"FP Month -> Start\"),\n value: this.fieldFPMonthStart,\n name: \"fieldFPMonthStart\",\n options: fpMonthDateFields,\n },\n {\n id: ids.fieldFPMonthEnd,\n view: \"select\",\n label: L(\"FP Month -> End\"),\n value: this.fieldFPMonthEnd,\n name: \"fieldFPMonthEnd\",\n options: fpMonthDateFields,\n },\n {\n id: ids.fieldGLStartBalance,\n view: \"select\",\n label: L(\"GL -> Start Balance\"),\n value: this.fieldGLStartBalance,\n name: \"fieldGLStartBalance\",\n options: glNumberFields,\n },\n {\n id: ids.fieldGLRunningBalance,\n view: \"select\",\n label: L(\"GL -> Running Balance\"),\n value: this.fieldGLRunningBalance,\n name: \"fieldGLRunningBalance\",\n options: glNumberFields,\n },\n {\n id: ids.fieldGLrc,\n view: \"select\",\n label: L(\"GL -> RC\"),\n value: this.fieldGLrc,\n name: \"fieldGLrc\",\n options: glRcFields,\n },\n {\n id: ids.fieldAccNumber,\n view: \"select\",\n label: L(\"Acc -> Account Number\"),\n value: this.fieldAccNumber,\n name: \"fieldAccNumber\",\n options: accNumberFields,\n },\n {\n id: ids.fieldAccType,\n view: \"select\",\n label: L(\"Acc -> Type\"),\n value: this.fieldAccType,\n name: \"fieldAccType\",\n options: accTypeFields,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n accTypeOptions = getListOptions(\n this.objectAccount ||\n $$(ids.objectAccount).getValue(),\n newVal\n );\n updateAccTypeOptions(accTypeOptions);\n }\n },\n },\n },\n {\n id: ids.fieldAccTypeIncome,\n view: \"select\",\n label: L(\"Acc -> Income\"),\n value: this.fieldAccTypeIncome,\n name: \"fieldAccTypeIncome\",\n options: accTypeOptions,\n },\n {\n id: ids.fieldAccTypeExpense,\n view: \"select\",\n label: L(\"Acc -> Expense\"),\n value: this.fieldAccTypeExpense,\n name: \"fieldAccTypeExpense\",\n options: accTypeOptions,\n },\n {\n id: ids.fieldAccTypeEquity,\n view: \"select\",\n label: L(\"Acc -> Equity\"),\n value: this.fieldAccTypeEquity,\n name: \"fieldAccTypeEquity\",\n options: accTypeOptions,\n },\n ],\n };\n\n webix.ui(ui, $$(id));\n\n $$(id).show();\n }\n\n /**\n * propertiesStash()\n * pull our values from our property panel.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesStash(id) {\n var ids = this.propertyIDs(id);\n this.name = this.property(ids.name);\n\n // TIP: keep the .settings entries == ids[s] keys and this will\n // remain simple:\n this.defaults.settings.forEach((s) => {\n this[s] = this.property(ids[s]);\n });\n }\n};\n","const AccountingJEArchiveCore = require(\"../../../core/process/tasks/ABProcessTaskServiceAccountingJEArchiveCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class AccountingJEArchive extends AccountingJEArchiveCore {\n ////\n //// Process Instance Methods\n ////\n\n propertyIDs(id) {\n return {\n name: `${id}_name`,\n processBatchValue: `${id}_processBatchValue`,\n objectBatch: `${id}_objectBatch`,\n objectBalance: `${id}_objectBalance`,\n objectJE: `${id}_objectJE`,\n objectJEArchive: `${id}_objectJEArchive`,\n\n fieldBatchFiscalMonth: `${id}_fieldBatchFiscalMonth`,\n fieldJeAccount: `${id}_fieldJeAccount`,\n fieldJeRC: `${id}_fieldJeRC`,\n fieldJeArchiveBalance: `${id}_fieldJeArchiveBalance`,\n fieldBrFiscalMonth: `${id}_fieldBrFiscalMonth`,\n fieldBrAccount: `${id}_fieldBrAccount`,\n fieldBrRC: `${id}_fieldBrRC`,\n\n fieldsMatch: `${id}_fieldsMatch`,\n };\n }\n\n /**\n * propertiesShow()\n * display the properties panel for this Process Element.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesShow(id) {\n let ids = this.propertyIDs(id);\n\n let processValues = [{ id: 0, value: L(\"Select a Process Value\") }];\n let processDataFields = this.process.processDataFields(this);\n (processDataFields || []).forEach((row) => {\n processValues.push({ id: row.key, value: row.label });\n });\n\n let objectList = this.AB.objects().map((o) => {\n return { id: o.id, value: o.label || o.name, object: o };\n });\n\n objectList.unshift({\n id: 0,\n value: L(\"Select an Object\"),\n });\n\n let getConnectFieldOptions = (objectId) => {\n let object = this.AB.objectByID(objectId);\n if (!object) return [];\n\n let options = object\n .fields((f) => f.isConnection)\n .map((f) => {\n return {\n id: f.id,\n value: f.label,\n };\n });\n\n options.unshift({\n id: 0,\n value: L(\"Select a Field\"),\n });\n\n return options;\n };\n\n let updateFields = (fieldPickers, fieldValues) => {\n fieldPickers.forEach((fp) => {\n var picker = $$(fp);\n if (picker) {\n picker.define(\"options\", fieldValues);\n picker.refresh();\n picker.show();\n }\n });\n };\n\n let refreshBatchFields = (objectId) => {\n let options = getConnectFieldOptions(objectId);\n updateFields([ids.fieldBatchFiscalMonth], options);\n };\n\n let refreshBRFields = (objectId) => {\n let options = getConnectFieldOptions(objectId);\n updateFields(\n [ids.fieldBrAccount, ids.fieldBrFiscalMonth, ids.fieldBrRC],\n options\n );\n };\n\n let refreshJeFields = (objectId) => {\n let options = getConnectFieldOptions(objectId);\n updateFields([ids.fieldJeAccount, ids.fieldJeRC], options);\n };\n\n let refreshJeArchiveFields = (objectId) => {\n let options = getConnectFieldOptions(objectId);\n updateFields([ids.fieldJeArchiveBalance], options);\n };\n\n let refreshFieldsMatch = () => {\n let $fieldsMatch = $$(ids.fieldsMatch);\n if (!$fieldsMatch) return;\n\n // clear form\n webix.ui([], $fieldsMatch);\n\n let JEObj = this.AB.objectByID(this.objectJE);\n if (!JEObj) return;\n\n let JEArchiveObj = this.AB.objectByID(this.objectJEArchive);\n if (!JEArchiveObj) return;\n\n // create JE acrhive field options to the form\n JEArchiveObj.fields().forEach((f) => {\n let jeFields = [];\n\n if (f.isConnection) {\n jeFields = JEObj.fields((fJe) => {\n return (\n fJe.isConnection &&\n fJe.settings &&\n f.settings &&\n fJe.settings.linkObject == f.settings.linkObject &&\n fJe.settings.linkType == f.settings.linkType &&\n fJe.settings.linkViaType == f.settings.linkViaType &&\n fJe.settings.isCustomFK == f.settings.isCustomFK\n );\n });\n } else {\n jeFields = JEObj.fields((fJe) => fJe.key == f.key);\n }\n\n jeFields = jeFields.map((fJe) => {\n return {\n id: fJe.id,\n value: fJe.label,\n };\n });\n\n $fieldsMatch.addView({\n view: \"select\",\n name: f.id,\n label: f.label,\n options: jeFields,\n });\n });\n\n $fieldsMatch.setValues(this.fieldsMatch || {});\n };\n\n let fieldBatchList = getConnectFieldOptions(this.objectBatch);\n let fieldBalanceList = getConnectFieldOptions(this.objectBalance);\n let fieldJeList = getConnectFieldOptions(this.objectJE);\n let fieldJeArchiveList = getConnectFieldOptions(this.objectJEArchive);\n\n let ui = {\n id: id,\n view: \"form\",\n elementsConfig: {\n labelWidth: 180,\n },\n elements: [\n {\n id: ids.name,\n view: \"text\",\n label: L(\"Name\"),\n name: \"name\",\n value: this.name,\n },\n {\n id: ids.processBatchValue,\n view: \"select\",\n label: L(\"Process Batch Value\"),\n value: this.processBatchValue,\n name: \"processBatchValue\",\n options: processValues,\n },\n {\n id: ids.objectBatch,\n view: \"select\",\n label: L(\"Batch Object\"),\n value: this.objectBatch,\n name: \"objectBatch\",\n options: objectList,\n on: {\n onChange: (newVal) => {\n this.objectBatch = newVal;\n refreshBatchFields(newVal);\n },\n },\n },\n {\n id: ids.fieldBatchFiscalMonth,\n view: \"select\",\n label: L(\"Batch -> Fiscal Month\"),\n value: this.fieldBatchFiscalMonth,\n name: \"fieldBatchFiscalMonth\",\n options: fieldBatchList,\n },\n {\n id: ids.objectBalance,\n view: \"select\",\n label: L(\"BR Object\"),\n value: this.objectBalance,\n name: \"objectBalance\",\n options: objectList,\n on: {\n onChange: (newVal) => {\n this.objectBalance = newVal;\n refreshBRFields(newVal);\n },\n },\n },\n {\n id: ids.fieldBrFiscalMonth,\n view: \"select\",\n label: L(\"BR -> Fiscal Month\"),\n value: this.fieldBrFiscalMonth,\n name: \"fieldBrFiscalMonth\",\n options: fieldBalanceList,\n },\n {\n id: ids.fieldBrAccount,\n view: \"select\",\n label: L(\"BR -> Account\"),\n value: this.fieldBrAccount,\n name: \"fieldBrAccount\",\n options: fieldBalanceList,\n },\n {\n id: ids.fieldBrRC,\n view: \"select\",\n label: L(\"BR -> RC\"),\n value: this.fieldBrRC,\n name: \"fieldBrRC\",\n options: fieldBalanceList,\n },\n {\n id: ids.objectJE,\n view: \"select\",\n label: L(\"JE Object\"),\n value: this.objectJE,\n name: \"objectJE\",\n options: objectList,\n on: {\n onChange: (newVal) => {\n this.objectJE = newVal;\n refreshJeFields(newVal);\n refreshFieldsMatch();\n },\n },\n },\n {\n id: ids.fieldJeAccount,\n view: \"select\",\n label: L(\"JE -> Account\"),\n value: this.fieldJeAccount,\n name: \"fieldJeAccount\",\n options: fieldJeList,\n },\n {\n id: ids.fieldJeRC,\n view: \"select\",\n label: L(\"JE -> RC\"),\n value: this.fieldJeRC,\n name: \"fieldJeRC\",\n options: fieldJeList,\n },\n {\n id: ids.objectJEArchive,\n view: \"select\",\n label: L(\"JE Archive Object\"),\n value: this.objectJEArchive,\n name: \"objectJEArchive\",\n options: objectList,\n on: {\n onChange: (newVal) => {\n this.objectJEArchive = newVal;\n refreshJeArchiveFields(newVal);\n refreshFieldsMatch();\n },\n },\n },\n {\n id: ids.fieldJeArchiveBalance,\n view: \"select\",\n label: L(\"JE Archive -> BR\"),\n value: this.fieldJeArchiveBalance,\n name: \"fieldJeArchiveBalance\",\n options: fieldJeArchiveList,\n },\n {\n view: \"fieldset\",\n label: \"Fields Matching\",\n body: {\n id: ids.fieldsMatch,\n view: \"form\",\n borderless: true,\n elements: [],\n },\n },\n ],\n };\n\n webix.ui(ui, $$(id));\n\n $$(id).show();\n\n refreshFieldsMatch();\n }\n\n /**\n * propertiesStash()\n * pull our values from our property panel.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesStash(id) {\n let ids = this.propertyIDs(id);\n this.name = this.property(ids.name);\n\n // TIP: keep the .settings entries == ids[s] keys and this will\n // remain simple:\n this.defaults.settings.forEach((s) => {\n if (s === \"fieldsMatch\") {\n this[s] = $$(ids.fieldsMatch).getValues();\n } else {\n this[s] = this.property(ids[s]);\n }\n });\n }\n};\n","const ApiTaskCore = require(\"../../../core/process/tasks/ABProcessTaskServiceApiCore.js\");\n\n// let L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ApiTask extends ApiTaskCore {\n static defaults() {\n return { key: \"Api\" };\n }\n\n fromValues(values) {\n super.fromValues(values);\n // These are raw values on the client, need to be saved so we can update\n // the server. There they will be encrypted and stored seperate from our\n // definition.\n this.secrets = values.secrets;\n }\n\n toObj() {\n const obj = super.toObj();\n obj.secrets = this.secrets;\n return obj;\n }\n\n ////\n //// Process Instance Methods\n ////\n\n warningsEval() {\n super.warningsEval();\n\n [\"url\", \"method\"].forEach(\n (prop) => !this[prop] && this.warningMessage(`is missing a ${prop}`)\n );\n\n // Verify secrets / process data patterns are valid\n const dataPattern = /<%= (.+?) %>/g;\n const dataToCheck = [];\n [\"body\", \"url\"].forEach((prop) => {\n if (!this[prop]) return;\n const matches = (this[prop].match(dataPattern) ?? []).map((m) => ({\n location: prop,\n match: m,\n }));\n dataToCheck.push(...matches);\n });\n if (this.headers) {\n this.headers.forEach(({ value }) => {\n const matches = (value.match(dataPattern) ?? []).map((m) => ({\n location: \"header\",\n match: m,\n }));\n dataToCheck.push(...matches);\n });\n }\n if (dataToCheck.length == 0) return;\n const processData = this.process\n .processDataFields(this)\n .filter((i) => i)\n .map((i) => i.key);\n const secrets = this.storedSecrets ?? [];\n this.secrets?.forEach((s) => secrets.push(s.name));\n dataToCheck.forEach(({ location, match }) => {\n const [, secret] = /<%= Secret: (.+?) %>/.exec(match) ?? [];\n if (secret) {\n if (!secrets.includes(secret)) {\n this.warningMessage(\n `is missing secret '${secret}' in ${location}.`\n );\n }\n } else {\n const [, data] = /<%= (.+?) %>/.exec(match) ?? [];\n if (!processData.includes(data)) {\n this.warningMessage(\n `references unkown data field '${data}' in ${location}`\n );\n }\n }\n });\n }\n};\n","const CalculateTaskCore = require(\"../../../core/process/tasks/ABProcessTaskServiceCalculateCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class CalculateTask extends CalculateTaskCore {\n ////\n //// Process Instance Methods\n ////\n\n warningsEval() {\n super.warningsEval();\n\n if (!this.formulaText) {\n this.warningMessage(\"is missing a formula.\");\n }\n\n if (this.formulaText) {\n const hash = {};\n (this.process.processDataFields(this) || []).forEach((item) => {\n if (!item) return;\n hash[`{${item.label}}`] = item;\n });\n\n let exp = new RegExp(`{[^}]*}`, \"g\");\n let entries = this.formulaText.match(exp) || [];\n entries.forEach((entry) => {\n if (!hash[entry]) {\n this.warningMessage(\n `could not resolve process value [${entry}]`\n );\n }\n });\n }\n }\n};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessTaskServiceGetResetPasswordUrlCore = require(\"../../../core/process/tasks/ABProcessTaskServiceGetResetPasswordUrlCore.js\");\n\nmodule.exports = class ABProcessTaskServiceGetResetPasswordUrl extends (\n ABProcessTaskServiceGetResetPasswordUrlCore\n) {\n warningsEval() {\n super.warningsEval();\n\n if (!this.email) {\n this.warningMessage(\"is missing the email address.\");\n }\n\n const processData = (this.process.processDataFields(this) ?? [])\n .filter((item) => item.field?.key == \"email\")\n .map((item) => {\n return {\n id: item.key,\n value: item.label,\n };\n });\n\n if (processData.length == 0) {\n this.warningMessage(\"has no previous tasks exporting email fields.\");\n }\n }\n};\n","const InsertRecordTaskCore = require(\"../../../core/process/tasks/ABProcessTaskServiceInsertRecordCore.js\");\n\nmodule.exports = class InsertRecordTask extends InsertRecordTaskCore {\n warningsEval() {\n super.warningsEval();\n\n if (!this.objectID) {\n this.warningMessage(\"has no Object set.\");\n }\n\n const fv = Object.keys(this.fieldValues || {}) || [];\n if (fv.length == 0) {\n this.warningMessage(\"has no fields set\");\n } else {\n let isSet = false;\n fv.forEach((f) => {\n if (\n this.fieldValues[f]?.set != \"0\" &&\n this.fieldValues[f]?.value != null\n ) {\n isSet = true;\n }\n });\n if (!isSet) {\n this.warningMessage(\"has no fields set\");\n }\n }\n }\n};\n","const ABProcessTaskServiceQueryCore = require(\"../../../core/process/tasks/ABProcessTaskServiceQueryCore.js\");\n\nconst ABQLManager = require(\"../../ql/ABQLManager.js\");\n\nmodule.exports = class ABProcessTaskServiceQuery extends (\n ABProcessTaskServiceQueryCore\n) {\n constructor(attributes, process, AB) {\n super(attributes, process, AB);\n\n this.attributes = attributes;\n }\n\n ABQLManager() {\n return ABQLManager;\n }\n\n warnings() {\n // first get all our embedded QL Command warnings\n let qlWarnings = [];\n if (this.qlObj) {\n qlWarnings = qlWarnings.concat(this.qlObj.warnings());\n }\n // run the QL Warnings through our .warningMessage() to get a message\n // that includes this task's name:\n qlWarnings.forEach((w) => {\n if (w?.message) this.warningMessage(w.message);\n });\n let myWarnings = super.warnings();\n return myWarnings.filter((w) => w); // filter out any undefined.\n }\n\n warningsEval() {\n super.warningsEval();\n if (this.qlObj) {\n this.qlObj.warningsEval();\n } else {\n this.warningMessage(`has no Query defined.`);\n }\n\n if (!this.name) {\n this.warningMessage(\"does not have a name.\", {\n attributes: this.attributes,\n });\n }\n\n let hasSave = false;\n let curr = this.qlObj;\n while (curr) {\n if (curr.key === \"row_save\" || curr.key === \"set_save\") {\n hasSave = true;\n curr = null; // just stop here.\n } else {\n curr = curr.next;\n }\n }\n\n if (!hasSave) {\n this.warningMessage(\"requires at least one Save operation.\");\n }\n }\n};\n","const SubProcessCore = require(\"../../../core/process/tasks/ABProcessTaskSubProcessCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class SubProcess extends SubProcessCore {\n ////\n //// Process Instance Methods\n ////\n\n /*\n propertyIDs(id) {\n return {\n name: `${id}_name`,\n isEnable: `${id}_isEnable`,\n parameterId: `${id}_parameterId`,\n };\n }\n\n /**\n * @method propertiesShow()\n * display the properties panel for this Process Element.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n * /\n propertiesShow(id) {\n let ids = this.propertyIDs(id);\n\n // Pull query tasks option list\n let parameterOptions = (this.process.processDataFields(this) || []).map(\n (item) => {\n return {\n id: item.key,\n value: item.label,\n };\n }\n );\n\n let ui = {\n id: id,\n view: \"form\",\n elementsConfig: {\n labelWidth: 120,\n },\n elements: [\n {\n id: ids.name,\n view: \"text\",\n label: L(\"Name\"),\n name: \"name\",\n value: this.name,\n },\n {\n id: ids.isEnable,\n view: \"switch\",\n label: L(\"Enable\"),\n value: this.isEnable,\n },\n {\n id: ids.parameterId,\n view: \"richselect\",\n label: L(\"Repeat for\"),\n options: parameterOptions,\n value: this.parameterId,\n },\n ],\n };\n\n webix.ui(ui, $$(id));\n\n $$(id).show();\n }\n\n /**\n * @method propertiesStash()\n * pull our values from our property panel.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n * /\n propertiesStash(id) {\n let ids = this.propertyIDs(id);\n this.name = this.property(ids.name);\n this.isEnable = this.property(ids.isEnable);\n this.parameterId = this.property(ids.parameterId);\n }\n */\n\n /**\n * @method diagramProperties()\n * return a set of values for the XML shape definition based upon\n * the current values of this object.\n * @return {json}\n */\n diagramProperties(bpmnModeler) {\n let props = super.diagramProperties();\n props = props || [{}];\n props[0].def = props[0].def || {};\n\n if (this.parameterId != null) {\n props[0].def = props[0].def || {};\n props[0].def.loopCharacteristics = bpmnModeler\n .get(\"moddle\")\n .create(\"bpmn:MultiInstanceLoopCharacteristics\");\n props[0].def.loopCharacteristics.isSequential = true;\n }\n\n return props;\n }\n\n /**\n * @method onChange()\n * update the current Task with information that was relevant\n * from the provided BPMN:Element\n * @param {BPMNElement}\n */\n onChange(defElement) {\n let loopCharacteristics =\n defElement.loopCharacteristics ||\n defElement.businessObject.loopCharacteristics ||\n {};\n\n switch (loopCharacteristics.$type) {\n case \"bpmn:MultiInstanceLoopCharacteristics\":\n this.loopType = loopCharacteristics.isSequential\n ? \"sequential\"\n : \"parallel\";\n break;\n case \"bpmn:StandardLoopCharacteristics\":\n this.loopType = \"looping\";\n break;\n }\n }\n\n /**\n * @method destroy()\n * destroy this sub process and inside tasks\n *\n * @return {Promise}\n */\n destroy() {\n // reuse .destroy function of ABProcess\n // to clear tasks within this sub process\n return this.process.destroy.call(this);\n }\n\n /**\n * @method save()\n * persist this sub process\n *\n * @return {Promise}\n *\t\t\t\t\t\t.resolve( {this} )\n */\n save() {\n // reuse .save function of ABProcess\n // to update tasks within this sub process\n return this.process.save.call(this);\n }\n\n /**\n * @method elementNewForModelDefinition()\n * create a new process element defined by the given BPMN:Element\n *\n * the BPMN:Element definition comes from the BPMN Modeler when a new\n * diagram element is created.\n *\n * @param {BPMN:Element} element\n * the BPMN modeler diagram element definition\n * @return {ABProcessParticipant|ABProcessLane|ABProcessElement}\n *\n */\n elementNewForModelDefinition(element) {\n let task = this.AB.processElementNewForModelDefinition(element, this);\n\n // Add a new task to this sub process\n if (task) {\n this.elementAdd(task);\n }\n return task;\n }\n\n warningsEval() {\n super.warningsEval();\n\n (this._unknownElementIDs || []).forEach((eID) => {\n this.warningMessage(\n `is referencing an unknown process element id[${eID}]`,\n { process: this.id, eID }\n );\n });\n }\n};\n","const ABProcessTaskUserCore = require(\"../../../core/process/tasks/ABProcessTaskUserCore.js\");\n\nmodule.exports = class ABProcessTaskUser extends ABProcessTaskUserCore {};\n","const ABProcessTaskUserApprovalCore = require(\"../../../core/process/tasks/ABProcessTaskUserApprovalCore.js\");\n\nmodule.exports = class ABProcessTaskUserApproval extends (\n ABProcessTaskUserApprovalCore\n) {};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessTaskUserExternalCore = require(\"../../../core/process/tasks/ABProcessTaskUserExternalCore.js\");\n\nmodule.exports = class ABProcessTaskUserExternal extends (\n ABProcessTaskUserExternalCore\n) {};\n","const ABProcessTaskUserFormCore = require(\"../../../core/process/tasks/ABProcessTaskUserFormCore.js\");\n\nmodule.exports = class ABProcessTaskUserForm extends (\n ABProcessTaskUserFormCore\n) {};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessTriggerCore = require(\"../../../core/process/tasks/ABProcessTriggerCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABProcessTrigger extends ABProcessTriggerCore {};\n","const ABProcessTriggerLifecycleCore = require(\"../../../core/process/tasks/ABProcessTriggerLifecycleCore.js\");\n\nmodule.exports = class ABProcessTriggerLifecycle extends (\n ABProcessTriggerLifecycleCore\n) {};\n","const ABProcessTriggerTimerCore = require(\"../../../core/process/tasks/ABProcessTriggerTimerCore.js\");\n\nconst START_URL = \"/process/timer/#id#/start\";\nconst STOP_URL = \"/process/timer/#id#/stop\";\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABProcessTriggerTimer extends ABProcessTriggerTimerCore {\n /**\n * @method save()\n * persist this instance of ABObject with it's parent ABApplication\n * @return {Promise}\n */\n save() {\n return (\n Promise.resolve()\n .then(() => super.save())\n // Restart the timer\n .then((result) => {\n return this.AB.Network.put({\n url: (this.isEnabled ? START_URL : STOP_URL).replace(\n \"#id#\",\n this.id\n ),\n });\n })\n );\n }\n};\n","/*\n * ABQL\n *\n * An ABQL defines the base class for our AB Query Language Objects.\n * These classes share a common way to\n * - parse input strings for commands\n *\n *\n */\nconst ABQLCore = require(\"../../core/ql/ABQLCore.js\");\nconst RowUpdater = require(\"../RowUpdater.js\").default;\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nclass ABQL extends ABQLCore {\n constructor(attributes, parameterDefinitions, prevOP, task, AB) {\n super(attributes, parameterDefinitions, prevOP, task, AB);\n\n this.on(\"warning\", (message, data) => {\n this._warnings.push({ message, data });\n });\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method parseRow()\n * When it is time to pull the information from the properties panel,\n * use this fn to get the current Row of data.\n *\n * This fn() will populate the this.params with the values for each\n * of our .parameterDefinitions.\n *\n * @param {webixNode} row\n * the current webix node that contains the ROW defining the\n * operation and it's parameters.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n */\n parseRow(row, id) {\n // const allColumns = row.getChildViews();\n // allColumns.shift(); // remove selector\n this.parameterDefinitions.forEach((pDef) => {\n // const col = allColumns.shift();\n const myID = this.uiID(id);\n\n this.ids = this.toIDs(myID);\n this.params = this.params ?? {};\n\n let $uiCondition = null;\n\n switch (pDef.type) {\n case \"objectFields\":\n this.params[pDef.name] = $$(this.ids.objectfields).getValue();\n\n break;\n\n case \"objectName\":\n this.params[pDef.name] = $$(this.ids.objectname).getValue();\n\n break;\n\n case \"objectConditions\":\n case \"objectValues\":\n $uiCondition = $$(this.ids.condition);\n\n if ($uiCondition) {\n const condition = $uiCondition.getValue();\n\n if (condition && condition !== \"\") {\n this.params[pDef.name] = JSON.parse(condition);\n }\n }\n\n break;\n\n case \"taskParam\":\n this.params[pDef.name] = $$(this.ids.taskparam).getValue();\n\n break;\n }\n });\n }\n\n /*\n * @method toIDs()\n * generate a set of unique webix ids to use for our UI.\n * @param {string} myID\n * the unique id generated by .uiID()\n */\n toIDs(myID) {\n return {\n condition: `${myID}_condition`,\n objectfields: `${myID}_objectfields`,\n objectname: `${myID}_objname`,\n popup: `${myID}_popup`,\n select: `${myID}_select`,\n shorthand: `${myID}_shorthand`,\n taskparam: `${myID}_taskparam`,\n spacer: `${myID}_spacer`,\n };\n }\n\n /**\n * @method uiAddParamForDef()\n * Add an operation parameter for each parameterDefinition we have defined.\n * @param {obj} pDef\n * the current parameterDefinition entry we are creating the UI\n * for.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @param {obj} ui\n * the current webix ui definition we are building.\n */\n uiAddParamForDef(pDef, id, ui) {\n // params are added to a .col[] definition.\n // if our ui isn't down to the current .col element, then drill down\n if (!ui.cols) {\n if (ui.rows) {\n for (let i = 0; i < ui.rows.length; i++)\n if (ui.rows[i].cols) {\n this.uiAddParamForDef(pDef, id, ui.rows[i]);\n\n break;\n }\n } else throw new Error(\"provided ui is not able to add a parameter!\");\n\n return;\n }\n\n const paramUI = this.uiParamUI(pDef, id);\n\n if (paramUI) {\n // if we only have 1 param\n if (this.parameterDefinitions.length === 1) {\n ui.cols.pop();\n ui.cols.push(paramUI);\n }\n // if we haven't already added a parameter\n else {\n // create a row stack of parameters:\n if (ui.cols.length < 3)\n ui.cols.push({\n rows: [paramUI],\n });\n // add to the current stack of parameters\n else ui.cols[2].rows.push(paramUI);\n }\n }\n }\n\n /**\n * @method uiAddNext()\n * Add the next row selector for this operation:\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @param {obj} ui\n * the current webix ui definition we are building.\n */\n uiAddNext(id, ui) {\n const uiRow = this.uiNextRow(id);\n\n // if we have a next operation defined, then add on the ui definitions\n // for that operation:\n if (this.next) {\n this.next.uiAddParams(id, uiRow);\n ui.rows.push(uiRow);\n this.next.uiAddNext(id, ui);\n }\n // otherwise we just leave the selector:\n else ui.rows.push(uiRow);\n }\n\n /**\n * @method uiAddParams()\n * Add operation parameter(s) for each parameterDefinition we have defined.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @param {obj} ui\n * the current webix ui definition we are building.\n */\n uiAddParams(id, ui) {\n this.parameterDefinitions.forEach((pDef) => {\n this.uiAddParamForDef(pDef, id, ui);\n });\n }\n\n /*\n * @method uiID()\n * generate a unique webix id for this operation.\n * @param {string} id\n * the webix id of the base property.query holder\n */\n uiID(id) {\n if (this.prevOP) return `${this.prevOP.uiID(id)}_${this.constructor.key}`;\n\n return `${id}_${this.constructor.key}`;\n }\n\n /*\n * uiXXX Operations:\n * are UI building operations that are performed BEFORE the webix UI\n * is generated. They work by filling out a {ui} object definition\n * that webix will eventually create into the DOM.\n *\n * viewXXX Operations:\n * are UI building operations that are performed AFTER the webix UI\n * is generated. They work by adding in child views to an existing\n * DOM.\n */\n\n /**\n * @method uiNextRow()\n * return the webix UI definition for the next of UI chaining.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @return {obj}\n */\n uiNextRow(id) {\n const nextOptions = this.NextQLOps ?? this.constructor.NextQLOps;\n const options = nextOptions.map((op) => {\n return { id: op.key, value: op.label };\n });\n\n options.unshift({ id: 0, value: L(\"choose next operation\") });\n\n const myID = this.uiID(id);\n const ids = this.toIDs(myID);\n\n const uiRow = {\n cols: [\n {\n id: ids.select,\n view: \"select\",\n value: this.next ? this.next.constructor.key : 0,\n options: options,\n on: {\n onChange: (newValue, oldValue) => {\n const resetValue = () => {\n const select = $$(ids.select);\n\n select.blockEvent();\n select.setValue(oldValue);\n select.unblockEvent();\n };\n\n if (newValue === oldValue) return;\n\n const newOP = nextOptions.find(\n (op) => op.key === newValue\n );\n\n if (!newOP) {\n resetValue();\n\n return;\n }\n\n const thisRow = $$(ids.select).getParentView();\n const thisQuery = thisRow.getParentView();\n const addOP = () => {\n if (newOP) {\n const nextOP = new newOP(\n {},\n this,\n this.task,\n this.AB\n );\n\n this.next = nextOP;\n\n nextOP.viewAddParams(id, thisRow);\n nextOP.viewAddNext(id, thisQuery);\n }\n };\n\n // if there are rows after this one, then warn\n // about changing\n const allRows = thisQuery.getChildViews();\n\n if (allRows.length - 1 > allRows.indexOf(thisRow))\n webix.confirm({\n title: L(\"continue?\"),\n text: L(\n \"changing this rule will reset any following rules.\"\n ),\n ok: L(\"Yes\"),\n cancel: L(\"No\"),\n callback: (result) => {\n if (result) {\n // remove the current additional Rows:\n let ir = allRows.length - 1;\n\n while (\n allRows[ir].config.id !== thisRow.config.id\n ) {\n thisQuery.removeView(allRows[ir]);\n ir--;\n }\n\n // now remove the parameters\n const allCols = thisRow.getChildViews();\n\n let ic = allCols.length;\n\n while (ic > 1) {\n thisRow.removeView(allCols[ic - 1]);\n ic--;\n }\n\n addOP();\n } else resetValue();\n },\n });\n else addOP();\n },\n },\n },\n {\n id: ids.spacer,\n },\n ],\n };\n\n return uiRow;\n }\n\n uiNextRowSelectorRefresh(id) {\n const $select = $$(this.ids.select);\n\n if (!$select) return;\n\n const uiNextRow = this.uiNextRow(id);\n\n const uiNextCol =\n uiNextRow.cols.filter((c) => c.id == $select.config.id)[0] ??\n uiNextRow.cols[1];\n\n if (uiNextCol) AB.Webix.ui(uiNextCol, $select);\n }\n\n /**\n * @method uiParamUI()\n * return the webix UI definition for the parameter entry of this current\n * operation.\n * @param {obj} pDef\n * the current parameterDefinition entry we are creating the UI\n * for.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @return {obj}\n */\n uiParamUI(pDef, id) {\n const uiConfig = AB.Config.uiSettings();\n\n let myID = this.uiID(id);\n\n this.ids = this.toIDs(myID);\n\n let paramUI = null;\n let options = null;\n let Filter = null;\n let hashFieldIDs = null;\n let initialCond = null;\n let displayLabel = null;\n let initialValue = null;\n let Updater = null;\n let popUp = null;\n\n // now add the parameter\n switch (pDef.type) {\n case \"objectFields\":\n // an objectFields parameter returns a select list of fields\n // available on an Object.\n if (this.object)\n options = this.object.fields().map((f) => {\n return { id: f.id, value: f.label, icon: `fa fa-${f.icon}` };\n });\n\n options.unshift({\n id: \"_PK\",\n value: \"[PK]\",\n });\n\n // if not set, default .fieldID to the 1st entry in options\n // so we will have a default. In use, if a user sees the\n // 1st item and continues on, then we will have chosen it.\n if (!this.fieldID && options.length > 0) {\n // act like it was selected:\n this.params[pDef.name] = options[0].id;\n this.paramChanged(pDef, id);\n }\n\n paramUI = {\n id: this.ids.objectfields,\n view: \"richselect\",\n label: L(\"Field\"),\n labelWidth: 70,\n value: this.fieldID,\n options: options,\n on: {\n onChange: (newValue, oldValue) => {\n // this.params = this.params ?? {};\n if (newValue !== this.params[pDef.name]) {\n this.params[pDef.name] = newValue;\n this.paramChanged(pDef, id);\n }\n },\n },\n };\n\n break;\n\n case \"objectName\":\n // an objectName parameter returns a select list of available\n // objects in this ABFactory.\n options = this.AB.objects().map((o) => {\n return { id: o.id, value: o.label };\n });\n\n if (!this.objectID && options.length > 0) {\n this.objectID = options[0].id;\n this.params[pDef.name] = this.objectID;\n this.paramChanged(pDef);\n }\n\n paramUI = {\n id: this.ids.objectname,\n view: \"select\",\n label: L(\"Data Source\"),\n labelWidth: uiConfig.labelWidthLarge,\n value: this.objectID,\n options: options,\n on: {\n onChange: (newValue /*, oldValue */) => {\n this.params = this.params ?? {};\n\n if (newValue !== this.params[pDef.name]) {\n this.params[pDef.name] = newValue;\n this.paramChanged(pDef);\n }\n },\n },\n };\n\n break;\n\n case \"objectConditions\":\n // objectConditions: returns a filter text summary, that when\n // clicked, pops up a Filter Entry Popup.\n // the actual value is stored in a hidden field.\n\n // we will create a new FilterComplex() object to use for our\n // filtering.\n // Our goal is to create a special filter entry for each avaiable\n // process data value that is available.\n // A filter entry needs to look like:\n // {\n // id: `{string}`, // A unique id selector for this filter\n // name: `{string}`, // the operation name displayed\n // type, {obj} // an object defining the editor to show\n // fn: ()=>{} // a function used for filtering elements\n // }\n //\n // In our filters, we are assigning filters to EACH field by the\n // field.id. So the type definition needs to look like:\n // {\n // \"uniqueID of the field (field.id)\" : {webixUI definition}\n // }\n\n Filter = this.AB.filterComplexNew(id);\n hashFieldIDs = this.availableProcessDataFieldsHash();\n\n if (this.object) {\n Filter.fieldsLoad(this.object.fields(), this.object);\n // NOTE: this will create default filters based upon the\n // object fields() and their types\n\n // Now we need to add in the Process Data Fields:\n // for each Process Data Field that matches our same object\n const foundFields = Object.keys(hashFieldIDs).map(\n (f) => hashFieldIDs[f]\n );\n\n Filter.processFieldsLoad(foundFields);\n /*\n (foundFields ?? []).forEach((processField) => {\n const type = {};\n if (processField.field) {\n type[processField.field.id] = {\n view: \"select\",\n options: [\n {\n id: \"empty\",\n value: \"choose option\"\n },\n {\n id: processField.key,\n value: `context(${processField.label})`\n }\n ]\n };\n } else {\n // if there is no .field, it is probably an embedded special field\n // like: .uuid\n const key = processField.key.split(\".\").pop();\n type[key] = {\n view: \"select\",\n options: [\n {\n id: \"empty\",\n value: \"choose option\"\n },\n {\n id: processField.key,\n value: `context(${processField.label})`\n }\n ]\n };\n }\n\n // add an \"equals\" and \"not equals\" filter for each:\n Filter.filterAdd([\n {\n id: `context_equals`,\n name: `equals`,\n type,\n fn: (a, b) => {\n return a === b;\n }\n },\n {\n id: `context_not_equal`,\n name: `not equals`,\n type,\n fn: (a, b) => {\n return a !== b;\n }\n }\n ]);\n\n }); */\n }\n\n // every time the Filter \"saves\" it's data, it emits this event:\n // take the given condition and store it in our hidden element.\n Filter.on(\"save\", (condition) => {\n // @param {obj} condition an object describing the filter\n // condition.\n\n this.params = this.params ?? {};\n this.params[pDef.name] = condition;\n\n const shortHand = $$(this.ids.shorthand);\n\n shortHand.define({\n label: Filter.toShortHand(),\n });\n shortHand.refresh();\n\n // NOTE: the hidden element is a text field, so convert the\n // {condition object} => a string\n const elCondition = $$(this.ids.condition);\n\n elCondition.define({\n value: JSON.stringify(this.params[pDef.name]),\n });\n elCondition.refresh();\n });\n\n // create the initial condition value from our inputs.\n initialCond = \"\";\n\n if (this.params && this.params[pDef.name]) {\n Filter.setValue(this.params[pDef.name]);\n initialCond = JSON.stringify(this.params[pDef.name]);\n } else {\n Filter.setValue(null);\n }\n\n // what we show on the panel, is a text representation\n // of the current condition.\n displayLabel = Filter.toShortHand();\n\n paramUI = {\n rows: [\n {\n id: this.ids.shorthand,\n view: \"button\",\n label: displayLabel,\n on: {\n onItemClick: function () {\n Filter.popUp(this.$view, null, {\n pos: \"center\",\n });\n },\n },\n },\n // have a hidden field to contain the condition\n // value we will parse out later\n {\n id: this.ids.condition,\n view: \"text\",\n value: initialCond,\n hidden: true,\n },\n ],\n };\n\n break;\n\n case \"objectValues\":\n // objectValues : shows a condenced textual representation of the\n // field => value changes. Clicking on the text will show a popup\n // that allows you to add/remove additional field updates for\n // the current object.\n\n initialValue = \"\";\n Updater = new RowUpdater(myID, this.AB);\n\n if (this.object) Updater.objectLoad(this.object);\n\n // Set processed data key to value options\n Updater.setExtendedOptions(\n (this.task.process.processDataFields(this.task) ?? []).map(\n (item) => {\n return {\n id: item.key,\n value: item.label,\n };\n }\n )\n );\n\n // NOTE: .setValue() must be called once the RowUpdater is already\n // displayed. See the end of popUp() below:\n if (this.params && this.params[pDef.name]) {\n Updater.setValue(this.params[pDef.name]);\n initialValue = JSON.stringify(this.params[pDef.name]);\n }\n\n popUp = () => {\n // show the RowUpdater in a popup:\n const ui = {\n id: this.ids.popup,\n view: \"popup\",\n position: \"center\",\n minWidth: 700,\n modal: true,\n resize: true,\n body: {\n rows: [\n {\n height: 30,\n borderless: true,\n cols: [\n { fillspace: true },\n {\n view: \"button\",\n value: \"X\",\n width: 30,\n click: () => {\n $$(this.ids.popup).hide();\n },\n },\n ],\n },\n Updater.ui(),\n {\n view: \"button\",\n value: L(\"Save\"),\n css: \"webix_primary\",\n click: () => {\n this.params = this.params ?? {};\n this.params[pDef.name] = Updater.getValue();\n const sh = $$(this.ids.shorthand);\n\n sh.define({\n badge: this.params[pDef.name].length,\n });\n sh.refresh();\n\n const cond = $$(this.ids.condition);\n\n cond.define({\n value: JSON.stringify(this.params[pDef.name]),\n });\n cond.refresh();\n\n $$(this.ids.popup).hide();\n },\n },\n ],\n },\n };\n\n // create and show the popup\n this._myPopup = webix.ui(ui);\n this._myPopup.show();\n\n // NOTE: on a RowUpdater, the values need to be set\n // AFTER it is displayed:\n if (this.params && this.params[pDef.name])\n Updater.setValue(this.params[pDef.name]);\n };\n\n paramUI = {\n rows: [\n // the textual shorthand for these values\n {\n id: this.ids.shorthand,\n view: \"button\",\n label: L(\"Update Popout\"),\n badge: this.params[pDef.name]?.length,\n on: {\n onItemClick: () => {\n popUp();\n },\n },\n },\n // the hidden field that contains the results\n {\n id: this.ids.condition,\n view: \"text\",\n value: initialValue,\n hidden: true,\n },\n ],\n };\n\n break;\n\n case \"taskParam\":\n paramUI = {\n id: this.ids.taskparam,\n view: \"text\",\n label: L(\"Variable\"),\n labelWidth: 70,\n value: this.params[pDef.name],\n placeholder: L(\"Enter parameter name\"),\n on: {\n onChange: (newValue, oldValue) => {\n // this.params = this.params ?? {};\n if (newValue !== this.params[pDef.name]) {\n this.params[pDef.name] = newValue;\n this.paramChanged(pDef, id);\n }\n },\n },\n };\n\n break;\n }\n\n return paramUI;\n }\n\n /**\n * @method viewAddNext()\n * Add the next selector row After this Operation:\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @param {webixNode} topView\n * the current webix node that needs this view added to\n * NOTE: this should be the top container that is adding a new\n * row for each operation.\n */\n viewAddNext(id, topView) {\n const uiRow = this.uiNextRow(id);\n\n topView.addView(uiRow);\n }\n\n /**\n * @method viewAddParams()\n * Add operation parameter(s) for each parameterDefinition we have defined.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @param {webixNode} rowView\n * the current webix node that needs this view added to\n * NOTE: this should be the ROW that the parameters are added to\n */\n viewAddParams(id, rowView) {\n const params = [];\n\n this.parameterDefinitions.forEach((pDef) => {\n // get the definition from .uiParamUI()\n params.push(this.uiParamUI(pDef, id));\n });\n\n let toInsert = null;\n\n // stack parameters in a row if there are more than 1\n if (params.length > 1)\n toInsert = {\n rows: params,\n };\n else toInsert = params.pop();\n\n if (toInsert) {\n rowView.removeView(rowView.getChildViews()[1]);\n rowView.addView(toInsert);\n }\n }\n\n warnings() {\n let myWarnings = this._warnings || [];\n if (this.next)\n myWarnings = myWarnings.concat(this.next.warnings()).filter((w) => w);\n return this.AB.uniq(myWarnings);\n }\n\n warningsEval() {\n this._warnings = [];\n if (this.next) this.next.warningsEval();\n }\n\n // warningsAll() {\n // let myWarnings = this.warnings();\n // if (this.next) {\n // myWarnings = myWarnings.concat(this.next.warningsAll());\n // }\n // return myWarnings;\n // }\n\n /**\n * @method warningMessage(message)\n * Save a warning message in a common format for our ProcessTasks.\n */\n warningMessage(message) {\n // this.emit(\"warning\", `${this.key}: ${message}`);\n this._warnings = this._warnings || [];\n this._warnings.push({ message: `${this.key}: ${message}` });\n }\n\n ////\n //// QueryString Parser routines:\n ////\n}\n\nmodule.exports = ABQL;\n","/*\n * ABQLFind\n *\n * An ABQLFind depends on a BASE QL object (Object, Datacollection, Query)\n * and can perform a DB query based upon that BASE object.\n *\n */\nconst ABQLFindCore = require(\"../../core/ql/ABQLFindCore.js\");\n\nclass ABQLFind extends ABQLFindCore {\n // constructor(attributes, prevOP, task, application) {\n // super(attributes, ParameterDefinitions, prevOP, task, application);\n // }\n ///\n /// Instance Methods\n ///\n}\n\nmodule.exports = ABQLFind;\n","/*\n * ABQLManager\n *\n * An interface for managing the different ABQL Operations available in our\n * AppBuilder.\n *\n */\n\nconst ABQLManagerCore = require(\"../../core/ql/ABQLManagerCore.js\");\nconst ABQLRootObject = require(\"./ABQLRootObject.js\");\n\nconst ABQLManager = {\n /**\n * @method fromAttributes()\n * return an {ABQL} object that represents the given attributes that\n * were saved from the previous .toObj()\n * @param {object} attributes\n *\t\t the values returned from the previous .toObj() call\n * @param {ABProcessTask***} task\n *\t\t the current ABProcessTaskServiceQuery that contains this QL\n * @param {ABFactory} AB\n *\t\t the current {ABFactory} active for this interface.\n * @return {ABQL} | null\n */\n fromAttributes: ABQLManagerCore.fromAttributes,\n\n /**\n * @method ids()\n * return a set of unique webix ids for the ui portions of this object.\n * @param {string} id\n *\t\t the webix base id of the parameters panel.\n * @return {object}\n */\n ids: (id) => {\n return {\n root: `${id}_root`,\n select: `${id}_root_select`,\n options: `${id}_root_options`,\n };\n },\n\n /**\n * @method builder\n * return a UI component like object that will display the QL builder.\n * The component will support:\n *\t\t.ui(id) : returns a webix ui definition for the current builder\n *\t\t.init(id) : performs any special actions to prepare the webix ui\n * @param {object} rootOP\n *\t\t the root ABQLxxxx operation\n * @param {ABProcessTask***} task\n *\t\t the current Process Task that is requesting the data.\n * @param {ABFactory} AB\n *\t\t the {ABFactory} active for this display.\n * @return {object}\n */\n builder: (rootOP, task, AB) => {\n // const rootOP = this.fromAttributes(attributes, task, AB);\n // const L = (...params) => AB.Multilingual.label(...params);\n\n return {\n ui: (id) => {\n rootOP = rootOP ?? new ABQLRootObject({}, task, AB);\n\n const ids = ABQLManager.ids(id);\n const ui = {\n rows: [\n {\n id: ids.root,\n cols: [],\n },\n ],\n };\n\n rootOP.uiAddParams(id, ui);\n rootOP.uiAddNext(id, ui);\n\n return ui;\n },\n init: (id) => {},\n };\n },\n\n /**\n * @method parse\n * step through the current properties panel and decode the QL objects\n * and their parameters.\n * Return the .toOBJ() attributes definition as a result.\n * @param {string} id\n *\t\t the webix base id of the parameters panel.\n * @param {ABProcessTask***} task\n *\t\t the current Process Task that is requesting the data.\n * @param {ABFactory} AB\n *\t\t the {ABFactory} object that is currently active.\n * @return {object}\n */\n parse: (id, task, AB) => {\n const ids = ABQLManager.ids(id);\n const root = $$(ids.root);\n\n if (!root) {\n console.warn(\"ABQLManager.parse(): unable to find root element\");\n\n return;\n }\n\n // get all the input rows\n const rows = root.getParentView().getChildViews();\n\n const parseCurrent = (rows, options, prevOP) => {\n if (rows.length === 0) return null;\n\n const row = rows.shift();\n\n // get which operation was selected\n // find the operation selector (skip any indents)\n const views = row.getChildViews();\n\n let selector = views.shift();\n\n while (!selector?.getValue) selector = views.shift();\n\n const value = selector.getValue();\n\n // figure out the QLOP object\n const OP = options.find((o) => {\n return o.key === value || o.key === ABQLRootObject.key;\n });\n\n if (OP) {\n let currOP = null;\n\n if (prevOP) currOP = new OP({}, prevOP, task, AB);\n else currOP = new OP({}, task, AB);\n\n // now get currOP to initialize from it's parameters:\n currOP.parseRow(row, id);\n\n // carry forward any .object info if not already established\n // by the .parseRow():\n if (!currOP.object && prevOP) {\n currOP.object = prevOP.object;\n currOP.objectID = currOP.object?.id ?? null;\n }\n\n const nextRow = parseCurrent(\n rows,\n currOP.NextQLOps ?? currOP.constructor.NextQLOps,\n currOP\n );\n\n currOP.next = nextRow;\n\n return currOP;\n }\n\n return null;\n };\n\n const operation = parseCurrent(rows, ABQLManagerCore.QLOps, null);\n\n return operation;\n },\n};\n\nmodule.exports = ABQLManager;\n","/*\n * ABQLRootObject\n *\n * An ABQL defines a Query Language Operation. A QL Operation\n * is intended to be evaluated at run time and return a value that can be\n * assigned to form value or an object.\n *\n *\n */\n\nconst ABQLRootObjectCore = require(\"../../core/ql/ABQLRootObjectCore.js\");\n\nclass ABQLObject extends ABQLRootObjectCore {\n // constructor(attributes, task, application) {\n // // NOTE: keep this so we can insert the prevOp === null\n // super(attributes, ParameterDefinitions, null, task, application);\n // }\n\n ///\n /// Instance Methods\n ///\n\n /*\n * @method paramChanged()\n * respond to an update to the given parameter.\n * NOTE: the value will ALREADY be saved in this.params[pDef.name].\n * @param {obj} pDef\n * the this.parameterDefinition entry of the parameter that was\n * changed.\n */\n paramChanged(pDef) {\n if (pDef.name === \"name\") {\n this.objectID = this.params[pDef.name];\n this.object = this.objectLookup(this.objectID);\n\n // ?? is this correct?\n // if we already have created a .next operation, and we have\n // just changed our .object, pass that information forward.\n if (this.next) this.next.object = this.object;\n }\n }\n\n /**\n * @method parseRow()\n * When it is time to pull the information from the properties panel,\n * use this fn to get the current Row of data.\n *\n * This fn() will populate the this.params with the values for each\n * of our .parameterDefinitions.\n *\n * @param {webixNode} row\n * the current webix node that contains the ROW defining the\n * operation and it's parameters.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n */\n parseRow(row, id) {\n super.parseRow(row, id);\n\n // for an Object operation, we need to set our .objectID after\n // the values are parsed.\n\n if (this.params.name) {\n this.objectID = this.params.name;\n this.object = this.objectLookup(this.params.name);\n }\n }\n\n warningsEval() {\n super.warningsEval();\n if (!this.object) {\n this.warningMessage(\"has no object set.\", {\n objectID: this.objectID,\n });\n }\n }\n}\n\nmodule.exports = ABQLObject;\n","const ABQLRowPluckCore = require(\"../../core/ql/ABQLRowPluckCore.js\");\n\nclass ABQLRowPluck extends ABQLRowPluckCore {\n /*\n * @method paramChanged()\n * respond to an update to the given parameter.\n * NOTE: the value will ALREADY be saved in this.params[pDef.name].\n * @param {obj} pDef\n * the this.parameterDefinition entry of the parameter that was\n * changed.\n */\n paramChanged(pDef, id) {\n super.paramChanged(pDef);\n\n // Re-generate next select options\n if (pDef.name === \"fieldID\") this.uiNextRowSelectorRefresh(id);\n }\n}\n\nmodule.exports = ABQLRowPluck;\n","/*\n * ABQLRowSave\n *\n * An ABQLRowSave can store the current Data set into the Process Task it is\n * in, so that this data can be made available to other Process Tasks.\n *\n */\n\nconst ABQLRowSaveCore = require(\"../../core/ql/ABQLRowSaveCore.js\");\n\nclass ABQLRowSave extends ABQLRowSaveCore {\n paramChanged(pDef, id) {\n super.paramChanged(pDef);\n }\n}\n\nmodule.exports = ABQLRowSave;\n","/*\n * ABQLRowUpdate\n *\n * An ABQLRow Update allows you to update the values on the current\n * Row of data.\n *\n */\n\nconst ABQLRowUpdateCore = require(\"../../core/ql/ABQLRowUpdateCore.js\");\n\nclass ABQLRowUpdate extends ABQLRowUpdateCore {\n // constructor(attributes, prevOP, task, application) {\n // super(attributes, ParameterDefinitions, prevOP, task, application);\n // // #Hack! : when an Operation provides the same .NextQlOps that it\n // // was defined in, we can't require it again ==> circular dependency.\n // // so we manually set it here from the operation that created us:\n // this.constructor.NextQLOps = prevOP.constructor.NextQLOps;\n // }\n ///\n /// Instance Methods\n ///\n}\n\nmodule.exports = ABQLRowUpdate;\n","/*\n * ABQLSetFirst\n *\n * An ABQLFind depends on a BASE QL object (Object, Datacollection, Query)\n * and can perform a DB query based upon that BASE object.\n *\n */\n\nconst ABQLSetFirstCore = require(\"../../core/ql/ABQLSetFirstCore.js\");\n\nclass ABQLSetFirst extends ABQLSetFirstCore {\n // constructor(attributes, prevOP, task, application) {\n // super(attributes, [], prevOP, task, application);\n // }\n ///\n /// Instance Methods\n ///\n}\n\nmodule.exports = ABQLSetFirst;\n","/*\n * ABQLSetPluck\n *\n * An ABQLSetPluck can process a set (array) of data and pluck out a specified\n * field from each row to then make an array of values that only contain that \n * field.\n * \n * Example: \narray = [\n {\n\tname: \"Neo\",\n\temail: \"neo@thematrix.com\",\n\trelationships: [ { morpheous}, {trinity} ]\n },\n {\n\tname: \"trinity\",\n\temail: \"trinity@thematrix.com\",\n\trelationships: [ {neo}, {morpheous} ]\n },\n {\n\tname: \"morpheous\",\n\temail: \"morpheous@thematrix.com\",\n\trelationships: [ {neo}, {trinity}]\n }\n\n]\n\npluck(\"email\") :\n\t[\n\t\t\"neo@thematrix.com\",\n\t\t\"trinity@thematrix.com\",\n\t\t\"morpheous@thematrix.com\"\n\t]\n\npluck(\"relationships\"):\n\t[\n\t\t{neo},\n\t\t{trinity},\n\t\t{morpheous}\n\t]\n *\n */\n\nconst ABQLSetPluckCore = require(\"../../core/ql/ABQLSetPluckCore.js\");\n\nclass ABQLSetPluck extends ABQLSetPluckCore {\n // constructor(attributes, prevOP, task, application) {\n // super(attributes, [], prevOP, task, application);\n // }\n ///\n /// Instance Methods\n ///\n\n /*\n * @method paramChanged()\n * respond to an update to the given parameter.\n * NOTE: the value will ALREADY be saved in this.params[pDef.name].\n * @param {obj} pDef\n * the this.parameterDefinition entry of the parameter that was\n * changed.\n */\n paramChanged(pDef) {\n if (pDef.name === \"fieldID\") {\n // debugger;\n this.fieldID = this.params[pDef.name];\n // v2 method:\n // this.field = this.object.fieldByID(this.fieldID);\n this.field = this.object.fieldByID(this.fieldID);\n\n // v2 method:\n // if (this.field && this.field.isConnected) {\n if (this.field && this.field.key === \"connectObject\") {\n this.objectOut = this.field.datasourceLink;\n this.objectOutID = this.objectOut.id;\n\n // ?? is this correct?\n // if we already have created a .next operation, and we have\n // just changed our .object, pass that information forward.\n if (this.next) this.next.object = this.objectOut;\n }\n }\n }\n\n /**\n * @method parseRow()\n * When it is time to pull the information from the properties panel,\n * use this fn to get the current Row of data.\n *\n * This fn() will populate the this.params with the values for each\n * of our .parameterDefinitions.\n *\n * NOTE: in this process our .object and .objectOut isn't as simple\n * as the other QL node types. We'll have to interpolate our values\n * from the given fieldID in our property panel.\n *\n * @param {webixNode} row\n * the current webix node that contains the ROW defining the\n * operation and it's parameters.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n */\n parseRow(row, id) {\n super.parseRow(row, id);\n\n this.fieldID = this.params.fieldID;\n\n // we now have to build backwards from the current fieldID to set our\n // relevant .object and .objectOut\n this.AB.objects((o) => {\n if (!this.field) {\n // const field = o.fieldByID(this.fieldID);\n const field = o.fieldByID(this.fieldID);\n\n if (field) this.field = field;\n }\n });\n\n if (this.field) {\n this.object = this.field.object;\n\n // v2 method:\n // if (this.field.isConnected) {\n if (this.field && this.field.key === \"connectObject\") {\n this.objectOut = this.field.datasourceLink;\n this.objectOutID = this.objectOut.id;\n }\n }\n }\n}\n\nmodule.exports = ABQLSetPluck;\n","/*\n * ABQLSetSave\n *\n * An ABQLSetSave can store the current Data set into the Process Task it is\n * in, so that this data can be made available to other Process Tasks.\n *\n */\n\nconst ABQLSetSaveCore = require(\"../../core/ql/ABQLSetSaveCore.js\");\n\nclass ABQLSetSave extends ABQLSetSaveCore {\n // constructor(attributes, prevOP, task, application) {\n // super(attributes, [], prevOP, task, application);\n // }\n ///\n /// Instance Methods\n ///\n\n /*\n * @method paramChanged()\n * respond to an update to the given parameter.\n * NOTE: the value will ALREADY be saved in this.params[pDef.name].\n * @param {obj} pDef\n * the this.parameterDefinition entry of the parameter that was\n * changed.\n */\n paramChanged(pDef) {\n if (pDef.name === \"task_param\") {\n this.taskParam = this.params[pDef.name];\n }\n }\n\n parseRow(row, id) {\n super.parseRow(row, id);\n\n this.taskParam = this.params[\"task_param\"];\n\n if (!this.registered) {\n this.task.registerDatasource(this);\n this.registered = true;\n }\n }\n\n warningsEval() {\n super.warningsEval();\n if (!this.taskParam || this.taskParam === \"\") {\n this.warningMessage(\"requires a name to save our data as.\");\n }\n }\n}\n\nmodule.exports = ABQLSetSave;\n","const ABViewCore = require(\"../../core/views/ABViewCore.js\");\nconst ABViewComponent = require(\"./viewComponent/ABViewComponent\").default;\n\nmodule.exports = class ABView extends ABViewCore {\n // constructor(attributes, application, parent) {\n // super(attributes, application, parent);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewComponent(this);\n }\n\n /*\n * @method componentList\n * return the list of components available on this view to display in the editor.\n * @param {bool} isEdited is this component currently in the Interface Editor\n * @return {array} of ABView objects.\n */\n componentList(isEdited) {\n // views not allowed to drop onto this View:\n var viewsToIgnore = [\n \"view\",\n \"page\",\n \"formpanel\",\n \"viewcontainer\",\n // not allowed Detail's widgets\n \"detailcheckbox\",\n \"detailcustom\",\n \"detailconnect\",\n \"detailimage\",\n \"detailselectivity\",\n \"detailtext\",\n \"detailtree\",\n // not allowed Form's widgets\n \"button\",\n \"checkbox\",\n \"connect\",\n \"datepicker\",\n \"fieldcustom\",\n \"textbox\",\n \"numberbox\",\n \"selectsingle\",\n \"selectmultiple\",\n \"formtree\",\n \"fieldreadonly\",\n // not allowed Chart's Widgets\n \"pie\",\n \"bar\",\n \"line\",\n \"area\",\n // not allowed Report page\n \"report\",\n \"reportPage\",\n \"reportPanel\",\n ];\n\n var allComponents = this.application.viewAll(); // ABViewManager.allViews();\n var allowedComponents = allComponents.filter((c) => {\n return viewsToIgnore.indexOf(c.common().key) == -1;\n });\n\n return allowedComponents;\n }\n\n changePage(pageId) {\n this.emit(\"changePage\", pageId);\n }\n\n warningsAll() {\n // report both OUR warnings, and any warnings from any of our fields\n var allWarnings = super.warningsAll();\n this.views().forEach((v) => {\n allWarnings = allWarnings.concat(v.warningsAll());\n });\n\n (this.pages?.() || []).forEach((p) => {\n allWarnings = allWarnings.concat(p.warningsAll());\n });\n\n return allWarnings.filter((w) => w);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let allViews = this.views();\n\n (this.__missingViews || []).forEach((id) => {\n this.warningsMessage(`references unknown View[${id}]`);\n });\n\n allViews.forEach((v) => {\n v.warningsEval();\n });\n\n // if a datacollection is specified, verify it can be accessed.\n if (this.settings.dataviewID) {\n let dc = this.datacollections || this.datacollection;\n if (!dc) {\n this.warningsMessage(\n `references unknown dataviewID[${this.settings.dataviewID}]`\n );\n }\n }\n }\n\n warningsMessage(msg, data = {}) {\n let message = `${this.key}[${this.name}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n};\n","const ABViewCSVExporterCore = require(\"../../core/views/ABViewCSVExporterCore\");\nconst ABViewCSVExporterComponent = require(\"./viewComponent/ABViewCSVExporterComponent\");\n\nmodule.exports = class ABViewCSVExporter extends ABViewCSVExporterCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj } UI component\n */\n component() {\n return new ABViewCSVExporterComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n }\n};\n","const ABViewCSVImporterCore = require(\"../../core/views/ABViewCSVImporterCore\");\nconst ABViewCSVImporterComponent = require(\"./viewComponent/ABViewCSVImporterComponent\");\n\nmodule.exports = class ABViewCSVImporter extends ABViewCSVImporterCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component(idBase) {\n return new ABViewCSVImporterComponent(this, idBase);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n\n if (!this.settings.availableFieldIds?.length) {\n this.warningsMessage(\"has no fields set for matching import data\");\n }\n }\n};\n","const ABViewCarouselCore = require(\"../../core/views/ABViewCarouselCore\");\nimport ABViewCarouselComponent from \"./viewComponent/ABViewCarouselComponent\";\n\n// const ABViewPropertyFilterData = require(\"./viewProperties/ABViewPropertyFilterData\");\n// const ABViewPropertyLinkPage = require(\"./viewProperties/ABViewPropertyLinkPage\");\n\nimport ABViewPropertyFilterData from \"./viewProperties/ABViewPropertyFilterData\";\nimport ABViewPropertyLinkPage from \"./viewProperties/ABViewPropertyLinkPage\";\n\nlet PopupCarouselFilterMenu = null;\n\nexport default class ABViewCarousel extends ABViewCarouselCore {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // filter property\n this.filterHelper.fromSettings(this.settings.filter);\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n var dv = this.datacollection;\n if (dv) {\n this.filterHelper.objectLoad(dv.datasource);\n this.filterHelper.fromSettings(this.settings.filter);\n }\n\n return new ABViewCarouselComponent(this);\n }\n\n get idBase() {\n return `ABViewCarousel_${this.id}`;\n }\n\n get filterHelper() {\n if (this.__filterHelper == null)\n this.__filterHelper = new ABViewPropertyFilterData(\n this.AB,\n this.idBase\n );\n\n return this.__filterHelper;\n }\n\n get linkPageHelper() {\n if (this.__linkPageHelper == null)\n this.__linkPageHelper = new ABViewPropertyLinkPage();\n\n return this.__linkPageHelper;\n }\n\n warningsEval() {\n super.warningsEval();\n\n let field = this.imageField;\n if (!field) {\n this.warningsMessage(\n `can't resolve image field[${this.settings.field}]`\n );\n }\n }\n}\n","const ABViewChartCore = require(\"../../core/views/ABViewChartCore\");\nconst ABViewChartComponent = require(\"./viewComponent/ABViewChartComponent\");\n\nmodule.exports = class ABViewChart extends ABViewChartCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj} App\n * @return {obj} UI component\n */\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewChartComponent(this);\n }\n\n fromValues(values) {\n super.fromValues(values);\n this.refreshData();\n }\n\n getDCChart() {\n if (!this._dcChart) this._dcChart = new webix.DataCollection();\n\n return this._dcChart;\n }\n\n refreshData() {\n const dc = this.datacollection;\n if (dc == null) return this.dcChart;\n\n const labelCol = this.labelField();\n const valueCol = this.valueField();\n const valueCol2 = this.valueField2();\n\n if (!labelCol || !valueCol) return this.dcChart;\n\n // const labelColName = labelCol.columnName;\n const numberColName = valueCol.columnName;\n\n let numberColName2 = \"\";\n\n if (this.settings.multipleSeries && valueCol2) {\n numberColName2 = valueCol2.columnName;\n }\n\n const colorList = [\n \"#ee4339\",\n \"#ee9336\",\n \"#eed236\",\n \"#d3ee36\",\n \"#a7ee70\",\n \"#58dccd\",\n \"#36abee\",\n \"#476cee\",\n \"#a244ea\",\n \"#e33fc7\",\n ];\n\n const dInfo = dc.getData();\n\n let results = [];\n let sumData = {};\n let sumNumber = 0;\n let sumNumber2 = 0;\n let countNumber = dInfo.length;\n\n dInfo.forEach((item) => {\n const labelKey = labelCol.format(item) || item.id;\n\n let numberVal = parseFloat(item[numberColName] || 0);\n let numberVal2 = null;\n\n if (this.settings.multipleSeries)\n numberVal2 = parseFloat(item[numberColName2]) || 0;\n\n switch (valueCol.key) {\n //Formula Datatype\n case \"formula\":\n numberVal = valueCol.format(item);\n\n break;\n\n //Calcualte Datatype\n case \"calculate\":\n numberVal = parseFloat(\n valueCol.constructor.convertToJs(\n valueCol.object,\n valueCol.settings.formula,\n item,\n valueCol.settings.decimalPlaces\n )\n );\n\n break;\n\n default:\n break;\n }\n\n if (sumData[labelKey] == null) {\n let label = labelKey;\n\n // Get label of the connect field\n if (labelCol.isConnection) {\n let relateValues = labelCol.pullRelationValues(item);\n if (relateValues != null) {\n if (Array.isArray(relateValues))\n label = relateValues\n .map((val) => val.text || \"\")\n .join(\", \");\n else label = relateValues.text;\n }\n }\n\n if (this.settings.multipleSeries) {\n sumData[labelKey] = {\n label: label || item.id,\n value: 0,\n value2: 0,\n };\n } else {\n sumData[labelKey] = {\n label: label || item.id,\n value: 0,\n };\n }\n }\n\n sumData[labelKey].value += numberVal;\n sumNumber += numberVal;\n\n if (this.settings.multipleSeries) {\n sumData[labelKey].value2 += numberVal2;\n sumNumber2 += numberVal2;\n }\n });\n\n let index = 0;\n\n for (const key in sumData) {\n let val = sumData[key].value;\n\n if (val <= 0) continue;\n\n // Display to percent values\n if (this.settings.isPercentage) {\n val = (val / sumNumber) * 100;\n val = Math.round(val * 100) / 100; // round decimal 2 digits\n val = val + \" %\";\n }\n\n if (this.settings.multipleSeries) {\n let val2 = sumData[key].value2;\n\n if (val2 <= 0) continue;\n\n // Display to percent values\n if (this.settings.isPercentage) {\n val2 = (val2 / sumNumber2) * 100;\n val2 = Math.round(val2 * 100) / 100; // round decimal 2 digits\n val2 = val2 + \" %\";\n }\n\n results.push({\n label: sumData[key].label,\n value: val,\n value2: val2,\n color: colorList[index % colorList.length],\n count: countNumber,\n });\n } else {\n results.push({\n label: sumData[key].label,\n value: val,\n color: colorList[index % colorList.length],\n count: countNumber,\n });\n }\n\n index += 1;\n }\n\n const dcChart = this.getDCChart();\n\n dcChart.clearAll();\n dcChart.parse(results);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let labelField = this.labelField();\n if (!labelField) {\n this.warningsMessage(\n `can't resolve label field[${this.settings.columnLabel}]`\n );\n }\n\n let valueField = this.valueField();\n if (!valueField) {\n this.warningsMessage(\n `can't resolve value field[${this.settings.columnValue}]`\n );\n }\n }\n};\n","const ABViewChartAreaCore = require(\"../../core/views/ABViewChartAreaCore\");\nconst ABViewChartAreaComponent = require(\"./viewComponent/ABViewChartAreaComponent\");\n\nmodule.exports = class ABViewChartArea extends ABViewChartAreaCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewChartAreaComponent(this);\n }\n};\n","const ABViewChartBarCore = require(\"../../core/views/ABViewChartBarCore\");\nconst ABViewChartBarComponent = require(\"./viewComponent/ABViewChartBarComponent\");\n\nmodule.exports = class ABViewChartBar extends ABViewChartBarCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewChartBarComponent(this);\n }\n};\n","const ABViewWidget = require(\"./ABViewWidget\");\nconst ABViewChartContainerComponent = require(\"./viewComponent/ABViewChartContainerComponent\");\n\nmodule.exports = class ABViewChartContainer extends ABViewWidget {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewChartContainerComponent(this);\n }\n\n get datacollection() {\n return this.parent.datacollection;\n }\n};\n","const ABViewChartLineCore = require(\"../../core/views/ABViewChartLineCore\");\nconst ABViewChartLineComponent = require(\"./viewComponent/ABViewChartLineComponent\");\n\nmodule.exports = class ABViewChartLine extends ABViewChartLineCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewChartLineComponent(this);\n }\n};\n","const ABViewChartPieCore = require(\"../../core/views/ABViewChartPieCore\");\nconst ABViewChartPieComponent = require(\"./viewComponent/ABViewChartPieComponent\");\n\nmodule.exports = class ABViewChartPie extends ABViewChartPieCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewChartPieComponent(this);\n }\n};\n","const ABViewCommentCore = require(\"../../core/views/ABViewCommentCore\");\nconst ABViewCommentComponent = require(\"./viewComponent/ABViewCommentComponent\");\n\nmodule.exports = class ABViewComment extends ABViewCommentCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewCommentComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let field = this.getUserField();\n if (!field) {\n this.warningsMessage(\n `can't resolve user field[${this.settings.columnUser}]`\n );\n }\n\n field = this.getCommentField();\n if (!field) {\n this.warningsMessage(\n `can't resolve comment field[${this.settings.columnComment}]`\n );\n }\n\n field = this.getDateField();\n if (!field) {\n this.warningsMessage(\n `can't resolve date field[${this.settings.columnDate}]`\n );\n }\n }\n};\n","const ABViewConditionalContainerCore = require(\"../../core/views/ABViewConditionalContainerCore\");\nconst ABViewConditionalContainerComponent = require(\"./viewComponent/ABViewConditionalContainerComponent\");\n\nmodule.exports = class ABViewConditionalContainer extends (\n ABViewConditionalContainerCore\n) {\n /**\n * @function component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewConditionalContainerComponent(this);\n }\n\n async save() {\n const viewIf = this.views().find((v) => v.name === \"If\");\n const viewElse = this.views().find((v) => v.name === \"Else\");\n const pendingSave = [];\n\n if (viewIf) pendingSave.push(viewIf.save());\n\n if (viewElse) pendingSave.push(viewElse.save());\n\n await Promise.all(pendingSave);\n\n await super.save();\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n\n if (\n !this.settings.filterConditions ||\n this.settings.filterConditions?.rules?.length == 0\n ) {\n this.warningsMessage(\"has no filter conditions set\");\n }\n }\n};\n","import ABViewConnectDataFilterCore from \"../../core/views/ABViewConnectDataFilterCore\";\nimport ABViewConnectDataFilterComponent from \"./viewComponent/ABViewConnectDataFilterComponent\";\n\nexport default class ABViewConnectDataFilter extends ABViewConnectDataFilterCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewConnectDataFilterComponent(this);\n }\n}\n","const ABViewContainerCore = require(\"../../core/views/ABViewContainerCore\");\nconst ABViewContainerComponent = require(\"./viewComponent/ABViewContainerComponent\");\n\nmodule.exports = class ABViewContainer extends ABViewContainerCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewContainerComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let allViews = this.views();\n\n if (allViews.length == 0) {\n this.warningsMessage(\"has no content\");\n }\n\n // NOTE: this is done in ABView:\n // (allViews || []).forEach((v) => {\n // v.warningsEval();\n // });\n }\n};\n","import ABViewDataFilterCore from \"../../core/views/ABViewDataFilterCore\";\nimport ABViewDataFilterComponent from \"./viewComponent/ABViewDataFilterComponent\";\n\nexport default class ABViewDataFilter extends ABViewDataFilterCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj} App\n * @return {obj} UI component\n */\n component() {\n return new ABViewDataFilterComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n } else {\n if (this.settings.viewType == \"connected\") {\n const object = DC.datasource;\n const [field] = object.fields(\n (f) => f.columnName === this.settings.field\n );\n if (!field) {\n this.warningsMessage(`can't resolve field reference`);\n }\n }\n }\n }\n}\n","import ABViewDataSelectCore from \"../../core/views/ABViewDataSelectCore\";\nimport ABViewDataSelectComponent from \"./viewComponent/ABViewDataSelectComponent\";\n\nexport default class ABViewDataSelect extends ABViewDataSelectCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj} App\n * @return {obj} UI component\n */\n component() {\n return new ABViewDataSelectComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n } else {\n if (this.settings.viewType == \"connected\") {\n const object = DC.datasource;\n const [field] = object.fields(\n (f) => f.columnName === this.settings.field\n );\n if (!field) {\n this.warningsMessage(`can't resolve field reference`);\n }\n }\n }\n }\n}\n","const ABViewDataviewCore = require(\"../../core/views/ABViewDataviewCore\");\nconst ABViewDataviewComponent = require(\"./viewComponent/ABViewDataviewComponent\");\n\nconst ABViewDataviewDefaults = ABViewDataviewCore.defaultValues();\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewDataview extends ABViewDataviewCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.detailsPage =\n this.settings.detailsPage ?? ABViewDataviewDefaults.detailsPage;\n this.settings.editPage =\n this.settings.editPage ?? ABViewDataviewDefaults.editPage;\n this.settings.detailsTab =\n this.settings.detailsTab ?? ABViewDataviewDefaults.detailsTab;\n this.settings.editTab =\n this.settings.editTab ?? ABViewDataviewDefaults.editTab;\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj } v1App\n * @param {string} idPrefix - define to support in 'Datacollection' widget\n *\n * @return {obj } UI component\n */\n component() {\n return new ABViewDataviewComponent(this);\n }\n};\n","const ABViewDetailCore = require(\"../../core/views/ABViewDetailCore\");\nconst ABViewDetailComponent = require(\"./viewComponent/ABViewDetailComponent\");\n\nmodule.exports = class ABViewDetail extends ABViewDetailCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj } v1App\n * @param {string} idPrefix - define to support in 'Datacollection' widget\n *\n * @return {obj } UI component\n */\n component() {\n return new ABViewDetailComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n }\n};\n","const ABViewDetailCheckboxCore = require(\"../../core/views/ABViewDetailCheckboxCore\");\nconst ABViewDetailCheckboxComponent = require(\"./viewComponent/ABViewDetailCheckboxComponent\");\n\nmodule.exports = class ABViewDetailCheckbox extends ABViewDetailCheckboxCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailCheckboxComponent(this);\n }\n};\n","const ABViewDetailConnectCore = require(\"../../core/views/ABViewDetailConnectCore\");\nconst ABViewPropertyAddPage =\n require(\"./viewProperties/ABViewPropertyAddPage\").default;\n\nconst ABViewDetailConnectComponent = require(\"./viewComponent/ABViewDetailConnectComponent\");\n\nmodule.exports = class ABViewDetailConnect extends ABViewDetailConnectCore {\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n this.addPageTool.fromSettings(this.settings);\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailConnectComponent(this);\n }\n\n get addPageTool() {\n if (this.__addPageTool == null)\n this.__addPageTool = new ABViewPropertyAddPage();\n\n return this.__addPageTool;\n }\n};\n","const ABViewDetailCustomCore = require(\"../../core/views/ABViewDetailCustomCore\");\nconst ABViewDetailCustomComponent = require(\"./viewComponent/ABViewDetailCustomComponent\");\n\nmodule.exports = class ABViewDetailCustom extends ABViewDetailCustomCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailCustomComponent(this);\n }\n};\n","const ABViewDetailImageCore = require(\"../../core/views/ABViewDetailImageCore\");\nconst ABViewDetailImageComponent = require(\"./viewComponent/ABViewDetailImageComponent\");\n\nmodule.exports = class ABViewDetailImage extends ABViewDetailImageCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailImageComponent(this);\n }\n};\n","const ABViewDetailItemCore = require(\"../../core/views/ABViewDetailItemCore\");\nconst ABViewDetailItemComponent = require(\"./viewComponent/ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailItem extends ABViewDetailItemCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailItemComponent(this);\n }\n};\n","const ABViewDetailTextCore = require(\"../../core/views/ABViewDetailTextCore\");\nconst ABViewDetailTextComponent = require(\"./viewComponent/ABViewDetailTextComponent\");\n\nmodule.exports = class ABViewDetailText extends ABViewDetailTextCore {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailTextComponent(this);\n }\n};\n","const ABViewDetailTreeCore = require(\"../../core/views/ABViewDetailTreeCore\");\nconst ABViewDetailTreeComponent = require(\"./viewComponent/ABViewDetailTreeComponent\");\n\nmodule.exports = class ABViewDetailTree extends ABViewDetailTreeCore {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailTreeComponent(this);\n }\n};\n","const ABViewDocxBuilderCore = require(\"../../core/views/ABViewDocxBuilderCore\");\nconst ABViewDocxBuilderComponent = require(\"./viewComponent/ABViewDocxBuilderComponent\");\n\nmodule.exports = class ABViewDocxBuilder extends ABViewDocxBuilderCore {\n /**\n * @function component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDocxBuilderComponent(this);\n }\n\n letUserDownload(blob, filename) {\n const url = window.URL.createObjectURL(blob);\n\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a); // we need to append the element to the dom -> otherwise it will not work in firefox\n a.click();\n a.remove(); //afterwards we remove the element again\n\n window.URL.revokeObjectURL(url);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollections || this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n\n if (!this.settings.filename) {\n this.warningsMessage(\"is missing a DOCX template file\");\n } else {\n // TODO: should we check for the existance of the file?\n // this isn't currently an async friendly fn, so how?\n // let url = this.downloadUrl();\n }\n }\n};\n","const ABViewFormCore = require(\"../../core/views/ABViewFormCore\");\nconst ABViewFormComponent = require(\"./viewComponent/ABViewFormComponent\");\nconst ABViewFormButton = require(\"./ABViewFormButton\");\nconst ABViewFormCustom = require(\"./ABViewFormCustom\");\nconst ABViewFormConnect = require(\"./ABViewFormConnect\");\nconst ABViewFormDatepicker = require(\"./ABViewFormDatepicker\");\nconst ABViewFormSelectMultiple = require(\"./ABViewFormSelectMultiple\");\nconst ABViewFormTextbox = require(\"./ABViewFormTextbox\");\nconst ABViewFormJson = require(\"./ABViewFormJson\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\n// const ABRecordRule = require(\"../../rules/ABViewRuleListFormRecordRules\");\n// const ABSubmitRule = require(\"../../rules/ABViewRuleListFormSubmitRules\");\n\n// let PopupRecordRule = null;\n// let PopupSubmitRule = null;\n\nconst ABViewFormPropertyComponentDefaults = ABViewFormCore.defaultValues();\n\nmodule.exports = class ABViewForm extends ABViewFormCore {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n\n this._callbacks = {\n onBeforeSaveData: () => true,\n };\n }\n\n superComponent() {\n if (this._superComponent == null)\n this._superComponent = super.component();\n\n return this._superComponent;\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormComponent(this);\n }\n\n refreshDefaultButton(ids) {\n // If default button is not exists, then skip this\n let defaultButton = this.views(\n (v) => v instanceof ABViewFormButton && v.settings.isDefault\n )[0];\n\n // Add a default button\n if (defaultButton == null) {\n defaultButton = ABViewFormButton.newInstance(this.application, this);\n defaultButton.settings.isDefault = true;\n }\n // Remove default button from array, then we will add it to be the last item later (.push)\n else {\n this._views = this.views((v) => v.id != defaultButton.id);\n }\n\n // Calculate position Y of the default button\n let yList = this.views().map((v) => (v.position.y || 0) + 1);\n yList.push(this._views.length || 0);\n yList.push($$(ids.fields).length || 0);\n let posY = Math.max(...yList);\n\n // Update to be the last item\n defaultButton.position.y = posY;\n\n // Keep the default button is always the last item of array\n this._views.push(defaultButton);\n\n return defaultButton;\n }\n\n /**\n * @method getFormValues\n *\n * @param {webix form} formView\n * @param {ABObject} obj\n * @param {ABDatacollection} dc\n * @param {ABDatacollection} dcLink [optional]\n */\n getFormValues(formView, obj, dc, dcLink) {\n // get the fields that are on this form\n const visibleFields = [\"id\"]; // we always want the id so we can udpate records\n formView.getValues(function (obj) {\n visibleFields.push(obj.config.name);\n });\n\n // only get data passed from form\n const allVals = formView.getValues();\n const formVals = {};\n visibleFields.forEach((val) => {\n formVals[val] = allVals[val];\n });\n\n // get custom values\n this.fieldComponents(\n (comp) =>\n comp instanceof ABViewFormCustom ||\n comp instanceof ABViewFormConnect ||\n comp instanceof ABViewFormDatepicker ||\n comp instanceof ABViewFormSelectMultiple ||\n (comp instanceof ABViewFormJson && comp.settings.type == \"filter\")\n ).forEach((f) => {\n const vComponent = this.viewComponents[f.id];\n if (vComponent == null) return;\n\n const field = f.field();\n if (field) {\n const getValue = vComponent.getValue ?? vComponent.logic.getValue;\n if (getValue)\n formVals[field.columnName] = getValue.call(vComponent, formVals);\n }\n });\n\n // remove connected fields if they were not on the form and they are present in the formVals because it is a datacollection\n obj.connectFields().forEach((f) => {\n if (\n visibleFields.indexOf(f.columnName) == -1 &&\n formVals[f.columnName]\n ) {\n delete formVals[f.columnName];\n delete formVals[f.relationName()];\n }\n });\n\n // clear undefined values or empty arrays\n for (const prop in formVals) {\n if (formVals[prop] == null || formVals[prop].length == 0)\n formVals[prop] = \"\";\n }\n\n // Add parent's data collection cursor when a connect field does not show\n let linkValues;\n\n if (dcLink) {\n linkValues = dcLink.getCursor();\n }\n\n if (linkValues) {\n const objectLink = dcLink.datasource;\n\n const connectFields = obj.connectFields();\n connectFields.forEach((f) => {\n const formFieldCom = this.fieldComponents(\n (fComp) => fComp?.field?.()?.id === f?.id\n );\n\n if (\n objectLink.id == f.settings.linkObject &&\n formFieldCom.length < 1 && // check field does not show\n formVals[f.columnName] === undefined\n ) {\n const linkColName = f.indexField\n ? f.indexField.columnName\n : objectLink.PK();\n\n formVals[f.columnName] = {};\n formVals[f.columnName][linkColName] =\n linkValues[linkColName] ?? linkValues.id;\n }\n });\n }\n\n // NOTE: need to pull data of current cursor to calculate Calculate & Formula fields\n // .formVals variable does not include data that does not display in the Form widget\n const cursorFormVals = Object.assign(dc.getCursor() ?? {}, formVals);\n\n // Set value of calculate or formula fields to use in record rule\n obj.fields((f) => f.key == \"calculate\" || f.key == \"formula\").forEach(\n (f) => {\n if (formVals[f.columnName] == null) {\n let reCalculate = true;\n\n // WORKAROUND: If \"Formula\" field will have Filter conditions,\n // Then it is not able to re-calculate on client side\n // because relational data is not full data so FilterComplex will not have data to check\n if (f.key == \"formula\" && f.settings?.where?.rules?.length > 0) {\n reCalculate = false;\n }\n\n formVals[f.columnName] = f.format(cursorFormVals, reCalculate);\n }\n }\n );\n\n if (allVals.translations?.length > 0)\n formVals.translations = allVals.translations;\n\n // give the Object a final chance to review the data being handled.\n obj.formCleanValues(formVals);\n\n return formVals;\n }\n\n /**\n * @method validateData\n *\n * @param {webix form} formView\n * @param {ABObject} object\n * @param {object} formVals\n *\n * @return {boolean} isValid\n */\n validateData($formView, object, formVals) {\n let list = \"\";\n\n // validate required fields\n const requiredFields = this.fieldComponents(\n (fComp) =>\n fComp?.field?.().settings?.required == true ||\n fComp?.settings?.required == true\n ).map((fComp) => fComp.field());\n\n // validate data\n const validator = object.isValidData(formVals);\n let isValid = validator.pass();\n\n // $$($formView).validate();\n $formView.validate();\n /**\n * helper function to fix the webix ui after adding an validation error\n * message.\n * @param {string} col - field.columnName\n */\n const fixInvalidMessageUI = (col) => {\n const $forminput = $formView.elements[col];\n if (!$forminput) return;\n // Y position\n const height = $forminput.$height;\n if (height < 56) {\n $forminput.define(\"height\", 60);\n $forminput.resize();\n }\n\n // X position\n const domInvalidMessage = $forminput.$view.getElementsByClassName(\n \"webix_inp_bottom_label\"\n )[0];\n if (!domInvalidMessage?.style[\"margin-left\"]) {\n domInvalidMessage.style.marginLeft = `${\n this.settings.labelWidth ??\n ABViewFormPropertyComponentDefaults.labelWidth\n }px`;\n }\n };\n\n // Display required messages\n requiredFields.forEach((f) => {\n if (!f) return;\n\n const fieldVal = formVals[f.columnName];\n if (fieldVal == \"\" || fieldVal == null || fieldVal.length < 1) {\n $formView.markInvalid(f.columnName, L(\"This is a required field.\"));\n list += `
  • ${L(\"Missing Required Field\")} ${f.columnName}
  • `;\n isValid = false;\n\n // Fix position of invalid message\n fixInvalidMessageUI(f.columnName);\n }\n });\n\n // if data is invalid\n if (!isValid) {\n const saveButton = $formView.queryView({\n view: \"button\",\n type: \"form\",\n });\n\n // error message\n if (validator?.errors?.length) {\n validator.errors.forEach((err) => {\n $formView.markInvalid(err.name, err.message);\n list += `
  • ${err.name}: ${err.message}
  • `;\n fixInvalidMessageUI(err.name);\n });\n\n saveButton?.disable();\n } else {\n saveButton?.enable();\n }\n }\n if (list) {\n webix.alert({\n type: \"alert-error\",\n title: L(\"Problems Saving\"),\n width: 400,\n text: `
      ${list}
    `,\n });\n }\n\n return isValid;\n }\n\n /**\n * @method recordRulesReady()\n * This returns a Promise that gets resolved when all record rules report\n * that they are ready.\n * @return {Promise}\n */\n async recordRulesReady() {\n return this.RecordRule.rulesReady();\n }\n\n /**\n * @method saveData\n * save data in to database\n * @param $formView - webix's form element\n *\n * @return {Promise}\n */\n async saveData($formView) {\n // call .onBeforeSaveData event\n // if this function returns false, then it will not go on.\n if (!this._callbacks?.onBeforeSaveData?.()) return;\n\n $formView.clearValidation();\n\n // get ABDatacollection\n const dv = this.datacollection;\n if (dv == null) return;\n\n // get ABObject\n const obj = dv.datasource;\n if (obj == null) return;\n\n // get ABModel\n const model = dv.model;\n if (model == null) return;\n\n // show progress icon\n $formView.showProgress?.({ type: \"icon\" });\n\n // get update data\n const formVals = this.getFormValues(\n $formView,\n obj,\n dv,\n dv.datacollectionLink\n );\n\n // form ready function\n const formReady = (newFormVals) => {\n // clear cursor after saving.\n if (dv) {\n if (this.settings.clearOnSave) {\n dv.setCursor(null);\n $formView.clear();\n } else {\n if (newFormVals && newFormVals.id) dv.setCursor(newFormVals.id);\n }\n }\n\n $formView.hideProgress?.();\n\n // if there was saved data pass it up to the onSaveData callback\n // if (newFormVals) this._logic.callbacks.onSaveData(newFormVals);\n if (newFormVals) this.emit(\"saved\", newFormVals); // Q? is this the right upgrade?\n };\n\n const formError = (err) => {\n const $saveButton = $formView.queryView({\n view: \"button\",\n type: \"form\",\n });\n\n // mark error\n if (err) {\n if (err.invalidAttributes) {\n for (const attr in err.invalidAttributes) {\n let invalidAttrs = err.invalidAttributes[attr];\n if (invalidAttrs && invalidAttrs[0])\n invalidAttrs = invalidAttrs[0];\n\n $formView.markInvalid(attr, invalidAttrs.message);\n }\n } else if (err.sqlMessage) {\n webix.message({\n text: err.sqlMessage,\n type: \"error\",\n });\n } else {\n webix.message({\n text: L(\"System could not save your data\"),\n type: \"error\",\n });\n this.AB.notify.developer(err, {\n message: \"Could not save your data\",\n view: this.toObj(),\n });\n }\n }\n\n $saveButton?.enable();\n\n $formView?.hideProgress?.();\n };\n\n // Load data of DCs that use in record rules\n await this.loadDcDataOfRecordRules();\n\n // wait for our Record Rules to be ready before we continue.\n await this.recordRulesReady();\n\n // update value from the record rule (pre-update)\n this.doRecordRulesPre(formVals);\n\n // validate data\n if (!this.validateData($formView, obj, formVals)) {\n // console.warn(\"Data is invalid.\");\n $formView.hideProgress?.();\n return;\n }\n\n let newFormVals;\n // {obj}\n // The fully populated values returned back from service call\n // We use this in our post processing Rules\n\n try {\n // is this an update or create?\n if (formVals.id) {\n newFormVals = await model.update(formVals.id, formVals);\n } else {\n newFormVals = await model.create(formVals);\n }\n } catch (err) {\n formError(err.data);\n throw err;\n }\n\n /*\n // OLD CODE:\n try {\n await this.doRecordRules(newFormVals);\n // make sure any updates from RecordRules get passed along here.\n this.doSubmitRules(newFormVals);\n formReady(newFormVals);\n return newFormVals;\n } catch (err) {\n this.AB.notify.developer(err, {\n message: \"Error processing Record Rules.\",\n view: this.toObj(),\n newFormVals: newFormVals,\n });\n // Question: how do we respond to an error?\n // ?? just keep going ??\n this.doSubmitRules(newFormVals);\n formReady(newFormVals);\n return;\n }\n */\n\n try {\n await this.doRecordRules(newFormVals);\n } catch (err) {\n this.AB.notify.developer(err, {\n message: \"Error processing Record Rules.\",\n view: this.toObj(),\n newFormVals: newFormVals,\n });\n }\n\n // make sure any updates from RecordRules get passed along here.\n try {\n this.doSubmitRules(newFormVals);\n } catch (errs) {\n this.AB.notify.developer(errs, {\n message: \"Error processing Submit Rules.\",\n view: this.toObj(),\n newFormVals: newFormVals,\n });\n }\n\n formReady(newFormVals);\n return newFormVals;\n }\n\n focusOnFirst() {\n let topPosition = 0;\n let topPositionId = \"\";\n this.views().forEach((item) => {\n if (item.key == \"textbox\" || item.key == \"numberbox\") {\n if (item.position.y == topPosition) {\n // topPosition = item.position.y;\n topPositionId = item.id;\n }\n }\n });\n let childComponent = this.viewComponents[topPositionId];\n if (childComponent && $$(childComponent.ui.id)) {\n $$(childComponent.ui.id).focus();\n }\n }\n\n async loadDcDataOfRecordRules() {\n const tasks = [];\n\n (this.settings?.recordRules ?? []).forEach((rule) => {\n (rule?.actionSettings?.valueRules?.fieldOperations ?? []).forEach(\n (op) => {\n if (op.valueType !== \"exist\") return;\n\n const pullDataDC = this.AB.datacollectionByID(op.value);\n\n if (\n pullDataDC?.dataStatus ===\n pullDataDC.dataStatusFlag.notInitial\n )\n tasks.push(pullDataDC.loadData());\n }\n );\n });\n\n await Promise.all(tasks);\n\n return true;\n }\n\n get viewComponents() {\n const superComponent = this.superComponent();\n return superComponent.viewComponents;\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n\n if (this.settings.recordRules) {\n // TODO: scan recordRules for warnings\n }\n\n if (this.settings.submitRules) {\n // TODO: scan submitRules for warnings.\n }\n }\n\n /**\n * @method deleteData\n * delete data in to database\n * @param $formView - webix's form element\n *\n * @return {Promise}\n */\n async deleteData($formView) {\n // get ABDatacollection\n const dc = this.datacollection;\n if (dc == null) return;\n\n // get ABObject\n const obj = dc.datasource;\n if (obj == null) return;\n\n // get ABModel\n const model = dc.model;\n if (model == null) return;\n\n // get update data\n const formVals = $formView.getValues();\n\n if (formVals?.id) {\n const result = await model.delete(formVals.id);\n\n // clear form\n if (result) {\n dc.setCursor(null);\n $formView.clear();\n }\n\n return result;\n }\n }\n};\n","const ABViewFormButtonCore = require(\"../../core/views/ABViewFormButtonCore\");\nconst ABViewFormButtonComponent = require(\"./viewComponent/ABViewFormButtonComponent\");\n\nmodule.exports = class ABViewFormButton extends ABViewFormButtonCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormButtonComponent(this);\n }\n};\n","const ABViewFormCheckboxCore = require(\"../../core/views/ABViewFormCheckboxCore\");\nconst ABViewFormCheckboxComponent = require(\"./viewComponent/ABViewFormCheckboxComponent\");\n\nmodule.exports = class ABViewFormCheckbox extends ABViewFormCheckboxCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormCheckboxComponent(this);\n }\n};\n","const ABViewFormConnectCore = require(\"../../core/views/ABViewFormConnectCore\");\nconst ABViewFormConnectComponent = require(\"./viewComponent/ABViewFormConnectComponent\");\nconst ABViewPropertyAddPage =\n require(\"./viewProperties/ABViewPropertyAddPage\").default;\nconst ABViewPropertyEditPage =\n require(\"./viewProperties/ABViewPropertyEditPage\").default;\n\nconst ABViewFormConnectPropertyComponentDefaults =\n ABViewFormConnectCore.defaultValues();\n\nmodule.exports = class ABViewFormConnect extends ABViewFormConnectCore {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n\n // Set filter value\n this.__filterComponent = this.AB.filterComplexNew(\n `${this.id}__filterComponent`\n );\n // this.__filterComponent.applicationLoad(application);\n this.__filterComponent.fieldsLoad(\n this.datasource ? this.datasource.fields() : [],\n this.datasource ? this.datasource : null\n );\n\n // NOTE: .objectWorkspace is a v1 setting\n // if (\n // !this.settings.objectWorkspace ||\n // !this.settings.objectWorkspace.filterConditions\n // ) {\n // this.AB.error(\"Error: filter conditions do not exist\", {\n // error: \"filterConditions do not exist\",\n // viewLocation: {\n // application: this.application.name,\n // id: this.id,\n // name: this.label,\n // },\n // view: this,\n // });\n // // manually place an empty filter\n // this.settings[\"objectWorkspace\"] = {};\n // this.settings[\"objectWorkspace\"][\"filterConditions\"] = { glue: \"and\" };\n // }\n\n this.__filterComponent.setValue(\n this.settings.filterConditions ??\n ABViewFormConnectPropertyComponentDefaults.filterConditions\n );\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.addPageTool.fromSettings(this.settings);\n this.editPageTool.fromSettings(this.settings);\n }\n\n static get addPageProperty() {\n return ABViewPropertyAddPage.propertyComponent(this.App, this.idBase);\n }\n\n static get editPageProperty() {\n return ABViewPropertyEditPage.propertyComponent(this.App, this.idBase);\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormConnectComponent(this);\n }\n\n get addPageTool() {\n if (this.__addPageTool == null)\n this.__addPageTool = new ABViewPropertyAddPage();\n\n return this.__addPageTool;\n }\n\n get editPageTool() {\n if (this.__editPageTool == null)\n this.__editPageTool = new ABViewPropertyEditPage();\n\n return this.__editPageTool;\n }\n};\n","const ABViewFormCustomCore = require(\"../../core/views/ABViewFormCustomCore\");\nconst ABViewFormCustomComponent = require(\"./viewComponent/ABViewFormCustomComponent\");\n\nmodule.exports = class ABViewFormCustom extends ABViewFormCustomCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormCustomComponent(this);\n }\n};\n","const ABViewFormDatepickerCore = require(\"../../core/views/ABViewFormDatepickerCore\");\nconst ABViewFormDatepickerComponent = require(\"./viewComponent/ABViewFormDatepickerComponent\");\n\nmodule.exports = class ABViewFormDatepicker extends ABViewFormDatepickerCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormDatepickerComponent(this);\n }\n};\n","const ABViewFormItemCore = require(\"../../core/views/ABViewFormItemCore\");\nconst ABViewFormItemComponent = require(\"./viewComponent/ABViewFormItemComponent\");\n\nconst ABViewFormFieldPropertyComponentDefaults =\n ABViewFormItemCore.defaultValues();\n\nmodule.exports = class ABViewFormItem extends ABViewFormItemCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n static get componentUI() {\n return ABViewFormItemComponent;\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormItemComponent(this);\n }\n\n /**\n * @method parentFormUniqueID\n * return a unique ID based upon the closest form object this component is on.\n * @param {string} key The basic id string we will try to make unique\n * @return {string}\n */\n parentFormUniqueID(key) {\n var form = this.parentFormComponent();\n var uniqueInstanceID;\n if (form) {\n uniqueInstanceID = form.uniqueInstanceID;\n } else {\n uniqueInstanceID = webix.uid();\n }\n\n return key + uniqueInstanceID;\n }\n};\n","const ABViewFormJsonCore = require(\"../../core/views/ABViewFormJsonCore\");\nconst ABViewFormJsonComponent = require(\"./viewComponent/ABViewFormJsonComponent\");\n\nmodule.exports = class ABViewFormJson extends ABViewFormJsonCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormJsonComponent(this);\n }\n};\n","const ABViewFormNumberCore = require(\"../../core/views/ABViewFormNumberCore\");\nconst ABViewFormNumberComponent = require(\"./viewComponent/ABViewFormNumberComponent\");\n\nmodule.exports = class ABViewFormNumber extends ABViewFormNumberCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormNumberComponent(this);\n }\n};\n","const ABViewFormReadonlyCore = require(\"../../core/views/ABViewFormReadonlyCore\");\nconst ABViewFormReadonlyComponent = require(\"./viewComponent/ABViewFormReadonlyComponent\");\n\nmodule.exports = class ABViewFormReadonly extends ABViewFormReadonlyCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormReadonlyComponent(this);\n }\n};\n","const ABViewFormSelectMultipleCore = require(\"../../core/views/ABViewFormSelectMultipleCore\");\nconst ABViewFormSelectMultipleComponent = require(\"./viewComponent/ABViewFormSelectMultipleComponent\");\n\nmodule.exports = class ABViewFormSelectMultiple extends (\n ABViewFormSelectMultipleCore\n) {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormSelectMultipleComponent(this);\n }\n};\n","const ABViewFormSelectSingleCore = require(\"../../core/views/ABViewFormSelectSingleCore\");\nconst ABViewFormSelectSingleComponent = require(\"./viewComponent/ABViewFormSelectSingleComponent\");\n\nmodule.exports = class ABViewFormSelectSingle extends (\n ABViewFormSelectSingleCore\n) {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormSelectSingleComponent(this);\n }\n};\n","const ABViewFormTextboxCore = require(\"../../core/views/ABViewFormTextboxCore\");\nconst ABViewFormTextboxComponent = require(\"./viewComponent/ABViewFormTextboxComponent\");\n\nmodule.exports = class ABViewFormTextbox extends ABViewFormTextboxCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormTextboxComponent(this);\n }\n};\n","const ABViewFormTreeCore = require(\"../../core/views/ABViewFormTreeCore\");\nconst ABViewFormTreeComponent = require(\"./viewComponent/ABViewFormTreeComponent\");\n\nmodule.exports = class ABViewFormTree extends ABViewFormTreeCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj} App\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormTreeComponent(this);\n }\n};\n","import ABViewGanttComponent from \"./viewComponent/ABViewGanttComponent\";\n\nconst ABViewGanttCore = require(\"../../core/views/ABViewGanttCore\");\n\nexport default class ABViewGantt extends ABViewGanttCore {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewGanttComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n } else {\n if (!this.settings.startDateFieldID) {\n this.warningsMessage(`doesn't have a start date field set.`);\n } else {\n let field = DC.datasource?.fieldByID(\n this.settings.startDateFieldID\n );\n if (!field) {\n this.warningsMessage(\n `can't lookup field: startDate[${this.settings.startDateFieldID}]`\n );\n }\n }\n }\n }\n}\n","const ABViewGridCore = require(\"../../core/views/ABViewGridCore\");\nimport ABViewGridComponent from \"./viewComponent/ABViewGridComponent\";\nimport ABViewGridFilter from \"./viewProperties/ABViewPropertyFilterData\";\nconst ABViewPropertyLinkPage =\n require(\"./viewProperties/ABViewPropertyLinkPage\").default;\n\nexport default class ABViewGrid extends ABViewGridCore {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // filter property\n this.filterHelper.fromSettings(this.settings.gridFilter);\n }\n\n propertyGroupByList(ids, groupBy) {\n let colNames = groupBy || [];\n if (typeof colNames == \"string\") {\n colNames = colNames.split(\",\");\n }\n\n let options = $$(ids.groupBy).getList().data.find({});\n\n $$(ids.groupByList).clearAll();\n colNames.forEach((colName) => {\n let opt = options.filter((o) => o.id == colName)[0];\n if (opt) {\n $$(ids.groupByList).add(opt);\n }\n });\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewGridComponent(this);\n }\n\n get filterHelper() {\n if (this.__filterHelper == null) {\n this.__filterHelper = new ABViewGridFilter(\n this.AB,\n `${this.id}_filterHelper`\n );\n }\n\n return this.__filterHelper;\n }\n\n get linkPageHelper() {\n if (this.__linkPageHelper == null)\n this.__linkPageHelper = new ABViewPropertyLinkPage();\n\n return this.__linkPageHelper;\n }\n\n warningsEval() {\n super.warningsEval();\n let origWS = this.warningsSilent;\n this.warningsSilent = true;\n let DC = this.datacollection;\n this.warningsSilent = origWS;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n }\n}\n","/*\n * ABViewGridPopupExport.js\n * Manage the Popup that allows you to export data into one of our supported\n * formats.\n */\n\nimport ClassUI from \"../../../ui/ClassUI\";\n\nexport default class ABWorkObjectPopupExport extends ClassUI {\n constructor(idBase) {\n idBase = idBase || \"abviewgridpopupExport\";\n\n super({\n popupExport: `${idBase}_popupExport`,\n list: `${idBase}_popupExport_list`,\n });\n\n this._currentObject = null;\n // {ABObject}\n // The ABObject of the data we will export. We can find out the fields\n // from the object.\n\n this._dataCollection = null;\n // {ABDatacCollection}\n // The ABDataCollection that contains the data we are going to export.\n\n this._grid = null;\n // {webix.grid}\n // the current webix.grid that contains the data we are going to export.\n\n this._filename = null;\n // {string}\n // the name of the desired output file.\n\n this._hiddenFields = [];\n // {array}\n // An array of ABField.columnName(s) that we are not wanting to export\n }\n\n ui() {\n var self = this;\n\n // webix UI definition:\n return {\n view: \"popup\",\n id: this.ids.popupExport,\n width: 160,\n height: 0, //150,\n select: false,\n hidden: true,\n body: {\n id: this.ids.list,\n view: \"list\",\n autoheight: true,\n data: [\n { name: \"CSV\", icon: \"file-excel-o\" },\n { name: \"Excel\", icon: \"file-excel-o\" },\n { name: \"PDF\", icon: \"file-pdf-o\" },\n { name: \"PNG\", icon: \"file-image-o\" },\n ],\n template:\n \"
    #name#
    \",\n on: {\n onItemClick: function (id /*, e, node */) {\n var component = this.getItem(id);\n self.export(component.name);\n },\n },\n },\n };\n }\n\n async init(AB) {\n if (AB) {\n this.AB = AB;\n }\n webix.ui(this.ui());\n $$(this.ids.popupExport).resize();\n }\n\n // internal business logic\n\n /**\n * @method dataCollectionLoad()\n * the current ABDataCollection we are working with.\n * @param {ABDataCollection} dc\n */\n dataCollectionLoad(dc) {\n this._dataCollection = dc;\n }\n\n /**\n * @method objectLoad()\n * The current ABObject we are working with.\n * @param {ABObject} object\n */\n objectLoad(object) {\n this._currentObject = object;\n }\n\n /**\n * @method setHiddenFields\n * Register Fields we don't want exported in our data.\n * @param {array} fields\n * An array of ABField.columnName(s) to exclude from our export.\n */\n setHiddenFields(fields = []) {\n this._hiddenFields = fields ?? [];\n }\n\n /**\n * @method setFilename()\n * Register the name of the file we want our data to export as.\n * @param {string} filename\n */\n setFilename(filename) {\n this._filename = filename;\n }\n\n /**\n * @method setGridComponent()\n * Register the webix.grid that currently stores the data we are\n * exporting.\n * @param {webix.grid} $grid\n */\n setGridComponent($grid) {\n this._grid = $grid;\n }\n\n /**\n * @function show()\n * Show this component.\n * @param {obj} $view\n * the webix.$view to hover the popup around.\n */\n show($view) {\n $$(this.ids.popupExport).show($view);\n }\n\n async export(name) {\n let fnExport;\n\n let columns = {};\n\n let dc = this._dataCollection;\n let _currentObject = this._currentObject;\n let _grid = this._grid;\n let _filename = this._filename;\n\n if (\n dc &&\n (!dc.settings.loadAll || dc.dataStatus == dc.dataStatusFlag.notInitial)\n ) {\n // Load all data\n await dc.reloadData(0, null);\n dc.settings.loadAll = true;\n }\n\n // client filter data\n // template of report\n if (_currentObject) {\n _currentObject.fields().forEach((f) => {\n // hidden fields\n if (this._hiddenFields.indexOf(f.columnName) > -1) return;\n\n columns[f.columnName] = {\n template: (rowData) => {\n return f.format(rowData);\n },\n };\n });\n }\n\n // If there are checked items, then export them only\n // Otherwise export all items\n const noCheckedRow =\n _grid.data.find({ appbuilder_select_item: 1 }).length < 1;\n const filterRow = (row) =>\n noCheckedRow || row?.appbuilder_select_item == 1;\n\n switch (name) {\n case \"CSV\":\n webix.csv.delimiter.cols = \",\";\n\n fnExport = webix.toCSV(_grid, {\n filename:\n _filename || (_currentObject ? _currentObject.label : null),\n columns: columns,\n filter: filterRow,\n });\n break;\n case \"Excel\":\n fnExport = webix.toExcel(_grid, {\n filename:\n _filename || (_currentObject ? _currentObject.label : null),\n name:\n _filename || (_currentObject ? _currentObject.label : null),\n columns: columns,\n filterHTML: true,\n filter: filterRow,\n });\n break;\n case \"PDF\":\n fnExport = webix.toPDF(_grid, {\n filename:\n _filename || (_currentObject ? _currentObject.label : null),\n filterHTML: true,\n filter: filterRow,\n });\n break;\n case \"PNG\":\n fnExport = webix.toPNG(_grid, {\n filename:\n _filename || (_currentObject ? _currentObject.label : null),\n // filter: NOT SUPPORT\n });\n break;\n }\n\n try {\n await fnExport;\n $$(this.ids.popupExport).hide();\n } catch (err) {\n this.AB.notify.developer(err, {\n message: `ABViewGridPopupExport:export(): System could not export: ${name}`,\n exportType: name,\n columns,\n fileName: _filename,\n });\n }\n }\n\n // this.dataCollectionLoad = _logic.dataCollectionLoad;\n // this.objectLoad = _logic.objectLoad;\n // this.setGridComponent = _logic.setGridComponent;\n // this.setFilename = _logic.setFilename;\n // this.setHiddenFields = _logic.setHiddenFields;\n // this.show = _logic.show;\n}\n","/*\n * ABViewGridPopupMassUpdate\n *\n * An ABViewGrid can offer a mass update feature. This is a ui component\n * to help with the processing of the update.\n *\n */\n\nimport ClassUI from \"../../../ui/ClassUI\";\nimport RowUpdater from \"../RowUpdater\";\n\nvar L = null;\n\nexport default class ABViewGridPopupMassUpdate extends ClassUI {\n //.extend(idBase, function(App) {\n\n constructor(ABViewGridComponent, idBase) {\n idBase = idBase || \"abviewgridpopupMassUpdate\";\n\n super({\n component: `${idBase}_popupMassUpdate`,\n submit: `${idBase}_submitMassUpdate`,\n });\n\n this.CurrentObject = null;\n // {ABObject}\n // Which ABObject are we currently working with.\n\n this.GridComponent = ABViewGridComponent;\n // {ABViewGridComponent}\n // The current ABViewGridComponent we are working with.\n\n this.AB = ABViewGridComponent.AB;\n // {ABFactory}\n\n this.rowUpdater = new RowUpdater(idBase, this.AB);\n // {RowUpdater}\n // An instance of our RowUpdater form builder.\n\n if (!L) {\n L = (...params) => {\n return this.AB.Multilingual.label(...params);\n };\n }\n }\n\n ui() {\n var ids = this.ids;\n\n // Our webix UI definition:\n return {\n view: \"popup\",\n id: ids.component,\n // modal: true,\n body: {\n width: 500,\n rows: [\n // Update panel\n this.rowUpdater.ui(),\n { height: 15 },\n {\n cols: [\n {},\n {\n view: \"button\",\n value: L(\"Cancel\"),\n width: 100,\n click: () => {\n this.hide();\n },\n },\n {\n id: ids.submit,\n css: \"webix_primary\",\n view: \"button\",\n label: L(\"Update\"),\n type: \"form\",\n width: 120,\n click: () => {\n this.submit();\n },\n },\n ],\n },\n ],\n },\n on: {\n onShow: () => {\n this.onShow();\n },\n },\n };\n }\n\n async init(AB) {\n webix.ui(this.ui());\n this.rowUpdater.init(AB);\n\n return Promise.resolve();\n }\n\n /**\n * @method hide()\n * Hide the popup.\n */\n hide() {\n $$(this.ids.component).hide();\n }\n\n /**\n * @function objectLoad\n * Ready the Popup according to the current object & datatable\n * @param {ABObject} object\n * the currently selected object.\n * @param {webix.datatable} dataTable\n * the dataTable we need to run the mass update on...trust me this\n * will be good\n */\n objectLoad(object, dataTable) {\n this.CurrentObject = object;\n this.rowUpdater.objectLoad(object);\n this.DataTable = dataTable;\n }\n\n onShow() {}\n\n /**\n * @method show()\n * Show this component.\n * @param {obj} $view\n * the webix.$view to hover the popup around.\n * @param {json} options\n * Additional webix options related to the .show() method.\n */\n show($view, options = null) {\n if (options != null) {\n $$(this.ids.component).show($view, options);\n } else {\n $$(this.ids.component).show($view);\n }\n }\n\n /**\n * @method submit()\n * Process the submit action by getting the values to change and then\n * running a batchUpdate() on the items in our datatable that were selected.\n */\n submit() {\n // Update values to records\n let update_button = $$(this.ids.submit),\n update_items = this.rowUpdater.getValue() || [];\n\n update_button.disable();\n\n if (!this.GridComponent) {\n // TODO : Message\n // console.log(\"no data collection to update\");\n update_button.enable();\n return;\n } else if (update_items.length < 1) {\n // TODO : Message\n update_button.enable();\n return;\n }\n\n let $datatable = this.GridComponent.getDataTable(); // $$(DataTable.ui.id);\n let updatedRowIds = [];\n $datatable.data.each(function (row) {\n if (\n row &&\n Object.prototype.hasOwnProperty.call(\n row,\n \"appbuilder_select_item\"\n ) &&\n row.appbuilder_select_item == 1\n ) {\n updatedRowIds.push(row.id);\n }\n });\n\n let vals = {};\n update_items.forEach((item) => {\n let fieldInfo = this.CurrentObject.fieldByID(item.fieldId);\n if (!fieldInfo) return;\n\n vals[fieldInfo.columnName] = item.value;\n });\n\n if (updatedRowIds.length > 0) {\n webix.confirm({\n title: L(\"Updating Multiple Records\"),\n text: L(\"Are you sure you want to update the selected records?\"),\n callback: (result) => {\n if (result) {\n if ($datatable && $datatable.showProgress)\n $datatable.showProgress({ type: \"icon\" });\n\n let objModel = this.CurrentObject.model();\n objModel\n .batchUpdate({\n rowIds: updatedRowIds,\n values: vals,\n })\n .then(() => {\n // Update webix.datatable\n (updatedRowIds ?? []).forEach((rowId) => {\n $datatable.updateItem(rowId, vals);\n });\n\n // Anything we need to do after we are done.\n update_button.enable();\n this.hide();\n\n if ($datatable && $datatable.hideProgress)\n $datatable.hideProgress();\n })\n .catch((err) => {\n this.AB.notify.developer(err, {\n context:\n \"ABViewGridPopupMassUpdate:submit(): Error during batchUpdate\",\n rowIds: updatedRowIds,\n values: vals,\n });\n });\n } else {\n update_button.enable();\n }\n },\n });\n } else {\n webix.alert({\n title: L(\"No Records Selected\"),\n text: L(\n \"You need to select at least one record...did you drink your coffee today?\"\n ),\n });\n update_button.enable();\n this.hide();\n }\n }\n}\n","/*\n * ABViewGridPopupSortFields\n *\n * Manage the Sort Fields popup.\n *\n */\n\nimport ClassUI from \"../../../ui/ClassUI\";\n\nvar L = null;\n\nexport default class AB_Work_Object_Workspace_PopupSortFields extends ClassUI {\n constructor(idBase) {\n idBase = idBase || \"abviewgridpopupSortFields\";\n\n super({\n component: `${idBase}_popupSort`,\n list: `${idBase}_popupSort_list`,\n form: `${idBase}_popupSort_form`,\n });\n\n this.CurrentObject = null;\n // {ABObject}\n // The current ABObject we are working with.\n\n this._blockOnChange = false;\n // {bool}\n // Should we skip the onChange handler processing at this time?\n\n this._settings = null;\n // {json}\n // default sort settings.\n\n if (!L) {\n L = (...params) => {\n return (this.AB ?? AB).Multilingual.label(...params);\n };\n }\n }\n\n uiForm() {\n const compId = this.ids.component;\n return {\n view: \"form\",\n id: this.ids.form,\n borderless: true,\n elements: [\n {\n view: \"button\",\n type: \"form\",\n css: \"webix_primary\",\n value: L(\"Add new sort\"),\n on: {\n onItemClick: (/* id, e, node */) => {\n this.clickAddNewSort();\n this.triggerOnChange();\n },\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `${compId} add sort button`\n );\n },\n },\n },\n ],\n };\n }\n\n ui() {\n return {\n view: \"popup\",\n id: this.ids.component,\n // autoheight:true,\n width: 600,\n body: this.uiForm(),\n on: {\n onShow: () => {\n this.onShow();\n },\n },\n };\n }\n\n // Our init() function for setting up our UI\n async init(AB) {\n if (AB) {\n this.AB = AB;\n }\n\n (this.AB.Webix ?? webix).ui(this.ui());\n }\n\n /**\n * @function clickAddNewSort\n * When the user clicks the \"Add New Sort\" button, this routine will\n * add another row to the sort form.\n * @param {string} fieldId\n * The ABField.id of the field to auto select in this new row.\n * @param {string} dir\n * The sort order to auto select in this new row.\n */\n // clickAddNewSort: function(by, dir, isMulti, id) {\n clickAddNewSort(fieldId, dir) {\n var self = this;\n var sort_form = $$(this.ids.form);\n\n var viewIndex = sort_form.getChildViews().length - 1;\n var listFields = this.getFieldList(true);\n sort_form.addView(\n {\n id: `sort_${viewIndex + 1}`,\n cols: [\n {\n view: \"combo\",\n width: 220,\n options: listFields,\n on: {\n onChange: function (columnId) {\n var el = this;\n self.onChangeCombo(columnId, el);\n },\n },\n },\n this._valueElement(),\n {\n view: \"button\",\n css: \"webix_danger\",\n icon: \"fa fa-trash\",\n type: \"icon\",\n width: 30,\n on: {\n onItemClick: function () {\n sort_form.removeView(this.getParentView());\n self.refreshFieldList(true);\n self.triggerOnChange();\n },\n },\n },\n ],\n },\n viewIndex\n );\n\n // Select field\n if (fieldId) {\n var fieldsCombo = sort_form\n .getChildViews()\n [viewIndex].getChildViews()[0];\n fieldsCombo.setValue(fieldId);\n }\n // select direction\n if (dir) {\n var dirElem = sort_form.getChildViews()[viewIndex].getChildViews()[1];\n dirElem.setValue?.(dir);\n\n // [ABFieldList] Sorting following order\n dirElem.sort?.((a, b) => {\n return (dir ?? \"\").indexOf(a.id ?? a) >\n (dir ?? \"\").indexOf(b.id ?? b)\n ? 1\n : -1;\n });\n }\n }\n\n /**\n * @function getFieldList\n * return field list so we can present a custom UI for view\n * @param {bool} excludeSelected\n * Should we ignore fields that already exist in the form?\n * @return {array} [ { id, value } ]\n * an array that is compatible with the webix.list\n * widget.\n */\n getFieldList(excludeSelected) {\n var sort_form = $$(this.ids.form),\n listFields = [];\n\n var allFields = this.CurrentObject.fields();\n if (!allFields || !allFields.length) return listFields;\n\n // Get all fields include hidden fields\n allFields.forEach((f) => {\n if (f.fieldIsSortable()) {\n listFields.push({\n id: f.id,\n value: f.label,\n });\n }\n });\n\n // Remove selected field\n if (excludeSelected) {\n var childViews = sort_form.getChildViews();\n if (childViews.length > 1) {\n // Ignore 'Add new sort' button\n childViews.forEach(function (cView, index) {\n if (childViews.length - 1 <= index) return false;\n\n var selectedValue = cView.getChildViews()[0].getValue();\n if (selectedValue) {\n listFields = listFields.filter((f) => f.id != selectedValue);\n }\n });\n }\n }\n return listFields;\n }\n\n /**\n * @function objectLoad\n * Ready the Popup according to the current object\n * @param {ABObject} object the currently selected object.\n */\n objectLoad(object) {\n this.CurrentObject = object;\n }\n\n /**\n * @method setSettings\n * Initialize the form with a set of conditions.\n * @param {Array} settings\n * The default settings for this form.\n * [\n * {\n * key: uuid, // ABField.id\n * dir: string, // 'asc' or 'desc'\n * }\n * ]\n */\n setSettings(settings) {\n this._settings = this.AB.cloneDeep(settings);\n }\n\n /**\n * @method getSettings\n * return the current sort settings stored by this form.\n * @return {Array} -\n * [\n * {\n * key: uuid, // ABField.id\n * dir: string, // 'asc' or 'desc'\n * }\n * ]\n */\n getSettings() {\n var sort_form = $$(this.ids.form),\n sortFields = [];\n\n var childViews = sort_form.getChildViews();\n if (childViews.length > 1) {\n // Ignore 'Add new sort' button\n childViews.forEach(function (cView, index) {\n if (childViews.length - 1 <= index) return false;\n\n var fieldId = cView.getChildViews()[0].getValue();\n const dirElem = cView.getChildViews()[1];\n var dir =\n dirElem?.getValue?.() ??\n dirElem?.data?.getRange?.()?.map((opt) => opt.id) ?? // Select list field type\n \"\";\n sortFields.push({\n key: fieldId,\n dir: dir,\n });\n });\n }\n return sortFields;\n }\n\n /**\n * @method onChangeCombo()\n * Update the display once they have chosen a field to sort by.\n * We now need to offer the appropriate sort direction chooser.\n * @param {string} fieldID\n * The value of the combo box now.\n * @param {webix.$view} el\n * The current Webix.$view that was the combo box that just\n * changed.\n */\n onChangeCombo(fieldID, el) {\n var allFields = this.CurrentObject.fields();\n var chosenField = null,\n sortDir = el.getParentView().getChildViews()[1],\n // isMultiLingual = el.getParentView().getChildViews()[2],\n // isMulti = 0,\n options = null;\n\n chosenField = allFields.find((f) => f.id == fieldID);\n if (!chosenField) return;\n\n switch (chosenField.key) {\n case \"date\":\n options = [\n { id: \"asc\", value: L(\"Before -> After\") },\n { id: \"desc\", value: L(\"After -> Before\") },\n ];\n break;\n case \"number\":\n options = [\n { id: \"asc\", value: L(\"1 -> 9\") },\n { id: \"desc\", value: L(\"9 -> 1\") },\n ];\n break;\n case \"string\":\n default:\n options = [\n { id: \"asc\", value: L(\"A -> Z\") },\n { id: \"desc\", value: L(\"Z -> A\") },\n ];\n break;\n }\n\n if (chosenField.key == \"list\") {\n AB.Webix.ui(this._valueListElement(chosenField), sortDir);\n } else {\n const valElem = this._valueElement();\n valElem.options = options;\n AB.Webix.ui(valElem, sortDir);\n }\n\n // if (columnConfig.settings.supportMultilingual)\n // isMulti = columnConfig.settings.supportMultilingual;\n\n // isMultiLingual.setValue(isMulti);\n\n this.refreshFieldList();\n this.triggerOnChange();\n }\n\n /**\n * @function onShow\n * Rebuild the form when an onShow() is called.\n */\n onShow(view, options) {\n var sort_form = $$(this.ids.form);\n\n // clear field options in the form\n webix.ui(this.uiForm(), sort_form);\n\n var sorts = this._settings;\n if (sorts && sorts.forEach) {\n sorts.forEach((s) => {\n this.clickAddNewSort(s.key, s.dir);\n });\n }\n\n if (sorts == null || sorts.length == 0) {\n this.clickAddNewSort();\n }\n\n const $popup = $$(this.ids.component);\n $popup?.blockEvent();\n $popup?.show(view, options);\n $popup?.unblockEvent();\n }\n\n /**\n * @method refreshFieldList\n * return an updated field list so you cannot duplicate a sort\n * @param {bool} ignoreRemoveViews\n *\n */\n refreshFieldList(ignoreRemoveViews) {\n var sort_form = $$(this.ids.form),\n listFields = this.getFieldList(false),\n selectedFields = [],\n removeChildViews = [];\n\n var childViews = sort_form.getChildViews();\n if (childViews.length > 1) {\n // Ignore 'Add new sort' button\n childViews.forEach(function (cView, index) {\n if (childViews.length - 1 <= index) return false;\n\n let fieldId = cView.getChildViews()[0].getValue(),\n // fieldObj = $.grep(listFields, function (f) { return f.id == fieldId });\n fieldObj = listFields.filter((f) => {\n return f.id == fieldId;\n });\n\n if (fieldObj.length > 0) {\n // Add selected field to list\n selectedFields.push(fieldObj[0]);\n } else {\n // Add condition to remove\n removeChildViews.push(cView);\n }\n });\n }\n\n // Remove filter conditions when column is deleted\n if (!ignoreRemoveViews) {\n removeChildViews.forEach((cView /*, index */) => {\n sort_form.removeView(cView);\n });\n }\n\n // Field list should not duplicate field items\n childViews = sort_form.getChildViews();\n if (childViews.length > 1) {\n // Ignore 'Add new sort' button\n childViews.forEach((cView, index) => {\n if (childViews.length - 1 <= index) return false;\n\n let fieldId = cView.getChildViews()[0].getValue(),\n // fieldObj = $.grep(listFields, function (f) { return f.id == fieldId }),\n fieldObj = listFields.filter((f) => {\n return f.id == fieldId;\n });\n\n // var selectedFieldsExcludeCurField = $(selectedFields).not(fieldObj);\n var selectedFieldsExcludeCurField = selectedFields.filter((x) => {\n if (Array.isArray(fieldObj) && fieldObj.indexOf(x) !== -1) {\n return false;\n }\n return true;\n });\n\n // var enableFields = $(listFields).not(selectedFieldsExcludeCurField).get();\n var enableFields = listFields.filter((x) => {\n if (\n Array.isArray(selectedFieldsExcludeCurField) &&\n selectedFieldsExcludeCurField.indexOf(x) !== -1\n ) {\n return false;\n }\n return true;\n });\n\n // Update field list\n cView.getChildViews()[0].define(\"options\", enableFields);\n cView.getChildViews()[0].refresh();\n });\n }\n }\n\n /**\n * @function triggerOnChange\n * This parses the sort form to build in order the sorts then saves to the application object workspace\n */\n triggerOnChange() {\n // block .onChange callback\n if (this._blockOnChange) return;\n\n this._settings = this.getSettings();\n\n this.emit(\"changed\", this._settings);\n }\n\n blockOnChange() {\n this._blockOnChange = true;\n }\n\n unblockOnChange() {\n this._blockOnChange = false;\n }\n\n /**\n * @function show()\n * Show this component.\n * @param {obj} $view\n * the webix.$view to hover the popup around.\n * @param {uuid} fieldId\n * the ABField.id we want to prefill the sort with\n * @param {json} options\n * Additional webix.show() options parameters.\n */\n show($view, fieldId, options) {\n this.blockOnChange();\n\n this.onShow($view, options || null);\n\n if (fieldId) {\n this.clickAddNewSort(fieldId);\n }\n\n this.unblockOnChange();\n }\n\n /**\n * @function sort()\n * client sort data in list\n *\n * @param {Object} a\n * @param {Object} b\n */\n sort(a, b) {\n let result = 0;\n\n const childViews = $$(this.ids.form).getChildViews();\n if (childViews.length > 1) {\n // Ignore 'Add new sort' button\n childViews.forEach((cView, index) => {\n if (childViews.length - 1 <= index || result != 0) return;\n\n const fieldId = cView.getChildViews()[0].getValue();\n const dirElem = cView.getChildViews()[1];\n const dir =\n dirElem?.getValue?.() ??\n dirElem?.data?.getRange?.()?.map((opt) => opt.id) ?? // Select list field type\n \"\";\n\n const field = this.CurrentObject.fieldByID(fieldId);\n if (!field) return;\n\n const by = field.columnName; // column name\n\n let aValue = a[by],\n bValue = b[by];\n\n if (field.key == \"list\") {\n aValue = dir.indexOf(aValue);\n bValue = dir.indexOf(bValue);\n }\n\n if (Array.isArray(aValue)) {\n aValue = (aValue || [])\n .map((item) => item.text || item)\n .join(\" \");\n }\n\n if (Array.isArray(bValue)) {\n bValue = (bValue ?? [])\n .map((item) => item.text || item)\n .join(\" \");\n }\n\n if (aValue != bValue) {\n if (dir == \"asc\" || field.key == \"list\") {\n result = aValue > bValue ? 1 : -1;\n } else {\n result = aValue < bValue ? 1 : -1;\n }\n }\n });\n }\n\n return result;\n }\n\n _valueElement() {\n return {\n view: \"segmented\",\n width: 200,\n options: [\n {\n id: \"\",\n value: L(\"Please select field\"),\n },\n ],\n on: {\n onChange: (/* newv, oldv */) => {\n // 'asc' or 'desc' values\n this.triggerOnChange();\n },\n },\n };\n }\n\n _valueListElement(field) {\n return {\n view: \"list\",\n template: \"
    #text#\",\n type: {\n height: 35,\n },\n height: 150,\n select: true,\n drag: \"order\",\n data: field.options(),\n on: {\n onChange: () => {\n this.triggerOnChange();\n },\n onAfterDrop: () => {\n this.triggerOnChange();\n },\n },\n };\n }\n}\n","const ABViewImageCore = require(\"../../core/views/ABViewImageCore\");\nconst ABViewImageComponent = require(\"./viewComponent/ABViewImageComponent\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewImage extends ABViewImageCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n //\n //\tEditor Related\n //\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewImageComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n if (!this.settings.filename) {\n this.warningsMessage(`has no image set`);\n }\n }\n};\n","const ABViewKanbanCore = require(\"../../core/views/ABViewKanbanCore\");\nconst ABViewKanbanComponent = require(\"./viewComponent/ABViewKanbanComponent\");\n\nconst ABViewPropertyLinkPage =\n require(\"./viewProperties/ABViewPropertyLinkPage\").default;\n\nexport default class ABViewKanban extends ABViewKanbanCore {\n //\n //\tEditor Related\n //\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n\n component() {\n return new ABViewKanbanComponent(this);\n }\n\n get linkPageHelper() {\n return (this.__linkPageHelper =\n this.__linkPageHelper || new ABViewPropertyLinkPage());\n }\n\n warningsEval() {\n super.warningsEval();\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n }\n}\n","/*\n * ABViewKanbanFormSidePanel\n *\n * Provide a form area for editing data in the Kan Ban view.\n *\n */\n\nconst ABViewComponent = require(\"./viewComponent/ABViewComponent\").default;\nconst ABViewForm = require(\"./ABViewForm\");\nconst ABViewFormButton = require(\"./ABViewFormButton\");\n\nvar L = null;\n// multilingual Label fn()\n\nmodule.exports = class ABWorkObjectKanBan extends ABViewComponent {\n constructor(comKanBan, idBase, editFields) {\n idBase = idBase || `${comKanBan.view?.id}_formSidePanel`;\n super(idBase, {\n form: \"\",\n });\n\n if (!L) {\n L = (...params) => {\n return this.AB.Multilingual.label(...params);\n };\n }\n\n this.AB = comKanBan.AB;\n\n this.CurrentObjectID = null;\n // {string}\n // the ABObject.id of the object we are working with.\n\n this.editFields = editFields;\n // {array}\n // An array of {ABField.id} that determines which fields should show up\n // in the editor.\n\n this._mockApp = this.AB.applicationNew({});\n // {ABApplication}\n // Any ABViews we create are expected to be in relation to\n // an ABApplication, so we create a \"mock\" app for our\n // workspace views to use to display.\n }\n\n /**\n * @method CurrentObject()\n * A helper to return the current ABObject we are working with.\n * @return {ABObject}\n */\n get CurrentObject() {\n return this.AB.objectByID(this.CurrentObjectID);\n }\n\n ui() {\n var ids = this.ids;\n\n // Our webix UI definition:\n return {\n id: ids.component,\n width: 300,\n hidden: true,\n rows: [\n {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n view: \"label\",\n label: L(\"Edit Record\"),\n },\n {\n view: \"icon\",\n icon: \"wxi-close\",\n align: \"right\",\n click: (/* id */) => {\n this.hide();\n },\n },\n ],\n },\n {\n view: \"scrollview\",\n body: {\n rows: [\n {\n id: ids.form,\n view: \"form\",\n borderless: true,\n rows: [],\n },\n ],\n },\n },\n ],\n };\n }\n\n async init(AB) {\n this.AB = AB;\n }\n\n objectLoad(object) {\n this.CurrentObjectID = object.id;\n }\n\n hide() {\n $$(this.ids.component)?.hide();\n\n this.emit(\"close\");\n }\n\n show(data) {\n $$(this.ids.component)?.show();\n\n this.refreshForm(data);\n }\n\n isVisible() {\n return $$(this.ids.component)?.isVisible() ?? false;\n }\n\n refreshForm(data) {\n var ids = this.ids;\n let $formView = $$(ids.form);\n let CurrentObject = this.CurrentObject;\n\n if (!CurrentObject || !$formView) return;\n\n data = data || {};\n\n let formAttrs = {\n id: `${this.ids.component}_sideform`,\n key: ABViewForm.common().key,\n settings: {\n columns: 1,\n labelPosition: \"top\",\n showLabel: 1,\n clearOnLoad: 0,\n clearOnSave: 0,\n labelWidth: 120,\n height: 0,\n },\n };\n\n // let form = new ABViewForm(formAttrs, this._mockApp);\n let form = this.AB.viewNewDetatched(formAttrs);\n\n form.objectLoad(CurrentObject);\n\n // Populate child elements\n CurrentObject.fields().forEach((f, index) => {\n // if this is one of our .editFields\n if (!this.editFields || this.editFields.indexOf(f.id) > -1) {\n form.addFieldToForm(f, index);\n }\n });\n\n // add default button (Save button)\n form._views.push(\n new ABViewFormButton(\n {\n settings: {\n includeSave: true,\n includeCancel: false,\n includeReset: false,\n },\n position: {\n y: CurrentObject.fields().length, // yPosition\n },\n },\n this._mockApp,\n form\n )\n );\n\n // add temp id to views\n form._views.forEach(\n (v, index) => (v.id = `${form.id}_${v.key}_${index}`)\n );\n\n let formCom = form.component(this.AB._App);\n\n // Rebuild form\n webix.ui(formCom.ui().rows.concat({}), $formView);\n webix.extend($formView, webix.ProgressBar);\n\n formCom.init(\n this.AB,\n 2,\n {\n onBeforeSaveData: () => {\n // get update data\n var formVals = form.getFormValues($formView, CurrentObject);\n\n // validate data\n if (!form.validateData($formView, CurrentObject, formVals))\n return false;\n\n // show progress icon\n $formView?.showProgress({ type: \"icon\" });\n\n if (formVals.id) {\n CurrentObject.model()\n .update(formVals.id, formVals)\n .then((updateVals) => {\n this.emit(\"update\", updateVals);\n // _logic.callbacks.onUpdateData(updateVals);\n\n $formView?.hideProgress({ type: \"icon\" });\n })\n .catch((err) => {\n // TODO : error message\n this.AB.notify.developer(err, {\n context:\n \"ABViewKanbanFormSidePanel:onBeforeSaveData():update(): Error updating value\",\n formVals,\n });\n $formView?.hideProgress({ type: \"icon\" });\n });\n }\n // else add new row\n else {\n CurrentObject.model()\n .create(formVals)\n .then((newVals) => {\n // _logic.callbacks.onAddData(newVals);\n this.emit(\"add\", newVals);\n\n $formView?.hideProgress({ type: \"icon\" });\n })\n .catch((err) => {\n // TODO : error message\n this.AB.notify.developer(err, {\n context:\n \"ABViewKanbanFormSidePanel:onBeforeSaveData():.create(): Error creating value\",\n formVals,\n });\n\n $formView?.hideProgress({ type: \"icon\" });\n });\n }\n\n return false;\n },\n },\n 2 /* NOTE: if you can see this KanBan, you should be able to see the side form? */\n );\n\n // display data\n $formView.clear();\n $formView.parse(data);\n\n formCom.onShow(data);\n }\n};\n","const ABViewLabelCore = require(\"../../core/views/ABViewLabelCore\");\nconst ABViewLabelComponent = require(\"./viewComponent/ABViewLabelComponent\");\n\nmodule.exports = class ABViewLabel extends ABViewLabelCore {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewLabelComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n if (!this.text) {\n this.warningsMessage(\"has no text value set.\");\n }\n }\n};\n","const ABViewLayoutCore = require(\"../../core/views/ABViewLayoutCore\");\nconst ABViewLayoutComponent = require(\"./viewComponent/ABViewLayoutComponent\");\n\nmodule.exports = class ABViewLayout extends ABViewLayoutCore {\n /**\n * @function component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewLayoutComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n if (this._views.length == 0) {\n this.warningsMessage(\"has no columns set.\");\n }\n }\n};\n","const ABViewListCore = require(\"../../core/views/ABViewListCore\");\nconst ABViewListComponent = require(\"./viewComponent/ABViewListComponent\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewList extends ABViewListCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewListComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n }\n};\n","const ABViewMenuCore = require(\"../../core/views/ABViewMenuCore\");\nconst ABViewMenuComponent = require(\"./viewComponent/ABViewMenuComponent\");\n\nmodule.exports = class ABViewMenu extends ABViewMenuCore {\n /**\n * @function component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewMenuComponent(this);\n }\n};\n","const ABViewPDFImporterCore = require(\"../../core/views/ABViewPDFImporterCore\");\nconst ABViewPDFImporterComponent = require(\"./viewComponent/ABViewPDFImporterComponent\");\n\nmodule.exports = class ABViewPDFImporter extends ABViewPDFImporterCore {\n /**\n * @function component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewPDFImporterComponent(this);\n }\n};\n","const ABViewPageCore = require(\"../../core/views/ABViewPageCore\");\n\nconst ABPropertyComponentDefaults = ABViewPageCore.defaultValues();\n\nmodule.exports = class ABViewPage extends ABViewPageCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @function component()\n * return a UI component based upon this view.\n * @param {obj} v1App\n * @return {obj} UI component\n */\n component(v1App = false) {\n var component = super.component();\n\n component._ui = component.ui();\n\n // wrap our ABViewContainer in our Page scrollview\n component.ui = () => {\n return {\n view: \"scrollview\",\n borderless: true,\n css:\n this.settings.pageBackground ||\n ABPropertyComponentDefaults.pageBackground,\n body: component._ui,\n };\n };\n\n // if this is our v1Interface\n if (v1App) {\n var newComponent = component;\n component = {\n ui: component.ui(),\n init: (options, accessLevel) => {\n accessLevel = accessLevel ?? this.getUserAccess();\n return newComponent.init(this.AB, accessLevel, options);\n },\n onShow: (...params) => {\n return newComponent.onShow?.(...params);\n },\n };\n }\n\n return component;\n }\n\n warningsEval() {\n super.warningsEval();\n\n let allViews = this.views();\n\n if (allViews.length == 0) {\n this.warningsMessage(\"has no sub views\");\n }\n\n (this.pages() || []).forEach((p) => {\n p.warningsEval();\n });\n }\n};\n","const ABViewPivotCore = require(\"../../core/views/ABViewPivotCore\");\nconst ABViewPivotComponent = require(\"./viewComponent/ABViewPivotComponent\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewPivot extends ABViewPivotCore {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewPivotComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n }\n};\n","const ABViewReportsManagerCore = require(\"../../core/views/ABViewReportsManagerCore\");\nconst ABViewReportsManagerComponent = require(\"./viewComponent/ABViewReportsManagerComponent\");\n\nmodule.exports = class ABViewReportsManager extends ABViewReportsManagerCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n //\n //\tEditor Related\n //\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewReportsManagerComponent(this);\n }\n};\n","const ABViewSchedulerCore = require(\"../../core/views/ABViewSchedulerCore\");\nconst ABViewSchedulerComponent = require(\"./viewComponent/ABViewSchedulerComponent\");\n\nmodule.exports = class ABViewScheduler extends ABViewSchedulerCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewSchedulerComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n }\n};\n","const ABViewTabCore = require(\"../../core/views/ABViewTabCore\");\n\nconst ABViewTabComponent = require(\"./viewComponent/ABViewTabComponent\");\n\nmodule.exports = class ABViewTab extends ABViewTabCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj} App\n * @return {obj} UI component\n */\n component(v1App = false) {\n let component = new ABViewTabComponent(this);\n\n // if this is our v1Interface\n if (v1App) {\n const newComponent = component;\n\n component = {\n ui: newComponent.ui(),\n init: (options, accessLevel) => {\n return newComponent.init(this.AB);\n },\n onShow: (...params) => {\n return newComponent.onShow?.(...params);\n },\n };\n }\n\n return component;\n }\n\n warningsEval() {\n super.warningsEval();\n\n let allViews = this.views();\n\n if (allViews.length == 0) {\n this.warningsMessage(\"has no tabs set\");\n }\n\n // NOTE: this is done in ABView:\n // (this.views() || []).forEach((v) => {\n // v.warningsEval();\n // });\n }\n};\n","const ABViewTextCore = require(\"../../core/views/ABViewTextCore\");\n\nconst ABViewTextComponent = require(\"./viewComponent/ABViewTextComponent\");\n\nmodule.exports = class ABViewText extends ABViewTextCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component(parentId) {\n return new ABViewTextComponent(this, parentId);\n }\n};\n","const ABViewWidgetCore = require(\"../../core/views/ABViewWidgetCore\");\n\nconst ABPropertyComponentDefaults = ABViewWidgetCore.defaultValues();\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewWidget extends ABViewWidgetCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @function component()\n * return a UI component based upon this view.\n * @param {obj} App\n * @return {obj} UI component\n */\n component(App) {\n let base = super.component(App);\n\n base.onShow = (viewId) => {\n let dv = this.datacollection; // get from a function or a (get) property\n if (dv && dv.dataStatus == dv.dataStatusFlag.notInitial) {\n // load data when a widget is showing\n dv.loadData();\n }\n };\n\n return base;\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewCSVExporterComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABCSVExporter_${baseView.id}`,\n Object.assign(\n {\n button: \"\",\n buttonFilter: \"\",\n filterComplex: \"\",\n },\n ids\n )\n );\n\n this.clientFilter = null;\n }\n\n ui() {\n const ids = this.ids;\n const settings = this.settings;\n const defaultSettings = this.view.constructor.defaultValues();\n const _ui = super.ui([\n {\n view: \"layout\",\n type: \"clean\",\n borderless: true,\n cols: [\n {\n id: ids.buttonFilter,\n view: \"button\",\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"fa fa-filter\",\n borderless: true,\n width: 50,\n label: \"\",\n click: () => {\n this.showFilterPopup();\n },\n },\n {\n id: ids.button,\n view: \"button\",\n css: \"webix_primary\",\n type: \"icon\",\n icon: \"fa fa-download\",\n borderless: true,\n width: settings.width || defaultSettings.width,\n label: settings.buttonLabel ?? defaultSettings.buttonLabel,\n click: () => {\n this.downloadCsvFile();\n },\n },\n { fillspace: true },\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n if (!this.clientFilter) {\n const clientFilter = AB.filterComplexNew(this.ids.filterComplex);\n\n const dc = this.datacollection;\n\n if (dc) {\n const obj = dc.datasource;\n\n clientFilter.fieldsLoad(obj?.fields?.() ?? []);\n }\n\n clientFilter.init();\n clientFilter.on(\"change\", (val) => {\n this.onFilterChange(val);\n });\n\n this.clientFilter = clientFilter;\n }\n }\n\n downloadCsvFile() {\n let url = `/appbuilder/csv-export/${this.view.id}`;\n\n const where = {\n glue: \"and\",\n rules: [],\n };\n\n const whereWidget = this.view.settings?.where;\n if ((whereWidget?.rules ?? []).length) {\n where.rules.push(whereWidget);\n }\n\n const whereClient = this.clientFilter.getValue();\n if ((whereClient?.rules ?? []).length) {\n where.rules.push(whereClient);\n }\n\n if ((where?.rules || []).length) {\n let qsWhere = JSON.stringify(where);\n\n qsWhere = encodeURIComponent(qsWhere);\n url = `${url}?where=${qsWhere}`;\n }\n\n window.open(url);\n }\n\n showFilterPopup() {\n const $buttonFilter = $$(this.ids.buttonFilter);\n\n this.clientFilter.popUp($buttonFilter ? $buttonFilter.$view : null);\n }\n\n onFilterChange() {\n const $buttonFilter = $$(this.ids.buttonFilter);\n\n if (!$buttonFilter) return;\n\n const where = this.clientFilter.getValue();\n\n $buttonFilter.define(\"badge\", (where.rules || []).length || null);\n $buttonFilter.refresh();\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\nconst CSVImporter = require(\"../../CSVImporter\");\n\nmodule.exports = class ABViewCSVImporterComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABCSVImporter_${baseView.id}`,\n Object.assign(\n {\n button: \"\",\n popup: \"\",\n\n form: \"\",\n uploader: \"\",\n uploadFileList: \"\",\n separatedBy: \"\",\n headerOnFirstLine: \"\",\n columnList: \"\",\n\n search: \"\",\n datatable: \"\",\n\n statusMessage: \"\",\n progressBar: \"\",\n\n linkedDataButton: \"\",\n importButton: \"\",\n rules: \"\",\n },\n ids\n )\n );\n\n this.csvImporter = new CSVImporter((...args) => this.label(...args));\n // {CSVImporter}\n // An instance of the object that imports the CSV data.\n\n this.validationError = false;\n\n this._dataRows = null;\n this._csvFileInfo = null;\n }\n\n ui() {\n const settings = this.settings;\n const defaultSettings = this.view.constructor.defaultValues();\n const _ui = super.ui([\n {\n cols: [\n {\n view: \"button\",\n css: \"webix_primary\",\n type: \"icon\",\n icon: \"fa fa-upload\",\n label: this.label(\n settings.buttonLabel || defaultSettings.buttonLabel\n ),\n width: settings.width || defaultSettings.width,\n click: () => {\n this.showPopup();\n },\n },\n {\n fillspace: true,\n },\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n uiConfig() {\n const ids = this.ids;\n\n return {\n id: ids.form,\n view: \"form\",\n type: \"clean\",\n borderless: true,\n minWidth: 400,\n gravity: 1,\n elements: [\n {\n rows: [\n {\n id: ids.uploader,\n view: \"uploader\",\n name: \"csvFile\",\n css: \"webix_primary\",\n value: this.label(\"Choose a CSV file\"),\n accept: \"text/csv\",\n multiple: false,\n autosend: false,\n link: ids.uploadFileList,\n on: {\n onBeforeFileAdd: (fileInfo) => {\n this._csvFileInfo = fileInfo;\n\n return this.loadCsvFile();\n },\n },\n },\n {\n id: ids.uploadFileList,\n name: \"uploadedFile\",\n view: \"list\",\n type: \"uploader\",\n autoheight: true,\n borderless: true,\n onClick: {\n webix_remove_upload: (e, id /*, trg */) => {\n this.removeCsvFile(id);\n },\n },\n },\n {\n padding: 10,\n rows: [\n {\n id: ids.separatedBy,\n view: \"richselect\",\n name: \"separatedBy\",\n label: this.label(\"Separated by\"),\n labelWidth: 140,\n options: this.csvImporter.getSeparateItems(),\n value: \",\",\n on: {\n onChange: () => {\n this.loadCsvFile();\n },\n },\n },\n {\n id: ids.headerOnFirstLine,\n view: \"checkbox\",\n name: \"headerOnFirstLine\",\n label: this.label(\"Header on first line\"),\n labelWidth: 140,\n disabled: true,\n value: true,\n on: {\n onChange: (/*newVal, oldVal*/) => {\n this.populateColumnList();\n },\n },\n },\n ],\n },\n {\n type: \"space\",\n rows: [\n {\n view: \"scrollview\",\n minHeight: 300,\n body: {\n padding: 10,\n id: ids.columnList,\n rows: [],\n },\n },\n ],\n },\n ],\n },\n ],\n };\n }\n\n uiRecordsView() {\n const ids = this.ids;\n\n return {\n gravity: 2,\n rows: [\n {\n view: \"toolbar\",\n css: \"bg_gray\",\n cols: [\n { width: 5 },\n {\n id: ids.search,\n view: \"search\",\n value: \"\",\n label: \"\",\n placeholder: this.label(\"Search records...\"),\n keyPressTimeout: 200,\n on: {\n onTimedKeyPress: () => {\n this.search($$(ids.search).getValue());\n },\n },\n },\n { width: 2 },\n ],\n },\n {\n id: ids.datatable,\n view: \"datatable\",\n resizeColumn: true,\n editable: true,\n editaction: \"dblclick\",\n css: \"ab-csv-importer\",\n borderless: false,\n tooltip: (obj) => {\n const tooltip = obj._errorMsg\n ? obj._errorMsg\n : \"No validation errors\";\n return tooltip;\n },\n minWidth: 650,\n columns: [],\n on: {\n onValidationError: (id, obj, details) => {\n // console.log(`item ${id} invalid`);\n let errors = \"\";\n\n Object.keys(details).forEach((key) => {\n this.$view.complexValidations[key].forEach((err) => {\n errors += err.invalidMessage + \"
    \";\n });\n });\n\n const $dt = $$(ids.datatable);\n\n $dt.blockEvent();\n $dt.updateItem(id, {\n _status: \"invalid\",\n _errorMsg: errors,\n });\n $dt.unblockEvent();\n\n this.validationError = true;\n },\n onValidationSuccess: (id, obj, details) => {\n // console.log(`item ${id} valid`);\n const $dt = $$(ids.datatable);\n\n $dt.blockEvent();\n $dt.updateItem(id, {\n _status: \"valid\",\n _errorMsg: \"\",\n });\n $dt.unblockEvent();\n this.validationError = false;\n },\n onCheck: () => {\n const selected = $$(ids.datatable).find({\n _included: true,\n });\n const $importButton = $$(ids.importButton);\n\n $importButton.setValue(this.labelImport(selected));\n\n if (this.overLimitAlert(selected)) $importButton.disable();\n else $importButton.enable();\n },\n },\n },\n {\n id: ids.progressBar,\n height: 6,\n },\n {\n cols: [\n {\n id: ids.linkedDataButton,\n view: \"button\",\n label: this.label(\"Linked Data\"),\n type: \"icon\",\n icon: \"fa fa-info\",\n maxWidth: 180,\n click: () => {\n this.showLinkedData();\n },\n },\n {\n view: \"button\",\n name: \"import\",\n id: ids.importButton,\n label: this.label(\"Import\"),\n css: \"webix_primary\",\n disabled: true,\n type: \"icon\",\n icon: \"fa fa-upload\",\n click: () => {\n this.import();\n },\n },\n ],\n },\n ],\n };\n }\n\n uiPopup() {\n const ids = this.ids;\n\n return {\n id: ids.popup,\n view: \"window\",\n hidden: true,\n position: \"center\",\n modal: true,\n resize: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {},\n {\n view: \"label\",\n label: this.label(\"CSV Importer\"),\n autowidth: true,\n },\n {},\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n this.hide();\n },\n },\n ],\n },\n body: {\n type: \"form\",\n rows: [\n {\n type: \"line\",\n cols: [\n this.uiConfig(),\n { width: 20 },\n this.uiRecordsView(),\n { width: 1 },\n ],\n },\n {\n id: ids.statusMessage,\n view: \"label\",\n align: \"right\",\n hidden: true,\n },\n {\n hidden: true,\n margin: 5,\n cols: [\n { fillspace: true },\n {\n view: \"button\",\n name: \"cancel\",\n value: this.label(\"Cancel\"),\n css: \"ab-cancel-button\",\n autowidth: true,\n click: () => {\n this.hide();\n },\n },\n /*,\n {\n view: \"button\",\n name: \"import\",\n id: ids.importButton,\n value: labels.component.import,\n css: \"webix_primary\",\n disabled: true,\n autowidth: true,\n type: \"form\",\n click: () => {\n _logic.import();\n }\n }*/\n ],\n },\n ],\n },\n };\n }\n\n async init(AB) {\n await super.init(AB);\n\n const ids = this.ids;\n\n // Populate values to rules\n\n const dc = this.datacollection;\n\n if (dc) this.objectLoad(dc.datasource);\n\n const abWebix = AB.Webix;\n\n abWebix.ui(this.uiPopup());\n\n const $form = $$(ids.form);\n\n if ($form) abWebix.extend($form, abWebix.ProgressBar);\n\n const $progressBar = $$(ids.progressBar);\n\n if ($progressBar) abWebix.extend($progressBar, abWebix.ProgressBar);\n }\n\n showPopup() {\n const ids = this.ids;\n\n $$(ids.popup)?.show();\n\n this.formClear();\n\n // open file dialog to upload\n $$(ids.uploader).fileDialog();\n }\n\n hide() {\n $$(this.ids.popup)?.hide();\n }\n\n formClear() {\n const ids = this.ids;\n\n this._dataRows = null;\n this._csvFileInfo = null;\n\n const $form = $$(ids.form);\n\n $form.clearValidation();\n $form.clear();\n\n $$(ids.separatedBy).setValue(\",\");\n\n this.AB.Webix.ui([], $$(ids.columnList));\n\n $$(ids.headerOnFirstLine).disable();\n $$(ids.importButton).disable();\n\n $$(ids.search).setValue(\"\");\n $$(ids.uploadFileList).clearAll();\n $$(ids.datatable).clearAll();\n\n const $statusMessage = $$(ids.statusMessage);\n\n $statusMessage.setValue(\"\");\n $statusMessage.hide();\n }\n\n search(searchText) {\n const $datatable = $$(this.ids.datatable);\n\n if (!$datatable) return;\n\n searchText = (searchText || \"\").toLowerCase();\n\n const matchFields = this.getMatchFields();\n\n $datatable.filter((row) => {\n let exists = false;\n\n (matchFields || []).forEach((f) => {\n if (exists) return;\n\n exists =\n (row[`${f.columnIndex}`] || \"\")\n .toString()\n .toLowerCase()\n .indexOf(searchText) > -1;\n });\n\n return exists;\n });\n }\n\n statusTemplate(item) {\n let template = \"\";\n\n if (!item) return template;\n\n switch (item._status) {\n case \"in-progress\":\n template = \"\";\n break;\n case \"invalid\":\n template = \"\";\n break;\n case \"valid\":\n template = \"\";\n break;\n case \"done\":\n template = \"\";\n break;\n case \"fail\":\n template = \"\";\n break;\n }\n\n return template;\n }\n\n async loadCsvFile() {\n const _csvFileInfo = this._csvFileInfo;\n\n if (!_csvFileInfo) return false;\n\n const csvImporter = this.csvImporter;\n\n if (!csvImporter.validateFile(_csvFileInfo)) {\n this.AB.Webix.alert({\n title: this.label(\"This file extension is not allowed\"),\n text: this.label(\"Please only upload CSV files\"),\n ok: this.label(\"Ok\"),\n });\n\n return false;\n }\n\n const ids = this.ids;\n\n // show loading cursor\n const $form = $$(ids.form);\n\n $form?.showProgress?.({ type: \"icon\" });\n\n // read CSV file\n const $headerOnFirstLine = $$(ids.headerOnFirstLine);\n const $importButton = $$(ids.importButton);\n\n $headerOnFirstLine.enable();\n $importButton.enable();\n\n this._dataRows = await csvImporter.getDataRows(\n _csvFileInfo,\n $$(ids.separatedBy).getValue()\n );\n\n const _dataRows = this._dataRows;\n\n let length = _dataRows.length;\n\n if ($headerOnFirstLine.getValue()) length = _dataRows.length - 1;\n\n $importButton.setValue(this.labelImport(length));\n this.populateColumnList();\n $form?.hideProgress?.();\n\n return true;\n }\n\n removeCsvFile(fileId) {\n $$(this.ids.uploadFileList).remove(fileId);\n this.formClear();\n\n return true;\n }\n\n populateColumnList() {\n const self = this;\n const ids = this.ids;\n const abWebix = this.AB.Webix;\n\n // clear list\n const $columnList = $$(ids.columnList);\n\n abWebix.ui([], $columnList);\n\n const _dataRows = this._dataRows;\n\n if (!_dataRows) return;\n\n // check first line of CSV\n const firstLine = _dataRows[0];\n\n if (!firstLine) return;\n\n const csvColumnList = [];\n const fieldList = [];\n const currentObject = this.CurrentObject;\n\n if (currentObject)\n fieldList.push(\n ...currentObject.fields((f) => {\n // available fields\n if (\n this.settings.availableFieldIds?.length &&\n this.settings.availableFieldIds.indexOf(f.id) < 0\n ) {\n return false;\n }\n\n // filter editable fields\n const formComp = f.formComponent();\n\n if (!formComp) return true;\n\n const formConfig = formComp.common();\n\n if (!formConfig) return true;\n\n return formConfig.key != \"fieldreadonly\";\n })\n );\n\n const csvImporter = this.csvImporter;\n\n // check first line be header columns\n if ($$(ids.headerOnFirstLine).getValue())\n csvColumnList.push(\n ...firstLine.map((colName, index) => {\n return {\n id: index + 1, // webix .options list disallow value 0\n value: colName,\n key: csvImporter.getGuessDataType(_dataRows, index),\n };\n })\n );\n else\n firstLine.forEach((e, i) => {\n csvColumnList.push({\n id: i + 1, // webix .options list disallow value 0\n value: this.label(\"Column {0}\", [i + 1]),\n key: csvImporter.getGuessDataType(_dataRows, i),\n });\n });\n\n // Add unselect item\n csvColumnList.unshift({\n id: \"none\",\n value: this.label(\"None\"),\n });\n\n // populate columns to UI\n const uiColumns = [];\n const selectedCsvCols = [];\n\n fieldList.forEach((f) => {\n // match up by data type\n const matchCol = csvColumnList.filter(\n (c) => c.key == f.key && selectedCsvCols.indexOf(c.id) < 0\n )[0];\n\n let selectVal = \"none\";\n\n if (matchCol) {\n selectVal = matchCol.id;\n\n // cache\n selectedCsvCols.push(selectVal);\n }\n\n let columnOptUI = {\n view: \"richselect\",\n gravity: 2,\n options: csvColumnList,\n fieldId: f.id,\n abName: \"columnIndex\",\n value: selectVal,\n on: {\n onChange: function () {\n self.toggleLinkFields(this);\n self.loadDataToGrid();\n },\n },\n };\n\n // Add date format options\n if (f.key === \"date\") {\n const dateSeparatorOptions = [\"/\", \"-\", \".\", \",\", \" \"];\n const dayFormatOptions = [\n { value: this.label(\"1 to 31\"), id: \"D\" },\n { value: this.label(\"01 to 31\"), id: \"DD\" },\n ];\n const monthFormatOptions = [\n { value: this.label(\"1 to 12\"), id: \"M\" },\n { value: this.label(\"01 to 12\"), id: \"MM\" },\n ];\n const yearFormatOptions = [\n { value: this.label(\"00 to 99\"), id: \"YY\" },\n { value: this.label(\"2000 to 2099\"), id: \"YYYY\" },\n ];\n const dateOrderOptions = [\n {\n value: this.label(\"D-M-Y\"),\n id: 1,\n },\n {\n value: this.label(\"M-D-Y\"),\n id: 2,\n },\n {\n value: this.label(\"Y-M-D\"),\n id: 3,\n },\n {\n value: this.label(\"Y-D-M\"),\n id: 4,\n },\n ];\n\n columnOptUI = {\n gravity: 2,\n rows: [\n columnOptUI,\n {\n view: \"richselect\",\n label: this.label(\"Separator\"),\n labelWidth: 100,\n on: {\n onChange: () => {\n this.loadDataToGrid();\n },\n },\n name: \"separator\",\n abName: \"columnDateFormat\",\n options: dateSeparatorOptions,\n value: \"/\",\n },\n {\n view: \"richselect\",\n label: this.label(\"Day\"),\n labelWidth: 100,\n on: {\n onChange: () => {\n this.loadDataToGrid();\n },\n },\n name: \"day\",\n abName: \"columnDateFormat\",\n options: dayFormatOptions,\n value: \"D\",\n },\n {\n view: \"richselect\",\n label: this.label(\"Month\"),\n labelWidth: 100,\n on: {\n onChange: () => {\n this.loadDataToGrid();\n },\n },\n name: \"month\",\n abName: \"columnDateFormat\",\n options: monthFormatOptions,\n value: \"M\",\n },\n {\n view: \"richselect\",\n label: this.label(\"Year\"),\n labelWidth: 100,\n on: {\n onChange: () => {\n this.loadDataToGrid();\n },\n },\n name: \"year\",\n abName: \"columnDateFormat\",\n options: yearFormatOptions,\n value: \"YY\",\n },\n {\n view: \"richselect\",\n label: this.label(\"Order\"),\n labelWidth: 100,\n on: {\n onChange: () => {\n this.loadDataToGrid();\n },\n },\n name: \"order\",\n abName: \"columnDateFormat\",\n options: dateOrderOptions,\n value: 1,\n },\n ],\n };\n }\n\n // Add connected field options\n if (f.isConnection) {\n let linkFieldOptions = [];\n\n if (f.datasourceLink) {\n linkFieldOptions = f.datasourceLink\n .fields((fld) => !fld.isConnection)\n .map((fld) => {\n return {\n id: fld.id,\n value: fld.label,\n };\n });\n }\n\n columnOptUI = {\n gravity: 2,\n rows: [\n columnOptUI,\n {\n view: \"richselect\",\n label: \"=\",\n labelWidth: 20,\n abName: \"columnLinkData\",\n hidden: true,\n options: linkFieldOptions,\n value: linkFieldOptions[0] ? linkFieldOptions[0].id : null,\n },\n ],\n };\n }\n\n uiColumns.push({\n view: \"layout\",\n borderless: true,\n cols: [\n {\n view: \"template\",\n gravity: 1,\n borderless: true,\n css: { \"padding-top\": 10 },\n template: ` ${f.label}`,\n },\n columnOptUI,\n ],\n });\n });\n abWebix.ui(uiColumns, $columnList);\n\n this.loadDataToGrid();\n }\n\n toggleLinkFields($columnOption) {\n if (!$columnOption) return;\n\n const $optionPanel = $columnOption.getParentView();\n const $linkFieldOption = $optionPanel.queryView(\n { abName: \"columnLinkData\" },\n \"all\"\n )[0];\n\n if (!$linkFieldOption) return;\n\n if ($columnOption.getValue() === \"none\") $linkFieldOption.hide();\n else $linkFieldOption.show();\n }\n\n overLimitAlert(data) {\n const limit = 1000;\n\n if (data.length > limit) {\n // we only allow 1000 record imports\n this.AB.Webix.alert({\n title: this.label(\"Too many records\"),\n ok: this.label(\"Ok\"),\n text: this.label(\n \"Due to browser limitations we only allow imports of {0} records. Please upload a new CSV or deselect records to import.\",\n [limit]\n ),\n });\n\n return true;\n }\n\n return false;\n }\n\n loadDataToGrid() {\n const ids = this.ids;\n const $datatable = $$(ids.datatable);\n const ab = this.AB;\n\n if (!$datatable) return;\n\n $datatable.clearAll();\n\n // show loading cursor\n $datatable.showProgress?.({ type: \"icon\" });\n\n /** Prepare Columns */\n const matchFields = this.getMatchFields();\n const columns = [];\n\n // add \"status\" column\n columns.push({\n id: \"_status\",\n header: \"\",\n template: this.statusTemplate,\n width: 30,\n });\n\n // add \"checkbox\" column\n columns.push({\n id: \"_included\",\n header: { content: \"masterCheckbox\" },\n template: \"{common.checkbox()}\",\n width: 30,\n });\n\n const fieldValidations = [];\n const rulePops = [];\n\n // populate columns\n (matchFields || []).forEach((f) => {\n let validationRules = f.field.settings.validationRules;\n // parse the rules because they were stored as a string\n // check if rules are still a string...if so lets parse them\n if (validationRules && typeof validationRules === \"string\")\n validationRules = JSON.parse(validationRules);\n\n if (validationRules?.length) {\n const validationUI = [];\n\n // there could be more than one so lets loop through and build the UI\n validationRules.forEach((rule) => {\n const Filter = ab.filterComplexNew(\n `${f.field.id}_${ab.Webix.uid()}`\n );\n // add the new ui to an array so we can add them all at the same time\n validationUI.push(Filter.ui);\n // store the filter's info so we can assign values and settings after the ui is rendered\n fieldValidations.push({\n filter: Filter,\n view: Filter.ids.querybuilder,\n columnName: f.field.id,\n validationRules: rule.rules,\n invalidMessage: rule.invalidMessage,\n columnIndex: f.columnIndex,\n });\n });\n\n // create a unique view id for popup\n const popUpId = `${ids.rules}_${f.field.id}_${ab.Webix.uid()}`;\n\n // store the popup ids so we can remove the later\n rulePops.push(popUpId);\n // add the popup to the UI but don't show it\n ab.Webix.ui({\n view: \"popup\",\n css: \"ab-rules-popup\",\n id: popUpId,\n body: {\n rows: validationUI,\n },\n });\n }\n\n const editor = f.field?.key == \"number\" ? \"number\" : \"text\";\n\n columns.push({\n id: f.columnIndex,\n header: f.field.label,\n editor: editor,\n template: (obj, common, value /*, col, ind */) =>\n value.replace(/[<]/g, \"<\"),\n minWidth: 150,\n fillspace: true,\n });\n });\n\n if (fieldValidations.length) {\n // we need to store the rules for use later so lets build a container array\n const complexValidations = [];\n\n fieldValidations.forEach((f) => {\n // init each ui to have the properties (app and fields) of the object we are editing\n // f.filter.applicationLoad(App);\n f.filter.fieldsLoad(this.CurrentObject.fields());\n // now we can set the value because the fields are properly initialized\n f.filter.setValue(f.validationRules);\n // if there are validation rules present we need to store them in a lookup hash\n // so multiple rules can be stored on a single field\n if (!Array.isArray(complexValidations[f.columnName]))\n complexValidations[f.columnName] = [];\n\n // now we can push the rules into the hash\n complexValidations[f.columnName].push({\n filters: $$(f.view).getFilterHelper(),\n values: $datatable.getSelectedItem(),\n invalidMessage: f.invalidMessage,\n columnIndex: f.columnIndex,\n });\n });\n\n const rules = {};\n\n // store the rules in a data param to be used later\n $datatable.$view.complexValidations = complexValidations;\n\n // use the lookup to build the validation rules\n Object.keys(complexValidations).forEach((key) => {\n rules[key] = (value, data) => {\n // default valid is true\n let isValid = true;\n\n $datatable.$view.complexValidations[key].forEach((filter) => {\n const rowValue = {};\n // use helper funtion to check if valid\n // map the column names to the index numbers of data\n // reformat data to display\n\n (matchFields || []).forEach((f) => {\n const record = data[f.columnIndex];\n\n if (\n f.field.key === \"date\" &&\n record.includes(\"Invalid date\")\n )\n isValid = false;\n\n rowValue[f.field.id] = record;\n });\n\n const ruleValid = filter.filters(rowValue);\n\n // if invalid we need to tell the field\n if (!ruleValid) {\n isValid = false;\n // this.AB.Webix.message({\n // type: \"error\",\n // text: invalidMessage\n // });\n }\n });\n\n return isValid;\n };\n });\n // define validation rules\n $datatable.define(\"rules\", rules);\n // store the array of view ids on the webix object so we can get it later\n $datatable.config.rulePops = rulePops;\n $datatable.refresh();\n } else {\n // check if the previous datatable had rule popups and remove them\n if ($datatable.config.rulePops) {\n $datatable.config.rulePops.forEach((popup) => {\n const $popup = $$(popup);\n\n if (!$popup) return;\n\n $popup.destructor();\n });\n }\n\n // remove any validation rules from the previous table\n $datatable.define(\"rules\", {});\n $datatable.refresh();\n }\n\n /** Prepare Data */\n const parsedData = [];\n\n (this._dataRows || []).forEach((row, index) => {\n const rowValue = {\n id: index + 1,\n };\n\n // reformat data to display\n (matchFields || []).forEach((f) => {\n const data = row[f.columnIndex - 1];\n\n if (f.field.key === \"date\") {\n // let dateFormat = moment(data, f.format).format(\n // \"YYYY-MM-DD\"\n // );\n // debugger;\n let dateFormat = ab.rules.toDate(data, {\n format: f.format,\n });\n dateFormat = ab.rules.toDateFormat(dateFormat, {\n format: \"YYYY-MM-DD\",\n });\n\n if (dateFormat === \"Invalid date\")\n dateFormat = dateFormat + \" - \" + data;\n\n rowValue[f.columnIndex] = dateFormat;\n } else rowValue[f.columnIndex] = data; // array to object\n });\n\n // insert \"true\" value of checkbox\n rowValue[\"_included\"] = true;\n\n parsedData.push(rowValue);\n });\n\n // skip the first line\n const isSkipFirstLine = $$(ids.headerOnFirstLine).getValue();\n\n if (isSkipFirstLine && parsedData.length > 1) parsedData.shift();\n\n const $importButton = $$(ids.importButton);\n\n $importButton.setValue(this.labelImport(parsedData));\n $datatable.refreshColumns(columns);\n $datatable.parse(parsedData);\n\n if (this.overLimitAlert(parsedData)) $importButton.disable();\n else $importButton.enable();\n\n // hide loading cursor\n $datatable.hideProgress?.();\n }\n\n refreshRemainingTimeText(startUpdateTime, total, index) {\n const ids = this.ids;\n\n // Calculate remaining time\n const spentTime = new Date() - startUpdateTime; // milliseconds that has passed since last completed record since start\n\n const averageRenderTime = spentTime / index; // average milliseconds per single render at this point\n\n const remainTime = averageRenderTime * (total - index);\n\n let result = \"\";\n\n // Convert milliseconds to a readable string\n const days = (remainTime / 86400000).toFixed(0);\n const hours = (remainTime / 3600000).toFixed(0);\n const minutes = (remainTime / 60000).toFixed(0);\n const seconds = (remainTime / 1000).toFixed(0);\n\n if (seconds < 1) result = \"\";\n else if (seconds < 60)\n result = this.label(\"Approximately {0} second(s) remaining\", [\n seconds,\n ]);\n // result = `Approximately ${seconds} second${\n // seconds > 1 ? \"s\" : \"\"\n // }`;\n else if (minutes == 1)\n result = this.label(\"Approximately 1 minute {0} seconds remaining\", [\n seconds - 60,\n ]);\n // result = `Approximately 1 minute ${seconds - 60} seconds`;\n else if (minutes < 60)\n result = this.label(\"Approximately {0} minutes remaining\", [minutes]);\n else if (hours < 24)\n result = this.label(\"Approximately {0} hour(s) remaining\", [hours]);\n else result = this.label(\"Approximately {0} day(s) remaining\", [days]);\n\n if (result) {\n $$(ids.importButton)?.setValue(result);\n } else {\n const selected = $$(ids.datatable)?.find({ _included: true });\n $$(ids.importButton)?.setValue(this.labelImport(selected));\n }\n }\n\n /**\n * @method getMatchFields\n *\n * @return {Object} - [\n * {\n * columnIndex: {number},\n * field: {ABField},\n * searchField: {ABField} [optional]\n * },\n * ...\n * ]\n */\n getMatchFields() {\n const result = [];\n const ids = this.ids;\n\n // get richselect components\n const $selectorViews = $$(ids.columnList)\n .queryView({ abName: \"columnIndex\" }, \"all\")\n .filter((selector) => selector.getValue() != \"none\");\n\n ($selectorViews || []).forEach(($selector) => {\n const currentObject = this.CurrentObject;\n\n if (!currentObject) return;\n\n // webix .options list disallow value 0\n const field = currentObject.fieldByID($selector.config.fieldId);\n\n if (!field) return;\n\n const colIndex = $selector.getValue();\n const fieldData = {\n columnIndex: colIndex,\n field: field,\n };\n\n if (field.key === \"date\") {\n const $optionPanel = $selector.getParentView();\n const $dateFormatSelectors = $optionPanel.queryView(\n { abName: \"columnDateFormat\" },\n \"all\"\n );\n\n // define the column to compare data to search .id\n if ($dateFormatSelectors) {\n $dateFormatSelectors.forEach((selector) => {\n fieldData[selector.config.name] = selector.getValue();\n });\n\n // convert all dates into mysql date format YYYY-DD-MM\n let format;\n\n switch (fieldData.order) {\n case \"1\":\n format =\n fieldData.day +\n fieldData.separator +\n fieldData.month +\n fieldData.separator +\n fieldData.year;\n break;\n case \"2\":\n format =\n fieldData.month +\n fieldData.separator +\n fieldData.day +\n fieldData.separator +\n fieldData.year;\n break;\n case \"3\":\n format =\n fieldData.year +\n fieldData.separator +\n fieldData.month +\n fieldData.separator +\n fieldData.day;\n break;\n case \"4\":\n format =\n fieldData.year +\n fieldData.separator +\n fieldData.day +\n fieldData.separator +\n fieldData.month;\n }\n\n fieldData.format = format;\n }\n }\n\n if (field.isConnection) {\n const $optionPanel = $selector.getParentView();\n const $linkDataSelector = $optionPanel.queryView(\n { abName: \"columnLinkData\" },\n \"all\"\n )[0];\n\n // define the column to compare data to search .id\n if ($linkDataSelector) {\n const searchField = field.datasourceLink.fieldByID(\n $linkDataSelector.getValue()\n );\n\n fieldData.searchField = searchField;\n }\n }\n\n result.push(fieldData);\n });\n\n return result;\n }\n\n labelImport(selected) {\n let length = selected;\n\n if (Array.isArray(selected)) length = selected.length;\n\n return this.label(\"Import {0} Records\", [length]);\n }\n\n /**\n * @method import\n *\n * @return {Promise}\n */\n async import() {\n // if (dv == null) return Promise.resolve();\n\n // // get ABObject\n // let obj = dv.datasource;\n\n // Make sure we are connected to an Object\n const currentObject = this.CurrentObject;\n\n if (!currentObject) return;\n\n // get ABModel\n // let model = dv.model;\n // if (model == null) return Promise.resolve();\n\n const ids = this.ids;\n const $importButton = $$(ids.importButton);\n\n $importButton.disable();\n\n // Show loading cursor\n const $form = $$(ids.form);\n const $progressBar = $$(ids.progressBar);\n\n $form.showProgress({ type: \"icon\" });\n $progressBar.showProgress({\n type: \"top\",\n position: 0.0001,\n });\n\n // get richselect components\n const matchFields = this.getMatchFields();\n\n // Get object's model\n const objModel = currentObject.model();\n const $datatable = $$(ids.datatable);\n const selectedRows = $datatable.find({ _included: true });\n\n let _currProgress = 0;\n\n const increaseProgressing = () => {\n _currProgress += 1;\n $progressBar.showProgress({\n type: \"bottom\",\n position: _currProgress / selectedRows.length,\n });\n };\n const itemFailed = (itemId, errMessage) => {\n if ($datatable) {\n // set \"fail\" status\n $datatable.addRowCss(itemId, \"row-fail\");\n $datatable.blockEvent();\n $datatable.updateItem(itemId, {\n _status: \"fail\",\n _errorMsg: errMessage,\n });\n $datatable.unblockEvent();\n }\n\n increaseProgressing();\n\n console.error(errMessage);\n };\n const abWebix = this.AB.Webix;\n const itemInvalid = (itemId, errors = []) => {\n if ($datatable) {\n // combine all error messages to display in tooltip\n const errorMsg = [];\n // mark which column are invalid\n errors.forEach((err) => {\n if (!err?.name) return;\n\n const fieldInfo = matchFields.filter(\n (f) => f.field && f.field.columnName == err.name\n )[0];\n\n errorMsg.push(err.name + \": \" + err.message);\n // we also need to define an error message\n // abWebix.message({\n // type: \"error\",\n // text: err.name + \": \" + err.message\n // });\n });\n\n // set \"fail\" status\n $datatable.blockEvent();\n $datatable.updateItem(itemId, {\n _status: \"invalid\",\n _errorMsg: errorMsg.join(\"
    \"),\n });\n $datatable.unblockEvent();\n $datatable.addRowCss(itemId, \"webix_invalid\");\n }\n // increaseProgressing();\n };\n const itemPass = (itemId) => {\n if ($datatable) {\n // set \"done\" status\n $datatable.removeRowCss(itemId, \"row-fail\");\n $datatable.addRowCss(itemId, \"row-pass\");\n $datatable.blockEvent();\n $datatable.updateItem(itemId, {\n _status: \"done\",\n _errorMsg: \"\",\n });\n $datatable.unblockEvent();\n }\n\n increaseProgressing();\n };\n const itemValid = (itemId) => {\n if ($datatable) {\n // mark all columns valid (just in case they were invalid before)\n // matchFields.forEach((f) => {\n // $datatable.removeCellCss(\n // itemId,\n // f.columnIndex,\n // \"webix_invalid_cell\"\n // );\n // });\n // highlight the row\n $datatable.removeRowCss(itemId, \"webix_invalid\");\n $datatable.blockEvent();\n $datatable.updateItem(itemId, {\n _status: \"\",\n _errorMsg: \"\",\n });\n $datatable.unblockEvent();\n // $datatable.addRowCss(itemId, \"row-pass\");\n }\n };\n const $statusMessage = $$(ids.statusMessage);\n const uiCleanUp = () => {\n // To Do anyUI updates\n // console.log(\"ui clean up now\");\n $importButton.enable();\n\n // Hide loading cursor\n $form.hideProgress();\n $progressBar.hideProgress();\n\n $statusMessage.setValue(\"\");\n $statusMessage.hide();\n\n const selected = $datatable.find({ _included: true });\n\n $importButton.setValue(this.labelImport(selected));\n this.emit(\"done\");\n };\n\n const validRows = [];\n\n let allValid = true;\n\n // Pre Check Validations of whole CSV import\n // update row to green if valid\n // update row to red if !valid\n (selectedRows || []).forEach((data, index) => {\n const newRowData = this.getParentValues();\n\n matchFields.forEach((f) => {\n if (!f.field?.key) return;\n\n switch (f.field.key) {\n // case \"connectObject\":\n // // skip\n // break;\n case \"number\":\n if (typeof data[f.columnIndex] !== \"number\") {\n newRowData[f.field.columnName] = (\n data[f.columnIndex] || \"\"\n ).replace(/[^-0-9.]/gi, \"\");\n\n break;\n }\n\n newRowData[f.field.columnName] = data[f.columnIndex];\n\n break;\n\n default:\n newRowData[f.field.columnName] = data[f.columnIndex];\n\n break;\n }\n });\n\n let isValid = false;\n let errorMsg = \"\";\n\n // first check legacy and server side validation\n const validator = currentObject.isValidData(newRowData);\n\n isValid = validator.pass();\n errorMsg = validator.errors;\n\n if (isValid)\n // now check complex field validation rules\n isValid = $datatable.validate(data.id);\n else {\n allValid = false;\n\n itemInvalid(data.id, errorMsg);\n }\n\n if (isValid) {\n itemValid(data.id);\n validRows.push({ id: data.id, data: newRowData });\n } else allValid = false;\n\n // $datatable.unblockEvent();\n });\n\n if (!allValid) {\n // To Do anyUI updates\n // $importButton.enable();\n //\n // // Hide loading cursor\n // $form.hideProgress();\n // $progressBar.hideProgress();\n // $statusMessage.setValue(\"\");\n // $statusMessage.hide();\n //\n // // _logic.hide();\n //\n // if (_logic.callbacks && _logic.callbacks.onDone)\n // _logic.callbacks.onDone();\n uiCleanUp();\n\n abWebix.alert({\n title: this.label(\"Invalid Data\"),\n ok: this.label(\"Ok\"),\n text: this.label(\n \"The highlighted row has invalid data. Please edit in the window or update the CSV and try again.\"\n ),\n });\n\n return;\n }\n\n // if pass, then continue to process each row\n // ?? : can we process in Parallel?\n // ?? : implement hash Lookups for connected Fields\n const hashLookups = {};\n // {obj} /* { connectField.id : { 'searchWord' : \"uuid\"}}\n // use this hash to reduce the # of lookups needed to fill in our\n // connected entries\n\n const connectedFields = matchFields.filter(\n (f) => f && f.field?.isConnection && f.searchField\n );\n\n const throttledSize = 10;\n let startUpdateTime;\n let numDone = 0;\n\n try {\n // forEach connectedFields in csv\n const allLookups = [];\n\n (connectedFields || []).forEach((f) => {\n const connectField = f.field;\n // const searchWord = newRowData[f.columnIndex];\n const connectObject = connectField.datasourceLink;\n\n if (!connectObject) return;\n\n const connectModel = connectObject.model();\n\n if (!connectModel) return;\n\n const linkIdKey = connectField.indexField\n ? connectField.indexField.columnName\n : connectField.object.PK();\n\n // prepare default hash entry:\n hashLookups[connectField.id] = {};\n\n // load all values of connectedField entries\n const gethashLookup = async () => {\n try {\n const list = await connectModel.findAll({\n where: {}, // !!!\n populate: false,\n });\n const data = list.data || list;\n\n (data || []).forEach((row) => {\n // store in hash[field.id] = { 'searchKey' : \"uuid\" }\n\n hashLookups[connectField.id][\n row[f.searchField.columnName]\n ] = row[linkIdKey];\n });\n } catch (err) {\n console.error(err);\n }\n };\n\n allLookups.push(gethashLookup());\n });\n\n await Promise.all(allLookups);\n\n // forEach validRow\n validRows.forEach((data) => {\n const newRowData = data.data;\n\n // update the datagrid row to in-progress\n $datatable.blockEvent();\n $datatable.updateItem(data.id, {\n _status: \"in-progress\",\n _errorMsg: \"\",\n });\n $datatable.unblockEvent();\n\n // forEach ConnectedField\n (connectedFields || []).forEach((f) => {\n // find newRowData[field.columnName] = { field.PK : hash[field.id][searchWord] }\n const connectField = f.field;\n const linkIdKey = connectField.indexField\n ? connectField.indexField.columnName\n : connectField.object.PK();\n const uuid =\n hashLookups[connectField.id][\n newRowData[connectField.columnName]\n ];\n\n if (!uuid) {\n itemInvalid(data.id, [{ name: connectField.columnName }]);\n allValid = false;\n }\n\n newRowData[connectField.columnName] = {};\n newRowData[connectField.columnName][linkIdKey] = uuid;\n });\n });\n\n if (!allValid) {\n abWebix.alert({\n title: this.label(\"Invalid Data\"),\n ok: this.label(\"Ok\"),\n text: this.label(\n \"The highlighted row has invalid data. Please edit in the window or update the CSV and try again.\"\n ),\n });\n uiCleanUp();\n\n return;\n }\n\n // NOTE: Parallel exectuion of all these:\n const allSaves = [];\n const createRecord = (objModel, newRowsData, element, total) =>\n new Promise((resolve, reject) => {\n element.doRecordRulesPre(newRowsData);\n\n const processResult = async () => {\n try {\n const result = await objModel.batchCreate({\n batch: newRowsData,\n });\n const resultErrors = result.errors;\n\n // Show errors of each row\n Object.keys(resultErrors).forEach((rowIndex) => {\n const error = resultErrors[rowIndex];\n\n if (error) {\n itemFailed(\n rowIndex,\n error.message || error.sqlMessage || error\n );\n }\n });\n\n const resultData = result.data;\n const penddingRecordRules = [];\n\n Object.keys(resultData).forEach((rowIndex) => {\n penddingRecordRules.push(\n new Promise((resolve, reject) => {\n // Process Record Rule\n const processRowData = async () => {\n try {\n await element.doRecordRules(\n resultData[rowIndex]\n );\n\n itemPass(rowIndex);\n resolve();\n } catch (err) {\n itemFailed(rowIndex, err);\n reject(\"that didn't work\");\n }\n };\n\n processRowData();\n })\n );\n });\n\n const waitPenddingRecordRules = async () => {\n try {\n await Promise.all(penddingRecordRules);\n\n newRowsData.forEach((row) => {\n // itemPass(row.id);\n numDone++;\n if (numDone % throttledSize == 0) {\n this.refreshRemainingTimeText(\n startUpdateTime,\n validRows.length,\n numDone\n );\n }\n });\n\n if (numDone === total) {\n uiCleanUp();\n $importButton.disable();\n }\n\n resolve();\n } catch (err) {\n // newRowsData.forEach((row) => {\n // itemFailed(row.id, err);\n // });\n // throw err;\n reject(err);\n }\n };\n\n await waitPenddingRecordRules();\n } catch (err) {\n console.error(err);\n reject(err);\n }\n };\n\n processResult();\n });\n\n validRows.forEach((data) => {\n allSaves.push({ id: data.id, data: data.data });\n });\n\n // we are going to store these promises in an array of\n // arrays with 50 in each sub array\n const throttledSaves = [];\n const total = allSaves.length;\n\n let index = 0;\n\n while (allSaves.length) {\n throttledSaves[index] = allSaves.splice(0, throttledSize);\n\n index++;\n }\n\n // execute the array of array of 100 promises one at at time\n const performThrottledSaves = (\n currentRecords,\n remainingRecords,\n importer,\n total\n ) =>\n new Promise((resolve, reject) => {\n // execute the next 100\n // const requests = currentRecords.map((data) => {\n // return createRecord(\n // objModel,\n // data.record,\n // data.data,\n // importer\n // );\n // });\n\n const processRequest = async () => {\n try {\n await createRecord(\n objModel,\n currentRecords,\n importer,\n total\n );\n\n // when done get the next 10\n const nextRecords = remainingRecords.shift();\n\n // if there are any remaining in the group call performThrottledSaves\n if (nextRecords?.length) {\n await performThrottledSaves(\n nextRecords,\n remainingRecords,\n importer,\n total\n );\n } else {\n // uiCleanUp();\n resolve();\n }\n } catch (err) {\n // Handle errors here\n reject(err);\n }\n };\n\n processRequest();\n });\n\n // now we are going to processes these new containers one at a time\n // $datatable.blockEvent();\n // this is when the real work starts so lets begin our countdown timer now\n startUpdateTime = new Date();\n // get the first group of Promises out of the collection\n const next = throttledSaves.shift();\n\n // execute our Promise iterator\n await performThrottledSaves(next, throttledSaves, this.view, total);\n } catch (err) {\n // resolve Error UI\n abWebix.alert({\n title: this.label(\"Error Creating Records\"),\n ok: this.label(\"Ok\"),\n text: this.label(\"One or more records failed upon creation.\"),\n });\n // $datatable.unblockEvent();\n uiCleanUp();\n console.error(err);\n }\n }\n\n // Display linked data\n uiLinkedData() {\n const dcLink = this.datacollection?.datacollectionLink;\n const linkedData = dcLink?.getCursor();\n if (!linkedData) return;\n\n return {\n view: \"window\",\n modal: true,\n resize: false,\n head: {\n view: \"toolbar\",\n cols: [\n {},\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n this.hideLinkedData();\n },\n },\n ],\n },\n body: {\n view: \"property\",\n id: \"sets\",\n editable: false,\n width: 400,\n height: 200,\n elements: [\n { label: this.label(\"Linked Data\"), type: \"label\" },\n {\n label: \"ID\",\n type: \"text\",\n value: linkedData.uuid ?? linkedData.id,\n },\n {\n label: \"Label\",\n type: \"text\",\n value: dcLink.datasource.displayData(linkedData),\n },\n ],\n },\n };\n }\n\n showLinkedData() {\n const ui = this.uiLinkedData();\n this._info_popup = this.AB.Webix.ui(ui);\n this._info_popup.show($$(this.ids.linkedDataButton).$view, {\n pos: \"top\",\n });\n }\n\n hideLinkedData() {\n this._info_popup?.hide();\n }\n\n getParentValues() {\n const result = {};\n\n // get ABDatacollection\n const dc = this.datacollection;\n const currentObject = this.CurrentObject;\n\n // Set parent's data collection cursor\n const dcLink = dc?.datacollectionLink;\n const linkConnectFields = [];\n\n let objectLink;\n let linkValues;\n\n if (dcLink?.getCursor()) {\n objectLink = dcLink.datasource;\n\n linkConnectFields.push(\n ...currentObject.fields(\n (f) => f.isConnection && f.settings.linkObject === objectLink.id\n )\n );\n\n linkValues = dcLink.getCursor();\n }\n\n // Set parent's data collection cursor\n if (objectLink && linkConnectFields.length && linkValues) {\n linkConnectFields.forEach((f) => {\n const linkColName = f.indexField\n ? f.indexField.columnName\n : objectLink.PK();\n\n result[f.columnName] = result[f.columnName] ?? {};\n result[f.columnName][linkColName] =\n linkValues[linkColName] ?? linkValues.id;\n });\n }\n\n return result;\n }\n};\n","import ABViewComponent from \"./ABViewComponent\";\n\nexport default class ABViewCarouselComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewCarousel_${baseView.id}`,\n Object.assign(\n {\n carousel: \"\",\n },\n ids\n )\n );\n\n this._handler_doOnShow = () => {\n this.onShow();\n };\n\n this._handler_doReload = () => {\n // this.datacollection?.reloadData();\n };\n\n this._handler_doFilter = (fnFilter, filterRules) => {\n // NOTE: fnFilter is depreciated and will be removed.\n\n // this.onShow(filterRules);\n const dv = this.datacollection;\n\n if (!dv) return;\n\n dv.filterCondition(filterRules);\n dv.reloadData();\n };\n\n this._handler_busy = () => {\n this.busy();\n };\n\n this._handler_ready = () => {\n this.ready();\n };\n }\n\n ui() {\n const ids = this.ids;\n\n const baseView = this.view;\n\n this.filterUI = baseView.filterHelper; // component(/* App, idBase */);\n this.linkPage = baseView.linkPageHelper.component(/* App, idBase */);\n\n const spacer = {};\n const settings = this.settings;\n\n if (settings.width === 0)\n Object.assign(spacer, {\n width: 1,\n });\n\n const _ui = super.ui([\n {\n borderless: true,\n cols: [\n spacer, // spacer\n {\n borderless: true,\n rows: [\n this.filterUI.ui(), // filter UI\n {\n id: ids.carousel,\n view: \"carousel\",\n cols: [],\n width: settings.width,\n height: settings.height,\n navigation: {\n items: !settings.hideItem,\n buttons: !settings.hideButton,\n type: settings.navigationType,\n },\n on: {\n onShow: () => {\n const activeIndex = $$(\n ids.carousel\n ).getActiveIndex();\n\n this.switchImage(activeIndex);\n },\n },\n },\n ],\n },\n spacer, // spacer\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n // make sure each of our child views get .init() called\n async init(AB) {\n await super.init(AB);\n\n const dv = this.datacollection;\n\n if (!dv) {\n AB.notify.builder(`Datacollection is ${dv}`, {\n message: \"This is an invalid datacollection\",\n });\n\n return;\n }\n\n const object = dv.datasource;\n\n if (!object) {\n AB.notify.developer(`Object is ${dv}`, {\n message: \"This is an invalid object\",\n });\n\n return;\n }\n\n dv.removeListener(\"loadData\", this._handler_doOnShow);\n dv.on(\"loadData\", this._handler_doOnShow);\n\n dv.removeListener(\"update\", this._handler_doReload);\n dv.on(\"update\", this._handler_doReload);\n\n dv.removeListener(\"delete\", this._handler_doReload);\n dv.on(\"delete\", this._handler_doReload);\n\n dv.removeListener(\"create\", this._handler_doReload);\n dv.on(\"create\", this._handler_doReload);\n\n dv.removeListener(\"initializingData\", this._handler_busy);\n dv.on(\"initializingData\", this._handler_busy);\n\n dv.removeListener(\"initializedData\", this._handler_ready);\n dv.on(\"initializedData\", this._handler_ready);\n\n if (this.settings.filterByCursor) {\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n dv.removeListener(key, this._handler_doOnShow);\n dv.on(key, this._handler_doOnShow);\n });\n }\n\n const baseView = this.view;\n\n // filter helper\n baseView.filterHelper.objectLoad(object);\n baseView.filterHelper.viewLoad(this);\n\n this.filterUI.init(this.AB);\n this.filterUI.removeListener(\"filter.data\", this._handler_doFilter);\n this.filterUI.on(\"filter.data\", this._handler_doFilter);\n\n // link page helper\n this.linkPage.init({\n view: baseView,\n datacollection: dv,\n });\n\n // set data-cy\n const $carouselView = $$(this.ids.carousel)?.$view;\n\n if ($carouselView) {\n $carouselView.setAttribute(\n \"data-cy\",\n `${baseView.key} ${baseView.id}`\n );\n $carouselView\n .querySelector(\".webix_nav_button_prev\")\n ?.firstElementChild?.setAttribute(\n \"data-cy\",\n `${baseView.key} button previous ${baseView.id}`\n );\n $carouselView\n .querySelector(\".webix_nav_button_next\")\n ?.firstElementChild?.setAttribute(\n \"data-cy\",\n `${baseView.key} button next ${baseView.id}`\n );\n }\n }\n\n /**\n * @method detatch()\n * Will make sure all our handlers are removed from any object\n * we have attached them to.\n *\n * You'll want to call this in situations when we are dynamically\n * creating and recreating instances of the same Widget (like in\n * the ABDesigner).\n */\n detatch() {\n const dv = this.datacollection;\n\n if (!dv) return;\n\n dv.removeListener(\"loadData\", this._handler_doOnShow);\n\n if (this._handler_doReload) {\n dv.removeListener(\"update\", this._handler_doReload);\n dv.removeListener(\"delete\", this._handler_doReload);\n dv.removeListener(\"create\", this._handler_doReload);\n }\n\n dv.removeListener(\"initializingData\", this._handler_busy);\n\n dv.removeListener(\"initializedData\", this._handler_ready);\n\n if (this.settings.filterByCursor)\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n dv.removeListener(key, this._handler_doOnShow);\n });\n\n this.filterUI.removeListener(\"filter.data\", this._handler_doOnShow);\n }\n\n myTemplate(row) {\n if (row?.src) {\n const settings = this.settings;\n\n return ``;\n }\n // empty image\n else return \"\";\n }\n\n busy() {\n const $carousel = $$(this.ids.carousel);\n\n $carousel?.disable();\n $carousel?.showProgress?.({ type: \"icon\" });\n }\n\n ready() {\n const $carousel = $$(this.ids.carousel);\n\n $carousel?.enable();\n $carousel?.hideProgress?.();\n }\n\n async switchImage(currentPosition) {\n const dv = this.datacollection;\n\n if (!dv) return;\n\n // Check want to load more images\n if (\n currentPosition >= this._imageCount - 1 && // check last image\n dv.totalCount > this._rowCount\n ) {\n // loading cursor\n this.busy();\n\n try {\n await dv.loadData(this._rowCount || 0);\n } catch (err) {\n this.AB.notify.developer(err, {\n message:\n \"ABViewCarousel:switchImage():Error when load data from a Data collection\",\n });\n }\n\n this.ready();\n }\n }\n\n onShow(fnFilter = this.filterUI.getFilter()) {\n const ids = this.ids;\n const dv = this.datacollection;\n\n if (!dv) return;\n\n const obj = dv.datasource;\n\n if (!obj) return;\n\n const field = this.view.imageField;\n\n if (!field) return;\n\n if (dv.dataStatus == dv.dataStatusFlag.notInitial) {\n // load data when a widget is showing\n dv.loadData();\n\n // it will call .onShow again after dc loads completely\n return;\n }\n\n const settings = this.settings;\n\n let rows = dv.getData(fnFilter);\n\n // Filter images by cursor\n if (settings.filterByCursor) {\n const cursor = dv.getCursor();\n\n if (cursor)\n rows = rows.filter(\n (r) =>\n (r[obj.PK()] || r.id || r) ===\n (cursor[obj.PK()] || cursor.id || cursor)\n );\n }\n\n const images = [];\n\n rows.forEach((r) => {\n const imgFile = r[field.columnName];\n\n if (imgFile) {\n const imgData = {\n id: r.id,\n src: `/file/${imgFile}`,\n imgFile,\n };\n\n // label of row data\n if (settings.showLabel) imgData.label = obj.displayData(r);\n\n images.push({\n css: \"image\",\n borderless: true,\n template: (...params) => {\n return this.myTemplate(...params);\n },\n data: imgData,\n });\n }\n });\n\n const ab = this.AB;\n\n // insert the default image to first item\n if (field.settings.defaultImageUrl)\n images.unshift({\n css: \"image\",\n template: (...params) => this.myTemplate(...params),\n data: {\n id: ab.uuid(),\n src: `/file/${field.settings.defaultImageUrl}`,\n label: this.label(\"Default image\"),\n },\n });\n\n // empty image\n if (images.length < 1)\n images.push({\n rows: [\n {\n view: \"label\",\n align: \"center\",\n height: settings.height,\n label: \"
    \",\n },\n {\n view: \"label\",\n align: \"center\",\n label: this.label(\"No image\"),\n },\n ],\n });\n\n // store total of rows\n this._rowCount = rows.length;\n\n // store total of images\n this._imageCount = images.length;\n\n const $carousel = $$(ids.carousel);\n const abWebix = ab.Webix;\n\n if ($carousel) {\n // re-render\n abWebix.ui(images, $carousel);\n\n // add loading cursor\n abWebix.extend($carousel, abWebix.ProgressBar);\n\n // link pages events\n const editPage = settings.editPage;\n const detailsPage = settings.detailsPage;\n\n // if (detailsPage || editPage) {\n $carousel.$view.onclick = async (e) => {\n if (e.target.className) {\n if (e.target.className.indexOf(\"ab-carousel-edit\") > -1) {\n abWebix.html.removeCss($carousel.getNode(), \"fullscreen\");\n abWebix.fullscreen.exit();\n let rowId = e.target.getAttribute(\"ab-row-id\");\n this.linkPage.changePage(editPage, rowId);\n } else if (\n e.target.className.indexOf(\"ab-carousel-detail\") > -1\n ) {\n abWebix.html.removeCss($carousel.getNode(), \"fullscreen\");\n abWebix.fullscreen.exit();\n let rowId = e.target.getAttribute(\"ab-row-id\");\n this.linkPage.changePage(detailsPage, rowId);\n } else if (\n e.target.className.indexOf(\"ab-carousel-fullscreen\") > -1\n ) {\n $carousel.define(\"css\", \"fullscreen\");\n abWebix.fullscreen.set(ids.carousel, {\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n elements: [\n {},\n {\n view: \"icon\",\n icon: \"fa fa-times\",\n click: function () {\n abWebix.html.removeCss(\n $carousel.getNode(),\n \"fullscreen\"\n );\n abWebix.fullscreen.exit();\n },\n },\n ],\n },\n });\n } else if (\n e.target.className.indexOf(\"ab-carousel-rotate-left\") > -1\n ) {\n const rowId = e.target.getAttribute(\"ab-row-id\");\n const imgFile = e.target.getAttribute(\"ab-img-file\");\n this.rotateImage(rowId, imgFile, field, \"left\");\n } else if (\n e.target.className.indexOf(\"ab-carousel-rotate-right\") > -1\n ) {\n const rowId = e.target.getAttribute(\"ab-row-id\");\n const imgFile = e.target.getAttribute(\"ab-img-file\");\n this.rotateImage(rowId, imgFile, field, \"right\");\n } else if (\n e.target.className.indexOf(\"ab-carousel-zoom-in\") > -1\n ) {\n this.zoom(\"in\");\n } else if (\n e.target.className.indexOf(\"ab-carousel-zoom-out\") > -1\n ) {\n this.zoom(\"out\");\n }\n }\n };\n }\n }\n\n showFilterPopup($view) {\n this.filterUI.showPopup($view);\n }\n\n async rotateImage(rowId, imgFile, field, direction = \"right\") {\n this.busy();\n\n // call api to rotate\n if (direction == \"left\") await field.rotateLeft(imgFile);\n else await field.rotateRight(imgFile);\n\n // refresh image\n const imgElm = document.getElementById(`${this.ids.component}-${rowId}`);\n if (imgElm) {\n await fetch(imgElm.src, { cache: \"reload\", mode: \"no-cors\" });\n imgElm.src = `${imgElm.src}#${new Date().getTime()}`;\n }\n\n this.ready();\n }\n\n zoom(inOrOut = \"in\") {\n const imgContainer = document.getElementsByClassName(\n \"ab-carousel-image-container\"\n )[0];\n if (!imgContainer) return;\n\n const imgElem = imgContainer.getElementsByTagName(\"img\")[0];\n if (!imgElem) return;\n\n const step = 15;\n const height = parseInt(\n (imgElem.style.height || 100).toString().replace(\"%\", \"\")\n );\n const newHeight = inOrOut == \"in\" ? height + step : height - step;\n imgElem.style.height = `${newHeight}%`;\n\n imgContainer.style.overflow = newHeight > 100 ? \"auto\" : \"\";\n }\n}\n","const ABViewChartContainerComponent = require(\"./ABViewChartContainerComponent\");\n\nmodule.exports = class ABViewChartAreaComponent extends (\n ABViewChartContainerComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewChartArea_${baseView.id}`, ids);\n }\n\n ui() {\n const settings = this.settings;\n\n return super.ui({\n view: \"chart\",\n type: settings.areaType,\n yAxis: {\n start: 0,\n step: settings.stepValue, //\"#stepValue#\",\n end: settings.maxValue, //\"#maxValue#\"\n },\n xAxis: {\n template: settings.isLegend\n ? `
    #label#
    `\n : \"\",\n },\n legend: settings.isLegend\n ? {\n template: `
    #label#
    `,\n values: [], // TODO : bug in webix 5.1.7\n }\n : null,\n series: [\n {\n alpha: 0.7,\n value: \"#value#\",\n color: \"#ee4339\",\n },\n {\n alpha: 0.4,\n value: \"#value2#\",\n color: \"#a7ee70\",\n },\n ],\n height: settings.chartHeight,\n // width: settings.chartWidth,\n });\n }\n\n async init(AB) {\n await super.init(AB);\n }\n\n onShow() {\n super.onShow();\n }\n};\n","const ABViewChartContainerComponent = require(\"./ABViewChartContainerComponent\");\n\nmodule.exports = class ABViewChartBarComponent extends (\n ABViewChartContainerComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewChartBar_${baseView.id}`, ids);\n }\n\n ui() {\n const settings = this.settings;\n\n return super.ui({\n view: \"chart\",\n type: settings.barType,\n preset: settings.barPreset,\n value: \"#value#\",\n color: \"#color#\",\n yAxis: {\n start: 0,\n step: settings.stepValue, //\"#stepValue#\",\n end: settings.maxValue, //\"#maxValue#\"\n },\n xAxis: {\n template: settings.isLegend\n ? `
    #label#
    `\n : \"\",\n },\n legend:\n settings.barType === \"bar\" || !settings.barType\n ? settings.isLegend\n ? `
    #label#
    `\n : \"\"\n : settings.isLegend\n ? {\n template: `
    #label#
    `,\n values: [], // TODO : bug in webix 5.1.7\n }\n : null,\n height: settings.height,\n // width: settings.chartWidth,\n });\n }\n\n async init(AB) {\n await super.init(AB);\n }\n\n onShow() {\n super.onShow();\n }\n};\n","const ABViewContainerComponent = require(\"./ABViewContainerComponent\");\n\nmodule.exports = class ABViewChartComponent extends ABViewContainerComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewChart_${baseView.id}`, ids);\n }\n\n async init(AB, accessLevel) {\n await super.init(AB, accessLevel);\n\n const $component = $$(this.ids.component);\n const abWebix = this.AB.Webix;\n\n if ($component) abWebix.extend($component, abWebix.ProgressBar);\n\n const baseView = this.view;\n const dc = this.datacollection;\n\n if (dc) {\n const eventNames = [\n \"changeCursor\",\n \"cursorStale\",\n \"create\",\n \"update\",\n \"delete\",\n \"initializedData\",\n ];\n\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n // QUESTION: is this a problem if the check !(key in (...)) finds\n // an event that some OTHER widget has added and not this one?\n if (\n dc.datacollectionLink &&\n !(key in (dc.datacollectionLink._events ?? []))\n )\n baseView.eventAdd({\n emitter: dc.datacollectionLink,\n eventName: key,\n listener: () => {\n baseView.refreshData();\n },\n });\n });\n\n eventNames.forEach((evtName) => {\n baseView.eventAdd({\n emitter: dc,\n eventName: evtName,\n listener: () => {\n baseView.refreshData();\n },\n });\n });\n }\n\n baseView.refreshData();\n }\n\n onShow() {\n super.onShow();\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewChartContainerComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewChartContainer_${baseView.id}`,\n Object.assign(\n {\n chartContainer: \"\",\n },\n ids\n )\n );\n }\n\n ui(uiChartComponent) {\n const _ui = super.ui([\n Object.assign({ id: this.ids.chartContainer }, uiChartComponent ?? {}),\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n }\n\n onShow() {\n super.onShow();\n // if (!this._isShow) {\n\n // Mark this widget is showing\n const baseView = this.view;\n\n baseView._isShow = true;\n\n this.refreshData(baseView.parent.getDCChart());\n // }\n }\n\n refreshData(dcChart) {\n const $chartContainer = $$(this.ids.chartContainer);\n const $chartComponent = $$(this.ids.component);\n\n if ($chartContainer?.data) $chartContainer.data.sync(dcChart);\n\n setTimeout(() => {\n $chartComponent?.adjust();\n $chartContainer?.adjust();\n }, 160);\n }\n};\n","const ABViewChartContainerComponent = require(\"./ABViewChartContainerComponent\");\n\nmodule.exports = class ABViewChartLineComponent extends (\n ABViewChartContainerComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewChartLine_${baseView.id}`, ids);\n }\n\n ui() {\n const settings = this.settings;\n\n return super.ui({\n view: \"chart\",\n type: settings.lineType,\n preset: settings.linePreset,\n value: \"#value#\",\n color: \"#color#\",\n yAxis: {\n start: 0,\n step: settings.stepValue,\n end: settings.maxValue, //\"#maxValue#\"\n },\n xAxis: {\n template: settings.isLegend\n ? `
    #label#
    `\n : \"\",\n },\n legend: settings.isLegend\n ? {\n template: `
    #label#
    `,\n values: [], // TODO : bug in webix 5.1.7\n }\n : null,\n height: settings.chartHeight,\n // width: settings.chartWidth,\n });\n }\n};\n","const ABViewChartContainerComponent = require(\"./ABViewChartContainerComponent\");\n\nmodule.exports = class ABViewChartPieComponent extends (\n ABViewChartContainerComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewChartPie_${baseView.id}`, ids);\n }\n\n ui() {\n const settings = this.settings;\n\n return super.ui({\n view: \"chart\",\n type: settings.pieType,\n value: \"#value#\",\n color: \"#color#\",\n legend: settings.isLegend\n ? {\n width: this.view.parent.settings.labelWidth,\n template: `
    #label#
    `,\n }\n : null,\n pieInnerText: `
    #value#
    `,\n shadow: 1,\n height: settings.height,\n // width: settings.chartWidth,\n });\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewCommentComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewComment_${baseView.id}`,\n Object.assign(\n {\n comment: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const baseView = this.view;\n const _ui = super.ui([\n {\n id: this.ids.comment,\n view: \"comments\",\n users: baseView.getUserData(),\n currentUser: baseView.getCurrentUserId(),\n height: this.settings.height,\n data: this.getCommentData(),\n on: {\n onBeforeAdd: (id, obj, index) => {\n this.addComment(obj.text, new Date());\n },\n // NOTE: no update event of comment widget !!\n // Updating event handles in .init function\n // https://docs.webix.com/api__ui.comments_onbeforeeditstart_event.html#comment-4509366150\n\n // onAfterEditStart: function (rowId) {\n // let item = this.getItem(rowId);\n\n // _logic.updateComment(rowId, item);\n // },\n onAfterDelete: (rowId) => {\n this.deleteComment(rowId);\n },\n },\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const baseView = this.view;\n\n baseView.__dvEvents = baseView.__dvEvents || {};\n\n const ids = this.ids;\n const $comment = $$(ids.comment);\n\n if ($comment) {\n const $commentList = $comment.queryView({ view: \"list\" });\n\n if ($commentList) {\n // Updating comment event\n if (!baseView.__dvEvents.onStoreUpdated)\n baseView.__dvEvents.onStoreUpdated =\n $commentList.data.attachEvent(\n \"onStoreUpdated\",\n (rowId, data, operate) => {\n if (operate === \"update\") {\n this.updateComment(rowId, (data || {}).text);\n }\n }\n );\n\n // Implement progress bar\n webix.extend($commentList, webix.ProgressBar);\n }\n }\n\n const dv = this.datacollection;\n\n if (!dv) return;\n\n // bind dc to component\n // dv.bind($$(ids.comment));\n\n if (!baseView.__dvEvents.create)\n baseView.__dvEvents.create = dv.on(\"create\", () =>\n this.refreshComment()\n );\n\n if (!baseView.__dvEvents.update)\n baseView.__dvEvents.update = dv.on(\"update\", () =>\n this.refreshComment()\n );\n\n if (!baseView.__dvEvents.delete)\n baseView.__dvEvents.delete = dv.on(\"delete\", () =>\n this.refreshComment()\n );\n\n if (!baseView.__dvEvents.loadData)\n baseView.__dvEvents.loadData = dv.on(\"loadData\", () =>\n this.refreshComment()\n );\n\n $comment.refresh();\n }\n\n getCommentData() {\n const baseView = this.view;\n const dv = this.datacollection;\n\n if (!dv) return null;\n\n const userCol = baseView.getUserField();\n const commentCol = baseView.getCommentField();\n const dateCol = baseView.getDateField();\n\n if (!userCol || !commentCol) return null;\n\n const userColName = userCol.columnName;\n const commentColName = commentCol.columnName;\n const dateColName = dateCol ? dateCol.columnName : null;\n const dataObject = dv.getData();\n const dataList = [];\n\n dataObject.forEach((item, index) => {\n if (item[commentColName]) {\n const user = baseView.getUserData().find((user) => {\n return user.value === item[userColName];\n });\n const data = {\n id: item.id,\n user_id: user ? user.id : 0,\n date: item[dateColName] ? new Date(item[dateColName]) : null,\n default_date: new Date(item[\"created_at\"]),\n text: item[commentColName],\n };\n\n dataList.push(data);\n }\n });\n\n dataList.sort(function (a, b) {\n if (dateColName)\n return new Date(a.date).getTime() - new Date(b.date).getTime();\n else\n return (\n new Date(a.default_date).getTime() -\n new Date(b.default_date).getTime()\n );\n });\n\n return dataList;\n }\n\n refreshComment() {\n const baseView = this.view;\n\n if (baseView.__refreshTimeout) clearTimeout(baseView.__refreshTimeout);\n\n this.busy();\n\n const ids = this.ids;\n\n baseView.__refreshTimeout = setTimeout(() => {\n const $comment = $$(ids.comment);\n\n if (!$comment) return;\n\n // clear comments\n const $commentList = $comment.queryView({ view: \"list\" });\n\n if ($commentList) $commentList.clearAll();\n\n // populate comments\n const commentData = this.getCommentData();\n\n if (commentData) {\n $comment.parse(commentData);\n }\n\n // scroll to the last item\n if ($commentList) $commentList.scrollTo(0, Number.MAX_SAFE_INTEGER);\n\n delete baseView.__refreshTimeout;\n\n this.ready();\n }, 90);\n }\n\n addComment(commentText, dateTime) {\n this.saveData(commentText, dateTime);\n }\n\n async updateComment(rowId, commentText) {\n const baseView = this.view;\n const model = baseView.model();\n\n if (!model) return; // already notified\n\n const commentField = baseView.getCommentField();\n\n if (!commentField) return; // already notified\n\n const values = {};\n\n values[commentField.columnName] = commentText ?? \"\";\n\n return await model.update(rowId, values);\n }\n\n async deleteComment(rowId) {\n const baseView = this.view;\n const model = baseView.model();\n\n if (!model) return;\n\n return await model.delete(rowId);\n }\n\n busy() {\n const ids = this.ids;\n const $comment = $$(ids.comment);\n\n if (!$comment) return;\n\n const $commentList = $comment.queryView({ view: \"list\" });\n\n if (!$commentList) return;\n\n $commentList.disable();\n\n if ($commentList.showProgress)\n $commentList.showProgress({ type: \"icon\" });\n }\n\n ready() {\n const ids = this.ids;\n const $comment = $$(ids.comment);\n\n if (!$comment) return;\n\n const $commentList = $comment.queryView({ view: \"list\" });\n\n if (!$commentList) return;\n\n $commentList.enable();\n\n if ($commentList.hideProgress) $commentList.hideProgress();\n }\n\n async saveData(commentText, dateTime) {\n if (!commentText) return;\n\n const dv = this.datacollection;\n\n if (!dv) return;\n\n const baseView = this.view;\n const model = baseView.model();\n const ab = this.AB;\n\n if (!model) {\n ab.notify.builder(\n {},\n {\n message:\n \"ABViewComment.saveData(): could not pull a model to work with.\",\n viewName: baseView.label,\n }\n );\n\n return;\n }\n\n const comment = {};\n const userField = baseView.getUserField();\n\n if (userField) comment[userField.columnName] = ab.Account.username();\n\n const commentField = baseView.getCommentField();\n\n if (commentField) comment[commentField.columnName] = commentText;\n\n const dateField = baseView.getDateField();\n\n if (dateField) comment[dateField.columnName] = dateTime;\n\n // add parent cursor to default\n const dvLink = dv.datacollectionLink;\n\n if (dvLink?.getCursor()) {\n const objectLink = dvLink.datasource;\n const fieldLink = dv.fieldLink;\n\n if (objectLink && fieldLink) {\n comment[fieldLink.columnName] = {};\n comment[fieldLink.columnName][objectLink.PK()] =\n dvLink.getCursor().id;\n }\n }\n\n return await model.create(comment);\n }\n};\n","/**\n * ABViewComponent\n * A common UI component class for our UI widgets.\n */\nimport ClassUI from \"../../../../ui/ClassUI\";\n\nexport default class ABViewComponent extends ClassUI {\n constructor(baseView, idBase, ids) {\n super(idBase || `ABView_${baseView.id}`, ids);\n\n this.view = baseView;\n this.settings = baseView.settings;\n this.AB = baseView.AB;\n this.datacollection = baseView.datacollections || baseView.datacollection;\n\n this.__events = [];\n // {array}\n // A collection of any listeners we are managing.\n // {\n // emitter: {EventEmitter} the object we are listening on\n // eventName: {string} the event key we are listening for\n // listener: {fn} the function to call on\n // }\n\n this.CurrentObjectID = null;\n // {string}\n // the ABObject.id of the object we are working with.\n\n this.CurrentDatacollectionID = null;\n // {string}\n // the ABDataCollection.id of the DC we are working with\n }\n\n /**\n * @method CurrentObject()\n * A helper to return the current ABObject we are working with.\n * @return {ABObject}\n */\n get CurrentObject() {\n return this.AB.objectByID(this.CurrentObjectID);\n }\n /**\n * @method CurrentDatacollection()\n * A helper to return the current ABDataCollection we are working with.\n * @return {ABDataCollection}\n */\n get CurrentDatacollection() {\n return this.AB.datacollectionByID(this.CurrentDatacollectionID);\n }\n\n ui(uiComponents = []) {\n // an ABView is a collection of rows:\n const _ui = {\n id: this.ids.component,\n view: \"layout\",\n type: \"space\",\n rows: uiComponents,\n };\n\n // if this form is empty, then force a minimal row height\n // so the component isn't completely hidden on the screen.\n // (important in the editor so we don't loose the ability to edit the\n // component)\n if (!_ui.rows.length) _ui.height = 30;\n\n return _ui;\n }\n\n async init(AB) {\n this.AB = AB;\n }\n\n /**\n * @method datacollectionLoad\n *\n * @param datacollection {ABDatacollection}\n */\n datacollectionLoad(datacollection) {\n this.CurrentDatacollectionID = datacollection?.id;\n }\n\n objectLoad(object) {\n this.CurrentObjectID = object?.id;\n }\n\n /**\n * @method eventAdd()\n * Create a new listener on an object. Note, this will prevent multiple\n * listeners being applied to the same Object.\n * @param {object} evt\n * The definition of the event we are adding:\n * {\n * emitter: {EventEmitter} the object we are listening on\n * eventName: {string} the event key we are listening for\n * listener: {fn} the function to call on\n * }\n */\n eventAdd(evt) {\n if (!evt || !evt.emitter || !evt.listener) return;\n\n // make sure we haven't done this before:\n const __events = this.__events;\n const exists = __events.filter(\n (e) => e.emitter === evt.emitter && e.eventName === evt.eventName\n // && e.listener === evt.listener\n );\n\n if (!exists.length) {\n // add to array\n __events.push({\n emitter: evt.emitter,\n eventName: evt.eventName,\n listener: evt.listener,\n });\n\n // listening this event\n evt.emitter.on(evt.eventName, evt.listener);\n }\n }\n\n /**\n * @method eventsClear()\n * Remove all the attached event listeners and reset our tracking.\n */\n eventsClear() {\n this.__events.forEach((evt) => {\n evt.emitter.removeListener(evt.eventName, evt.listener);\n });\n\n this.__events = [];\n }\n\n /**\n * @method waitInitializingDCEvery()\n * Wait until the DC is initialized, checking every millisecond as specified by the parameter\n * @param {number} milliSeconds\n * The amount of milliseconds to recheck DC status.\n * @param {object} dc\n * the AB DC instance.\n */\n\n async waitInitializingDCEvery(milliSeconds, dc) {\n if (!this.__isShowing || dc == null) return;\n // if we manage a datacollection, then make sure it has started\n // loading it's data when we are showing our component.\n // load data when a widget is showing\n if (dc.dataStatus === dc.dataStatusFlag.notInitial) await dc.loadData();\n\n return await new Promise((resolve) => {\n if (dc.dataStatus === dc.dataStatusFlag.initialized) {\n resolve();\n\n return;\n }\n\n const interval = setInterval(() => {\n if (dc.dataStatus === dc.dataStatusFlag.initialized) {\n clearInterval(interval);\n\n resolve();\n }\n }, milliSeconds);\n });\n }\n\n /**\n * @method onShow()\n * perform any preparations necessary when showing this component.\n */\n onShow() {\n // check if tab has a hint\n if (this?.view?.settings?.hintID) {\n // fetch the steps for the hint\n let hint = this.AB.hintID(this.view.settings.hintID);\n if (hint.settings.active) {\n hint.createHintUI();\n }\n }\n // if we manage a datacollection, then make sure it has started\n // loading it's data when we are showing our component.\n const dc = this.datacollection;\n\n if (!dc) return;\n\n if (Array.isArray(dc)) {\n dc.forEach((item) => {\n if (item.dataStatus === item.dataStatusFlag.notInitial)\n // load data when a widget is showing\n item.loadData();\n });\n } else {\n if (dc.dataStatus === dc.dataStatusFlag.notInitial)\n // load data when a widget is showing\n dc.loadData();\n }\n }\n}\n","const ABViewContainerComponent = require(\"./ABViewContainerComponent\");\n\nmodule.exports = class ABViewConditionalContainerComponent extends (\n ABViewContainerComponent\n) {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewConditionalContainer_${baseView.id}`,\n Object.assign(\n {\n batch: \"\",\n },\n ids\n )\n );\n\n this._ifComponent = null;\n this._elseComponent = null;\n\n // Set filter value\n this.__filterComponent = baseView.AB.filterComplexNew(\n `${baseView.id}_filterComponent`\n );\n // this.__filterComponent.applicationLoad(application);\n this.populateFilterComponent();\n }\n\n ui() {\n const _uiConditionalContainer = {\n id: this.ids.batch,\n view: \"multiview\",\n cells: [\n {\n batch: \"wait\",\n view: \"layout\",\n rows: [\n {\n view: \"label\",\n label: this.label(\"Please wait...\"),\n },\n ],\n },\n ],\n };\n const _ui = super.ui([_uiConditionalContainer]);\n\n _uiConditionalContainer.cells.push(\n Object.assign({ batch: \"if\" }, this.ifComponent.ui()),\n Object.assign({ batch: \"else\" }, this.elseComponent.ui())\n );\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB, accessLevel) {\n await super.init(AB, accessLevel);\n\n await Promise.all([\n this.ifComponent.init(AB, accessLevel),\n this.elseComponent.init(AB, accessLevel),\n ]);\n\n this.populateFilterComponent();\n\n const dc = this.datacollection;\n\n if (dc) {\n const baseView = this.view;\n\n // listen DC events\n baseView.eventAdd({\n emitter: dc,\n eventName: \"loadData\",\n listener: () => this.displayView(), // Q? does this need to remain empty param?\n });\n\n baseView.eventAdd({\n emitter: dc,\n eventName: \"initializedData\",\n listener: () => this.displayView(), // Q? does this need to remain empty param?\n });\n\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n baseView.eventAdd({\n emitter: dc,\n eventName: key,\n listener: (...p) => this.displayView(...p),\n });\n });\n }\n\n this.displayView();\n }\n\n onShow() {\n super.onShow();\n\n this.populateFilterComponent();\n this.displayView();\n }\n\n get ifComponent() {\n return (this._ifComponent =\n this._ifComponent ||\n this.view\n .views()\n .find((v) => v?.name === \"If\")\n .component());\n }\n\n get elseComponent() {\n return (this._elseComponent =\n this._elseComponent ||\n this.view\n .views()\n .find((v) => v?.name === \"Else\")\n .component());\n }\n\n displayView(currData) {\n const dc = this.datacollection;\n const ids = this.ids;\n const $batch = $$(ids.batch);\n\n if (dc) {\n if (!currData) currData = dc.getCursor();\n\n // show 'waiting' panel\n if (\n !currData &&\n (dc.dataStatus === dc.dataStatusFlag.notInitial ||\n dc.dataStatus === dc.dataStatusFlag.initializing)\n ) {\n $batch?.showBatch(\"wait\");\n\n return;\n }\n }\n\n const isValid = this.__filterComponent.isValid(currData);\n\n if (isValid) {\n // if (isValid && currData) {\n $batch?.showBatch(\"if\");\n this.ifComponent?.onShow?.();\n } else {\n $batch?.showBatch(\"else\");\n this.elseComponent?.onShow?.();\n }\n }\n\n populateFilterComponent() {\n const dc = this.datacollection;\n const __filterComponent = this.__filterComponent;\n\n if (dc?.datasource) __filterComponent.fieldsLoad(dc.datasource.fields());\n else __filterComponent.fieldsLoad([]);\n\n __filterComponent.setValue(\n this.settings.filterConditions ??\n this.view.constructor.defaultValues().filterConditions\n );\n }\n};\n","import ABViewComponent from \"./ABViewComponent\";\n\nexport default class ABViewConnectDataFilterComponent extends ABViewComponent {\n constructor(baseView, idbase, ids) {\n super(\n baseView,\n idbase || `ABViewConnectDataFilter_${baseView.id}`,\n Object.assign(\n {\n filter: \"\",\n reset: \"\",\n },\n ids\n )\n );\n\n this.field = null;\n }\n\n ui() {\n const ids = this.ids;\n const _ui = super.ui([\n {\n type: \"space\",\n borderless: true,\n cols: [\n {\n view: \"icon\",\n icon: \"fa fa-filter\",\n align: \"left\",\n disabled: true,\n },\n {\n view: \"combo\",\n id: ids.filter,\n labelWidth: this.AB.UISettings.config().labelWidthXLarge,\n disabled: true,\n on: {\n onChange: (id) => this.applyConnectFilter(id),\n },\n },\n {\n view: \"icon\",\n id: ids.reset,\n icon: \"fa fa-times\",\n align: \"left\",\n disabled: true,\n tooltip: this.label(\"Renmove this filter\"),\n on: {\n onItemClick: () => this.resetConnectFilter(),\n },\n },\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const dv = this.datacollection;\n\n if (!dv) return;\n\n const object = dv.datasource;\n\n if (!object) return;\n\n const [field] = object.fields(\n (f) => f.columnName === this.settings.field\n );\n\n if (!field) {\n this.AB.notify.developer(\n `Cannot find field \"${this.settings.field}\" in ${object.name}`,\n {\n context: \"ABViewConnectDataFilterComponent.init()\",\n data: { settings: this.settings },\n }\n );\n\n return;\n }\n\n this.field = field;\n\n const ids = this.ids;\n const suggest = webix.ui({\n view: \"suggest\",\n filter: ({ value }, search) =>\n value.toLowerCase().includes(search.toLowerCase()),\n on: {\n onShow: () => {\n field.populateOptionsDataCy($$(ids.filter), field, {});\n },\n },\n });\n field.getAndPopulateOptions(suggest, null, field);\n\n const $filter = $$(ids.filter);\n\n $filter.define(\"suggest\", suggest);\n $filter.define(\"label\", `${this.label(\"Filter by\")} ${field.label}`);\n $filter.enable();\n $filter.refresh();\n }\n\n resetConnectFilter() {\n const ids = this.ids;\n const dc = this.datacollection;\n\n dc.filterCondition({ glue: \"and\", rules: [] });\n dc.reloadData();\n // Block applyConnectFields() from triggering\n\n const $filter = $$(ids.filter);\n\n $filter.blockEvent();\n $filter.setValue();\n $filter.unblockEvent();\n $$(ids.reset).disable();\n }\n\n applyConnectFilter(connectId) {\n const filterRule = {\n key: this.field.id,\n rule: \"equals\",\n value: connectId,\n };\n const dc = this.datacollection;\n\n dc.filterCondition({ glue: \"and\", rules: [filterRule] });\n dc.reloadData();\n $$(this.ids.reset).enable();\n }\n}\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewContainerComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewContainer_${baseView.id}`, ids);\n\n this.idBase = idBase;\n this.options = null;\n\n this.viewComponents = {\n /* view.id : {viewComponent} */\n };\n // {hash}\n // a reference of all our child views that we manage\n\n this.viewComponentIDs = {\n /* view.id : {viewComponent} */\n };\n // {hash}\n // a reference of all our child.ui().ids of the views we manage\n\n this._handlerChangePage = (pageId) => {\n baseView.changePage(pageId);\n };\n }\n\n ui(uiComponents) {\n // Generate rows & cols of views to .layout\n const views = this.view.viewsSortByPosition();\n const rowViews = this.getElements(views);\n const _ui = super.ui(uiComponents || rowViews);\n\n delete _ui.type;\n\n return _ui;\n }\n\n // make sure each of our child views get .init() called\n async init(AB, accessLevel = 0, options = {}) {\n await super.init(AB);\n\n this.options = options;\n\n const allInits = [];\n\n // // register our callbacks:\n // if (options) {\n // for (var c in _logic.callbacks) {\n // _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n // }\n // }\n\n // see access by CSS class\n $$(this.ids.component)?.define(\"css\", `accessLevel-${accessLevel}`);\n\n const viewComponents = this.viewComponents;\n\n // attach all the .UI views:\n for (const key in viewComponents) {\n // skip when the view is removed.\n if (\n !viewComponents[key] ??\n !this.view.views((v) => v.id === key).length\n )\n continue;\n\n // Initial component along with options in case there are callbacks we need to listen for\n if (accessLevel) {\n allInits.push(viewComponents[key].init(AB, accessLevel, options));\n\n continue;\n }\n\n $$(this.viewComponentIDs[key])?.hide();\n }\n\n await Promise.all(allInits);\n }\n\n getElements(views) {\n const rows = [];\n const componentMap = {};\n\n let curRowIndex;\n let curColIndex;\n\n const settings = this.settings;\n const defaultSettings = this.view.constructor.defaultValues();\n\n views.forEach((v) => {\n // let component = v.component(/* App, idPrefix */);\n // NOTE: PONG - Just temporary to be compatible old & new versions\n let component;\n\n try {\n component = v.component(this.idBase);\n // make sure any existing handlers for changePage are removed.\n v.removeAllListeners(\"changePage\");\n } catch (err) {\n component = v.component(this.idBase);\n\n const ui = component.ui;\n\n component.ui = (() => ui).bind(component);\n }\n\n this.viewComponents[v.id] = component;\n\n ////\n //// TODO: figure out the embedded Callbacks => emit()\n ////\n // if key == \"form\" or \"button\" register the callbacks to the parent\n // NOTE this will only work on the last form of a page!\n // if (v.key == \"form\" && v._logic.callbacks) {\n // _logic.callbacks = v._logic.callbacks;\n // }\n\n // Create a new row\n if (v.position.y == null || v.position.y !== curRowIndex) {\n curRowIndex = v.position.y || rows.length;\n curColIndex = 0;\n\n const rowNew = {\n cols: [],\n };\n\n // Create columns following setting value\n const colNumber = settings.columns || defaultSettings.columns;\n\n for (let i = 0; i < colNumber; i++)\n rowNew.cols.push({\n gravity: settings.gravity?.[i]\n ? parseInt(settings.gravity[i])\n : defaultSettings.gravity,\n });\n\n rows.push(rowNew);\n }\n\n // Get the last row\n const rowIndx = rows.length - 1;\n const curRow = rows[rowIndx];\n const newPos = v.position.x ?? 0;\n const mapKey = `${rowIndx}-${newPos}`;\n\n let getGrav = 1;\n\n if (componentMap[mapKey])\n console.error(\n `Component[${component?.ids?.component}] is overwriting component[${componentMap[mapKey].ids?.component}]. <-- Reorder them to fix.`\n );\n\n componentMap[mapKey] = component;\n\n if (curRow.cols[newPos]?.gravity)\n getGrav = curRow.cols[newPos].gravity;\n\n const _ui = component.ui();\n\n this.viewComponentIDs[v.id] = _ui.id;\n _ui.gravity = getGrav;\n\n // Add ui of sub-view to column\n curRow.cols[newPos] = _ui;\n\n // Trigger 'changePage' event to parent\n this.eventAdd({\n emitter: v,\n eventName: \"changePage\",\n listener: this._handlerChangePage,\n });\n\n curColIndex++;\n });\n\n return rows;\n }\n\n onShow() {\n super.onShow();\n\n // calll .onShow in child components\n Object.values(this.viewComponents).forEach((val) => {\n val.onShow?.();\n });\n }\n};\n","import ABViewComponent from \"./ABViewComponent\";\nimport ABPopupSortField from \"../ABViewGridPopupSortFields\";\nimport ABViewCustomFilter from \"../viewProperties/ABViewPropertyFilterData\";\nimport _ from \"lodash\";\n\nexport default class ABViewDataFilterComponent extends ABViewComponent {\n constructor(baseView, idbase, ids) {\n super(\n baseView,\n idbase || `ABViewDataFilter_${baseView.id}`,\n Object.assign(\n {\n filter: \"\",\n reset: \"\",\n sortButton: \"\",\n filterButton: \"\",\n globalSearchToolbar: \"\",\n },\n ids\n )\n );\n\n this._handler_filterData = (fnFilter, filterRules) => {\n this.callbackFilterData(fnFilter, filterRules); // be notified when there is a change in the filter\n };\n\n this.field = null;\n const ab = this.AB;\n\n // {ABViewGridPopupSortFields}\n // The popup for adding sort criteria to our grid.\n this.PopupSortComponent = new ABPopupSortField(\n `ABViewDataFilter_Sort_Popup_${this.settings.dataviewID}`\n );\n this.PopupSortComponent.init(ab);\n this.PopupSortComponent.on(\"changed\", (sortOptions) => {\n this.callbackSortData(sortOptions);\n });\n\n this.filterHelper = new ABViewCustomFilter(\n this.AB,\n `ABViewDataFilter_Filter_Popup_${this.settings.dataviewID}`\n );\n this.filterHelper.settings = {\n filterOption: 1,\n userFilterPosition: \"toolbar\",\n isGlobalToolbar: 1,\n };\n this.filterHelper.init(ab);\n this.detatch();\n this.filterHelper.on(\"filter.data\", this._handler_filterData);\n }\n\n advancedUI() {\n const compId = this.ids.component;\n return [\n {\n css: \"bg_gray\",\n maxHeight: 60,\n rows: [\n {},\n {\n cols: [\n {\n width: 18,\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-filter\",\n width: 40,\n id: this.ids.filterButton,\n css: `webix_primary abFilterButton${this.settings.dataviewID}`,\n click: (id, event) => {\n this.toolbarFilter($$(this.ids.filterButton).$view);\n },\n on: {\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `${compId} filter button`\n );\n },\n },\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-sort\",\n width: 40,\n id: this.ids.sortButton,\n css: `webix_primary abSortButton${this.settings.dataviewID}`,\n click: (id, event) => {\n this.openSort($$(this.ids.sortButton).$view);\n },\n on: {\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `${compId} sort button`\n );\n },\n },\n },\n {\n id: this.ids.globalSearchToolbar,\n view: \"search\",\n placeholder: this.label(\"Search..\"),\n css: `abGlobalSearchField${this.settings.dataviewID}`,\n width: 0,\n attributes: {\n \"data-cy\": `${this.ids.component} global search`,\n datacollection: this.settings.dataviewID,\n },\n on: {\n onTimedKeyPress: () => {\n const searchText = $$(\n this.ids.globalSearchToolbar\n ).getValue();\n // store search text in datacollection because\n // it is shared amoung the similar filterHelpers\n const dc = this.datacollection;\n dc.settings.objectWorkspace.searchText =\n searchText;\n\n this.filterHelper.externalSearchText(searchText);\n },\n },\n },\n {\n width: 18,\n },\n ],\n },\n {},\n ],\n },\n ];\n }\n\n connectedFieldUI() {\n return [\n {\n css: \"bg_gray\",\n maxHeight: 60,\n cols: [\n {\n width: 18,\n },\n {\n rows: [\n {},\n {\n view: \"abslayout\",\n cells: [\n {\n css: \"bg_gray\",\n view: \"combo\",\n id: this.ids.filter,\n labelWidth: 0,\n relative: true,\n disabled: true,\n on: {\n onChange: (id) => {\n this.applyConnectFilter(\n $$(this.ids.filter).getList().getItem(id)\n );\n },\n },\n },\n {\n view: \"icon\",\n id: this.ids.reset,\n icon: \"fa fa-times\",\n right: 24,\n top: 7,\n width: 24,\n height: 24,\n hidden: true,\n tooltip: this.label(\"Remove this filter\"),\n on: {\n onItemClick: () =>\n $$(this.ids.filter).setValue(),\n },\n },\n ],\n },\n {},\n ],\n },\n {\n width: 18,\n },\n ],\n },\n ];\n }\n\n ui() {\n if (\n !this.settings?.dataviewID ||\n (this.settings?.viewType !== \"advanced\" && !this.settings?.field)\n )\n return { height: 1, id: this.ids.component };\n\n const ui =\n this.settings.viewType == \"advanced\"\n ? this.advancedUI()\n : this.connectedFieldUI();\n const _ui = super.ui(ui);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const dv = this.datacollection;\n\n if (!dv) return;\n\n const object = dv.datasource;\n\n if (!object) return;\n\n if (this.settings.viewType == \"advanced\") {\n if (this.settings.showSort) {\n this.PopupSortComponent.objectLoad(object);\n // if there are some preset sorts show them to user\n this.PopupSortComponent.setSettings(\n dv?.settings?.objectWorkspace?.sortFields\n );\n } else {\n $$(this.ids.sortButton).hide();\n }\n if (this.settings.showFilter) {\n this.filterHelper.objectLoad(object);\n } else {\n $$(this.ids.filterButton).hide();\n }\n } else if (this.settings.viewType == \"connected\") {\n const [field] = object.fields(\n (f) => f.columnName === this.settings.field\n );\n\n if (!field) {\n this.AB.notify.developer(\n `Cannot find field \"${this.settings.field}\" in ${object.name}`,\n {\n context: \"ABViewDataFilterComponent.init()\",\n data: { settings: this.settings },\n }\n );\n\n return;\n }\n\n this.field = field;\n\n const ids = this.ids;\n const suggest = webix.ui({\n view: \"suggest\",\n filter: ({ value }, search) =>\n value.toLowerCase().includes(search.toLowerCase()),\n on: {\n onShow: () => {\n field.populateOptionsDataCy($$(ids.filter), field, {});\n },\n },\n showAllOptions: true,\n });\n field.getAndPopulateOptions(suggest, null, field);\n\n const $filter = $$(ids.filter);\n\n $filter.define(\"suggest\", suggest);\n $filter.define(\n \"placeholder\",\n `${this.label(\"Filter by\")} ${field.label}`\n );\n $filter.enable();\n $filter.refresh();\n }\n }\n\n onShow() {\n super.onShow();\n this.updateUI();\n }\n\n applyConnectFilter(rowData) {\n let connectedVal = rowData?.id ?? null;\n\n if (\n connectedVal &&\n this.field.settings?.isCustomFK &&\n this.field.settings?.isSource\n ) {\n connectedVal =\n (this.field.indexField\n ? rowData[this.field.indexField.columnName]\n : null) ?? // custom index\n (this.field.indexField2\n ? rowData[this.field.indexField2.columnName]\n : null) ?? // custom index 2\n rowData.id ??\n rowData;\n }\n\n let filterRule = [];\n if (connectedVal) {\n $$(this.ids.reset).show();\n filterRule = [\n {\n key: this.field.id,\n rule: \"equals\",\n value: connectedVal,\n },\n ];\n } else {\n $$(this.ids.reset).hide();\n }\n const dc = this.datacollection;\n\n dc.filterCondition({ glue: \"and\", rules: filterRule });\n dc.reloadData();\n }\n\n openSort($view) {\n this.PopupSortComponent.show($view);\n }\n\n /**\n * @method callbackSortData()\n * Process the provided sort options from our sort ui.\n * @param {array} sortRules\n * Any Sort Rules added by the user.\n */\n async callbackSortData(sortRules = []) {\n const dc = this.datacollection;\n if (!_.isEqual(dc?.settings?.objectWorkspace?.sortFields, sortRules)) {\n dc.settings.objectWorkspace.sortFields = sortRules;\n await this.datacollection.reloadData();\n }\n this.updateUI();\n }\n\n /**\n * @method callbackFilterData()\n * Process the provided filter options from our filterHelper.\n * @param {fn} fnFilter\n * A function that returns true/false for each row of data\n * to determine if is should exist.\n * @param {array} filterRules\n * Any Filter Rules added by the user.\n */\n callbackFilterData(fnFilter, filterRules = []) {\n const dc = this.datacollection;\n if (!_.isEqual(dc?.__filterCond, filterRules)) {\n dc.filterCondition(filterRules);\n dc.reloadData();\n this.updateUI();\n }\n }\n\n toolbarFilter($view) {\n this.filterHelper.showPopup($view);\n }\n\n updateUI() {\n const dc = this.datacollection;\n\n if (!dc) return;\n\n var filterButtons = document.getElementsByClassName(\n `abFilterButton${this.settings.dataviewID}`\n );\n\n const onlyFilterRules = this.filterHelper.filterRules();\n let filterBadge =\n onlyFilterRules?.rules?.length > 0\n ? onlyFilterRules?.rules?.length\n : null;\n for (let b of filterButtons) {\n $$(b).define(\"badge\", filterBadge);\n $$(b).refresh();\n }\n\n var sortButtons = document.getElementsByClassName(\n `abSortButton${this.settings.dataviewID}`\n );\n\n const onlySortRules = dc.settings.objectWorkspace.sortFields;\n let sortBadge = onlySortRules?.length > 0 ? onlySortRules?.length : null;\n\n for (let b of sortButtons) {\n $$(b).define(\"badge\", sortBadge);\n $$(b).refresh();\n }\n\n var searchFields = document.getElementsByClassName(\n `abGlobalSearchField${this.settings.dataviewID}`\n );\n\n const searchText = dc.settings.objectWorkspace.searchText;\n if (searchText != null) {\n for (let s of searchFields) {\n var activeElement = document.activeElement;\n if (\n activeElement?.attributes?.datacollection?.value ==\n this.settings.dataviewID &&\n activeElement == s.getElementsByTagName(\"input\")[0]\n ) {\n // skip the already selected input\n } else {\n $$(s).setValue(searchText);\n }\n }\n }\n }\n\n detatch() {\n this.filterHelper.removeListener(\"filter.data\", this._handler_filterData);\n // this.datacollection?.removeListener(\"changeCursor\", this.handler_select);\n }\n}\n","import ABViewComponent from \"./ABViewComponent\";\nexport default class ABViewDataSelectComponent extends ABViewComponent {\n constructor(baseView, idbase, ids) {\n super(\n baseView,\n idbase || `ABViewDataSelect_${baseView.id}`,\n Object.assign(\n {\n select: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const _ui = super.ui([\n {\n view: \"combo\",\n id: this.ids.select,\n on: {\n onChange: (n, o) => {\n if (n !== o) this.cursorChange(n);\n },\n },\n },\n ]);\n delete _ui.type;\n\n return _ui;\n }\n\n async onShow() {\n super.onShow();\n const dc = this.datacollection;\n if (!dc) return;\n await dc.waitReady();\n const labelField = this.AB.definitionByID(\n this.settings.labelField\n )?.columnName;\n const options = dc\n .getData()\n .map((o) => ({ id: o.id, value: o[labelField] }))\n .sort((a, b) => (a.value > b.value ? 1 : -1));\n const $select = $$(this.ids.select);\n $select.define(\"options\", options);\n $select.refresh();\n $select.setValue(dc.getCursor().id);\n }\n\n cursorChange(n) {\n this.datacollection.setCursor(n);\n }\n}\n","const ABViewComponent = require(\"./ABViewComponent\").default;\nconst ABViewDetailComponent = require(\"./ABViewDetailComponent\");\nconst ABViewPropertyLinkPage =\n require(\"../viewProperties/ABViewPropertyLinkPage\").default;\n\nmodule.exports = class ABViewDataviewComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewDataview_${baseView.id}`,\n Object.assign(\n {\n dataview: \"\",\n reload: \"\",\n },\n ids\n )\n );\n\n this.linkPage = null;\n }\n\n ui() {\n // NOTE: need to initial the detail component here\n // because its dom width & height values are used .template function\n this.initDetailComponent();\n\n const ids = this.ids;\n const L = (...params) => (this.AB ?? AB).Multilingual.label(...params);\n const _ui = super.ui([\n {\n view: \"layout\",\n rows: [\n {\n id: ids.reload,\n view: \"button\",\n value: L(\"New data available. Click to reload.\"),\n css: \"webix_primary webix_warn\",\n hidden: true,\n click: (id, event) => {\n this.reloadData();\n },\n },\n {\n id: ids.dataview,\n view: \"dataview\",\n scroll: \"y\",\n sizeToContent: true,\n css: \"borderless transparent\",\n xCount: this.settings.xCount != 1 ? this.settings.xCount : 0,\n height: this.settings.height,\n template: (item) => this.itemTemplate(item),\n on: {\n onAfterRender: () => {\n this.applyClickEvent();\n this.addCyAttribute();\n },\n },\n },\n ],\n },\n ]);\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const dc = this.datacollection;\n if (!dc) return;\n\n // Initial the link page helper\n this.linkPage = this.linkPageHelper.component();\n this.linkPage.init({\n view: this.view,\n datacollection: dc,\n });\n\n const ids = this.ids;\n const $dataView = $$(ids.dataview);\n AB.Webix.extend($dataView, AB.Webix.ProgressBar);\n dc.bind($dataView);\n\n this.initRefreshWarning();\n\n window.addEventListener(\"resize\", () => {\n clearTimeout(this._resizeEvent);\n this._resizeEvent = setTimeout(() => {\n this.resize($dataView.getParentView());\n delete this._resizeEvent;\n }, 20);\n });\n }\n\n /**\n * @method initRefreshWarning\n *\n */\n initRefreshWarning() {\n const dc = this.datacollection;\n const includeInQuery =\n (dc?.settings?.objectWorkspace?.filterConditions?.rules ?? []).filter(\n (r) =>\n [\n \"in_query\",\n \"not_in_query\",\n \"in_query_field\",\n \"not_in_query_field\",\n ].includes(r.rule)\n ).length > 0;\n\n if (!includeInQuery) return;\n [\n \"ab.datacollection.create\",\n \"ab.datacollection.update\",\n \"ab.datacollection.delete\",\n ].forEach((eventKey) => {\n dc.on(eventKey, (data) => {\n if (data.objectId == dc.datasource.id)\n this.showRefreshWarning(data);\n });\n });\n }\n\n showRefreshWarning() {\n if (this.__throttleRefreshWarning)\n clearTimeout(this.__throttleRefreshWarning);\n\n this.__throttleRefreshWarning = setTimeout(() => {\n $$(this.ids.reload)?.show();\n }, 200);\n }\n\n reloadData() {\n const dc = this.datacollection;\n dc?.reloadData();\n\n $$(this.ids.reload)?.hide();\n }\n\n onShow() {\n super.onShow();\n\n this.resize();\n }\n\n resize(base_element) {\n const $dataview = $$(this.ids.dataview);\n if (!$dataview) {\n // Not sure if its a problem so notify\n this.AB.notify.developer(\n new Error(\"Resize called on missing dataview component\"),\n { context: \"ABViewDataviewComponent.resize()\", ids: this.ids }\n );\n return;\n }\n $dataview.resize();\n\n const item_width = this.getItemWidth(base_element);\n $dataview.customize({ width: item_width });\n $dataview.getTopParentView?.().resize?.();\n }\n\n initDetailComponent() {\n const detailUI = this.getDetailUI();\n this._detail_ui = this.AB.Webix.ui(detailUI);\n\n // 2 - Always allow access to components inside data view\n this.detailComponent.init(null, 2);\n }\n\n getDetailUI() {\n const detailCom = this.detailComponent;\n const editPage = this.settings.editPage;\n const detailsPage = this.settings.detailsPage;\n\n const _ui = detailCom.ui();\n // adjust the UI to make sure it will look like a \"card\"\n _ui.type = \"clean\";\n _ui.css = \"ab-detail-view\";\n\n if (detailsPage || editPage) {\n _ui.css += ` ab-detail-hover ab-record-#itemId#`;\n\n if (detailsPage) _ui.css += \" ab-detail-page\";\n if (editPage) _ui.css += \" ab-edit-page\";\n }\n\n return _ui;\n }\n\n itemTemplate(item) {\n const detailCom = this.detailComponent;\n const $dataview = $$(this.ids.dataview);\n const $detail_item = this._detail_ui;\n\n // Mock up data to initialize height of item\n if (!item || !Object.keys(item).length) {\n item = item ?? {};\n this.datacollection?.datasource?.fields().forEach((f) => {\n switch (f.key) {\n case \"string\":\n case \"LongText\":\n item[f.columnName] = \"Lorem Ipsum\";\n break;\n case \"date\":\n case \"datetime\":\n item[f.columnName] = new Date();\n break;\n case \"number\":\n item[f.columnName] = 7;\n break;\n }\n });\n }\n detailCom.displayData(item);\n\n const itemWidth =\n $dataview.data.count() > 0\n ? $dataview.type.width\n : ($detail_item.$width - 20) / this.settings.xCount;\n\n const itemHeight =\n $dataview.data.count() > 0\n ? $dataview.type.height\n : $detail_item.getChildViews()?.[0]?.$height;\n\n const tmp_dom = document.createElement(\"div\");\n tmp_dom.appendChild($detail_item.$view);\n\n $detail_item.define(\"width\", itemWidth - 24);\n $detail_item.define(\"height\", itemHeight + 15);\n $detail_item.adjust();\n\n // Add cy attributes\n this.addCyItemAttributes(tmp_dom, item);\n\n return tmp_dom.innerHTML.replace(/#itemId#/g, item.id);\n }\n\n getItemWidth(base_element) {\n const $dataview = $$(this.ids.dataview);\n\n let currElem = base_element ?? $dataview;\n let parentWidth = currElem?.$width;\n while (currElem) {\n if (\n currElem.config.view == \"scrollview\" ||\n currElem.config.view == \"layout\"\n )\n parentWidth =\n currElem?.$width < parentWidth ? currElem?.$width : parentWidth;\n\n currElem = currElem?.getParentView?.();\n }\n\n if (!parentWidth)\n parentWidth = $dataview?.getParentView?.().$width || window.innerWidth;\n\n if (parentWidth > window.innerWidth) parentWidth = window.innerWidth;\n\n // check if the browser window minus webix default padding is the same as the parent window\n // if so we need to check to see if there is a sidebar and reduce the usable space by the\n // width of the sidebar\n if (window.innerWidth - 19 <= parentWidth) {\n const $sidebar = this.getTabSidebar();\n if ($sidebar) {\n parentWidth -= $sidebar.$width;\n }\n }\n\n const recordWidth = Math.floor(parentWidth / this.settings.xCount);\n\n return recordWidth;\n }\n\n getTabSidebar() {\n const $dataview = $$(this.ids.dataview);\n let $sidebar;\n let currElem = $dataview;\n while (currElem && !$sidebar) {\n $sidebar = (currElem.getChildViews?.() ?? []).filter(\n (item) => item?.config?.view == \"sidebar\"\n )[0];\n\n currElem = currElem?.getParentView?.();\n }\n\n return $sidebar;\n }\n\n applyClickEvent() {\n const editPage = this.settings.editPage;\n const detailsPage = this.settings.detailsPage;\n if (!detailsPage && !editPage) return;\n\n const $dataview = $$(this.ids.dataview);\n if (!$dataview) return;\n\n $dataview.$view.onclick = (e) => {\n let clicked = false;\n let divs = e.path ?? [];\n\n // NOTE: Some web browser clients do not support .path\n if (!divs.length) {\n divs.push(e.target);\n divs.push(e.target.parentNode);\n }\n\n if (editPage) {\n for (let p of divs) {\n if (\n p.className &&\n p.className.indexOf(\"webix_accordionitem_header\") > -1\n ) {\n clicked = true;\n p.parentNode.parentNode.classList.forEach((c) => {\n if (c.indexOf(\"ab-record-\") > -1) {\n // var record = parseInt(c.replace(\"ab-record-\", \"\"));\n const record = c.replace(\"ab-record-\", \"\");\n this.linkPage.changePage(editPage, record);\n // com.logic.toggleTab(detailsTab, ids.component);\n }\n });\n break;\n }\n }\n }\n\n if (detailsPage && !clicked) {\n for (let p of divs) {\n if (\n p.className &&\n p.className.indexOf(\"webix_accordionitem\") > -1\n ) {\n p.parentNode.parentNode.classList.forEach((c) => {\n if (c.indexOf(\"ab-record-\") > -1) {\n // var record = parseInt(c.replace(\"ab-record-\", \"\"));\n const record = c.replace(\"ab-record-\", \"\");\n this.linkPage.changePage(detailsPage, record);\n // com.logic.toggleTab(detailsTab, ids.component);\n }\n });\n\n break;\n }\n }\n }\n };\n }\n\n addCyAttribute() {\n const baseView = this.view;\n const $dataview = $$(this.ids.dataview);\n const name = (baseView.name ?? \"\").replace(\".dataview\", \"\");\n\n $dataview.$view.setAttribute(\n \"data-cy\",\n `dataview container ${name} ${baseView.id}`\n );\n }\n\n addCyItemAttributes(dom, item) {\n const baseView = this.view;\n const uuid = item.uuid;\n const name = (baseView.name ?? \"\").replace(\".dataview\", \"\");\n dom.querySelector(\".webix_accordionitem_body\")?.setAttribute(\n \"data-cy\",\n `dataview item ${name} ${uuid} ${baseView.id}`\n );\n dom.querySelector(\".webix_accordionitem_button\")?.setAttribute(\n \"data-cy\",\n `dataview item button ${name} ${uuid} ${baseView.id}`\n );\n }\n\n get detailComponent() {\n return (this._detailComponent =\n this._detailComponent ??\n new ABViewDetailComponent(\n this.view,\n `${this.ids.component}_detail_view`\n ));\n }\n\n get linkPageHelper() {\n return (this.__linkPageHelper =\n this.__linkPageHelper || new ABViewPropertyLinkPage());\n }\n};\n","const ABViewDetailItemComponent = require(\"./ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailCheckboxComponent extends (\n ABViewDetailItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetailCheckbox_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field();\n\n return super.ui({\n on: {\n //Add data-cy attribute for Cypress Testing\n onAfterRender: () => {\n const dataCy = `detail checkbox ${field?.columnName} ${\n field?.id\n } ${baseView.parentDetailComponent()?.id ?? baseView.parent.id}`;\n\n $$(this.ids.detailItem)?.$view.setAttribute(\"data-cy\", dataCy);\n },\n },\n });\n }\n\n setValue(val) {\n let checkbox = \"\";\n\n // Check\n if (val && JSON.parse(val))\n checkbox =\n '';\n // Uncheck\n else checkbox = '';\n\n super.setValue(checkbox);\n }\n};\n","const ABObjectQuery = require(\"../../ABObjectQuery\");\nconst ABViewContainerComponent = require(\"./ABViewContainerComponent\");\n\nmodule.exports = class ABViewDetailComponent extends ABViewContainerComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetail_${baseView.id}`, ids);\n this.idBase = idBase;\n }\n\n ui() {\n let _ui = super.ui();\n\n // this wrapper allows the detail view to have a\n // card appearance as well as enables the edit and\n // details functions to work when clicked\n return {\n type: \"form\",\n id: this.ids.component,\n borderless: true,\n rows: [\n {\n body: _ui,\n },\n ],\n };\n }\n\n onShow() {\n const baseView = this.view;\n\n try {\n const dataCy = `Detail ${baseView.name?.split(\".\")[0]} ${baseView.id}`;\n\n $$(this.ids.component)?.$view.setAttribute(\"data-cy\", dataCy);\n } catch (e) {\n console.warn(\"Problem setting data-cy\", e);\n }\n\n // listen DC events\n const dv = this.datacollection;\n\n if (dv) {\n const currData = dv.getCursor();\n\n if (currData) this.displayData(currData);\n\n [\"changeCursor\", \"cursorStale\", \"collectionEmpty\"].forEach((key) => {\n this.eventAdd({\n emitter: dv,\n eventName: key,\n listener: (...p) => this.displayData(...p),\n });\n });\n\n this.eventAdd({\n emitter: dv,\n eventName: \"create\",\n listener: (createdRow) => {\n const currCursor = dv.getCursor();\n\n if (currCursor?.id === createdRow.id)\n this.displayData(createdRow);\n },\n });\n\n this.eventAdd({\n emitter: dv,\n eventName: \"update\",\n listener: (updatedRow) => {\n const currCursor = dv.getCursor();\n\n if (currCursor?.id === updatedRow.id)\n this.displayData(updatedRow);\n },\n });\n }\n\n super.onShow();\n }\n\n displayData(rowData = {}) {\n // make sure we have data to work with. If null is passed in\n // then pull current cursor.\n if (rowData == null) {\n rowData = this.datacollection.getCursor();\n }\n\n const views = (this.view.views() || []).sort((a, b) => {\n if (!a?.field?.() || !b?.field?.()) return 0;\n\n // NOTE: sort order of calculated fields.\n // FORMULA field type should be calculated before CALCULATE field type\n if (a.field().key === \"formula\" && b.field().key === \"calculate\")\n return -1;\n else if (a.field().key === \"calculate\" && b.field().key === \"formula\")\n return 1;\n\n return 0;\n });\n\n views.forEach((f) => {\n let val;\n\n if (f.field) {\n const field = f.field();\n\n if (!field) return;\n\n // get value of relation when field is a connect field\n switch (field.key) {\n case \"connectObject\":\n val = field.pullRelationValues(rowData);\n\n break;\n\n case \"list\":\n val = rowData?.[field.columnName];\n\n if (!val) {\n val = \"\";\n\n break;\n }\n\n if (field.settings.isMultiple === 0) {\n let myVal = \"\";\n\n field.settings.options.forEach((options) => {\n if (options.id === val) myVal = options.text;\n });\n\n if (field.settings.hasColors) {\n let myHex = \"#66666\";\n let hasCustomColor = \"\";\n\n field.settings.options.forEach((h) => {\n if (h.text === myVal) {\n myHex = h.hex;\n hasCustomColor = \"hascustomcolor\";\n }\n });\n\n myVal = `${myVal}`;\n }\n\n val = myVal;\n } else {\n const items = [];\n\n let myVal = \"\";\n\n val.forEach((value) => {\n let hasCustomColor = \"\";\n let optionHex = \"\";\n\n if (field.settings.hasColors && value.hex) {\n hasCustomColor = \"hascustomcolor\";\n optionHex = `background: ${value.hex};`;\n }\n\n field.settings.options.forEach((options) => {\n if (options.id === value.id) myVal = options.text;\n });\n items.push(\n `${myVal}`\n );\n });\n\n val = items.join(\"\");\n }\n\n break;\n\n case \"user\":\n val = field.pullRelationValues(rowData);\n\n break;\n\n case \"file\":\n val = rowData?.[field.columnName];\n\n if (!val) {\n val = \"\";\n\n break;\n }\n\n break;\n\n case \"formula\":\n if (rowData) {\n // const dv = this.datacollection;\n // const ds = dv ? dv.datasource : null;\n // const needRecalculate =\n // !ds || ds instanceof ABObjectQuery ? false : true;\n\n // NOTE: Could not to re-calculate because `__relation` data is extracted from full data at the moment\n // rowData.__relation format\n // {\n // id: \"string\"\n // text: \"string\"\n // translations: []\n // uuid: \"0cb52669-d626-4c9d-85ea-2d931751d0ce\"\n // value: \"LABEL\"\n // }\n const needRecalculate = false;\n\n val = field.format(rowData, needRecalculate);\n }\n\n break;\n\n default:\n val = field.format(rowData);\n // break;\n }\n }\n\n // set value to each components\n const vComponent = f.component(this.idBase);\n\n // vComponent?.onShow();\n\n vComponent?.setValue?.(val);\n vComponent?.displayText?.(rowData);\n });\n }\n};\n","const ABViewDetailItemComponent = require(\"./ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailConnectComponent extends (\n ABViewDetailItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetailConnect_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const settings = this.settings;\n\n return super.ui({\n on: {\n //Add data-cy attribute for Cypress Testing\n onAfterRender: () => {\n const columnName =\n baseView.field((fld) => fld.id === settings.fieldId)\n ?.columnName ?? \"\";\n const dataCy = `detail connected ${columnName} ${\n settings.fieldId\n } ${baseView.parentDetailComponent()?.id || baseView.parent.id}`;\n\n $$(this.ids.detailItem)?.$view.setAttribute(\"data-cy\", dataCy);\n },\n },\n });\n }\n\n setValue(val) {\n const vals = [];\n\n if (Array.isArray(val))\n val.forEach((record) => {\n vals.push(\n `${record.text}`\n );\n });\n else vals.push(`${val.text}`);\n\n super.setValue(vals.join(\"\"));\n }\n};\n","const ABViewDetailItemComponent = require(\"./ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailCustomComponent extends (\n ABViewDetailItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetailCustom_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field();\n const detailView = baseView.detailComponent();\n\n let template = field ? field.columnHeader().template({}) : \"\";\n\n return super.ui({\n minHeight: 45,\n height: 60,\n template,\n on: {\n //Add data-cy attribute for Cypress Testing\n onAfterRender: () => {\n const dataCy = `detail custom ${field?.columnName} ${\n field?.id\n } ${baseView.parentDetailComponent()?.id || baseView.parent.id}`;\n\n $$(this.ids.detailItem)?.$view.setAttribute(\"data-cy\", dataCy);\n },\n },\n });\n }\n\n onShow() {\n super.onShow();\n\n const baseView = this.view;\n const field = baseView.field();\n\n if (!field) return;\n\n const $detailItem = $$(this.ids.detailItem);\n\n if (!$detailItem) return;\n\n const detailCom = baseView.detailComponent(),\n rowData = detailCom.datacollection.getCursor() || {},\n node = $detailItem.$view;\n\n field.customDisplay(rowData, null, node, {\n editable: false,\n });\n // Hack: remove the extra webix_template class here, which adds padding so\n // the item is not alligned with the others\n node\n .getElementsByClassName(\"webix_template\")[1]\n ?.removeAttribute(\"class\");\n }\n\n setValue(val) {\n const field = this.view.field();\n\n if (!field) return;\n\n const $detailItem = $$(this.ids.detailItem);\n\n if (!$detailItem) return;\n\n const rowData = {};\n\n rowData[field.columnName] = val;\n\n field.setValue($detailItem, rowData);\n }\n};\n","const ABViewDetailItemComponent = require(\"./ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailImageComponent extends (\n ABViewDetailItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetailImage_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field();\n const _ui = {\n on: {\n //Add data-cy attribute for Cypress Testing\n onAfterRender: () => {\n const dataCy = `detail image ${field?.columnName} ${field?.id} ${\n baseView.parentDetailComponent()?.id || baseView.parent.id\n }`;\n\n $$(this.ids.detailItem)?.$view.setAttribute(\"data-cy\", dataCy);\n },\n },\n };\n const settings = this.settings;\n\n if (settings.height) _ui.height = settings.height;\n\n return super.ui(_ui);\n }\n\n setValue(val) {\n const field = this.view.field();\n\n if (!field) {\n super.setValue(\"\");\n\n return;\n }\n\n const parsedImageUrl = val || field.settings.defaultImageUrl;\n\n if (!parsedImageUrl) {\n super.setValue(\"\");\n\n return;\n }\n\n const imageUrl = field.urlImage(parsedImageUrl);\n const settings = this.settings;\n const width = settings.width || field.settings.imageWidth || 200;\n const height = settings.height\n ? `${settings.height}px`\n : field.settings.imageHeight\n ? `${field.settings.imageHeight}px`\n : \"100%\";\n const imageTemplate = [\n `
    `,\n `
    `,\n ``,\n `
    `,\n ].join(\"\");\n\n super.setValue(imageTemplate);\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nconst SAFE_HTML_TAGS = [\n \"abbr\",\n \"acronym\",\n \"b\",\n \"blockquote\",\n \"br\",\n \"code\",\n \"div\",\n \"em\",\n \"i\",\n \"li\",\n \"ol\",\n \"p\",\n \"span\",\n \"strong\",\n \"table\",\n \"td\",\n \"tr\",\n \"ul\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n];\n\nmodule.exports = class ABViewDetailItemComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewDetailItem_${baseView.id}`,\n Object.assign(\n {\n detailItem: \"\",\n detailItemLabel: \"\",\n },\n ids\n )\n );\n }\n\n ui(uiDetailItemComponent = {}) {\n const baseView = this.view;\n\n // setup 'label' of the element\n const settings = baseView.detailComponent()?.settings ?? {};\n const field = baseView.field();\n\n const isLabelTop = settings.labelPosition == \"top\";\n\n const group = [];\n /** @const group will be used later as rows or cols depending on label position */\n if (settings.showLabel) {\n const templateLabel = isLabelTop\n ? \"\"\n : \"\";\n\n const labelUi = {\n id: this.ids.detailItemLabel,\n view: \"template\",\n borderless: true,\n height: 38,\n template: templateLabel,\n data: { label: field?.label ?? \"\" },\n };\n if (!isLabelTop) labelUi.width = settings.labelWidth + 24; // Add 24px to compensate for webix padding\n group.push(labelUi);\n }\n\n let height;\n if (field?.settings?.useHeight === 1)\n height = parseInt(field.settings.imageHeight) || height;\n\n const valueUi = Object.assign(\n {\n id: this.ids.detailItem,\n view: \"template\",\n borderless: true,\n autowidth: true,\n height,\n isUsers: field?.key === \"user\",\n template: isLabelTop\n ? \"
    #display#
    \"\n : \"
    #display#
    \",\n data: { display: \"\" }, // show empty data in template\n },\n uiDetailItemComponent\n );\n // height = 0 behaves a bit differently then autoheight here.\n if (!valueUi.height || valueUi.height == 0) {\n delete valueUi.height;\n valueUi.autoheight = true;\n }\n group.push(valueUi);\n const itemUi = {};\n settings.labelPosition == \"top\"\n ? (itemUi.rows = group)\n : (itemUi.cols = group);\n const _ui = super.ui([itemUi]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n // async init(AB) {\n // await super.init(AB);\n // }\n\n setValue(val, detailId) {\n const $detailItem = $$(detailId ?? this.ids.detailItem);\n\n if (!$detailItem) return;\n\n const field = this.view.field();\n\n switch (field?.key) {\n case \"string\":\n case \"LongText\": {\n const strVal = val\n // Sanitize all of HTML tags\n .replace(/[<]/gm, \"<\")\n // Allow safe HTML tags\n .replace(\n new RegExp(`(<(/)?(${SAFE_HTML_TAGS.join(\"|\")}))`, \"gm\"),\n \"<$2$3\"\n );\n\n $detailItem.setValues({ display: strVal });\n break;\n }\n default:\n $detailItem.setValues({ display: val });\n break;\n }\n }\n};\n","const ABViewDetailItemComponent = require(\"./ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailTextComponent extends (\n ABViewDetailItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetailText_${baseView.id}`, ids);\n }\n\n ui() {\n const field = this.view.field();\n const _ui = {\n css: \"ab-text\",\n on: {\n //Add data-cy attribute for Cypress Testing\n onAfterRender: () => {\n const dataCy = `detail text ${field?.columnName} ${field?.id} ${\n this.view.parentDetailComponent()?.id || this.view.parent.id\n }`;\n\n $$(this.ids.component)?.$view.setAttribute(\"data-cy\", dataCy);\n },\n },\n };\n const settings = this.settings;\n\n if (settings.height) _ui.height = settings.height;\n\n return super.ui(_ui);\n }\n};\n","const ABViewDetailItemComponent = require(\"./ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailTreeComponent extends (\n ABViewDetailItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetailTree_${baseView.id}`, ids);\n }\n\n get className() {\n return \"ab-detail-tree\";\n }\n\n async init(AB) {\n await super.init(AB);\n\n // add div of tree to detail\n this.setValue(`
    `);\n }\n\n getDomTree() {\n const $detailItem = $$(this.ids.detailItem);\n\n if (!$detailItem) return;\n\n return $detailItem.$view.getElementsByClassName(this.className)[0];\n }\n\n setValue(val) {\n // convert value to array\n const vals = [];\n\n if (val && !Array.isArray(val)) vals.push(val);\n\n setTimeout(() => {\n // get tree dom\n const domTree = this.getDomTree();\n\n if (!domTree) return false;\n\n const field = this.view.field();\n const branches = [];\n\n if (typeof field.settings.options.data === \"undefined\")\n field.settings.options = new this.AB.Webix.TreeCollection({\n data: field.settings.options,\n });\n\n field.settings.options.data.each(function (obj) {\n if (vals.indexOf(obj.id) !== -1) {\n let html = \"\";\n let rootid = obj.id;\n\n while (this.getParentId(rootid)) {\n field.settings.options.data.each(function (par) {\n if (\n field.settings.options.data.getParentId(rootid) ===\n par.id\n ) {\n html = `${par.text}: ${html}`;\n }\n });\n\n rootid = this.getParentId(rootid);\n }\n\n html += obj.text;\n branches.push(html);\n }\n });\n\n const myHex = \"#4CAF50\";\n\n let nodeHTML = \"
    \";\n\n branches.forEach(function (item) {\n nodeHTML += `${item}`;\n });\n\n nodeHTML += \"
    \";\n domTree.innerHTML = nodeHTML;\n\n let height = 33;\n\n if (domTree.scrollHeight > 33) height = domTree.scrollHeight;\n\n const $detailItem = $$(this.ids.detailItem);\n\n $detailItem.config.height = height;\n $detailItem.resize();\n }, 50);\n }\n};\n","const Docxtemplater = require(\"../../../../js/docxtemplater.v3.0.12.min.js\");\nconst ImageModule = require(\"../../../../js/docxtemplater-image-module.v3.0.2.min.js\");\nconst JSZipUtils = require(\"jszip-utils/dist/jszip-utils.min.js\");\nconst JSZip = require(\"../../../../js/jszip.min.js\");\nconst sizeOf = require(\"image-size\");\n\nconst ABFieldConnect = require(\"../../dataFields/ABFieldConnect\");\nconst ABFieldImage = require(\"../../dataFields/ABFieldImage\");\nconst ABObjectQuery = require(\"../../ABObjectQuery\");\n\nconst ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewDocxBuilderComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewDocxBuilder_${baseView.id}`,\n Object.assign(\n {\n downloadButton: \"\",\n noFileLabel: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const baseView = this.view;\n const settings = this.settings;\n const defaultSettings = baseView.constructor.defaultValues();\n const buttonWidth = settings.width ?? defaultSettings.width;\n\n let autowidth = false;\n\n if (buttonWidth === 0) autowidth = true;\n\n let leftSpacer = {\n type: \"spacer\",\n width: 1,\n };\n let rightSpacer = {\n type: \"spacer\",\n width: 1,\n };\n\n switch (settings.buttonPosition ?? defaultSettings.buttonPosition) {\n case \"left\":\n break;\n case \"center\":\n leftSpacer = {\n type: \"spacer\",\n };\n rightSpacer = {\n type: \"spacer\",\n };\n break;\n case \"right\":\n leftSpacer = {\n type: \"spacer\",\n };\n break;\n }\n\n const buttonLabelText =\n baseView.buttonlabel ||\n settings.buttonlabel ||\n defaultSettings.buttonlabel; // Use || to check empty string \"\"\n const ids = this.ids;\n const _ui = super.ui([\n {\n view: \"toolbar\",\n css:\n settings.toolbarBackground ?? defaultSettings.toolbarBackground,\n cols: [\n leftSpacer,\n {\n id: ids.downloadButton,\n view: \"button\",\n css: \"webix_primary\",\n type: \"icon\",\n icon: \"fa fa-file-word-o\",\n label: buttonLabelText,\n width: settings.width || defaultSettings.width,\n autowidth: autowidth,\n click: () => {\n this.renderFile();\n },\n on: {\n // Add data-cy attribute for cypress tests\n onAfterRender: () => {\n const name = baseView.name?.replace(\".docxBuilder\", \"\");\n const dataCy = `docx download ${name} ${baseView.id}`;\n $$(ids.downloadButton)\n ?.$view.querySelector(\"button\")\n .setAttribute(\"data-cy\", dataCy);\n },\n },\n },\n {\n id: ids.noFileLabel,\n view: \"label\",\n label: this.label(\"No template file\"),\n },\n {\n type: \"spacer\",\n },\n rightSpacer,\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const ids = this.ids;\n const $downloadButton = $$(ids.downloadButton);\n const $noFileLabel = $$(ids.noFileLabel);\n\n if (this.view.settings.filename) {\n $downloadButton.show();\n $noFileLabel.hide();\n } else {\n $downloadButton.hide();\n $noFileLabel.show();\n }\n }\n\n async onShow() {\n super.onShow();\n\n const tasks = [];\n\n this.view.datacollections.forEach((dc) => {\n if (dc.dataStatus === dc.dataStatusFlag.notInitial)\n // load data when a widget is showing\n tasks.push(dc.loadData());\n });\n\n // Show loading cursor\n if (tasks.length > 0) this.busy();\n\n await Promise.all(tasks);\n\n // Hide loading cursor\n this.ready();\n }\n\n busy() {\n const $downloadButton = $$(this.ids.downloadButton);\n\n if (!$downloadButton) return;\n\n $downloadButton.disable();\n $downloadButton.define(\"icon\", \"fa fa-refresh fa-spin\");\n $downloadButton.refresh();\n }\n\n ready() {\n const $downloadButton = $$(this.ids.downloadButton);\n\n if (!$downloadButton) return;\n\n $downloadButton.enable();\n $downloadButton.define(\"icon\", \"fa fa-file-word-o\");\n $downloadButton.refresh();\n }\n\n async renderFile() {\n this.busy();\n\n const reportValues = await this.getReportData();\n\n // console.log(\"DOCX data: \", reportValues);\n\n // Download images\n const images = await this.downloadImages(reportValues);\n\n // Download the template file\n const contentTemplateFile = await this.downloadTemplateFile();\n\n // Generate Docx file\n const blobFile = this.generateDocxFile(\n contentTemplateFile,\n reportValues,\n images\n );\n\n const baseView = this.view;\n\n // Let user download the output file\n baseView.letUserDownload(blobFile, baseView.filelabel);\n\n // Final step\n this.ready();\n }\n\n async getReportData() {\n const result = {};\n const tasks = [];\n\n // Get current cursor\n const datacollections = this.view.datacollections;\n const isDcLabelAdded = datacollections.length > 1;\n\n datacollections\n .filter((dc) => dc?.datasource)\n .forEach(async (dc) => {\n tasks.push(\n new Promise((resolve, reject) => {\n const obj = dc.datasource;\n const objModel = obj.model();\n const dcCursor = dc.getCursor();\n const dcValues = [];\n\n // pull the defined sort values\n let sorts = dc.settings.objectWorkspace.sortFields || [];\n\n // pull filter conditions\n let wheres = this.AB.cloneDeep(\n dc.settings.objectWorkspace.filterConditions ?? {}\n );\n // if there is a selected cursor set the filter here\n if (dcCursor) {\n // if there is a selected cursor set the filter here\n wheres = {\n glue: \"and\",\n rules: [\n {\n key: obj.PK(),\n rule: \"equals\",\n value: dcCursor[obj.PK()],\n },\n ],\n };\n } else if (dc.__reloadWheres) {\n // if we pass new wheres with a reload use them instead\n wheres = dc.__reloadWheres;\n }\n wheres.glue = wheres.glue || \"and\";\n wheres.rules = wheres.rules || [];\n\n const __additionalWheres = {\n glue: \"and\",\n rules: [],\n };\n\n // add the filterCond from user filters if there are rules to add\n if (dc?.__filterCond?.rules?.length > 0) {\n __additionalWheres.rules.push(dc?.__filterCond);\n }\n\n // Filter by a selected cursor of a link DC\n let linkRule = dc.ruleLinkedData();\n if (!dc.settings.loadAll && linkRule) {\n __additionalWheres.rules.push(linkRule);\n }\n // pull data rows following the follow data collection\n else if (dc.datacollectionFollow) {\n const followCursor = dc.datacollectionFollow.getCursor();\n // store the PK as a variable\n let PK = dc.datasource.PK();\n // if the datacollection we are following is a query\n // add \"BASE_OBJECT.\" to the PK so we can select the\n // right value to report the cursor change to\n if (dc.datacollectionFollow.settings.isQuery) {\n PK = \"BASE_OBJECT.\" + PK;\n }\n if (followCursor) {\n wheres = {\n glue: \"and\",\n rules: [\n {\n key: dc.datasource.PK(),\n rule: \"equals\",\n value: followCursor[PK],\n },\n ],\n };\n }\n // Set no return rows\n else {\n wheres = {\n glue: \"and\",\n rules: [\n {\n key: this.datasource.PK(),\n rule: \"equals\",\n value: \"NO RESULT ROW\",\n },\n ],\n };\n }\n }\n\n // Combine setting & program filters\n if (__additionalWheres.rules.length) {\n if (wheres.rules.length) {\n __additionalWheres.rules.unshift(wheres);\n }\n wheres = __additionalWheres;\n }\n\n // remove any null in the .rules\n // if (wheres?.rules?.filter) wheres.rules = wheres.rules.filter((r) => r);\n wheres = obj.whereCleanUp(wheres);\n\n // Pull data that have full relation values.\n // NOTE: When get data from DataCollection, those data is pruned.\n objModel\n .findAll({\n where: wheres || {},\n skip: 0,\n sort: sorts,\n populate: true,\n })\n .then((dataList) => {\n // update property names to column labels to match format names in docx file\n const mlFields = obj.multilingualFields();\n\n dataList?.data.forEach((data) => {\n let resultData;\n\n // For support label of columns every languages\n obj.fields().forEach((f) => {\n const fieldLabels = [];\n\n // Query Objects\n if (obj instanceof ABObjectQuery) {\n if (typeof f.object.translations === \"string\")\n f.object.translations = JSON.parse(\n f.object.translations\n );\n\n if (typeof f.translations === \"string\")\n f.translations = JSON.parse(f.translations);\n\n (f.object.translations || []).forEach(\n (objTran) => {\n const fieldTran = (\n f.translations || []\n ).filter(\n (fieldTran) =>\n fieldTran.language_code ===\n objTran.language_code\n )[0];\n\n if (!fieldTran) return;\n\n const objectLabel = objTran.label;\n const fieldLabel = fieldTran.label;\n\n // Replace alias with label of object\n fieldLabels.push(\n `${objectLabel}.${fieldLabel}`\n );\n }\n );\n }\n // Normal Objects\n else if (typeof f.translations === \"string\")\n f.translations = JSON.parse(f.translations);\n\n f.translations.forEach((tran) => {\n fieldLabels.push(tran.label);\n });\n\n resultData = Object.assign(\n resultData ?? {},\n this.setReportValues(\n data,\n f,\n fieldLabels,\n mlFields\n ) ?? {}\n );\n\n // Keep ABObject into .scope of DOCX templater\n resultData._object = obj;\n });\n\n dcValues.push(resultData);\n });\n\n // If data sources have more than 1 or the result data more than 1 items, then add label of data source\n const datacollectionData =\n dcValues.length > 1 ? dcValues : dcValues[0];\n\n if (\n isDcLabelAdded ||\n (Array.isArray(datacollectionData) &&\n datacollectionData.length > 1)\n )\n (dc.translations || []).forEach((tran) => {\n result[tran.label] = datacollectionData;\n });\n else Object.assign(result, datacollectionData);\n\n resolve();\n });\n })\n );\n });\n\n await Promise.all(tasks);\n\n return result;\n }\n\n setReportValues(data, field, fieldLabels = [], multilinguageFields) {\n const result = {};\n\n let val = null;\n\n result.id = data.id;\n result[`${field.columnName}_ORIGIN`] = data[field.columnName]; // Keep origin value for compare value with custom index\n\n const baseView = this.view;\n\n // Translate multilinguage fields\n if (multilinguageFields.length) {\n const transFields = (multilinguageFields || []).filter(\n (fieldName) => data[fieldName] != null\n );\n\n baseView.translate(data, data, transFields, baseView.languageCode);\n }\n\n // Pull value\n if (field instanceof ABFieldConnect) {\n // If field is connected field, then\n // {\n // fieldName: {Object} or [Array]\n // }\n val = data[this.AB.rules.toFieldRelationFormat(field.columnName)];\n\n if (val?.forEach)\n val.forEach((v) => {\n if (!v) return;\n\n // Sentry Fix: sometimes v is just the uuid\n // Q: what should we do in this case?\n if (typeof v == \"string\") return;\n\n // format relation data\n if (field.datasourceLink) {\n field.datasourceLink\n .fields((f) => !f.isConnection)\n .forEach((f) => {\n v[`${f.columnName}_ORIGIN`] = v[f.columnName];\n\n v[f.columnName] = f.format(v, {\n languageCode: baseView.languageCode,\n });\n });\n }\n\n // Keep ABObject to relation data\n if (v && typeof v === \"object\") v._object = field.datasourceLink;\n });\n\n // TODO\n // data[label + '_label'] = field.format(baseData);\n } else\n val = field.format(data, {\n languageCode: baseView.languageCode,\n });\n\n // Set value to report with every languages of label\n fieldLabels.forEach((label) => {\n if (val) result[label] = val;\n else if (!result[label]) result[label] = \"\";\n });\n\n // normalize child items\n if (data.data?.length) {\n result.data = result.data || [];\n\n (data.data || []).forEach((childItem, index) => {\n // add new data item\n result.data[index] = this.setReportValues(\n childItem,\n field,\n fieldLabels,\n multilinguageFields\n );\n });\n }\n\n return result;\n }\n\n async downloadImages(reportValues) {\n const images = {};\n const tasks = [];\n const addDownloadTask = (fieldImage, data = []) => {\n if (Array.isArray(data) == false) {\n data = [data];\n }\n data.forEach((d) => {\n const imageVal = fieldImage.format(d);\n\n if (imageVal && !images[imageVal]) {\n tasks.push(\n new Promise((resolve, reject) => {\n const imgUrl = fieldImage.urlImage(imageVal); // `/opsportal/image/${this.application.name}/${imageVal}`;\n\n JSZipUtils.getBinaryContent(imgUrl, (error, content) => {\n if (error) return reject(error);\n\n // store binary of image\n images[imageVal] = content;\n\n resolve();\n });\n })\n );\n }\n\n // download images of child items\n addDownloadTask(fieldImage, d.data || []);\n });\n };\n\n this.view.datacollections\n .filter((dc) => dc?.datasource)\n .forEach((dc) => {\n const obj = dc.datasource;\n\n // let currCursor = dc.getCursor();\n\n // if (currCursor) {\n // // Current cursor\n // const treeCursor = dc.getCursor(true);\n\n // currCursor = [this.AB.merge({}, currCursor, treeCursor)];\n // } // List of data\n // else currCursor = dc.getData();\n\n obj.fields((f) => f instanceof ABFieldImage).forEach((f) => {\n addDownloadTask(f, reportValues[dc.label] || [reportValues]);\n });\n });\n\n await Promise.all(tasks);\n\n return images;\n }\n\n downloadTemplateFile() {\n const url = this.view.downloadUrl();\n\n return new Promise((resolve, reject) => {\n JSZipUtils.getBinaryContent(url, (error, content) => {\n if (error) return reject(error);\n\n resolve(content);\n });\n });\n }\n\n generateDocxFile(contentFile, data, images) {\n const summaries = {}; // { varName: sum number, ..., varName2: number2 }\n const zip = new JSZip(contentFile);\n const doc = new Docxtemplater();\n const imageModule = new ImageModule({\n centered: false,\n getImage: (tagValue, tagName) => {\n // NOTE: .getImage of version 3.0.2 does not support async\n // we can buy newer version to support it\n // https://docxtemplater.com/modules/image/\n\n return images[tagValue] || \"\";\n },\n getSize: (imgBuffer, tagValue, tagName) => {\n const defaultVal = [300, 160];\n const baseView = this.view;\n const dc = baseView.datacollection;\n\n if (!dc) {\n const dcs = baseView.datacollections;\n\n if (dcs) {\n dcs.forEach((dc) => {\n let obj = dc.datasource;\n\n if (!obj) return false;\n\n // This is a query object\n if (tagName.indexOf(\".\") > -1) {\n let tagNames = tagName.split(\".\");\n\n if (!obj.objects) return false; // not a query\n\n obj = obj.objects((o) => o.label === tagNames[0])[0]; // Label of object\n\n if (!obj) return false;\n\n tagName = tagNames[1]; // Field name\n }\n\n const imageField = obj.fields(\n (f) => f.columnName === tagName\n )[0];\n\n if (!imageField?.settings) return false;\n\n if (\n imageField.settings.useWidth &&\n imageField.settings.imageWidth\n )\n defaultVal[0] = imageField.settings.imageWidth;\n\n if (\n imageField.settings.useHeight &&\n imageField.settings.imageHeight\n )\n defaultVal[1] = imageField.settings.imageHeight;\n\n return false;\n });\n }\n } else {\n let obj = dc.datasource;\n\n if (!obj) return defaultVal;\n\n // This is a query object\n if (tagName.indexOf(\".\") > -1) {\n const tagNames = tagName.split(\".\");\n\n obj = obj.objects((o) => o.label === tagNames[0])[0]; // Label of object\n\n if (!obj) return defaultVal;\n\n tagName = tagNames[1]; // Field name\n }\n\n const imageField = obj.fields(\n (f) => f.columnName === tagName\n )[0];\n\n if (!imageField?.settings) return defaultVal;\n\n if (\n imageField.settings.useWidth &&\n imageField.settings.imageWidth\n )\n defaultVal[0] = imageField.settings.imageWidth;\n\n if (\n imageField.settings.useHeight &&\n imageField.settings.imageHeight\n )\n defaultVal[1] = imageField.settings.imageHeight;\n }\n // Find aspect ratio image dimensions\n try {\n var img = new Uint8Array(imgBuffer);\n var image = sizeOf(img);\n var ratio = Math.min(\n defaultVal[0] / image.width,\n defaultVal[1] / image.height\n );\n\n return [image.width * ratio, image.height * ratio];\n } catch (err) {\n // if invalid image, then should return 0, 0 sizes\n return defaultVal;\n }\n },\n // getSize: function (imgBuffer, tagValue, tagName) {\n // if (imgBuffer) {\n // var maxWidth = 300;\n // var maxHeight = 160;\n\n // // Find aspect ratio image dimensions\n // try {\n // var image = sizeOf(imgBuffer);\n // var ratio = Math.min(maxWidth / image.width, maxHeight / image.height);\n\n // return [image.width * ratio, image.height * ratio];\n // }\n // // if invalid image, then should return 0, 0 sizes\n // catch (err) {\n // return [0, 0];\n // }\n\n // }\n // else {\n // return [0, 0];\n // }\n // }\n });\n\n try {\n doc.attachModule(imageModule)\n .loadZip(zip)\n .setData(data)\n .setOptions({\n parser: function (tag) {\n return {\n get: function (scope, context) {\n // NOTE: AppBuilder custom filter : no return empty items\n if (tag.indexOf(\"data|\") === 0) {\n const prop = (tag.split(\"|\")[1] || \"\").trim();\n\n return (scope[\"data\"] || []).filter(function (item) {\n return item[prop] ? true : false;\n });\n }\n // Mark number to add to a variable\n else if (tag.indexOf(\"|$sum?\") > -1) {\n const prop = tag.split(\"|$sum?\")[0];\n const varName = tag.split(\"|$sum?\")[1];\n\n let number = scope[prop];\n\n if (typeof number === \"string\")\n number = number.replace(\n /[^\\d.]/g, // return only number and dot\n \"\"\n );\n\n if (!summaries[varName]) summaries[varName] = 0.0;\n\n summaries[varName] += parseFloat(number);\n\n return scope[prop];\n }\n // Show sum value ^\n else if (tag.indexOf(\"$sum?\") === 0) {\n const varName = tag.replace(\"$sum?\", \"\");\n\n return summaries[varName] || 0;\n }\n // // Sum number of .data (Grouped query)\n // else if (tag.indexOf(\"$sum|\") === 0) {\n // const prop = (\n // tag.split(\"|\")[1] || \"\"\n // ).trim();\n\n // let sum = 0;\n // (scope[\"data\"] || []).forEach(\n // (childItem) => {\n // if (!childItem[prop]) return;\n\n // let number = childItem[prop];\n // if (typeof number === \"string\") {\n // number = number.replace(\n // /[^\\d.]/g, // return only number and dot\n // \"\"\n // );\n // }\n\n // try {\n // sum += parseFloat(\n // number || 0\n // );\n // } catch (e) {}\n // }\n // );\n\n // // Print number with commas\n // if (sum) {\n // sum = sum\n // .toString()\n // .replace(\n // /\\B(?=(\\d{3})+(?!\\d))/g,\n // \",\"\n // );\n // }\n\n // return sum;\n // }\n // NOTE: AppBuilder custom filter of another data source\n else if (tag.indexOf(\"$\") === 0) {\n const props = tag.replace(\"$\", \"\").split(\"|\");\n const propSource = props[0].trim();\n const propFilter = props[1].trim(); // column name of ABFieldConnect\n\n if (!propSource || !propFilter) return \"\";\n\n // Pull Index field of connect field\n let indexColName;\n\n const obj = scope._object;\n\n if (obj) {\n const connectedField = obj.fields(\n (f) => f.columnName === propFilter\n )[0];\n\n if (connectedField) {\n const indexField = connectedField.indexField;\n\n indexColName = indexField\n ? indexField.columnName\n : null;\n }\n }\n\n let sourceVals = data[propSource];\n\n if (sourceVals && !Array.isArray(sourceVals))\n sourceVals = [sourceVals];\n\n const getVal = (data) =>\n data[`${indexColName}_ORIGIN`] || // Pull origin data to compare by custom index\n data[indexColName] ||\n data.id ||\n data;\n\n return (sourceVals || []).filter(function (item) {\n // Pull data of parent to compare\n let comparer = scope[propFilter];\n\n if (Array.isArray(comparer))\n return (\n comparer.filter(\n (c) => getVal(c) === getVal(item)\n ).length > 0\n );\n else return getVal(item) === getVal(comparer);\n });\n }\n // ์NOTE : Custom filter\n else if (tag.indexOf(\"?\") > -1) {\n const result = scope;\n const prop = tag.split(\"?\")[0];\n const condition = tag.split(\"?\")[1];\n\n if (prop && condition) {\n let data = scope[prop];\n\n if (data) {\n if (!Array.isArray(data)) data = [data];\n\n return data.filter((d) =>\n eval(condition.replace(/\\./g, \"d.\"))\n );\n }\n }\n return result;\n } else if (tag === \".\") return scope;\n else return scope[tag];\n },\n };\n },\n })\n .render(); // render the document\n } catch (error) {\n return error;\n }\n\n // Output the document using Data-URI\n const docxFile = doc.getZip().generate({\n type: \"blob\",\n mimeType:\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n });\n\n return docxFile;\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormButton extends ABViewFormItemComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormButton_${baseView.id}`, ids);\n }\n\n ui() {\n const self = this;\n const baseView = this.view;\n const form = baseView.parentFormComponent();\n const settings = baseView.settings ?? {};\n\n const alignment =\n settings.alignment || baseView.constructor.defaultValues().alignment;\n\n const _ui = {\n cols: [],\n };\n\n // spacer\n if (alignment === \"center\" || alignment === \"right\") {\n _ui.cols.push({});\n }\n\n // delete button\n if (settings.includeDelete) {\n _ui.cols.push(\n {\n view: \"button\",\n autowidth: true,\n value: settings.deleteLabel || this.label(\"Delete\"),\n css: \"webix_danger\",\n click: function () {\n self.onDelete(this);\n },\n on: {\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `button delete ${form.id}`\n );\n },\n },\n },\n {\n width: 10,\n }\n );\n }\n\n // cancel button\n if (settings.includeCancel) {\n _ui.cols.push(\n {\n view: \"button\",\n autowidth: true,\n value: settings.cancelLabel || this.label(\"Cancel\"),\n click: function () {\n self.onCancel(this);\n },\n on: {\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `button cancel ${form.id}`\n );\n },\n },\n },\n {\n width: 10,\n }\n );\n }\n\n // reset button\n if (settings.includeReset) {\n _ui.cols.push(\n {\n view: \"button\",\n autowidth: true,\n value: settings.resetLabel || this.label(\"Reset\"),\n click: function () {\n self.onClear(this);\n },\n on: {\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `button reset ${form.id}`\n );\n },\n },\n },\n {\n width: 10,\n }\n );\n }\n\n // save button\n if (settings.includeSave) {\n _ui.cols.push({\n view: \"button\",\n type: \"form\",\n css: \"webix_primary\",\n autowidth: true,\n value: settings.saveLabel || this.label(\"Save\"),\n click: function () {\n self.onSave(this);\n },\n on: {\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `button save ${form.id}`\n );\n },\n },\n });\n }\n\n // spacer\n if (alignment === \"center\" || alignment === \"left\") _ui.cols.push({});\n\n return super.ui(_ui);\n }\n\n onCancel(cancelButton) {\n const baseView = this.view;\n const settings = baseView.settings ?? {};\n\n // get form component\n const form = baseView.parentFormComponent();\n\n // get ABDatacollection\n const dc = form.datacollection;\n\n // clear cursor of DC if not set to follow another\n if (!dc?.isCursorFollow) {\n dc?.setCursor(null);\n }\n // dc?.setStaticCursor(); // unless it should be static\n\n cancelButton?.getFormView?.().clear();\n\n if (settings.afterCancel) form.changePage(settings.afterCancel);\n // If the redirect page is not defined, then redirect to parent page\n else {\n const noPopupFilter = (p) => p.settings && p.settings.type != \"popup\";\n\n const pageCurr = this.view.pageParent();\n if (pageCurr) {\n const pageParent = pageCurr.pageParent(noPopupFilter) ?? pageCurr;\n\n if (pageParent) form.changePage(pageParent.id);\n }\n }\n }\n\n onClear(resetButton) {\n // get form component\n const form = this.view.parentFormComponent();\n\n // get ABDatacollection\n const dc = form.datacollection;\n\n // clear cursor of DC\n if (dc) {\n dc.setCursor(null);\n }\n\n resetButton?.getFormView?.().clear();\n }\n\n onSave(saveButton) {\n if (!saveButton) {\n console.error(\"Require the button element\");\n return;\n }\n // get form component\n const form = this.view.parentFormComponent();\n const formView = saveButton.getFormView();\n\n // disable the save button\n saveButton.disable?.();\n\n // save data\n form\n .saveData(formView)\n .then(() => {\n saveButton.enable?.();\n\n //Focus on first focusable component\n form.focusOnFirst();\n })\n .catch((err) => {\n console.error(err);\n // Catch uncaught error reported in Sentry and add context\n // APPBUILDER-WEB-1A3(https://appdev-designs.sentry.io/issues/4631880265/)\n try {\n saveButton.enable?.();\n } catch (e) {\n this.AB.notify.developer(e, {\n context:\n \"formButton.onSave > catch err > saveButton.enable()\",\n buttonID: this?.view?.id,\n formID: this?.view?.parent?.id,\n });\n }\n });\n }\n\n onDelete(deleteButton) {\n this.AB.Webix.confirm({\n title: this.label(\"Delete data\"),\n text: this.label(\"Do you want to delete this data?\"),\n callback: async (confirm) => {\n if (!confirm) return;\n\n deleteButton.disable?.();\n\n try {\n // get form component\n const form = this.view.parentFormComponent();\n const $formView = deleteButton.getFormView();\n\n // delete a record row\n await form.deleteData($formView);\n } catch (err) {\n console.error(err);\n } finally {\n deleteButton.enable?.();\n }\n },\n });\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormCheckboxComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormCheckbox_${baseView.id}`, ids);\n }\n\n ui() {\n return super.ui({\n view: \"checkbox\",\n });\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\nconst ABViewFormItem = require(\"../ABViewFormItem\");\nconst ABViewFormConnect = require(\"../ABViewFormConnect\");\nconst ABViewFormCustom = require(\"../ABViewFormCustom\");\nconst ABViewFormTextbox = require(\"../ABViewFormTextbox\");\nconst ABViewFormJson = require(\"../ABViewFormJson\");\n\nasync function timeout(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nconst fieldValidations = [];\n\nmodule.exports = class ABViewFormComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewForm_${baseView.id}`,\n Object.assign(\n {\n form: \"\",\n\n layout: \"\",\n filterComplex: \"\",\n },\n ids\n )\n );\n\n this.timerId = null;\n this._showed = false;\n }\n\n ui() {\n const baseView = this.view;\n const superComponent = baseView.superComponent();\n const rows = superComponent.ui().rows ?? [];\n const fieldValidationsHolder = this.uiValidationHolder();\n const _ui = super.ui([\n {\n id: this.ids.form,\n view: \"form\",\n abid: baseView.id,\n rows: rows.concat(fieldValidationsHolder),\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n uiValidationHolder() {\n const result = [\n {\n hidden: true,\n rows: [],\n },\n ];\n\n // NOTE: this._currentObject can be set in the KanBan Side Panel\n const baseView = this.view;\n const object = this.datacollection?.datasource ?? baseView._currentObject;\n\n if (!object) return result;\n\n const validationUI = [];\n const existsFields = baseView.fieldComponents();\n\n object\n // Pull fields that have validation rules\n .fields((f) => f?.settings?.validationRules)\n .forEach((f) => {\n const view = existsFields.find(\n (com) => f.id === com.settings.fieldId\n );\n if (!view) return;\n\n // parse the rules because they were stored as a string\n // check if rules are still a string...if so lets parse them\n if (typeof f.settings.validationRules === \"string\") {\n f.settings.validationRules = JSON.parse(\n f.settings.validationRules\n );\n }\n\n // there could be more than one so lets loop through and build the UI\n f.settings.validationRules.forEach((rule, indx) => {\n const Filter = this.AB.filterComplexNew(\n `${f.columnName}_${indx}`\n );\n // add the new ui to an array so we can add them all at the same time\n if (typeof Filter.ui === \"function\") {\n validationUI.push(Filter.ui());\n } else {\n // Legacy v1 method:\n validationUI.push(Filter.ui);\n }\n\n // store the filter's info so we can assign values and settings after the ui is rendered\n fieldValidations.push({\n filter: Filter,\n view: Filter.ids.querybuilder,\n columnName: f.columnName,\n validationRules: rule.rules,\n invalidMessage: rule.invalidMessage,\n });\n });\n });\n\n result.rows = validationUI;\n\n return result;\n }\n\n async init(AB, accessLevel, options = {}) {\n await super.init(AB);\n\n this.view.superComponent().init(AB, accessLevel, options);\n\n this.initCallbacks(options);\n this.initEvents();\n this.initValidationRules();\n\n const abWebix = this.AB.Webix;\n const $form = $$(this.ids.form);\n\n if ($form) {\n abWebix.extend($form, abWebix.ProgressBar);\n }\n\n if (accessLevel < 2) $form.disable();\n }\n\n initCallbacks(options = {}) {\n // ? We need to determine from these options whether to clear on load?\n if (options?.clearOnLoad) {\n // does this need to be a function?\n this.view.settings.clearOnLoad = options.clearOnLoad();\n }\n // Q: Should we use emit the event instead ?\n const baseView = this.view;\n\n if (options.onBeforeSaveData)\n baseView._callbacks.onBeforeSaveData = options.onBeforeSaveData;\n else baseView._callbacks.onBeforeSaveData = () => true;\n }\n\n initEvents() {\n // bind a data collection to form component\n const dc = this.datacollection;\n\n if (!dc) return;\n\n // listen DC events\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n this.eventAdd({\n emitter: dc,\n eventName: key,\n listener: (rowData) => {\n const baseView = this.view;\n const linkViaOneConnection = baseView.fieldComponents(\n (comp) => comp instanceof ABViewFormConnect\n );\n // clear previous xxx->one selections and add new from\n // cursor change\n linkViaOneConnection.forEach((f) => {\n const field = f.field();\n if (\n field?.settings?.linkViaType == \"one\" &&\n field?.linkViaOneValues\n ) {\n delete field.linkViaOneValues;\n const relationVals =\n rowData?.[field.relationName()] ??\n rowData?.[field.columnName];\n if (relationVals) {\n if (Array.isArray(relationVals)) {\n const valArray = [];\n relationVals.forEach((v) => {\n valArray.push(\n field.getRelationValue(v, { forUpdate: true })\n );\n });\n field.linkViaOneValues = valArray.join(\",\");\n } else {\n field.linkViaOneValues = field.getRelationValue(\n relationVals,\n { forUpdate: true }\n );\n }\n }\n }\n });\n\n this.displayData(rowData);\n },\n });\n });\n\n const ids = this.ids;\n\n this.eventAdd({\n emitter: dc,\n eventName: \"initializingData\",\n listener: () => {\n const $form = $$(ids.form);\n\n if ($form) {\n $form.disable();\n\n $form.showProgress?.({ type: \"icon\" });\n }\n },\n });\n\n this.eventAdd({\n emitter: dc,\n eventName: \"initializedData\",\n listener: () => {\n const $form = $$(ids.form);\n\n if ($form) {\n $form.enable();\n\n $form.hideProgress?.();\n }\n },\n });\n\n // I think this case is currently handled by the DC.[changeCursor, cursorStale]\n // events:\n // this.eventAdd({\n // emitter: dc,\n // eventName: \"ab.datacollection.update\",\n // listener: (msg, data) => {\n // if (!data?.objectId) return;\n\n // const object = dc.datasource;\n\n // if (!object) return;\n\n // if (\n // object.id === data.objectId ||\n // object.fields((f) => f.settings.linkObject === data.objectId)\n // .length > 0\n // ) {\n // const currData = dc.getCursor();\n\n // if (currData) this.displayData(currData);\n // }\n // },\n // });\n\n // bind the cursor event of the parent DC\n const linkDv = dc.datacollectionLink;\n\n if (linkDv)\n // update the value of link field when data of the parent dc is changed\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n this.eventAdd({\n emitter: linkDv,\n eventName: key,\n listener: (rowData) => {\n this.displayParentData(rowData);\n },\n });\n });\n }\n\n initValidationRules() {\n const dc = this.datacollection;\n\n if (!dc) return;\n\n if (!fieldValidations.length) return;\n\n // we need to store the rules for use later so lets build a container array\n const complexValidations = [];\n\n fieldValidations.forEach((f) => {\n // init each ui to have the properties (app and fields) of the object we are editing\n f.filter.applicationLoad(dc.datasource.application);\n f.filter.fieldsLoad(dc.datasource.fields());\n // now we can set the value because the fields are properly initialized\n f.filter.setValue(f.validationRules);\n\n // if there are validation rules present we need to store them in a lookup hash\n // so multiple rules can be stored on a single field\n if (!Array.isArray(complexValidations[f.columnName]))\n complexValidations[f.columnName] = [];\n\n // now we can push the rules into the hash\n complexValidations[f.columnName].push({\n filters: $$(f.view).getFilterHelper(),\n // values: $$(ids.form).getValues(),\n invalidMessage: f.invalidMessage,\n });\n });\n\n const ids = this.ids;\n\n // use the lookup to build the validation rules\n Object.keys(complexValidations).forEach((key) => {\n // get our field that has validation rules\n const formField = $$(ids.form).queryView({\n name: key,\n });\n\n // store the rules in a data param to be used later\n formField.$view.complexValidations = complexValidations[key];\n // define validation rules\n formField.define(\"validate\", function (nval, oval, field) {\n // get field now that we are validating\n const fieldValidating = $$(ids.form).queryView({\n name: field,\n });\n\n // default valid is true\n let isValid = true;\n\n // check each rule that was stored previously on the element\n fieldValidating.$view.complexValidations.forEach((filter) => {\n const object = dc.datasource;\n const data = this.getValues();\n\n // convert rowData from { colName : data } to { id : data }\n const newData = {};\n\n (object.fields() || []).forEach((field) => {\n newData[field.id] = data[field.columnName];\n });\n\n // for the case of \"this_object\" conditions:\n if (data.uuid) newData[\"this_object\"] = data.uuid;\n\n // use helper funtion to check if valid\n const ruleValid = filter.filters(newData);\n\n // if invalid we need to tell the field\n if (!ruleValid) {\n isValid = false;\n // we also need to define an error message\n fieldValidating.define(\n \"invalidMessage\",\n filter.invalidMessage\n );\n }\n });\n\n return isValid;\n });\n\n formField.refresh();\n });\n }\n\n async onShow(data) {\n this.saveButton?.disable();\n\n this._showed = true;\n\n const baseView = this.view;\n\n // call .onShow in the base component\n const superComponent = baseView.superComponent();\n await superComponent.onShow();\n\n const $form = $$(this.ids.form);\n const dc = this.datacollection;\n\n if (dc) {\n // clear current cursor on load\n // if (this.settings.clearOnLoad || _logic.callbacks.clearOnLoad() ) {\n const settings = this.settings;\n\n if (settings.clearOnLoad) {\n dc.setCursor(null);\n }\n\n // pull data of current cursor\n // await dc.waitReady();\n const rowData = dc.getCursor();\n\n if ($form) dc.bind($form);\n\n // do this for the initial form display so we can see defaults\n await this.displayData(rowData);\n }\n // show blank data in the form\n else await this.displayData(data ?? {});\n\n //Focus on first focusable component\n this.focusOnFirst();\n\n if ($form) $form.adjust();\n\n // Load data of DCs that are use in record rules here\n // no need to wait until they are done. (Let the save button enable)\n // It will be re-check again when saving.\n baseView.loadDcDataOfRecordRules();\n\n this.saveButton?.enable();\n }\n\n async displayData(rowData) {\n // If setTimeout is already scheduled, no need to do anything\n if (this.timerId) return;\n else this.timerId = await timeout(80);\n\n const baseView = this.view;\n const customFields = baseView.fieldComponents(\n (comp) =>\n comp instanceof ABViewFormCustom ||\n // rich text\n (comp instanceof ABViewFormTextbox &&\n comp.settings.type === \"rich\") ||\n (comp instanceof ABViewFormJson && comp.settings.type === \"filter\")\n );\n\n const normalFields = baseView.fieldComponents(\n (comp) =>\n comp instanceof ABViewFormItem &&\n !(comp instanceof ABViewFormCustom)\n );\n\n // Set default values\n if (!rowData) {\n customFields.forEach((f) => {\n const field = f.field();\n if (!field) return;\n\n const comp = baseView.viewComponents[f.id];\n if (!comp) return;\n\n // var colName = field.columnName;\n if (this._showed) comp?.onShow?.();\n\n // set value to each components\n const defaultRowData = {};\n\n field.defaultValue(defaultRowData);\n field.setValue($$(comp.ids.formItem), defaultRowData);\n\n comp?.refresh?.(defaultRowData);\n });\n\n normalFields.forEach((f) => {\n if (f.key === \"button\") return;\n\n const field = f.field();\n if (!field) return;\n\n const comp = baseView.viewComponents[f.id];\n if (!comp) return;\n\n const colName = field.columnName;\n\n // set value to each components\n const values = {};\n\n field.defaultValue(values);\n $$(comp.ids.formItem)?.setValue(values[colName] ?? \"\");\n });\n\n // select parent data to default value\n const dc = this.datacollection;\n const linkDv = dc.datacollectionLink;\n\n if (linkDv) {\n const parentData = linkDv.getCursor();\n\n this.displayParentData(parentData);\n }\n }\n\n // Populate value to custom fields\n else {\n customFields.forEach((f) => {\n const comp = baseView.viewComponents[f.id];\n if (!comp) return;\n\n if (this._showed) comp?.onShow?.();\n\n // set value to each components\n f?.field()?.setValue($$(comp.ids.formItem), rowData);\n\n comp?.refresh?.(rowData);\n });\n\n normalFields.forEach((f) => {\n if (f.key === \"button\") return;\n\n const field = f.field();\n if (!field) return;\n\n const comp = baseView.viewComponents[f.id];\n if (!comp) return;\n //\n if (f.key === \"datepicker\") {\n // Not sure why, but the local format isn't applied correctly\n // without a timeout here\n setTimeout(() => {\n field.setValue($$(comp.ids.formItem), rowData);\n }, 200);\n return;\n }\n\n field.setValue($$(comp.ids.formItem), rowData);\n });\n }\n\n this.timerId = null;\n }\n\n displayParentData(rowData) {\n const dc = this.datacollection;\n\n // If the cursor is selected, then it will not update value of the parent field\n const currCursor = dc.getCursor();\n if (currCursor) return;\n\n const relationField = dc.fieldLink;\n if (!relationField) return;\n\n const baseView = this.view;\n // Pull a component of relation field\n const relationFieldCom = baseView.fieldComponents((comp) => {\n if (!(comp instanceof ABViewFormItem)) return false;\n\n return comp.field()?.id === relationField.id;\n })[0];\n if (!relationFieldCom) return;\n\n const relationFieldView = baseView.viewComponents[relationFieldCom.id];\n if (!relationFieldView) return;\n\n const $relationFieldView = $$(relationFieldView.ids.formItem),\n relationName = relationField.relationName();\n\n // pull data of parent's dc\n const formData = {};\n\n formData[relationName] = rowData;\n\n // set data of parent to default value\n relationField.setValue($relationFieldView, formData);\n }\n\n detatch() {\n // TODO: remove any handlers we have attached.\n }\n\n focusOnFirst() {\n const baseView = this.view;\n\n let topPosition = 0;\n let topPositionId = \"\";\n\n baseView.views().forEach((item) => {\n if (item.key === \"textbox\" || item.key === \"numberbox\")\n if (item.position.y === topPosition) {\n topPosition = item.position.y;\n topPositionId = item.id;\n }\n });\n\n const childComponent = baseView.viewComponents[topPositionId];\n\n if (childComponent && $$(childComponent.ids.formItem))\n $$(childComponent.ids.formItem).focus();\n }\n\n get saveButton() {\n return $$(this.ids.form)?.queryView({\n view: \"button\",\n type: \"form\",\n });\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormConnectComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewFormConnect_${baseView.id}`,\n Object.assign(\n {\n popup: \"\",\n editpopup: \"\",\n },\n ids\n )\n );\n\n this.addPageComponent = null;\n this.editPageComponent = null;\n }\n\n get field() {\n return this.view.field();\n }\n\n get multiselect() {\n return this.field?.settings.linkType == \"many\";\n }\n\n ui() {\n const field = this.field;\n const baseView = this.view;\n const form = baseView.parentFormComponent();\n const settings = this.settings;\n\n if (!field) {\n console.error(`This field could not found : ${settings.fieldId}`);\n\n return super.ui({\n view: \"label\",\n label: \"\",\n });\n }\n\n const multiselect = this.multiselect; // field.settings.linkType == \"many\";\n const formSettings = form?.settings || {};\n const ids = this.ids;\n\n let _ui = {\n id: ids.formItem,\n view: multiselect ? \"multicombo\" : \"combo\",\n name: field.columnName,\n required:\n field?.settings?.required || parseInt(settings?.required) || false,\n // label: field.label,\n // labelWidth: settings.labelWidth,\n dataFieldId: field.id,\n on: {\n onItemClick: (id, e) => {\n if (\n e.target.classList.contains(\"editConnectedPage\") &&\n e.target.dataset.itemId\n ) {\n const rowId = e.target.dataset.itemId;\n if (!rowId) return;\n this.goToEditPage(rowId);\n }\n },\n onChange: (data) => {\n this._onChange(data);\n },\n },\n };\n\n if (formSettings.showLabel) {\n _ui.label = field.label;\n _ui.labelWidth = formSettings.labelWidth;\n _ui.labelPosition = formSettings.labelPosition;\n }\n\n this.initAddEditTool();\n\n _ui.suggest = {\n button: true,\n selectAll: multiselect ? true : false,\n body: {\n data: [],\n template: `${\n baseView?.settings?.editForm\n ? ''\n : \"\"\n }#value#`,\n },\n on: {\n onShow: () => {\n field.populateOptionsDataCy($$(ids.formItem), field, form);\n },\n },\n // Support partial matches\n filter: ({ value }, search) =>\n value.toLowerCase().includes(search.toLowerCase()),\n };\n\n _ui.onClick = {\n customField: (id, e, trg) => {\n if (settings.disable === 1) return;\n\n const rowData = {};\n const $formItem = $$(ids.formItem);\n\n if ($formItem) {\n const node = $formItem.$view;\n\n field.customEdit(rowData, /* App,*/ node);\n }\n },\n };\n\n let apcUI = this.addPageComponent?.ui;\n if (apcUI) {\n // reset some component vals to make room for button\n _ui.label = \"\";\n _ui.labelWidth = 0;\n\n // add click event to add new button\n apcUI.on = {\n onItemClick: (/*id, evt*/) => {\n // let $form = $$(id).getFormView();\n this.addPageComponent?.onClick(form.datacollection);\n\n return false;\n },\n };\n\n if (_ui.labelPosition == \"top\") {\n _ui.labelPosition = \"left\";\n _ui = {\n inputId: ids.formItem,\n rows: [\n {\n view: \"label\",\n label: field.label,\n // height: 22,\n align: \"left\",\n },\n {\n cols: [apcUI, _ui],\n },\n ],\n };\n } else {\n _ui = {\n inputId: ids.formItem,\n rows: [\n {\n cols: [\n {\n view: \"label\",\n label: field.label,\n width: formSettings.labelWidth,\n align: \"left\",\n },\n apcUI,\n _ui,\n ],\n },\n ],\n };\n }\n\n _ui = super.ui(_ui);\n } else {\n _ui = {\n inputId: ids.formItem,\n rows: [_ui],\n };\n\n _ui = super.ui(_ui);\n\n delete _ui.rows[0].id;\n }\n\n return _ui;\n }\n\n async _onChange(data) {\n const ids = this.ids;\n const field = this.field;\n const baseView = this.view;\n\n if (this.multiselect) {\n if (typeof data == \"string\") {\n data = data.split(\",\");\n }\n }\n\n let selectedValues;\n if (Array.isArray(data)) {\n selectedValues = [];\n data.forEach((record) => {\n selectedValues.push(record.id || record);\n // let recordObj = record;\n // if (typeof record != \"object\") {\n // // we need to convert either index or uuid to full data object\n // recordObj = field.getItemFromVal(record);\n // }\n // if (recordObj?.id) selectedValues.push(recordObj.id);\n });\n } else {\n selectedValues = data;\n if (typeof data != \"object\") {\n // we need to convert either index or uuid to full data object\n selectedValues = field.getItemFromVal(data);\n }\n // selectedValues = field.pullRecordRelationValues(selectedValues);\n if (selectedValues?.id) {\n selectedValues = selectedValues.id;\n } else {\n selectedValues = data;\n }\n }\n\n // We can now set the new value but we need to block event listening\n // so it doesn't trigger onChange again\n const $formItem = $$(ids.formItem);\n\n // Q: if we don't have a $formItem, is any of the rest valid?\n if ($formItem) {\n // for xxx->one connections we need to populate again before setting\n // values because we need to use the selected values to add options\n // to the UI\n if (this?.field?.settings?.linkViaType == \"one\") {\n this.busy();\n await field.getAndPopulateOptions(\n $formItem,\n baseView.options,\n field,\n baseView.parentFormComponent()\n );\n this.ready();\n }\n\n $formItem.blockEvent();\n\n // store the user's selected option in local storage.\n field.saveSelect(selectedValues);\n\n const prepedVals = selectedValues.join\n ? selectedValues.join()\n : selectedValues;\n\n $formItem.setValue(prepedVals);\n $formItem.unblockEvent();\n }\n }\n\n async init(AB, options) {\n await super.init(AB);\n\n const $formItem = $$(this.ids.formItem);\n if ($formItem) webix.extend($formItem, webix.ProgressBar);\n\n this.initAddEditTool();\n }\n\n initAddEditTool() {\n const baseView = this.view;\n\n // Initial add/edit page tools\n const addFormID = baseView?.settings?.formView;\n if (addFormID && baseView && !this.addPageComponent) {\n this.addPageComponent = baseView.addPageTool.component(\n this.AB,\n `${baseView.id}_${addFormID}`\n );\n this.addPageComponent.applicationLoad(baseView.application);\n this.addPageComponent.init({\n onSaveData: this.callbackSaveData.bind(this),\n onCancelClick: this.callbackCancel.bind(this),\n clearOnLoad: this.callbackClearOnLoad.bind(this),\n });\n }\n\n const editFormID = baseView?.settings?.editForm;\n if (editFormID && baseView && !this.editPageComponent) {\n this.editPageComponent = baseView.editPageTool.component(\n this.AB,\n `${baseView.id}_${editFormID}`\n );\n this.editPageComponent.applicationLoad(baseView.application);\n this.editPageComponent.init({\n onSaveData: this.callbackSaveData.bind(this),\n onCancelClick: this.callbackCancel.bind(this),\n clearOnLoad: this.callbackClearOnLoad.bind(this),\n });\n }\n }\n\n async callbackSaveData(saveData) {\n if (saveData == null) return;\n else if (!Array.isArray(saveData)) saveData = [saveData];\n\n const ids = this.ids;\n const field = this.field;\n\n // find the select component\n const $formItem = $$(ids.formItem);\n if (!$formItem) return;\n\n // Refresh option list\n this.busy();\n field.clearStorage(this.view.settings.filterConditions);\n const data = await field.getAndPopulateOptions(\n $formItem,\n this.view.options,\n field,\n this.view.parentFormComponent()\n );\n this.ready();\n\n // field.once(\"option.data\", (data) => {\n data.forEach((item) => {\n item.value = item.text;\n });\n\n $formItem.getList().clearAll();\n $formItem.getList().define(\"data\", data);\n\n if (field.settings.linkType === \"many\") {\n let selectedItems = $formItem.getValue();\n saveData.forEach((sData) => {\n if (selectedItems.indexOf(sData.id) === -1)\n selectedItems = selectedItems\n ? `${selectedItems},${sData.id}`\n : sData.id;\n });\n\n $formItem.setValue(selectedItems);\n } else {\n $formItem.setValue(saveData[0].id);\n }\n // close the popup when we are finished\n // $$(ids.popup)?.close();\n // $$(ids.editpopup)?.close();\n // });\n\n // field.getOptions(this.settings.filterConditions, \"\");\n // .then(function (data) {\n // // we need new option that will be returned from server (above)\n // // so we will not set this and then just reset it.\n // });\n }\n\n callbackCancel() {\n $$(this.ids?.popup)?.close?.();\n\n return false;\n }\n\n callbackClearOnLoad() {\n return true;\n }\n\n getValue(rowData) {\n return this.field.getValue($$(this.ids.formItem), rowData);\n }\n\n formBusy($form) {\n if (!$form) return;\n\n $form.disable?.();\n $form.showProgress?.({ type: \"icon\" });\n }\n\n formReady($form) {\n if (!$form) return;\n\n $form.enable?.();\n $form.hideProgress?.();\n }\n\n goToEditPage(rowId) {\n const settings = this.settings;\n\n if (!settings.editForm) return;\n\n const editForm = this.view.application.urlResolve(settings.editForm);\n\n if (!editForm) return;\n\n const $form = $$(this.ids.formItem).getFormView() || null;\n\n // Open the form popup\n this.editPageComponent.onClick().then(() => {\n const dc = editForm.datacollection;\n\n if (dc) {\n dc.setCursor(rowId);\n\n this.__editFormDcEvent =\n this.__editFormDcEvent ||\n dc.on(\"initializedData\", () => {\n dc.setCursor(rowId);\n });\n }\n });\n }\n\n async onShow() {\n const ids = this.ids;\n const $formItem = $$(ids.formItem);\n\n if (!$formItem) return;\n\n const field = this.field;\n\n if (!field) return;\n\n const node = $formItem.$view;\n\n if (!node) return;\n\n const $node = $$(node);\n\n if (!$node) return;\n\n const settings = this.settings;\n let filterConditions = {\n glue: \"and\",\n rules: [],\n };\n\n if (settings?.filterConditions?.rules?.length) {\n filterConditions = this.AB.cloneDeep(\n this.view.settings.filterConditions\n );\n }\n\n // NOTE: compatible with version 1. This code should not be here too long.\n if (\n !filterConditions?.rules?.length &&\n settings?.objectWorkspace?.filterConditions?.rules?.length\n ) {\n filterConditions = this.AB.cloneDeep(\n settings.objectWorkspace.filterConditions\n );\n }\n\n // Add the filter connected value\n if ((settings?.filterConnectedValue ?? \"\").indexOf(\":\") > -1) {\n const values = settings.filterConnectedValue.split(\":\"),\n uiConfigName = values[0],\n connectFieldId = values[1];\n\n filterConditions.rules.push({\n key: connectFieldId,\n rule: \"filterByConnectValue\",\n value: uiConfigName,\n });\n }\n\n const getFilterByConnectValues = (conditions, depth = 0) => {\n return [\n ...conditions.rules\n .filter((e) => e.rule === \"filterByConnectValue\")\n .map((e) => {\n const filterByConnectValue = Object.assign({}, e);\n\n filterByConnectValue.depth = depth;\n\n return filterByConnectValue;\n }),\n ].concat(\n ...conditions.rules\n .filter((e) => e.glue)\n .map((e) => getFilterByConnectValues(e, depth + 1))\n );\n };\n\n const baseView = this.view;\n const filterByConnectValues = getFilterByConnectValues(\n filterConditions\n ).map((e) => {\n for (const key in baseView.parent.viewComponents) {\n if (\n !(\n baseView.parent.viewComponents[key] instanceof\n this.constructor\n )\n )\n continue;\n\n const $ui = $$(\n baseView.parent.viewComponents[key]\n .ui()\n .rows.find((vc) => vc.inputId)?.inputId\n );\n\n if ($ui?.config?.name === e.value) {\n // we need to use the element id stored in the settings to find out what the\n // ui component id is so later we can use it to look up its current value\n e.filterValue = $ui;\n\n break;\n }\n }\n\n const ab = this.AB;\n const field = ab\n .objectByID(settings.objectId)\n .fieldByID(settings.fieldId);\n const linkedObject = ab.objectByID(field.settings.linkObject);\n const linkedField = linkedObject.fieldByID(e.key);\n\n if (linkedField?.settings?.isCustomFK) {\n // finally if this is a custom foreign key we need the stored columnName by\n // default uuid is passed for all non CFK\n e.filterColumn = ab\n .objectByID(linkedField.settings.linkObject)\n .fields(\n (filter) =>\n filter.id === linkedField.settings.indexField ||\n linkedField.settings.indexField2\n )[0].columnName;\n } else e.filterColumn = null;\n\n return e;\n });\n\n baseView.options = {\n formView: settings.formView,\n filters: filterConditions,\n // NOTE: settings.objectWorkspace.xxx is a depreciated setting.\n // We will be phasing this out.\n sort: settings.sortFields ?? settings.objectWorkspace?.sortFields,\n editable: settings.disable === 1 ? false : true,\n editPage:\n !settings.editForm || settings.editForm === \"none\" ? false : true,\n filterByConnectValues,\n };\n\n // if this field's options are filtered off another field's value we need\n // to make sure the UX helps the user know what to do.\n // fetch the options and set placeholder text for this view\n if (baseView.options.editable) {\n const parentFields = [];\n\n filterByConnectValues.forEach((fv) => {\n if (fv.filterValue && fv.key) {\n const $filterValueConfig = $$(fv.filterValue.config.id);\n\n let parentField = null;\n\n if (!$filterValueConfig) {\n // this happens in the Interface Builder when only the single form UI is displayed\n parentField = {\n id: \"perentElement\",\n label: this.label(\"PARENT ELEMENT\"),\n };\n } else {\n const value = field.getValue($filterValueConfig);\n\n if (!value) {\n // if there isn't a value on the parent select element set this one to readonly and change placeholder text\n parentField = {\n id: fv.filterValue.config.id,\n label: $filterValueConfig.config.label,\n };\n }\n\n $filterValueConfig.attachEvent(\n \"onChange\",\n async (e) => {\n const parentVal = $filterValueConfig.getValue();\n\n if (parentVal) {\n $node.define(\"disabled\", false);\n $node.define(\n \"placeholder\",\n this.label(\"Select items\")\n );\n this.busy();\n await field.getAndPopulateOptions(\n $node,\n baseView.options,\n field,\n baseView.parentFormComponent()\n );\n this.ready();\n } else {\n $node.define(\"disabled\", true);\n $node.define(\n \"placeholder\",\n this.label(\"Must select item from '{0}' first.\", [\n $filterValueConfig.config.label,\n ])\n );\n }\n\n // TODO: Do we need to clear selected value?\n // $node.setValue(\"\");\n $node.refresh();\n },\n false\n );\n }\n\n if (\n parentField &&\n parentFields.findIndex((e) => e.id === parentField.id) < 0\n )\n parentFields.push(parentField);\n }\n });\n\n if (parentFields.length && !$node.getValue()) {\n $node.define(\"disabled\", true);\n $node.define(\n \"placeholder\",\n this.label(`Must select item from '{0}' first.`, [\n parentFields.map((e) => e.label).join(\", \"),\n ])\n );\n } else {\n $node.define(\"disabled\", false);\n $node.define(\"placeholder\", this.label(\"Select items\"));\n }\n } else {\n $node.define(\"placeholder\", \"\");\n $node.define(\"disabled\", true);\n }\n\n $node.refresh();\n\n // Add data-cy attributes\n const dataCy = `${field.key} ${field.columnName} ${field.id} ${baseView.parent.id}`;\n node.setAttribute(\"data-cy\", dataCy);\n\n this.busy();\n try {\n await field.getAndPopulateOptions(\n // $node,\n $formItem,\n baseView.options,\n field,\n baseView.parentFormComponent()\n );\n } catch (err) {\n this.AB.notify.developer(err, {\n context:\n \"ABViewFormConnectComponent > onShow() error calling field.getAndPopulateOptions\",\n });\n }\n this.ready();\n\n // Need to refresh selected values when they are custom index\n this._onChange($formItem.getValue());\n }\n\n busy() {\n const $formItem = $$(this.ids.formItem);\n\n $formItem?.disable();\n $formItem?.showProgress?.({ type: \"icon\" });\n }\n\n ready() {\n const $formItem = $$(this.ids.formItem);\n\n $formItem?.enable();\n $formItem?.hideProgress?.();\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\nconst ABFieldImage = require(\"../../dataFields/ABFieldImage\");\nconst FocusableTemplate = require(\"../../../../webix_custom_components/focusableTemplate\");\n\nconst DEFAULT_HEIGHT = 80;\n\nmodule.exports = class ABViewFormCustomComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormCustom_${baseView.id}`, ids);\n }\n\n get new_width() {\n const baseView = this.view;\n const form = baseView.parentFormComponent();\n const formSettings = form?.settings ?? {};\n const settings = baseView.settings ?? {};\n\n let newWidth = formSettings.labelWidth;\n\n if (settings.formView) newWidth += 40;\n else if (formSettings.showLabel && formSettings.labelPosition === \"top\")\n newWidth = 0;\n\n return newWidth;\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field();\n const form = baseView.parentFormComponent();\n const formSettings = form?.settings ?? {};\n const settings = field?.settings ?? baseView.settings ?? {};\n\n const requiredClass =\n field?.settings?.required || this.settings.required\n ? \"webix_required\"\n : \"\";\n\n let templateLabel = \"\";\n\n if (formSettings.showLabel) {\n if (formSettings.labelPosition === \"top\")\n templateLabel = ``;\n else\n templateLabel = ``;\n }\n\n let height = 38;\n let width = this.new_width;\n\n if (typeof field == \"undefined\") {\n console.warn(\n `BaseView[${baseView.id}] returned an undefined field()`,\n baseView.toObj()\n );\n }\n\n if (field instanceof ABFieldImage) {\n if (settings.useHeight) {\n if (formSettings.labelPosition === \"top\") {\n height = parseInt(settings.imageHeight) || DEFAULT_HEIGHT;\n height += 38;\n } else {\n height = parseInt(settings.imageHeight) || DEFAULT_HEIGHT;\n }\n } else if (formSettings.labelPosition === \"top\") {\n height = DEFAULT_HEIGHT + 38;\n } else {\n if (DEFAULT_HEIGHT > 38) {\n height = DEFAULT_HEIGHT;\n }\n }\n width =\n settings.useWidth && settings.imageWidth ? settings.imageWidth : 0;\n } else if (formSettings.showLabel && formSettings.labelPosition === \"top\")\n height = DEFAULT_HEIGHT;\n\n let template = `
    ${\n formSettings.labelPosition == \"top\" ? \"\" : templateLabel\n }#template#
    `\n .replace(/#width#/g, formSettings.labelWidth)\n .replace(/#label#/g, field?.label ?? \"\")\n .replace(\n /#template#/g,\n field\n ?.columnHeader({\n width: width,\n height: height,\n editable: true,\n })\n .template({}) ?? \"\"\n );\n\n if (settings.useWidth == 0) {\n template = template.replace(\n /\"ab-image-data-field\" style=\"float: left; width: 100%/g,\n '\"ab-image-data-field\" style=\"float: left; width: calc(100% - ' +\n formSettings.labelWidth +\n \"px)\"\n );\n }\n\n return super.ui({\n view: \"forminput\",\n labelWidth: 0,\n paddingY: 0,\n paddingX: 0,\n css: \"ab-custom-field\",\n // label: field.label,\n // labelPosition: settings.labelPosition, // webix.forminput does not have .labelPosition T T\n // labelWidth: settings.labelWidth,\n body: {\n view: new FocusableTemplate(this.AB._App).key,\n css: \"customFieldCls\",\n borderless: true,\n template: template,\n height: height,\n onClick: {\n customField: (evt, e, trg) => {\n if (settings.disable === 1) return;\n\n let rowData = {};\n\n const formView =\n this?.parentFormComponent?.() ||\n this.view?.parentFormComponent?.();\n\n if (formView) {\n const dv = formView.datacollection;\n if (dv) rowData = dv.getCursor() || {};\n }\n\n // var node = $$(ids.formItem).$view;\n let node = $$(trg).getParentView().$view;\n field?.customEdit(\n rowData,\n this.AB_App,\n node,\n this.ids.formItem,\n evt\n );\n },\n },\n },\n });\n }\n\n onShow() {\n const ids = this.ids;\n const $formItem = $$(ids.formItem);\n\n if (!$formItem) return;\n\n const baseView = this.view;\n const field = baseView.field(),\n rowData = {},\n node = $formItem.$view;\n\n // Add data-cy attributes\n const dataCy = `${baseView.key} ${field.key} ${field.columnName} ${baseView.id} ${baseView.parent.id}`;\n node.setAttribute(\"data-cy\", dataCy);\n\n const options = {\n formId: ids.formItem,\n editable: baseView.settings.disable === 1 ? false : true,\n };\n\n if (field instanceof ABFieldImage) {\n options.height = field.settings.useHeight\n ? parseInt(field.settings.imageHeight) || DEFAULT_HEIGHT\n : DEFAULT_HEIGHT;\n options.width = field.settings.useWidth\n ? parseInt(field.settings.imageWidth) || 0\n : 0;\n }\n\n field.customDisplay(rowData, this.AB._App, node, options);\n }\n\n getValue(rowData) {\n const field = this.view.field();\n const $formItem = $$(this.ids.formItem);\n\n return field.getValue($formItem, rowData);\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormDatepickerComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormDatepicker_${baseView.id}`, ids);\n }\n\n ui() {\n const self = this;\n const field = this.view.field();\n\n const _ui = {\n view: \"datepicker\",\n suggest: {\n body: {\n view:\n this.AB.Account?._config?.languageCode == \"th\"\n ? \"thaicalendar\"\n : \"calendar\",\n type: field.settings?.dateFormat === 1 ? \"time\" : \"\",\n timepicker:\n field.key === \"datetime\" && field.settings?.timeFormat !== 1\n ? true\n : false,\n editable: true,\n on: {\n onAfterDateSelect: function (date) {\n this.getParentView().setMasterValue({\n value: date,\n });\n },\n onTodaySet: function (date) {\n this.getParentView().setMasterValue({\n value: date,\n });\n },\n onDateClear: function (date) {\n this.getParentView().setMasterValue({\n value: date,\n });\n },\n },\n },\n on: {\n onShow: function () {\n const text = this.getMasterValue();\n const field = self.view.field();\n if (!text || !field) return true;\n\n const vals = {};\n vals[field.columnName] = text;\n const date = self.getValue(vals);\n\n const $calendar = this.getChildViews()[0];\n $calendar.setValue(date);\n },\n },\n },\n };\n\n if (!field) return _ui;\n\n // Ignore date - Only time picker\n if (field.settings?.dateFormat === 1) _ui.type = \"time\";\n\n // Date & Time picker\n if (field.key === \"datetime\" && field.settings?.timeFormat !== 1)\n _ui.timepicker = true;\n\n // allows entering characters in datepicker input, false by default\n _ui.editable = true;\n\n // default value\n if (_ui.value && !(_ui.value instanceof Date))\n _ui.value = new Date(_ui.value);\n\n // if we have webix locale set, will use the date format form there.\n if (!window.webixLocale) _ui.format = field.getFormat();\n\n return super.ui(_ui);\n }\n\n getValue(rowData) {\n const field = this.view.field();\n const text = rowData[field.columnName];\n if (!field || !text) return null;\n\n // Sentry Fix: caught an error where this.AB was not set, but this.view was...\n // attempt to catch this situation and post more data:\n if (!this.AB) {\n if (this.view.AB) {\n this.AB = this.view.AB;\n } else {\n let errNoAB = new Error(\n \"ABViewFormDatePicerComponent:getValue(): AB was not set.\"\n );\n // sentry logs the console before the error, so dump the offending view here:\n console.log(\"view:\", JSON.stringify(this.view.toObj()));\n throw errNoAB;\n }\n }\n // NOTE: if we are using the Thai language we force the format to be \"%d/%m/%Y\" in th-TH.js:13\n // so we have to use that format here\n let dateVal = this.AB.Webix.Date.strToDate(field.getFormat())(text);\n if (this.AB.Account?._config?.languageCode == \"th\") {\n dateVal = this.AB.Webix.Date.strToDate(\"%j/%m/%Y\")(text);\n }\n const date = dateVal;\n\n if (\n this.AB.Account?._config?.languageCode == \"th\" &&\n field.settings?.dateFormat !== 1\n )\n date.setFullYear(date.getFullYear() - 543);\n\n return date;\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewFormItemComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewFormItem_${baseView.id}`,\n Object.assign({ formItem: \"\" }, ids)\n );\n }\n\n ui(uiFormItemComponent = {}) {\n // setup 'label' of the element\n const baseView = this.view;\n const form = baseView.parentFormComponent(),\n field = baseView.field?.() || null,\n label = \"\";\n const settings = form?.settings || {};\n const _uiFormItem = {\n id: this.ids.formItem,\n labelPosition: settings.labelPosition,\n labelWidth: settings.labelWidth,\n label,\n };\n\n if (field) {\n _uiFormItem.name = field.columnName;\n\n // default value\n const data = {};\n\n field.defaultValue(data);\n\n if (data[field.columnName]) _uiFormItem.value = data[field.columnName];\n\n if (settings.showLabel) _uiFormItem.label = field.label;\n\n if (field.settings.required || baseView.settings?.required)\n _uiFormItem.required = 1;\n\n if (baseView.settings?.disable === 1) _uiFormItem.disabled = true;\n\n // add data-cy to form element for better testing code\n _uiFormItem.on = {\n onAfterRender() {\n if (this.getList) {\n const popup = this.getPopup();\n\n if (!popup) return;\n\n this.getList().data.each((option) => {\n if (!option) return;\n\n // our option.ids are based on builder input and can include the ' character\n const node = popup.$view.querySelector(\n `[webix_l_id='${(option?.id ?? \"\")\n .toString()\n .replaceAll(\"'\", \"\\\\'\")}']`\n );\n\n if (!node) return;\n\n node.setAttribute(\n \"data-cy\",\n `${field.key} options ${option.id} ${field.id} ${\n form?.id || \"nf\"\n }`\n );\n });\n }\n\n this.getInputNode?.().setAttribute?.(\n \"data-cy\",\n `${field.key} ${field.columnName} ${field.id} ${\n form?.id || \"nf\"\n }`\n );\n },\n };\n\n // this may be needed if we want to format data at this point\n // if (field.format) data = field.format(data);\n\n _uiFormItem.validate = (val, data, colName) => {\n const validator = this.AB.Validation.validator();\n\n field.isValidData(data, validator);\n\n return validator.pass();\n };\n }\n\n const _ui = super.ui([\n Object.assign({}, _uiFormItem, uiFormItemComponent),\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormJsonComponent extends ABViewFormItemComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormJson_${baseView.id}`, ids);\n if (this.settings.type == \"filter\") {\n this.rowFilter = this.AB.filterComplexNew(\n `${baseView.id}_filterComplex`,\n {\n isSaveHidden: true,\n height: 300,\n borderless: false,\n showObjectName: true,\n }\n );\n }\n }\n\n getFilterField(instance) {\n if (\n instance?.settings?.filterField &&\n instance?.view?.parent?.viewComponents\n ) {\n let filterField = \"\";\n for (const [key, value] of Object.entries(\n instance.view.parent.viewComponents\n )) {\n if (value.settings.fieldId == instance.settings.filterField) {\n filterField = value;\n }\n }\n\n if (filterField?.ids?.formItem) {\n return filterField.ids.formItem;\n } else {\n return \"\";\n }\n } else {\n return \"\";\n }\n }\n\n get getSystemObjects() {\n // get list of all objects in the app\n let objects = this.AB.objects();\n // reformat objects into simple array for Webix multicombo\n // if you do not the data causes a maximum stack error\n let objectsArray = [];\n objects.forEach((obj) => {\n objectsArray.push({ id: obj.id, label: obj.label });\n });\n // return the simple array\n return objectsArray;\n }\n\n refreshFilter(values) {\n if (values) {\n let fieldDefs = [];\n values.forEach((obj) => {\n let object = this.AB.objectByID(obj);\n let fields = object.fields();\n if (fields.length) {\n fields.forEach((f) => {\n fieldDefs.push(f);\n });\n }\n });\n this.rowFilter.fieldsLoad(fieldDefs);\n if ($$(this.ids.formItem).config.value)\n this.rowFilter.setValue($$(this.ids.formItem).config.value);\n } else {\n this.rowFilter.fieldsLoad([]);\n if ($$(this.ids.formItem).config.value)\n this.rowFilter.setValue($$(this.ids.formItem).config.value);\n }\n }\n\n getValue() {\n return this.rowFilter.getValue();\n }\n\n setValue(formVals) {\n $$(this.ids.formItem).config.value = formVals;\n }\n\n ui() {\n const _ui = {};\n\n switch (\n this.settings.type ||\n this.view.settings.type ||\n this.view.constructor.defaultValues().type\n ) {\n case \"string\":\n _ui.view = \"textarea\";\n _ui.disabled = true;\n _ui.height = 200;\n _ui.format = {\n parse: function (parsed) {\n try {\n parsed = JSON.parse(parsed);\n } catch (err) {\n // already parsed\n }\n return parsed;\n },\n edit: function (stringify) {\n try {\n stringify = JSON.stringify(stringify);\n } catch (err) {\n // already a string\n }\n return stringify;\n },\n };\n break;\n case \"systemObject\":\n _ui.view = \"multicombo\";\n _ui.placeholder = this.label(\"Select one or more system objects\");\n _ui.button = false;\n _ui.stringResult = false;\n _ui.suggest = {\n selectAll: true,\n body: {\n data: this.getSystemObjects,\n template: webix.template(\"#label#\"),\n },\n };\n break;\n case \"filter\":\n _ui.view = \"forminput\";\n _ui.css = \"ab-custom-field\";\n _ui.body = this.rowFilter.ui;\n break;\n }\n\n return super.ui(_ui);\n }\n\n init() {\n // if (this.settings.type == \"filter\") {\n // this.rowFilter.init({ showObjectName: true });\n // }\n }\n\n onShow() {\n const _ui = this.ui();\n if (this?.settings?.type == \"filter\") {\n let filterField = this.getFilterField(this);\n if (!$$(filterField)) return;\n $$(filterField).detachEvent(\"onChange\");\n $$(filterField).attachEvent(\"onChange\", (values) => {\n this.refreshFilter(values);\n });\n this.rowFilter.init({ showObjectName: true });\n this.rowFilter.on(\"changed\", (val) => {\n this.setValue(val);\n });\n if ($$(this.ids.formItem).config.value) {\n this.rowFilter.setValue($$(this.ids.formItem).config.value);\n } else {\n this.rowFilter.setValue(\"\");\n }\n }\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\nconst NumberTextInput = require(\"../../../../webix_custom_components/numbertext\");\n\nmodule.exports = class ABViewFormNumberComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormNumber_${baseView.id}`, ids);\n\n this._numberTextInputKey = null;\n }\n\n get numberTextInputKey() {\n return (this._numberTextInputKey =\n this._numberTextInputKey || new NumberTextInput(this.AB._App).key);\n }\n\n ui() {\n return super.ui({\n view: this.settings.isStepper ? \"counter\" : this.numberTextInputKey,\n type: \"number\",\n validate: (val) => !isNaN(val * 1),\n });\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormReadonlyComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewFormReadonly_${baseView.id}`,\n Object.assign(\n {\n template: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field();\n\n const _ui = {\n view: \"forminput\",\n labelWidth: 0,\n paddingY: 0,\n paddingX: 0,\n readonly: true,\n css: \"ab-readonly-field\",\n // name: component.ui.name,\n // label: field.label,\n // labelPosition: settings.labelPosition, // webix.forminput does not have .labelPosition T T\n // labelWidth: settings.labelWidth,\n body: {\n id: this.ids.template,\n view: \"label\",\n borderless: true,\n css: { \"background-color\": \"#fff\" },\n label: \"\",\n },\n };\n\n const settings = baseView.parentFormComponent().settings || {};\n\n if (settings.showLabel == true && settings.labelPosition == \"top\") {\n _ui.body.height = 80;\n } else if (field.settings.useHeight) {\n _ui.body.height = parseInt(field.settings.imageHeight) || 38;\n } else _ui.body.height = 38;\n\n return super.ui(_ui);\n }\n\n async init(AB) {\n await super.init(AB);\n\n const $formItem = $$(this.ids.formItem);\n if (!$formItem) return;\n\n const $form = $formItem.getFormView();\n const rowData = $form?.getValues() ?? {};\n\n this.refresh(rowData);\n $form?.attachEvent(\"onChange\", (newv, oldv) => {\n const rowData = $form?.getValues() ?? {};\n\n this.refresh(rowData);\n });\n }\n\n onShow() {\n const $formItem = $$(this.ids.formItem);\n if (!$formItem) return;\n\n const $form = $formItem.getFormView();\n const rowData = $form?.getValues() ?? {};\n\n this.refresh(rowData);\n }\n\n getValue(rowData) {\n const field = this.view.field();\n if (!field) return null;\n\n return rowData[field.columnName];\n }\n\n refresh(rowData) {\n const baseView = this.view;\n const form = baseView.parentFormComponent(),\n field = baseView.field();\n\n const formSettings = form.settings || {};\n\n let templateLabel = \"\";\n\n if (formSettings.showLabel) {\n if (formSettings.labelPosition === \"top\")\n templateLabel = ``;\n else\n templateLabel = ``;\n }\n\n let newWidth = formSettings.labelWidth;\n\n if (this.settings.formView) newWidth += 40;\n else if (formSettings.showLabel && formSettings.labelPosition === \"top\")\n newWidth = 0;\n\n const template =\n `
    ${templateLabel}#template#
    `.replace(\n /#template#/g,\n field\n .columnHeader({\n width: newWidth,\n editable: true,\n })\n .template(rowData)\n );\n\n // Re-build template element\n $$(this.ids.template)?.setHTML(template);\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormSelectMultipleComponentComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormSelectMultiple_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field(),\n settings = this.settings;\n const options = [];\n\n if (field?.key === \"user\") options.push(...field.getUsers());\n else if (field)\n options.push(...(field.settings.options ?? settings.options ?? []));\n\n const ids = this.ids;\n const _ui = {\n id: ids.formItem,\n view: settings.type || baseView.constructor.defaultValues().type,\n options: options.map((opt) => {\n return {\n id: opt.id,\n value: opt.text,\n hex: opt.hex,\n };\n }),\n };\n\n switch (_ui.view) {\n case \"multicombo\":\n _ui.tagMode = false;\n _ui.css = \"hideWebixMulticomboTag\";\n _ui.tagTemplate = (values) => {\n const selectedOptions = [];\n const $formItem = $$(ids.formItem) ?? $$(_ui.id);\n\n values.forEach((val) => {\n selectedOptions.push($formItem.getList().getItem(val));\n });\n\n let vals = selectedOptions;\n\n if (field.getSelectedOptions)\n vals = field.getSelectedOptions(field, selectedOptions);\n\n const items = [];\n\n vals.forEach((val) => {\n let hasCustomColor = \"\";\n let optionHex = \"\";\n\n if (field.settings.hasColors && val.hex) {\n hasCustomColor = \"hascustomcolor\";\n optionHex = `background: ${val.hex};`;\n }\n\n const text = val.text ? val.text : val.value;\n\n items.push(\n `${text}`\n );\n });\n\n return items.join(\"\");\n };\n\n break;\n\n case \"checkbox\":\n // radio element could not be empty options\n _ui.options.push({\n id: \"temp\",\n value: this.label(\"Option\"),\n });\n\n break;\n }\n\n return super.ui(_ui);\n }\n\n getValue(rowData) {\n const field = this.view.field(),\n $formItem = $$(this.ids.formItem);\n\n return field.getValue($formItem, rowData);\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormSelectSingleComponentComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormSelectSingle_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field(),\n settings = baseView.settings;\n const options = [];\n\n if (field?.key === \"user\") options.push(...field.getUsers());\n else if (field)\n options.push(...(field.settings.options ?? settings.options ?? []));\n else options.push(...(settings.options ?? []));\n\n const _ui = {\n view: settings.type || baseView.constructor.defaultValues().type,\n };\n\n if (field?.settings.hasColors) {\n _ui.css = \"combowithcolors\";\n _ui.options = {\n view: \"suggest\",\n body: {\n view: \"list\",\n data: options.map((opt) => {\n return {\n id: opt.id,\n value: opt.text || opt.value,\n hex: field.settings.hasColors ? opt.hex : \"\",\n };\n }),\n template: function (value) {\n const items = [];\n\n let hasCustomColor = \"\";\n let optionHex = \"\";\n\n if (value.hex) {\n hasCustomColor = \"hascustomcolor\";\n optionHex = `background: ${value.hex};`;\n }\n\n items.push(\n `${value.value}`\n );\n\n return items.join(\"\");\n },\n },\n };\n } else\n _ui.options = options.map((opt) => {\n return {\n id: opt.id,\n value: opt.text || opt.value,\n };\n });\n\n // radio element could not be empty options\n if (_ui.view === \"radio\" && _ui.options.length < 1)\n _ui.options.push({\n id: \"temp\",\n value: this.label(\"Option\"),\n });\n\n return super.ui(_ui);\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormTextboxComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormTextbox_${baseView.id}`, ids);\n this.type =\n this.settings.type ||\n this.view.settings.type ||\n this.view.constructor.defaultValues().type;\n }\n\n ui() {\n const _ui = {};\n\n switch (this.type) {\n case \"single\":\n _ui.view = \"text\";\n break;\n case \"multiple\":\n _ui.view = \"textarea\";\n _ui.height = 200;\n break;\n case \"rich\":\n _ui.view = \"forminput\";\n _ui.height = 200;\n _ui.css = \"ab-rich-text\";\n _ui.body = {\n view: \"tinymce-editor\",\n value: \"\",\n cdn: \"/js/webix/extras/tinymce\",\n config: {\n plugins: \"link\",\n menubar: \"format edit\",\n toolbar:\n \"undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | fontsizeselect | link\",\n },\n };\n break;\n }\n\n return super.ui(_ui);\n }\n\n async onShow() {\n if (this.type !== \"rich\") return;\n await this.initTinyMCE();\n const _ui = this.ui();\n const _uiFormItem = _ui.rows[0];\n let $formItem = $$(this.ids.formItem);\n\n // WORKAROUND : to fix breaks TinyMCE when switch pages/tabs\n // https://forum.webix.com/discussion/6772/switching-tabs-breaks-tinymce\n if ($formItem) {\n // recreate rich editor\n $formItem = this.AB.Webix.ui(_uiFormItem, $formItem);\n\n // Add dataCy to TinyMCE text editor\n const baseView = this.view;\n\n $formItem\n .getChildViews()[0]\n .getEditor(true)\n .then((editor) => {\n const dataCy = `${baseView.key} rich ${_uiFormItem.name} ${\n baseView.id ?? \"\"\n } ${baseView.parent?.id ?? \"\"}`;\n\n editor.contentAreaContainer.setAttribute(\"data-cy\", dataCy);\n });\n }\n }\n\n /**\n * Ensure TinyMCE has been loaded and initialized.\n */\n async initTinyMCE() {\n await this.AB.custom[\"tinymce-editor\"].init();\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormTreeComponent extends ABViewFormItemComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormTree_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field();\n\n const _ui = {};\n\n // this field may be deleted\n if (!field) return super.ui(_ui);\n\n const formSettings = baseView.parentFormComponent().settings || {};\n\n const requiredClass =\n field.settings.required === 1 ? \"webix_required\" : \"\";\n\n let templateLabel = \"\";\n\n if (formSettings.showLabel) {\n if (formSettings.labelPosition === \"top\")\n templateLabel = ``;\n else\n templateLabel = ``;\n }\n\n let newWidth = formSettings.labelWidth;\n\n if (this.settings.formView) newWidth += 40;\n\n const template = `${templateLabel}#template#`\n .replace(/#width#/g, formSettings.labelWidth)\n .replace(/#label#/g, field.label)\n .replace(\n /#template#/g,\n field.columnHeader({\n width: newWidth,\n }).template\n );\n\n _ui.view = \"template\";\n _ui.css = \"webix_el_box\";\n _ui.height =\n field.settings.useHeight === 1\n ? parseInt(field.settings.imageHeight)\n : 38;\n _ui.borderless = true;\n\n _ui.template = `
    ${template}
    `;\n\n _ui.onClick = {\n customField: (id, e, trg) => {\n const rowData = {},\n node = $$(this.ids.formItem).$view;\n\n rowData[field.columnName] = this.getValue();\n field.customEdit(rowData, this.AB._App, node, this);\n },\n };\n\n return super.ui(_ui);\n }\n\n getValue(rowData) {\n let vals = $$(this.ids.formItem).getValues();\n\n // Pass empty string if the returned values is empty array\n if (Array.isArray(vals) && vals.length === 0) vals = \"\";\n\n return vals;\n }\n};\n","import ABViewComponent from \"./ABViewComponent\";\n\nexport default class ABViewGanttComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewGantt_${baseView.id}`,\n Object.assign(\n {\n menu: \"\",\n gantt: \"\",\n },\n ids\n )\n );\n\n this._tempDC = null;\n // {ABDataCollection}\n // A link to a DC that was passed in. NOTE: this is only for\n // the temp DCs created in the AppBuilder Designer and passed\n // in. Normal DCs are handled by the default CurrentDatacollection\n // methods.\n\n this.TitleField = null;\n this.StartDateField = null;\n this.EndDateField = null;\n this.DurationField = null;\n this.ProgressField = null;\n this.NotesField = null;\n\n this.originalStartDate = null;\n this.originalEndDate = null;\n\n this.pendingAdds = {};\n // {Promise} /* id : {Promise} */\n // In order to prevent a race condition where multiple adds can be\n // generated on the same item, we catch the repeats and just return\n // the same data for each.\n\n const idGantt = this.ids.gantt;\n\n this.ganttElement = {\n isExistsTask: (taskId) => {\n const localService = $$(idGantt).getService(\"local\");\n if (!localService) return false;\n\n const tasksData = localService.tasks();\n if (!tasksData || !tasksData.exists) return false;\n\n return tasksData.exists(taskId);\n },\n removeTask: (taskId) => {\n if (!this.ganttElement.isExistsTask(taskId)) return;\n\n const opsService = $$(idGantt).getService(\"operations\");\n if (!opsService) return;\n\n return opsService.removeTask(taskId);\n },\n };\n }\n\n ui() {\n const ids = this.ids;\n const self = this;\n const { YEAR_SCALE, MONTH_SCALE, DAY_SCALE } = this.getConstantScales;\n const _ui = super.ui([\n {\n cols: [\n { fillspace: true },\n {\n view: \"menu\",\n id: ids.menu,\n layout: \"x\",\n width: 300,\n data: [\n {\n id: \"day\",\n value: this.label(\"Day\"),\n },\n {\n id: \"week\",\n value: this.label(\"Week\"),\n },\n {\n id: \"month\",\n value: this.label(\"Month\"),\n },\n {\n id: \"year\",\n value: this.label(\"Year\"),\n },\n ],\n on: {\n onItemClick: (id /* , e, node */) => {\n this.setScale(id);\n },\n },\n },\n ],\n },\n {\n id: ids.gantt,\n view: \"gantt\",\n scales: [YEAR_SCALE, MONTH_SCALE, DAY_SCALE],\n override: new Map([\n [\n gantt.services.Backend,\n // global webix gantt object\n class MyBackend extends gantt.services.Backend {\n async tasks() {\n const DC = self.CurrentDatacollection;\n if (!DC) return [];\n\n // if (DC.dataStatus != DC.dataStatusFlag.initialized) {\n // await DC.loadData().catch((err) => {\n // console.error(err);\n // });\n // }\n return (DC.getData() || []).map((d, indx) =>\n self.convertFormat(d, indx)\n );\n }\n links() {\n return Promise.resolve([]);\n }\n async addTask(obj, index, parent) {\n if (!self.pendingAdds[obj.id]) {\n self.pendingAdds[obj.id] = self.taskAdd(obj);\n }\n const newTask = await self.pendingAdds[obj.id];\n delete self.pendingAdds[obj.id];\n return {\n id: (newTask || {}).id,\n };\n }\n async updateTask(id, obj) {\n return await self.taskUpdate(obj.id, obj);\n }\n async removeTask(id) {\n return await self.taskRemove(id);\n }\n },\n ],\n ]),\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n // #HACK!: as of webix v.8.1.1 there is a visual glitch of the Gantt\n // object if you replace a gantt widget with a new definition (like in\n // the ABDesigner you can switch from Gantt1 to Gantt2 in the object\n // workspace). In that one case, the menu would disappear even though\n // the data is present. So this makes sure the menu is shown\n const $menu = $$(this.ids.menu);\n\n if ($menu) $menu.showItem(\"day\");\n }\n\n /**\n * @method CurrentDatacollection()\n * A helper to return the current ABDataCollection we are working with.\n * @return {ABDataCollection}\n */\n get CurrentDatacollection() {\n return super.CurrentDatacollection || this._tempDC;\n }\n\n /**\n * @method convertFormat()\n * Convert an ABObject's row value into a gantt task data format.\n * @param {obj} row\n * The current row of data returned from an ABObject.\n * @param {int} index\n * The order of this task.\n * @return {obj}\n * A key=>value hash corresponding to the gantt task that\n * represents this row of data.\n */\n convertFormat(row = {}, index = null) {\n const data = {};\n const StartDateField = this.StartDateField;\n const EndDateField = this.EndDateField;\n const DurationField = this.DurationField;\n\n if (!StartDateField || (!EndDateField && !DurationField)) return data;\n\n const currDate = new Date();\n\n data[\"id\"] = row.id || row.uuid;\n data[\"type\"] = \"task\";\n data[\"parent\"] = 0;\n data[\"open\"] = true;\n\n // define label\n const TitleField = this.TitleField;\n const ProgressField = this.ProgressField;\n const NotesField = this.NotesField;\n\n data[\"text\"] = TitleField\n ? row[TitleField.columnName] || \"\"\n : this.CurrentObject.displayData(row);\n data[\"start_date\"] = row[StartDateField.columnName] || currDate;\n data[\"progress\"] = ProgressField\n ? parseFloat(row[ProgressField.columnName] || 0)\n : 0;\n\n if (NotesField) data[\"details\"] = row[NotesField.columnName] || \"\";\n\n if (EndDateField)\n data[\"end_date\"] = row[EndDateField.columnName] || currDate;\n\n if (DurationField) data[\"duration\"] = row[DurationField.columnName] || 1;\n\n // Default values\n if (!data[\"end_date\"] && !data[\"duration\"]) {\n data[\"end_date\"] = currDate;\n data[\"duration\"] = 1;\n }\n\n if (index) data[\"order\"] = index;\n\n return data;\n }\n\n /**\n * @method convertValues()\n * Convert a Gantt task into a set of values for our ABObject.\n * @param {obj} task\n * The current gantt task data.\n * @return {obj}\n * A key=>value hash corresponding to the ABObject that\n * is tied to this gantt.\n */\n convertValues(task) {\n const patch = {};\n const TitleField = this.TitleField;\n const StartDateField = this.StartDateField;\n const ProgressField = this.ProgressField;\n const NotesField = this.NotesField;\n const EndDateField = this.EndDateField;\n const DurationField = this.DurationField;\n\n if (TitleField) patch[TitleField.columnName] = task[\"text\"] || \"\";\n\n if (StartDateField) patch[StartDateField.columnName] = task[\"start_date\"];\n\n if (ProgressField)\n patch[ProgressField.columnName] = parseFloat(task[\"progress\"] || 0);\n\n if (NotesField) patch[NotesField.columnName] = task[\"details\"];\n\n if (EndDateField) patch[EndDateField.columnName] = task[\"end_date\"];\n\n if (DurationField) patch[DurationField.columnName] = task[\"duration\"];\n\n return patch;\n }\n\n /**\n * @method objectLoad\n * @param {ABObject} object\n */\n objectLoad(object) {\n super.objectLoad(object);\n\n // const baseView = this.view;\n const settings = this.settings;\n\n if (object) {\n this.TitleField = object.fieldByID(settings.titleFieldID);\n this.StartDateField = object.fieldByID(settings.startDateFieldID);\n this.EndDateField = object.fieldByID(settings.endDateFieldID);\n this.DurationField = object.fieldByID(settings.durationFieldID);\n this.ProgressField = object.fieldByID(settings.progressFieldID);\n this.NotesField = object.fieldByID(settings.notesFieldID);\n }\n }\n\n /**\n * @method datacollectionLoad\n * @param {ABDatacollection} datacollection\n */\n datacollectionLoad(datacollection) {\n super.datacollectionLoad(datacollection);\n\n const dc = this.CurrentDatacollection || datacollection;\n if (!dc) return;\n\n // NOTE: this can happen in the ABDesigner object workspace.\n // we send in a temp DC with no .id\n this._tempDC = datacollection;\n\n // NOTE: keep .objectLoad() before any .initData() is called.\n this.objectLoad(dc.datasource);\n\n const eventNames = [\"create\", \"update\", \"delete\", \"initializedData\"];\n\n eventNames.forEach((e) => {\n if (\n e in dc._events &&\n this.__events.findIndex((eo) => eo.eventName === e) !== -1\n )\n return;\n\n switch (e) {\n case \"delete\":\n this.eventAdd({\n emitter: dc,\n eventName: \"delete\",\n listener: (taskId) => {\n // remove this task in gantt\n if (this.ganttElement.isExistsTask(taskId))\n this.ganttElement.removeTask(taskId);\n },\n });\n\n break;\n\n default:\n this.eventAdd({\n emitter: dc,\n eventName: e,\n listener: () => {\n this.initData();\n },\n });\n\n break;\n }\n });\n }\n\n /**\n * @function hide()\n * hide this component.\n */\n hide() {\n $$(this.ids.component)?.hide();\n }\n\n initData() {\n const ganttElem = $$(this.ids.gantt);\n if (!ganttElem) return;\n\n const dataService = ganttElem.getService(\"local\");\n if (!dataService) return;\n\n const dcTasks = dataService.tasks();\n if (!dcTasks) return;\n\n // gantt v 8.1.1\n // Note: there is a race condition that can happen here.\n // dataService.tasks() calls the MyBackend.tasks() above which\n // returns a Promise.\n // when you call dcTasks.clearAll() before the promise\n // is resolved, the gantt internally throws an error.\n //\n // So give webix some time to internally complete it's process\n // before we do .clearAll();\n setTimeout(() => {\n dcTasks.clearAll();\n\n const DC = this.CurrentDatacollection;\n const gantt_data = {\n data: DC\n ? (DC.getData() || []).map((d, index) =>\n this.convertFormat(d, index)\n )\n : [],\n };\n\n // check required fields before parse\n if (this.StartDateField && (this.EndDateField || this.DurationField)) {\n dcTasks.parse(gantt_data);\n }\n\n // Keep original start and end dates for calculate scale to display\n const currScale = dataService.getScales();\n\n this.originalStartDate = currScale.start;\n this.originalEndDate = currScale.end;\n\n this.sort();\n }, 10);\n }\n\n get getConstantScales() {\n const DAY_SCALE = { unit: \"day\", format: \"%d\" },\n WEEK_SCALE = {\n unit: \"week\",\n format: (start) => {\n const parser = webix.Date.dateToStr(\"%d %M\");\n const wstart = webix.Date.weekStart(start);\n const wend = webix.Date.add(\n webix.Date.add(wstart, 1, \"week\", true),\n -1,\n \"day\",\n true\n );\n\n return parser(wstart) + \" - \" + parser(wend);\n },\n },\n MONTH_SCALE = { unit: \"month\", format: \"%F\" },\n YEAR_SCALE = { unit: \"year\", format: \"%Y\" };\n\n return {\n DAY_SCALE,\n WEEK_SCALE,\n MONTH_SCALE,\n YEAR_SCALE,\n };\n }\n\n setScale(scale) {\n const ganttElem = $$(this.ids.gantt);\n if (!ganttElem) return;\n\n const ganttData = ganttElem.getService(\"local\");\n if (!ganttData) return;\n\n const newScales = [];\n const { YEAR_SCALE, MONTH_SCALE, WEEK_SCALE, DAY_SCALE } =\n this.getConstantScales;\n\n switch (scale) {\n case \"day\":\n newScales.push(YEAR_SCALE, MONTH_SCALE, DAY_SCALE);\n break;\n\n case \"week\":\n newScales.push(YEAR_SCALE, MONTH_SCALE, WEEK_SCALE);\n break;\n\n case \"month\":\n newScales.push(YEAR_SCALE, MONTH_SCALE);\n break;\n\n case \"year\":\n newScales.push(YEAR_SCALE);\n break;\n }\n\n const abWebix = this.AB.Webix;\n const currScale = ganttElem.getService(\"local\").getScales(),\n start = abWebix.Date.add(this.originalStartDate, -1, scale, true),\n end = abWebix.Date.add(this.originalEndDate, 1, scale, true);\n\n ganttData.setScales(\n start,\n end,\n currScale.precise,\n currScale.cellWidth,\n currScale.cellHeight,\n newScales\n );\n ganttElem.$app.refresh();\n ganttElem.getState().$batch({ top: 0, left: 0 });\n }\n\n /**\n * @function show()\n * Show this component.\n */\n onShow() {\n super.onShow();\n this.datacollectionLoad(this.datacollection);\n\n $$(this.ids.component)?.show();\n }\n\n sort() {\n // TODO: sorting;\n return;\n // const gantt = $$(ids.gantt).getGantt();\n // if (!gantt) return;\n\n // // default sort\n // const MAX_date = new Date(8640000000000000);\n // gantt.sort(function(a, b) {\n // const aStartDate = a[\"start_date\"],\n // aEndDate = a[\"end_date\"],\n // aDuration = a[\"duration\"] || 1,\n // bStartDate = b[\"start_date\"],\n // bEndDate = b[\"end_date\"],\n // bDuration = b[\"duration\"] || 1;\n\n // // if no start date, then be a last item\n // if (\n // a[this.StartDateField.columnName] == null ||\n // b[this.StartDateField.columnName] == null\n // ) {\n // return (\n // (a[this.StartDateField.columnName] || MAX_date) -\n // (b[this.StartDateField.columnName] || MAX_date)\n // );\n // } else if (aStartDate != bStartDate) {\n // return aStartDate - bStartDate;\n // } else if (aEndDate != bEndDate) {\n // return aEndDate - bEndDate;\n // } else if (aDuration != bDuration) {\n // return bDuration - aDuration;\n // }\n // }, false);\n }\n\n async taskAdd(taskData) {\n const patch = this.convertValues(taskData);\n const ab = this.AB;\n\n try {\n // this method is being used in MyBackend addTask() method\n // On Webix documents, the method addTask() have to return the added object so we have to pass the data we add through this method.\n return await this.CurrentObject?.model().create(patch);\n } catch (e) {\n ab.Webix.alert({\n title: this.label(\"Error Saving Item\"),\n ok: this.label(\"Okay\"),\n text: this.label(\"Unable to save this item.\"),\n });\n ab.notify.developer(e, {\n context: \"ABViewGantt:taskAdd(): Error Saving Item\",\n patch,\n });\n\n throw e;\n }\n }\n\n async taskRemove(rowId) {\n const ab = this.AB;\n\n try {\n // this method is being used in MyBackend removeTask() method\n // On Webix documents, the method removeTask() return {} (an empty object) so we return {} in removeTask() instead.\n await this.CurrentObject.model().delete(rowId);\n\n return {};\n } catch (e) {\n ab.Webix.alert({\n title: this.label(\"Error Removing Item\"),\n ok: this.label(\"Okay\"),\n text: this.label(\"Unable to remove this item.\"),\n });\n ab.notify.developer(e, {\n context: \"ABViewGantt:taskRemove(): Error Removing Item\",\n rowId,\n });\n\n throw e;\n }\n }\n\n async taskUpdate(rowId, updatedTask) {\n const patch = this.convertValues(updatedTask);\n const ab = this.AB;\n\n try {\n // this method is being used in MyBackend updateTask() method\n // On Webix documents, the method updateTask() return {} (an empty object) so we return {} in updateTask() instead.\n await this.CurrentObject.model().update(rowId, patch);\n\n return {};\n } catch (e) {\n ab.Webix.alert({\n title: this.label(\"Error Updating Item\"),\n ok: this.label(\"Okay\"),\n text: this.label(\"Unable to update this item.\"),\n });\n ab.notify.developer(e, {\n context: \"ABViewGantt:taskUpdate(): Error Updating Item\",\n patch,\n });\n\n throw e;\n }\n }\n}\n","import ABViewComponent from \"./ABViewComponent\";\nimport ABPopupExport from \"../ABViewGridPopupExport\";\nimport ABPopupMassUpdateClass from \"../ABViewGridPopupMassUpdate\";\nimport ABPopupSortField from \"../ABViewGridPopupSortFields\";\n\nexport default class ABViewGridComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewGrid_${baseView.id}`,\n Object.assign(\n {\n table: \"\",\n\n // component: `${base}_component`,\n toolbar: \"\",\n buttonDeleteSelected: \"\",\n\n buttonFilter: \"\",\n buttonMassUpdate: \"\",\n buttonSort: \"\",\n buttonExport: \"\",\n\n globalSearchToolbar: \"\",\n\n datatable: \"\",\n },\n ids\n )\n );\n\n this._handler_filterData = (fnFilter, filterRules) => {\n this.callbackFilterData(fnFilter, filterRules); // be notified when there is a change in the filter\n };\n\n this.handler_select = (...params) => {\n this.selectRow(...params);\n };\n // {fn} .handler_select\n // the callback fn for our selectRow()\n // We want this called when the .datacollection we are linked to\n // emits an \"onChange\" event.\n\n this.detatch();\n baseView.filterHelper.on(\"filter.data\", this._handler_filterData);\n\n // derive these from viewGrid\n this.id = baseView.id;\n\n /////\n ///// For TEsting:\n /////\n // this.settings.showToolbar = 1;\n // this.settings.isEditable = 1;\n // this.settings.isExportable = 1;\n // this.settings.gridFilter = {\n // filterOption: 1,\n // userFilterPosition: \"form\",\n // isGlobalToolbar: 1,\n // };\n\n // this.settings.detailsPage = \"some-uuid\";\n // this.settings.detailTab = \"some_uuid_2\";\n // this.settings.trackView = 1;\n /////\n ///// end testing\n /////\n\n this.columnSplitLeft = 0;\n // {integer}\n // Which column to \"split\"/\"freeze\" from the left side of the grid.\n\n this.columnSplitRight = 0;\n // {integer}\n // The # columns to the right to freeze.\n\n // this.datacollection = null;\n // // {ABDataCollection}\n // // The Webix DataCollection that manages the data we are displaying.\n\n this.validationError = false;\n // {bool}\n // Has a Validation Error occured?\n\n this.linkPage = baseView.linkPageHelper.component();\n // {ABViewPropertyLinkPage}\n //\n\n const idTable = this.ids.table;\n const ab = this.AB;\n\n this.PopupExport = new ABPopupExport(idTable);\n this.PopupExport.init(ab);\n // {ABViewGridPopupExport}\n // Popup for managing how to export our data.\n\n this.PopupMassUpdateComponent = new ABPopupMassUpdateClass(this, idTable);\n this.PopupMassUpdateComponent.init(ab);\n // this.PopupMassUpdateComponent.on(\"\")\n // {}\n // The popup for performing a Mass Edit operation.\n\n this.PopupSortDataTableComponent = new ABPopupSortField(idTable);\n this.PopupSortDataTableComponent.init(ab);\n this.PopupSortDataTableComponent.on(\"changed\", (sortOptions) => {\n this.callbackSortData(sortOptions);\n });\n // {ABViewGridPopupSortFields}\n // The popup for adding sort criteria to our grid.\n\n this.skippableColumns = [\n \"appbuilder_select_item\",\n \"appbuilder_view_detail\",\n \"appbuilder_view_track\",\n \"appbuilder_view_edit\",\n \"appbuilder_trash\",\n ];\n // {array}\n // An array of column names that should be skipped from some of our\n // event handlers.\n\n // this.EditField = null;\n // // {ABFieldXXX}\n // // Which ABField is the focus of our PopupHeader menu?\n\n // this.EditNode = null;\n // // {HTML DOM}\n // // The webix.$node where the ABField Header is that our PopupHeader\n // // should be displayed at.\n\n this.ignoreLocalSettings = false;\n // {bool}\n // should we ignore our local settings in our current context?\n // (used in ABDesigner when our settings will change as we need to\n // use those instead of the saved settings.)\n\n this._gridSettings = null;\n // {hash} { grid.id : [ {columnHeader}, {columnHeader} ...]}\n // Keep a global copy of our local Grid settings, so we can optimize the header\n // sizes.\n\n this._isDatacollectionLoaded = false;\n }\n\n // {string}\n // the unique key for ABViewGrids to store/retrieve their local settings\n get keyStorageSettings() {\n return \"abviewgrid_settings\";\n }\n\n detatch() {\n this.view.filterHelper.removeAllListeners(\"filter.data\");\n [\"changeCursor\", \"cursorStale\", \"cursorSelect\"].forEach((key) => {\n this.datacollection?.removeListener(key, this.handler_select);\n });\n }\n\n /**\n * @method getColumnIndex()\n * return the Datatable.getColumnIndex() value\n * @param {string} id\n * the uuid of the column we are referencing.\n * @return {integer}\n */\n getColumnIndex(id) {\n let indx = this.getDataTable().getColumnIndex(id);\n if (!this.settings.massUpdate) {\n // the index is 0 based. So if the massUpdate feature isn't\n // enabled, we need to add 1 to the result so they look like\n // a 1, 2, ...\n\n indx++;\n }\n return indx;\n }\n\n uiDatatable() {\n const ids = this.ids;\n const settings = this.settings;\n const self = this;\n\n let view = \"datatable\";\n\n if (settings.isTreeDatable || settings.groupBy)\n // switch datatable to support tree\n view = \"treetable\";\n\n let selectType = \"cell\";\n\n if (!settings.isEditable && (settings.detailsPage || settings.editPage))\n selectType = \"row\";\n\n return {\n view,\n id: ids.datatable,\n resizeColumn: { size: 10 },\n resizeRow: { size: 10 },\n prerender: false,\n editable: settings.isEditable,\n fixedRowHeight: false,\n height: settings.height || 0,\n editaction: \"custom\",\n select: selectType,\n footer:\n // show footer when there are summary columns\n settings.summaryColumns.length > 0 ||\n settings.countColumns.length > 0,\n tooltip: true,\n // tooltip: {\n // // id: ids.tooltip,\n // template: (obj, common) => {\n // return this.toolTip(obj, common);\n // },\n // on: {\n // // When showing a larger image preview the tooltip sometime displays part of the image off the screen...this attempts to fix that problem\n // onBeforeRender: function () {\n // self.toolTipOnBeforeRender(this.getNode());\n // },\n // onAfterRender: function (data) {\n // self.toolTipOnAfterRender(this.getNode());\n // },\n // },\n // },\n dragColumn: true,\n on: {\n onBeforeSelect: function (data, preserve) {\n if (self.skippableColumns.indexOf(data.column) != -1) {\n return false;\n } else if (settings.isEditable) {\n const currObject = self.datacollection.datasource;\n const selectField = currObject.fields(\n (f) => f.columnName === data.column\n )[0];\n\n if (selectField == null) return true;\n\n const cellNode = this.getItemNode({\n row: data.row,\n column: data.column,\n }),\n rowData = this.getItem(data.row);\n\n return selectField.customEdit(rowData, null, cellNode);\n } else if (!settings.detailsPage && !settings.editPage)\n return false;\n },\n onAfterSelect: (data, preserve) => {\n // {ABObject} data\n // the selected object\n // {bool} prevent\n // indicates whether the previous selection state should\n // be saved. (is multiselect and they are holding SHIFT)\n if (this.settings.isEditable) {\n this.onAfterSelect(data, preserve);\n }\n },\n // onBeforeEditStart: function (/*id*/) {\n // // Not sure what this is suposed to check, but this condition\n // // will always be false.\n // if (!this.getItem(id) == \"appbuilder_select_item\") return false;\n // },\n onCheck: function (row, col, val) {\n // Update checkbox data\n if (col == \"appbuilder_select_item\") {\n // do nothing because we will parse the table once we decide\n // if we are deleting or updating rows\n self.toggleUpdateDelete();\n } else {\n if (settings.isEditable) {\n // get the field related to this col\n const currObject = self.datacollection.datasource;\n const selectField = currObject.fields(\n (f) => f.columnName === col\n )[0];\n\n // if the colum is not the select item column move on to\n // the next step to save\n const state = {\n value: val,\n };\n const editor = {\n row: row,\n column: col,\n config: { fieldID: selectField?.id ?? null },\n };\n\n self.onAfterEditStop(state, editor);\n } else {\n const node = this.getItemNode({\n row: row,\n column: col,\n });\n const checkbox = node.querySelector(\n 'input[type=\"checkbox\"]'\n );\n\n if (val == 1) {\n checkbox.checked = false;\n } else {\n checkbox.checked = true;\n }\n }\n }\n },\n onBeforeEditStop: function (state, editor) {\n // Check if data loading is complete\n const oldValue = state.old;\n let newValue = state.value;\n if (!Array.isArray(newValue)) newValue = [newValue];\n if (\n oldValue != null &&\n oldValue != \"\" &&\n // If options does not load completely, then Webix returns state.value as ['', '', '']\n newValue.filter((val) => val != null && val != \"\").length <\n 1 &&\n // Check if no data load to the option\n editor.getPopup?.().getList?.().data?.find({}).length < 1\n ) {\n return false;\n }\n },\n onAfterEditStop: (state, editor, ignoreUpdate) => {\n if (this.validationError == false)\n this.onAfterEditStop(state, editor, ignoreUpdate);\n },\n onValidationError: function () {\n this.validationError = true;\n },\n onValidationSuccess: function () {\n this.validationError = false;\n },\n\n // We are sorting with server side requests now so we can remove this\n // onAfterLoad: function () {\n // _logic.onAfterLoad();\n // },\n onColumnResize: function (\n columnName,\n newWidth,\n oldWidth,\n user_action\n ) {\n // if we resize the delete column we want to resize the last\n // column but Webix will not allow since the column is split\n const rightSplitItems = [\n \"appbuilder_view_detail\",\n \"appbuilder_view_track\",\n \"appbuilder_view_edit\",\n \"appbuilder_trash\",\n ];\n\n if (rightSplitItems.indexOf(columnName) != -1) {\n // Block events so we can leave the delete column alone\n this.blockEvent();\n // keeps original width\n this.setColumnWidth(columnName, oldWidth);\n this.unblockEvent();\n // Listen to events again\n\n // find the last column's config\n const column = self.getLastColumn();\n\n columnName = column.id;\n\n // determine if we are making the column larger or smaller\n if (newWidth < oldWidth) {\n newWidth = column.width + 40;\n // add 40 because there is not any more space to drag so we\n // will allow 40px increments\n } else {\n newWidth = column.width - (newWidth - 40);\n // take the column's width and subtrack the difference of\n // the expanded delet column drag\n }\n // we don't want columns to be smaller than 50 ?? do we ??\n // I could be wrong maybe a checkbox could be smaller so this\n // could change\n if (newWidth < 50) {\n newWidth = 50;\n }\n // minWidth is important because we are using fillspace:true\n column.minWidth = newWidth;\n // Sets the UI\n this.setColumnWidth(columnName, newWidth);\n }\n // Saves the new width\n if (user_action) {\n self.onColumnResize(\n columnName,\n newWidth,\n oldWidth,\n user_action\n );\n }\n },\n onRowResize: (rowId) => {\n // V2: we no longer do anything onRowResize()\n // before we saved the row height in the record.\n // this.onRowResize(rowId);\n },\n onBeforeColumnDrag: (sourceId, event) =>\n !(this.skippableColumns.indexOf(sourceId) !== -1),\n onBeforeColumnDrop: (sourceId, targetId, event) =>\n // Make sure we are not trying to drop onto one of our special\n // columns ...\n !(this.skippableColumns.indexOf(targetId) !== -1),\n onAfterColumnDrop: (sourceId, targetId, event) =>\n this.onAfterColumnDrop(sourceId, targetId, event),\n // onAfterColumnShow: function (id) {\n // // console.warn(\"!! ToDo: onAfterColumnShow()\");\n // // $$(self.webixUiId.visibleFieldsPopup).showField(id);\n // },\n // onAfterColumnHide: function (id) {\n // // console.warn(\"!! ToDo: onAfterColumnHide()\");\n // // $$(self.webixUiId.visibleFieldsPopup).hideField(id);\n // },\n\n onHeaderClick: (id, e, node) => {\n /* if (settings.configureHeaders) */\n this.onHeaderClick(id, e, node);\n },\n },\n };\n }\n\n uiFilter() {\n return this.view.filterHelper.ui();\n\n // make sure onFilterData is now .emit()ed instead of passing in a callback.\n }\n\n /**\n * @method uiToolbar()\n * Return the webix definition for the toolbar row for our Grids.\n * @return {json}\n */\n uiToolbar() {\n const ids = this.ids;\n const self = this;\n\n return {\n view: \"toolbar\",\n id: ids.toolbar,\n hidden: true,\n css: \"ab-data-toolbar\",\n cols: [\n {\n view: \"button\",\n id: ids.buttonMassUpdate,\n css: \"webix_transparent\",\n label: this.label(\"Edit\"),\n icon: \"fa fa-pencil-square-o\",\n type: \"icon\",\n disabled: true,\n autowidth: true,\n click: function () {\n self.toolbarMassUpdate(this.$view);\n },\n },\n {\n view: \"button\",\n id: ids.buttonDeleteSelected,\n css: \"webix_transparent\",\n label: this.label(\"Delete\"),\n icon: \"fa fa-trash\",\n type: \"icon\",\n disabled: true,\n autowidth: true,\n click: function () {\n self.toolbarDeleteSelected(this.$view);\n },\n },\n {\n view: \"button\",\n id: ids.buttonFilter,\n css: \"webix_transparent\",\n label: this.label(\"Filters\"),\n icon: \"fa fa-filter\",\n type: \"icon\",\n autowidth: true,\n click: function () {\n self.toolbarFilter(this.$view);\n },\n },\n {\n view: \"button\",\n id: ids.buttonSort,\n css: \"webix_transparent\",\n label: this.label(\"Sort\"),\n icon: \"fa fa-sort\",\n type: \"icon\",\n autowidth: true,\n click: function () {\n self.toolbarSort(this.$view);\n },\n },\n {\n view: \"button\",\n id: ids.buttonExport,\n css: \"webix_transparent\",\n label: this.label(\"Export\"),\n icon: \"fa fa-print\",\n type: \"icon\",\n autowidth: true,\n click: function () {\n self.toolbarExport(this.$view);\n },\n },\n {},\n {\n id: ids.globalSearchToolbar,\n view: \"search\",\n placeholder: this.label(\"Search...\"),\n on: {\n onTimedKeyPress: () => {\n const searchText = $$(ids.globalSearchToolbar).getValue();\n\n this.view.filterHelper.externalSearchText(searchText);\n },\n },\n },\n ],\n };\n }\n\n ui() {\n const _uiGrid = {\n id: this.ids.table,\n type: \"space\",\n borderless: true,\n rows: [\n {},\n {\n view: \"label\",\n label: this.label(\"Select an object to load.\"),\n inputWidth: 200,\n align: \"center\",\n },\n {},\n ],\n };\n\n const settings = this.settings;\n\n if (this.datacollection || settings.dataviewID !== \"\") {\n _uiGrid.padding = settings.padding;\n _uiGrid.rows = [];\n if (settings.showToolbar) {\n _uiGrid.rows.push(this.uiToolbar());\n }\n if (this.settings.gridFilter.filterOption) {\n _uiGrid.rows.push(this.uiFilter());\n }\n\n _uiGrid.rows.push(this.uiDatatable());\n }\n\n const _ui = super.ui([_uiGrid]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB, accessLevel = 2) {\n if (AB) await super.init(AB);\n\n const self = this;\n const ids = this.ids;\n\n // WORKAROUND : Where should we define this ??\n // For include PDF.js\n const abWebix = AB.Webix;\n\n abWebix.codebase = \"\";\n abWebix.cdn = \"/js/webix\";\n\n // this shows the options to Hide, Filter, sort , etc...\n // only in Designer?\n // PopupHeaderEditComponent.init({\n // onClick: _logic.callbackHeaderEdit, // be notified when there is a change in the hidden fields\n // });\n\n // NOTE: register the onAfterRender() here, so it only registers\n // one.\n const $DataTable = this.getDataTable();\n\n let throttleCustomDisplay = null;\n let scrollStarted = null;\n\n if (!$DataTable) return;\n\n abWebix.extend($DataTable, abWebix.ProgressBar);\n\n $DataTable.config.accessLevel = accessLevel;\n\n if (accessLevel < 2) $DataTable.define(\"editable\", false);\n\n const settings = this.settings;\n\n const customDisplays = (data) => {\n const CurrentObject = this.datacollection?.datasource;\n\n if (!CurrentObject || !$DataTable.data) return;\n\n const displayRecords = [];\n\n const verticalScrollState = $DataTable.getScrollState().y,\n rowHeight = $DataTable.config.rowHeight,\n height =\n $DataTable.$view.querySelector(\".webix_ss_body\").clientHeight,\n startRecIndex = Math.floor(verticalScrollState / rowHeight),\n endRecIndex = startRecIndex + $DataTable.getVisibleCount();\n\n let index = 0;\n\n $DataTable.data.order.each((id) => {\n if (id != null && startRecIndex <= index && index <= endRecIndex)\n displayRecords.push(id);\n\n index++;\n });\n\n let editable = settings.isEditable;\n\n if ($DataTable.config.accessLevel < 2) editable = false;\n\n CurrentObject.customDisplays(\n data,\n this.AB._App,\n $DataTable,\n displayRecords,\n editable\n );\n };\n\n $DataTable.attachEvent(\"onAfterRender\", function (data) {\n $DataTable.resize();\n\n if (throttleCustomDisplay) clearTimeout(throttleCustomDisplay);\n\n throttleCustomDisplay = setTimeout(() => {\n if (scrollStarted) clearTimeout(scrollStarted);\n customDisplays(this.data);\n }, 350);\n\n AB.ClassUI.CYPRESS_REF($DataTable);\n Object.keys(ids).forEach((key) => {\n const $el = $$(ids[key]);\n if ($el) {\n AB.ClassUI.CYPRESS_REF($el);\n }\n });\n });\n\n // we have some data types that have custom displays that don't look\n // right after scrolling large data sets we need to call customDisplays\n // again\n $DataTable.attachEvent(\"onScroll\", function () {\n if (scrollStarted) clearTimeout(scrollStarted);\n\n if (throttleCustomDisplay) clearTimeout(throttleCustomDisplay);\n\n scrollStarted = setTimeout(() => {\n customDisplays(this.data);\n }, 1500);\n });\n $DataTable.attachEvent(\"onAfterScroll\", function () {\n if (throttleCustomDisplay) clearTimeout(throttleCustomDisplay);\n\n throttleCustomDisplay = setTimeout(() => {\n if (scrollStarted) clearTimeout(scrollStarted);\n customDisplays(this.data);\n }, 350);\n });\n\n // Process our onItemClick events.\n // this is a good place to check if our delete/trash icon was clicked.\n $DataTable.attachEvent(\"onItemClick\", function (id, e, node) {\n // make sure we have an object selected before processing this.\n const dc = self.datacollection;\n const CurrentObject = dc?.datasource;\n\n if (!CurrentObject) return;\n\n if (settings.isEditable === 0) {\n const items = $DataTable.getItem(id);\n }\n // if this was our edit icon:\n // console.log(e.target.className);\n if (e === \"auto\" || e.target.className.indexOf(\"eye\") > -1) {\n // View a Details Page:\n self.changePage(dc, id, settings.detailsPage);\n self.toggleTab(settings.detailsTab, this);\n } else if (e.target.className.indexOf(\"pencil\") > -1) {\n self.changePage(dc, id, settings.editPage);\n self.toggleTab(settings.editTab, this);\n } else if (e.target.className.indexOf(\"track\") > -1)\n self.emit(\"object.track\", CurrentObject, id.row);\n // App.actions.openObjectTrack(CurrentObject, id.row);\n else if (e.target.className.indexOf(\"clear-combo-value\") > -1) {\n const clearValue = {};\n\n clearValue[id.column] = \"\";\n\n const updateRow = async () => {\n try {\n const response = await CurrentObject.model().update(\n id.row,\n clearValue\n );\n\n // console.log(response);\n } catch (err) {\n self.AB.notify.developer(err, {\n context: \"ABViewGridComponent.onItemClick\",\n message: \"Error updating item\",\n obj: CurrentObject.toObj(),\n id: id.row,\n });\n }\n };\n\n updateRow();\n }\n // if this was our trash icon:\n else if (e.target.className.indexOf(\"trash\") > -1) {\n // If the confirm popup is showing, then skip to show a new one\n if (!this._deleteConfirmPopup) {\n this._deleteConfirmPopup = abWebix.confirm({\n title: self.label(\"Delete data\"),\n text: self.label(\"Do you want to delete this row?\"),\n callback: (result) => {\n delete this._deleteConfirmPopup;\n if (result) {\n const deleteRow = async () => {\n try {\n const response =\n await CurrentObject.model().delete(id.row);\n\n if (response.numRows > 0) {\n $DataTable.remove(id);\n $DataTable.clearSelection();\n } else\n abWebix.alert({\n text: self.label(\n \"No rows were effected. This does not seem right.\"\n ),\n });\n } catch (err) {\n self.AB.notify.developer(err, {\n context: \"ABViewGridComponent.onItemClick\",\n message: \"Error deleting item\",\n obj: CurrentObject.toObj(),\n id: id.row,\n });\n\n //// TODO: what do we do here?\n }\n };\n\n deleteRow();\n }\n\n $DataTable.clearSelection();\n\n return true;\n },\n });\n }\n } else if (settings.detailsPage.length) {\n // If an icon wasn't selected but a details page is set\n // view the details page\n self.changePage(dc, id, settings.detailsPage);\n self.toggleTab(settings.detailsTab, this);\n } else if (settings.editPage.length) {\n // If an icon wasn't selected but an edit page is set\n // view the edit page\n self.changePage(dc, id, settings.editPage);\n self.toggleTab(settings.editTab, this);\n }\n });\n\n // ABViewGrid Original init();\n if (settings.showToolbar) {\n if (\n settings.massUpdate ||\n settings.isSortable ||\n settings.isExportable ||\n (settings.gridFilter &&\n settings.gridFilter.filterOption &&\n settings.gridFilter.userFilterPosition === \"toolbar\")\n )\n $$(ids.toolbar).show();\n\n if (!settings.massUpdate) {\n $$(ids.buttonMassUpdate).hide();\n $$(ids.buttonDeleteSelected).hide();\n }\n\n if (!settings.allowDelete) $$(ids.buttonDeleteSelected).hide();\n\n if (settings.gridFilter) {\n if (\n settings.gridFilter.filterOption !== 1 ||\n settings.gridFilter.userFilterPosition !== \"toolbar\"\n )\n $$(ids.buttonFilter).hide();\n\n if (\n settings.gridFilter.filterOption === 3 &&\n settings.gridFilter.globalFilterPosition === \"single\"\n )\n $DataTable.hide();\n\n if (settings.gridFilter.isGlobalToolbar)\n $$(ids.globalSearchToolbar).show();\n else $$(ids.globalSearchToolbar).hide();\n\n if (settings.gridFilter.filterOption)\n this.view.filterHelper.init(this.AB);\n }\n\n if (!settings.isSortable) $$(ids.buttonSort).hide();\n\n if (!settings.isExportable) $$(ids.buttonExport).hide();\n }\n\n if (settings.hideHeader) this.hideHeader();\n\n const dc =\n this.datacollection || this.AB.datacollectionByID(settings.dataviewID);\n\n if (!this._isDatacollectionLoaded) this.datacollectionLoad(dc);\n\n // Make sure\n this._gridSettings =\n this._gridSettings ||\n (await this.AB.Storage.get(this.keyStorageSettings)) ||\n {};\n\n if (dc?.datasource) {\n // TRANSITION: ABViewGrid_orig line 862 ...\n\n this.linkPage.init({\n view: this.view,\n datacollection: dc,\n });\n\n this.refreshHeader();\n }\n }\n\n /**\n * @method busy()\n * Indicate that our datatable is currently busy loading/processing\n * data.\n */\n busy() {\n this.getDataTable()?.showProgress?.({ type: \"icon\" });\n }\n\n /**\n * @method callbackFilterData()\n * Process the provided filter options from our filterHelper.\n * @param {fn} fnFilter\n * A function that returns true/false for each row of data\n * to determine if is should exist.\n * @param {array} filterRules\n * Any Filter Rules added by the user.\n */\n callbackFilterData(fnFilter, filterRules = []) {\n const ids = this.ids;\n const $ButtonFilter = $$(ids.buttonFilter);\n\n if ($ButtonFilter) {\n const onlyFilterRules = this.view.filterHelper.filterRules();\n\n $ButtonFilter.define(\"badge\", onlyFilterRules?.rules?.length ?? 0);\n $ButtonFilter.refresh();\n }\n\n const dc = this.datacollection;\n\n dc.filterCondition(filterRules);\n dc.reloadData();\n }\n\n async callbackSortData(sortRules = []) {\n const $buttonSort = $$(this.ids.buttonSort);\n\n $buttonSort.define(\"badge\", sortRules.length || null);\n $buttonSort.refresh();\n\n const gridElem = this.getDataTable();\n\n if (gridElem.data.find({}).length < gridElem.data.count()) {\n try {\n // NOTE: Webix's client sorting does not support dynamic loading.\n // If the data does not be loaded, then load all data.\n await this.datacollection.reloadData(0, 0);\n } catch (err) {\n this.AB.notify.developer(err, {\n context:\n \"ABViewGrid:callbackSortData(): Error perform datacollection.reloadData()\",\n });\n }\n }\n\n // wait until the grid component will done to repaint UI\n setTimeout(() => {\n gridElem.sort((a, b) => this.PopupSortDataTableComponent.sort(a, b));\n }, 777);\n }\n\n /**\n * @method changePage()\n * Helper method to switch to another View.\n * @param {ABDataCollection} dv\n * The DataCollection we are working with.\n * @param {obj} rowItem\n * the { row:#, column:{string} } of the item that was clicked.\n * @param {ABViewPage.uuid} page\n * The .uuid of the ABViewPage/ABViewTab we are to swtich to.\n *\n */\n changePage(dv, rowItem, page) {\n const rowId = rowItem?.row ?? null;\n\n // Set cursor to data view\n if (dv) dv.setCursor(rowId);\n\n // Pass settings to link page module\n if (this.linkPage) this.linkPage.changePage(page, rowId);\n else super.changePage(page);\n }\n\n columnConfig(headers = []) {\n this.settings.columnConfig = headers;\n }\n /**\n * @method datacollectionLoad()\n * Assign an ABDataCollection to this component to use instead of any\n * provided .dataviewID in our settings.\n * NOTE: this primarily happens in the ABDesigner's Object Workspace.\n * @param {ABDataCollection} dc\n */\n datacollectionLoad(dc) {\n const oldDC = this.datacollection;\n this.datacollection = dc;\n\n const CurrentObject = dc?.datasource;\n const $DataTable = this.getDataTable();\n\n if ($DataTable) {\n // preventing too many handlers\n if (!this.__handler_dc_busy) {\n this.__handler_dc_busy = () => {\n this.busy();\n };\n\n this.__handler_dc_ready = () => {\n this.ready();\n this.populateGroupData();\n };\n\n this.__handler_dc_loadData = () => {\n this.populateGroupData();\n };\n }\n\n if (oldDC) {\n // remove our listeners from the previous DC\n oldDC.removeListener(\"initializingData\", this.__handler_dc_busy);\n oldDC.removeListener(\"initializedData\", this.__handler_dc_ready);\n oldDC.removeListener(\"loadData\", this.__handler_dc_loadData);\n }\n\n if (dc) {\n if (dc.datacollectionLink && dc.fieldLink)\n dc.bind($DataTable, dc.datacollectionLink, dc.fieldLink);\n else dc.bind($DataTable);\n\n // making sure we only have 1 registered listener on this dc\n dc.removeListener(\"initializingData\", this.__handler_dc_busy);\n dc.on(\"initializingData\", this.__handler_dc_busy);\n dc.removeListener(\"initializedData\", this.__handler_dc_ready);\n dc.on(\"initializedData\", this.__handler_dc_ready);\n dc.removeListener(\"loadData\", this.__handler_dc_loadData);\n dc.on(\"loadData\", this.__handler_dc_loadData);\n this.grouping();\n\n this._isDatacollectionLoad = true;\n } else $DataTable.unbind();\n\n // Be sure to pass on our CurrentObject to our dependent components.\n if (CurrentObject) {\n this.view.filterHelper.objectLoad(CurrentObject);\n this.PopupMassUpdateComponent.objectLoad(\n CurrentObject,\n this.getDataTable()\n );\n this.PopupSortDataTableComponent.objectLoad(CurrentObject);\n\n this.PopupExport.objectLoad(CurrentObject);\n this.PopupExport.dataCollectionLoad(dc);\n this.PopupExport.setGridComponent(this.getDataTable());\n this.PopupExport.setHiddenFields(this.settings.hiddenFields);\n this.PopupExport.setFilename(this.view.label);\n }\n }\n }\n\n /**\n * @function enableUpdateDelete\n *\n * disable the update or delete buttons in the toolbar if there no items selected\n * we will make this externally accessible so we can call it from within the datatable component\n */\n disableUpdateDelete() {\n $$(this.ids.buttonMassUpdate)?.disable();\n $$(this.ids.buttonDeleteSelected)?.disable();\n // externally indicate that no rows are selected\n this.emit(\"selection.cleared\");\n }\n\n /**\n * @function enableUpdateDelete\n *\n * enable the update or delete buttons in the toolbar if there are any items selected\n * we will make this externally accessible so we can call it from within the datatable component\n */\n enableUpdateDelete() {\n $$(this.ids.buttonMassUpdate)?.enable();\n $$(this.ids.buttonDeleteSelected)?.enable();\n // externally indicate that a row has been selected\n this.emit(\"selection\");\n }\n\n freezeDeleteColumn() {\n // we are going to always freeze the delete column if the datatable\n // is wider than the container so it is easy to get to\n return this.getDataTable().define(\"rightSplit\", this.columnSplitRight);\n }\n\n /**\n * @method getDataTable()\n * return the webix grid component.\n * @return {webix.grid}\n */\n getDataTable() {\n return $$(this.ids.datatable);\n }\n\n /**\n * @method getLastColumn\n * return the last column of a datagrid that is resizeable\n */\n getLastColumn() {\n const $DataTable = this.getDataTable();\n\n let lastColumn = {};\n\n // Loop through each columns config to find out if it is in the split 1 region and set it as the last item...then it will be overwritten by next in line\n $DataTable.eachColumn((columnId) => {\n const columnConfig = $DataTable.getColumnConfig(columnId);\n\n if (columnConfig.split === 1) lastColumn = columnConfig;\n });\n\n return lastColumn;\n }\n\n /**\n * @method grouping()\n * perform any grouping operations\n */\n grouping() {\n if (!this.settings.groupBy) return;\n\n const $treetable = this.getDataTable();\n\n // map: {\n // votes:[\"votes\", \"sum\"],\n // title:[\"year\"]\n // }\n const baseGroupMap = {};\n const CurrentObject = this.datacollection.datasource;\n\n CurrentObject.fields().forEach((f) => {\n switch (f.key) {\n case \"number\":\n baseGroupMap[f.columnName] = [f.columnName, \"sum\"];\n\n break;\n\n case \"calculate\":\n case \"formula\":\n baseGroupMap[f.columnName] = [\n f.columnName,\n (prop, listData) => {\n if (!listData) return 0;\n\n let sum = 0;\n\n listData.forEach((r) => {\n // we only want numbers returned so pass `true` as third param\n // to signify that this is part of a grouping row\n sum += f.format(r, false, true) * 1;\n });\n\n // simulate reformat from ABFieldFormulaCore\n if (!f.fieldLink || f.fieldLink.key === \"calculate\")\n return sum;\n else {\n const rowDataFormat = {};\n\n rowDataFormat[f.fieldLink.columnName] = sum;\n\n return f.fieldLink.format(rowDataFormat);\n }\n },\n ];\n\n break;\n\n case \"connectObject\":\n baseGroupMap[f.columnName] = [\n f.columnName,\n (prop, listData) => {\n if (!listData || !listData.length) return 0;\n\n let count = 0;\n\n listData.forEach((r) => {\n const valRelation = r[f.relationName()];\n\n // array\n if (valRelation?.length) count += valRelation.length;\n // object\n else if (valRelation) count += 1;\n });\n\n return count;\n },\n ];\n\n break;\n\n default:\n baseGroupMap[f.columnName] = [\n f.columnName,\n function (prop, listData) {\n if (!listData || !listData.length) return 0;\n\n let count = 0;\n\n listData.forEach((r) => {\n const val = prop(r);\n\n // count only exists data\n if (val) count += 1;\n });\n\n return count;\n },\n ];\n\n break;\n }\n });\n\n // set group definition\n // $DataTable.define(\"scheme\", {\n // $group: {\n // by: settings.groupBy,\n // map: groupMap\n // }\n // });\n\n // NOTE: https://snippet.webix.com/e3a2bf60\n let groupBys = (this.settings.groupBy || \"\")\n .split(\",\")\n .map((g) => g.trim());\n // Reverse the array NOTE: call .group from child to root\n groupBys = groupBys.reverse();\n\n groupBys.forEach((colName, gIndex) => {\n const groupMap = this.AB.cloneDeep(baseGroupMap);\n\n let by;\n\n // Root\n if (gIndex === groupBys.length - 1) by = colName;\n // Sub groups\n else {\n by = (row) => {\n let byValue = row[colName];\n\n for (let i = gIndex + 1; i < groupBys.length; i++) {\n byValue = `${row[groupBys[i]]} - ${byValue}`;\n }\n\n return byValue;\n };\n\n // remove parent group data\n groupBys.forEach((gColName) => {\n if (gColName !== colName) groupMap[gColName] = [gColName];\n });\n }\n\n $treetable.data.group({\n by: by,\n map: groupMap,\n });\n });\n }\n\n hideHeader() {\n const $DataTable = this.getDataTable();\n\n $DataTable.define(\"header\", false);\n $DataTable.refresh();\n }\n\n /**\n * @function onAfterColumnDrop\n * When an editor drops a column to save a new column order\n * @param {string} sourceId\n * the columnName of the item dragged\n * @param {string} targetId\n * the columnName of the item dropped on\n * @param {event} event\n */\n async onAfterColumnDrop(sourceId, targetId, event) {\n const $DataTable = this.getDataTable();\n const CurrentObject = this.datacollection.datasource;\n const settings = this.settings;\n const columnConfig = this.localSettings();\n\n // Reorder our current columnConfig\n // We know what was moved and what item it has replaced/pushed forward\n // so first we want to splice the item moved out of the array of fields\n // and store it so we can put it somewhere else\n let itemMoved = null;\n let oPos = 0; // original position\n\n for (let i = 0; i < columnConfig.length; i++)\n if (columnConfig[i].id == sourceId) {\n itemMoved = columnConfig[i];\n columnConfig.splice(i, 1);\n oPos = i;\n\n break;\n }\n // once we have removed/stored it we can find where its new position\n // will be by looping back through the array and finding the item it\n // is going to push forward\n for (let j = 0; j < columnConfig.length; j++)\n if (columnConfig[j].id == targetId) {\n // if the original position was before the new position we will\n // follow webix's logic that the drop should go after the item\n // it was placed on\n if (oPos <= j) j++;\n\n columnConfig.splice(j, 0, itemMoved);\n\n break;\n }\n\n // special case: dropped on end and need to update .fillspace\n // if (j == columnConfig.length - 1) {\n // if (columnConfig[j - 1].fillspace) {\n // columnConfig[j - 1].fillspace = false;\n // columnConfig[j].fillspace = true;\n // }\n // }\n\n // if we allow local changes\n this.localSettings(columnConfig);\n\n if (settings.saveLocal) this.localSettingsSave();\n\n // Now emit this event, in case an external object is wanting to\n // respond to this: ABDesigner.objectBuilder, Interface Designer,\n // we send back an array[ ABField.id, ...] in the order we have\n // them.\n this.emit(\n \"column.order\",\n columnConfig.map((c) => c.fieldID)\n );\n\n this.refreshHeader();\n\n // CurrentObject.fieldReorder(sourceId, targetId)\n // .then(() => {\n // // reset each column after a drop so we do not have multiple fillspace and minWidth settings\n // var editiable = settings.isEditable;\n // if ($DataTable.config.accessLevel < 2) {\n // editiable = false;\n // }\n // var columnHeaders = CurrentObject.columnHeaders(true, editiable);\n // columnHeaders.forEach(function (col) {\n // if (col.id == sourceId && col.fillspace == true) {\n // columnHeader.fillspace = false;\n // columnHeader.minWidth = columnHeader.width;\n // }\n // });\n\n // _logic.callbacks.onColumnOrderChange(CurrentObject);\n // // freeze columns:\n // let frozenColumnID =\n // settings.frozenColumnID != null\n // ? settings.frozenColumnID\n // : CurrentObject.workspaceFrozenColumnID;\n // if (frozenColumnID != \"\") {\n // $DataTable.define(\n // \"leftSplit\",\n // $DataTable.getColumnIndex(frozenColumnID) + columnSplitLeft\n // );\n // } else {\n // $DataTable.define(\"leftSplit\", columnSplitLeft);\n // }\n // _logic.freezeDeleteColumn();\n // $DataTable.refreshColumns();\n // })\n // .catch((err) => {\n // OP.Error.log(\"Error saving new column order:\", {\n // error: err,\n // });\n // });\n }\n\n /**\n * @function onAfterEditStop\n * When an editor is finished.\n * @param {json} state\n * @param {} editor\n * @param {} ignoreUpdate\n * @return\n */\n async onAfterEditStop(state, editor, ignoreUpdate) {\n // state: {value: \"new value\", old: \"old value\"}\n // editor: { column:\"columnName\", row:ID, value:'value', getInputNode:fn(), config:{}, focus: fn(), getValue: fn(), setValue: function, getInputNode: function, render: function…}\n\n const $DataTable = this.getDataTable();\n\n // if you don't edit an empty cell we just need to move on\n if (\n (!state.old && state.value === \"\") ||\n (state.old === \"\" && state.value === \"\")\n ) {\n $DataTable?.clearSelection();\n\n return false;\n }\n\n const CurrentObject = this.datacollection.datasource;\n\n if (editor.config)\n switch (editor.config.editor) {\n case \"number\":\n state.value = parseFloat(state.value);\n\n break;\n\n case \"datetime\":\n state.value = state.value.getTime();\n\n if (state && state.old && state.old.getTime)\n state.old = state.old.getTime();\n\n break;\n\n default:\n // code block\n }\n\n // lets make sure we are comparing things properly:\n // reduce newValue and oldValue down to PK if they were objects\n let newVal = state.value;\n if (newVal) {\n newVal = newVal[CurrentObject.PK()] || newVal;\n }\n let oldVal = state.old;\n if (oldVal) {\n oldVal = oldVal[CurrentObject.PK()] || oldVal;\n }\n\n // NOTE: != vs !== :\n // want to handle when newVal = \"3\" and oldVal = 3\n // that is why we don't use !== so that we convert the values into\n // the same case.\n if (newVal != oldVal) {\n const item = $DataTable?.getItem(editor.row);\n\n item[editor.column] = state.value;\n\n $DataTable.removeCellCss(item.id, editor.column, \"webix_invalid\");\n $DataTable.removeCellCss(item.id, editor.column, \"webix_invalid_cell\");\n\n //maxlength field\n const f = CurrentObject.fieldByID(editor.config?.fieldID);\n if (\n f?.settings.maxLength &&\n state.value.length > f.settings.maxLength\n ) {\n this.AB.alert({\n title: this.label(\"Limit max length\"),\n text: this.label(\n \"You can enter a maximum of \" +\n f.settings.maxLength +\n \" characters\"\n ),\n });\n $DataTable.addCellCss(item.id, editor.column, \"webix_invalid_cell\");\n $DataTable.refresh(editor.row);\n $DataTable.clearSelection();\n return false;\n }\n\n const validator = CurrentObject.isValidData(item);\n\n if (validator.pass()) {\n //// Question: do we submit full item updates? or just patches?\n // IF Patch:\n // var patch = {};\n // patch.id = item.id;\n // patch[editor.column] = item[editor.column];\n // await CurrentObject.model().update(item.id, patch)\n\n const ab = this.AB;\n\n try {\n await CurrentObject.model().update(item.id, item);\n\n if ($DataTable.exists(editor.row)) {\n $DataTable.updateItem(editor.row, item);\n $DataTable.clearSelection();\n $DataTable.refresh(editor.row);\n }\n } catch (err) {\n ab.notify.developer(err, {\n context: \"ABViewGrid:onAfterEditStop(): Error saving item\",\n item,\n editor,\n state,\n object: CurrentObject.toObj(),\n });\n\n $DataTable.clearSelection();\n\n if (\n ab.Validation.isGridValidationError(\n err,\n editor.row,\n $DataTable\n )\n ) {\n // Do we reset the value?\n // item[editor.column] = state.old;\n // $DataTable.updateItem(editor.row, item);\n } else {\n // this was some other Error!\n }\n }\n // CurrentObject.model()\n // .update(item.id, item)\n // .then(() => {\n // if ($DataTable.exists(editor.row)) {\n // $DataTable.updateItem(editor.row, item);\n // $DataTable.clearSelection();\n // $DataTable.refresh(editor.row);\n // }\n // })\n // .catch((err) => {\n // OP.Error.log(\"Error saving item:\", {\n // error: err\n // });\n\n // $DataTable.clearSelection();\n // if (\n // OP.Validation.isGridValidationError(\n // err,\n // editor.row,\n // $DataTable\n // )\n // ) {\n // // Do we reset the value?\n // // item[editor.column] = state.old;\n // // $DataTable.updateItem(editor.row, item);\n // } else {\n // // this was some other Error!\n // }\n // });\n } else validator.updateGrid(editor.row, $DataTable);\n } else $DataTable?.clearSelection();\n\n return false;\n\n // var item = $$(self.webixUiId.objectDatatable).getItem(editor.row);\n\n // self.updateRowData(state, editor, ignoreUpdate)\n // .fail(function (err) { // Cached\n // item[editor.column] = state.old;\n // $$(self.webixUiId.objectDatatable).updateItem(editor.row, item);\n // $$(self.webixUiId.objectDatatable).refresh(editor.row);\n\n // // TODO : Message\n\n // $$(self.webixUiId.objectDatatable).hideProgress();\n // })\n // .then(function (result) {\n // if (item) {\n // item[editor.column] = state.value;\n\n // if (result && result.constructor.name === 'Cached' && result.isUnsync())\n // item.isUnsync = true;\n\n // $$(self.webixUiId.objectDatatable).updateItem(editor.row, item);\n // }\n\n // // TODO : Message\n\n // $$(self.webixUiId.objectDatatable).hideProgress();\n // });\n }\n\n /**\n * @function onAfterSelect\n * This is when a user clicks on a cell. We use the onAfterSelect to\n * trigger a normal .editCell() if there isn't a custom editor for this field.\n * @param {json} data webix cell data\n * @return\n */\n onAfterSelect(data /*, preserve */) {\n // data: {row: 1, column: \"name\", id: \"1_name\", toString: function}\n // data.row: ABObject.id\n // data.column => columnName of the field\n\n // Normal update data\n this.getDataTable()?.editCell(data.row, data.column);\n }\n\n /**\n * @function onColumnResizeResize\n * This is when a user adjusts the size of a column\n * @param {} columnName\n * @param {int} newWidth\n * @param {int} oldWidth\n * @param {} user_action\n * @return\n */\n async onColumnResize(columnName, newWidth, oldWidth, user_action) {\n // update the settings\n\n let requireRefresh = false;\n\n const ab = this.AB;\n\n if (newWidth < 30) {\n newWidth = 30;\n requireRefresh = true;\n\n ab.Webix.message({\n type: \"info\",\n text: this.label(\"minimum column width is {0}\", [30]),\n expire: 1000,\n });\n }\n\n const localSettings = this.localSettings();\n\n if (localSettings) {\n const header = localSettings.find((h) => h.id == columnName);\n\n if (header) {\n header.width = newWidth;\n\n delete header.adjust;\n }\n }\n\n this.localSettings(localSettings);\n\n if (this.settings.saveLocal) {\n await this.localSettingsSave();\n // for (const item in GridSettings) {\n // GridSettings[item].forEach((item) => {\n // // we cannot include field info because of the cicular structure\n // if (item?.footer?.field) {\n // delete item.footer.field;\n // }\n // });\n // }\n // await this.AB.Storage.set(this.keyStorageSettings, GridSettings);\n }\n\n // refresh the display\n if (requireRefresh) this.refreshHeader();\n\n this.freezeDeleteColumn();\n\n // this.getDataTable().refreshColumns();\n\n // TODO: allow external app to respond in special cases:\n // eg: ABDesigner object workspace, interface builder, etc...\n this.emit(\"column.resize\", columnName, newWidth, oldWidth);\n }\n\n /**\n * @method onHeaderClick\n * process the user clicking on the header for one of our columns.\n */\n onHeaderClick(id, e, node) {\n if (this.skippableColumns.indexOf(id.column) !== -1) return false;\n\n // save our EditNode & EditField:\n // this.EditNode = node;\n\n const EditField = this.datacollection.datasource.fields(\n (f) => f.columnName === id.column\n )[0];\n // if (this.EditField) {\n // // show the popup\n // PopupHeaderEditComponent.show(node, this.EditField);\n // }\n\n this.emit(\"column.header.clicked\", node, EditField);\n\n return false;\n }\n\n /**\n * @method onShow()\n * perform any preparations necessary when showing this component.\n */\n onShow() {\n super.onShow();\n\n // make sure our grid is properly .adjust()ed to the screen.\n this.getDataTable()?.adjust();\n\n const dv = this.datacollection;\n\n if (dv)\n [\"changeCursor\", \"cursorStale\", \"cursorSelect\"].forEach((key) => {\n this.eventAdd({\n emitter: dv,\n eventName: key,\n listener: this.handler_select.bind(this),\n });\n });\n }\n\n /**\n * @method ready()\n * Indicate that our datatable is currently ready for operation.\n */\n ready() {\n const dc = this.datacollection;\n if (\n this.isCustomGroup &&\n dc?.dataStatus != dc?.dataStatusFlag.initialized\n )\n return;\n\n this.getDataTable()?.hideProgress?.();\n }\n\n /**\n * @function refreshHeader()\n *\n * refresh the header for the table apart from the refresh() command\n * @param {bool} ignoreLocal\n * Should we ignore our local settings and build directly from\n * our config settings?\n */\n refreshHeader(ignoreLocal = this.ignoreLocal) {\n // columnSplitRight = 0;\n // wait until we have an Object defined:\n const CurrentObject = this.datacollection.datasource;\n\n if (!CurrentObject) return;\n\n const ids = this.ids;\n const $DataTable = $$(ids.datatable);\n\n if (!$DataTable) return;\n\n const accessLevel = $DataTable.config.accessLevel;\n\n $DataTable.define(\"leftSplit\", 0);\n $DataTable.define(\"rightSplit\", 0);\n\n let rowHeight = 0;\n\n CurrentObject.imageFields().forEach((image) => {\n const settings = image.getSettings();\n\n if (settings.useHeight && settings.imageHeight > rowHeight)\n rowHeight = settings.imageHeight;\n });\n\n if (rowHeight) $DataTable.define(\"rowHeight\", rowHeight);\n\n // $DataTable.clearAll();\n\n const settings = this.settings;\n\n let editable = settings.isEditable;\n\n if ($DataTable.config.accessLevel < 2) editable = false;\n\n //// update DataTable structure:\n // get column list from our local settings\n const objColumnHeaders = CurrentObject.columnHeaders(\n true,\n editable,\n // TRANSITION: moving these from .columnHeaders() to here:\n [], //settings.summaryColumns,\n [], //settings.countColumns,\n [] //settings.hiddenFields\n );\n\n let columnHeaders = this.localSettings();\n\n const ab = this.AB;\n\n // if that is empty, pull from our settings.columnConfig\n if (!columnHeaders || ignoreLocal)\n columnHeaders = ab.cloneDeep(this.settings.columnConfig);\n\n // if that is empty for some reason, rebuild from our CurrentObject\n if (!columnHeaders || columnHeaders.length === 0)\n columnHeaders = objColumnHeaders;\n\n // sanity check:\n // columnHeaders can't contain a column that doesn't exist in objColumHeaders:\n // (eg: a field might have been removed but localStorage doesn't know that )\n const objColumnHeaderIDs = objColumnHeaders.map((h) => h.fieldID);\n\n columnHeaders = columnHeaders.filter(\n (c) => objColumnHeaderIDs.indexOf(c.fieldID) > -1\n );\n\n // default our columnConfig values to our columnHeaders:\n columnHeaders.forEach((c) => {\n // we want to overwrite our default settings with anything stored\n // in local storage\n const origCol = objColumnHeaders.find((h) => h.fieldID === c.fieldID);\n\n // none of our functions can be stored in localStorage, so scan\n // the original column and attach any template functions to our\n // stashed copy.\n // also the suggest for selects and connected fields may contain a\n // function so go ahead and copy the original suggest to the column\n Object.keys(origCol).forEach((k) => {\n if (typeof origCol[k] === \"function\" || k === \"suggest\") {\n c[k] = origCol[k];\n }\n });\n\n const f = CurrentObject.fieldByID(c.fieldID);\n\n if (!f) return;\n\n // if it's a hidden field:\n if (settings.hiddenFields.indexOf(f.columnName) > -1) {\n c.hidden = true;\n }\n\n // add summary footer:\n if (settings.summaryColumns.indexOf(f.id) > -1) {\n if (f.key == \"calculate\" || f.key == \"formula\")\n c.footer = { content: \"totalColumn\", field: f };\n else c.footer = { content: \"summColumn\" };\n }\n // or add the count footer\n else if (settings.countColumns.indexOf(f.id) > -1)\n c.footer = { content: \"countColumn\" };\n });\n\n let localSettings = this.localSettings();\n\n if (!localSettings || ignoreLocal) {\n this.localSettings(columnHeaders);\n\n localSettings = columnHeaders;\n }\n\n columnHeaders = ab.cloneDeep(localSettings);\n\n const fieldValidations = [];\n const rulePops = [];\n\n columnHeaders.forEach((col) => {\n col.fillspace = false;\n\n // parse the rules because they were stored as a string\n // check if rules are still a string...if so lets parse them\n if (col.validationRules) {\n if (typeof col.validationRules === \"string\") {\n col.validationRules = JSON.parse(col.validationRules);\n }\n\n if (col.validationRules.length) {\n const validationUI = [];\n\n // there could be more than one so lets loop through and build the UI\n col.validationRules.forEach((rule) => {\n const Filter = ab.filterComplexNew(\n col.id /*+ \"_\" + webix.uid()*/\n );\n // add the new ui to an array so we can add them all at the same time\n validationUI.push(Filter.ui);\n // store the filter's info so we can assign values and settings after the ui is rendered\n fieldValidations.push({\n filter: Filter,\n view: Filter.ids.querybuilder,\n columnName: col.id,\n validationRules: rule.rules,\n invalidMessage: rule.invalidMessage,\n });\n });\n\n // create a unique view id for popup\n const popUpId =\n ids.rules + \"_\" + col.id; /* + \"_\" + webix.uid() */\n\n // store the popup ids so we can remove the later\n rulePops.push(popUpId);\n // add the popup to the UI but don't show it\n ab.Webix.ui({\n view: \"popup\",\n css: \"ab-rules-popup\",\n id: popUpId,\n body: {\n rows: validationUI,\n },\n });\n }\n }\n\n // group header\n if (\n settings.groupBy &&\n (settings.groupBy || \"\").indexOf(col.id) > -1\n ) {\n const groupField = CurrentObject.fieldByID(col.fieldID);\n\n if (groupField)\n col.template = (obj, common) => {\n // return common.treetable(obj, common) + obj.value;\n if (obj.$group) {\n const rowData = ab.cloneDeep(obj);\n\n rowData[groupField.columnName] = rowData.value;\n\n return (\n common.treetable(obj, common) +\n groupField.format(rowData)\n );\n } else return groupField.format(obj);\n };\n }\n });\n\n if (fieldValidations.length) {\n // we need to store the rules for use later so lets build a container array\n const complexValidations = [];\n\n fieldValidations.forEach((f) => {\n // init each ui to have the properties (app and fields) of the object we are editing\n // f.filter.applicationLoad(CurrentObject.application);\n f.filter.fieldsLoad(CurrentObject.fields());\n // now we can set the value because the fields are properly initialized\n f.filter.setValue(f.validationRules);\n // if there are validation rules present we need to store them in a lookup hash\n // so multiple rules can be stored on a single field\n if (!Array.isArray(complexValidations[f.columnName]))\n complexValidations[f.columnName] = [];\n\n // now we can push the rules into the hash\n complexValidations[f.columnName].push({\n filters: f.filter.getValue(),\n values: $DataTable.getSelectedItem[f.columnName],\n invalidMessage: f.invalidMessage,\n });\n });\n\n const rules = {};\n\n // store the rules in a data param to be used later\n $DataTable.$view.complexValidations = complexValidations;\n // use the lookup to build the validation rules\n Object.keys(complexValidations).forEach((key) => {\n rules[key] = (value, data) => {\n // default valid is true\n let isValid = true;\n let invalidMessage = \"\";\n\n $DataTable.$view.complexValidations[key].forEach((filter) => {\n // convert rowData from { colName : data } to { id : data }\n const newData = {};\n\n (CurrentObject.fields() || []).forEach((field) => {\n newData[field.id] = data[field.columnName];\n });\n\n // for the case of \"this_object\" conditions:\n if (data.uuid) {\n newData[\"this_object\"] = data.uuid;\n data[\"this_object\"] = data.uuid;\n }\n\n // use helper funtion to check if valid\n // const ruleValid = filter.filters(newData);\n const filterComplex = ab.filterComplexNew(\n `rule-validate-${key}`\n );\n filterComplex.fieldsLoad(\n CurrentObject.fields(),\n CurrentObject\n );\n const ruleValid = filterComplex.isValid(data, filter.filters);\n\n // if invalid we need to tell the field\n if (!ruleValid) {\n isValid = false;\n invalidMessage = filter.invalidMessage;\n }\n });\n\n // we also need to define an error message\n if (!isValid)\n ab.Webix.message({\n type: \"error\",\n text: invalidMessage,\n });\n\n return isValid;\n };\n });\n // define validation rules\n $DataTable.define(\"rules\", rules);\n // store the array of view ids on the webix object so we can get it later\n $DataTable.config.rulePops = rulePops;\n $DataTable.refresh();\n } else {\n // check if the previous datatable had rule popups and remove them\n if ($DataTable.config.rulePops)\n $DataTable.config.rulePops.forEach((popup) => {\n if ($$(popup)) $$(popup).destructor();\n });\n // remove any validation rules from the previous table\n $DataTable.define(\"rules\", {});\n $DataTable.refresh();\n }\n\n const addedColumns = [];\n // {array} the .id of the columnHeaders we add based upon our settings.\n // this will help us pick the lastColumn that is part of the\n // object.\n\n if (settings.labelAsField) {\n // console.log(CurrentObject);\n columnHeaders.unshift({\n id: \"appbuilder_label_field\",\n header: \"Label\",\n fillspace: true,\n template: (obj) => CurrentObject.displayData(obj),\n // css: { 'text-align': 'center' }\n });\n addedColumns.push(\"appbuilder_label_field\");\n }\n\n if (settings.massUpdate && accessLevel === 2) {\n columnHeaders.unshift({\n id: \"appbuilder_select_item\",\n header: { content: \"masterCheckbox\", contentId: \"mch\" },\n width: 40,\n template: \"
    {common.checkbox()}
    \",\n css: { \"text-align\": \"center\" },\n });\n this.columnSplitLeft = 1;\n addedColumns.push(\"appbuilder_select_item\");\n } else this.columnSplitLeft = 0;\n\n if (settings.detailsPage !== \"\" && !settings.hideButtons) {\n columnHeaders.push({\n id: \"appbuilder_view_detail\",\n header: \"\",\n width: 40,\n template: (obj, common) =>\n \"
    \",\n css: { \"text-align\": \"center\" },\n });\n // columnSplitRight++;\n addedColumns.push(\"appbuilder_view_detail\");\n }\n\n if (settings.trackView !== 0 && accessLevel === 2) {\n columnHeaders.push({\n id: \"appbuilder_view_track\",\n header: \"\",\n width: 40,\n template:\n \"
    \",\n css: { \"text-align\": \"center\", cursor: \"pointer\" },\n });\n // columnSplitRight++;\n addedColumns.push(\"appbuilder_view_track\");\n }\n\n if (\n settings.editPage !== \"\" &&\n !settings.hideButtons &&\n accessLevel === 2\n ) {\n columnHeaders.push({\n id: \"appbuilder_view_edit\",\n header: \"\",\n width: 40,\n template: \"
    {common.editIcon()}
    \",\n css: { \"text-align\": \"center\" },\n });\n // columnSplitRight++;\n addedColumns.push(\"appbuilder_view_edit\");\n }\n\n if (settings.allowDelete && accessLevel === 2) {\n columnHeaders.push({\n id: \"appbuilder_trash\",\n header: \"\",\n width: 40,\n template: \"
    {common.trashIcon()}
    \",\n css: { \"text-align\": \"center\" },\n });\n // columnSplitRight++;\n addedColumns.push(\"appbuilder_trash\");\n }\n\n // find our last displayed column (that isn't one we added);\n let lastCol = null;\n\n for (let i = columnHeaders.length - 1; i >= 0; i--) {\n const col = columnHeaders[i];\n if (!col.hidden && addedColumns.indexOf(col.id) === -1) {\n lastCol = col;\n break;\n }\n }\n\n if (lastCol) {\n lastCol.fillspace = true;\n lastCol.minWidth = lastCol.width;\n lastCol.width = 150; // set a width for last column but by default it will fill the available space or use the minWidth to take up more\n }\n\n $DataTable.refreshColumns(columnHeaders);\n\n // the addedColumns represent the additional icons that can be added.\n this.columnSplitRight = addedColumns.length;\n\n // the .massUpdate gets added to Left so don't include that in split right:\n if (addedColumns.indexOf(\"appbuilder_select_item\") > -1)\n this.columnSplitRight -= 1;\n // .columnSplitRight can't be < 0\n if (this.columnSplitRight < 0) this.columnSplitRight = 0;\n\n // freeze columns:\n const frozenColumnID = settings.frozenColumnID;\n\n if (frozenColumnID != \"\")\n $DataTable.define(\n \"leftSplit\",\n $DataTable.getColumnIndex(frozenColumnID) + 1\n );\n else $DataTable.define(\"leftSplit\", this.columnSplitLeft);\n\n this.freezeDeleteColumn();\n $DataTable.refreshColumns();\n // }\n }\n\n /**\n * localSettingsSave()\n * Persist our current working copy of our GridSettings to localStorage.\n * @return {Promise}\n */\n async localSettingsSave() {\n const ab = this.AB;\n const savedLocalSettings =\n (await ab.Storage.get(this.keyStorageSettings)) || {};\n const _gridSettings = this._gridSettings;\n\n savedLocalSettings[this.settingsID()] = _gridSettings[this.settingsID()]\n ? _gridSettings[this.settingsID()]\n : [];\n\n for (const item in savedLocalSettings) {\n savedLocalSettings[item].forEach((item) => {\n // we cannot include field info because of the cicular structure\n if (item?.footer?.field) delete item.footer.field;\n });\n }\n\n await ab.Storage.set(this.keyStorageSettings, savedLocalSettings);\n }\n\n /**\n * @method localSettings()\n * An interface method to handle get/set operations on our local GridSettings\n * storage.\n * .localStorage() : a getter to return the current value\n * .localStorage(value) : a setter to save value as our current value.\n * @param {various} value\n * the value to set to our settings.\n * @return {various}\n */\n localSettings(value = null) {\n const _gridSettings = this._gridSettings;\n\n if (value) _gridSettings[this.settingsID()] = value;\n else return _gridSettings[this.settingsID()];\n }\n\n /**\n * @method selectRow()\n * Select the grid row that correspondes to the provided rowData.\n * @param {json} rowData\n * A key=>value hash of data that matches an entry in the grid.\n * rowData.id should match an existing entry.\n */\n selectRow(rowData) {\n let id = rowData?.id ?? rowData;\n if (this.__timeout_selectRow) {\n console.log(\"Duplicate selectRow():\", id);\n clearTimeout(this.__timeout_selectRow);\n }\n this.__timeout_selectRow = setTimeout(() => {\n const $DataTable = this.getDataTable();\n if (!$DataTable) return;\n\n if (!id) $DataTable.unselect();\n else if ($DataTable.exists(id)) {\n $DataTable.select(id, false);\n $DataTable.showItem(id);\n } else $DataTable.select(null, false);\n\n this.__timeout_selectRow = null;\n }, 15);\n }\n\n /**\n * @method settingsID()\n * return the unique key for this Grid + object combo to store data\n * in our localStorage.\n * @return {string}\n */\n settingsID() {\n const CurrentObject = this.datacollection.datasource;\n\n return `${this.id}-${CurrentObject ? CurrentObject.id : \"0\"}`;\n }\n\n /**\n * @method toggleTab()\n * recursively toggle tabs into view once a user chooses a detail/edit view\n * to display.\n * @param {ABView.id} parentTab\n * @param {webix.view} wb\n */\n toggleTab(parentTab, wb) {\n // find the tab || if we didn't pass and id we may have passed a domNode\n const tab =\n wb.getTopParentView().queryView({ id: parentTab }) || $$(parentTab);\n\n if (!tab) return;\n\n // set the tabbar to to the tab\n const tabbar = tab.getParentView().getParentView();\n\n if (!tabbar) return;\n\n // if we have reached the top we won't have a tab\n if (tabbar.setValue) tabbar.setValue(parentTab);\n\n // find if it is in a multiview of a tab\n const nextTab = tabbar.queryView({ view: \"scrollview\" }, \"parent\");\n\n // if so then do this again\n if (nextTab) this.toggleTab(nextTab, wb);\n }\n\n toggleUpdateDelete() {\n const $DataTable = this.getDataTable();\n\n let checkedItems = 0;\n\n $DataTable.data.each((obj) => {\n if (\n typeof obj !== \"undefined\" &&\n Object.prototype.hasOwnProperty.call(\n obj,\n \"appbuilder_select_item\"\n ) &&\n obj.appbuilder_select_item === 1\n )\n checkedItems++;\n });\n\n if (checkedItems > 0) this.enableUpdateDelete();\n else this.disableUpdateDelete();\n }\n\n toolbarDeleteSelected($view) {\n const $DataTable = this.getDataTable();\n const CurrentObject = this.datacollection.datasource;\n const deleteTasks = [];\n\n $DataTable.data.each((row) => {\n if (\n typeof row !== \"undefined\" &&\n // row.hasOwnProperty(\"appbuilder_select_item\") &&\n Object.prototype.hasOwnProperty.call(\n row,\n \"appbuilder_select_item\"\n ) &&\n row.appbuilder_select_item === 1\n ) {\n // NOTE: store a fn() to run later.\n deleteTasks.push(() => CurrentObject.model().delete(row.id));\n }\n });\n\n const abWebix = this.AB.Webix;\n\n if (deleteTasks.length > 0)\n abWebix.confirm({\n title: this.label(\"Delete Multiple Records\"),\n text: this.label(\n \"Are you sure you want to delete the selected records?\"\n ),\n callback: async (result) => {\n if (result) {\n // Now run those functions\n await Promise.all(deleteTasks.map((t) => t()));\n\n // Anything we need to do after we are done.\n this.disableUpdateDelete();\n }\n },\n });\n else\n abWebix.alert({\n title: this.label(\"No Records Selected\"),\n text: this.label(\n \"You need to select at least one record...did you drink your coffee today?\"\n ),\n });\n }\n\n toolbarFilter($view) {\n this.view.filterHelper.showPopup($view);\n }\n\n toolbarSort($view) {\n this.PopupSortDataTableComponent.show($view);\n }\n\n toolbarExport($view) {\n this.PopupExport.show($view);\n }\n\n toolbarMassUpdate($view) {\n this.PopupMassUpdateComponent.show($view);\n }\n\n /**\n * @function toolTip()\n *\n * Retrieve the items toolTip\n */\n toolTip(obj, common) {\n const CurrentObject = this.datacollection.datasource;\n const imageFieldColNames = CurrentObject.imageFields().map(\n (f) => f.columnName\n );\n\n let tip = \"\";\n\n const columnName = common.column.id.replace(\" \", \"\");\n\n if (Array.isArray(obj[columnName])) {\n obj[columnName].forEach(function (o) {\n if (o.text) tip += o.text + \"
    \";\n });\n } else if (\n typeof obj[columnName + \"__relation\"] !== \"undefined\" &&\n typeof obj[columnName] === \"number\"\n )\n tip = obj[columnName + \"__relation\"].text;\n else if (typeof obj[columnName + \"__relation\"] !== \"undefined\") {\n let relationData = obj[columnName + \"__relation\"];\n\n if (!Array.isArray(relationData)) relationData = [relationData];\n\n (relationData || []).forEach(function (o) {\n if (o) tip += o.text + \"
    \";\n });\n } else if (imageFieldColNames.indexOf(columnName) !== -1) {\n if (!obj[columnName]) {\n return \"\";\n } else {\n // TODO: we need to get this URL from the ABFieldImage object!\n tip = ``;\n }\n } else if (common.column.editor === \"date\")\n tip = common.column.format(obj[columnName]);\n else if (common.column.editor === \"richselect\")\n CurrentObject.fields().forEach((f) => {\n if (f.columnName === columnName) {\n if (f.settings.options) {\n f.settings.options.forEach((o) => {\n if (o.id === obj[columnName]) {\n tip = o.text;\n }\n });\n }\n }\n });\n else tip = obj[columnName];\n\n if (!tip) return \"\";\n else return tip;\n }\n\n /**\n * @function toolTipOnBeforeRender()\n *\n * Add visibility \"hidden\" to all tooltips before render so we can move to a new location without the visual jump\n */\n toolTipOnBeforeRender(node) {\n // var node = $$(ids.tooltip).getNode();\n node.style.visibility = \"hidden\";\n }\n\n /**\n * @function toolTipOnAfterRender()\n *\n * If the tooltip is displaying off the screen we want to try to reposition it for a better experience\n */\n toolTipOnAfterRender(node) {\n // var node = $$(ids.tooltip).getNode();\n if (node.firstChild?.nodeName === \"IMG\") {\n setTimeout(() => {\n const imgBottom = parseInt(node.style.top.replace(\"px\", \"\")) + 500;\n const imgRight = parseInt(node.style.left.replace(\"px\", \"\")) + 500;\n\n if (imgBottom > window.innerHeight) {\n const imgOffsetY = imgBottom - window.innerHeight;\n const newTop =\n parseInt(node.style.top.replace(\"px\", \"\")) - imgOffsetY;\n node.style.top = newTop + \"px\";\n }\n\n if (imgRight > window.innerWidth) {\n const imgOffsetX = imgRight - window.innerWidth;\n const newLeft =\n parseInt(node.style.left.replace(\"px\", \"\")) - imgOffsetX;\n node.style.left = newLeft + \"px\";\n }\n\n node.style.visibility = \"visible\";\n }, 250);\n } else node.style.visibility = \"visible\";\n }\n\n get isCustomGroup() {\n const dc = this.datacollection;\n const CurrentObject = dc?.datasource;\n const $DataTable = this.getDataTable();\n\n return (\n $DataTable?.config?.view === \"treetable\" && !CurrentObject?.isGroup\n );\n }\n\n populateGroupData() {\n if (!this.isCustomGroup) return;\n\n this.busy();\n\n const dc = this.datacollection;\n const $DataTable = this.getDataTable();\n\n $DataTable.clearAll();\n $DataTable.parse(dc.getData() || []);\n\n this.grouping();\n this.ready();\n }\n}\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewImageComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewImage_${baseView.id}`,\n Object.assign({ image: \"\" }, ids)\n );\n }\n\n ui() {\n const settings = this.settings;\n const _ui = super.ui([\n {\n cols: [\n {\n id: this.ids.image,\n view: \"template\",\n template: \"\",\n height: settings.height,\n width: settings.width,\n },\n {},\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const $image = $$(this.ids.image);\n if (!$image) return;\n\n const settings = this.settings;\n\n if (settings.filename)\n $image.define(\n \"template\",\n ``\n );\n else $image.define(\"template\", \"\");\n\n $image.refresh();\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\nconst ABFormSidePanel = require(\"../ABViewKanbanFormSidePanel\");\n\nmodule.exports = class ABViewKanbanComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewKanBan_${baseView.id}`,\n Object.assign(\n {\n kanbanView: \"\",\n\n kanban: \"\",\n resizer: \"\",\n formSidePanel: \"\",\n },\n ids\n )\n );\n\n this.FormSide = new ABFormSidePanel(\n this,\n this.ids.formSidePanel,\n this.settings.editFields\n );\n\n this.CurrentVerticalField = null;\n this.CurrentHorizontalField = null;\n this.CurrentOwnerField = null;\n\n this.TextTemplate = baseView.TextTemplate;\n\n this._updatingOwnerRowId = null;\n this._ABFieldConnect = null;\n this._ABFieldUser = null;\n this._ABFieldList = null;\n }\n\n get ABFieldConnect() {\n return (this._ABFieldConnect =\n this._ABFieldConnect ||\n this.AB.Class.ABFieldManager.fieldByKey(\"connectObject\"));\n }\n\n get ABFieldUser() {\n return (this._ABFieldUser =\n this._ABFieldUser || this.AB.Class.ABFieldManager.fieldByKey(\"user\"));\n }\n\n get ABFieldList() {\n return (this._ABFieldList =\n this._ABFieldList || this.AB.Class.ABFieldManager.fieldByKey(\"list\"));\n }\n\n ui() {\n const ids = this.ids;\n const self = this;\n this.linkPage = this.view.linkPageHelper.component();\n\n const _ui = super.ui([\n {\n id: ids.kanbanView,\n cols: [\n {\n id: ids.kanban,\n view: \"kanban\",\n cols: [],\n userList: {\n view: \"menu\",\n // yCount: 8,\n // scroll: false,\n template: ' #value#',\n width: 150,\n on: {\n onSelectChange: function () {\n // get this row id from onAvatarClick event\n if (!self._updatingOwnerRowId) return;\n\n const userId = this.getSelectedId(false);\n if (!userId) return;\n\n self.updateOwner(self._updatingOwnerRowId, userId);\n },\n },\n },\n editor: false, // we use side bar\n users: [],\n tags: [],\n data: [],\n on: {\n onListAfterSelect: (itemId, list) => {\n this.CurrentDatacollection?.setCursor(itemId);\n this.emit(\"select\", itemId);\n\n // link pages events\n const editPage = this.settings.editPage;\n if (editPage)\n this.linkPage.changePage(editPage, itemId);\n\n const detailsPage = this.settings.detailsPage;\n if (detailsPage)\n this.linkPage.changePage(detailsPage, itemId);\n },\n onAfterStatusChange: (rowId, status /*, list */) => {\n this.updateStatus(rowId, status);\n },\n onAvatarClick: (rowId /*, ev, node, list */) => {\n // keep this row id for update owner data in .userList\n this._updatingOwnerRowId = rowId;\n },\n },\n },\n {\n id: ids.resizer,\n view: \"resizer\",\n css: \"bg_gray\",\n width: 11,\n hidden: true,\n },\n this.FormSide.ui(),\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const abWebix = this.AB.Webix;\n\n if (this.$kb) abWebix.extend(this.$kb, abWebix.ProgressBar);\n\n this.FormSide.init(AB);\n this.FormSide.on(\"add\", (newVals) => {\n this.saveData(newVals);\n });\n this.FormSide.on(\"update\", (updateVals) => {\n this.saveData(updateVals);\n });\n\n let dc = this.view.datacollection;\n if (dc) this.datacollectionLoad(dc);\n\n this.linkPage.init({\n view: this.view,\n datacollection: dc,\n });\n\n this.show();\n }\n\n get $kb() {\n return (this._kb = this._kb || $$(this.ids.kanban));\n }\n\n kanbanListTemplate() {\n return {\n icons: [\n // { icon: \"mdi mdi-comment\", show: function (obj) { return !!obj.comments }, template: \"#comments.length#\" },\n {\n icon: \"fa fa-trash-o\",\n click: (rowId /*, e */) => {\n this.removeCard(rowId);\n },\n },\n ],\n // avatar template\n templateAvatar: (obj) => {\n if (\n this.CurrentOwnerField &&\n obj[this.CurrentOwnerField.columnName]\n )\n return this.CurrentOwnerField.format(obj);\n else return \"\";\n },\n // template for item body\n // show item image and text\n templateBody: (data) => {\n // if (!this.settings.template)\n if (!this.TextTemplate.text)\n return this.CurrentObject?.displayData(data);\n\n // return our default text template\n return this.TextTemplate.displayText(data);\n },\n };\n }\n\n /**\n * @function hide()\n *\n * hide this component.\n */\n hide() {\n $$(this.ids.kanbanView)?.hide();\n }\n\n /**\n * @function show()\n * Show this component.\n */\n async show() {\n const ids = this.ids;\n\n $$(ids.kanbanView)?.show();\n\n this.FormSide.hide();\n\n $$(ids.resizer)?.hide();\n\n var CurrentObject = this.CurrentObject;\n if (!CurrentObject) {\n CurrentObject = this.datacollection?.datasource;\n }\n if (!CurrentObject) return;\n\n // Get vertical grouping field and populate to kanban list\n // NOTE: this field should be the select list type\n const CurrentVerticalField = CurrentObject.fieldByID(\n this.settings.verticalGroupingField\n );\n if (!CurrentVerticalField) return;\n\n this.CurrentVerticalField = CurrentVerticalField;\n\n let horizontalOptions = [];\n\n const CurrentHorizontalField = CurrentObject.fieldByID(\n this.settings.horizontalGroupingField\n );\n\n this.CurrentHorizontalField = CurrentHorizontalField;\n\n if (\n CurrentHorizontalField &&\n CurrentHorizontalField instanceof this.ABFieldConnect\n )\n // Pull horizontal options\n horizontalOptions = await CurrentHorizontalField.getOptions();\n\n // Option format - { id: \"1543563751920\", text: \"Normal\", hex: \"#4CAF50\" }\n const verticalOptions = (CurrentVerticalField.settings.options || []).map(\n (opt) => {\n // Vertical & Horizontal fields\n if (CurrentVerticalField && CurrentHorizontalField) {\n let rows = [],\n // [{\n // id: '',\n // text: ''\n // }]\n horizontalVals = [];\n\n // pull options of the Horizontal field\n if (CurrentHorizontalField instanceof this.ABFieldList) {\n // make a copy of the settings.\n horizontalVals = (\n CurrentHorizontalField.settings.options || []\n ).map((o) => o);\n } else if (CurrentHorizontalField instanceof this.ABFieldUser) {\n horizontalVals = CurrentHorizontalField.getUsers().map(\n (u) => {\n return {\n id: u.id,\n text: u.text || u.value,\n };\n }\n );\n } else if (CurrentHorizontalField instanceof this.ABFieldConnect)\n horizontalVals = horizontalOptions.map(({ id, text }) => ({\n id,\n text,\n }));\n\n horizontalVals.push({\n id: null,\n text: this.label(\"Other\"),\n });\n\n horizontalVals.forEach((val) => {\n const statusOps = {};\n\n statusOps[CurrentVerticalField.columnName] = opt.id;\n statusOps[CurrentHorizontalField.columnName] = val.id;\n\n // Header\n rows.push({\n template: val.text,\n height: 20,\n css: \"progress_header\",\n });\n\n // Kanban list\n rows.push({\n view: \"kanbanlist\",\n status: statusOps,\n type: this.kanbanListTemplate(),\n });\n });\n\n return {\n header: opt.text,\n body: {\n margin: 0,\n rows: rows,\n },\n };\n }\n // Vertical field only\n else if (CurrentVerticalField) {\n const statusOps = {};\n\n statusOps[CurrentVerticalField.columnName] = opt.id;\n\n return {\n header: opt.text,\n body: {\n view: \"kanbanlist\",\n status: statusOps,\n type: this.kanbanListTemplate(),\n },\n };\n }\n }\n );\n\n const ab = this.AB;\n const abWebix = ab.Webix;\n\n // Rebuild kanban that contains options\n // NOTE: webix kanban does not support dynamic vertical list\n abWebix.ui(verticalOptions, $$(ids.kanban));\n $$(ids.kanban).reconstruct();\n\n // Owner field\n const CurrentOwnerField = CurrentObject.fieldByID(\n this.settings.ownerField\n );\n\n this.CurrentOwnerField = CurrentOwnerField;\n\n if (CurrentOwnerField) {\n const $menuUser = $$(ids.kanban).getUserList();\n\n $menuUser.clearAll();\n\n if (CurrentOwnerField instanceof this.ABFieldUser) {\n const users = ab.Account.userList().map((u) => {\n return {\n id: u.username,\n value: u.username,\n };\n });\n\n $menuUser.parse(users);\n } else if (CurrentOwnerField instanceof this.ABFieldConnect) {\n const options = await CurrentOwnerField.getOptions();\n\n try {\n $menuUser.parse(\n options.map((opt) => {\n return {\n id: opt.id,\n value: opt.text,\n };\n })\n );\n } catch (e) {\n // TODO: remove this. Trying to catch a random webix error:\n // Cannot read properties of null (reading 'driver')\n console.error(e);\n console.warn(options);\n }\n }\n }\n }\n\n busy() {\n this.$kb?.showProgress?.({ type: \"icon\" });\n }\n\n ready() {\n this.$kb?.hideProgress?.();\n }\n\n objectLoad(object) {\n super.objectLoad(object);\n\n this.TextTemplate.objectLoad(object);\n this.FormSide.objectLoad(object);\n }\n\n /**\n * @method datacollectionLoad\n *\n * @param datacollection {ABDatacollection}\n */\n datacollectionLoad(datacollection) {\n super.datacollectionLoad(datacollection);\n\n const DC = this.CurrentDatacollection || datacollection;\n\n if (DC) {\n DC.bind(this.$kb);\n\n const obj = DC.datasource;\n\n if (obj) this.objectLoad(obj);\n\n return;\n }\n\n this.$kb.unbind();\n }\n\n async updateStatus(rowId, status) {\n if (!this.CurrentVerticalField) return;\n\n // Show loading cursor\n this.busy();\n\n let patch = {};\n\n // update multi-values\n if (status instanceof Object) patch = status;\n // update single value\n else patch[this.CurrentVerticalField.columnName] = status;\n\n // update empty value\n let needRefresh = false;\n\n for (const key in patch)\n if (!patch[key]) {\n patch[key] = \"\";\n\n // WORKAROUND: if update data is empty, then it will need to refresh\n // the kanban after update\n needRefresh = true;\n }\n\n try {\n await this.CurrentObject?.model().update(rowId, patch);\n\n this.ready();\n\n if (needRefresh) this.show();\n\n // update form data\n if (this.FormSide.isVisible()) {\n const data = $$(this.ids.kanban).getItem(rowId);\n\n this.FormSide.refresh(data);\n }\n } catch (err) {\n this.AB.notify.developer(err, {\n context: \"ABViewKanban:updateStatus(): Error saving item:\",\n rowId,\n patch,\n });\n }\n }\n\n async updateOwner(rowId, val) {\n if (!this.CurrentOwnerField) return;\n\n // Show loading cursor\n this.busy();\n\n const patch = {};\n\n patch[this.CurrentOwnerField.columnName] = val;\n\n try {\n const updatedRow = await this.CurrentObject?.model().update(\n rowId,\n patch\n );\n\n // update card\n this.$kb?.updateItem(rowId, updatedRow);\n\n // update form data\n if (this.FormSide.isVisible()) {\n const data = this.$kb.getItem(rowId);\n\n this.FormSide.refresh(data);\n }\n\n this.ready();\n } catch (err) {\n this.AB.notify.developer(err, {\n context: \"ABViewKanban:updateOwner(): Error saving item:\",\n rowId,\n val,\n });\n\n this.ready();\n }\n }\n\n saveData(data) {\n // update\n if (data.id && this.$kb.exists(data.id))\n this.$kb.updateItem(data.id, data);\n // insert\n else this.$kb.add(data);\n }\n\n unselect() {\n if (this.$kb)\n this.$kb.eachList((list /*, status*/) => {\n list?.unselect?.();\n });\n }\n\n addCard() {\n this.unselect();\n\n // show the side form\n this.FormSide.show();\n $$(this.ids.resizer).show();\n }\n\n async removeCard(rowId) {\n const ab = this.AB;\n const abWebix = ab.Webix;\n\n abWebix.confirm({\n title: this.label(\"Remove card\"),\n text: this.label(\"Do you want to delete this card?\"),\n callback: async (result) => {\n if (!result) return;\n\n this.busy();\n\n try {\n const response = await this.CurrentObject?.model().delete(rowId);\n\n if (response.numRows > 0) {\n this.$kb.remove(rowId);\n } else {\n abWebix.alert({\n text: this.label(\n \"No rows were effected. This does not seem right.\"\n ),\n });\n }\n } catch (err) {\n ab.notify.developer(err, {\n message: \"ABViewKanban:removeCard(): Error deleting item:\",\n rowId,\n });\n }\n\n this.ready();\n },\n });\n }\n\n /**\n * @method setFields()\n * Save the current view options.\n * @param options - {\n * verticalGrouping: {ABField} - required\n * horizontalGrouping: {ABField} - optional\n * ownerField: {ABField} - optional\n * }\n */\n setFields(options) {\n this.CurrentVerticalField = options.verticalGrouping;\n this.CurrentHorizontalField = options.horizontalGrouping;\n this.CurrentOwnerField = options.ownerField;\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewLabelComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewLabel_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n\n const _ui = super.ui([\n this.uiFormatting({\n view: \"label\",\n // css: 'ab-component-header ab-ellipses-text',\n label: baseView.text || \"*\",\n align: this.settings.alignment,\n type: {\n height: \"auto\",\n },\n }),\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n /**\n * @method uiFormatting\n * a common routine to properly update the displayed label\n * UI with the css formatting for the given .settings\n * @param {obj} _ui the current webix.ui definition\n * @return {obj} a properly formatted webix.ui definition\n */\n uiFormatting(ui) {\n // add different css settings based upon it's format\n // type.\n switch (parseInt(this.settings.format)) {\n // normal\n case 0:\n ui.css = \"ab-component-label ab-ellipses-text\";\n break;\n\n // title\n case 1:\n ui.css = \"ab-component-header ab-ellipses-text\";\n break;\n\n // description\n case 2:\n ui.css = \"ab-component-description ab-ellipses-text\";\n break;\n }\n\n return ui;\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewLayoutComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewLayout_${baseView.id}`, ids);\n\n const viewComponents = this.viewComponents ?? {}; // { viewId: viewComponent, ..., viewIdn: viewComponent }\n\n baseView.views().forEach((v) => {\n viewComponents[v.id] = v.component();\n });\n\n this.viewComponents = viewComponents;\n }\n\n ui() {\n const viewComponents = this.viewComponents;\n const uiComponents = Object.keys(viewComponents)\n .map((vId) => viewComponents[vId].ui())\n .filter((ui) => ui);\n\n if (uiComponents.length == 0) {\n uiComponents.push({});\n uiComponents.push({\n view: \"label\",\n label: this.label(\"no content\"),\n });\n uiComponents.push({});\n }\n\n const _ui = super.ui([\n {\n view: \"layout\",\n cols: uiComponents,\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB, accessLevel) {\n await super.init(AB);\n\n const baseView = this.view;\n\n // make sure each of our child views get .init() called\n baseView.views().forEach((v) => {\n const component = this.viewComponents[v.id];\n\n // initial sub-component\n component?.init(AB, accessLevel);\n\n // Trigger 'changePage' event to parent\n baseView.eventAdd({\n emitter: v,\n eventName: \"changePage\",\n listener: (pageId) => {\n baseView.changePage(pageId);\n },\n });\n });\n }\n\n onShow() {\n // calll .onShow in child components\n this.view.views().forEach((v) => {\n const component = this.viewComponents[v.id];\n component?.onShow();\n });\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewListComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewList_${baseView.id}`,\n Object.assign({ list: \"\" }, ids)\n );\n }\n\n ui() {\n const settings = this.settings;\n const _uiList = {\n id: this.ids.list,\n view: \"dataview\",\n type: {\n width: 1000,\n height: 30,\n },\n template: (item) => {\n const field = this.view.field();\n\n if (!field) return \"\";\n\n return field.format(item);\n },\n };\n\n // set height or autoHeight\n if (settings.height !== 0) _uiList.height = settings.height;\n else _uiList.autoHeight = true;\n\n const _ui = super.ui([_uiList]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const dc = this.datacollection;\n\n if (!dc) return;\n\n // bind dc to component\n dc.bind($$(this.ids.list));\n // $$(ids.list).sync(dv);\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewMenuComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewMenu_${baseView.id}`,\n Object.assign(\n {\n menu: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const settings = this.settings;\n const _ui = super.ui([\n parseInt(settings.menuInToolbar) ? this.uiToolbar() : this.uiMenu(),\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n uiMenu() {\n const baseView = this.view;\n const settings = this.settings;\n const defaultSettings = baseView.constructor.defaultValues();\n const css = `${settings.buttonStyle || defaultSettings.buttonStyle} ${\n settings.menuAlignment || defaultSettings.menuAlignment\n } `;\n\n return {\n id: this.ids.menu,\n view: \"menu\",\n autoheight: true,\n autowidth: true,\n datatype: \"json\",\n css: css,\n layout: settings.orientation || defaultSettings.orientation,\n on: {\n onMenuItemClick: (id /*, e, node */) => {\n this.onClick(id);\n },\n onAfterRender: () => {\n this.defineCypress();\n },\n },\n type: {\n subsign: true,\n },\n };\n }\n\n uiToolbar() {\n const settings = this.settings;\n const baseView = this.view;\n const defaultSettings = baseView.constructor.defaultValues();\n const _uiMenu = this.uiMenu();\n\n let elems = [];\n let menuIncluded = false;\n\n // Legacy support: use old settings values if translated values are not set\n const menuTextLeft = baseView.menuTextLeft ?? settings.menuTextLeft;\n const menuTextCenter = baseView.menuTextCenter ?? settings.menuTextCenter;\n const menuTextRight = baseView.menuTextRight ?? settings.menuTextRight;\n\n if (settings.menuPosition === \"left\") {\n menuIncluded = true;\n elems.push(_uiMenu);\n } else if (menuTextLeft?.length) {\n const width = menuTextLeft.length * 15;\n\n elems.push({\n view: \"label\",\n label: menuTextLeft,\n align: \"left\",\n width: width,\n });\n } else\n elems.push({\n view: \"label\",\n label: \"\",\n autowidth: true,\n });\n\n if (settings?.menuPosition === \"center\") {\n menuIncluded = true;\n\n elems.push(_uiMenu);\n } else if (menuTextCenter?.length) {\n const width = menuTextLeft.length * 15;\n\n elems.push(\n {},\n {\n view: \"label\",\n label: menuTextCenter,\n align: \"center\",\n width: width,\n },\n {}\n );\n } else\n elems.push({\n view: \"label\",\n label: \"\",\n autowidth: true,\n });\n\n if (settings?.menuPosition === \"right\") {\n menuIncluded = true;\n\n elems.push(_uiMenu);\n } else if (menuTextRight?.length) {\n const width = menuTextLeft.length * 15;\n\n elems.push({\n view: \"label\",\n label: menuTextRight,\n align: \"right\",\n width: width,\n });\n } else\n elems.push({\n view: \"label\",\n label: \"\",\n autowidth: true,\n });\n\n if (menuIncluded === false) elems = [_uiMenu];\n\n return {\n view: \"toolbar\",\n css: settings.menuTheme ?? defaultSettings.menuTheme,\n padding: settings.menuPadding\n ? parseInt(settings.menuPadding)\n : defaultSettings.menuPadding,\n elements: elems,\n };\n }\n\n async init(AB) {\n await super.init(AB);\n\n const $menu = $$(this.ids.menu);\n const baseView = this.view;\n\n if ($menu) {\n const settings = this.settings;\n\n baseView.ClearPagesInView($menu);\n\n if (settings.order?.length) {\n baseView.AddPagesToView($menu, settings.order);\n // Force onAfterRender to fire\n $menu.refresh();\n }\n }\n }\n\n onClick(itemId) {\n const $menu = $$(this.ids.menu);\n let $item;\n try {\n $item = $menu.getMenuItem(itemId);\n } catch (err) {\n this.AB.notify.developer(err, {\n context:\n \"ABViewMenuComponent > onClick error gettint menu / menu item\",\n itemId,\n menu: {\n id: this.view.id,\n settings: this.view.settings,\n },\n });\n return;\n }\n const baseView = this.view;\n\n // switch tab view\n if ($item.type === \"tab\") {\n baseView.changePage($item.pageId);\n\n const redirectPage = baseView.application.pages(\n (p) => p.id === $item.pageId,\n true\n )[0];\n\n if (!redirectPage) return;\n\n const tabView = redirectPage.views((v) => v.id === $item.id, true)[0];\n\n if (!tabView) return;\n\n const tab = tabView.parent;\n\n if (!tab) return;\n\n this.toggleParent(tab);\n\n // if (!$$(tabView.id) || !$$(tabView.id).isVisible()) {\n const showIt = setInterval(() => {\n if ($$(tabView.id) && $$(tabView.id).isVisible()) {\n clearInterval(showIt);\n\n return;\n }\n\n tab.emit(\"changeTab\", tabView.id);\n }, 100);\n // }\n }\n // switch page\n else baseView.changePage(itemId);\n }\n\n toggleParent(element) {\n if (!element.parent) return false;\n\n const parentElem = element.parent;\n\n if (!parentElem?.parent) return false;\n\n parentElem.parent.emit(\"changeTab\", parentElem.id);\n this.toggleParent(parentElem.parent);\n }\n\n defineCypress() {\n const $menu = $$(this.ids.menu);\n\n if (!$menu) return;\n\n $menu.data.each((item) => {\n const node = $menu.getItemNode(item.id);\n\n if (!node) return;\n\n // get linked page/tab info so we can use its name in the data-cy\n const viewInfo = this.AB.definitionByID(item.id);\n\n node.setAttribute(\n \"data-cy\",\n `menu-item ${viewInfo?.name} ${item.id} ${this.view.id}`\n );\n });\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nconst SMALL_PAGE_WIDTH = 150;\nconst BIG_PAGE_WIDTH = 250;\n\nmodule.exports = class ABViewPDFImporterComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewPDFImporter_${baseView.id}`,\n Object.assign(\n {\n fileUploader: \"\",\n uploadList: \"\",\n dataview: \"\",\n fullImagePopup: \"\",\n fullImageCarousel: \"\",\n fullImageSelectToggle: \"\",\n fullImageLabel: \"\",\n selectAll: \"\",\n unselectAll: \"\",\n submit: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const ids = this.ids;\n const self = this;\n const _ui = super.ui([\n {\n rows: [\n {\n cols: [\n {\n id: ids.fileUploader,\n view: \"uploader\",\n name: \"records\",\n link: ids.uploadList,\n label: this.label(\"Upload a PDF file\"),\n inputWidth: 200,\n width: 210,\n accept: \"application/pdf\",\n multiple: false,\n autosend: false,\n type: \"icon\",\n icon: \"fa fa-file-pdf-o\",\n on: {\n onBeforeFileAdd: (fileInfo) => {\n this._csvFileInfo = fileInfo;\n if (!this._csvFileInfo) return false;\n\n this.loadFile();\n\n return true;\n },\n },\n },\n {\n id: ids.uploadList,\n view: \"list\",\n type: \"uploader\",\n autoheight: true,\n borderless: true,\n onClick: {\n webix_remove_upload: (e, id) => {\n this.removeFile(id);\n },\n },\n },\n {\n width: 10,\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-th-large\",\n maxWidth: 30,\n click: () => {\n this.displayBig();\n },\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-th\",\n maxWidth: 30,\n click: () => {\n this.displaySmall();\n },\n },\n ],\n },\n {\n height: 10,\n },\n {\n id: ids.dataview,\n view: \"dataview\",\n borderless: true,\n css: \"pdf-data-view\",\n multiselect: false,\n select: false,\n type: {\n template: (item) => {\n return this.pageTemplate(item);\n },\n width: \"auto\",\n height: \"auto\",\n },\n on: {\n onSelectChange: (pageIds) => {\n this.renderPageImages();\n },\n onItemClick: function (id, e, node) {\n // Unselect\n if (e?.target?.className?.includes?.(\"unselect-page\")) {\n self.unselect(id);\n }\n // Select\n else if (\n e?.target?.className?.includes?.(\"select-page\")\n ) {\n self.select(id);\n }\n // Zoom\n else if (e?.target?.className?.includes?.(\"pdf-zoom\")) {\n self._fullImagePopup.show();\n $$(self.ids.fullImageCarousel).setActiveIndex(\n parseInt(id ?? 0) - 1\n );\n self.refreshFullImage();\n }\n },\n },\n },\n {\n height: 10,\n },\n {\n cols: [\n {\n id: ids.selectAll,\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-check-square-o\",\n maxWidth: 160,\n label: this.label(\"Select All\"),\n click: () => {\n this.selectAll();\n },\n },\n {\n id: ids.unselectAll,\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-square-o\",\n maxWidth: 160,\n label: this.label(\"Unselect All\"),\n click: () => {\n this.unselectAll();\n },\n },\n {\n fillspace: true,\n },\n {\n id: ids.submit,\n view: \"button\",\n css: \"webix_primary\",\n type: \"icon\",\n icon: \"fa fa-floppy-o\",\n disabled: true,\n maxWidth: 180,\n label: this.label(\"Submit\"),\n click: () => {\n this.submit();\n },\n },\n ],\n },\n ],\n },\n ]);\n\n return _ui;\n }\n\n uiPopup() {\n const ids = this.ids;\n return {\n id: ids.fullImagePopup,\n view: \"window\",\n modal: true,\n position: \"center\",\n headHeight: 25,\n head: {\n cols: [\n { fillspace: true },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-times\",\n maxWidth: 25,\n height: 25,\n click: () => {\n $$(ids.fullImagePopup)?.hide();\n },\n },\n ],\n },\n body: {\n rows: [\n {\n id: ids.fullImageCarousel,\n view: \"carousel\",\n width: 600,\n height: 500,\n navigation: {\n items: true,\n buttons: true,\n type: \"side\",\n },\n cols: [],\n on: {\n onShow: () => {\n this.refreshFullImage();\n },\n },\n },\n {\n view: \"layout\",\n cols: [\n {\n id: ids.fullImageSelectToggle,\n view: \"toggle\",\n type: \"icon\",\n offIcon: \"fa fa-square-o\",\n onIcon: \"fa fa-check-square-o\",\n offLabel: this.label(\"Unselected\"),\n onLabel: this.label(\"Selected\"),\n width: 130,\n on: {\n onChange: (isSelected) => {\n const activeIndex = $$(\n this.ids.fullImageCarousel\n ).getActiveIndex();\n const pageNumber = activeIndex + 1;\n\n if (isSelected) this.select(pageNumber);\n else this.unselect(pageNumber);\n },\n },\n },\n {\n fillspace: true,\n },\n {\n id: ids.fullImageLabel,\n view: \"label\",\n width: 120,\n label: `${this.label(\"Page Number\")}: ${\"#\"}`,\n },\n ],\n },\n ],\n },\n };\n }\n\n async init(AB) {\n await super.init(AB);\n\n const $dataview = $$(this.ids.dataview);\n if ($dataview) this.AB.Webix.extend($dataview, webix.ProgressBar);\n\n if (!this._fullImagePopup) {\n const fullImagePopup = this.uiPopup();\n this._fullImagePopup = this.AB.Webix.ui(fullImagePopup);\n }\n }\n\n onShow() {\n this.initPdfjs();\n super.onShow();\n }\n\n /**\n * Loads the pdfjs dependecies. We defer loading since it is a large library\n * that is not needed in the initial page load.\n */\n async initPdfjs() {\n if (this.pdfjs && window.pdfjsWorker) return;\n this.busy();\n this.pdfjs = (\n await import(\n /* webpackPrefetch: true */\n \"../../../../init/pdfjs\"\n )\n ).default;\n this.ready();\n }\n\n async _readFileBuffer() {\n const _csvFileInfo = this._csvFileInfo;\n if (!_csvFileInfo || !_csvFileInfo.file)\n return Promise.resolve(new ArrayBuffer(0));\n\n const fileReader = new FileReader();\n\n return new Promise((resolve, reject) => {\n fileReader.onload = (event) => {\n const fileBuffer = event.target.result;\n resolve(fileBuffer);\n };\n fileReader.onerror = (event) => {\n reject(event);\n };\n fileReader.readAsArrayBuffer(_csvFileInfo.file);\n });\n }\n\n async _toBlob(pageNumber, canvas) {\n if (!canvas) return;\n\n return new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n const file = new File([blob], `${pageNumber}.png`, {\n type: \"image/png\",\n });\n\n resolve(file);\n }, \"image/png\");\n });\n }\n\n async _uploadImage(pageNumber) {\n // set quality of the saving image\n const WIDTH_OF_SAVE_IMAGE = 1200;\n\n // Create a temporary CANVAS dom to render page image with specify the height\n const canvasId = `${this.view.id}_temp_canvas`;\n const canvas =\n document.getElementById(canvasId) ?? document.createElement(\"canvas\");\n canvas.id = canvasId;\n canvas.width = WIDTH_OF_SAVE_IMAGE;\n\n await this.showPage(pageNumber, canvas);\n const fileBlob = await this._toBlob(pageNumber, canvas);\n\n return new Promise((resolve, reject) => {\n // Create a uploader to upload images\n const $uploader = this.AB.Webix.ui({\n view: \"uploader\",\n apiOnly: true,\n upload: this.field.urlUpload(),\n inputName: \"file\",\n multiple: false,\n on: {\n // when upload is complete:\n onFileUpload: (item, response) => {\n // RETURN HERE\n resolve(response?.data?.uuid);\n },\n // if an error was returned\n onFileUploadError: (item, response) => {\n reject(response);\n },\n onUploadComplete: () => $uploader.destructor(),\n },\n });\n\n $uploader.addFile(fileBlob, fileBlob.size);\n });\n }\n\n _increaseProgressValue() {\n const $dataview = $$(this.ids.dataview);\n const maxProgressStep = ($dataview.getSelectedId(true) ?? []).length * 2;\n\n this._progressSteps = this._progressSteps ?? 0;\n this._progressSteps++;\n\n $dataview?.showProgress?.({\n type: \"bottom\",\n position: this._progressSteps / maxProgressStep,\n });\n }\n\n async loadFile() {\n this.clearDataview();\n\n const _csvFileInfo = this._csvFileInfo;\n if (!_csvFileInfo) return;\n\n const fileBuffer = await this._readFileBuffer();\n this._pdfDoc = await this.pdfjs.getDocument(fileBuffer).promise;\n\n const total_page = this._pdfDoc.numPages;\n const $dataview = $$(this.ids.dataview);\n const $carousel = $$(this.ids.fullImageCarousel);\n const carousel_list = [];\n for (let pageNumber = 1; pageNumber <= total_page; pageNumber++) {\n $dataview.add({\n id: pageNumber,\n pageNumber,\n });\n\n carousel_list.push({\n template: (item) => {\n return this.fullImageTemplate(item);\n },\n data: {\n pageNumber,\n },\n });\n }\n\n this.renderPageImages();\n if ($carousel) this.AB.Webix.ui(carousel_list, $carousel);\n\n // Select all of images by default\n this.selectAll();\n\n $$(this.ids.submit)?.enable();\n }\n\n removeFile(id) {\n $$(this.ids.uploadList)?.remove(id);\n\n delete this._pdfDoc;\n delete this._csvFileInfo;\n this.clearDataview();\n\n $$(this.ids.submit)?.disable();\n\n return true;\n }\n\n pageTemplateId(pageNumber) {\n return `pdf-importer-${this.view.id}-${pageNumber}`;\n }\n\n pageTemplate(item) {\n const $dataview = $$(this.ids.dataview);\n let selectedPageIds = $dataview.getSelectedId(true);\n\n return `\n
    \n
    \n
    \n ${\n selectedPageIds.filter((pageId) => pageId == item.id).length\n ? ''\n : ''\n }\n
    \n
    \n ${item.pageNumber}\n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n `;\n }\n\n renderPageImages() {\n const $dataview = $$(this.ids.dataview);\n $dataview?.find({}).forEach((item) => {\n const canvas_dom = document.querySelector(\n `#${this.pageTemplateId(item.pageNumber)}`\n );\n this.showPage(item.pageNumber, canvas_dom);\n });\n }\n\n async showPage(pageNumber, canvas_dom) {\n if (!this._pdfDoc) return;\n\n pageNumber = parseInt(pageNumber);\n const page = await this._pdfDoc.getPage(pageNumber);\n const pdf_original_width = page.getViewport({ scale: 1 }).width;\n const scale_required = canvas_dom.width / pdf_original_width;\n\n // get viewport to render the page at required scale\n const viewport = page.getViewport({ scale: scale_required });\n canvas_dom.height = viewport.height;\n\n return page.render({\n canvasContext: canvas_dom.getContext(\"2d\"),\n viewport: viewport,\n }).promise;\n }\n\n clearDataview() {\n const $dataview = $$(this.ids.dataview);\n const $carousel = $$(this.ids.fullImageCarousel);\n\n $dataview?.clearAll();\n if ($carousel)\n this.AB.Webix.ui(\n [\n {\n view: \"label\",\n align: \"center\",\n height: $carousel.height,\n label: this.label(\"No image\"),\n },\n ],\n $carousel\n );\n }\n\n displaySmall() {\n this._isDisplayBig = false;\n $$(this.ids.dataview)?.render();\n this.renderPageImages();\n }\n\n displayBig() {\n this._isDisplayBig = true;\n $$(this.ids.dataview)?.render();\n this.renderPageImages();\n }\n\n get pageItemWidth() {\n return this._isDisplayBig ? BIG_PAGE_WIDTH : SMALL_PAGE_WIDTH;\n }\n\n select(pageNumber) {\n const $dataview = $$(this.ids.dataview);\n\n let selectedIds = $dataview.getSelectedId(true);\n\n selectedIds.push(pageNumber);\n selectedIds = selectedIds.filter((pageId) => pageId);\n\n if (selectedIds.length) $dataview.select(selectedIds);\n else $dataview.unselectAll();\n }\n\n unselect(pageNumber) {\n const $dataview = $$(this.ids.dataview);\n\n let selectedIds = $dataview.getSelectedId(true);\n\n selectedIds = selectedIds.filter(\n (pageId) => pageId && pageId != pageNumber\n );\n\n if (selectedIds.length) $dataview.select(selectedIds);\n else $dataview.unselectAll();\n }\n\n selectAll() {\n $$(this.ids.dataview)?.selectAll();\n }\n\n unselectAll() {\n $$(this.ids.dataview)?.unselectAll();\n }\n\n fullImageTemplateId(pageNumber) {\n return `${this.pageTemplateId(pageNumber)}_full_size`;\n }\n\n fullImageTemplate(item) {\n const $carousel = $$(this.ids.fullImageCarousel);\n return ``;\n }\n\n refreshFullImage() {\n const ids = this.ids;\n const activeIndex = $$(ids.fullImageCarousel).getActiveIndex();\n const pageNumber = activeIndex + 1;\n const canvas_dom = document.querySelector(\n `#${this.fullImageTemplateId(pageNumber)}`\n );\n this.showPage(pageNumber, canvas_dom);\n\n const selectedPageIds = $$(ids.dataview).getSelectedId(true);\n const isSelected =\n selectedPageIds.filter((pageId) => pageId == pageNumber).length > 0;\n $$(ids.fullImageSelectToggle).setValue(isSelected);\n\n $$(ids.fullImageLabel).setValue(\n `${this.label(\"Page Number\")}: ${pageNumber}`\n );\n }\n\n get object() {\n return this.view.datacollection?.datasource;\n }\n\n get field() {\n return this.object?.fields?.(\n (f) => f.id == this.view.settings.fieldID\n )[0];\n }\n\n busy() {\n const ids = this.ids;\n\n const $fileUploader = $$(ids.fileUploader);\n const $uploadList = $$(ids.uploadList);\n const $dataview = $$(ids.dataview);\n const $submit = $$(ids.submit);\n const $selectAll = $$(ids.selectAll);\n const $unselectAll = $$(ids.unselectAll);\n const $selectToggle = $$(ids.fullImageSelectToggle);\n\n $fileUploader?.disable();\n $uploadList?.disable();\n $submit?.disable();\n $selectAll?.disable();\n $unselectAll?.disable();\n $selectToggle?.disable();\n $dataview?.showProgress?.({\n type: \"bottom\",\n position: 0.001,\n });\n }\n\n ready() {\n const ids = this.ids;\n\n const $fileUploader = $$(ids.fileUploader);\n const $uploadList = $$(ids.uploadList);\n const $dataview = $$(ids.dataview);\n const $submit = $$(ids.submit);\n const $selectAll = $$(ids.selectAll);\n const $unselectAll = $$(ids.unselectAll);\n const $selectToggle = $$(ids.fullImageSelectToggle);\n\n $fileUploader?.enable();\n $uploadList?.enable();\n $submit?.enable();\n $selectAll?.enable();\n $unselectAll?.enable();\n $selectToggle?.enable();\n $dataview?.hideProgress?.();\n\n delete this._progressSteps;\n }\n\n async submit() {\n const field = this.field;\n if (!this._pdfDoc || !field) return;\n\n this.busy();\n\n const ids = this.ids;\n const $dataview = $$(ids.dataview);\n const selectedPageIds = $dataview.getSelectedId(true) ?? [];\n const model = field.object.model();\n const dcLink = this.datacollection.datacollectionLink;\n const newValues = [];\n\n for (let i = 0; i < selectedPageIds.length; i++) {\n const pageNumber = selectedPageIds[i];\n if (pageNumber == null || pageNumber == \"\") return;\n\n const uploadId = await this._uploadImage(pageNumber);\n\n this._increaseProgressValue();\n\n // Insert Data\n const values = field.object.defaultValues();\n values[field.columnName] = uploadId;\n\n // Set linked data from the parent DC\n const linkValues = dcLink?.getCursor();\n if (linkValues) {\n const objectLink = dcLink?.datasource;\n\n const connectFields = field.object.connectFields();\n connectFields.forEach((f) => {\n if (\n objectLink.id == f.settings.linkObject &&\n values[f.columnName] === undefined\n ) {\n const linkColName = f.indexField\n ? f.indexField.columnName\n : objectLink.PK();\n\n values[f.columnName] = {};\n values[f.columnName][linkColName] =\n linkValues[linkColName] ?? linkValues.id;\n }\n });\n }\n\n newValues.push(await model.create(values));\n\n this._increaseProgressValue();\n }\n\n this.view.doSubmitRules(newValues);\n\n // NOTE: trigger this event to ABViewPropertyAddPage\n if (newValues) this.view.emit(\"saved\", newValues);\n\n this.ready();\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\nconst ABFieldCalculate = require(\"../../dataFields/ABFieldCalculate\");\nconst ABFieldFormula = require(\"../../dataFields/ABFieldFormula\");\nconst ABFieldNumber = require(\"../../dataFields/ABFieldNumber\");\n/* global pivot */\nmodule.exports = class ABViewPivotComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewPivot_${baseView.id}`,\n Object.assign({ pivot: \"\" }, ids)\n );\n }\n\n ui() {\n const self = this;\n const settings = this.settings;\n const uiPivot = {\n id: this.ids.pivot,\n view: \"pivot\",\n readonly: true,\n removeMissed: settings.removeMissed,\n totalColumn: settings.totalColumn,\n separateLabel: settings.separateLabel,\n min: settings.min,\n max: settings.max,\n height: settings.height,\n fields: this._getFields(),\n format: (value) => {\n const decimalPlaces = settings.decimalPlaces ?? 2;\n\n return value && value != \"0\"\n ? parseFloat(value).toFixed(decimalPlaces || 0)\n : value;\n },\n override: new Map([\n [\n pivot.services.Backend,\n class MyBackend extends pivot.services.Backend {\n async data() {\n const dc = self.datacollection;\n if (!dc) return webix.promise.resolve([]);\n\n const object = dc.datasource;\n if (!object) return webix.promise.resolve([]);\n\n switch (dc.dataStatus) {\n case dc.dataStatusFlag.notInitial:\n await dc.loadData();\n break;\n }\n\n const data = dc.getData();\n const dataMapped = data.map((d) => {\n const result = {};\n\n object.fields().forEach((f) => {\n if (\n f instanceof ABFieldCalculate ||\n f instanceof ABFieldFormula ||\n f instanceof ABFieldNumber\n )\n result[f.columnName] = d[f.columnName];\n else result[f.columnName] = f.format(d);\n });\n\n return result;\n });\n\n return webix.promise.resolve(dataMapped);\n }\n },\n ],\n [\n pivot.views.table,\n class CustomTable extends pivot.views.table {\n CellFormat(value) {\n const decimalPlaces = settings.decimalPlaces ?? 2;\n if (!value) value = value === 0 ? \"0\" : \"\";\n return value\n ? parseFloat(value).toFixed(decimalPlaces)\n : value;\n }\n },\n ],\n ]),\n };\n\n if (settings.structure) uiPivot.structure = settings.structure;\n\n const _ui = super.ui([uiPivot]);\n delete _ui.type;\n\n return _ui;\n }\n\n _getFields() {\n const dc = this.datacollection;\n if (!dc) return [];\n\n const object = dc.datasource;\n if (!object) return [];\n\n const fields = object.fields().map((f) => {\n let fieldType = \"text\";\n\n switch (f.key) {\n case \"calculate\":\n case \"formula\":\n case \"number\":\n fieldType = \"number\";\n break;\n case \"date\":\n case \"datetime\":\n fieldType = \"date\";\n break;\n }\n\n return {\n id: f.columnName,\n value: f.label,\n type: fieldType,\n };\n });\n\n return fields;\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewReportsManagerComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewReportManager_${baseView.id}`,\n Object.assign(\n {\n reportManager: \"\",\n },\n ids\n )\n );\n\n this.readonly = false;\n }\n\n ui() {\n const self = this;\n const settings = this.settings;\n const ab = this.AB;\n const abWebix = ab.Webix;\n const dc = this.datacollection;\n const fieldName = dc?.datasource.fieldByID(\n settings.dataviewFields.name\n )?.columnName;\n const fieldText = dc?.datasource.fieldByID(\n settings.dataviewFields.text\n )?.columnName;\n const fieldQueries = dc?.datasource.fieldByID(\n settings.dataviewFields.queries\n )?.columnName;\n const ids = this.ids;\n class MyBackend extends reports.services.Backend {\n async getModules() {\n if (dc == null) return [];\n\n await self.waitInitializingDCEvery(1000, dc);\n\n return dc.getData().map((e) => {\n return {\n id: e.id,\n name: e[fieldName],\n text: JSON.stringify(e[fieldText]),\n updated: e[\"updated_at\"],\n };\n });\n }\n\n async addModule(data) {\n const parsedData = {};\n\n parsedData[fieldName] = data.name;\n parsedData[fieldText] = data.text;\n\n const response = await dc.model.create(parsedData);\n\n return {\n id: response.id,\n };\n }\n\n async updateModule(id, data) {\n const parsedData = {};\n\n parsedData[fieldName] = data.name;\n parsedData[fieldText] = data.text;\n\n let response = {};\n\n response = await dc.model.update(id, parsedData);\n\n return { id: response.id };\n }\n\n async deleteModule(id) {\n await dc.model.delete(id);\n\n return { id: id };\n }\n\n async getModels() {\n const reportModels = {};\n\n // If no selected DC then get all DCs\n (settings.datacollectionIDs.length > 0\n ? settings.datacollectionIDs\n : self.view.application.datacollectionIDs\n ).forEach((dcID) => {\n const dc = ab.datacollectionByID(dcID);\n\n if (!dc) return;\n\n const obj = dc.datasource;\n\n if (!obj) return;\n\n const reportFields = self.getReportFields(dc);\n\n // get connected data collections\n // let linkedFields = [];\n // (obj.connectFields() || []).forEach((f, index) => {\n // let connectedDcs = ab.datacollections(\n // (dColl) =>\n // dColl &&\n // dColl.datasource &&\n // dColl.datasource.id === f.settings.linkObject\n // );\n // (connectedDcs || []).forEach((linkedDc) => {\n // linkedFields.push({\n // id: index + 1,\n // name: linkedDc.label,\n // source: dc.id,\n // target: linkedDc.id\n // });\n // });\n // });\n\n // // MOCK UP for testing\n // let linkedFields = [\n // {\n // id: \"id\",\n // name: \"id\",\n // source: \"39378ee0-38f0-4b9d-a5aa-dddc61137fcd\", // Player\n // target: \"0de82362-4ab5-4f0f-8cfa-d1288d173cba\" // Team\n // }\n // ];\n\n reportModels[dc.id] = {\n id: dc.id,\n name: dc.label,\n data: reportFields,\n refs: [],\n };\n });\n\n return reportModels;\n }\n\n async getQueries() {\n const moduleID = $$(ids.reportManager).getState().moduleId || \"\";\n\n if (moduleID === \"\") return [];\n\n return (\n (\n await dc.model.findAll({\n where: {\n uuid: moduleID,\n },\n })\n ).data[0][fieldQueries] || []\n );\n }\n\n async addQuery(data) {\n const moduleID = $$(ids.reportManager).getState().moduleId || \"\";\n\n if (moduleID === \"\") return {};\n\n const moduleData = (\n await dc.model.findAll({\n where: {\n uuid: moduleID,\n },\n })\n ).data[0];\n\n if (moduleData == null) return {};\n\n const queries = [...(moduleData[fieldQueries] || [])];\n const queryID = abWebix.uid();\n\n queries.push(Object.assign({ id: queryID }, data));\n\n const parsedData = {};\n\n parsedData[fieldQueries] = queries.sort((a, b) => {\n if (a.name < b.name) return -1;\n\n if (a.name > b.name) return 1;\n\n return 0;\n });\n\n await dc.model.update(moduleID, parsedData);\n\n return { id: queryID };\n }\n\n async updateQuery(id, data) {\n const moduleID = $$(ids.reportManager).getState().moduleId || \"\";\n\n if (moduleID === \"\") return {};\n\n const moduleData = (\n await dc.model.findAll({\n where: {\n uuid: moduleID,\n },\n })\n ).data[0];\n\n if (moduleData == null) return {};\n\n const queries = [...(moduleData[fieldQueries] || [])];\n const queryIndex = queries.findIndex((e) => e.id === id);\n\n queries[queryIndex] = Object.assign({ id }, data);\n\n const parsedData = {};\n\n parsedData[fieldQueries] = queries.sort((a, b) => {\n if (a.name < b.name) return -1;\n\n if (a.name > b.name) return 1;\n\n return 0;\n });\n\n await dc.model.update(moduleID, parsedData);\n\n return { id };\n }\n\n async deleteQuery(id) {\n const moduleID = $$(ids.reportManager).getState().moduleId || \"\";\n\n if (moduleID === \"\") return {};\n\n const moduleData = (\n await dc.model.findAll({\n where: {\n uuid: moduleID,\n },\n })\n ).data[0];\n\n if (moduleData == null) return {};\n\n const queries = moduleData[fieldQueries] || [];\n const queryIndex = queries.findIndex((e) => e.id === id);\n\n if (queryIndex >= 0) {\n const parsedData = {};\n\n parsedData[fieldQueries] = queries\n .filter((e, i) => i !== queryIndex)\n .sort((a, b) => {\n if (a.name < b.name) return -1;\n\n if (a.name > b.name) return 1;\n\n return 0;\n });\n\n await dc.model.update(moduleID, parsedData);\n }\n\n return { id: id };\n }\n\n async getData(config) {\n let result = [];\n let pullDataTasks = [];\n let dcIds = [];\n let dcData = {};\n let reportFields = [];\n\n // pull data of the base and join DCs\n dcIds.push(config.data);\n (config.joins || []).forEach((j) => {\n dcIds.push(j.sid);\n dcIds.push(j.tid);\n });\n dcIds = ab.uniq(dcIds);\n dcIds.forEach((dcId) => {\n pullDataTasks.push(\n new Promise((resolve, reject) => {\n const getData = async () => {\n try {\n dcData[dcId] = (await self.getData(dcId)) || [];\n\n resolve();\n } catch (err) {\n reject(err);\n }\n };\n\n getData();\n })\n );\n });\n\n dcIds.forEach((dcId) => {\n const dataCol = ab.datacollectionByID(dcId);\n\n if (!dataCol) return;\n\n reportFields = reportFields.concat(\n self.getReportFields(dataCol).map((f) => {\n // change format of id to match the report widget\n f.id = `${dcId}.${f.id}`; // dc_id.field_id\n return f;\n })\n );\n });\n\n await Promise.all(pullDataTasks);\n\n // the data result equals data of the base DC\n result = dcData[config.data] || [];\n\n if (config.joins?.length)\n (config.joins || []).forEach((j) => {\n const sourceDc = ab.datacollectionByID(j.sid);\n if (!sourceDc) return;\n\n const sourceObj = sourceDc.datasource;\n if (!sourceObj) return;\n\n const targetDc = ab.datacollectionByID(j.tid);\n if (!targetDc) return;\n\n const targetObj = targetDc.datasource;\n if (!targetObj) return;\n\n const sourceLinkField = sourceObj.fieldByID(j.sf);\n const targetLinkField = targetObj.fieldByID(j.tf);\n if (!sourceLinkField && !targetLinkField) return;\n\n const sourceData = dcData[j.sid] || [];\n const targetData = dcData[j.tid] || [];\n\n sourceData.forEach((sData) => {\n targetData.forEach((tData) => {\n let sVal =\n sData[\n sourceLinkField\n ? `${j.sid}.${sourceLinkField.columnName}.id`\n : `${j.sid}.id`\n ] || [];\n\n let tVal =\n tData[\n targetLinkField\n ? `${j.tid}.${targetLinkField.columnName}.id`\n : `${j.tid}.id`\n ] || [];\n\n if (!Array.isArray(sVal)) sVal = [sVal];\n\n if (!Array.isArray(tVal)) tVal = [tVal];\n\n // Add joined row to the result array\n const matchedVal = sVal.filter(\n (val) => tVal.indexOf(val) > -1\n );\n\n if (matchedVal?.length) {\n const updateRows =\n result.filter(\n (r) =>\n r[`${j.sid}.id`] === sData[`${j.sid}.id`] &&\n !r[`${j.tid}.id`]\n ) || [];\n\n if (updateRows?.length)\n (updateRows || []).forEach((r) => {\n for (const key in tData)\n if (key !== \"id\") r[key] = tData[key];\n });\n else\n result.push(\n Object.assign(\n ab.cloneDeep(sData),\n ab.cloneDeep(tData)\n )\n );\n }\n });\n });\n });\n\n // filter & sort\n const queryVal = JSON.parse(config.query || \"{}\");\n\n if (queryVal?.rules?.length)\n queryVal.rules.forEach((r) => {\n if (!r || !r.type || !r.condition) return;\n\n switch (r.type) {\n case \"date\":\n // Convert string to Date object\n if (r.condition.filter) {\n if (typeof r.condition.filter === \"string\")\n r.condition.filter = ab.rules.toDate(\n r.condition.filter\n );\n\n if (\n r.condition.filter.start &&\n typeof r.condition.filter.start === \"string\"\n )\n r.condition.filter.start = ab.rules.toDate(\n r.condition.filter.start\n );\n\n if (\n r.condition.filter.end &&\n typeof r.condition.filter.end === \"string\"\n )\n r.condition.filter.end = ab.rules.toDate(\n r.condition.filter.end\n );\n }\n\n break;\n }\n });\n\n // create a new query widget to get the filter function\n const filterElem = abWebix.ui({\n view: \"query\",\n fields: reportFields,\n value: queryVal,\n });\n\n // create a new data collection and apply the query filter\n const tempDc = new abWebix.DataCollection();\n\n tempDc.parse(result);\n\n // filter\n let filterFn;\n\n try {\n filterFn = filterElem.getFilterFunction();\n } catch (error) {\n // continue regardless of error\n }\n\n if (filterFn) tempDc.filter(filterFn);\n\n // sorting\n (config.sort || []).forEach((sort) => {\n if (sort.id)\n tempDc.sort({\n as: \"string\",\n dir: sort.mod || \"asc\",\n by: `#${sort.id}#`,\n });\n });\n\n result = tempDc.serialize();\n\n // clear\n filterElem.destructor();\n tempDc.destructor();\n\n // group by\n if (config?.group?.length) {\n result = _.groupBy(result, (e) => {\n return config.group\n .map((column) => {\n const parsedColumn = column.split(\".\");\n const originalColumn =\n parsedColumn.length > 2\n ? `${parsedColumn[1]}.${parsedColumn[2]}`\n : column;\n const reportField = reportFields.find(\n (reportField) => reportField.id === originalColumn\n );\n\n switch (reportField.type) {\n case \"date\": {\n const dateStringData = abWebix.i18n.dateFormatStr(\n e[originalColumn]\n );\n const parsedDateStringData =\n dateStringData.split(\"/\");\n\n switch (parsedColumn[0]) {\n case \"day\":\n e[column] = parsedDateStringData[1];\n\n return parsedDateStringData[1];\n\n case \"month\":\n e[column] = parsedDateStringData[0];\n\n return parsedDateStringData[0];\n\n case \"year\":\n e[column] = parsedDateStringData[2];\n\n return parsedDateStringData[2];\n\n case \"yearmonth\": {\n e[\n column\n ] = `${parsedDateStringData[0]}/${parsedDateStringData[2]}`;\n\n return e[column];\n }\n\n default:\n e[column] = dateStringData;\n\n return dateStringData;\n\n // switch (reportField.abField.key) {\n // case \"datetime\":\n // return abWebix.i18n.fullDateFormatStr(\n // e[originalColumn]\n // );\n\n // default:\n // break;\n // }\n }\n }\n\n default:\n return e[originalColumn]?.toString?.();\n }\n })\n .join(\"\");\n });\n\n result = Object.values(result).map((groupedData) => {\n const groupedResult = {};\n\n (config.columns || []).forEach((col) => {\n const agg = col.split(\".\")[0];\n const rawCol = col.replace(\n /sum.|avg.|count.|max.|min./g,\n \"\"\n );\n\n switch (agg) {\n case \"sum\":\n groupedResult[col] = ab.sumBy(groupedData, rawCol);\n break;\n case \"avg\":\n groupedResult[col] = ab.meanBy(groupedData, rawCol);\n break;\n case \"count\":\n groupedResult[col] = (groupedData || []).length;\n break;\n case \"max\":\n groupedResult[col] =\n (ab.maxBy(groupedData, rawCol) || {})[rawCol] ||\n \"\";\n break;\n case \"min\":\n groupedResult[col] =\n (ab.minBy(groupedData, rawCol) || {})[rawCol] ||\n \"\";\n break;\n default:\n groupedResult[col] = groupedData[0][col];\n break;\n }\n });\n\n return groupedResult;\n });\n }\n\n return result;\n }\n\n async getOptions(fields) {\n return [];\n }\n async getFieldData(fieldId) {\n return [];\n }\n }\n class MyLocal extends reports.services.Local {\n constructor(app) {\n super(app);\n\n this._currentModuleID = \"\";\n }\n\n getQueries() {\n const currentModuleID = $$(ids.reportManager).getState().moduleId;\n\n if (this._currentModuleID !== currentModuleID) {\n this._currentModuleID = currentModuleID;\n this._queries = null;\n }\n\n return super.getQueries();\n }\n }\n class MyEditor extends reports.views.editor {\n init() {\n super.init();\n\n if (!self.readonly || settings.editMode === 1) return;\n\n const $tabbar = this.$$(\"tabbar\");\n\n if (settings.hideCommonTab === 1) {\n const listener = () => {\n $tabbar.callEvent(\"onChange\", [\"data\"]);\n $tabbar.disableOption(\"common\");\n self.removeListener(\"editMode.tabbar.query\", listener);\n };\n\n self.on(\"editMode.tabbar.query\", listener);\n }\n\n if (settings.hideDataTab === 1) $tabbar.disableOption(\"other\");\n\n if (settings.hideViewTab === 1) $tabbar.disableOption(\"structure\");\n\n this.on(this.app, \"editMode.button.back\", () => {\n this.Reset(true);\n });\n }\n\n Reset(forceReset = false) {\n const id = this.AppState.moduleId;\n const condition = self.readonly && !(settings.editMode === 1);\n\n if (!condition || id == null || forceReset) super.Reset();\n\n this.Local.getModule(id);\n }\n\n TrackChanges() {\n super.TrackChanges();\n\n if (settings.hideCommonTab) self.emit(\"editMode.tabbar.query\");\n }\n }\n class MyToolBar extends reports.views.toolbar {\n config() {\n const ui = super.config();\n\n if (self.readonly && !(settings.editMode === 1)) {\n ui.elements[5].cols = ui.elements[5].cols.map((e) =>\n Object.assign(e, {\n hidden: self.readonly && !(settings.editMode === 1),\n })\n );\n\n ui.elements[5].cols.push(\n {},\n {\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-angle-double-left\",\n label: self.label(\"Back\"),\n localId: \"forceReset\",\n click: () => {\n return this.app.callEvent(\"editMode.button.back\", []);\n },\n }\n );\n }\n\n return ui;\n }\n }\n class MyEditorCommon extends reports.views[\"editor/common\"] {\n config() {\n const ui = super.config();\n\n if (!self.readonly) return ui;\n\n return Object.assign({}, ui, {\n elements: ui.elements.map((e, i) =>\n Object.assign(\n {\n hidden: !(i >= 2 && i < 5),\n },\n e\n )\n ),\n });\n }\n\n ShowDeleteButton() {\n super.ShowDeleteButton();\n\n if (self.readonly) this.$$(\"delete\").hide();\n }\n }\n class MyEditorData extends reports.views[\"editor/data\"] {\n config() {\n const ui = super.config();\n\n if (self.readonly) {\n ui.rows[0].rows[0].hidden = true;\n\n ui.rows[0].rows.unshift({\n label: \"Filtering query\",\n view: \"label\",\n width: 120,\n });\n }\n\n return ui;\n }\n }\n class MyTable extends reports.views.table {\n // NOTE: fix format of date column type\n GetColumnConfig(a) {\n let config = {\n id: a.id,\n header:\n !a.meta.header || a.meta.header === \"none\"\n ? a.meta.name || a.name\n : [\n a.meta.name || a.name,\n {\n content:\n a.header === \"text\"\n ? \"textFilter\"\n : \"richSelectFilter\",\n },\n ],\n type: a.type,\n sort: \"date\",\n width: a.width || 200,\n };\n\n const abField = self.AB.datacollectionByID(\n a.mid\n )?.datasource.fields((field) => field.columnName === a.name)[0];\n\n switch (a.type) {\n case \"date\":\n config.format = (val) => {\n // check valid date\n if (val?.getTime && !isNaN(val.getTime()))\n return abField?.key === \"datetime\"\n ? abWebix.i18n.fullDateFormatStr(val)\n : abWebix.i18n.dateFormatStr(val);\n else return \"\";\n };\n\n break;\n\n default:\n config = super.GetColumnConfig(a);\n\n break;\n }\n\n return config;\n }\n\n async GetTableData(mod) {\n const data = await super.GetTableData(mod);\n const buckets = mod.buckets;\n\n if (!buckets) return data;\n\n if (buckets.length === 0) return data;\n\n const columnIDs = mod.columns.map((e) => e.id);\n const parsedBuckets = mod.buckets.filter((bucket) =>\n columnIDs.includes(bucket.column)\n );\n\n if (parsedBuckets.length === 0) return data;\n\n const records = data[0].map((e) => {\n const parseRecord = {};\n\n parsedBuckets.forEach((bucket) => {\n const options = bucket.options;\n\n for (let i = 0; i < options.length; i++)\n if (\n options[i].values?.includes(e[bucket.column]) ||\n i === options.length - 1\n ) {\n parseRecord[bucket.column] = options[i].id;\n\n break;\n }\n });\n\n return Object.assign({}, e, parseRecord);\n });\n\n return [records, data[1]];\n }\n }\n\n const _ui = super.ui([\n {\n id: ids.reportManager,\n view: \"reports\",\n toolbar: true,\n override: new Map([\n [reports.services.Backend, MyBackend],\n [reports.services.Local, MyLocal],\n [reports.views.editor, MyEditor],\n [reports.views.toolbar, MyToolBar],\n [reports.views[\"editor/common\"], MyEditorCommon],\n [reports.views[\"editor/data\"], MyEditorData],\n [reports.views.table, MyTable],\n ]),\n },\n ]);\n\n delete _ui.type;\n delete _ui.height;\n\n return _ui;\n }\n\n async init(AB, accessLevel) {\n this.AB = AB;\n this.readonly = accessLevel < 2;\n\n const $reportManager = $$(this.ids.reportManager);\n const state = $reportManager.getState();\n\n state.readonly = this.readonly;\n state.mode =\n this.readonly && this.settings.editMode === 1 ? \"edit\" : \"list\";\n }\n\n getReportFields(dc) {\n if (!dc) return [];\n\n const object = dc.datasource;\n if (!object) return [];\n\n const fields = [];\n\n object.fields().forEach((f) => {\n const columnFormat = f.columnHeader();\n\n if (!f.isConnection) {\n let type = \"text\";\n\n switch (f.key) {\n case \"boolean\":\n case \"number\":\n case \"date\":\n type = f.key;\n\n break;\n\n case \"datetime\":\n type = \"date\";\n\n break;\n\n default:\n break;\n }\n\n fields.push({\n id: f.columnName,\n name: f.label,\n filter: f.fieldIsFilterable(),\n edit: false,\n type: type,\n format: columnFormat.format,\n options: columnFormat.options,\n ref: \"\",\n key: false,\n show: true,\n abField: f,\n });\n\n return;\n }\n\n if (f.isSource()) {\n const linkedDcs = this.view.application.datacollectionsIncluded(\n (dc) =>\n this.settings.datacollectionIDs.includes(dc.id) &&\n dc.settings.datasourceID === f.settings.linkObject\n );\n\n (linkedDcs || []).forEach((linkDc) => {\n fields.push({\n id: f.id,\n name: f.label,\n filter: false,\n edit: false,\n type: \"reference\",\n ref: linkDc.id,\n key: false,\n show: false,\n });\n });\n }\n });\n\n return fields;\n }\n\n async getData(datacollectionId) {\n const datacollection = this.AB.datacollectionByID(datacollectionId);\n if (!datacollection) return [];\n\n const object = datacollection.datasource;\n if (!object) return [];\n\n await this.waitInitializingDCEvery(1000, datacollection);\n\n const reportFields = this.getReportFields(datacollection);\n const reportData = [];\n const rawData = datacollection.getData();\n\n (rawData || []).forEach((row) => {\n const reportRow = { id: row.id };\n\n reportRow[`${datacollection.id}.id`] = row.id;\n\n object.fields().forEach((field) => {\n const columnName = field.columnName;\n const col = `${datacollection.id}.${columnName}`;\n\n if (field) {\n // FK value of the connect field\n if (field.isConnection) {\n let $pk = field.datasourceLink.PK();\n if (Array.isArray(row[columnName]))\n reportRow[`${col}.id`] = row[columnName].map(\n (link) => link[$pk] || link.id || link\n );\n else if (row[columnName])\n reportRow[`${col}.id`] =\n row[columnName][$pk] ||\n row[columnName].id ||\n row[columnName];\n } else reportRow[col] = field.format(row);\n } else reportRow[col] = row[columnName];\n\n const rField = reportFields.find(\n (f) => f.id === columnName || f.id === field.id\n );\n\n if (!rField) return;\n\n switch (rField.type) {\n case \"text\":\n case \"reference\":\n reportRow[col] = (reportRow[col] || \"\").toString();\n break;\n\n case \"number\":\n reportRow[col] = parseFloat(\n (reportRow[col] || 0).toString().replace(/[^\\d.-]/g, \"\")\n );\n break;\n\n case \"date\":\n reportRow[col] = row[columnName];\n if (reportRow[col]) {\n if (!(reportRow[col] instanceof Date))\n reportRow[col] = this.AB.rules.toDate(row[columnName]);\n } else reportRow[col] = \"\";\n break;\n }\n });\n\n reportData.push(reportRow);\n });\n\n return reportData;\n }\n\n async onShow() {\n super.onShow();\n\n const ids = this.ids;\n const $component = $$(ids.component);\n\n if ($component != null && !this.__isShowing) {\n this.__isShowing = true;\n\n $component.reconstruct();\n }\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewSchedulerComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewScheduler_${baseView.id}`,\n Object.assign(\n {\n scheduler: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const ids = this.ids;\n const ab = this.AB;\n const self = this;\n const abWebix = this.AB.Webix;\n const settings = this.settings;\n const dc = this.datacollection;\n const fieldName = dc?.datasource.fieldByID(\n settings.dataviewFields.name\n )?.columnName;\n const fieldStart = dc?.datasource.fieldByID(\n settings.dataviewFields.start\n )?.columnName;\n const fieldEnd = dc?.datasource.fieldByID(\n settings.dataviewFields.end\n )?.columnName;\n const fieldAllDay = dc?.datasource.fieldByID(\n settings.dataviewFields.allDay\n )?.columnName;\n const fieldRepeat = dc?.datasource.fieldByID(\n settings.dataviewFields.repeat\n )?.columnName;\n const fieldCalendar = dc?.datasource.fieldByID(\n settings.dataviewFields.calendar\n )?.columnName;\n const fieldEventColor = dc?.datasource.fieldByID(\n settings.dataviewFields.color\n )?.columnName;\n const fieldNotes = dc?.datasource.fieldByID(\n settings.dataviewFields.notes\n )?.columnName;\n const fieldOriginID = dc?.datasource.fieldByID(\n settings.dataviewFields.originID\n )?.columnName;\n const fieldSectionID = dc?.datasource.fieldByID(\n settings.dataviewFields.sectionID\n )?.columnName;\n const fieldUnitID = dc?.datasource.fieldByID(\n settings.dataviewFields.unitID\n )?.columnName;\n const dcCalendar = ab.datacollectionByID(\n this.settings.calendarDataviewID\n );\n const fieldTitle = dcCalendar?.datasource.fieldByID(\n settings.calendarDataviewFields.title\n )?.columnName;\n const fieldCalendarColor = dcCalendar?.datasource.fieldByID(\n settings.calendarDataviewFields.color\n )?.columnName;\n const fieldActive = dcCalendar?.datasource.fieldByID(\n settings.calendarDataviewFields.active\n )?.columnName;\n const timelineOptions = [];\n\n Object.keys(settings.timeline).forEach((key) => {\n if (settings.timeline[key] === 0) return;\n\n timelineOptions.push({\n id: `${key}`,\n value: `${key.charAt(0).toUpperCase()}${key.slice(1)}`,\n });\n });\n\n const _ui = super.ui([\n {\n padding: 6,\n cols: [\n { view: \"label\", width: 150, label: \"Export events data to: \" },\n {\n view: \"button\",\n width: 100,\n value: this.label(\"Excel\"),\n hidden: settings.export.excel === 0,\n click: () => {\n abWebix.toExcel(ids.scheduler);\n },\n },\n {\n view: \"button\",\n width: 100,\n value: this.label(\"CSV\"),\n hidden: settings.export.csv === 0,\n click: () => {\n abWebix.toCSV(ids.scheduler);\n },\n },\n {\n view: \"button\",\n width: 100,\n value: this.label(\"PDF\"),\n hidden: settings.export.pdf === 0,\n click: () => {\n abWebix.toPDF(ids.scheduler, { autowidth: true });\n },\n },\n {},\n ],\n },\n {\n id: ids.scheduler,\n view: \"scheduler\",\n date: new Date(),\n readonly: settings.readonly === 1,\n timeline: settings.timeline.timeline === 1,\n override: new Map([\n [\n scheduler.services.Backend,\n class MyBackend extends reports.services.Backend {\n async addCalendar(obj) {\n if (dcCalendar == null) return {};\n\n const data = {};\n\n data[fieldTitle] = obj.text;\n data[fieldCalendarColor] = obj.color;\n data[fieldActive] = obj.active;\n\n const response = await dcCalendar.model.create(data);\n\n return { id: response.id };\n }\n async addEvent(obj) {\n if (dc == null) return {};\n\n const data = {};\n\n data[fieldName] = obj.text;\n data[fieldStart] = new Date(obj.start_date);\n data[fieldEnd] = new Date(obj.end_date);\n data[fieldAllDay] = obj.all_day;\n data[fieldRepeat] = obj.recurring;\n data[fieldCalendar] = obj.calendar;\n data[fieldEventColor] = obj.color;\n data[fieldSectionID] = obj.section || \"No Section\";\n data[fieldUnitID] = obj.units || \"No Unit\";\n data[fieldNotes] = obj.details;\n data[fieldOriginID] = obj.origin_id;\n\n const response = await dc.model.create(data);\n\n return { id: response.id };\n }\n async calendars() {\n // if we manage a datacollection, then make sure it has started\n // loading it's data when we are showing our component.\n if (dcCalendar == null) return [];\n\n await self.waitInitializingDCEvery(1000, dcCalendar);\n\n return dcCalendar.getData().map((e) => {\n return {\n id: e.id,\n text: e[fieldTitle],\n color: e[fieldCalendarColor],\n active: e[fieldActive],\n };\n });\n }\n async events(params) {\n // if we manage a datacollection, then make sure it has started\n // loading it's data when we are showing our component.\n if (dc == null) return [];\n\n await self.waitInitializingDCEvery(1000, dc);\n\n const units = await this.units();\n const sections = await this.sections();\n\n return dc.getData().map((e) => {\n let unitID = units.find(\n (u) => u.id === e[fieldUnitID]\n )?.id;\n let sectionID = sections.find(\n (s) => s.id === e[fieldSectionID]\n )?.id;\n\n if (sectionID == null || unitID == null) {\n sectionID = sectionID || \"No Section\";\n unitID = unitID || \"No Unit\";\n\n // const data = {};\n\n // data[fieldSectionID] = sectionID;\n // data[fieldUnitID] = unitID;\n\n // dc.model.update(e.id, data);\n }\n\n return {\n id: e.id,\n text: e[fieldName],\n start_date: abWebix.Date.dateToStr(\n \"%Y-%m-%d %H:%i:%s\"\n )(e[fieldStart]),\n end_date: abWebix.Date.dateToStr(\n \"%Y-%m-%d %H:%i:%s\"\n )(e[fieldEnd]),\n all_day: e[fieldAllDay],\n recurring: e[fieldRepeat],\n calendar: e[fieldCalendar],\n color: e[fieldEventColor],\n section: sectionID,\n units: unitID,\n details: e[fieldNotes],\n origin_id: e[fieldOriginID],\n };\n });\n }\n async removeCalendar(id) {\n await dcCalendar.model.delete(id);\n }\n async removeEvent(id) {\n await dc.model.delete(id);\n }\n async sections() {\n return [\n { text: \"No Section\", id: \"No Section\" },\n ].concat(\n settings.timelineSectionList.split(\", \").map((e) => {\n return {\n id: e,\n text: e,\n };\n })\n );\n }\n async units() {\n return [{ id: \"No Unit\", value: \"No Unit\" }].concat(\n settings.unitList.split(\", \").map((e) => {\n return {\n id: e,\n value: e,\n };\n })\n );\n }\n async updateCalendar(id, obj) {\n if (dcCalendar == null) return {};\n\n const data = {};\n\n data[fieldTitle] = obj.text;\n data[fieldCalendarColor] = obj.color;\n data[fieldActive] = obj.active;\n\n await dcCalendar.model.update(id, data);\n }\n async updateEvent(id, obj, mode, date) {\n if (dc == null) return {};\n\n const data = {};\n\n data[fieldName] = obj.text;\n data[fieldStart] = new Date(obj.start_date);\n data[fieldEnd] = new Date(obj.end_date);\n data[fieldAllDay] = obj.all_day;\n data[fieldRepeat] = obj.recurring;\n data[fieldCalendar] = obj.calendar;\n data[fieldEventColor] = obj.color;\n data[fieldSectionID] = obj.section || \"No Section\";\n data[fieldUnitID] = obj.units || \"No Unit\";\n data[fieldNotes] = obj.details;\n data[fieldOriginID] = obj.origin_id;\n\n await dc.model.update(id, data);\n }\n },\n ],\n [\n scheduler.views[\"bars/nav\"],\n class CustomBarsView extends scheduler.views[\"bars/nav\"] {\n config() {\n const uiNav = super.config();\n uiNav.width = 160;\n uiNav.options = timelineOptions;\n return uiNav;\n }\n },\n ],\n [\n scheduler.views[\"bars/navpopup\"],\n class CustomNavPopupView extends scheduler.views[\n \"bars/navpopup\"\n ] {\n config() {\n const uiNavPopup = super.config();\n\n const options = timelineOptions.map((e) =>\n Object.assign({ icon: `shi-${e.id}` }, e)\n );\n\n if (this.app.config.calendars)\n uiNavPopup.body.body.rows[0].data = options;\n else uiNavPopup.body.data = options;\n\n return uiNavPopup;\n }\n },\n ],\n [\n scheduler.views[\"modes/day/multiday\"],\n class CustomModesDayMultiday extends scheduler.views[\n \"modes/day/multiday\"\n ] {\n LimitData(data) {\n // Get an error the case when the data parameter is undefined.\n super.LimitData(data || []);\n }\n },\n ],\n ]),\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async onShow() {\n super.onShow();\n\n const ids = this.ids;\n const $component = $$(ids.component);\n\n if ($component != null && !this.__isShowing) {\n this.__isShowing = true;\n\n $component.reconstruct();\n }\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewTabComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewTab_${baseView.id}`,\n Object.assign(\n {\n tab: \"\",\n\n sidebar: \"\",\n expandMenu: \"\",\n collapseMenu: \"\",\n\n popupTabManager: \"\",\n popupTabManagerForm: \"\",\n popupTabManagerSaveButton: \"\",\n },\n ids\n )\n );\n\n this.viewComponents =\n this.viewComponents ||\n baseView\n .views((v) => v.getUserAccess())\n .map((v) => {\n return {\n view: v,\n // component: v.component(App)\n };\n });\n }\n\n ui() {\n const ids = this.ids;\n const baseView = this.view;\n const ab = this.AB;\n const abWebix = ab.Webix;\n\n let _ui = null;\n\n // We are going to make a custom icon using the first letter of a menu item for menu items that don't have an icon\n // to do this we need to modify the default template with the method webix recommended form this snippet https://snippet.webix.com/b566d9f8\n abWebix.type(abWebix.ui.tree, {\n baseType: \"sideBar\", // inherit everything else from sidebar type\n name: \"customIcons\",\n icon: (obj, common) => {\n if (obj.icon.length)\n return [\n \"\",\n ].join(\"\");\n\n return [\n \"\",\n obj.value.charAt(0).toUpperCase(),\n \"\",\n ].join(\"\");\n },\n });\n\n const viewComponents = this.viewComponents;\n const settings = this.settings;\n\n if (viewComponents.length > 0) {\n if (settings.stackTabs) {\n // define your menu items from the view components\n const menuItems = viewComponents.map((vc) => {\n const view = vc.view;\n\n return {\n id: `${view.id}_menu`,\n value: view.label,\n icon: view.tabicon ? view.tabicon : \"\",\n };\n });\n\n if (menuItems.length) {\n // create a menu item for the collapse option to use later\n const collapseMenu = {\n id: ids.collapseMenu,\n value: this.label(\"Collapse Menu\"),\n icon: \"chevron-circle-left\",\n };\n\n // create a menu item from the expand option to use later\n const expandMenu = {\n id: ids.expandMenu,\n value: this.label(\"Expand Menu\"),\n icon: \"chevron-circle-right\",\n hidden: true,\n };\n\n // find out what the first option is so we can set it later\n let selectedItem = `${viewComponents[0].view.id}_menu`;\n\n const abStorage = ab.Storage;\n const sidebar = {\n view: \"sidebar\",\n type: \"customIcons\", // define the sidebar type with the new template created above\n id: ids.sidebar,\n height: settings.height,\n width: settings.sidebarWidth ? settings.sidebarWidth : 0,\n scroll: true,\n position: settings.sidebarPos ? settings.sidebarPos : \"left\",\n css: settings.darkTheme ? \"webix_dark\" : \"\",\n data: menuItems.concat(collapseMenu), // add you menu items along with the collapse option to start\n on: {\n onItemClick: (id) => {\n // when a menu item is clicked\n if (id === ids.collapseMenu) {\n // if it was the collapse menu item\n setTimeout(() => {\n const $sidebar = $$(ids.sidebar);\n\n // remove the collapse option from the menu\n $sidebar.remove(ids.collapseMenu);\n // add the expand option to the menu\n $sidebar.add(expandMenu);\n // toggle the sidebar state\n $sidebar.toggle();\n // we just clicked the collapse...but we don't wanted highlighted\n // so highlight the previously selected menu item\n $sidebar.select(selectedItem);\n // store this state in local storage the user preference is\n // remembered next time they see this sidebar\n abStorage.set(\n `${ids.tab}-state`,\n $sidebar.getState()\n );\n }, 0);\n } else if (id === ids.expandMenu) {\n setTimeout(() => {\n const $sidebar = $$(ids.sidebar);\n\n // remove the expand option from the menu\n $sidebar.remove(ids.expandMenu);\n // add the collapse option to the menu\n $sidebar.add(collapseMenu);\n // toggle the sidebar state\n $sidebar.toggle();\n // we just clicked the collapse...but we don't wanted highlighted\n // so highlight the previously selected menu item\n $sidebar.select(selectedItem);\n // store this state in local storage the user preference is\n // remembered next time they see this sidebar\n abStorage.set(\n `${ids.tab}-state`,\n $sidebar.getState()\n );\n }, 0);\n } else {\n // store the selecte menu item just in case someone toggles the menu later\n selectedItem = id;\n // if the menu item is a regular menu item\n // call the onShow with the view id to load the view\n\n id = id.replace(\"_menu\", \"\");\n let node = $$(id);\n if (node) {\n node.show(false, false);\n } else {\n // How often does this occure?\n let msg = `ABViewTabComponent[${this.name}][${this.id}] could not resolve UI panel for provided menu [${selectedItem}].`;\n this.AB.notify(\"developer\", msg, {});\n }\n // $$(id).show(false, false);\n\n // onShow(id);\n }\n },\n onSelectChange: () => {\n addDataCy();\n },\n onAfterRender: () => {\n addDataCy();\n },\n },\n };\n\n const multiview = {\n view: \"multiview\",\n id: ids.tab,\n keepViews: true,\n minWidth: settings.minWidth,\n cells: viewComponents.map((view) => {\n const tabUi = {\n id: view.view.id,\n // ui will be loaded when its tab is opened\n view: \"layout\",\n rows: [],\n };\n\n return tabUi;\n }),\n on: {\n onViewChange: (prevId, nextId) => {\n this.onShow(nextId);\n },\n },\n };\n\n const addDataCy = function () {\n const $sidebar = $$(ids.sidebar);\n\n // set ids of controller buttons\n const collapseNode = $sidebar?.$view.querySelector(\n `[webix_tm_id=\"${ids.collapseMenu}\"]`\n );\n\n if (collapseNode)\n collapseNode.setAttribute(\n \"data-cy\",\n `tab-collapseMenu-${ids.collapseMenu}`\n );\n\n const expandNode = $sidebar?.$view.querySelector(\n `[webix_tm_id=\"${ids.expandMenu}\"]`\n );\n\n if (expandNode)\n expandNode.setAttribute(\n \"data-cy\",\n `tab-expandMenu-${ids.expandMenu}`\n );\n\n baseView.views((view) => {\n const node = $sidebar?.$view?.querySelector(\n `[webix_tm_id=\"${view.id}_menu\"]`\n );\n\n if (!node) {\n return;\n }\n\n node.setAttribute(\n \"data-cy\",\n `tab-${view.name.replace(\" \", \"\")}-${view.id}-${\n baseView.id\n }`\n );\n });\n };\n\n let columns = [sidebar, multiview];\n\n if (settings.sidebarPos === \"right\") {\n columns = [multiview, sidebar];\n }\n\n _ui = {\n cols: columns,\n };\n } else\n _ui = {\n view: \"spacer\",\n };\n } else {\n const cells = baseView\n .views((view) => {\n const accessLevel = view.getUserAccess();\n\n if (accessLevel > 0) {\n return view;\n }\n })\n .map((view) => {\n const tabUi = {\n id: view.id,\n // ui will be loaded when its tab is opened\n view: \"layout\",\n rows: [],\n };\n\n let tabTemplate = \"\";\n\n // tab icon\n if (view.tabicon) {\n if (settings.iconOnTop)\n tabTemplate = [\n \"

    \",\n view.label,\n \"
    \",\n ].join(\"\");\n else\n tabTemplate = [\n \" \",\n view.label,\n ].join(\"\");\n }\n\n // no icon\n else tabTemplate = view.label;\n\n return {\n header: tabTemplate,\n body: tabUi,\n };\n });\n\n // if there are cells to display then return a tabview\n if (cells.length) {\n _ui = {\n rows: [\n {\n view: \"tabview\",\n id: ids.tab,\n minWidth: settings.minWidth,\n height: settings.height,\n tabbar: {\n height: 60,\n type: \"bottom\",\n css: settings.darkTheme ? \"webix_dark\" : \"\",\n on: {\n onAfterRender: () => {\n baseView.views((view) => {\n const node = $$(\n ids.tab\n )?.$view?.querySelector(\n `[button_id=\"${view.id}\"]`\n );\n\n if (!node) return;\n\n node.setAttribute(\n \"data-cy\",\n `tab ${view.name} ${view.id} ${baseView.id}`\n );\n });\n },\n },\n },\n multiview: {\n on: {\n onViewChange: (prevId, nextId) => {\n this.onShow(nextId);\n },\n },\n },\n cells: cells,\n },\n ],\n };\n }\n // else we return a spacer\n else\n _ui = {\n view: \"spacer\",\n };\n }\n } else\n _ui = {\n view: \"spacer\",\n };\n\n _ui = super.ui([_ui]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const ids = this.ids;\n const $tab = $$(ids.tab);\n const ab = this.AB;\n const abWebix = ab.Webix;\n\n if ($tab) abWebix.extend($tab, abWebix.ProgressBar);\n\n const baseView = this.view;\n const viewComponents = this.viewComponents;\n\n viewComponents.forEach((vc) => {\n // vc.component.init(AB);\n\n // Trigger 'changePage' event to parent\n this.eventAdd({\n emitter: vc.view,\n eventName: \"changePage\",\n listener: (...p) => this.changePage(...p),\n });\n });\n\n // Trigger 'changeTab' event to parent\n this.eventAdd({\n emitter: baseView,\n eventName: \"changeTab\",\n listener: (...p) => this.changeTab(...p),\n });\n\n // initialize the sidebar and figure out if it should be collased or not\n const $sidebar = $$(ids.sidebar);\n\n if (!$sidebar) return;\n\n const state = await ab.Storage.get(`${ids.tab}-state`);\n\n if (!state) return;\n\n // create a menu item for the collapse option to use later\n const collapseMenu = {\n id: ids.collapseMenu,\n value: this.label(\"Collapse Menu\"),\n icon: \"chevron-circle-left\",\n };\n\n // create a menu item from the expand option to use later\n const expandMenu = {\n id: ids.expandMenu,\n value: this.label(\"Expand Menu\"),\n icon: \"chevron-circle-right\",\n hidden: true,\n };\n\n // this will collapse or expand the sidebar\n $sidebar.setState(state);\n\n const checkCollapseMenu = $sidebar.getItem(ids.collapseMenu) ?? null;\n const checkExpandMenu = $sidebar.getItem(ids.expandMenu) ?? null;\n\n // if the state is collapsed we need to make sure the expand option is available\n if (state.collapsed) {\n if (checkCollapseMenu && checkExpandMenu)\n // $sidebar.remove(ids.collapseMenu);\n $sidebar.add(expandMenu);\n } else if (checkCollapseMenu && checkExpandMenu)\n // $sidebar.remove(ids.collapseMenu);\n $sidebar.add(collapseMenu);\n }\n\n changePage(pageId) {\n const $tab = $$(this.ids.tab);\n\n $tab?.blockEvent();\n this.view.changePage(pageId);\n $tab?.unblockEvent();\n }\n\n changeTab(tabViewId) {\n const baseView = this.view;\n const $tabViewId = $$(tabViewId);\n\n // switch tab view\n this.toggleParent(baseView.parent);\n\n if (this.settings.stackTabs)\n if (!$tabViewId.isVisible()) {\n const showIt = setInterval(() => {\n if ($tabViewId.isVisible()) clearInterval(showIt);\n\n $tabViewId.show(false, false);\n }, 200);\n } else $$(this.ids.tab).setValue(tabViewId);\n }\n\n toggleParent(view) {\n const $viewID = $$(view.id);\n\n if (view.key === \"tab\" || view.key === \"viewcontainer\") {\n $viewID?.show(false, false);\n }\n if (view.parent) {\n this.toggleParent(view.parent);\n }\n }\n\n onShow(viewId) {\n const ids = this.ids;\n\n let defaultViewIsSet = false;\n\n const $sidebar = $$(ids.sidebar);\n\n // if no viewId is given, then try to get the currently selected ID\n if (!viewId && $sidebar)\n viewId = $sidebar.getSelectedId().replace(\"_menu\", \"\");\n\n const baseView = this.view;\n const viewComponents = this.viewComponents;\n\n viewComponents.forEach((vc) => {\n // set default view id\n const currView = baseView.views((view) => {\n return view.id === vc.view.id;\n });\n\n let accessLevel = 0;\n\n if (currView.length) accessLevel = currView[0].getUserAccess();\n\n // choose the 1st View if we don't have one we are looking for.\n if (!viewId && !defaultViewIsSet && accessLevel > 0) {\n viewId = vc.view.id;\n\n defaultViewIsSet = true;\n }\n\n // create view's component once\n const $tab = $$(ids.tab);\n const settings = this.settings;\n\n if (!vc?.component && vc?.view?.id === viewId) {\n // show loading cursor\n if ($tab?.showProgress) $tab.showProgress({ type: \"icon\" });\n\n vc.component = vc.view.component();\n\n const $viewID = $$(vc.view.id);\n const ab = this.AB;\n const abWebix = ab.Webix;\n\n if (settings.stackTabs) {\n // update multiview UI\n abWebix.ui(\n {\n // able to 'scroll' in tab view\n id: vc.view.id,\n view: \"scrollview\",\n css: \"ab-multiview-scrollview\",\n body: vc.component.ui(),\n },\n $viewID\n );\n } else {\n // update tab UI\n abWebix.ui(\n {\n // able to 'scroll' in tab view\n id: vc.view.id,\n view: \"scrollview\",\n css: \"ab-tabview-scrollview\",\n body: vc.component.ui(),\n },\n $viewID\n );\n }\n\n // for tabs we need to look at the view's accessLevels\n accessLevel = vc.view.getUserAccess();\n\n vc.component.init(ab, accessLevel);\n\n // done\n setTimeout(() => {\n // $$(v.view.id).adjust();\n\n $tab?.hideProgress?.();\n // check if tab has a hint\n // if (vc?.view?.settings?.hintID) {\n // // fetch the steps for the hint\n // let hint = ab.hintID(vc.view.settings.hintID);\n // hint.createHintUI();\n // }\n }, 10);\n }\n\n // show UI\n if (vc?.view?.id === viewId && vc?.component?.onShow)\n vc.component.onShow();\n\n if (settings.stackTabs && vc?.view?.id === viewId) {\n $$(viewId)?.show(false, false);\n $sidebar?.select(`${viewId}_menu`);\n }\n });\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewTextComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewText_${baseView.id}`,\n Object.assign(\n {\n text: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const ids = this.ids;\n const settings = this.settings;\n\n const _uiText = {\n id: ids.text,\n view: \"template\",\n minHeight: 10,\n css: \"ab-custom-template\",\n borderless: true,\n };\n\n if (settings.height) _uiText.height = settings.height;\n else _uiText.autoheight = true;\n\n const _ui = super.ui([_uiText]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n displayText(value) {\n const ids = this.ids;\n const result = this.view.displayText(value, ids.text);\n\n const $text = $$(ids.text);\n\n if (!$text) return;\n\n $text.define(\"template\", result);\n $text.refresh();\n }\n\n onShow() {\n super.onShow();\n\n // listen DC events\n const dataview = this.datacollection;\n const baseView = this.view;\n\n if (dataview && baseView.parent.key !== \"dataview\") {\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n baseView.eventAdd({\n emitter: dataview,\n eventName: key,\n listener: (...p) => this.displayText(...p),\n });\n });\n }\n\n this.displayText();\n }\n};\n","import ClassUI from \"../../../../ui/ClassUI\";\n\nexport default class ABViewProperty extends ClassUI {\n // constructor() {}\n\n /**\n * @property default\n * return default settings\n *\n * @return {Object}\n */\n static get default() {\n return {};\n }\n\n /** == Property == */\n /**\n * @function propertyComponent\n * return the view and logic to display in property panel\n *\n * @return {Object} - {\n * \t\t\t\t\t\tui: webix element,\n * \t\t\t\t\t\tinit: function,\n * \t\t\t\t\t\tlogic: object\n * \t\t\t\t\t}\n */\n static propertyComponent() {\n let ui = {\n view: \"template\",\n template: \"No UI\",\n };\n\n let init = (options) => {\n // register callbacks:\n for (var c in logic.callbacks) {\n logic.callbacks[c] = options[c] || logic.callbacks[c];\n }\n };\n\n let logic = {\n callbacks: {},\n };\n\n return {\n ui: ui,\n init: init,\n logic: logic,\n };\n }\n\n fromSettings(settings) {\n this.settings = settings;\n }\n\n toSettings() {\n return this.settings || {};\n }\n\n /** == UI == */\n /**\n * @function component\n * return the view and logic to display in display widget\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n *\n * @return {Object} - {\n * \t\t\t\t\t\tui: webix element,\n * \t\t\t\t\t\tinit: function,\n * \t\t\t\t\t\tlogic: object\n * \t\t\t\t\t}\n */\n component(App, idBase) {\n this.App = App;\n this.idBase = idBase;\n\n let ui = {\n view: \"template\",\n template: \"No UI\",\n };\n\n let init = (options) => {\n // register callbacks:\n for (var c in logic.callbacks) {\n logic.callbacks[c] = options[c] || logic.callbacks[c];\n }\n };\n\n let logic = {\n callbacks: {},\n };\n\n return {\n ui: ui,\n init: init,\n logic: logic,\n };\n }\n}\n","import ABViewProperty from \"./ABViewProperty\";\nimport ABViewFormButton from \"../ABViewFormButton\";\nimport ABViewPDFImporter from \"../ABViewPDFImporter\";\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nexport default class ABViewPropertyAddPage extends ABViewProperty {\n /**\n * @property default\n * return default settings\n *\n * @return {Object}\n */\n static get default() {\n return {\n formView: \"none\", // id of form to add new data\n };\n }\n\n static propertyComponent(App, idBase) {\n let ids = {\n formView: `${idBase}_formView`,\n };\n\n let ui = {\n id: ids.formView,\n name: \"formView\",\n view: \"richselect\",\n label: L(\"Add New Form\"),\n labelWidth: this.AB.UISettings.config().labelWidthXLarge,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal == L(\"No add new option\")) {\n $$(ids.formView).setValue(\"\");\n }\n\n _logic.callbacks.onSave();\n },\n },\n };\n\n let _init = (options) => {\n for (let c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n };\n\n let _logic = {\n callbacks: {\n onSave: function () {\n console.warn(\"NO onSave()!\");\n },\n },\n\n setSettings: (view, settings = {}) => {\n if (view == null) return;\n\n // Set the options of the possible edit forms\n let editForms = [\n {\n id: \"none\",\n value: L(\"No add new option\"),\n },\n ];\n\n let pagesHasForm = view\n .pageRoot()\n .pages((p) => {\n return p.views((v) => {\n return (\n v &&\n v.key == \"form\" &&\n v.datacollection &&\n v.datacollection.datasource &&\n v.datacollection.datasource.id ==\n view.field().settings.linkObject\n );\n }, true).length;\n }, true)\n .map((p) => {\n return {\n id: p.id,\n value: p.label,\n };\n });\n\n editForms = editForms.concat(pagesHasForm);\n\n let $selector = $$(ids.formView);\n if ($selector) {\n $selector.define(\"options\", editForms);\n $selector.define(\n \"value\",\n settings.formView || this.default.formView\n );\n $selector.refresh();\n }\n },\n\n getSettings: (view) => {\n let settings = view.settings || {};\n\n settings.formView = $$(ids.formView).getValue();\n\n return settings;\n },\n };\n\n return {\n ui: ui,\n init: _init,\n setSettings: _logic.setSettings,\n getSettings: _logic.getSettings,\n };\n }\n\n fromSettings(settings = {}) {\n this.settings = this.settings || {};\n this.settings.formView =\n settings.formView || this.constructor.default.formView;\n }\n\n getIds(idBase, App) {\n return {\n popup: App._App.unique(`${idBase}_popup_add_new`),\n field: idBase.split(\"_\")[1],\n button: App._App.unique(`${idBase}_popup_add_new_button`),\n };\n }\n\n component(App, idBase) {\n // This can be overwritten by creating a different getIds before calling .super\n let ids = this.getIds(idBase, App);\n\n let ui = \"\";\n\n if (\n this.settings.formView &&\n this.settings.formView != this.constructor.default.formView\n ) {\n // let iDiv = document.createElement(\"div\");\n // iDiv.className = \"ab-connect-add-new\";\n const dataCy = `add new CR button ${this.settings.formView} ${ids.field}`;\n // iDiv.innerHTML = ``;\n // iDiv.appendChild(node);\n // ui = iDiv.outerHTML;\n ui = {\n id: ids.button,\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-plus\",\n width: 32,\n height: 32,\n css: \"webix_primary ab-connect-add-new-link\",\n on: {\n onAfterRender: () => {\n $$(ids.button)\n ?.$view.querySelector(\"button\")\n .setAttribute(\"data-cy\", dataCy);\n },\n },\n };\n }\n\n let _logic = {\n callbacks: {\n onSaveData: (saveData) => {\n if ($$(ids.popup)) $$(ids.popup).close();\n },\n onCancel: () => {\n if ($$(ids.popup)) $$(ids.popup).close();\n\n return false;\n },\n onClearOnLoad: () => {\n return true;\n },\n clearOnLoad: () => {\n return true;\n },\n },\n\n applicationLoad: (application) => {\n this._application = application;\n },\n\n onClick: (dc) => {\n let pageId = this.settings.formView;\n let page = this._application.pages((p) => p.id == pageId, true)[0];\n\n return _logic.openFormPopup(page, dc);\n },\n\n /**\n * @method openFormPopup\n *\n * @param page {ABViewPage}\n * @param dc {ABDataCollection}\n */\n openFormPopup: (page, dc) => {\n return new Promise((resolve, reject) => {\n if (this._application == null) return resolve();\n\n if ($$(ids.popup)) {\n $$(ids.popup).show();\n return resolve();\n }\n\n // Clone page so we modify without causing problems\n let pageClone = page.clone(null, null, { ignoreSubPages: true });\n pageClone.id = this._application.AB.uuid(); // lets take the stored id can create a new dynamic one so our views don't duplicate\n // pageClone.id = pageClone.id + \"-\" + webix.uid(); // lets take the stored id can create a new dynamic one so our views don't duplicate\n let popUpComp = pageClone.component();\n let ui = popUpComp.ui();\n\n // Listen 'saved' event of the form widget\n const saveViews =\n pageClone.views(\n (v) =>\n v instanceof ABViewFormButton ||\n v instanceof ABViewPDFImporter,\n true\n ) ?? [];\n\n saveViews.forEach((view) => {\n const v =\n view instanceof ABViewFormButton ? view.parent : view;\n v.on(\"saved\", (savedData) => {\n _logic?.callbacks?.onSaveData(savedData);\n // ? is there ever a case where we want to keep an add popup open after saving?\n // ! setting this to always close\n\n if ($$(ids.popup)) {\n $$(ids.popup).close();\n } else {\n var popup = this.getTopParentView();\n popup.close();\n }\n });\n });\n\n let popupTemplate = {\n view: \"window\",\n id: ids.popup,\n modal: true,\n position: \"center\",\n // position:function(stthis.__addPageToolate){\n // \tstate.left = x + 20this.__addPageTool; // offset the popups\n // \tstate.top = y + 20;this.__addPageTool\n // },\n resize: true,\n width: parseInt(this.settings.popupWidth) || 700,\n height: parseInt(this.settings.popupHeight) + 44 || 450,\n css: \"ab-main-container\",\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n view: \"label\",\n label: page.label,\n css: \"modal_title\",\n align: \"center\",\n },\n {\n view: \"button\",\n label: L(\"Close\"),\n autowidth: true,\n align: \"center\",\n click: function () {\n var popup = this.getTopParentView();\n popup.close();\n },\n },\n ],\n },\n body: {\n view: \"scrollview\",\n scroll: true,\n body: ui,\n },\n };\n\n // Create popup\n webix.ui(popupTemplate).show();\n\n // Initial UI components\n const accessLevel = 3; // TODO: Is it correct\n popUpComp.init(this._application.AB, accessLevel, {\n onSaveData: _logic.callbacks.onSaveData,\n onCancelClick: _logic.callbacks.onCancel,\n clearOnLoad: _logic.callbacks.clearOnLoad,\n onClearOnLoad: _logic.callbacks.onClearOnLoad,\n });\n\n popUpComp.onShow();\n\n setTimeout(async () => {\n _logic.setDefaultValue(dc, pageClone);\n\n resolve();\n }, 100);\n });\n },\n\n setDefaultValue: (dc, page) => {\n if (!dc) return;\n\n let obj = dc.datasource;\n if (!obj) return;\n\n let linkedData = dc.getCursor();\n if (!linkedData) return;\n\n page.views().forEach((v) => {\n if (!v || v.key != \"form\") return;\n\n v.views().forEach((fView) => {\n if (fView.key != \"connect\" || fView.settings == null) return;\n\n let field = fView.field();\n if (field == null) return;\n\n let objLink = field.datasourceLink;\n if (objLink == null || objLink.id != obj.id) return;\n\n let data = {};\n let relationName = field.relationName();\n data[relationName] = {\n id: linkedData.id,\n };\n\n // Add custom index values\n let indexes = obj.indexes() || [];\n indexes.forEach((idx) => {\n (idx.fields || []).forEach((f) => {\n data[relationName][f.columnName] =\n linkedData[f.columnName];\n });\n });\n\n // Set label of selected item\n if (linkedData.text) {\n data[relationName].text = linkedData.text;\n data[relationName].value = data[relationName].text;\n } else {\n let rawData = {};\n rawData[relationName] = linkedData;\n data[relationName].text = field.format(rawData);\n data[relationName].value = data[relationName].text;\n }\n\n let comp = v.viewComponents[fView.id];\n if (!comp) return;\n\n const ui = typeof comp.ui == \"function\" ? comp.ui() : comp.ui;\n const inputId = ui?.inputId || ui?.rows?.[0]?.inputId;\n\n if (inputId) field.setValue($$(inputId), data);\n });\n });\n },\n };\n\n let init = (options) => {\n for (let c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n if (ui) {\n for (let c in options) {\n ui.on[c] = options[c];\n }\n }\n };\n\n return {\n ui: ui,\n init: init,\n\n applicationLoad: _logic.applicationLoad,\n onClick: _logic.onClick,\n openFormPopup: _logic.openFormPopup,\n };\n }\n}\n","import ABViewPropertyAddPage from \"./ABViewPropertyAddPage\";\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nexport default class ABViewPropertyEditPage extends ABViewPropertyAddPage {\n /**\n * @property default\n * return default settings\n *\n * @return {Object}\n */\n static get default() {\n return {\n editForm: \"none\", // The url pointer of ABViewForm\n };\n }\n\n static propertyComponent(App, idBase) {\n let ids = {\n formEdit: `${idBase}_editForm`,\n };\n\n let ui = {\n id: ids.formEdit,\n name: \"editForm\",\n view: \"richselect\",\n label: L(\"Edit Form\"),\n labelWidth: this.AB.UISettings.config().labelWidthXLarge,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal == L(\"No add new option\")) {\n $$(ids.formEdit).setValue(\"\");\n }\n\n _logic.callbacks.onSave();\n },\n },\n };\n\n let _init = (options) => {\n for (let c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n };\n\n let _logic = {\n callbacks: {\n onSave: function () {\n console.warn(\"NO onSave()!\");\n },\n clearOnLoad: () => {\n return false; // always false, we're trying to edit data\n },\n },\n\n setSettings: (view, settings = {}) => {\n if (view == null) return;\n settings.clearOnLoad = false; // doesn't work\n\n // Set the options of the possible edit forms\n let editForms = [\n {\n id: \"none\",\n\n value: L(\"No add new option\"),\n },\n ];\n\n (view.pageRoot().pages(() => true, true) || []).forEach((p) => {\n if (!p) return;\n\n p.views(() => true, true).forEach((v) => {\n if (\n v &&\n v.key == \"form\" &&\n v.datacollection &&\n v.datacollection.datasource &&\n v.datacollection.datasource.id ==\n view.field().settings.linkObject\n ) {\n editForms.push({\n id: v.urlPointer(),\n value: `${p.label} - ${v.label}`,\n });\n }\n });\n });\n\n let $selector = $$(ids.formEdit);\n if ($selector) {\n $selector.define(\"options\", editForms);\n $selector.define(\n \"value\",\n settings.editForm || this.default.editForm\n );\n $selector.refresh();\n }\n },\n\n getSettings: (view) => {\n let settings = view.settings || {};\n\n let $selector = $$(ids.formEdit);\n let $selectPopup = $selector.getPopup();\n let selectedItem = ($selectPopup.config.body.data || []).filter(\n (opt) => opt.id == $selector.getValue()\n )[0];\n if (selectedItem) {\n settings.editForm = selectedItem.id; // The url pointer of ABViewForm\n }\n\n return settings;\n },\n };\n\n return {\n ui: ui,\n init: _init,\n setSettings: _logic.setSettings,\n getSettings: _logic.getSettings,\n };\n }\n\n fromSettings(settings = {}) {\n this.settings = this.settings || {};\n this.settings.editForm =\n settings.editForm || this.constructor.default.editForm;\n }\n\n component(App, idBase) {\n // Overwrite the popup-lookup function\n function getIds(idBase, App) {\n return {\n popup: App._App.unique(`${idBase}_popup_edit_form`),\n field: idBase.split(\"_\")[1],\n };\n }\n this.getIds = getIds;\n\n // call to addpage\n let comp = super.component(App, idBase);\n\n comp.onClick = () => {\n if (\n !this._application ||\n !this.settings.editForm ||\n this.settings.editForm == this.constructor.default.editForm\n )\n return Promise.resolve();\n\n let form = this._application.urlResolve(this.settings.editForm);\n if (!form) return Promise.resolve();\n\n let page = form.pageParent();\n if (!page) return Promise.resolve();\n\n return comp.openFormPopup(page);\n };\n\n return comp;\n }\n}\n","/*\n * ABViewPropertyFilterData\n * This is a displayable ui component that will manage displaying a\n * means of searching for the user.\n *\n * This component will emit: \"filter.data\" when one of the filter options\n * have been enabled.\n * \"filter.data\" has 2 parameters: fnFilter, filterRules\n * fnFilter {function} when passed a row of data from the grid,\n * return true/false if it passes the filter.\n * filterRules {array} of each of the filter rules that have been\n * created. Note: the fnFilter still checks the validity\n * of the row based on these rules.\n * (this is used for the parent component to indicate how\n * many rules are currently applied to the data being displayed)\n */\nconst ABMLClass = require(\"../../ABMLClass\");\nimport ABViewProperty from \"./ABViewProperty\";\nimport ABViewComponent from \"../viewComponent/ABViewComponent\";\n\n// const ABViewGridFilterRule = require(\"../../../rules/ABViewGridFilterRule\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nclass FilterRuleSettings extends ABMLClass {\n constructor() {\n super([\"label\"], AB);\n }\n\n fromSettings(settings) {\n super.fromValues(settings);\n this.filters = settings.filters;\n }\n\n toSettings() {\n let obj = super.toObj();\n obj.filters = this.filters;\n return obj;\n }\n}\n\nclass ABViewPropertyFilterDataComponent extends ABViewComponent {\n constructor(viewPropertyFilterData, idBase) {\n var base = idBase || viewPropertyFilterData.idBase;\n super(base, {});\n }\n}\n\nexport default class ABViewPropertyFilterData extends ABViewProperty {\n constructor(AB, idBase) {\n super(idBase, {\n buttonAddfilter: \"\",\n filterPanel: \"\",\n globalFilterFormContainer: \"\",\n globalFilterForm: \"\",\n filterMenutoolbar: \"\",\n resetFilterButton: \"\",\n });\n\n this.AB = AB;\n this.idBase = idBase;\n this.object = null;\n // this.queryRules = [];\n\n this.__externalSearchText = null;\n // {string}\n // External sources of text filters are stored here. This is most likely\n // from the global search toolbar entry.\n this.rowFilter = this.AB.filterComplexNew(`${this.ids.component}_filter`);\n // {RowFilter}\n // When .userFilterPosition == \"toolbar\" we use this RowFilter to\n // display a form in a popup where the toolbar button is.\n\n this.rowFilterForm = this.AB.filterComplexNew(\n `${this.ids.component}_filter_form`\n );\n // {RowFilter}\n // When .userFilterPosition == \"form\" we use this RowFilter to\n // display a form under the toolbar.\n\n this._handler_rowFilterChanged = (value) => {\n let filterRules = value.rules || [];\n\n // if ($$(ids.buttonFilter)) {\n // $$(ids.buttonFilter).define('badge', filterRules.length || null);\n // $$(ids.buttonFilter).refresh();\n // }\n\n // be notified when there is a change in the filter\n this.triggerCallback((rowData) => {\n return this.rowFilter.isValid(rowData);\n }, filterRules);\n };\n\n this._handler_rowFilterFormChanged = () => {\n this.triggerCallback();\n };\n\n this.initialized = false;\n // {bool}\n // make sure this is not .init() more than once\n }\n\n /**\n * @property default\n * return default settings\n *\n * @return {Object}\n */\n static get default() {\n return {\n filterOption: 1,\n // {integer}\n // 0 - Not allow\n // 1 - Enable user filter\n // 2 - Predefined filter menu\n // 3 - Global filter input\n\n // filterOptions == 1 options\n userFilterPosition: \"toolbar\",\n // {string} the location of the filter:\n // \"toolbar\" : there will be an \"Add Filters\" button on\n // the toolbar that will trigger the form popup\n // \"form\" : there will be a button under the toolbar that\n // will bring up the form popup.\n\n isGlobalToolbar: 1,\n // {boolean|truthy}\n // when \"toolbar\" is chosen for userFilterPosition, this setting\n // allows us to also include the search criteria specified in\n // the search box on the toolbar.\n\n // filterOptions == 2 options\n // predefined filters created by the builders. There will be\n // an area under the toolbar that displays buttons to choose\n // between one of the predefined queryRules.\n // queryRules: [], // An array of ABViewGridFilterRule object\n\n // filterOptions == 3 options\n // globalFilterPosition: \"default\",\n // {string} [ \"default\", \"single\" ]\n // \"default\" : shows default grid with all potential matches\n // \"single\" : grid only shows when it has a match. only 1\n // match is shown. ( is this true?? )\n };\n }\n\n /**\n * @method fromSettings\n * Create an initial set of default values based upon our settings object.\n * @param {obj} settings The settings object we created in .toSettings()\n */\n fromSettings(settings) {\n settings = settings || {};\n\n settings.filterOption =\n typeof settings.filterOption != \"undefined\"\n ? settings.filterOption\n : ABViewPropertyFilterData.default.filterOption;\n\n settings.isGlobalToolbar =\n typeof settings.isGlobalToolbar != \"undefined\"\n ? settings.isGlobalToolbar\n : ABViewPropertyFilterData.default.isGlobalToolbar;\n\n this.settings = settings;\n }\n\n /**\n * @method objectLoad\n * A rule is based upon a Form that was working with an Object.\n * .objectLoad() is how we specify which object we are working with.\n *\n * @param {ABObject} The object that will be used to evaluate the Rules\n */\n objectLoad(object) {\n this.object = object;\n\n if (this.rowFilter) {\n // this.rowFilter.applicationLoad(object.application);\n this.rowFilter.fieldsLoad(object.fields());\n }\n\n if (this.rowFilterForm) {\n // this.rowFilterForm.applicationLoad(object.application);\n this.rowFilterForm.fieldsLoad(object.fields());\n }\n }\n\n viewLoad(view) {\n this.view = view;\n }\n\n /** == UI == */\n ui() {\n var self = this;\n var ids = this.ids;\n\n return {\n id: ids.filterPanel,\n type: \"space\",\n borderless: true,\n padding: 0,\n hidden: true,\n rows: [\n {\n id: ids.globalFilterFormContainer,\n hidden: true,\n cols: [\n {\n id: ids.globalFilterForm,\n view: \"text\",\n placeholder: L(\"Search or scan a barcode to see results\"),\n on: {\n onTimedKeyPress: () => {\n this.triggerCallback();\n },\n },\n },\n {\n view: \"button\",\n css: \"webix_primary\",\n width: 28,\n type: \"icon\",\n icon: \"fa fa-times\",\n click: function () {\n var $form = $$(ids.globalFilterForm);\n $form.setValue(\"\");\n $form.focus();\n $form.callEvent(\"onTimedKeyPress\");\n },\n },\n ],\n },\n {\n id: ids.buttonAddfilter,\n view: \"button\",\n css: \"webix_primary\",\n value: L(\"Add Filter\"),\n click: () => {\n this.rowFilterForm.popUp($$(ids.buttonAddfilter).getNode(), {\n pos: \"bottom\",\n });\n },\n },\n {\n view: \"toolbar\",\n id: ids.filterMenutoolbar,\n css: \"ab-data-toolbar\",\n hidden: true,\n cols: [\n {\n view: \"button\",\n css: \"webix_primary\",\n id: ids.resetFilterButton,\n label: L(\"Reset Filter\"),\n icon: \"fa fa-ban\",\n type: \"icon\",\n // badge: 0,\n autowidth: true,\n click: function () {\n self.resetFilter();\n },\n },\n ],\n },\n ],\n };\n }\n\n async init(AB) {\n if (AB) {\n this.AB = AB;\n }\n\n var ids = this.ids;\n // this.filter_popup = webix.ui({\n // view: \"popup\",\n // id: ids.component,\n // width: 600,\n // height: 400,\n // hidden: true,\n // body: this.rowFilter.ui,\n // });\n\n this.rowFilter.init();\n this.rowFilter.removeListener(\"changed\", this._handler_rowFilterChanged);\n this.rowFilter.on(\"changed\", this._handler_rowFilterChanged);\n\n this.rowFilterForm.init();\n this.rowFilterForm.removeListener(\n \"changed\",\n this._handler_rowFilterFormChanged\n );\n this.rowFilterForm.on(\"changed\", this._handler_rowFilterFormChanged);\n this.rowFilterForm.removeListener(\n \"save\",\n this._handler_rowFilterFormChanged\n );\n this.rowFilterForm.on(\"save\", this._handler_rowFilterFormChanged);\n\n $$(ids.filterPanel)?.hide();\n $$(ids.buttonAddfilter)?.hide();\n $$(ids.filterMenutoolbar)?.hide();\n $$(ids.globalFilterFormContainer)?.hide();\n\n switch (this.settings.filterOption) {\n case 0:\n break;\n case 1:\n switch (this.settings.userFilterPosition) {\n case \"form\":\n $$(ids.buttonAddfilter)?.show();\n $$(ids.filterPanel)?.show();\n break;\n case \"toolbar\":\n $$(ids.filterPanel)?.hide();\n break;\n }\n break;\n case 2:\n $$(ids.filterPanel)?.show();\n var $filterMenutoolbar = $$(ids.filterMenutoolbar);\n if ($filterMenutoolbar) {\n $filterMenutoolbar.show();\n\n // populate filter items\n if (this.settings?.queryRules) {\n (this.settings.queryRules || []).forEach((qr) => {\n let Rule = new FilterRuleSettings();\n Rule.fromSettings(qr);\n var filterRuleButton = {\n view: \"button\",\n css: \"webix_primary\",\n label: Rule.label,\n icon: \"fa fa-filter\",\n type: \"icon\",\n // badge: 0,\n autowidth: true,\n click: () => {\n this.emit(\"filter.data\", null, Rule.filters);\n // this.selectFilter(qr.filter);\n },\n };\n $filterMenutoolbar.addView(filterRuleButton);\n });\n }\n }\n break;\n case 3:\n $$(ids.globalFilterFormContainer)?.show();\n $$(ids.filterPanel)?.show();\n break;\n }\n }\n\n filterRules() {\n let rowFilterRules = null;\n\n switch (this.settings.userFilterPosition) {\n case \"form\":\n rowFilterRules = this.rowFilterForm.getValue();\n break;\n case \"toolbar\":\n rowFilterRules = this.rowFilter.getValue();\n break;\n }\n\n return rowFilterRules;\n }\n\n /**\n * @method getFilter()\n * Return a fn() that returns {truthy} with a given row of\n * data.\n */\n getFilter() {\n // default filter\n if (this.__currentFilter == null) {\n // if empty search text in global single mode, then no display rows\n if (\n this.settings.filterOption == 3 &&\n this.settings.globalFilterPosition == \"single\"\n )\n this.__currentFilter = (/* row */) => {\n return false;\n };\n // always true, show every rows\n else\n this.__currentFilter = (/* row */) => {\n return true;\n };\n }\n\n return this.__currentFilter;\n }\n\n /**\n * @method triggerCallback()\n * We compile our current search options and emit them back to our\n * parent container.\n */\n triggerCallback(/*fnFilter, filterRules*/) {\n let searchRules = this.searchText(this.__externalSearchText);\n let rowFilterRules = this.filterRules();\n\n let badgeCount = 0;\n if (rowFilterRules?.rules?.length) {\n badgeCount = rowFilterRules?.rules?.length;\n if (searchRules) {\n badgeCount++;\n rowFilterRules = {\n glue: \"and\",\n rules: [rowFilterRules, searchRules],\n };\n }\n } else {\n rowFilterRules = searchRules;\n }\n\n this.emit(\"filter.data\", null, rowFilterRules);\n\n if (badgeCount == 0) badgeCount = false;\n const $button = $$(this.ids.buttonAddfilter);\n if ($button) {\n $button.config.badge = badgeCount;\n $button.refresh();\n }\n }\n\n resetFilter() {\n this.triggerCallback(() => true, []);\n }\n\n /**\n * @method externalSearchText()\n * Save any search criteria established from outside this filterHelper.\n * NOTE: The ABViewGrid has a toolbar search entry that will provide\n * this value.\n * @param {string} search\n * The typed in search criteria.\n */\n externalSearchText(search = null) {\n this.__externalSearchText = search;\n this.triggerCallback(); // update each time\n }\n\n /**\n * @method searchText()\n * Retrieve the typed in search terms from the user, and convert them\n * into a set of Rules that will modify our results.\n * If an external search param is provided, use that instead.\n * @param {string} externalText\n * @return {json} The QB Rule condition for the search criteria\n */\n searchText(externalText) {\n var search;\n if (externalText) {\n search = externalText;\n } else {\n search = ($$(this.ids.globalFilterForm)?.getValue() ?? \"\").trim();\n }\n if (!search) return null; // <-- includes \"\"\n\n // find the individual \"terms\" that we should search for\n let terms = search.trim().toLowerCase().split(\" \");\n\n // build a set of conditions for each term\n var allTerms = [];\n\n var allFields = this.object?.fields() || [];\n\n terms.forEach((t) => {\n var fieldTerms = [];\n\n // for each field, add a match condition for that field\n // (if the field applies)\n allFields.forEach((f) => {\n if (f.fieldIsFilterable()) {\n switch (f.key) {\n case \"number\":\n case \"string\":\n case \"LongText\":\n case \"email\":\n fieldTerms.push({\n key: f.id,\n rule: \"contains\",\n value: t,\n });\n break;\n\n case \"list\":\n var options = f.options();\n options.forEach((o) => {\n if (o.text.indexOf(t) > -1) {\n fieldTerms.push({\n key: f.id,\n rule: \"equals\",\n value: o.id,\n });\n }\n });\n break;\n }\n }\n });\n\n if (fieldTerms.length > 0) {\n allTerms.push({\n glue: \"or\",\n rules: fieldTerms,\n });\n }\n });\n\n if (allTerms.length > 0) {\n var searchRules = {\n glue: \"and\",\n rules: allTerms,\n };\n return searchRules;\n } else {\n return null;\n }\n }\n\n showPopup($view) {\n // this.filter_popup.show($view, null, { pos: \"top\" });\n this.rowFilter.popUp($view, null, { pos: \"center\" });\n }\n}\n","import ABViewProperty from \"./ABViewProperty\";\nimport ABViewComponent from \"../viewComponent/ABViewComponent\";\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nclass ABViewPropertyLinkPageComponent extends ABViewComponent {\n constructor(linkPageHelper, idBase) {\n let base = idBase || `ABViewPropertyLinkPage_xxx`;\n super(base, {});\n\n this.linkPageHelper = linkPageHelper;\n this.AB = linkPageHelper.AB;\n\n this.view = null;\n // {ABViewXXXX}\n // the ABView object this link references.\n\n this.datacollection = null;\n // {ABDataCollection}\n // The related Datacollection to this view that drives it's data.\n // we usually have to set the cursor before the view displays the\n // appropriate data.\n }\n\n ui() {\n return {};\n }\n\n init(options) {\n if (options.view) this.view = options.view;\n\n if (options.datacollection) this.datacollection = options.datacollection;\n }\n\n changePage(pageId, rowId) {\n if (this.datacollection) {\n this.datacollection.once(\"changeCursor\", () => {\n this.view?.changePage(pageId);\n });\n this.datacollection.setCursor(rowId);\n } else {\n this.view?.changePage(pageId);\n }\n }\n}\n\nexport default class ABViewPropertyLinkPage extends ABViewProperty {\n // constructor() {\n // super();\n // }\n\n /** == UI == */\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n component(v1App = false) {\n let component = new ABViewPropertyLinkPageComponent(this);\n\n // if this is our v1Interface\n if (v1App) {\n var newComponent = component;\n component = {\n ui: newComponent.ui(),\n init: (...params) => {\n return newComponent.init(...params);\n },\n onShow: (...params) => {\n return newComponent.onShow?.(...params);\n },\n changePage: (...params) => {\n return newComponent.changePage(...params);\n },\n };\n }\n\n return component;\n }\n}\n","//\n// ABViewQueryBuilderObjectFieldConditions\n//\n// A UI component that is responsible for displaying a QueryBuilder based upon\n// the fields of a given ABObject.\n//\n// This object is also responsible for saving it's state to a settings value,\n// and generating the settings value to be saved.\n\nmodule.exports = class ABViewQueryBuilderObjectFieldConditions {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(label) {\n this.label = label;\n this.ui = null;\n }\n\n /**\n * cleanRules\n * walk through all the QueryBuilder (QB) rules and make conversions\n * of the data into their proper formats.\n * @param {obj} rules the {rules} obj that is returned from the QB object\n * @param {array} fields an array of field definitions from the QB object\n * @param {bool} dateToString convert Dates to String format?\n */\n cleanRules(rules, fields, dateToString) {\n if (typeof dateToString == \"undefined\") dateToString = true;\n\n // walk the given condition rules / values, walk them and make sure\n // any given rules have properly formatted values.\n function processCondition(rule) {\n // make sure rule is provided\n if (rule) {\n if (rule.glue && rule.rules) {\n rule.rules.forEach((r) => {\n processCondition(r);\n });\n } else {\n // converting a single rule:\n\n var field = fields.filter((f) => {\n return f.id == rule.key;\n })[0];\n if (field) {\n switch (field.type) {\n case \"number\":\n case \"formula\":\n // when getting data from the server, the numbers are\n // sent back as strings (\"100.25\").\n // make sure to convert strings to numbers:\n if (typeof rule.value == \"string\") {\n if (rule.value.indexOf(\".\") == -1) {\n rule.value = parseInt(rule.value);\n } else {\n rule.value = parseFloat(rule.value);\n }\n }\n break;\n case \"date\":\n // in some cases we want to convert the Date() object returned\n // by QueryBuilder into a string for saving on the Server.\n if (dateToString) {\n // if we have a Date() obj returned from QueryBuilder,\n // convert to a string format:\n if (rule.value instanceof Date) {\n rule.value = webix.i18n.dateFormatStr(rule.value);\n }\n } else {\n // in other cases we want to convert the string returned\n // by the server into a Date() for the QB\n if (typeof rule.value == \"string\") {\n rule.value = new Date(rule.value);\n }\n }\n\n break;\n }\n }\n }\n }\n }\n processCondition(rules);\n }\n\n // component\n // initialize the UI display for this popup editor.\n component(App, idBase) {\n this.App = App;\n this.idBase = idBase;\n\n var L = App.Label;\n\n var uniqueInstanceID = webix.uid();\n var myUnique = (key) => {\n // return this.unique(idBase + key ) + '_' + uniqueInstanceID;\n return `${idBase}_${key}_${uniqueInstanceID}`;\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = (this.ids = {\n component: myUnique(\"qbObjectFieldConditions\"),\n queryBuilder: myUnique(\"qBuilder\"),\n queryBuilderContainer: myUnique(\"qBuilderContainer\"),\n queryBuilderLayout: myUnique(\"qBuilderLayout\"),\n showQBButton: myUnique(\"showQBButton\"),\n });\n\n // webix UI definition:\n this.ui = {\n view: \"layout\",\n id: ids.queryBuilderLayout,\n hidden: true,\n type: \"line\",\n rows: [\n {\n id: ids.showQBButton,\n cols: [\n { fillspace: true },\n {\n view: \"button\",\n css: \"webix_primary\",\n name: \"addqb\",\n value: L(\"Add Custom Conditions\"),\n autowidth: true,\n click: function () {\n $$(ids.queryBuilderContainer).show();\n $$(ids.showQBButton).hide();\n // _logic.buttonCancel();\n },\n },\n { fillspace: true },\n ],\n },\n {\n hidden: true,\n id: ids.queryBuilderContainer,\n cols: [\n {\n view: \"querybuilder\",\n id: ids.queryBuilder,\n fields: this.conditionFields(),\n },\n ],\n },\n ],\n };\n\n // tack on a label if provided.\n if (this.label) {\n this.ui.rows[1].cols.unshift({\n view: \"label\",\n css: \"ab-text-bold\",\n label: this.label,\n width: this.AB.UISettings.config().labelWidthLarge,\n });\n }\n\n // for setting up UI\n this.init = (options) => {\n options = options || {};\n\n // register callbacks:\n for (var c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n };\n\n // internal business logic\n var _logic = (this._logic = {\n callbacks: {\n onCancel: function () {\n console.warn(\"NO onCancel()!\");\n },\n onSave: function (field) {\n console.warn(\"NO onSave()!\");\n },\n },\n\n /**\n * cleanRules\n * walk through all the QueryBuilder (QB) rules and make conversions\n * of the data into their proper formats.\n * @param {obj} rules the {rules} obj that is returned from the QB object\n * @param {array} fields an array of field definitions from the QB object\n * @param {bool} dateToString convert Dates to String format?\n */\n cleanRules: (rules, fields, dateToString) => {\n this.cleanRules(rules, fields, dateToString);\n },\n\n getValue: () => {\n var values = null;\n var QB = $$(ids.queryBuilder);\n if (QB) {\n values = QB.getValue();\n }\n\n // convert dates to simpler format:\n // by default we're getting long values: \"Mon Feb 2, 2018 GMT xxxxxxx\",\n // and webix doesn't seem to understand them when we send them back.\n // so save simple date values: \"mm/dd/yyyy\"\n if (values) {\n _logic.cleanRules(values[0], values[1], true);\n }\n\n return values;\n },\n\n setValue: (values) => {\n values = values || [];\n if (!Array.isArray(values)) values = [values];\n if (values.length == 0) {\n values.push({});\n } // push default rules\n if (values.length < 2) {\n values.push(this.conditionFields());\n }\n\n // convert dates from our server side \"string\" format into\n // Date() objects.\n _logic.cleanRules(values[0], values[1], false);\n\n var QB = $$(ids.queryBuilder);\n if (QB) {\n if (values[0] && values[0].rules && values[0].rules.length) {\n QB.setValue(values[0]);\n $$(ids.queryBuilderContainer).show();\n $$(ids.showQBButton).hide();\n }\n }\n },\n });\n\n this.getValue = _logic.getValue;\n this.show = _logic.show;\n this.setValue = _logic.setValue;\n }\n\n objectLoad(object) {\n this.currentObject = object;\n }\n\n // conditionFields()\n // Return the list of fields we are able to update.\n // @return {array} of querybuilder field definitions:\n //\t\t\t\t\t[\n // \t\t\t\t\t\t{ id:\"fname\", value:\"First Name\", type:\"string\" },\n //\t\t\t\t\t { id:\"lname\", value:\"Last Name\", type:\"string\" },\n //\t\t\t\t\t { id:\"age\", value:\"Age\", type:\"number\" },\n //\t\t\t\t\t { id:\"bdate\", value:\"Birth Date\", type:\"date\" }\n //\t\t\t\t\t]\n conditionFields() {\n var fieldTypes = [\n \"string\",\n \"LongText\",\n \"number\",\n \"date\",\n \"email\",\n \"formula\",\n \"calculate\",\n ];\n\n var currFields = [];\n\n if (this.currentObject) {\n this.currentObject.fields().forEach((f) => {\n if (fieldTypes.indexOf(f.key) != -1) {\n // NOTE: the .id value must match the obj[.id] in the data set\n // so if your object data looks like:\n // \t{\n //\t\tname_first:'Neo',\n //\t\tname_last: 'The One'\n // },\n // then the ids should be:\n // { id:'name_first', value:'xxx', type:'string' }\n\n let type = f.key;\n if (f.key == \"formula\" || f.key == \"calculate\") type = \"number\";\n else if (f.key == \"LongText\") type = \"string\";\n\n currFields.push({\n id: f.columnName,\n value: f.label,\n type: type,\n });\n }\n });\n }\n\n return currFields;\n }\n\n // process\n // Take the provided data and process each of our rules.\n // @param {obj} options\n // @return {promise}\n process(options) {\n return new Promise((resolve, reject) => {\n var numDone = 0;\n var onDone = () => {\n numDone++;\n if (numDone >= this.listRules.length) {\n resolve();\n }\n };\n\n this.listRules.forEach((rule) => {\n rule\n .process(options)\n .then(function () {\n onDone();\n })\n .catch((err) => {\n reject(err);\n });\n });\n\n if (this.listRules.length == 0) {\n resolve();\n }\n });\n }\n\n showQueryBuilderContainer() {\n $$(this.ids.queryBuilderLayout).show();\n $$(this.ids.queryBuilderContainer).show();\n $$(this.ids.showQBButton).hide();\n }\n\n // // fromSettings\n // // Create an initial set of default values based upon our settings object.\n // // @param {obj} settings The settings object we created in .toSettings()\n // fromSettings (settings) {\n // \t// settings: [\n // \t// { rule.settings },\n // \t// { rule.settings }\n // \t// ]\n\n // \t// clear any existing Rules:\n // \tthis.listRules.forEach((rule)=>{\n // \t\t$$(this.ids.rules).removeView(rule.ids.component);\n // \t})\n // \tthis.listRules = [];\n\n // \tif (settings) {\n // \t\tsettings.forEach((ruleSettings)=>{\n // \t\t\tthis.addRule(ruleSettings);\n // \t\t})\n // \t}\n // }\n\n // // toSettings\n // // create a settings object to be persisted with the application.\n // // @return {array} of rule settings.\n // toSettings () {\n // \tvar settings = [];\n // \tthis.listRules.forEach((r)=>{\n // \t\tsettings.push(r.toSettings());\n // \t})\n // \treturn settings;\n // }\n};\n","//\n// ABViewRule\n//\n// A component that manages an individual Rule in a Rule list.\n//\n// Each rule can manage a set of given Actions. For each Rule, one Action\n// can be chosen, A condition for when that action is executed, and then\n// inputs for any additional data required by that action.\n//\n// Rules are used in the Interface Builder to present the designer an interface\n// for defining the Action+Condition:\n//\n//\n//\n// In live apps, Rules are used when processing events and determining if an\n// action is to be performed:\n//\n//\n//\n// A Rule needs to save it's current state to an objects settings, and to\n// initialize itself from those settings.\n//\nconst ObjectQueryBuilder = require(\"./ABViewQueryBuilderObjectFieldConditions\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRule {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(listActions) {\n this.listActions = listActions || []; // the list of Actions this Rule manages\n\n this.actionDropList = []; // the Webix UI droplist\n this.listActions.forEach((a) => {\n this.actionDropList.push({ id: a.key, value: a.label });\n });\n\n this.selectedAction = null; // the currently selected Action.key\n if (this.actionDropList.length > 0) {\n this.selectedAction = this.actionDropList[0].id;\n }\n\n this.removable = true; // can I delete this rule?\n\n this.currentObject = null; // What ABObject is this associated with\n // NOTE: this is important for Actions.\n\n this.objectQB = null; // The QueryBuilder (QB) object\n\n this.currentForm = null;\n }\n\n component(App, idBase) {\n this.App = App;\n this.idBase = idBase;\n\n // this is different because multiple instances of this View can be displayed\n // at the same time. So make each instance Unique:\n var uniqueInstanceID = webix.uid();\n var myUnique = (key) => {\n // return this.unique(idBase + key ) + '_' + uniqueInstanceID;\n return `${idBase}_${key}_${uniqueInstanceID}`;\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = (this.ids = {\n // each instance must be unique\n component: myUnique(\"component\"),\n\n selectAction: myUnique(\"chooseAction\"),\n\n queryBuilder: myUnique(\"queryBuilder\"),\n\n valueDisplay: myUnique(\"valueArea\"),\n });\n\n this.objectQB.label = L(\"When\");\n this.objectQB.component(this.App, this.idBase);\n this.ui = this._generateUI();\n\n // for setting up UI\n this.init = (options) => {\n // register callbacks:\n for (var c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n\n this.objectQB.init();\n\n // make sure the current Action's value display is initialized:\n var Action = this.currentAction();\n if (Action) {\n Action.component(this.App, this.idBase);\n var comp = Action.valueDisplay(ids.valueDisplay);\n\n _logic.replaceValueDisplay(comp);\n\n // webix.ui(comp.ui, $$(this.ids.valueDisplay));\n comp.init();\n }\n };\n\n // internal business logic\n var _logic = (this._logic = {\n callbacks: {\n onDelete: function () {\n console.warn(\"NO onDelete()!\");\n },\n onSave: function (field) {\n console.warn(\"NO onSave()!\");\n },\n },\n\n replaceValueDisplay: (component) => {\n // remove current content area:\n var $ValueDisplay = $$(this.ids.valueDisplay);\n if (!$ValueDisplay) return;\n\n var children = $ValueDisplay.getChildViews();\n var cloneChildren = [];\n children.forEach((c) => {\n cloneChildren.push(c);\n });\n cloneChildren.forEach((c) => {\n $ValueDisplay.removeView(c);\n });\n\n $ValueDisplay.addView(component.ui);\n },\n\n selectAction: (newValue, oldVal) => {\n if (newValue) {\n $$(this.ids.component)\n .getChildViews()\n .forEach((views) => {\n views.show();\n });\n }\n // bonus: save current state of previous Action\n var prevAction = this.getAction(oldVal);\n if (prevAction) {\n prevAction.stashCondition(this.objectQB.getValue());\n }\n\n // now switch to the new Action\n this.selectedAction = newValue;\n var currAction = this.currentAction();\n if (currAction) {\n // reset Condition filters.\n this.objectQB.setValue(currAction.condition());\n\n // have Action display it's values form\n currAction.component(this.App, this.idBase);\n var component = currAction.valueDisplay(ids.valueDisplay);\n _logic.replaceValueDisplay(component);\n component.init();\n // currAction.valueDisplay(ids.valueDisplay);\n }\n },\n });\n }\n\n // not intended to be called externally\n _generateUI() {\n return {\n id: this.ids.component,\n view: \"layout\",\n css: \"ab-component-form-rules\",\n padding: 20,\n // margin: 10,\n\n // this should be a CSS setting: this.AB.Config.xxxx\n // width: 680,\n type: \"line\",\n rows: [\n {\n view: \"template\",\n css: \"ab-component-form-rules-delete\",\n template: '',\n height: 30,\n borderless: true,\n hidddatasourceen: this.removable == false,\n onClick: {\n \"ab-component-remove\": (e, id, trg) => {\n this._logic.callbacks.onDelete(this);\n },\n },\n },\n // Action\n {\n id: this.ids.selectAction,\n view: \"richselect\",\n label: L(\"Action\"),\n placeholder: L(\"Choose an action\"),\n labelWidth: this.AB.UISettings.config().labelWidthLarge,\n options: this.actionDropList,\n on: {\n onChange: (newVal, oldVal) => {\n this._logic.selectAction(newVal, oldVal);\n },\n },\n },\n\n // Values\n {\n for: \"values\",\n hidden: true,\n cells: [\n {\n view: \"layout\",\n cols: [\n {\n view: \"label\",\n label: L(\"Values\"),\n css: \"ab-text-bold\",\n width: this.AB.UISettings.config().labelWidthLarge,\n },\n {\n id: this.ids.valueDisplay,\n view: \"layout\",\n rows: [\n {\n label: L(\n \" ABViewRule: This should be the Set Area\"\n ),\n css: \"ab-text-bold\",\n height: 30,\n },\n ],\n },\n ],\n },\n ],\n },\n\n // When\n this.objectQB.ui,\n ],\n };\n }\n\n // return the QueryBuilder fields data for the currently selected Action.\n conditionFields() {\n var fields = [];\n\n var selectedAction = this.currentAction();\n if (selectedAction) {\n fields = selectedAction.conditionFields();\n }\n\n return fields;\n }\n\n currentAction() {\n return this.getAction(this.selectedAction);\n }\n\n getAction(key) {\n return this.listActions.filter((a) => {\n return a.key == key;\n })[0];\n }\n\n objectLoad(object) {\n this.currentObject = object;\n this.listActions.forEach((a) => {\n a.objectLoad(object);\n });\n\n var label = L(\"When\");\n\n this.objectQB = new ObjectQueryBuilder(label);\n this.objectQB.objectLoad(object);\n\n // regenerate our UI when a new object is loaded.\n if (this.ids) {\n this.ui = this._generateUI();\n }\n }\n\n formLoad(form) {\n this.currentForm = form;\n this.listActions.forEach((a) => {\n a.formLoad(form);\n });\n }\n\n processPre(options = {}) {\n let isValid = this.isValid(options.data);\n if (!isValid) return;\n\n let currentAction = this.currentAction();\n if (!currentAction) return;\n\n currentAction.processUpdateObject({}, options.data);\n }\n\n // process\n // Take the provided data and process this rule\n // @param {obj} options\n // @return {Promise}\n process(options) {\n var currentAction = this.currentAction();\n if (!currentAction) return Promise.resolve();\n\n let isValid = this.isValid(options.data);\n if (isValid) {\n return currentAction.process(options);\n } else {\n // else just resolve and continue on\n return new Promise((resolve, reject) => {\n resolve();\n });\n }\n }\n\n fromSettings(settings) {\n settings = settings || {};\n\n if (settings.selectedAction) {\n // store our Query Rules\n this.selectedAction = settings.selectedAction;\n var selectedAction = this.currentAction();\n if (!selectedAction) return;\n selectedAction.stashCondition(settings.queryRules || {});\n\n // if our UI components are present, populate them properly:\n if (this.ids) {\n // Trigger our UI to refresh with this selected Action:\n // NOTE: this also populates the QueryBuilder\n $$(this.ids.selectAction).setValue(this.selectedAction);\n // this._logic.selectAction(this.selectedAction);\n }\n\n // now continue with setting up our settings:\n selectedAction.fromSettings(settings.actionSettings);\n }\n }\n\n toSettings() {\n var settings = {};\n\n if (this.selectedAction) {\n settings.selectedAction = this.selectedAction;\n settings.queryRules = this.objectQB.getValue();\n let currentAction = this.currentAction();\n if (currentAction) {\n settings.actionSettings = currentAction.toSettings();\n }\n }\n\n return settings;\n }\n\n // NOTE: Querybuilder v5.2 has a bug where it won't display the [and/or]\n // choosers properly if it hasn't been shown before the .setValue() call.\n // so this work around allows us to refresh the display after the .show()\n // on the popup.\n // When they've fixed the bug, we'll remove this workaround:\n qbFixAfterShow() {\n var currAction = this.currentAction();\n if (currAction && this.objectQB) {\n this.objectQB.setValue(currAction.condition());\n currAction.qbFixAfterShow();\n }\n }\n\n /**\n * @method isReady()\n * returns a promise that gets resolved once our action is ready to work.\n * @return {Promise}\n */\n async isReady() {\n let currentAction = this.currentAction();\n if (currentAction) {\n return currentAction.isReady();\n }\n return Promise.resolve();\n }\n\n isValid(data = {}) {\n const fields = this.currentObject.fields(),\n currentAction = this.currentAction(),\n QBCondition = currentAction.condition(),\n query = QBCondition[0] ?? {};\n\n const convertToNumber = (text = \"\") => {\n // if we have multiple rules we need to check if value is already a number before converting.\n if (typeof text == \"number\") return text;\n\n return parseFloat(text.replace(/[^-0-9.]/g, \"\"));\n };\n\n // Fix string data in number type\n // NOTE: \"1000\" > \"99\" = false >_\n f.key == \"number\" || f.key == \"calculate\" || f.key == \"formula\"\n )\n .forEach((f) => {\n try {\n // filter conditions\n if (Array.isArray(query?.rules)) {\n query.rules.forEach((r) => {\n // NOTE: compatible with old settings\n if (r.key == f.id || r.key == f.columnName)\n r.value = convertToNumber(r.value);\n });\n }\n\n // row data\n if (\n data[f.columnName] &&\n typeof data[f.columnName] === \"string\"\n ) {\n data[f.columnName] = convertToNumber(data[f.columnName]);\n }\n } catch (e) {\n // continue regardless of error\n }\n });\n\n const hiddenFilter = (this.AB ?? AB).filterComplexNew(\n `${this.idBase}_filter_complex`\n );\n hiddenFilter.fieldsLoad(fields, this.currentObject);\n hiddenFilter.setValue(query);\n hiddenFilter.init();\n\n return hiddenFilter.isValid(data);\n\n // var id = \"hiddenQB_\" + webix.uid();\n\n // // if our data passes the QueryRules then tell Action to process\n // var ui = {\n // id: id,\n // hidden: true,\n // view: \"querybuilder\",\n // };\n // var hiddenQB = webix.ui(ui);\n\n // let currentAction = this.currentAction();\n // var QBCondition = currentAction.condition();\n\n // if (this.objectQB) {\n // this.objectQB.cleanRules(QBCondition[0], QBCondition[1], false);\n // }\n\n // let query = QBCondition[0] || {},\n // fields = QBCondition[1] || [];\n\n // // hiddenQB.setValue(QBCondition);\n // hiddenQB.setValue({\n // query: query,\n // fields: fields,\n // });\n\n // var QBHelper = hiddenQB.getFilterHelper();\n // var isValid = QBHelper(data);\n\n // hiddenQB.destructor(); // remove the QB\n\n // return isValid;\n }\n\n get isPreProcess() {\n let currentAction = this.currentAction();\n return currentAction.isPreProcess || false;\n }\n};\n","//\n// ABViewRuleAction\n//\n// A component that manages an individual Action in a Rule.\n//\n// Each Action is responsible for figuring out when it can run, and what to do.\n//\n// Actions are used in the Interface Builder to present the designer an interface\n// for defining the a Condition and a set of data necessary to complete the Action:\n//\n//\n//\n// In live apps, Actions are used when processing events and determining if an\n// if and what is to be performed:\n//\n//\n//\n// An Action needs to save it's current state to an objects settings, and to\n// initialize itself from those settings.\n//\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleAction {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n * @param {ABViewForm} currentForm\tthe current form this Action is associated with.\n */\n constructor(App, idBase, currentForm) {\n this.key = \"ABViewRuleAction\";\n\n this.queryObject = null; // the current ABObject we use to create QueryBuilder information.\n\n this.currentForm = null;\n\n this.queryRules = {}; // default set of rules for the Query Builder condition\n\n this.valueRules = {}; // the initial Value Rules for this Action\n // The Action Subclass defines what this {} is.\n\n this.currentForm = currentForm; // the ABViewForm object that this rule Action is tied to.\n }\n\n component(App, idBase) {\n this.App = App;\n this.idBase = idBase;\n\n this.label = L(\"generic abviewruleaction\");\n\n function myUnique(key) {\n return App.unique(`${idBase}_${key}`);\n }\n\n // internal list of Webix IDs to reference our UI components.\n var ids = (this.ids = {\n // each instance must be unique\n component: `${myUnique(\"component\")}_${webix.uid()}`,\n });\n\n this._ui = null; // internally track our UI Component value Rules\n\n // for setting up UI\n this.init = (options) => {\n // register callbacks:\n for (var c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n };\n\n // internal business logic\n var _logic = (this._logic = {\n callbacks: {\n onDelete: function () {\n console.warn(\"NO onDelete()!\");\n },\n onSave: function (field) {\n console.warn(\"NO onSave()!\");\n },\n },\n });\n }\n\n // condition\n // Return the querybuilder setup structure for this Action.\n // @return {array} of querybuilder setup\n //\t\t\t\t\t[\n //\t\t\t\t\t\t{rules},\n //\t\t\t\t\t\t[fields]\n //\t\t\t\t\t]\n condition() {\n return [this.conditionRules(), this.conditionFields()];\n }\n\n // stashCondition\n // capture the current set of rules provided by the QB object.\n // This doesn't guarantee these will be saved to the App settings.\n // Instead it is a temporary stash. Only the selected Action's\n // values will be persisited to the App settings.\n // @param {obj/Array} rules The QueryBuilder rule value returned from\n //\t\t\t\t\t\t\t .getValue()\n //\t\t\t\t\t\t\t note: it is the first entry .getValue()[0]\n //\n stashCondition(rules) {\n // check to see if they sent us the raw QueryBuilder values and only\n // pull off the rules if they did\n if (Array.isArray(rules)) {\n rules = rules[0];\n }\n\n // sanity check on glue value: don't update if null or not given.\n if (rules) {\n // sometimes .glue is undefined so default to 'and'\n if (rules.glue != \"or\") rules.glue = \"and\";\n\n this.queryRules = rules;\n }\n }\n\n // conditionFields()\n // Return the list of fields we are able to update.\n // @return {array} of querybuilder field definitions:\n //\t\t\t\t\t[\n // \t\t\t\t\t\t{ id:\"fname\", value:\"First Name\", type:\"string\" },\n //\t\t\t\t\t { id:\"lname\", value:\"Last Name\", type:\"string\" },\n //\t\t\t\t\t { id:\"age\", value:\"Age\", type:\"number\" },\n //\t\t\t\t\t { id:\"bdate\", value:\"Birth Date\", type:\"date\" }\n //\t\t\t\t\t]\n conditionFields() {\n var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n var currFields = [];\n\n if (this.queryObject) {\n this.queryObject.fields().forEach((f) => {\n if (fieldTypes.indexOf(f.key) != -1) {\n // NOTE: the .id value must match the obj[.id] in the data set\n // so if your object data looks like:\n // \t{\n //\t\tname_first:'Neo',\n //\t\tname_last: 'The One'\n // },\n // then the ids should be:\n // { id:'name_first', value:'xxx', type:'string' }\n currFields.push({\n id: f.columnName,\n value: f.label,\n type: f.key,\n });\n }\n });\n }\n\n return currFields;\n }\n\n // conditionRules()\n // Return the current rule definition object for this Action.\n // @return {obj}\n conditionRules() {\n return this.queryRules;\n }\n\n // objectLoad\n // save the current object this Action is associated with.\n objectLoad(object) {\n // this.currentObject = object;\t\t\t\t// DO WE NEED THIS?\n this.queryObjectLoad(object);\n }\n\n // queryObjectLoad\n // save the current object this Action is using to build query rules.\n queryObjectLoad(object) {\n this.queryObject = object;\n }\n\n formLoad(form) {\n this.currentForm = form;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n // @return {Promise}\n process(options) {\n console.error(\n \"!!! ABViewRuleAction.process() should be overridden by its child class.\"\n );\n return new Promise((resolve, reject) => {\n reject(\n new Error(\n \"ABViewRuleAction.process() should be overridden by its child class.\"\n )\n );\n });\n }\n\n // valueDisplay\n // create the form to collect the specific data this Action needs to function.\n // @param {string} webixID the $$(webixID) of the area to insert our display.\n valueDisplay(webixID) {\n return this.valueDisplayComponent(webixID);\n }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n return (this._ui = {\n ui: {\n template: \"ABViewRuleAction.valueDisplayComponent\",\n },\n init: (data) => {\n console.error(\n \"!!! ABViewRuleAction.valueDisplayComponent() should be overridden.\"\n );\n console.warn(\" --> passed in data:\", data);\n },\n });\n }\n\n // fromSettings\n // initialize this Action from a given set of setting values.\n // @param {obj} settings\n fromSettings(settings) {\n // settings: {\n //\tvalueRules:{}\n // }\n settings = settings ?? {};\n this.valueRules = settings.valueRules ?? settings;\n }\n\n // toSettings\n // return an object that represents the current state of this Action\n // @return {obj}\n toSettings() {\n var settings = {};\n\n // require the child to insert the valueRules\n return settings;\n }\n\n /**\n * @method isReady()\n * returns a promise that gets resolved once our action is ready to work.\n * @return {Promise}\n */\n isReady() {\n return Promise.resolve();\n }\n\n // NOTE: Querybuilder v5.2 has a bug where it won't display the [and/or]\n // choosers properly if it hasn't been shown before the .setValue() call.\n // so this work around allows us to refresh the display after the .show()\n // on the popup.\n // When they've fixed the bug, we'll remove this workaround:\n qbFixAfterShow() {\n // our child classes can implement this if needed.\n // \t- ABViewRuleActionFormRecordRuleUpdateConnected\n }\n};\n","//\n// ABViewRuleList\n//\n// A UI component that is responsible for displaying a list of current \"Rules\"\n// for a given purpose. Some examples are the\n//\t\tForm -> Submit Rules,\n//\t\tForm -> Display Rules\n// \t\tForm -> Record Rules.\n//\n\n// ABViewRuleList is the parent object that manages displaying the common popup,\n// list, adding a rule, removing rules, etc...\n//\n// It is intending to be subclassed by a Specific List object that will load\n// up a given set of Actions for their list.\n//\n// When using it in the AppBuilder Interface Builder, this object provides:\n// \tvar PopupRecordList = new ABViewRuleList(App, idBase);\n// PopupRecordList.fromSettings(CurrentObjectDefinition.rules); // populates List with current settings defined in CurrentObjectDefinition\n// PopupRecordList.init({ onSave:()=>{}})\t// displays the popup for IB\n// CurrentObjectDefinition.rules = PopupRecordList.toSettings(); // save the settings to store in json config\n//\n// When using on a live running App:\n// PopupRecordList = new ABViewRuleList(App, idBase);\n// PopupRecordList.fromSettings();\n//\n// onFormSubmit(data) {\n//\t\t// note: this automatically validates and runs each rule:\n//\t\tPopupRecordList.process({data:data, view:{ current ABViewForm object }})\n//\t\t.then()\n//\t\t.catch();\n// }\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleList {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(childSettings) {\n this.listRules = [];\n this.currentObject = null;\n\n // ensure required values:\n childSettings = childSettings || {};\n childSettings.labels = childSettings.labels || {};\n childSettings.labels.header =\n childSettings.labels.header || \"ab.components.form.ruleList\";\n childSettings.labels.headerDefault =\n childSettings.labels.headerDefault || \"*Rule List\";\n this.childSettings = childSettings;\n }\n\n /**\n * @method component\n * initialize the UI display for this popup editor.\n * @param {obj} App The common UI App object shared among our UI components\n * @param {string} idBase A unique Key used the the base of our unique ids\n */\n component(App, idBase) {\n this.App = this.App || App;\n this.idBase = idBase;\n\n App = App || this.App;\n\n this.currentForm = null;\n\n // internal list of Webix IDs to reference our UI components.\n var ids = (this.ids = {\n component: `${idBase}_component`,\n rules: `${idBase}_rules`,\n rulesScrollview: `${idBase}_rulesScrollview`,\n\n action: `${idBase}_action`,\n when: `${idBase}_when`,\n\n values: `${idBase}_values`,\n set: `${idBase}_set`,\n });\n\n // webix UI definition:\n this.ui = {\n view: \"window\",\n id: ids.component,\n modal: true,\n position: \"center\",\n resize: true,\n width: 700,\n height: 450,\n css: \"ab-main-container\",\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n view: \"label\",\n label: this.childSettings.labels.headerDefault,\n },\n {\n view: \"button\",\n css: \"webix_primary\",\n icon: \"fa fa-plus\",\n type: \"iconButton\",\n label: L(\"Add new rule\"),\n width: 150,\n click: () => {\n this.addRule();\n console.log($$(ids.rules).$height);\n $$(ids.rulesScrollview).scrollTo(0, $$(ids.rules).$height);\n },\n },\n ],\n },\n body: {\n type: \"form\",\n rows: [\n {\n view: \"scrollview\",\n id: ids.rulesScrollview,\n scroll: \"xy\",\n body: {\n view: \"layout\",\n id: ids.rules,\n margin: 20,\n padding: 10,\n rows: [],\n },\n },\n // {\n // \tcss: { 'background-color': '#fff' },\n // \tcols: [\n // \t\t{\n // \t\t\tview: \"button\",\n // \t\t\ticon: \"plus\",\n // \t\t\ttype: \"iconButton\",\n // \t\t\tlabel: labels.component.addNewRule,\n // \t\t\twidth: 150,\n // \t\t\tclick: () => {\n // \t\t\t\tthis.addRule();\n // \t\t\t}\n // \t\t},\n // \t\t{ fillspace: true }\n // \t]\n // },\n {\n css: { \"background-color\": \"#fff\" },\n cols: [\n { fillspace: true },\n {\n view: \"button\",\n name: \"cancel\",\n value: L(\"Cancel\"),\n css: \"ab-cancel-button\",\n autowidth: true,\n click: function () {\n _logic.buttonCancel();\n },\n },\n {\n view: \"button\",\n css: \"webix_primary\",\n name: \"save\",\n label: L(\"Save\"),\n type: \"form\",\n autowidth: true,\n click: function () {\n _logic.buttonSave();\n },\n },\n { fillspace: true },\n ],\n },\n ],\n },\n };\n\n // var _currentObject = null;\n var _rules = [];\n\n // for setting up UI\n this.init = (options) => {\n // register callbacks:\n for (var c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n\n webix.ui(this.ui);\n };\n\n // internal business logic\n var _logic = (this._logic = {\n buttonCancel: function () {\n $$(ids.component).hide();\n },\n\n buttonSave: () => {\n var results = this.toSettings();\n\n _logic.callbacks.onSave(results);\n _logic.hide();\n },\n\n callbacks: {\n onCancel: function () {\n console.warn(\"NO onCancel()!\");\n },\n onSave: function (field) {\n console.warn(\"NO onSave()!\");\n },\n },\n\n hide: function () {\n $$(ids.component).hide();\n },\n\n show: function () {\n $$(ids.component).show();\n },\n });\n\n this.show = _logic.show;\n this.setValue = _logic.setValue;\n }\n\n /**\n * @method addRule\n * Instantiate a new Rule in our list.\n * @param {obj} settings The settings object from the Rule we created in .toSettings()\n */\n addRule(settings) {\n var Rule = this.getRule();\n if (!Rule) return;\n\n this.listRules.push(Rule);\n\n // if we have tried to create our component:\n if (this.ids) {\n // if our actually exists, then populate it:\n var RulesUI = $$(this.ids.rules);\n if (RulesUI) {\n // make sure Rule.ui is created before calling .init()\n Rule.component(this.App, this.idBase); // prepare the UI component\n var viewId = RulesUI.addView(Rule.ui);\n\n Rule.init({\n onDelete: (deletedRule) => {\n $$(this.ids.rules).removeView(Rule.ids.component);\n\n var index = this.listRules.indexOf(deletedRule);\n if (index !== -1) {\n this.listRules.splice(index, 1);\n }\n },\n });\n }\n }\n\n if (settings) {\n Rule.fromSettings(settings);\n }\n }\n\n /**\n * @method fromSettings\n * Create an initial set of default values based upon our settings object.\n * @param {obj} settings The settings object we created in .toSettings()\n */\n fromSettings(settings) {\n // settings: [\n // { rule.settings },\n // { rule.settings }\n // ]\n\n // clear any existing Rules:\n this.listRules.forEach((rule) => {\n if (\n this.ids &&\n this.ids.rules &&\n rule &&\n rule.ids &&\n rule.ids.component\n ) {\n $$(this.ids.rules).removeView(rule.ids.component);\n }\n });\n this.listRules = [];\n\n if (settings) {\n settings.forEach((ruleSettings) => {\n this.addRule(ruleSettings);\n });\n }\n }\n\n /**\n * @method objectLoad\n * A rule is based upon a Form that was working with an Object.\n * .objectLoad() is how we specify which object we are working with.\n *\n * @param {ABObject} The object that will be used to evaluate the Rules\n */\n objectLoad(object) {\n this.currentObject = object;\n\n // tell each of our rules about our object\n this.listRules.forEach((r) => {\n r.objectLoad(object);\n });\n }\n\n processPre(options) {\n (this.listRules || [])\n .filter((rule) => rule.isPreProcess == true)\n .forEach((rule) => {\n rule.processPre(options, options.data);\n });\n }\n\n /**\n * @method process\n * Take the provided data and process each of our rules.\n * @param {obj} options\n * @return {promise}\n */\n process(options) {\n return new Promise((resolve, reject) => {\n let listRules = (this.listRules || []).filter(\n (rule) => !rule.isPreProcess\n );\n\n var numDone = 0;\n var onDone = () => {\n numDone++;\n if (numDone >= listRules.length) {\n resolve();\n }\n };\n\n listRules.forEach((rule) => {\n rule\n .process(options)\n .then(function () {\n onDone();\n })\n .catch((err) => {\n reject(err);\n });\n });\n\n if (listRules.length == 0) {\n resolve();\n }\n });\n }\n\n /**\n * @method toSettings\n * create a settings object to be persisted with the application.\n * @return {array} of rule settings.\n */\n toSettings() {\n var settings = [];\n this.listRules.forEach((r) => {\n settings.push(r.toSettings());\n });\n return settings;\n }\n\n getRule() {\n console.error(\n \"!!! ABViewRuleList.getRule() should be overridded by a child object.\"\n );\n return null;\n }\n\n formLoad(form) {\n this.currentForm = form;\n this.App = this.App || form.App;\n }\n\n /**\n * @method isReady()\n * returns a promise that gets resolved once our action is ready to work.\n * @return {Promise}\n */\n rulesReady() {\n // This base class should be overwritten by any subclass that needs\n // to prepare:\n return Promise.resolve();\n }\n\n // NOTE: Querybuilder v5.2 has a bug where it won't display the [and/or]\n // choosers properly if it hasn't been shown before the .setValue() call.\n // so this work around allows us to refresh the display after the .show()\n // on the popup.\n // When they've fixed the bug, we'll remove this workaround:\n qbFixAfterShow() {\n this.listRules.forEach((r) => {\n r.qbFixAfterShow();\n });\n }\n};\n","//\n// ABViewRuleListFormRecordRules\n//\n// A component that is responsible for displaying the specific list of Record\n// Rules for a form.\n//\nconst ABViewRuleList = require(\"./ABViewRuleList\");\nconst ABViewRule = require(\"./ABViewRule\");\n\nconst RoleUpdateExisting = require(\"./ruleActions/ABViewRuleActionFormRecordRuleUpdate\");\nconst RoleInsertConnected = require(\"./ruleActions/ABViewRuleActionFormRecordRuleInsertConnected\");\nconst RoleUpdateConnected = require(\"./ruleActions/ABViewRuleActionFormRecordRuleUpdateConnected\");\nconst RoleRemoveConnected = require(\"./ruleActions/ABViewRuleActionFormRecordRuleRemoveConnected\");\n\nmodule.exports = class ABViewRuleListFormRecordRules extends ABViewRuleList {\n /**\n * @param {object} App\n * ?what is this?\n * @param {string} idBase\n * Identifier for this component\n */\n constructor() {\n var settings = {\n labels: {\n header: \"ab.components.form.recordRules\",\n headerDefault: \"*Record Rules\",\n },\n };\n super(settings);\n }\n\n // must return the actual Rule object.\n getRule() {\n var listActions = [\n new RoleUpdateExisting(\n this.App,\n `${this.idBase}_ruleActionUpdate`,\n this.currentForm\n ),\n new RoleInsertConnected(\n this.App,\n `${this.idBase}_ruleActionInsert`,\n this.currentForm\n ),\n new RoleUpdateConnected(\n this.App,\n `${this.idBase}_ruleActionUpdateConnected`,\n this.currentForm\n ),\n new RoleRemoveConnected(\n this.App,\n `${this.idBase}_ruleActionRemoveConnected`,\n this.currentForm\n ),\n ];\n\n var Rule = new ABViewRule(listActions);\n if (this.currentObject) {\n Rule.objectLoad(this.currentObject);\n }\n return Rule;\n }\n\n /**\n * @method isReady()\n * returns a promise that gets resolved once our list of Rules is\n * ready to work.\n * @return {Promise}\n */\n async rulesReady() {\n var allReady = (this.listRules || []).map((r) => r.isReady());\n await Promise.all(allReady);\n }\n};\n","//\n// ABViewRuleListFormSubmitRules\n//\n// A component that is responsible for displaying the specific list of Submit\n// Rules for a form.\n//\nconst ABViewRuleList = require(\"./ABViewRuleList\");\nconst ABViewRule = require(\"./ABViewRule\");\n\nconst RoleConfirmMessage = require(\"./ruleActions/ABViewRuleActionFormSubmitRuleConfirmMessage\");\nconst RuleExistPage = require(\"./ruleActions/ABViewRuleActionFormSubmitRuleExistPage\");\nconst RuleParentPage = require(\"./ruleActions/ABViewRuleActionFormSubmitRuleParentPage\");\nconst RuleClosePopup = require(\"./ruleActions/ABViewRuleActionFormSubmitRuleClosePopup\");\nconst RuleWebsite = require(\"./ruleActions/ABViewRuleActionFormSubmitRuleWebsite\");\nconst RuleEmail = require(\"./ruleActions/ABViewRuleActionFormSubmitRuleEmail\");\n\nmodule.exports = class ABViewRuleListFormSubmitRules extends ABViewRuleList {\n /**\n * @param {object} App\n * ?what is this?\n * @param {string} idBase\n * Identifier for this component\n */\n constructor() {\n var settings = {\n labels: {\n header: \"ab.component.form.submitRule\",\n headerDefault: \"*Submit Rules\",\n },\n };\n super(settings);\n }\n\n // must return the actual Rule object.\n getRule() {\n var listActions = [\n new RoleConfirmMessage(\n this.App,\n `${this.idBase}_ruleActionConfirmMessage`\n ),\n new RuleExistPage(this.App, `${this.idBase}_ruleActionExistPage`),\n new RuleParentPage(this.App, `${this.idBase}_ruleActionParentPage`),\n new RuleClosePopup(this.App, `${this.idBase}_ruleActionClosePopup`),\n new RuleWebsite(this.App, `${this.idBase}_ruleActionWebsite`),\n new RuleEmail(this.App, `${this.idBase}_ruleActionEmail`),\n ];\n\n var Rule = new ABViewRule(listActions);\n Rule.objectLoad(this.currentObject);\n Rule.formLoad(this.currentForm);\n return Rule;\n }\n};\n","//\n// ABViewRuleActionFormRecordRuleInsertConnected\n//\n// An action that allows you to insert a connected object.\n//\n// NOTE: this is very similar to the Update Connected Rule, so we subclass that one and\n// modify it to only Insert data.\n//\n//\nconst UpdateConnected = require(\"./ABViewRuleActionFormRecordRuleUpdateConnected\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormRecordRuleInsertConnected extends (\n UpdateConnected\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase, currentForm) {\n super(App, idBase, currentForm);\n\n this.key = \"ABViewRuleActionFormRecordRuleInsertConnected\";\n this.label = L(\"Insert Connected Object\");\n }\n\n /**\n * valueDisplayChooser\n * Our Values Display is a Select Box with a choice of connected fields.\n * Once a field is chosen, then we display the Updater form.\n * @param {string} idBase a unique webix id to base our sub components on.\n */\n valueDisplayChooser(idBase) {\n var Component = super.valueDisplayChooser(idBase);\n\n // in our case, there are no additional QB conditions:\n // so overwrite the .showQBIfNeeded() routine to not show anything:\n Component._logic.showQBIfNeeded = function () {};\n\n return Component;\n }\n\n /**\n * queryBuilderDisplay\n * override our parent .queryBuilderDisplay to not create a new .objectQB\n * @return {null}\n */\n queryBuilderDisplay() {\n return null;\n }\n\n /**\n * process\n * gets called when a form is submitted and the data passes the Query Builder Rules.\n * @param {obj} options\n *\t\t\t\toptions.data : {obj} the key=>value of the data just entered by the form\n *\t\t\t\toptions.form : {ABViewForm} the Form object that is processing this rule\n * @return {Promise}\n */\n process(options) {\n // get connected object\n var connObj = this.connectedObject();\n var model = connObj.model();\n\n var connectionField = this.selectedField();\n\n // var condition = null; // our lookup condition\n\n // we are going to create a new instance of the connected object\n // and make sure our .id is in the connected object's connectionField\n // the server side will take care of making the proper relationship.\n\n // first, create a new set of values:\n var newObjectValues = {};\n\n // update them according to our rules\n this.processUpdateObject({}, newObjectValues);\n\n if (newObjectValues.newRecords) {\n // now add our .id to the proper field in newObjectValues\n let connectedObjectField = connObj.fieldByID(\n connectionField.settings.linkColumn\n );\n\n if (!connectedObjectField)\n return Promise.reject(\"No connected object field\");\n\n newObjectValues.newRecords.forEach((r) => {\n r[connectedObjectField.columnName] = options.data.id;\n // perform the update/insert\n return model.create(r);\n });\n } else {\n // now add our .id to the proper field in newObjectValues\n let connectedObjectField = connObj.fieldByID(\n connectionField.settings.linkColumn\n );\n\n if (!connectedObjectField)\n return Promise.reject(\"No connected object field\");\n\n newObjectValues[connectedObjectField.columnName] = options.data.id;\n\n // perform the update/insert\n return model.create(newObjectValues);\n }\n }\n\n /**\n * toSettings\n * return an object that represents the current state of this Action\n * @return {obj}\n */\n toSettings() {\n // settings: {\n // \tselectedFieldID: 'guid',\n //\tvalueRules:{}\t\t// from ABViewRuleActionObjectUpdater\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n // we don't use .qpCondition\n delete settings.qbCondition;\n\n return settings;\n }\n};\n","//\n// ABViewRuleActionFormRecordRuleRemoveConnected\n//\n// An action that allows you to update fields on an object that is connected to\n// the current object we just Added/Updated\n//\n//\nconst ABViewRuleActionFormRecordRuleUpdateConnected = require(\"./ABViewRuleActionFormRecordRuleUpdateConnected\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormRecordRuleRemoveConnected extends (\n ABViewRuleActionFormRecordRuleUpdateConnected\n) {\n constructor(App, idBase, currentForm) {\n super(App, idBase, currentForm);\n\n this.key = \"ABViewRuleActionFormRecordRuleRemoveConnected\";\n this.label = L(\"Remove Connected Record\");\n\n this.isUpdateValueDisabled = true; // disable update data of each fields\n }\n\n /**\n * process\n * gets called when a form is submitted and the data passes the Query Builder Rules.\n * @param {obj} options\n *\t\t\t\toptions.data : {obj} the key=>value of the data just entered by the form\n *\t\t\t\toptions.form : {ABViewForm} the Form object that is processing this rule\n * @return {Promise}\n */\n process(options) {\n let selectedField = this.selectedField();\n this._formData = options.data;\n\n return new Promise((resolve, reject) => {\n // get the model from the provided Form Obj:\n let dc = options.form.datacollection;\n if (!dc) return resolve();\n\n let model = dc.model;\n if (!model) return resolve();\n\n let updatedVals = {};\n updatedVals[selectedField.columnName] = \"\";\n\n model\n .update(options.data.id, updatedVals)\n .then(resolve)\n .catch((err) => {\n this.AB.notify.developer(err, {\n message:\n \"!!! ABViewRuleActionFormRecordRuleUpdate.process(): update error:\",\n data: options.data,\n });\n reject(err);\n });\n });\n }\n};\n","//\n// ABViewRuleActionFormRecordRuleUpdate\n//\n// An action that allows you to update fields on an object that was currently\n// Added/Updated.\n//\n//\nconst ABViewRuleActionObjectUpdater = require(\"./ABViewRuleActionObjectUpdater\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormRecordRuleUpdate extends (\n ABViewRuleActionObjectUpdater\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase, currentForm) {\n super(App, idBase, currentForm);\n\n this.key = \"ABViewRuleActionFormRecordRuleUpdate\";\n this.label = L(\"Update Record\");\n }\n\n get isPreProcess() {\n return true;\n }\n};\n","//\n// ABViewRuleActionFormRecordRuleUpdateConnected\n//\n// An action that allows you to update fields on an object that is connected to\n// the current object we just Added/Updated\n//\n//\nconst ABViewRuleActionObjectUpdater = require(\"./ABViewRuleActionObjectUpdater\");\nconst ABFieldConnect = require(\"../../platform/dataFields/ABFieldConnect\");\nconst ObjectQueryBuilder = require(\"../ABViewQueryBuilderObjectFieldConditions\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormRecordRuleUpdateConnected extends (\n ABViewRuleActionObjectUpdater\n) {\n constructor(App, idBase, currentForm) {\n super(App, idBase, currentForm);\n\n this.key = \"ABViewRuleActionFormRecordRuleUpdateConnected\";\n this.label = L(\"Update Connected Record\");\n\n this.baseObject = null; // the object the current form is working with.\n // Use this to find our connected fields.\n\n this.selectedFieldID = null; // the selected field ID in the .baseObject that is\n // used for updating. This should be one of the connection Fields.\n\n this.fieldDropList = []; // the list of fields to offer based upon the current .baseObject.\n\n this.objectQB = null; // the QueryBuilder used for offering conditions based upon our connected Object.\n this.qbCondition = null; // the QB condition entered for selecting which remote object.\n }\n\n // field\n\n /**\n * objectLoad\n * save the current object this Action is associated with.\n * in the case of the UpdateConnected Action, assigning us\n * this object only impacts the queryObject.\n *\n * The Updater form will use another object we select in\n * the form dropdown.\n *\n * @param {object} object\n *\n */\n objectLoad(object) {\n this.queryObjectLoad(object);\n this.baseObject = object;\n\n // now build our fieldDropList for the select\n var connectionFields = this.connectedFieldList();\n connectionFields.forEach((cf) => {\n this.fieldDropList.push({\n id: cf.id,\n value: cf.label,\n });\n });\n }\n\n /**\n * connectedFieldList\n * return the fields in our .baseObject that are connections to other objects.\n * @return {array} of {ABField}\n */\n connectedFieldList() {\n var connectKey = ABFieldConnect.defaults().key;\n if (this.baseObject && this.baseObject.fields) {\n return this.baseObject.fields((f) => {\n return f.key == connectKey;\n });\n } else {\n return [];\n }\n }\n\n /**\n * connectedObject\n * return the ABObject associated with the selected connection field.\n * @return {ABObject}\n */\n connectedObject() {\n if (this.selectedFieldID) {\n var selectedField = this.selectedField();\n if (selectedField) {\n return selectedField.datasourceLink;\n }\n }\n\n return null;\n }\n\n /**\n * selectedField\n * return the selected {ABField} object.\n * @return {ABField}\n */\n selectedField() {\n return this.connectedFieldList().filter((f) => {\n return f.id == this.selectedFieldID;\n })[0];\n }\n\n /**\n * valueDisplayComponent\n * Return an ABView to display our values form.\n * @param {string} idBase a unique webix id to base our sub components on.\n */\n valueDisplayComponent(idBase) {\n if (this._uiChooser == null) {\n this._uiChooser = this.valueDisplayChooser(idBase);\n }\n\n return this._uiChooser;\n }\n\n /**\n * valueDisplayChooser\n * Our Values Display is a Select Box with a choice of connected fields.\n * Once a field is chosen, then we display the Updater form.\n * @param {string} idBase a unique webix id to base our sub components on.\n */\n valueDisplayChooser(idBase) {\n var uniqueInstanceID = webix.uid();\n var myUnique = (key) => {\n // return idBase + '_' + key + '_' + uniqueInstanceID;\n return key + \"_\" + uniqueInstanceID;\n };\n\n var ids = {\n component: myUnique(\"updateConnectedValues\"),\n updateForm: myUnique(\"updateChooser\"),\n selectConnectedField: myUnique(\"updateSelect\"),\n updateFieldsForm: myUnique(\"updateForm\"),\n };\n\n var _ui = {\n id: ids.component,\n view: \"layout\",\n css: \"ab-component-form-rule\",\n rows: [\n {\n id: ids.selectConnectedField,\n view: \"richselect\",\n label: L(\"Select which connected object to update.\"),\n labelWidth: 300,\n value: this.selectedField,\n options: this.fieldDropList,\n on: {\n onChange: (newVal, oldVal) => {\n _logic.selectAction(newVal, oldVal);\n },\n },\n },\n ],\n };\n\n var init = (valueRules) => {\n valueRules = valueRules || this.valueRules;\n\n // make sure our currently selected field is selected.\n if (this.selectedFieldID) {\n var select = $$(ids.selectConnectedField);\n if (select) {\n select.setValue(this.selectedFieldID);\n }\n }\n };\n\n var _logic = (this._logic = {\n addDisplay: (view) => {\n $$(ids.component).addView(view);\n },\n\n // removePreviousDisplays\n // remove the previous components that reflected the conditions and\n // update values of the previously selected field.\n removePreviousDisplays: () => {\n var allViews = $$(ids.component).getChildViews();\n var cloneAllViews = [];\n allViews.forEach((v) => {\n cloneAllViews.push(v);\n });\n cloneAllViews.forEach((v) => {\n // don't remove the field picker\n if (v.config.id != ids.selectConnectedField) {\n $$(ids.component).removeView(v);\n }\n });\n },\n\n selectAction: (newVal, oldVal) => {\n _logic.removePreviousDisplays(); // of the Query Builder and Update form for old selection:\n\n this.selectedFieldID = newVal;\n var connectedObject = this.connectedObject();\n\n if (connectedObject) {\n // it is the remote object that we are allowed to Update fields on.\n this.updateObjectLoad(connectedObject);\n ///// NOTE: important to call super.valueDisplayComponent()\n this.updateComponent = super.valueDisplayComponent(\n ids.updateFieldsForm\n ); // parent obj\n\n _logic.showQBIfNeeded();\n\n // create a new blank update form\n _logic.addDisplay(this.updateComponent.ui);\n this.updateComponent.init();\n\n if (this.isUpdateValueDisabled) {\n let $updateForm = $$(this.updateComponent.ui.id);\n if ($updateForm) {\n $updateForm.disable();\n $updateForm.hide();\n }\n }\n } else {\n this.AB.notify.builder(new Error(\"No connectedObject found.\"), {\n fieldID: this.selectedFieldID,\n });\n }\n },\n\n showQBIfNeeded: () => {\n //// NOTE: we decided to go ahead and display the QB in ALL situations to give\n //// the user the ability to set a condition on the update even if the field\n //// is only a one to one.\n //// If we want to remove the filter in case of a \"one\" linkType, then put\n //// these conditions back in:\n\n // var field = this.selectedField();\n\n // // we don't need the QB if the destination object link type if 'one'.\n // // there will only be one to get back, so no conditions needed.\n // if (field.settings.linkType != 'one') {\n\n var qbComponent = this.queryBuilderDisplay();\n\n qbComponent.component(this.App, this.idBase);\n _logic.addDisplay(qbComponent.ui);\n qbComponent.init({});\n\n // }\n },\n\n fromSettings: (settings) => {\n // // first time through, be sure to set the connectedObject first\n // this.selectedFieldID = settings.selectedFieldID;\n // var connectedObject = this.connectedObject();\n\n // this triggers the update of the display, creation of QB,\n $$(ids.selectConnectedField).setValue(settings.selectedFieldID);\n\n if (this.objectQB) {\n this.objectQB.setValue(this.qbCondition);\n }\n\n if (this.updateComponent) {\n this.updateComponent.fromSettings(settings);\n }\n },\n\n toSettings: () => {\n // valueRules = {\n //\tfieldOperations:[\n //\t\t{ fieldID:xxx, value:yyyy, type:zzz, op:aaa }\n //\t]\n // }\n var settings = { fieldOperations: [] };\n\n // for each of our formRows, decode the propery {}\n this.formRows.forEach((fr) => {\n var rowSettings = fr.toSettings();\n if (rowSettings) {\n settings.fieldOperations.push(rowSettings);\n }\n });\n\n return settings;\n },\n });\n\n return {\n ui: _ui,\n init: init,\n fromSettings: (settings) => {\n _logic.fromSettings(settings);\n },\n toSettings: () => {\n return _logic.toSettings();\n },\n _logic: _logic,\n };\n }\n\n /**\n * queryBuilderDisplay\n * returns our Query Builder object used in our display.\n * It is called by the .showQBIfNeeded() method.\n * @return {ABViewQueryBuilderObjectFieldConditions}\n */\n queryBuilderDisplay() {\n if (!this.objectQB) {\n this.objectQB = new ObjectQueryBuilder(\n L(\"How to choose which object:\")\n );\n\n var connObj = this.connectedObject();\n if (connObj) this.objectQB.objectLoad(connObj);\n }\n return this.objectQB;\n }\n\n /**\n * process\n * gets called when a form is submitted and the data passes the Query Builder Rules.\n * @param {obj} options\n *\t\t\t\toptions.data : {obj} the key=>value of the data just entered by the form\n *\t\t\t\toptions.form : {ABViewForm} the Form object that is processing this rule\n * @return {Promise}\n */\n process(options) {\n this._formData = options.data;\n\n // get connected object\n var connObj = this.connectedObject();\n var model = connObj.model();\n\n var connectionField = this.selectedField();\n\n var condition = null; // our lookup condition\n\n // modifyCondition\n // async fn() to fill out what the condition should be for limiting the remote\n // objects to values in use by the current object.\n // @param {fn} cb the callback to use when we are finished:\n //\t\t\t\t\tcb(err, )\n var modifyCondition = (cb) => {\n // So, let's get a copy of our current data, with all it's connected items\n // attached.\n var thisModel = this.baseObject.model();\n thisModel\n .findConnected(connectionField.columnName, options.data)\n .then((items) => {\n // if we didn't get any results, then simply return\n // NOTE: this will leave condition == null and cancel this update.\n if (!items || items.length == 0) {\n cb();\n return;\n }\n\n // then use these to limit the connected data of our Action:\n\n // get all the ids\n var ids = items.map((i) => {\n return i.id;\n });\n\n // resulting condition: { id in [listIDs]} AND { QB Condition }\n condition = {\n glue: \"and\",\n rules: [\n {\n key: `${connObj.tableName}.${connObj.PK()}`,\n rule: \"in\",\n value: ids,\n },\n ],\n };\n\n // check to make sure qbCondition actually has a condition before adding it\n // to our condition:\n if (Object.keys(this.qbCondition).length > 0) {\n condition.rules.push(this.qbCondition);\n }\n\n cb();\n })\n .catch(cb);\n };\n\n // .process() returns a Promise\n return new Promise((resolve, reject) => {\n // upateIt()\n // updates a given item with our changes.\n // @param {obj} item the item to update\n // @param {fn} cb a callback function when update is complete.\n var updateIt = (item, cb) => {\n let isUpdated = this.processUpdateObject({}, item);\n if (!isUpdated) {\n cb();\n } else {\n model\n .update(item.id, item)\n .then(() => {\n cb();\n })\n .catch((err) => {\n this.AB.notify.developer(err, {\n message:\n \"!!! ABViewRuleActionFormRecordRuleUpdateConnected.process(): update error:\",\n data: options.data,\n });\n cb(err);\n });\n }\n };\n\n // now figure out which elements belong to this object\n // done in modifyCondition()\n modifyCondition((err) => {\n if (err) {\n AB.notify.developer(err, {\n message:\n \"!!! ABViewRuleActionFormRecordRuleUpdateConnected.modifyCondition: error:\",\n data: options.data,\n });\n reject(err);\n return;\n }\n\n if (condition === null) {\n // this is the case where we didn't have the proper data to complete our\n // update. So let's just fail gracefully, and continue on.\n\n // QUESTION: is this the right way to handle it?\n resolve();\n } else {\n // get all the entries that match our condition:\n model\n .findAll({ where: condition })\n .then((list) => {\n var done = 0;\n\n // list : {data: Array(4), total_count: 4, pos: null, offset: null, limit: null}\n if (list && list.data) {\n list = list.data;\n }\n\n // for each entry, update it with our values:\n list.forEach((item) => {\n updateIt(item, (err) => {\n if (err) {\n return reject(err);\n }\n done++;\n if (done >= list.length) {\n // now they are all updated, so continue.\n resolve();\n }\n });\n });\n\n // if there were no entries to update -> continue\n if (list.length == 0) {\n resolve();\n }\n })\n .catch(reject);\n }\n }); // end modifyCondition()\n }); // end Promise()\n }\n\n /**\n * fromSettings\n * initialize this Action = require(a given set of setting values.\n * @param {obj} settings the settings {} returned = require(toSettings()\n */\n fromSettings(settings) {\n settings = settings || {};\n\n this.selectedFieldID = settings.selectedFieldID || null;\n this.qbCondition = settings.qbCondition || {};\n\n super.fromSettings(settings);\n\n // if we have a display component, then populate it:\n if (this._uiChooser) {\n this._logic.fromSettings(settings);\n }\n }\n\n /**\n * toSettings\n * return an object that represents the current state of this Action\n * @return {obj}\n */\n toSettings() {\n // settings: {\n // \tselectedFieldID: 'guid',\n // qbCondition: [],\n //\tvalueRules:{}\t\t// = require(ABViewRuleActionObjectUpdater\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n settings.selectedFieldID = this.selectedFieldID;\n\n var qbCond = null;\n if (this.objectQB) {\n qbCond = this.objectQB.getValue();\n if (Array.isArray(qbCond)) {\n qbCond = qbCond[0];\n }\n\n // FIX: make sure qbCond root element has a 'glue'\n if (qbCond) {\n qbCond.glue = qbCond?.glue || \"and\";\n }\n }\n settings.qbCondition = qbCond;\n\n // if we have a display component, then request our details = require(it:\n if (this._uiChooser) {\n settings.valueRules = this._logic.toSettings();\n }\n\n return settings;\n }\n\n // NOTE: Querybuilder v5.2 has a bug where it won't display the [and/or]\n // choosers properly if it hasn't been shown before the .setValue() call.\n // so this work around allows us to refresh the display after the .show()\n // on the popup.\n // When they've fixed the bug, we'll remove this workaround:\n qbFixAfterShow() {\n if (this.objectQB) {\n this.objectQB.setValue(this.qbCondition);\n }\n }\n};\n","//\n// ABViewRuleActionFormSubmitRuleClosePopup\n//\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormSubmitRuleClosePopup extends (\n ABViewRuleAction\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase) {\n super();\n\n this.App = App;\n this.key = \"ABViewRuleActionFormSubmitRuleClosePopup\";\n this.label = L(\"Close the current popup\");\n\n this.currentObject = null; // the object this Action is tied to.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n }\n\n // conditionFields() {\n // var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n // var currFields = [];\n\n // if (this.currentObject) {\n // this.currentObject.fields().forEach((f) => {\n // if (fieldTypes.indexOf(f.key) != -1) {\n // // NOTE: the .id value must match the obj[.id] in the data set\n // // so if your object data looks like:\n // // \t{\n // //\t\tname_first:'Neo',\n // //\t\tname_last: 'The One'\n // // },\n // // then the ids should be:\n // // { id:'name_first', value:'xxx', type:'string' }\n // currFields.push({\n // id: f.columnName,\n // value: f.label,\n // type: f.key\n // });\n // }\n // });\n // }\n\n // return currFields;\n // }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n this._ui = {\n ui: {\n view: \"layout\",\n rows: [],\n },\n\n init: () => {},\n };\n\n return this._ui;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n process(options) {\n return new Promise((resolve, reject) => {\n let form = options.form;\n if (!form) return;\n\n let popup = form.pageParent((p) => p.settings.type == \"popup\");\n if (!popup) return;\n\n // get the dom id of page. it is dom id that is generated in ABLiveTool.js\n // let pageDomId = [\"ab_live_page\", popup.application.id, popup.id].join(\n // \"_\"\n // );\n\n // close current popup\n let $popup = $$(popup.id);\n if ($popup) $popup.hide();\n\n // this clears the UI's record of the current form.\n options.form.changePage(null);\n\n resolve();\n });\n }\n};\n","//\n// ABViewRuleActionFormSubmitRuleConfirmMessage\n//\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormSubmitRuleConfirmMessage extends (\n ABViewRuleAction\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase) {\n super();\n\n this.App = App;\n this.key = \"ABViewRuleActionFormSubmitRuleConfirmMessage\";\n this.label = L(\"Show a confirmation message\");\n\n this.currentObject = null; // the object this Action is tied to.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n }\n\n // conditionFields() {\n // var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n // var currFields = [];\n\n // if (this.currentObject) {\n // this.currentObject.fields().forEach((f) => {\n // if (fieldTypes.indexOf(f.key) != -1) {\n // // NOTE: the .id value must match the obj[.id] in the data set\n // // so if your object data looks like:\n // // \t{\n // //\t\tname_first:'Neo',\n // //\t\tname_last: 'The One'\n // // },\n // // then the ids should be:\n // // { id:'name_first', value:'xxx', type:'string' }\n // currFields.push({\n // id: f.columnName,\n // value: f.label,\n // type: f.key\n // });\n // }\n // });\n // }\n\n // return currFields;\n // }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n var ids = {\n message: `${idBase}_message`,\n };\n\n this._ui = {\n ui: {\n id: ids.message,\n view: \"textarea\",\n // label: this.labels.component.message,\n // labelWidth: this.AB.UISettings.config().labelWidthLarge,\n height: 130,\n },\n\n init: () => {},\n\n _logic: _logic,\n\n fromSettings: (valueRules) => {\n _logic.fromSettings(valueRules);\n },\n toSettings: () => {\n return _logic.toSettings();\n },\n };\n\n var _logic = {\n fromSettings: (valueRules) => {\n valueRules = valueRules || {};\n\n $$(ids.message).setValue(valueRules.message || \"\");\n },\n\n toSettings: () => {\n // return the confirm message\n return {\n message: $$(ids.message).getValue() || \"\",\n };\n },\n };\n\n return this._ui;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n process(options) {\n return new Promise((resolve, reject) => {\n var confirmMessage = this.valueRules.message || \"\";\n\n webix.message({\n text: confirmMessage,\n type: \"info\",\n });\n\n resolve();\n });\n }\n\n // fromSettings\n // initialize this Action from a given set of setting values.\n // @param {obj} settings\n fromSettings(settings) {\n settings = settings || {};\n super.fromSettings(settings); // let the parent handle the QB\n\n // if we have a display component, then populate it:\n if (this._ui) {\n // now we handle our valueRules:{} object settings.\n // pass the settings off to our DisplayList component:\n this._ui.fromSettings(settings.valueRules);\n }\n }\n\n // toSettings\n // return an object that represents the current state of this Action\n // @return {obj}\n toSettings() {\n // settings: {\n //\tmessage:''\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n settings.valueRules = this._ui.toSettings();\n\n return settings;\n }\n};\n","//\n// ABViewRuleActionFormSubmitRuleWebsite\n//\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\nconst ABFieldConnect = require(\"../../platform/dataFields/ABFieldConnect\");\nconst ABFieldEmail = require(\"../../platform/dataFields/ABFieldEmail\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormSubmitRuleEmail extends (\n ABViewRuleAction\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase) {\n super();\n\n this.App = App;\n this.key = \"ABViewRuleActionFormSubmitRuleEmail\";\n this.label = L(\"Send a custom email\");\n\n this.queryObject = null; // the object this Action is tied to.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n }\n\n // conditionFields() {\n // var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n // var currFields = [];\n\n // if (this.queryObject) {\n // this.queryObject.fields().forEach((f) => {\n // if (fieldTypes.indexOf(f.key) != -1) {\n // // NOTE: the .id value must match the obj[.id] in the data set\n // // so if your object data looks like:\n // // \t{\n // //\t\tname_first:'Neo',\n // //\t\tname_last: 'The One'\n // // },\n // // then the ids should be:\n // // { id:'name_first', value:'xxx', type:'string' }\n // currFields.push({\n // id: f.columnName,\n // value: f.label,\n // type: f.key\n // });\n // }\n // });\n // }\n\n // return currFields;\n // }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n var ids = {\n form: `${idBase}_form`,\n popup: `${idBase}_popup`,\n list: `${idBase}_fieldList`,\n toEmailsContainer: `${idBase}_toEmailsContainer`,\n toEmails: `${idBase}_toEmails`,\n message: `${idBase}_message`,\n };\n\n this._ui = {\n ui: {\n id: ids.form,\n view: \"form\",\n width: 450,\n elementsConfig: {\n labelPosition: \"top\",\n labelWidth: 100,\n },\n cols: [\n // email form\n {\n width: 330,\n rows: [\n {\n view: \"text\",\n name: \"fromName\",\n label: L(\"From Name\"),\n },\n {\n view: \"text\",\n name: \"fromEmail\",\n label: L(\"From Email\"),\n validate: webix.rules.isEmail,\n on: {\n onChange: function (newVal, oldVal) {\n if (this.getValue() && !this.validate()) {\n $$(ids.form).markInvalid(\n \"fromEmail\",\n \"Email is invalid\"\n );\n } else {\n $$(ids.form).markInvalid(\"fromEmail\", false);\n }\n },\n },\n },\n {\n id: ids.toEmailsContainer,\n view: \"forminput\",\n name: \"toEmails\",\n label: L(\"Send\"),\n css: \"ab-rich-text\",\n width: 320,\n body: {\n width: 320,\n rows: [\n {\n height: 25,\n },\n {\n id: ids.toEmails,\n width: 320,\n view: \"layout\",\n rows: [],\n },\n {\n view: \"button\",\n css: \"webix_primary\",\n type: \"icon\",\n icon: \"fa fa-plus\",\n label: L(\"Add a recipient\"),\n width: 150,\n click: () => {\n _logic.toEmailAdd();\n },\n },\n ],\n },\n },\n {\n view: \"text\",\n name: \"subject\",\n label: L(\"Subject\"),\n },\n {\n view: \"textarea\",\n id: ids.message,\n name: \"message\",\n label: L(\"Message\"),\n width: 320,\n height: 400,\n },\n // {\n // \tview: 'label',\n // \tlabel: 'Message',\n // \tcss: { 'font-weight': 'bold' }\n // },\n // {\n // \tview: 'forminput',\n // \tid: ids.message,\n // \tname: 'message',\n // \tlabel: 'Message',\n // \tcss: \"ab-rich-text\",\n // \twidth: 320,\n // \theight: 400,\n // \tbody: {\n // \t\tview: 'tinymce-editor'\n // \t}\n // }\n ],\n },\n // field list\n {\n rows: [\n {\n view: \"template\",\n type: \"header\",\n template: \"Fields\",\n },\n {\n id: ids.list,\n view: \"list\",\n width: 120,\n css: { \"background-color\": \"#fff !important;\" },\n template: function (obj, common) {\n return _logic.fieldTemplate(obj, common);\n },\n on: {\n onItemClick: function (id, e, node) {\n var component = this.getItem(id);\n\n _logic.enterField(component);\n },\n },\n },\n ],\n },\n ],\n },\n\n init: () => {\n if (this.queryObject) {\n $$(ids.list).parse(\n this.queryObject.fields((f) => f.fieldUseAsLabel())\n );\n $$(ids.list).refresh();\n }\n\n _logic.refreshUI();\n },\n\n _logic: _logic,\n\n fromSettings: (valueRules) => {\n _logic.fromSettings(valueRules);\n },\n toSettings: () => {\n return _logic.toSettings();\n },\n };\n\n var _logic = {\n fromSettings: (valueRules) => {\n valueRules = valueRules || {};\n\n $$(ids.form).setValues(valueRules);\n\n // Populate recipients\n var recipients = valueRules.toEmails || [];\n recipients.forEach((r) => {\n _logic.toEmailAdd({\n type: r.type, // 'to', 'cc' or 'bcc'\n emailType: r.emailType, // 'email' or 'field'\n value: r.value,\n });\n });\n\n _logic.refreshUI();\n },\n\n toSettings: () => {\n var formVals = $$(ids.form).getValues() || {};\n\n // Get recipients\n var recipients = [];\n $$(ids.toEmails)\n .getChildViews()\n .forEach((e) => {\n // var type = e.queryView({ name: 'type' }).getValue();\n var type = \"to\"; // TODO\n var emailType = e.queryView({ name: \"emailType\" }).getValue();\n var value = e.queryView({ name: emailType }).getValue();\n\n recipients.push({\n type: type,\n emailType: emailType,\n value: value,\n });\n });\n\n // return the confirm message\n return {\n fromName: formVals[\"fromName\"],\n fromEmail: formVals[\"fromEmail\"],\n toEmails: recipients,\n subject: formVals[\"subject\"],\n message: formVals[\"message\"],\n };\n },\n\n /**\n * @method toEmailTemplate\n *\n * @param settings - {\n * \t\t\ttype: string, // 'to', 'cc' or 'bcc'\n * \t\t\temailType: string, // 'email' or 'field'\n * \t\t\tvalue: string\n * }\n */\n toEmailTemplate: (settings) => {\n settings = settings || {};\n\n return {\n width: 320,\n cols: [\n // {\n // \tview: 'richselect',\n // \tname: 'type',\n // \tvalue: settings.type || 'to',\n // \twidth: 80,\n // \toptions: [\n // \t\t{ id: 'to', value: \"To:\" },\n // \t\t// EmailNotification does not support cc, bcc and reply.\n // \t\t// { id: 'cc', value: \"Cc:\" },\n // \t\t// { id: 'bcc', value: \"Bcc:\" },\n // \t\t// { id: 'reply', value: \"Reply-To:\" }\n // \t]\n // },\n {\n view: \"richselect\",\n name: \"emailType\",\n value: settings.emailType || \"email\",\n width: 150,\n options: [\n {\n id: \"email\",\n value: L(\"A custom email address\"),\n },\n { id: \"field\", value: L(\"An email field\") },\n { id: \"query\", value: L(\"From query\") },\n ],\n on: {\n onChange: function (newVal, oldVal) {\n _logic.emailTypeChange(newVal, this);\n },\n },\n },\n {\n width: 150,\n name: \"emailValue\",\n visibleBatch: settings.emailType || \"email\",\n cols: [\n {\n view: \"text\",\n name: \"email\",\n batch: \"email\",\n value:\n settings.emailType == \"email\"\n ? settings.value\n : \"\",\n validate: webix.rules.isEmail,\n width: 150,\n on: {\n onChange: function (newVal, oldVal) {\n _logic.toEmailValidate();\n },\n },\n },\n {\n view: \"richselect\",\n name: \"field\",\n batch: \"field\",\n value:\n settings.emailType == \"field\"\n ? settings.value\n : \"\",\n width: 150,\n suggest: {\n on: {\n onBeforeShow: function () {\n this.define(\"width\", 300);\n this.resize();\n },\n },\n data: _logic.emailFieldOptions(),\n },\n },\n {\n view: \"richselect\",\n name: \"query\",\n batch: \"query\",\n value:\n settings.emailType == \"query\"\n ? settings.value\n : \"\",\n width: 150,\n suggest: {\n on: {\n onBeforeShow: function () {\n this.define(\"width\", 300);\n this.resize();\n },\n },\n data: _logic.queryOptions(),\n },\n },\n ],\n },\n {\n view: \"button\",\n css: \"webix_danger\",\n type: \"icon\",\n icon: \"fa fa-trash-o\",\n width: 32,\n click: function () {\n var $toView = this.getParentView();\n\n _logic.toEmailRemove($toView);\n },\n },\n ],\n };\n },\n\n toEmailAdd: (settings) => {\n var count = $$(ids.toEmails).getChildViews().length;\n\n $$(ids.toEmails).addView(_logic.toEmailTemplate(settings), count);\n\n _logic.refreshUI();\n },\n\n emailTypeChange: (type, $select) => {\n var $recipient = $select.getParentView();\n var $emailValue = $recipient.queryView({ name: \"emailValue\" });\n\n switch (type) {\n case \"field\":\n $emailValue.showBatch(\"field\");\n break;\n case \"query\":\n $emailValue.showBatch(\"query\");\n break;\n default:\n $emailValue.showBatch(\"email\");\n break;\n }\n\n $$(ids.toEmailsContainer).adjust();\n },\n\n toEmailRemove: ($toView) => {\n $$(ids.toEmails).removeView($toView);\n\n _logic.refreshUI();\n },\n\n toEmailValidate: () => {\n var isAllValid = true;\n\n $$(ids.toEmails)\n .getChildViews()\n .forEach((v) => {\n let emailText = v.queryView({ name: \"email\" });\n if (emailText.getValue() && !emailText.validate()) {\n isAllValid = false;\n }\n });\n\n if (isAllValid) $$(ids.form).markInvalid(\"toEmails\", false);\n else $$(ids.form).markInvalid(\"toEmails\", \"Email is invalid\");\n },\n\n fieldTemplate: (field, common) => {\n return ` ${field.label}`;\n },\n\n emailFieldOptions: () => {\n var existsFieldIds = [];\n var options = [];\n\n var fnAddOptions = (currObj, fLink) => {\n var emailFields = currObj\n .fields((f) => f instanceof ABFieldEmail)\n .map((f) => {\n var optId = \"\",\n optLabel = \"\";\n\n if (fLink) {\n optId = `${fLink.id}|${f.urlPointer()}`;\n optLabel = `${currObj.label}.${f.label} (${fLink.label})`;\n } else {\n optId = `|${f.urlPointer()}`;\n optLabel = `${currObj.label}.${f.label}`;\n }\n\n return {\n id: optId, // linkFieldId|fieldUrl\n value: optLabel,\n };\n });\n\n // TODO: prevent duplicate\n\n options = options.concat(emailFields);\n };\n\n fnAddOptions(this.queryObject);\n\n this.queryObject.connectFields().forEach((f) => {\n // prevent looping\n if (\n // - prevent include connect objects of the base object\n // f.datasourceLink.id == this.queryObject.id ||\n // - check duplicate include objects\n existsFieldIds.indexOf(f.id) > -1\n )\n return;\n\n // store\n existsFieldIds.push(f.id);\n\n // add email fields of link object\n fnAddOptions(f.datasourceLink, f);\n });\n\n return options;\n },\n\n queryOptions: () => {\n var options = [];\n\n // get data collections who is query and contains email field\n let dcQueries = this.currentForm.AB.datacollections((dc) => {\n let obj = dc.datasource;\n return (\n dc.settings.isQuery &&\n obj &&\n obj.fields((f) => f.key == \"email\").length > 0\n );\n });\n\n dcQueries.forEach((dv) => {\n if (dv.datasource) {\n dv.datasource\n .fields((f) => f.key == \"email\")\n .forEach((f) => {\n options.push({\n id: `${dv.id}|${f.id}`, // ABDatacollectionID|fieldID\n value: `${dv.label}.${f.label}`,\n });\n });\n }\n });\n\n return options;\n },\n\n enterField: (field) => {\n var focusElem = webix.UIManager.getFocus();\n var val = \"\";\n\n if (\n focusElem.config.view != \"text\" ||\n focusElem.config.view != \"textarea\"\n ) {\n if (focusElem.getValue) val = focusElem.getValue();\n\n if (focusElem.setValue)\n focusElem.setValue(`${val}${field.label}`);\n\n webix.UIManager.setFocus(focusElem);\n }\n },\n\n refreshUI: () => {\n $$(ids.toEmailsContainer).adjust();\n $$(ids.message).adjust();\n },\n };\n\n return this._ui;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options - {\n //\t\t\t\t\t\t\tdata: {obj} rowData,\n //\t\t\t\t\t\t\tform: {ABViewForm}\n //\t\t\t\t\t\t}\n process(options) {\n // validate sender's email is invalid\n if (!webix.rules.isEmail(this.valueRules.fromEmail)) {\n return Promise.resolve();\n }\n\n var recipients = [];\n\n return Promise.resolve()\n .then(() => {\n // Pull recipients data\n return new Promise((resolve, reject) => {\n var tasks = [];\n\n this.valueRules.toEmails.forEach((rec) => {\n tasks.push(\n new Promise((next, err) => {\n // TODO: Cc, Bcc\n\n // field\n if (rec.emailType == \"field\") {\n var emailFieldUrl = rec.value.split(\"|\")[1]; // linkFieldId|emailFieldUrl\n var emailField =\n this.queryObject.application.urlResolve(\n emailFieldUrl\n );\n if (emailField) {\n // Pull email source object\n if (emailField.object.id == this.queryObject.id) {\n var emailData =\n options.data[emailField.columnName];\n if (emailData)\n recipients = recipients.concat(emailData);\n }\n // Pull emails from link object\n else {\n let linkFieldId = rec.value.split(\"|\")[0];\n let linkFields = this.queryObject.fields(\n (f) =>\n f instanceof ABFieldConnect &&\n f.id == linkFieldId\n );\n linkFields.forEach((f) => {\n var linkedData =\n options.data[f.relationName()] || [];\n\n // convert to an array\n if (\n linkedData &&\n !Array.isArray(linkedData)\n )\n linkedData = [linkedData];\n\n // pull email address\n linkedData.forEach((d) => {\n var email = d[emailField.columnName];\n if (email)\n recipients = recipients.concat(email);\n });\n });\n }\n\n next();\n } else {\n next();\n }\n }\n\n // query\n else if (rec.emailType == \"query\") {\n var dvIdAndFieldId = rec.value; // ABDatacollectionId|fieldId\n if (!dvIdAndFieldId) return next();\n\n var dcId = dvIdAndFieldId.split(\"|\")[0];\n var fieldId = dvIdAndFieldId.split(\"|\")[1];\n\n var dcQuery =\n this.currentForm.AB.datacollectionByID(dcId);\n if (!dcQuery) return next();\n\n var field = dcQuery.datasource.fieldByID(fieldId);\n if (!field) return next();\n\n // get data of data collection\n dcQuery.getData().forEach((data) => {\n var emailAddr = data[field.columnName];\n if (emailAddr) recipients.push(emailAddr);\n });\n\n next();\n }\n\n // email\n else {\n recipients.push(rec.value);\n next();\n }\n })\n );\n });\n\n Promise.all(tasks).catch(reject).then(resolve);\n });\n })\n .then(() => {\n // send out\n return new Promise((resolve, reject) => {\n recipients = this.AB.uniq(recipients).filter((r) => r);\n\n if (!recipients || recipients.length < 1) return resolve();\n\n // replace form value to template\n var fromName = this.valueRules.fromName,\n subject = this.valueRules.subject,\n message = this.valueRules.message;\n\n this.queryObject\n .fields((f) => f.fieldUseAsLabel())\n .forEach((f) => {\n var template = new RegExp(`{${f.label}}`, \"g\"),\n data = f.format(options.data);\n\n fromName = fromName.replace(template, data);\n subject = subject.replace(template, data);\n message = message.replace(template, data);\n });\n\n // send a email\n this.AB.Network.post({\n url: \"/app_builder/email\",\n params: {\n fromName: fromName,\n fromEmail: this.valueRules.fromEmail,\n subject: subject,\n message: message,\n recipients: this.AB.uniq(recipients),\n },\n })\n .then(() => {\n resolve();\n })\n .catch(reject);\n });\n });\n }\n\n // fromSettings\n // initialize this Action from a given set of setting values.\n // @param {obj} settings\n fromSettings(settings) {\n settings = settings || {};\n super.fromSettings(settings); // let the parent handle the QB\n\n // if we have a display component, then populate it:\n if (this._ui) {\n // now we handle our valueRules:{} object settings.\n // pass the settings off to our DisplayList component:\n this._ui.fromSettings(settings.valueRules);\n }\n }\n\n // toSettings\n // return an object that represents the current state of this Action\n // @return {obj}\n toSettings() {\n // settings: {\n //\tmessage:''\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n settings.valueRules = this._ui.toSettings();\n\n return settings;\n }\n};\n","//\n// ABViewRuleActionFormSubmitRuleExistPage\n//\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormSubmitRuleExistPage extends (\n ABViewRuleAction\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase) {\n super();\n\n this.App = App;\n this.key = \"ABViewRuleActionFormSubmitRuleExistPage\";\n this.label = L(\"Redirect to an existing page\");\n\n this.currentObject = null; // the object this Action is tied to.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n }\n\n // conditionFields() {\n // var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n // var currFields = [];\n\n // if (this.currentObject) {\n // this.currentObject.fields().forEach((f) => {\n // if (fieldTypes.indexOf(f.key) != -1) {\n // // NOTE: the .id value must match the obj[.id] in the data set\n // // so if your object data looks like:\n // // \t{\n // //\t\tname_first:'Neo',\n // //\t\tname_last: 'The One'\n // // },\n // // then the ids should be:\n // // { id:'name_first', value:'xxx', type:'string' }\n // currFields.push({\n // id: f.columnName,\n // value: f.label,\n // type: f.key\n // });\n // }\n // });\n // }\n\n // return currFields;\n // }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n var ids = {\n pagesAndTabs: `${idBase}_PagesAndTabs`,\n };\n\n this._ui = {\n ui: { id: ids.pagesAndTabs, view: \"richselect\", options: [] },\n\n init: () => {\n _logic.populateOptions();\n },\n\n _logic: _logic,\n\n fromSettings: (valueRules) => {\n _logic.fromSettings(valueRules);\n },\n toSettings: () => {\n return _logic.toSettings();\n },\n };\n\n var _logic = {\n populateOptions: () => {\n // Pull page list to \"Redirect to an existing page\"\n var _pageOptions = [];\n\n /**\n * @param pageOrTab\t{Object}\t- ABViewPage or ABViewTab\n * @param indent\t{integer}\n * @param type\t\t{string}\t- 'page' or 'tab'\n * @param pageId\t{uuid}\t\t- the id of page (only tab)\n */\n var addPage = (pageOrTab, indent, type, pageId) => {\n indent = indent || \"\";\n\n let icon = \"fa fa-file-o\";\n if (type == \"tab\") icon = \"fa fa-window-maximize\";\n\n let pageParent = pageOrTab.pageParent();\n\n _pageOptions.push({\n id: pageOrTab.id,\n value: indent + pageOrTab.label,\n type: type,\n pageId: pageParent ? pageParent.id : null,\n\n icon: icon,\n });\n\n if (type == \"page\" || type == \"tab\") {\n if (pageOrTab.pages) {\n pageOrTab.pages().forEach(function (p) {\n addPage(p, indent + \"-\", \"page\");\n });\n }\n\n // add 'tab' options\n if (pageOrTab.views) {\n pageOrTab\n .views((v) => v.key == \"tab\")\n .forEach((tab) => {\n // add 'tab view' to options\n tab.views().forEach((tabView) => {\n addPage(\n tabView,\n indent + \"-\",\n \"tab\",\n pageOrTab.id\n );\n });\n });\n }\n }\n };\n\n addPage(this.currentForm.pageRoot(), \"\", \"page\");\n\n $$(ids.pagesAndTabs).define(\"options\", _pageOptions);\n $$(ids.pagesAndTabs).refresh();\n },\n\n fromSettings: (valueRules) => {\n valueRules = valueRules || {};\n\n $$(ids.pagesAndTabs).setValue(\n valueRules.tabId || valueRules.pageId || \"\"\n );\n },\n\n toSettings: () => {\n var result = {};\n\n var selectedId = $$(ids.pagesAndTabs).getValue();\n var selectedItem = $$(ids.pagesAndTabs)\n .getPopup()\n .getList()\n .config.data.filter((opt) => opt.id == selectedId)[0];\n if (selectedItem) {\n if (selectedItem.type == \"tab\") {\n // store page id and tab id\n result = {\n pageId: selectedItem.pageId,\n tabId: selectedId,\n };\n } else {\n // store only page id\n result = {\n pageId: selectedId,\n };\n }\n }\n\n // return the confirm message\n return result;\n },\n };\n\n return this._ui;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n process(options) {\n return new Promise((resolve, reject) => {\n // redirect page\n if (this.valueRules.pageId) {\n options.form.changePage(this.valueRules.pageId);\n\n if (this.valueRules.tabId) {\n var curPage = options.form.application.pages(\n (p) => p.id == this.valueRules.pageId,\n true\n )[0];\n if (!curPage) return resolve();\n\n // switch tab\n var tabView = curPage.views(\n (v) => v.id == this.valueRules.tabId,\n true\n )[0];\n if (!tabView) return resolve();\n\n var tab = tabView.parent;\n if (!tab) return resolve();\n\n var toggleParent = (element) => {\n if (!element.parent) return false;\n var parentElem = element.parent;\n if (!parentElem.parent) return false;\n parentElem.parent.emit(\"changeTab\", parentElem.id);\n toggleParent(parentElem.parent);\n };\n\n toggleParent(tab);\n let showIt = setInterval(function () {\n if ($$(tabView.id) && $$(tabView.id).isVisible()) {\n clearInterval(showIt);\n return;\n }\n tab.emit(\"changeTab\", tabView.id);\n }, 100);\n }\n }\n\n resolve();\n });\n }\n\n // fromSettings\n // initialize this Action from a given set of setting values.\n // @param {obj} settings\n fromSettings(settings) {\n settings = settings || {};\n super.fromSettings(settings); // let the parent handle the QB\n\n // if we have a display component, then populate it:\n if (this._ui) {\n // now we handle our valueRules:{} object settings.\n // pass the settings off to our DisplayList component:\n this._ui.fromSettings(settings.valueRules);\n }\n }\n\n // toSettings\n // return an object that represents the current state of this Action\n // @return {obj}\n toSettings() {\n // settings: {\n //\tmessage:''\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n settings.valueRules = this._ui.toSettings();\n\n return settings;\n }\n};\n","//\n// ABViewRuleActionFormSubmitRuleParentPage\n//\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormSubmitRuleParentPage extends (\n ABViewRuleAction\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase) {\n super();\n\n this.App = App;\n this.key = \"ABViewRuleActionFormSubmitRuleParentPage\";\n this.label = L(\"Redirect to the parent page\");\n\n this.currentObject = null; // the object this Action is tied to.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n }\n\n // conditionFields() {\n // var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n // var currFields = [];\n\n // if (this.currentObject) {\n // this.currentObject.fields().forEach((f) => {\n // if (fieldTypes.indexOf(f.key) != -1) {\n // // NOTE: the .id value must match the obj[.id] in the data set\n // // so if your object data looks like:\n // // \t{\n // //\t\tname_first:'Neo',\n // //\t\tname_last: 'The One'\n // // },\n // // then the ids should be:\n // // { id:'name_first', value:'xxx', type:'string' }\n // currFields.push({\n // id: f.columnName,\n // value: f.label,\n // type: f.key\n // });\n // }\n // });\n // }\n\n // return currFields;\n // }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n this._ui = {\n ui: {\n view: \"label\",\n label: this.label,\n },\n\n init: () => {},\n\n _logic: _logic,\n };\n\n var _logic = {};\n\n return this._ui;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n process(options) {\n return new Promise((resolve, reject) => {\n var pageCurrent = options.form.pageParent();\n var pageParent = pageCurrent.pageParent();\n\n // redirect page\n options.form.changePage(pageParent.id);\n\n resolve();\n });\n }\n};\n","//\n// ABViewRuleActionFormSubmitRuleWebsite\n//\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormSubmitRuleWebsite extends (\n ABViewRuleAction\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase) {\n super();\n\n this.App = App;\n this.key = \"ABViewRuleActionFormSubmitRuleWebsite\";\n this.label = L(\"Redirect to another website URL\");\n\n this.currentObject = null; // the object this Action is tied to.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n }\n\n // conditionFields() {\n // var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n // var currFields = [];\n\n // if (this.currentObject) {\n // this.currentObject.fields().forEach((f) => {\n // if (fieldTypes.indexOf(f.key) != -1) {\n // // NOTE: the .id value must match the obj[.id] in the data set\n // // so if your object data looks like:\n // // \t{\n // //\t\tname_first:'Neo',\n // //\t\tname_last: 'The One'\n // // },\n // // then the ids should be:\n // // { id:'name_first', value:'xxx', type:'string' }\n // currFields.push({\n // id: f.columnName,\n // value: f.label,\n // type: f.key\n // });\n // }\n // });\n // }\n\n // return currFields;\n // }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n var ids = {\n website: `${idBase}_website`,\n };\n\n this._ui = {\n ui: {\n id: ids.website,\n view: \"text\",\n },\n\n init: () => {},\n\n _logic: _logic,\n\n fromSettings: (valueRules) => {\n _logic.fromSettings(valueRules);\n },\n toSettings: () => {\n return _logic.toSettings();\n },\n };\n\n var _logic = {\n fromSettings: (valueRules) => {\n valueRules = valueRules || {};\n\n $$(ids.website).setValue(valueRules.website || \"\");\n },\n\n toSettings: () => {\n // return the confirm message\n return {\n website: $$(ids.website).getValue() || \"\",\n };\n },\n };\n\n return this._ui;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n process(options) {\n return new Promise((resolve, reject) => {\n // redirect to website\n if (this.valueRules.website)\n window.open(\n `http://${this.valueRules.website.replace(\"http://\", \"\")}`,\n \"_blank\"\n );\n\n resolve();\n });\n }\n\n // fromSettings\n // initialize this Action from a given set of setting values.\n // @param {obj} settings\n fromSettings(settings) {\n settings = settings || {};\n super.fromSettings(settings); // let the parent handle the QB\n\n // if we have a display component, then populate it:\n if (this._ui) {\n // now we handle our valueRules:{} object settings.\n // pass the settings off to our DisplayList component:\n this._ui.fromSettings(settings.valueRules);\n }\n }\n\n // toSettings\n // return an object that represents the current state of this Action\n // @return {obj}\n toSettings() {\n // settings: {\n //\tmessage:''\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n settings.valueRules = this._ui.toSettings();\n\n return settings;\n }\n};\n","// ABViewRuleActionObjectUpdater\n//\n// An action that allows you to update fields on an object.\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nvar ABViewRuleActionObjectUpdaterDefaults = {\n filterConditions: {\n // array of filters to apply to the data table\n glue: \"and\",\n rules: [],\n },\n};\n\nmodule.exports = class ABViewRuleActionObjectUpdater extends ABViewRuleAction {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase, currentForm) {\n super(App, idBase, currentForm);\n\n this.key = \"ABViewRuleActionFormRecordRuleUpdate\";\n this.label = L(\"Update Record\");\n\n this.updateObject = null; // the object this Action will Update.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n\n this.stashRules = {}; // keep track of rule settings among our selected objects.\n }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n if (this._uiUpdater == null) {\n this._uiUpdater = this.valueDisplayList(idBase);\n }\n\n return this._uiUpdater;\n }\n\n // Our Values Display is a List of ValueRows\n // Each ValueRow will display an additional set of [add] [delete] buttons.\n\n valueDisplayList(idBase) {\n var uniqueInstanceID = webix.uid();\n var myUnique = (key) => {\n // return idBase + '_' + key + '_' + uniqueInstanceID;\n return `${idBase}_${key}_${uniqueInstanceID}`;\n };\n var ids = {\n updateForm: myUnique(\"updateForm\"),\n };\n\n var _ui = {\n view: \"form\",\n id: ids.updateForm,\n elements: [],\n };\n\n var init = (valueRules) => {\n valueRules = valueRules || this.valueRules;\n _logic.setValues(valueRules);\n };\n\n var _logic = {\n removeAddRow: () => {\n // get our Form\n var UpdateForm = _logic.formGet();\n if (!UpdateForm) return;\n\n // check row that's unselect a field\n var rows = UpdateForm.getChildViews();\n\n var addRow = rows.filter((r) => {\n return r.queryView(function (view) {\n return view.config.name == \"field\" && !view.getValue();\n });\n })[0];\n if (!addRow) return;\n\n UpdateForm.removeView(addRow);\n },\n\n // addRow\n // add a new data entry to this form.\n // @param {obj} data (optional) initial values for this row.\n addRow: (data) => {\n // get our Form\n var UpdateForm = _logic.formGet();\n if (!UpdateForm) return;\n\n // check row that's unselect a field\n var rows = UpdateForm.getChildViews();\n if (\n data == null &&\n rows.filter((r) => {\n return r.queryView(function (view) {\n return view.config.name == \"field\" && !view.getValue();\n });\n }).length > 0\n )\n return;\n\n // get a new Row Component\n var row = this.valueDisplayRow(idBase);\n\n // add row to Form\n UpdateForm.addView(row.ui);\n\n // initialize row with any provided data:\n row.init({\n onAdd: () => {\n // add a new Row\n _logic.addRow();\n },\n onDelete: (rowId) => {\n // remove a row\n _logic.delRow(rowId);\n },\n data: data,\n });\n\n // store this row\n this.formRows.push(row);\n },\n\n delRow: (rowId) => {\n // store this row\n this.formRows.forEach((r, index) => {\n if (r.ui.id == rowId) this.formRows.splice(index, 0);\n });\n\n // get our Form\n var UpdateForm = _logic.formGet();\n if (!UpdateForm) return;\n\n // remove UI\n UpdateForm.removeView($$(rowId));\n },\n\n formClear: () => {\n var UpdateForm = _logic.formGet();\n if (!UpdateForm) return;\n\n var children = UpdateForm.getChildViews();\n\n // NOTE: need to clone this array, because it is connected with the UpdatForm's\n // internal array of items. Once we start .removeView() the element actually\n // is removed from the internal array, which then upset's the .forEach() from\n // properly iterating through the structure. It results in missed items from\n // being sent to the .forEach().\n // So Clone it and use that for .forEach()\n var cloneChildren = [];\n children.forEach((c) => {\n cloneChildren.push(c);\n });\n cloneChildren.forEach((c) => {\n UpdateForm.removeView(c);\n });\n\n // clear our stored .formRows\n this.formRows = [];\n },\n\n formGet: () => {\n var UpdateForm = $$(ids.updateForm);\n if (!UpdateForm) {\n // this is a problem!\n this.currentForm.AB.notify.developer(\n new Error(\"no webix form\"),\n {\n context:\n \"ABViewRuleActionObjectUpdater:formGet could not find webix form\",\n id: ids.updateForm,\n }\n );\n return null;\n }\n\n return UpdateForm;\n },\n\n setValues: (valueRules) => {\n // valueRules = {\n //\tfieldOperations:[\n //\t\t{ fieldID:xxx, value:yyyy, type:zzz, op:aaa }\n //\t]\n // }\n\n valueRules = valueRules || {};\n valueRules.fieldOperations = valueRules.fieldOperations || [];\n\n // find the form\n var UpdateForm = _logic.formGet();\n if (!UpdateForm) return;\n\n // clear form:\n _logic.formClear();\n\n // if there are values to\n if (valueRules.fieldOperations.length > 0) {\n valueRules.fieldOperations.forEach((r) => {\n _logic.addRow(r);\n });\n }\n\n // our default operation will cause an empty row to\n // appear after our first value entry.\n // let's remove that one, and then add a new one\n // at the end:\n _logic.removeAddRow();\n\n // display an empty row\n _logic.addRow();\n },\n\n fromSettings: (settings) => {\n // Note: we just want the { valueRules:[] } here:\n var mySettings = settings.valueRules || settings;\n\n _logic.setValues(mySettings);\n },\n\n toSettings: () => {\n // valueRules = {\n //\tfieldOperations:[\n //\t\t{ fieldID:xxx, value:yyyy, type:zzz, op:aaa }\n //\t]\n // }\n var settings = { fieldOperations: [] };\n\n // for each of our formRows, decode the propery {}\n this.formRows.forEach((fr) => {\n var rowSettings = fr.toSettings();\n if (rowSettings) {\n settings.fieldOperations.push(fr.toSettings());\n }\n });\n\n return settings;\n },\n };\n\n return {\n ui: _ui,\n init: init,\n fromSettings: (settings) => {\n _logic.fromSettings(settings);\n },\n toSettings: () => {\n return _logic.toSettings();\n },\n _logic: _logic,\n };\n }\n\n valueDisplayRow(idBase) {\n var uniqueInstanceID = webix.uid();\n var myUnique = (key) => {\n // return idBase + '_' + key + '_' + uniqueInstanceID;\n return key + \"_\" + uniqueInstanceID;\n };\n\n var ids = {\n row: myUnique(\"row\"),\n updateForm: myUnique(\"updateFormRow\"),\n field: myUnique(\"field\"),\n value: myUnique(\"value\"),\n selectDc: myUnique(\"selectDc\"),\n selectBy: myUnique(\"selectBy\"),\n queryField: myUnique(\"queryField\"),\n multiview: myUnique(\"multiview\"),\n buttonAdd: myUnique(\"add\"),\n buttonDelete: myUnique(\"delete\"),\n };\n\n var FilterComponent;\n\n var _logic = {\n callbacks: {\n onAdd: () => {},\n onDelete: () => {},\n },\n\n buttonsToggle: () => {\n $$(ids.row).getChildViews()[0].getChildViews()[4].hide();\n $$(ids.row).getChildViews()[0].getChildViews()[5].show();\n },\n\n getFieldList: (shouldFilter) => {\n var options = [];\n if (this.updateObject) {\n options = (this.updateObject.fields() || []).map((f) => {\n return {\n id: f.id,\n value: f.label,\n };\n });\n\n // options = (this.updateObject.fields() || [])\n // .filter(f => {\n //\n // \tif (f.key != 'connectObject') {\n // \t\treturn true;\n // \t} else {\n // \t\t// if this is a connection field, only return\n // \t\t// fields that are 1:x where this field is the\n // \t\t// source:\n // \t\t// return ((f.linkType() == 'one') && (f.isSource()))\n //\n // \t\t// 6-14-2018 Changing from only 1:x to support many\n // \t\t// if this is a connected field, only return\n // \t\t// fields that this is the source\n // \t\treturn (f.isSource())\n // \t}\n // })\n // .map(f => {\n // \treturn {\n // \t\tid: f.id,\n // \t\tvalue: f.label\n // \t};\n // });\n\n // Remove fields who are selected\n if (shouldFilter) {\n // store this row\n var usedHash = {};\n this.formRows.forEach((row) => {\n var rowView = $$(row.ui.id);\n if (rowView) {\n var field = rowView\n .getChildViews()[0]\n .getChildViews()[1];\n usedHash[field.getValue()] = true;\n }\n });\n options = options.filter((o) => {\n return !usedHash[o.id];\n });\n }\n }\n return options;\n },\n\n isValid: () => {\n var validator = this.currentForm.AB.Validation.validator();\n var valueField = $$(ids.row).getChildViews()[0].getChildViews()[3];\n var FormView = valueField.getParentView().getParentView();\n\n var field = this.getUpdateObjectField($$(ids.field).getValue());\n if (field) {\n var value = field.getValue(valueField, {});\n\n // // if a standard component that supports .getValue()\n // if (valueField.getValue) {\n // \tvalue = valueField.getValue();\n // } else {\n // \t// else use for field.getValue();\n // \tvalue = field.getValue(valueField, {});\n // }\n\n // our .isValidData() wants value in an object:\n var obj = {};\n obj[field.columnName] = value;\n\n field.isValidData(obj, validator);\n\n // if value is empty, this is also an error:\n if (\n value == \"\" ||\n value == null ||\n (Array.isArray(value) && value.length == 0)\n ) {\n validator.addError(\n field.columnName,\n L(\"A value is required\")\n );\n }\n\n // field.getParentView() -> row\n // row.getParentView() -> Form\n FormView.clearValidation();\n validator.updateForm(FormView);\n\n return validator.pass();\n } else {\n // if we didn't find an associated field ... then this isn't good\n // data.\n\n //// TODO: display error for our field picker. Note, it doesn't have a unique .name\n // field.\n var fieldField = $$(ids.row)\n .getChildViews()[0]\n .getChildViews()[1];\n fieldField.define(\"invalidMessage\", L(\"A value is required\"));\n fieldField.define(\"invalid\", true);\n fieldField.refresh();\n // fieldField.markInvalid(this.labels.component.errorRequired);\n return false;\n }\n },\n\n selectField: (columnID) => {\n var field = this.getUpdateObjectField(columnID);\n if (!field) return;\n\n var fieldComponent = field.formComponent(),\n abView = fieldComponent.newInstance(field.object.application),\n formFieldComponent = abView.component(this.App),\n $componentView = formFieldComponent.ui,\n $inputView;\n\n $componentView.id = ids.value; // set our expected id\n\n // find all the DataSources\n var datasources = this.currentForm.AB.datacollections(\n (dc) => dc.datasource\n );\n\n // create a droplist with those dataSources\n var optionsDataSources = [];\n datasources.forEach((dc) => {\n optionsDataSources.push({ id: dc.id, value: dc.label });\n });\n\n // create a droplist with select options\n var optionsSelectBy = [\n { id: \"select-one\", value: L(\"Current selection\") },\n {\n id: \"filter-select-one\",\n value: L(\"Select first after filter by...\"),\n },\n ];\n\n var $optionUpdateExsits = {\n type: \"clean\",\n rows: [\n {\n cols: [\n {\n id: ids.selectDc,\n view: \"combo\",\n options: optionsDataSources,\n placeholder: L(\"Choose a data source\"),\n on: {\n onChange: (newv, oldv) => {\n var selectedDC =\n this.currentForm.AB.datacollectionByID(\n newv\n );\n if (\n selectedDC &&\n (selectedDC.sourceType == \"query\" ||\n !field.isConnection)\n ) {\n var queryFieldOptions = [];\n selectedDC.datasource\n .fields()\n .forEach((f) => {\n queryFieldOptions.push({\n id: f.id,\n value: f.label,\n });\n });\n $$(ids.queryField).define(\n \"options\",\n queryFieldOptions\n );\n $$(ids.queryField).refresh();\n $$(ids.queryField).show();\n } else {\n $$(ids.queryField).hide();\n }\n },\n },\n },\n // we will place a list of query fields if you choose a datasource that has a query source type\n {\n id: ids.queryField,\n view: \"combo\",\n hidden: true,\n placeholder: L(\"Choose value from...\"),\n options: [{ id: 1, value: \"figure this out\" }],\n },\n ],\n },\n {\n id: ids.selectBy,\n view: \"combo\",\n options: optionsSelectBy,\n placeholder: L(\"Choose select option\"),\n on: {\n onChange: (newv, oldv) => {\n var $row = $$(ids.row);\n $row.removeView($row.getChildViews()[1]);\n if (newv == \"select-one\") {\n $row.addView({}, 1);\n } else {\n var options =\n this.currentForm.datacollection.datasource\n .fields()\n .map(function (f) {\n return {\n id: f.id,\n value: f.label,\n };\n });\n\n FilterComponent = this.AB.filterComplexNew(\n `${idBase}_filter`\n );\n // FilterComponent.applicationLoad(\n // this.currentForm.application\n // );\n FilterComponent.init({\n isRecordRule: true,\n recordRuleFieldOptions: options,\n });\n FilterComponent.on(\"change\", (val) => {\n _logic.onFilterChange(val);\n });\n\n $row.addView(FilterComponent.ui, 1);\n\n var dcId = $$(ids.selectDc).getValue();\n var dataCollection =\n this.currentForm.AB.datacollectionByID(dcId);\n if (dataCollection) {\n _logic.populateFilters(dataCollection);\n }\n }\n },\n },\n },\n ],\n };\n\n // WORKAROUND: add '[Current User]' option to the user data field\n if (field.key == \"user\") {\n $componentView.options = $componentView.options || [];\n $componentView.options.unshift({\n id: \"ab-current-user\",\n value: L(\"[Current User]\"),\n });\n }\n\n // UPDATE: ok, in practice we have not had any use cases where\n // we want individual values on connectedObject fields, but\n // instead we want to insert the current selected element from\n // a relevant data view. So, replace the fieldComponet\n // from a connectedObject field with a list of data views that\n // are based upon the same object we are connected to:\n if (field.isConnection) {\n // find the ABObject this field connects to\n var connectedObject = field.datasourceLink;\n\n // find all the DataSources that are based upon this ABObject\n // to do this, we find the root Page we are on, then ask that Page for datasources:\n datasources = datasources.filter((dc) => {\n return dc.datasource.id == connectedObject.id;\n });\n\n var dcQueries = this.currentForm.AB.datacollections((dc) => {\n return (\n dc.sourceType == \"query\" &&\n dc.datasource &&\n dc.datasource.canFilterObject(connectedObject)\n );\n // return dc.datasource.id == connectedObject.id;\n });\n\n datasources = datasources.concat(dcQueries);\n\n // refresh a droplist with those dataSources\n optionsDataSources = [];\n datasources.forEach((dc) => {\n optionsDataSources.push({ id: dc.id, value: dc.label });\n });\n\n // add select an array value option\n optionsSelectBy.push({\n id: \"filter-select-all\",\n value: L(\"Select all after filter by...\"),\n });\n\n $inputView = $optionUpdateExsits;\n\n // and the upcoming formFieldComponent.init()\n // doesn't need to do anything:\n formFieldComponent = {\n init: function () {},\n };\n\n // and we reset field so it's customDisplay isn't called:\n // field = {};\n } else {\n $inputView = {\n id: ids.multiview,\n view: \"multiview\",\n cells: [\n {\n batch: \"custom\",\n rows: [\n $componentView,\n {\n view: \"label\",\n label: `${L(\"Or exists value\")}`,\n on: {\n onItemClick: function () {\n var $container = this.getParentView(),\n $multiview = $container.getParentView();\n\n $multiview.showBatch(\"exist\");\n },\n },\n },\n ],\n },\n {\n // Update value from exists object\n batch: \"exist\",\n rows: [\n $optionUpdateExsits,\n {\n view: \"label\",\n label: `${L(\"Or custom value\")}`,\n on: {\n onItemClick: function () {\n var $container = this.getParentView(),\n $multiview = $container.getParentView();\n\n // clear filter view\n $$(ids.selectBy).setValue(\"select-one\");\n\n $multiview.showBatch(\"custom\");\n },\n },\n },\n ],\n },\n ],\n };\n }\n\n // Change component to display this field's form input\n var $row = $$(ids.row).getChildViews()[0];\n $row.removeView($row.getChildViews()[3]);\n $row.addView($inputView, 3);\n\n formFieldComponent.init();\n\n // Show custom display of data field\n if (!field.isConnection && field.customDisplay) {\n // field.customDisplay(field, this.App, $row.getChildViews()[3].$view, {\n\n var compNodeView = $$($componentView.id).$view;\n\n // wait until render UI complete\n setTimeout(() => {\n field.customDisplay(field, this.App, compNodeView, {\n editable: true,\n\n // tree\n isForm: true,\n });\n }, 50);\n }\n\n // Show the remove button\n var $buttonRemove = $row.getChildViews()[4];\n $buttonRemove.show();\n\n // Add a new row\n if (columnID) _logic.callbacks.onAdd();\n },\n\n setValue: (data) => {\n $$(ids.field).setValue(data.fieldID);\n // note: this triggers our _logic.selectField() fn.\n var field = this.getUpdateObjectField(data.fieldID);\n if (field) {\n var setValueFn = () => {\n $$(ids.selectDc).setValue(data.value);\n if (data.queryField) {\n $$(ids.queryField).setValue(data.queryField);\n }\n var selectBy = data.selectBy || \"select-one\";\n $$(ids.selectBy).setValue(selectBy);\n\n if (selectBy != \"select-one\") {\n var collectionId = data.value;\n var dataCollection =\n this.currentForm.AB.datacollectionByID(collectionId);\n if (dataCollection && data.filterConditions) {\n _logic.populateFilters(\n dataCollection,\n data.filterConditions\n );\n }\n }\n };\n\n // now handle our special connectedObject case:\n if (field.isConnection) {\n setValueFn();\n } else {\n if (data.valueType == \"exist\") {\n $$(ids.multiview).showBatch(\"exist\");\n\n setValueFn();\n } else {\n $$(ids.multiview).showBatch(\"custom\");\n\n // wait until render UI complete\n setTimeout(function () {\n // set value to custom field\n var rowData = {};\n rowData[field.columnName] = data.value;\n field.setValue($$(ids.value), rowData);\n }, 50);\n }\n }\n }\n },\n\n populateFilters: (dataView, filterConditions) => {\n filterConditions =\n filterConditions ||\n ABViewRuleActionObjectUpdaterDefaults.filterConditions;\n\n // Populate data to popups\n // FilterComponent.objectLoad(objectCopy);\n FilterComponent.fieldsLoad(\n dataView.datasource ? dataView.datasource.fields() : []\n );\n FilterComponent.setValue(filterConditions);\n },\n\n toSettings: () => {\n // if this isn't the last entry row\n // * a row with valid data has the [delete] button showing.\n var buttonDelete = $$(ids.buttonDelete);\n if (buttonDelete && buttonDelete.isVisible()) {\n var data = {};\n data.fieldID = $$(ids.field).getValue();\n\n var $valueField = $$(ids.value);\n var field = this.getUpdateObjectField(data.fieldID);\n\n var getValueFn = () => {\n data.value = $$(ids.selectDc).getValue();\n data.queryField = $$(ids.queryField).getValue();\n data.op = \"set\"; // possible to create other types of operations.\n data.type = field.key;\n data.selectBy = $$(ids.selectBy).getValue();\n data.valueType = \"exist\";\n if (FilterComponent) {\n data.filterConditions = FilterComponent.getValue();\n }\n };\n\n // now handle our special connectedObject case:\n if (field.isConnection) {\n getValueFn();\n } else {\n if ($$(ids.multiview).config.visibleBatch == \"exist\") {\n getValueFn();\n } else {\n data.value = field.getValue($valueField, {});\n data.op = \"set\"; // possible to create other types of operations.\n data.type = field.key;\n data.valueType = \"custom\";\n }\n }\n\n return data;\n } else {\n return null;\n }\n },\n };\n\n var _ui = {\n id: ids.row,\n view: \"layout\",\n rows: [\n {\n cols: [\n {\n // Label\n view: \"label\",\n width: this.currentForm.AB.Config.labelWidthSmall,\n label: L(\"Set\"),\n },\n {\n // Field list\n view: \"combo\",\n name: \"field\",\n placeholder: L(\"Choose a field\"),\n id: ids.field,\n height: 32,\n options: _logic.getFieldList(true),\n on: {\n onChange: function (columnId) {\n _logic.selectField(columnId);\n },\n },\n },\n {\n // Label\n view: \"label\",\n width: this.currentForm.AB.Config.labelWidthSmall,\n label: L(\"To\"),\n },\n\n // Field value\n // NOTE: this view gets replaced each time a field is selected.\n // We replace it with a component associated with the Field\n {},\n\n {\n // \"Remove\" button\n view: \"button\",\n css: \"webix_danger\",\n id: ids.buttonDelete,\n icon: \"fa fa-trash\",\n type: \"icon\",\n width: 30,\n hidden: true,\n click: function () {\n _logic.callbacks.onDelete(ids.row);\n },\n },\n ],\n },\n {}, // we will add filters here if we need them\n ],\n };\n\n var init = (options) => {\n for (var c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n\n if (options.data) {\n // options.data = { formID:xxx, value:yyy, type:zzzz }\n _logic.setValue(options.data);\n\n // _logic.buttonsToggle();\n }\n };\n\n return {\n ui: _ui,\n init: init,\n toSettings: () => {\n return _logic.toSettings();\n },\n _logic: _logic,\n };\n }\n\n getUpdateObjectField(fieldID) {\n return (\n this.queryObject?.fieldByID(fieldID) ??\n this.updateObject?.fieldByID(fieldID) ??\n this.currentForm.AB.fieldNew(\n this.currentForm.AB.definitionByID(fieldID) ?? {},\n this.currentForm.AB.objectNew({})\n )\n );\n }\n\n /**\n * @method processUpdateObject\n * Perform the specified update actions on the provided objectToUpdate\n * @param {obj} options Additional information required to make updates.\n * @param {obj} objectToUpdate The object to make the updates on.\n * @return {boolean} true if an update took place, false if no updates.\n */\n processUpdateObject(options, objectToUpdate) {\n this._formData = objectToUpdate;\n // return new Promise((resolve, reject) => {\n var isUpdated = false;\n\n this.valueRules = this.valueRules || {};\n this.valueRules.fieldOperations = this.valueRules.fieldOperations || [];\n\n // var allPromises = [];\n\n // for each of our operations\n this.valueRules.fieldOperations.forEach((op) => {\n // op = {\n // \tfieldID:'zzzzz',\n //\tvalue: 'xxx',\n //\top: 'set',\n // type:'',\n // queryField: '', // id of ABField\n // selectBy:'', ['select-one', 'filter-select-one', 'filter-select-all']\n // valueType: \"\", ['custom', 'exist']\n // \tfilterConditions: { // array of filters to apply to the data table\n //\t\tglue: 'and',\n // \t\trules: []\n // }\n // }\n\n var field = this.getUpdateObjectField(op.fieldID);\n if (!field) return;\n\n let value = op?.value?.id ?? op?.value;\n\n switch (value) {\n case \"ab-current-user\":\n value = this.currentForm.AB.Account.username();\n break;\n case \"ab-current-date\":\n value = new Date();\n break;\n }\n\n // in the case of a connected Field, we use op.value to get the\n // datacollection, and find it's currently selected value:\n if ((field.isConnection && !field.isUser) || op.valueType == \"exist\") {\n // NOTE: 30 May 2018 :current decision from Ric is to limit this\n // to only handle 1:x connections where we update the current obj\n // with the PK of the value from the DC.\n //\n // In the future, if we want to handle the other options,\n // we need to modify this to handle the M:x connections where\n // we insert our PK into the value from the DC.\n\n // op.value is the ABDatacollection.id we need to find\n const dataCollection = this.currentForm.AB.datacollectionByID(\n op.value\n );\n if (!dataCollection) {\n isUpdated = false;\n return;\n }\n\n // we don't want to mess with the dataView directly since it might\n // be used by other parts of the system and this refresh might reset\n // it's cursor.\n // var clonedDataCollection = dataView.filteredClone(op.filterConditions);\n\n // loop through rules to find \"same-as-field\" or \"not-same-as-field\"\n // adjust operator and switch key value to actual value when found\n var filterConditions = this.currentForm.AB.cloneDeep(\n op.filterConditions\n );\n if (filterConditions && filterConditions.rules) {\n filterConditions.rules\n .filter((r) => {\n return (\n r.rule == \"same_as_field\" ||\n r.rule == \"not_same_as_field\"\n );\n })\n .forEach((item) => {\n var valueField =\n this.currentForm.datacollection.datasource.fieldByID(\n item.value\n );\n if (valueField.isConnection) {\n item.value = valueField.format(this._formData);\n } else {\n item.value = this._formData[valueField.columnName];\n }\n\n if (item.rule == \"not_same_as_field\") {\n item.rule = \"not equals\";\n } else {\n item.rule = \"equals\";\n }\n });\n }\n\n let clonedDataCollection =\n dataCollection.filteredClone(filterConditions);\n\n switch (op.selectBy) {\n // the 'select-one' is getting the currently set cursor on this data collection\n // and using that value.\n // TODO: rename to 'select-cursor'\n case \"select-one\":\n default: // dataView.getItem(dataView.getCursor());\n value = clonedDataCollection.getCursor();\n\n if (value) {\n // NOTE: webix documentation issue: .getCursor() is supposed to return\n // the .id of the item. However it seems to be returning the {obj}\n\n if (op.valueType == \"exist\") {\n let fieldWithValue =\n clonedDataCollection.datasource.fieldByID(\n op.queryField\n );\n\n if (fieldWithValue)\n value = value[fieldWithValue.columnName];\n } else if (value.id) {\n value = value.id;\n }\n }\n\n // QUESTION: if value returns undefined should we do something else?\n switch (op.op) {\n case \"set\":\n if (!value) break;\n\n if (field.isConnection) {\n // if we are setting a connection we do not want to pass the full object because\n // batch creates payload gets too large\n objectToUpdate[field.columnName] = {};\n objectToUpdate[field.columnName].id =\n value[field.datasourceLink.PK()];\n objectToUpdate[field.columnName][\n field.datasourceLink.PK()\n ] = value[field.datasourceLink.PK()];\n\n // If the connect field use the custom FK, then it requires to pass value of the custom FK.\n if (field.settings.isCustomFK) {\n if (field.indexField) {\n objectToUpdate[field.columnName][\n field.indexField.columnName\n ] = value[field.indexField.columnName];\n }\n if (field.indexField2) {\n objectToUpdate[field.columnName][\n field.indexField2.columnName\n ] = value[field.indexField2.columnName];\n }\n }\n\n field.datasourceLink\n .fields(\n (f) =>\n f.key == \"combined\" || f.key == \"AutoIndex\"\n )\n .forEach((f) => {\n objectToUpdate[field.columnName][\n f.columnName\n ] = value[f.columnName];\n });\n } else {\n objectToUpdate[field.columnName] = value;\n }\n\n break;\n }\n break;\n\n // attempt to filter this data collection by the given filterConditions\n case \"filter-select-all\":\n var newValues = [];\n\n var currRow = clonedDataCollection.getFirstRecord();\n while (currRow) {\n // do something there\n\n switch (clonedDataCollection.sourceType) {\n // case: datacollection is an object\n // we want to set our field to this values\n case \"object\":\n newValues.push(currRow.id);\n break;\n\n // case: datacollection is a query\n // our field is a pointer to an object. we want to pull out that object\n // from the query data.\n case \"query\": {\n let fieldWithValue =\n clonedDataCollection.datasource.fieldByID(\n op.queryField\n );\n\n var newValue = currRow[fieldWithValue.columnName];\n\n if (typeof newValue == \"undefined\") {\n newValue = currRow[fieldWithValue.relationName()];\n\n if (Array.isArray(newValue)) {\n newValue = newValue.map((v) => {\n return v.id ? v.id : v;\n });\n } else if (newValue.id) {\n newValue = newValue.id;\n }\n }\n\n newValues = this.currentForm.AB.uniq(\n newValues.concat(newValue)\n );\n\n break;\n }\n }\n\n currRow = clonedDataCollection.getNextRecord(currRow);\n }\n\n // QUESTION: if value returns undefined should we do something else?\n switch (op.op) {\n case \"set\":\n if (field.linkType() == \"one\") {\n var updates = [];\n newValues.forEach((v) => {\n var objectToUpdateClone =\n this.currentForm.AB.cloneDeep(objectToUpdate);\n objectToUpdateClone[field.columnName] = v;\n updates.push(objectToUpdateClone);\n });\n objectToUpdate.newRecords = updates;\n } else {\n objectToUpdate[field.columnName] = newValues;\n }\n break;\n }\n break;\n\n case \"filter-select-one\":\n newValues = [];\n\n value = clonedDataCollection.getFirstRecord();\n\n if (value) {\n // case: datacollection is a query\n // our field is a pointer to an object. we want to pull out that object\n // from the query data.\n if (\n clonedDataCollection.sourceType == \"query\" ||\n (op.valueType == \"exist\" && op.queryField)\n ) {\n let fieldWithValue =\n clonedDataCollection.datasource.fieldByID(\n op.queryField\n );\n\n newValue = value[fieldWithValue.columnName];\n\n if (typeof newValue == \"undefined\") {\n newValue = value[fieldWithValue.relationName()];\n if (Array.isArray(newValue)) {\n newValue = newValue[0];\n }\n if (newValue.id) newValue = newValue.id;\n }\n\n value = newValue;\n }\n // case: datacollection is an object\n // we want to set our field to this values\n else if (clonedDataCollection.sourceType == \"object\") {\n // NOTE: webix documentation issue: .getCursor() is supposed to return\n // the .id of the item. However it seems to be returning the {obj}\n\n // we need to use the objects indexField(2) if there is one\n // otherwise default to the id\n var lookup;\n if (field.indexField) {\n lookup = field.indexField.columnName;\n } else if (field.indexField2) {\n lookup = field.indexField2.columnName;\n }\n if (lookup && value[lookup]) {\n value = value[lookup];\n } else if (value.id) {\n value = value.id;\n }\n }\n }\n\n // QUESTION: if value returns undefined should we do something else?\n switch (op.op) {\n case \"set\":\n objectToUpdate[field.columnName] = value;\n break;\n }\n break;\n }\n\n isUpdated = true;\n\n // allPromises.push(connectedPromise);\n } else {\n // var setPromise = new Promise((resolve, reject) => {\n switch (op.op) {\n case \"set\":\n objectToUpdate[field.columnName] = value;\n break;\n }\n\n isUpdated = true;\n\n // resolve(isUpdated);\n // });\n\n // allPromises.push(setPromise);\n\n // console.log(\"finished\");\n }\n });\n\n return isUpdated;\n // Promise.all(allPromises).then(() => {\n // resolve(isUpdated);\n // });\n // });\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n // @return {Promise}\n process(options) {\n this._formData = options.data;\n\n return new Promise((resolve, reject) => {\n let isUpdated = this.processUpdateObject({}, options.data);\n if (!isUpdated) {\n resolve();\n } else {\n // get the model from the provided Form Obj:\n var dv = options.form.datacollection;\n if (!dv) return resolve();\n\n var model = dv.model;\n model\n .update(options.data.id, options.data)\n .then(resolve)\n .catch((err) => {\n this.currentForm.AB.notify.developer(err, {\n context:\n \"ABViewRuleActionObjectUpdater:process update error\",\n id: options.data.id,\n data: options.data,\n });\n reject(err);\n });\n }\n });\n }\n\n // objectLoad\n // save the current object this Action is associated with.\n objectLoad(object) {\n super.objectLoad(object);\n this.updateObjectLoad(object);\n }\n\n // updateObjectLoad\n // save the given object as the object we will update.\n updateObjectLoad(object) {\n // stash rules for old object\n if (this.updateObject) {\n this.stashRules[this.updateObject.id] = this.valueRules;\n }\n\n this.updateObject = object;\n\n // with a new updateObject, then reset our UI\n this._uiUpdater = null;\n\n // reload any stashed rules, or set to {}\n this.valueRules = this.stashRules[this.updateObject.id] || {};\n }\n\n // fromSettings\n // initialize this Action from a given set of setting values.\n // @param {obj} settings\n fromSettings(settings) {\n settings = settings || {};\n\n super.fromSettings(settings); // let the parent handle the QB\n\n // make sure UI is updated:\n // set our updateObject\n if (settings.updateObjectID) {\n this.updateObject = this.currentForm.AB.objectByID(\n settings.updateObjectID\n );\n } else {\n // DEPRECIATED method of resolving objects .urlResolve()\n if (settings.updateObjectURL) {\n var updateObject = this.currentForm.application.urlResolve(\n settings.updateObjectURL\n );\n this.updateObject = updateObject;\n }\n }\n\n // if we have a display component, then populate it:\n if (this._uiUpdater) {\n // now we handle our valueRules:{} object settings.\n // pass the settings off to our DisplayList component:\n this._uiUpdater.fromSettings(settings);\n }\n }\n\n // toSettings\n // return an object that represents the current state of this Action\n // @return {obj}\n toSettings() {\n // settings: {\n //\tvalueRules:{}\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n settings.valueRules = this._uiUpdater.toSettings();\n settings.updateObjectURL = this.updateObject.urlPointer();\n\n return settings;\n }\n\n /**\n * @method isReady()\n * returns a promise that gets resolved once our action is ready to work.\n * Here we need to scan each of our field operations, and verify all\n * related data collections are initialized before we can continue.\n * @return {Promise}\n */\n isReady() {\n var allReady = [];\n let fieldOps = this.valueRules?.fieldOperations ?? [];\n fieldOps.forEach((op) => {\n let field = this.getUpdateObjectField(op.fieldID);\n if (!field) return;\n if (!field.isConnection && op.valueType !== \"exist\") return;\n\n // this references a DC\n let DC = this.currentForm.AB.datacollectionByID(op.value);\n if (DC?.dataStatus === DC?.dataStatusFlag.initialized) return;\n\n // not ready yet, so wait until the 'initializedData' event\n allReady.push(\n new Promise((resolve /*, reject */) => {\n DC.on(\"initializedData\", () => {\n resolve();\n });\n })\n );\n });\n return Promise.all(allReady);\n }\n};\n","/**\n * @class config\n *\n * Manage our configuration settings.\n */\n\nimport ConfigDesktop from \"./configDesktop\";\nimport ConfigMobile from \"./configMobile\";\nimport Icons from \"./icons\";\n\nexport default {\n config: function () {\n // TODO: decide which config file to return here:\n if (window.innerWidth < 768) {\n return ConfigMobile;\n }\n return ConfigDesktop;\n },\n icons: Icons.icons,\n};\n","/**\n * @class configDesktop\n *\n * Manage our configuration settings for Desktop styles.\n\n */\n\nexport default {\n // Application List\n appListRowHeight: 67,\n\n // button types\n buttonWidthLarge: 200,\n buttonWidthMedium: 150,\n buttonWidthSmall: 100,\n buttonWidthExtraSmall: 50,\n\n // tab types\n tabWidthLarge: 200,\n tabWidthMedium: 120,\n tabWidthSmall: 100,\n tabWidthExtraSmall: 50,\n\n // column types\n columnWidthXLarge: 350,\n columnWidthLarge: 250,\n columnWidthMedium: 200,\n columnWidthSmall: 150,\n columnWidthExtraSmall: 100,\n\n // spacers\n xSmallSpacer: 5,\n smallSpacer: 10,\n mediumSpacer: 25,\n largeSpacer: 50,\n xLargeSpacer: 100,\n xxLargeSpacer: 200,\n xxxLargeSpacer: 400,\n appListSpacerRowHeight: 100,\n appListSpacerColMinWidth: 100,\n appListSpacerColMaxWidth: 200,\n objectWorkspaceColWidth: 20,\n\n // labels\n labelWidthSmall: 50,\n labelWidthMedium: 80,\n labelWidthLarge: 120,\n labelWidthXLarge: 150,\n labelWidthXXLarge: 200,\n labelWidthXXXLarge: 280,\n labelWidthCheckbox: 0,\n\n // show elements on desktop\n hideMobile: false,\n};\n","/**\n * @class configMobile\n *\n * Manage our configuration settings for mobile styles.\n\n */\n\nexport default {\n // Application List\n appListRowHeight: 67,\n\n // button types\n buttonWidthLarge: 200,\n buttonWidthMedium: 150,\n buttonWidthSmall: 100,\n buttonWidthExtraSmall: 50,\n\n // tab types\n tabWidthLarge: 200,\n tabWidthMedium: 120,\n tabWidthSmall: 100,\n tabWidthExtraSmall: 50,\n\n // column types\n columnWidthLarge: 250,\n columnWidthMedium: 200,\n columnWidthSmall: 150,\n columnWidthExtraSmall: 100,\n\n // spacers\n xSmallSpacer: 1,\n smallSpacer: 1,\n mediumSpacer: 10,\n largeSpacer: 20,\n xLargeSpacer: 50,\n xxLargeSpacer: 100,\n xxxLargeSpacer: 120,\n appListSpacerRowHeight: 10,\n appListSpacerColMinWidth: 1,\n appListSpacerColMaxWidth: 1,\n objectWorkspaceColWidth: 1,\n\n // labels\n labelWidthSmall: 50,\n labelWidthMedium: 80,\n labelWidthLarge: 120,\n labelWidthXLarge: 120,\n labelWidthXXLarge: 120,\n labelWidthCheckbox: 0,\n\n // hide elements for mobile\n hideMobile: true,\n};\n","export default {\n icons: [\n \"500px\",\n \"address-book\",\n \"address-book-o\",\n \"address-card\",\n \"address-card-o\",\n \"adjust\",\n \"adn\",\n \"align-center\",\n \"align-justify\",\n \"align-left\",\n \"align-right\",\n \"amazon\",\n \"ambulance\",\n \"american-sign-language-interpreting\",\n \"anchor\",\n \"android\",\n \"angellist\",\n \"angle-double-down\",\n \"angle-double-left\",\n \"angle-double-right\",\n \"angle-double-up\",\n \"angle-down\",\n \"angle-left\",\n \"angle-right\",\n \"angle-up\",\n \"apple\",\n \"archive\",\n \"area-chart\",\n \"arrow-circle-down\",\n \"arrow-circle-left\",\n \"arrow-circle-o-down\",\n \"arrow-circle-o-left\",\n \"arrow-circle-o-right\",\n \"arrow-circle-o-up\",\n \"arrow-circle-right\",\n \"arrow-circle-up\",\n \"arrow-down\",\n \"arrow-left\",\n \"arrow-right\",\n \"arrow-up\",\n \"arrows\",\n \"arrows-alt\",\n \"arrows-h\",\n \"arrows-v\",\n \"asl-interpreting\",\n \"assistive-listening-systems\",\n \"asterisk\",\n \"at\",\n \"audio-description\",\n \"automobile\",\n \"backward\",\n \"balance-scale\",\n \"ban\",\n \"bandcamp\",\n \"bank\",\n \"bar-chart\",\n \"bar-chart-o\",\n \"barcode\",\n \"bars\",\n \"bath\",\n \"bathtub\",\n \"battery\",\n \"battery-0\",\n \"battery-1\",\n \"battery-2\",\n \"battery-3\",\n \"battery-4\",\n \"battery-empty\",\n \"battery-full\",\n \"battery-half\",\n \"battery-quarter\",\n \"battery-three-quarters\",\n \"bed\",\n \"beer\",\n \"behance\",\n \"behance-square\",\n \"bell\",\n \"bell-o\",\n \"bell-slash\",\n \"bell-slash-o\",\n \"bicycle\",\n \"binoculars\",\n \"birthday-cake\",\n \"bitbucket\",\n \"bitbucket-square\",\n \"bitcoin\",\n \"black-tie\",\n \"blind\",\n \"bluetooth\",\n \"bluetooth-b\",\n \"bold\",\n \"bolt\",\n \"bomb\",\n \"book\",\n \"bookmark\",\n \"bookmark-o\",\n \"braille\",\n \"briefcase\",\n \"btc\",\n \"bug\",\n \"building\",\n \"building-o\",\n \"bullhorn\",\n \"bullseye\",\n \"bus\",\n \"buysellads\",\n \"cab\",\n \"calculator\",\n \"calendar\",\n \"calendar-check-o\",\n \"calendar-minus-o\",\n \"calendar-o\",\n \"calendar-plus-o\",\n \"calendar-times-o\",\n \"camera\",\n \"camera-retro\",\n \"car\",\n \"caret-down\",\n \"caret-left\",\n \"caret-right\",\n \"caret-square-o-down\",\n \"caret-square-o-left\",\n \"caret-square-o-right\",\n \"caret-square-o-up\",\n \"caret-up\",\n \"cart-arrow-down\",\n \"cart-plus\",\n \"cc\",\n \"cc-amex\",\n \"cc-diners-club\",\n \"cc-discover\",\n \"cc-jcb\",\n \"cc-mastercard\",\n \"cc-paypal\",\n \"cc-stripe\",\n \"cc-visa\",\n \"certificate\",\n \"chain\",\n \"chain-broken\",\n \"check\",\n \"check-circle\",\n \"check-circle-o\",\n \"check-square\",\n \"check-square-o\",\n \"chevron-circle-down\",\n \"chevron-circle-left\",\n \"chevron-circle-right\",\n \"chevron-circle-up\",\n \"chevron-down\",\n \"chevron-left\",\n \"chevron-right\",\n \"chevron-up\",\n \"child\",\n \"chrome\",\n \"circle\",\n \"circle-o\",\n \"circle-o-notch\",\n \"circle-thin\",\n \"clipboard\",\n \"clock-o\",\n \"clone\",\n \"close\",\n \"cloud\",\n \"cloud-download\",\n \"cloud-upload\",\n \"cny\",\n \"code\",\n \"code-fork\",\n \"codepen\",\n \"codiepie\",\n \"coffee\",\n \"cog\",\n \"cogs\",\n \"columns\",\n \"comment\",\n \"comment-o\",\n \"commenting\",\n \"commenting-o\",\n \"comments\",\n \"comments-o\",\n \"compass\",\n \"compress\",\n \"connectdevelop\",\n \"contao\",\n \"copy\",\n \"copyright\",\n \"creative-commons\",\n \"credit-card\",\n \"credit-card-alt\",\n \"crop\",\n \"crosshairs\",\n \"css3\",\n \"cube\",\n \"cubes\",\n \"cut\",\n \"cutlery\",\n \"dashboard\",\n \"dashcube\",\n \"database\",\n \"deaf\",\n \"deafness\",\n \"dedent\",\n \"delicious\",\n \"desktop\",\n \"deviantart\",\n \"diamond\",\n \"digg\",\n \"dollar\",\n \"dot-circle-o\",\n \"download\",\n \"dribbble\",\n \"drivers-license\",\n \"drivers-license-o\",\n \"dropbox\",\n \"drupal\",\n \"edge\",\n \"edit\",\n \"eercast\",\n \"eject\",\n \"ellipsis-h\",\n \"ellipsis-v\",\n \"empire\",\n \"envelope\",\n \"envelope-o\",\n \"envelope-open\",\n \"envelope-open-o\",\n \"envelope-square\",\n \"envira\",\n \"eraser\",\n \"etsy\",\n \"eur\",\n \"euro\",\n \"exchange\",\n \"exclamation\",\n \"exclamation-circle\",\n \"exclamation-triangle\",\n \"expand\",\n \"expeditedssl\",\n \"external-link\",\n \"external-link-square\",\n \"eye\",\n \"eye-slash\",\n \"eyedropper\",\n \"fa\",\n \"facebook\",\n \"facebook-f\",\n \"facebook-official\",\n \"facebook-square\",\n \"fast-backward\",\n \"fast-forward\",\n \"fax\",\n \"feed\",\n \"female\",\n \"fighter-jet\",\n \"file\",\n \"file-archive-o\",\n \"file-audio-o\",\n \"file-code-o\",\n \"file-excel-o\",\n \"file-image-o\",\n \"file-movie-o\",\n \"file-o\",\n \"file-pdf-o\",\n \"file-photo-o\",\n \"file-picture-o\",\n \"file-powerpoint-o\",\n \"file-sound-o\",\n \"file-text\",\n \"file-text-o\",\n \"file-video-o\",\n \"file-word-o\",\n \"file-zip-o\",\n \"files-o\",\n \"film\",\n \"filter\",\n \"fire\",\n \"fire-extinguisher\",\n \"firefox\",\n \"first-order\",\n \"flag\",\n \"flag-checkered\",\n \"flag-o\",\n \"flash\",\n \"flask\",\n \"flickr\",\n \"floppy-o\",\n \"folder\",\n \"folder-o\",\n \"folder-open\",\n \"folder-open-o\",\n \"font\",\n \"font-awesome\",\n \"fonticons\",\n \"fort-awesome\",\n \"forumbee\",\n \"forward\",\n \"foursquare\",\n \"free-code-camp\",\n \"frown-o\",\n \"futbol-o\",\n \"gamepad\",\n \"gavel\",\n \"gbp\",\n \"ge\",\n \"gear\",\n \"gears\",\n \"genderless\",\n \"get-pocket\",\n \"gg\",\n \"gg-circle\",\n \"gift\",\n \"git\",\n \"git-square\",\n \"github\",\n \"github-alt\",\n \"github-square\",\n \"gitlab\",\n \"gittip\",\n \"glass\",\n \"glide\",\n \"glide-g\",\n \"globe\",\n \"google\",\n \"google-plus\",\n \"google-plus-circle\",\n \"google-plus-official\",\n \"google-plus-square\",\n \"google-wallet\",\n \"graduation-cap\",\n \"gratipay\",\n \"grav\",\n \"group\",\n \"h-square\",\n \"hacker-news\",\n \"hand-grab-o\",\n \"hand-lizard-o\",\n \"hand-o-down\",\n \"hand-o-left\",\n \"hand-o-right\",\n \"hand-o-up\",\n \"hand-paper-o\",\n \"hand-peace-o\",\n \"hand-pointer-o\",\n \"hand-rock-o\",\n \"hand-scissors-o\",\n \"hand-spock-o\",\n \"hand-stop-o\",\n \"handshake-o\",\n \"hard-of-hearing\",\n \"hashtag\",\n \"hdd-o\",\n \"header\",\n \"headphones\",\n \"heart\",\n \"heart-o\",\n \"heartbeat\",\n \"history\",\n \"home\",\n \"hospital-o\",\n \"hotel\",\n \"hourglass\",\n \"hourglass-1\",\n \"hourglass-2\",\n \"hourglass-3\",\n \"hourglass-end\",\n \"hourglass-half\",\n \"hourglass-o\",\n \"hourglass-start\",\n \"houzz\",\n \"html5\",\n \"i-cursor\",\n \"id-badge\",\n \"id-card\",\n \"id-card-o\",\n \"ils\",\n \"image\",\n \"imdb\",\n \"inbox\",\n \"indent\",\n \"industry\",\n \"info\",\n \"info-circle\",\n \"inr\",\n \"instagram\",\n \"institution\",\n \"internet-explorer\",\n \"intersex\",\n \"ioxhost\",\n \"italic\",\n \"joomla\",\n \"jpy\",\n \"jsfiddle\",\n \"key\",\n \"keyboard-o\",\n \"krw\",\n \"language\",\n \"laptop\",\n \"lastfm\",\n \"lastfm-square\",\n \"leaf\",\n \"leanpub\",\n \"legal\",\n \"lemon-o\",\n \"level-down\",\n \"level-up\",\n \"life-bouy\",\n \"life-buoy\",\n \"life-ring\",\n \"life-saver\",\n \"lightbulb-o\",\n \"line-chart\",\n \"link\",\n \"linkedin\",\n \"linkedin-square\",\n \"linode\",\n \"linux\",\n \"list\",\n \"list-alt\",\n \"list-ol\",\n \"list-ul\",\n \"location-arrow\",\n \"lock\",\n \"long-arrow-down\",\n \"long-arrow-left\",\n \"long-arrow-right\",\n \"long-arrow-up\",\n \"low-vision\",\n \"magic\",\n \"magnet\",\n \"mail-forward\",\n \"mail-reply\",\n \"mail-reply-all\",\n \"male\",\n \"map\",\n \"map-marker\",\n \"map-o\",\n \"map-pin\",\n \"map-signs\",\n \"mars\",\n \"mars-double\",\n \"mars-stroke\",\n \"mars-stroke-h\",\n \"mars-stroke-v\",\n \"maxcdn\",\n \"meanpath\",\n \"medium\",\n \"medkit\",\n \"meetup\",\n \"meh-o\",\n \"mercury\",\n \"microchip\",\n \"microphone\",\n \"microphone-slash\",\n \"minus\",\n \"minus-circle\",\n \"minus-square\",\n \"minus-square-o\",\n \"mixcloud\",\n \"mobile\",\n \"mobile-phone\",\n \"modx\",\n \"money\",\n \"moon-o\",\n \"mortar-board\",\n \"motorcycle\",\n \"mouse-pointer\",\n \"music\",\n \"navicon\",\n \"neuter\",\n \"newspaper-o\",\n \"object-group\",\n \"object-ungroup\",\n \"odnoklassniki\",\n \"odnoklassniki-square\",\n \"opencart\",\n \"openid\",\n \"opera\",\n \"optin-monster\",\n \"outdent\",\n \"pagelines\",\n \"paint-brush\",\n \"paper-plane\",\n \"paper-plane-o\",\n \"paperclip\",\n \"paragraph\",\n \"paste\",\n \"pause\",\n \"pause-circle\",\n \"pause-circle-o\",\n \"paw\",\n \"paypal\",\n \"pencil\",\n \"pencil-square\",\n \"pencil-square-o\",\n \"percent\",\n \"phone\",\n \"phone-square\",\n \"photo\",\n \"picture-o\",\n \"pie-chart\",\n \"pied-piper\",\n \"pied-piper-alt\",\n \"pied-piper-pp\",\n \"pinterest\",\n \"pinterest-p\",\n \"pinterest-square\",\n \"plane\",\n \"play\",\n \"play-circle\",\n \"play-circle-o\",\n \"plug\",\n \"plus\",\n \"plus-circle\",\n \"plus-square\",\n \"plus-square-o\",\n \"podcast\",\n \"power-off\",\n \"print\",\n \"product-hunt\",\n \"puzzle-piece\",\n \"qq\",\n \"qrcode\",\n \"question\",\n \"question-circle\",\n \"question-circle-o\",\n \"quora\",\n \"quote-left\",\n \"quote-right\",\n \"ra\",\n \"random\",\n \"ravelry\",\n \"rebel\",\n \"recycle\",\n \"reddit\",\n \"reddit-alien\",\n \"reddit-square\",\n \"refresh\",\n \"registered\",\n \"remove\",\n \"renren\",\n \"reorder\",\n \"repeat\",\n \"reply\",\n \"reply-all\",\n \"resistance\",\n \"retweet\",\n \"rmb\",\n \"road\",\n \"rocket\",\n \"rotate-left\",\n \"rotate-right\",\n \"rouble\",\n \"rss\",\n \"rss-square\",\n \"rub\",\n \"ruble\",\n \"rupee\",\n \"s15\",\n \"safari\",\n \"save\",\n \"scissors\",\n \"scribd\",\n \"search\",\n \"search-minus\",\n \"search-plus\",\n \"sellsy\",\n \"send\",\n \"send-o\",\n \"server\",\n \"share\",\n \"share-alt\",\n \"share-alt-square\",\n \"share-square\",\n \"share-square-o\",\n \"shekel\",\n \"sheqel\",\n \"shield\",\n \"ship\",\n \"shirtsinbulk\",\n \"shopping-bag\",\n \"shopping-basket\",\n \"shopping-cart\",\n \"shower\",\n \"sign-in\",\n \"sign-language\",\n \"sign-out\",\n \"signal\",\n \"signing\",\n \"simplybuilt\",\n \"sitemap\",\n \"skyatlas\",\n \"skype\",\n \"slack\",\n \"sliders\",\n \"slideshare\",\n \"smile-o\",\n \"snapchat\",\n \"snapchat-ghost\",\n \"snapchat-square\",\n \"snowflake-o\",\n \"soccer-ball-o\",\n \"sort\",\n \"sort-alpha-asc\",\n \"sort-alpha-desc\",\n \"sort-amount-asc\",\n \"sort-amount-desc\",\n \"sort-asc\",\n \"sort-desc\",\n \"sort-down\",\n \"sort-numeric-asc\",\n \"sort-numeric-desc\",\n \"sort-up\",\n \"soundcloud\",\n \"space-shuttle\",\n \"spinner\",\n \"spoon\",\n \"spotify\",\n \"square\",\n \"square-o\",\n \"stack-exchange\",\n \"stack-overflow\",\n \"star\",\n \"star-half\",\n \"star-half-empty\",\n \"star-half-full\",\n \"star-half-o\",\n \"star-o\",\n \"steam\",\n \"steam-square\",\n \"step-backward\",\n \"step-forward\",\n \"stethoscope\",\n \"sticky-note\",\n \"sticky-note-o\",\n \"stop\",\n \"stop-circle\",\n \"stop-circle-o\",\n \"street-view\",\n \"strikethrough\",\n \"stumbleupon\",\n \"stumbleupon-circle\",\n \"subscript\",\n \"subway\",\n \"suitcase\",\n \"sun-o\",\n \"superpowers\",\n \"superscript\",\n \"support\",\n \"table\",\n \"tablet\",\n \"tachometer\",\n \"tag\",\n \"tags\",\n \"tasks\",\n \"taxi\",\n \"telegram\",\n \"television\",\n \"tencent-weibo\",\n \"terminal\",\n \"text-height\",\n \"text-width\",\n \"th\",\n \"th-large\",\n \"th-list\",\n \"themeisle\",\n \"thermometer\",\n \"thermometer-0\",\n \"thermometer-1\",\n \"thermometer-2\",\n \"thermometer-3\",\n \"thermometer-4\",\n \"thermometer-empty\",\n \"thermometer-full\",\n \"thermometer-half\",\n \"thermometer-quarter\",\n \"thermometer-three-quarters\",\n \"thumb-tack\",\n \"thumbs-down\",\n \"thumbs-o-down\",\n \"thumbs-o-up\",\n \"thumbs-up\",\n \"ticket\",\n \"times\",\n \"times-circle\",\n \"times-circle-o\",\n \"times-rectangle\",\n \"times-rectangle-o\",\n \"tint\",\n \"toggle-down\",\n \"toggle-left\",\n \"toggle-off\",\n \"toggle-on\",\n \"toggle-right\",\n \"toggle-up\",\n \"trademark\",\n \"train\",\n \"transgender\",\n \"transgender-alt\",\n \"trash\",\n \"trash-o\",\n \"tree\",\n \"trello\",\n \"tripadvisor\",\n \"trophy\",\n \"truck\",\n \"try\",\n \"tty\",\n \"tumblr\",\n \"tumblr-square\",\n \"turkish-lira\",\n \"tv\",\n \"twitch\",\n \"twitter\",\n \"twitter-square\",\n \"umbrella\",\n \"underline\",\n \"undo\",\n \"universal-access\",\n \"university\",\n \"unlink\",\n \"unlock\",\n \"unlock-alt\",\n \"unsorted\",\n \"upload\",\n \"usb\",\n \"usd\",\n \"user\",\n \"user-circle\",\n \"user-circle-o\",\n \"user-md\",\n \"user-o\",\n \"user-plus\",\n \"user-secret\",\n \"user-times\",\n \"users\",\n \"vcard\",\n \"vcard-o\",\n \"venus\",\n \"venus-double\",\n \"venus-mars\",\n \"viacoin\",\n \"viadeo\",\n \"viadeo-square\",\n \"video-camera\",\n \"vimeo\",\n \"vimeo-square\",\n \"vine\",\n \"vk\",\n \"volume-control-phone\",\n \"volume-down\",\n \"volume-off\",\n \"volume-up\",\n \"warning\",\n \"wechat\",\n \"weibo\",\n \"weixin\",\n \"whatsapp\",\n \"wheelchair\",\n \"wheelchair-alt\",\n \"wifi\",\n \"wikipedia-w\",\n \"window-close\",\n \"window-close-o\",\n \"window-maximize\",\n \"window-minimize\",\n \"window-restore\",\n \"windows\",\n \"won\",\n \"wordpress\",\n \"wpbeginner\",\n \"wpexplorer\",\n \"wpforms\",\n \"wrench\",\n \"xing\",\n \"xing-square\",\n \"y-combinator\",\n \"y-combinator-square\",\n \"yahoo\",\n \"yc\",\n \"yc-square\",\n \"yelp\",\n \"yen\",\n \"yoast\",\n \"youtube\",\n \"youtube-play\",\n \"youtube-square\",\n ],\n};\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.ImageModule=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\n\\t\\t').replace(/\\t|\\n/g,\"\")},getImageXmlCentered:function getImageXmlCentered(rId,size){return('\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t').replace(/\\t|\\n/g,\"\")},getPptxImageXml:function getPptxImageXml(rId,size,offset){return('\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t').replace(/\\t|\\n/g,\"\")}}},{}],4:[function(require,module,exports){\"use strict\";function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}var memoize=require(\"./memoize\");var DOMParser=require(\"xmldom\").DOMParser;var XMLSerializer=require(\"xmldom\").XMLSerializer;var Errors=require(\"./errors\");var DocUtils={};function parser(tag){return _defineProperty({},\"get\",function get(scope){if(tag===\".\"){return scope}return scope[tag]})}DocUtils.defaults={nullGetter:function nullGetter(part){if(!part.module){return\"undefined\"}if(part.module===\"rawxml\"){return\"\"}return\"\"},parser:memoize(parser),fileType:\"docx\",delimiters:{start:\"{\",end:\"}\"}};DocUtils.mergeObjects=function(){var resObj={};var obj=void 0,keys=void 0;for(var i=0;i\":\">\"};var regexStripRegexp=/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g;DocUtils.escapeRegExp=function(str){return str.replace(regexStripRegexp,\"\\\\$&\")};DocUtils.charMapRegexes=Object.keys(DocUtils.charMap).map(function(endChar){var startChar=DocUtils.charMap[endChar];return{rstart:new RegExp(DocUtils.escapeRegExp(startChar),\"g\"),rend:new RegExp(DocUtils.escapeRegExp(endChar),\"g\"),start:startChar,end:endChar}});DocUtils.wordToUtf8=function(string){var r=void 0;for(var i=0,l=DocUtils.charMapRegexes.length;i\"){return i}}throwXmlTagNotFound({position:\"right\",element:element,parsed:parsed,index:index})};DocUtils.getLeft=function(parsed,element,index){var parts=parsed.slice(0,index);for(var i=parts.length-1;i>=0;i--){var part=parts[i];if(part.value.indexOf(\"<\"+element)===0&&[\">\",\" \"].indexOf(part.value[element.length+1])!==-1){return i}}throwXmlTagNotFound({position:\"left\",element:element,parsed:parsed,index:index})};module.exports=DocUtils;DocUtils.traits=require(\"./traits\");DocUtils.moduleWrapper=require(\"./module-wrapper\")},{\"./errors\":6,\"./memoize\":9,\"./module-wrapper\":11,\"./traits\":20,xmldom:23}],5:[function(require,module,exports){\"use strict\";var _createClass=function(){function defineProperties(target,props){for(var i=0;i0){throw new Error(\"The constructor with parameters have been removed in docxtemplater 3.0, please check the upgrade guide.\")}this.compiled={};this.modules=[];this.setOptions({})}_createClass(Docxtemplater,[{key:\"attachModule\",value:function attachModule(module){this.modules.push(wrapper(module));return this}},{key:\"setOptions\",value:function setOptions(options){var _this=this;this.options=options;Object.keys(DocUtils.defaults).forEach(function(key){var defaultValue=DocUtils.defaults[key];_this[key]=_this.options[key]!=null?_this.options[key]:defaultValue});if(this.fileType===\"docx\"||this.fileType===\"pptx\"){this.fileTypeConfig=Docxtemplater.FileTypeConfig[this.fileType]}this.fileTypeConfig=this.options.fileTypeConfig||this.fileTypeConfig;this.options.xmlFileNames=[];return this}},{key:\"loadZip\",value:function loadZip(zip){if(zip.loadAsync){throw new Error(\"Docxtemplater doesn't handle JSZip version >=3, see changelog\")}this.zip=zip;return this}},{key:\"compileFile\",value:function compileFile(fileName){var currentFile=this.createTemplateClass(fileName);currentFile.parse();this.compiled[fileName]=currentFile}},{key:\"compile\",value:function compile(){this.templatedFiles=this.fileTypeConfig.getTemplatedFiles(this.zip)}},{key:\"render\",value:function render(){var _this2=this;this.modules=this.fileTypeConfig.baseModules.map(function(moduleFunction){return moduleFunction()}).concat(this.modules);this.options=this.modules.reduce(function(options,module){return module.optionsTransformer(options,_this2)},this.options);this.xmlDocuments=this.options.xmlFileNames.reduce(function(xmlDocuments,fileName){var content=_this2.zip.files[fileName].asText();xmlDocuments[fileName]=DocUtils.str2xml(content);return xmlDocuments},{});this.modules.forEach(function(module){module.set({zip:_this2.zip,xmlDocuments:_this2.xmlDocuments,data:_this2.data})});this.compile();this.modules.forEach(function(module){module.set({compiled:_this2.compiled})});this.templatedFiles.forEach(function(fileName){if(_this2.zip.files[fileName]!=null){_this2.compileFile(fileName)}});this.mapper=this.modules.reduce(function(value,module){return module.getRenderedMap(value)},{});Object.keys(this.mapper).forEach(function(to){var mapped=_this2.mapper[to];var from=mapped.from;var currentFile=_this2.compiled[from];currentFile.setTags(mapped.data);currentFile.render();_this2.zip.file(to,currentFile.content)});Object.keys(this.xmlDocuments).forEach(function(fileName){_this2.zip.remove(fileName);var content=DocUtils.encodeUtf8(DocUtils.xml2str(_this2.xmlDocuments[fileName]));return _this2.zip.file(fileName,content,{})});return this}},{key:\"setData\",value:function setData(data){this.data=data;return this}},{key:\"getZip\",value:function getZip(){return this.zip}},{key:\"createTemplateClass\",value:function createTemplateClass(path){var usedData=this.zip.files[path].asText();return this.createTemplateClassFromContent(usedData,path)}},{key:\"createTemplateClassFromContent\",value:function createTemplateClassFromContent(content,filePath){var _this3=this;var xmltOptions={filePath:filePath};Object.keys(DocUtils.defaults).forEach(function(key){xmltOptions[key]=_this3[key]});xmltOptions.fileTypeConfig=this.fileTypeConfig;xmltOptions.modules=this.modules;return new Docxtemplater.XmlTemplater(content,xmltOptions)}},{key:\"getFullText\",value:function getFullText(path){return this.createTemplateClass(path||this.fileTypeConfig.textPath).getFullText()}},{key:\"getTemplatedFiles\",value:function getTemplatedFiles(){this.compile();return this.templatedFiles}}]);return Docxtemplater}();Docxtemplater.DocUtils=require(\"./doc-utils\");Docxtemplater.Errors=require(\"./errors\");Docxtemplater.XmlTemplater=require(\"./xml-templater\");Docxtemplater.FileTypeConfig=require(\"./file-type-config\");Docxtemplater.XmlMatcher=require(\"./xml-matcher\");module.exports=Docxtemplater},{\"./doc-utils\":4,\"./errors\":6,\"./file-type-config\":7,\"./xml-matcher\":21,\"./xml-templater\":22}],6:[function(require,module,exports){\"use strict\";function XTError(message){this.name=\"GenericError\";this.message=message;this.stack=new Error(message).stack}XTError.prototype=Error.prototype;function XTTemplateError(message){this.name=\"TemplateError\";this.message=message;this.stack=new Error(message).stack}XTTemplateError.prototype=new XTError;function XTScopeParserError(message){this.name=\"ScopeParserError\";this.message=message;this.stack=new Error(message).stack}XTScopeParserError.prototype=new XTError;function XTInternalError(message){this.name=\"InternalError\";this.properties={explanation:\"InternalError\"};this.message=message;this.stack=new Error(message).stack}XTInternalError.prototype=new XTError;module.exports={XTError:XTError,XTTemplateError:XTTemplateError,XTInternalError:XTInternalError,XTScopeParserError:XTScopeParserError}},{}],7:[function(require,module,exports){\"use strict\";var loopModule=require(\"./modules/loop\");var spacePreserveModule=require(\"./modules/space-preserve\");var rawXmlModule=require(\"./modules/rawxml\");var expandPairTrait=require(\"./modules/expand-pair-trait\");var render=require(\"./modules/render\");var PptXFileTypeConfig={getTemplatedFiles:function getTemplatedFiles(zip){var slideTemplates=zip.file(/ppt\\/(slides|slideMasters)\\/(slide|slideMaster)\\d+\\.xml/).map(function(file){return file.name});return slideTemplates.concat([\"ppt/presentation.xml\"])},textPath:\"ppt/slides/slide1.xml\",tagsXmlTextArray:[\"a:t\",\"m:t\"],tagsXmlLexedArray:[\"p:sp\",\"a:tc\",\"a:tr\",\"a:table\",\"a:p\",\"a:r\"],tagRawXml:\"p:sp\",tagTextXml:\"a:t\",baseModules:[render,expandPairTrait,rawXmlModule,loopModule]};var DocXFileTypeConfig={getTemplatedFiles:function getTemplatedFiles(zip){var slideTemplates=zip.file(/word\\/(header|footer)\\d+\\.xml/).map(function(file){return file.name});return slideTemplates.concat([\"word/document.xml\"])},textPath:\"word/document.xml\",tagsXmlTextArray:[\"w:t\",\"m:t\"],tagsXmlLexedArray:[\"w:tc\",\"w:tr\",\"w:table\",\"w:p\",\"w:r\"],tagRawXml:\"w:p\",tagTextXml:\"w:t\",baseModules:[render,spacePreserveModule,expandPairTrait,rawXmlModule,loopModule]};module.exports={docx:DocXFileTypeConfig,pptx:PptXFileTypeConfig}},{\"./modules/expand-pair-trait\":12,\"./modules/loop\":13,\"./modules/rawxml\":14,\"./modules/render\":15,\"./modules/space-preserve\":16}],8:[function(require,module,exports){\"use strict\";var Errors=require(\"./errors\");var DocUtils=require(\"./doc-utils\");function inRange(range,match){return range[0]<=match.offset&&match.offset\",cursor);var tagText=content.slice(offset,cursor+1);var _getTag=getTag(tagText),tag=_getTag.tag,position=_getTag.position;var text=allMatches[tag];if(text==null){continue}totalMatches.push({type:\"tag\",position:position,text:text,offset:offset,value:tagText})}return totalMatches}function throwUnopenedTagException(options){var err=new Errors.XTTemplateError(\"Unopened tag\");err.properties={xtag:options.xtag.split(\" \")[0],id:\"unopened_tag\",context:options.xtag,explanation:\"The tag beginning with '\"+options.xtag.substr(0,10)+\"' is unclosed\"};throw err}function throwUnclosedTagException(options){var err=new Errors.XTTemplateError(\"Unclosed tag\");err.properties={xtag:options.xtag.split(\" \")[0].substr(1),id:\"unclosed_tag\",context:options.xtag,explanation:\"The tag beginning with '\"+options.xtag.substr(0,10)+\"' is unclosed\"};throw err}function assertDelimiterOrdered(delimiterMatches,fullText){var inDelimiter=false;var lastDelimiterMatch={offset:0};var xtag=void 0;delimiterMatches.forEach(function(delimiterMatch){xtag=fullText.substr(lastDelimiterMatch.offset,delimiterMatch.offset-lastDelimiterMatch.offset);if(delimiterMatch.position===\"start\"&&inDelimiter||delimiterMatch.position===\"end\"&&!inDelimiter){if(delimiterMatch.position===\"start\"){throwUnclosedTagException({xtag:xtag})}else{throwUnopenedTagException({xtag:xtag})}}inDelimiter=!inDelimiter;lastDelimiterMatch=delimiterMatch});var delimiterMatch={offset:fullText.length};xtag=fullText.substr(lastDelimiterMatch.offset,delimiterMatch.offset-lastDelimiterMatch.offset);if(inDelimiter){throwUnclosedTagException({xtag:xtag})}}function getAllIndexes(arr,val,position){var indexes=[];var offset=-1;do{offset=arr.indexOf(val,offset+1);if(offset!==-1){indexes.push({offset:offset,position:position})}}while(offset!==-1);return indexes}function Reader(innerContentParts){var _this=this;this.innerContentParts=innerContentParts;this.full=\"\";this.parseDelimiters=function(delimiters){_this.full=_this.innerContentParts.join(\"\");var offset=0;_this.ranges=_this.innerContentParts.map(function(part){offset+=part.length;return offset-part.length});var delimiterMatches=DocUtils.concatArrays([getAllIndexes(_this.full,delimiters.start,\"start\"),getAllIndexes(_this.full,delimiters.end,\"end\")]).sort(offsetSort);assertDelimiterOrdered(delimiterMatches,_this.full);var delimiterLength={start:delimiters.start.length,end:delimiters.end.length};var cutNext=0;var delimiterIndex=0;_this.parsed=_this.ranges.map(function(offset,i){var range=[offset,offset+this.innerContentParts[i].length];var partContent=this.innerContentParts[i];var delimitersInOffset=[];while(delimiterIndex0){cursor=cutNext;cutNext=0}delimitersInOffset.forEach(function(delimiterInOffset){var value=partContent.substr(cursor,delimiterInOffset.offset-offset-cursor);if(value.length>0){parts.push({type:\"content\",value:value})}parts.push({type:\"delimiter\",position:delimiterInOffset.position});cursor=delimiterInOffset.offset-offset+delimiterLength[delimiterInOffset.position]});cutNext=cursor-partContent.length;var value=partContent.substr(cursor);if(value.length>0){parts.push({type:\"content\",value:value})}return parts},_this)}}module.exports={parse:function parse(xmlparsed,delimiters){var inTextTag=false;var innerContentParts=[];xmlparsed.forEach(function(part){inTextTag=updateInTextTag(part,inTextTag);if(inTextTag&&part.type===\"content\"){innerContentParts.push(part.value)}});var reader=new Reader(innerContentParts);reader.parseDelimiters(delimiters);var newArray=[];var index=0;xmlparsed.forEach(function(part){inTextTag=updateInTextTag(part,inTextTag);if(part.type===\"content\"){part.position=inTextTag?\"insidetag\":\"outsidetag\"}if(inTextTag&&part.type===\"content\"){Array.prototype.push.apply(newArray,reader.parsed[index].map(function(p){if(p.type===\"content\"){p.position=\"insidetag\"}return p}));index++}else{newArray.push(part)}});return newArray},xmlparse:function xmlparse(content,xmltags){var matches=tagMatcher(content,xmltags.text,xmltags.other);var cursor=0;var parsed=matches.reduce(function(parsed,match){var value=content.substr(cursor,match.offset-cursor);if(value.length>0){parsed.push({type:\"content\",value:value})}cursor=match.offset+match.value.length;delete match.offset;if(match.value.length>0){parsed.push(match)}return parsed},[]);var value=content.substr(cursor);if(value.length>0){parsed.push({type:\"content\",value:value})}return parsed}}},{\"./doc-utils\":4,\"./errors\":6}],9:[function(require,module,exports){\"use strict\";function memoize(func){var stringifyJson=JSON.stringify,cache={};function cachedfun(){var hash=stringifyJson(arguments);return hash in cache?cache[hash]:cache[hash]=func.apply(this,arguments)}return cachedfun}module.exports=memoize},{}],10:[function(require,module,exports){\"use strict\";function getMinFromArrays(arrays,state){var minIndex=-1;for(var i=0,l=arrays.length;i=arrays[i].length){continue}if(minIndex===-1||arrays[i][state[i]].offset0});var resultArray=new Array(totalLength);var state=arrays.map(function(){return 0});var i=0;while(i<=totalLength-1){var arrayIndex=getMinFromArrays(arrays,state);resultArray[i]=arrays[arrayIndex][state[arrayIndex]];state[arrayIndex]++;i++}return resultArray}},{}],11:[function(require,module,exports){\"use strict\";function emptyFun(){}function identity(i){return i}module.exports=function(module){var defaults={set:emptyFun,parse:emptyFun,render:emptyFun,getTraits:emptyFun,optionsTransformer:identity,getRenderedMap:identity,postparse:identity};if(Object.keys(defaults).every(function(key){return!module[key]})){throw new Error(\"This module cannot be wrapped, because it doesn't define any of the necessary functions\")}Object.keys(defaults).forEach(function(key){module[key]=module[key]||defaults[key]});return module}},{}],12:[function(require,module,exports){\"use strict\";var traitName=\"expandPair\";var mergeSort=require(\"../mergesort\");var DocUtils=require(\"../doc-utils\");var wrapper=require(\"../module-wrapper\");var _require=require(\"../traits\"),getExpandToDefault=_require.getExpandToDefault;var Errors=require(\"../errors\");function throwUnmatchedLoopException(options){var location=options.location;var t=location===\"start\"?\"unclosed\":\"unopened\";var T=location===\"start\"?\"Unclosed\":\"Unopened\";var err=new Errors.XTTemplateError(T+\" loop\");var tag=options.part.value;err.properties={id:t+\"_loop\",explanation:\"The loop with tag \"+tag+\" is \"+t,xtag:tag};throw err}function throwClosingTagNotMatchOpeningTag(options){var tags=options.tags;var err=new Errors.XTTemplateError(\"Closing tag does not match opening tag\");err.properties={id:\"closing_tag_does_not_match_opening_tag\",explanation:'The tag \"'+tags[0].value+'\" is closed by the tag \"'+tags[1].value+'\"',openingtag:tags[0].value,closingtag:tags[1].value};throw err}function getOpenCountChange(part){switch(part.location){case\"start\":return 1;case\"end\":return-1;default:throw new Error(\"Location should be one of 'start' or 'end' (given : \"+part.location+\")\")}}function getPairs(traits){if(traits.length===0){return[]}var countOpen=1;var firstTrait=traits[0];for(var i=1;i\"){inChunk=true}if(inChunk){if(part.type===\"placeholder\"&&!part.module){chunk[0].value=''}chunk.push(part)}else{parsed.push(part)}if(part.type===\"tag\"&&part.position===\"end\"&&part.text&&part.value===\"\"){Array.prototype.push.apply(parsed,chunk);inChunk=false;chunk=[]}return parsed},[]);Array.prototype.push.apply(result,chunk);return result}};module.exports=function(){return wrapper(spacePreserve)}},{\"../module-wrapper\":11}],17:[function(require,module,exports){\"use strict\";var DocUtils=require(\"./doc-utils\");var parser={postparse:function postparse(parsed,modules){function getTraits(traitName,parsed){return modules.map(function(module){return module.getTraits(traitName,parsed)})}function postparse(parsed){return modules.reduce(function(parsed,module){return module.postparse(parsed,{postparse:postparse,getTraits:getTraits})},parsed)}return postparse(parsed)},parse:function parse(lexed,modules){function moduleParse(placeHolderContent,parsed){var moduleParsed=void 0;for(var i=0,l=modules.length;i0){return this.getValue(tag,this.num-1)}return result}},{key:\"createSubScopeManager\",value:function createSubScopeManager(scope,tag){var options={scopePath:this.scopePath.slice(0),scopeList:this.scopeList.slice(0)};options.parser=this.parser;options.scopeList=this.scopeList.concat(scope);options.scopePath=this.scopePath.concat(tag);return new ScopeManager(options)}}]);return ScopeManager}();ScopeManager.createBaseScopeManager=function(_ref){var parser=_ref.parser,tags=_ref.tags;var options={parser:parser,tags:tags};options.scopePath=[];options.scopeList=[tags];return new ScopeManager(options)};module.exports=ScopeManager},{\"./errors\":6}],20:[function(require,module,exports){\"use strict\";var DocUtils=require(\"./doc-utils\");var Errors=require(\"./errors\");function throwRawTagNotInParagraph(options){var err=new Errors.XTTemplateError(\"Raw tag not in paragraph\");var tag=options.part.value;err.properties={id:\"raw_tag_outerxml_invalid\",explanation:'The tag \"'+tag+'\"',rootError:options.rootError,xtag:tag};throw err}function lastTagIsOpenTag(array,tag){if(array.length===0){return false}var lastTag=array[array.length-1];var innerLastTag=lastTag.tag.substr(1);var innerCurrentTag=tag.substr(2,tag.length-3);return innerLastTag.indexOf(innerCurrentTag)===0}function addTag(array,tag){array.push({tag:tag});return array}function getListXmlElements(parts){var tags=parts.filter(function(part){return part.type===\"tag\"}).map(function(part){return part.value});var result=[];for(var i=0,tag;i\")===-1){res.content.replace(/^()([^<>]*)$/,replacerUnshift)}var r=new RegExp(\"^()([^<]+)\");res.content.replace(r,replacerUnshift);function replacerPush(){var pn={array:Array.prototype.slice.call(arguments)};pn.array.pop();var offset=pn.array.pop();pn.offset=offset;pn.last=true;res.matches.push(pn);res.charactersAdded.push(0);return res.charactersAddedCumulative.push(0)}r=new RegExp(\"(<(?:\"+res.tagsXmlArrayJoined+\")[^>]*>)([^>]+)$\");res.content.replace(r,replacerPush);return res}function xmlMatcher(content,tagsXmlArray){var res={};res.content=content;res.tagsXmlArray=tagsXmlArray;res.tagsXmlArrayJoined=res.tagsXmlArray.join(\"|\");var regexp=new RegExp(\"(<(?:\"+res.tagsXmlArrayJoined+\")[^>]*>)([^<>]*)\",\"g\");res.matches=DocUtils.pregMatchAll(regexp,res.content);res.charactersAddedCumulative=res.matches.map(function(){return 0});res.charactersAdded=res.matches.map(function(){return 0});return handleRecursiveCase(res)}var memoized=memoize(xmlMatcher);module.exports=function(content,tagsXmlArray){return DocUtils.cloneDeep(memoized(content,tagsXmlArray))}},{\"./doc-utils\":4,\"./memoize\":9}],22:[function(require,module,exports){\"use strict\";var _createClass=function(){function defineProperties(target,props){for(var i=0;i\",amp:\"&\",quot:'\"',apos:\"'\"};if(locator){domBuilder.setDocumentLocator(locator)}sax.errorHandler=buildErrorHandler(errorHandler,domBuilder,locator);sax.domBuilder=options.domBuilder||domBuilder;if(/\\/x?html?$/.test(mimeType)){entityMap.nbsp=\" \";entityMap.copy=\"©\";defaultNSMap[\"\"]=\"http://www.w3.org/1999/xhtml\"}defaultNSMap.xml=defaultNSMap.xml||\"http://www.w3.org/XML/1998/namespace\";if(source){sax.parse(source,defaultNSMap,entityMap)}else{sax.errorHandler.error(\"invalid doc source\")}return domBuilder.doc};function buildErrorHandler(errorImpl,domBuilder,locator){if(!errorImpl){if(domBuilder instanceof DOMHandler){return domBuilder}errorImpl=domBuilder}var errorHandler={};var isCallback=errorImpl instanceof Function;locator=locator||{};function build(key){var fn=errorImpl[key];if(!fn&&isCallback){fn=errorImpl.length==2?function(msg){errorImpl(key,msg)}:errorImpl}errorHandler[key]=fn&&function(msg){fn(\"[xmldom \"+key+\"]\\t\"+msg+_locator(locator))}||function(){}}build(\"warning\");build(\"error\");build(\"fatalError\");return errorHandler}function DOMHandler(){this.cdata=false}function position(locator,node){node.lineNumber=locator.lineNumber;node.columnNumber=locator.columnNumber}DOMHandler.prototype={startDocument:function(){this.doc=(new DOMImplementation).createDocument(null,null,null);if(this.locator){this.doc.documentURI=this.locator.systemId}},startElement:function(namespaceURI,localName,qName,attrs){var doc=this.doc;var el=doc.createElementNS(namespaceURI,qName||localName);var len=attrs.length;appendElement(this,el);this.currentElement=el;this.locator&&position(this.locator,el);for(var i=0;i=start+length||start){return new java.lang.String(chars,start,length)+\"\"}return chars}}\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){DOMHandler.prototype[key]=function(){return null}});function appendElement(hander,node){if(!hander.currentElement){hander.doc.appendChild(node)}else{hander.currentElement.appendChild(node)}}var XMLReader=require(\"./sax\").XMLReader;var DOMImplementation=exports.DOMImplementation=require(\"./dom\").DOMImplementation;exports.XMLSerializer=require(\"./dom\").XMLSerializer;exports.DOMParser=DOMParser},{\"./dom\":24,\"./sax\":25}],24:[function(require,module,exports){function copy(src,dest){for(var p in src){dest[p]=src[p]}}function _extends(Class,Super){var pt=Class.prototype;if(Object.create){var ppt=Object.create(Super.prototype);pt.__proto__=ppt}if(!(pt instanceof Super)){function t(){}t.prototype=Super.prototype;t=new t;copy(pt,t);Class.prototype=pt=t}if(pt.constructor!=Class){if(typeof Class!=\"function\"){console.error(\"unknow Class:\"+Class)}pt.constructor=Class}}var htmlns=\"http://www.w3.org/1999/xhtml\";var NodeType={};var ELEMENT_NODE=NodeType.ELEMENT_NODE=1;var ATTRIBUTE_NODE=NodeType.ATTRIBUTE_NODE=2;var TEXT_NODE=NodeType.TEXT_NODE=3;var CDATA_SECTION_NODE=NodeType.CDATA_SECTION_NODE=4;var ENTITY_REFERENCE_NODE=NodeType.ENTITY_REFERENCE_NODE=5;var ENTITY_NODE=NodeType.ENTITY_NODE=6;var PROCESSING_INSTRUCTION_NODE=NodeType.PROCESSING_INSTRUCTION_NODE=7;var COMMENT_NODE=NodeType.COMMENT_NODE=8;var DOCUMENT_NODE=NodeType.DOCUMENT_NODE=9;var DOCUMENT_TYPE_NODE=NodeType.DOCUMENT_TYPE_NODE=10;var DOCUMENT_FRAGMENT_NODE=NodeType.DOCUMENT_FRAGMENT_NODE=11;var NOTATION_NODE=NodeType.NOTATION_NODE=12;var ExceptionCode={};var ExceptionMessage={};var INDEX_SIZE_ERR=ExceptionCode.INDEX_SIZE_ERR=(ExceptionMessage[1]=\"Index size error\",1);var DOMSTRING_SIZE_ERR=ExceptionCode.DOMSTRING_SIZE_ERR=(ExceptionMessage[2]=\"DOMString size error\",2);var HIERARCHY_REQUEST_ERR=ExceptionCode.HIERARCHY_REQUEST_ERR=(ExceptionMessage[3]=\"Hierarchy request error\",3);var WRONG_DOCUMENT_ERR=ExceptionCode.WRONG_DOCUMENT_ERR=(ExceptionMessage[4]=\"Wrong document\",4);var INVALID_CHARACTER_ERR=ExceptionCode.INVALID_CHARACTER_ERR=(ExceptionMessage[5]=\"Invalid character\",5);var NO_DATA_ALLOWED_ERR=ExceptionCode.NO_DATA_ALLOWED_ERR=(ExceptionMessage[6]=\"No data allowed\",6);var NO_MODIFICATION_ALLOWED_ERR=ExceptionCode.NO_MODIFICATION_ALLOWED_ERR=(ExceptionMessage[7]=\"No modification allowed\",7);var NOT_FOUND_ERR=ExceptionCode.NOT_FOUND_ERR=(ExceptionMessage[8]=\"Not found\",8);var NOT_SUPPORTED_ERR=ExceptionCode.NOT_SUPPORTED_ERR=(ExceptionMessage[9]=\"Not supported\",9);var INUSE_ATTRIBUTE_ERR=ExceptionCode.INUSE_ATTRIBUTE_ERR=(ExceptionMessage[10]=\"Attribute in use\",10);var INVALID_STATE_ERR=ExceptionCode.INVALID_STATE_ERR=(ExceptionMessage[11]=\"Invalid state\",11);var SYNTAX_ERR=ExceptionCode.SYNTAX_ERR=(ExceptionMessage[12]=\"Syntax error\",12);var INVALID_MODIFICATION_ERR=ExceptionCode.INVALID_MODIFICATION_ERR=(ExceptionMessage[13]=\"Invalid modification\",13);var NAMESPACE_ERR=ExceptionCode.NAMESPACE_ERR=(ExceptionMessage[14]=\"Invalid namespace\",14);var INVALID_ACCESS_ERR=ExceptionCode.INVALID_ACCESS_ERR=(ExceptionMessage[15]=\"Invalid access\",15);function DOMException(code,message){if(message instanceof Error){var error=message}else{error=this;Error.call(this,ExceptionMessage[code]);this.message=ExceptionMessage[code];if(Error.captureStackTrace)Error.captureStackTrace(this,DOMException)}error.code=code;if(message)this.message=this.message+\": \"+message;return error}DOMException.prototype=Error.prototype;copy(ExceptionCode,DOMException);function NodeList(){}NodeList.prototype={length:0,item:function(index){return this[index]||null},toString:function(isHTML,nodeFilter){for(var buf=[],i=0;i=0){var lastIndex=list.length-1;while(i0},lookupPrefix:function(namespaceURI){var el=this;while(el){var map=el._nsMap;if(map){for(var n in map){if(map[n]==namespaceURI){return n}}}el=el.nodeType==ATTRIBUTE_NODE?el.ownerDocument:el.parentNode}return null},lookupNamespaceURI:function(prefix){var el=this;while(el){var map=el._nsMap;if(map){if(prefix in map){return map[prefix]}}el=el.nodeType==ATTRIBUTE_NODE?el.ownerDocument:el.parentNode}return null},isDefaultNamespace:function(namespaceURI){var prefix=this.lookupPrefix(namespaceURI);return prefix==null}};function _xmlEncoder(c){return c==\"<\"&&\"<\"||c==\">\"&&\">\"||c==\"&\"&&\"&\"||c=='\"'&&\""\"||\"&#\"+c.charCodeAt()+\";\"}copy(NodeType,Node);copy(NodeType,Node.prototype);function _visitNode(node,callback){if(callback(node)){return true}if(node=node.firstChild){do{if(_visitNode(node,callback)){return true}}while(node=node.nextSibling)}}function Document(){}function _onAddAttribute(doc,el,newAttr){doc&&doc._inc++;var ns=newAttr.namespaceURI;if(ns==\"http://www.w3.org/2000/xmlns/\"){el._nsMap[newAttr.prefix?newAttr.localName:\"\"]=newAttr.value}}function _onRemoveAttribute(doc,el,newAttr,remove){doc&&doc._inc++;var ns=newAttr.namespaceURI;if(ns==\"http://www.w3.org/2000/xmlns/\"){delete el._nsMap[newAttr.prefix?newAttr.localName:\"\"]}}function _onUpdateChild(doc,el,newChild){if(doc&&doc._inc){doc._inc++;var cs=el.childNodes;if(newChild){cs[cs.length++]=newChild}else{var child=el.firstChild;var i=0;while(child){cs[i++]=child;child=child.nextSibling}cs.length=i}}}function _removeChild(parentNode,child){var previous=child.previousSibling;var next=child.nextSibling;if(previous){previous.nextSibling=next}else{parentNode.firstChild=next}if(next){next.previousSibling=previous}else{parentNode.lastChild=previous}_onUpdateChild(parentNode.ownerDocument,parentNode);return child}function _insertBefore(parentNode,newChild,nextChild){var cp=newChild.parentNode;if(cp){cp.removeChild(newChild)}if(newChild.nodeType===DOCUMENT_FRAGMENT_NODE){var newFirst=newChild.firstChild;if(newFirst==null){return newChild}var newLast=newChild.lastChild}else{newFirst=newLast=newChild}var pre=nextChild?nextChild.previousSibling:parentNode.lastChild;newFirst.previousSibling=pre;newLast.nextSibling=nextChild;if(pre){pre.nextSibling=newFirst}else{parentNode.firstChild=newFirst}if(nextChild==null){parentNode.lastChild=newLast}else{nextChild.previousSibling=newLast}do{newFirst.parentNode=parentNode}while(newFirst!==newLast&&(newFirst=newFirst.nextSibling));_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);if(newChild.nodeType==DOCUMENT_FRAGMENT_NODE){newChild.firstChild=newChild.lastChild=null}return newChild}function _appendSingleChild(parentNode,newChild){var cp=newChild.parentNode;if(cp){var pre=parentNode.lastChild;cp.removeChild(newChild);var pre=parentNode.lastChild}var pre=parentNode.lastChild;newChild.parentNode=parentNode;newChild.previousSibling=pre;newChild.nextSibling=null;if(pre){pre.nextSibling=newChild}else{parentNode.firstChild=newChild}parentNode.lastChild=newChild;_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);return newChild}Document.prototype={nodeName:\"#document\",nodeType:DOCUMENT_NODE,doctype:null,documentElement:null,_inc:1,insertBefore:function(newChild,refChild){if(newChild.nodeType==DOCUMENT_FRAGMENT_NODE){var child=newChild.firstChild;while(child){var next=child.nextSibling;this.insertBefore(child,refChild);child=next}return newChild}if(this.documentElement==null&&newChild.nodeType==ELEMENT_NODE){this.documentElement=newChild}return _insertBefore(this,newChild,refChild),newChild.ownerDocument=this,newChild},removeChild:function(oldChild){if(this.documentElement==oldChild){this.documentElement=null}return _removeChild(this,oldChild)},importNode:function(importedNode,deep){return importNode(this,importedNode,deep)},getElementById:function(id){var rtv=null;_visitNode(this.documentElement,function(node){if(node.nodeType==ELEMENT_NODE){if(node.getAttribute(\"id\")==id){rtv=node;return true}}});return rtv},createElement:function(tagName){var node=new Element;node.ownerDocument=this;node.nodeName=tagName;node.tagName=tagName;node.childNodes=new NodeList;var attrs=node.attributes=new NamedNodeMap;attrs._ownerElement=node;return node},createDocumentFragment:function(){var node=new DocumentFragment;node.ownerDocument=this;node.childNodes=new NodeList;return node},createTextNode:function(data){var node=new Text;node.ownerDocument=this;node.appendData(data);return node},createComment:function(data){var node=new Comment;node.ownerDocument=this;node.appendData(data);return node},createCDATASection:function(data){var node=new CDATASection;node.ownerDocument=this;node.appendData(data);return node},createProcessingInstruction:function(target,data){var node=new ProcessingInstruction;node.ownerDocument=this;node.tagName=node.target=target;node.nodeValue=node.data=data;return node},createAttribute:function(name){var node=new Attr;node.ownerDocument=this;node.name=name;node.nodeName=name;node.localName=name;node.specified=true;return node},createEntityReference:function(name){var node=new EntityReference;node.ownerDocument=this;node.nodeName=name;return node},createElementNS:function(namespaceURI,qualifiedName){var node=new Element;var pl=qualifiedName.split(\":\");var attrs=node.attributes=new NamedNodeMap;node.childNodes=new NodeList;node.ownerDocument=this;node.nodeName=qualifiedName;node.tagName=qualifiedName;node.namespaceURI=namespaceURI;if(pl.length==2){node.prefix=pl[0];node.localName=pl[1]}else{node.localName=qualifiedName}attrs._ownerElement=node;return node},createAttributeNS:function(namespaceURI,qualifiedName){var node=new Attr;var pl=qualifiedName.split(\":\");node.ownerDocument=this;node.nodeName=qualifiedName;node.name=qualifiedName;node.namespaceURI=namespaceURI;node.specified=true;if(pl.length==2){node.prefix=pl[0];node.localName=pl[1]}else{node.localName=qualifiedName}return node}};_extends(Document,Node);function Element(){this._nsMap={}}Element.prototype={nodeType:ELEMENT_NODE,hasAttribute:function(name){return this.getAttributeNode(name)!=null},getAttribute:function(name){var attr=this.getAttributeNode(name);return attr&&attr.value||\"\"},getAttributeNode:function(name){return this.attributes.getNamedItem(name)},setAttribute:function(name,value){var attr=this.ownerDocument.createAttribute(name);attr.value=attr.nodeValue=\"\"+value;this.setAttributeNode(attr)},removeAttribute:function(name){var attr=this.getAttributeNode(name);attr&&this.removeAttributeNode(attr)},appendChild:function(newChild){if(newChild.nodeType===DOCUMENT_FRAGMENT_NODE){return this.insertBefore(newChild,null)}else{return _appendSingleChild(this,newChild)}},setAttributeNode:function(newAttr){return this.attributes.setNamedItem(newAttr)},setAttributeNodeNS:function(newAttr){return this.attributes.setNamedItemNS(newAttr)},removeAttributeNode:function(oldAttr){return this.attributes.removeNamedItem(oldAttr.nodeName)},removeAttributeNS:function(namespaceURI,localName){var old=this.getAttributeNodeNS(namespaceURI,localName);old&&this.removeAttributeNode(old)},hasAttributeNS:function(namespaceURI,localName){return this.getAttributeNodeNS(namespaceURI,localName)!=null},getAttributeNS:function(namespaceURI,localName){var attr=this.getAttributeNodeNS(namespaceURI,localName);return attr&&attr.value||\"\"},setAttributeNS:function(namespaceURI,qualifiedName,value){var attr=this.ownerDocument.createAttributeNS(namespaceURI,qualifiedName);attr.value=attr.nodeValue=\"\"+value;this.setAttributeNode(attr)},getAttributeNodeNS:function(namespaceURI,localName){return this.attributes.getNamedItemNS(namespaceURI,localName)},getElementsByTagName:function(tagName){return new LiveNodeList(this,function(base){var ls=[];_visitNode(base,function(node){if(node!==base&&node.nodeType==ELEMENT_NODE&&(tagName===\"*\"||node.tagName==tagName)){ls.push(node)}});return ls})},getElementsByTagNameNS:function(namespaceURI,localName){return new LiveNodeList(this,function(base){var ls=[];_visitNode(base,function(node){if(node!==base&&node.nodeType===ELEMENT_NODE&&(namespaceURI===\"*\"||node.namespaceURI===namespaceURI)&&(localName===\"*\"||node.localName==localName)){ls.push(node)}});return ls})}};Document.prototype.getElementsByTagName=Element.prototype.getElementsByTagName;Document.prototype.getElementsByTagNameNS=Element.prototype.getElementsByTagNameNS;_extends(Element,Node);function Attr(){}Attr.prototype.nodeType=ATTRIBUTE_NODE;_extends(Attr,Node);function CharacterData(){}CharacterData.prototype={data:\"\",substringData:function(offset,count){return this.data.substring(offset,offset+count)},appendData:function(text){text=this.data+text;this.nodeValue=this.data=text;this.length=text.length},insertData:function(offset,text){this.replaceData(offset,0,text)},appendChild:function(newChild){throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])},deleteData:function(offset,count){this.replaceData(offset,count,\"\")},replaceData:function(offset,count,text){var start=this.data.substring(0,offset);var end=this.data.substring(offset+count);text=start+text+end;this.nodeValue=this.data=text;this.length=text.length}};_extends(CharacterData,Node);function Text(){}Text.prototype={nodeName:\"#text\",nodeType:TEXT_NODE,splitText:function(offset){var text=this.data;var newText=text.substring(offset);text=text.substring(0,offset);this.data=this.nodeValue=text;this.length=text.length;var newNode=this.ownerDocument.createTextNode(newText);if(this.parentNode){this.parentNode.insertBefore(newNode,this.nextSibling)}return newNode}};_extends(Text,CharacterData);function Comment(){}Comment.prototype={nodeName:\"#comment\",nodeType:COMMENT_NODE};_extends(Comment,CharacterData);function CDATASection(){}CDATASection.prototype={nodeName:\"#cdata-section\",nodeType:CDATA_SECTION_NODE};_extends(CDATASection,CharacterData);function DocumentType(){}DocumentType.prototype.nodeType=DOCUMENT_TYPE_NODE;_extends(DocumentType,Node);function Notation(){}Notation.prototype.nodeType=NOTATION_NODE;_extends(Notation,Node);function Entity(){}Entity.prototype.nodeType=ENTITY_NODE;_extends(Entity,Node);function EntityReference(){}EntityReference.prototype.nodeType=ENTITY_REFERENCE_NODE;_extends(EntityReference,Node);function DocumentFragment(){}DocumentFragment.prototype.nodeName=\"#document-fragment\";DocumentFragment.prototype.nodeType=DOCUMENT_FRAGMENT_NODE;_extends(DocumentFragment,Node);function ProcessingInstruction(){}ProcessingInstruction.prototype.nodeType=PROCESSING_INSTRUCTION_NODE;_extends(ProcessingInstruction,Node);function XMLSerializer(){}XMLSerializer.prototype.serializeToString=function(node,isHtml,nodeFilter){return nodeSerializeToString.call(node,isHtml,nodeFilter)};Node.prototype.toString=nodeSerializeToString;function nodeSerializeToString(isHtml,nodeFilter){var buf=[];var refNode=this.nodeType==9?this.documentElement:this;var prefix=refNode.prefix;var uri=refNode.namespaceURI;if(uri&&prefix==null){var prefix=refNode.lookupPrefix(uri);if(prefix==null){var visibleNamespaces=[{namespace:uri,prefix:null}]}}serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);return buf.join(\"\")}function needNamespaceDefine(node,isHTML,visibleNamespaces){var prefix=node.prefix||\"\";var uri=node.namespaceURI;if(!prefix&&!uri){return false}if(prefix===\"xml\"&&uri===\"http://www.w3.org/XML/1998/namespace\"||uri==\"http://www.w3.org/2000/xmlns/\"){return false}var i=visibleNamespaces.length;while(i--){var ns=visibleNamespaces[i];if(ns.prefix==prefix){return ns.namespace!=uri}}return true}function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){if(nodeFilter){node=nodeFilter(node);if(node){if(typeof node==\"string\"){buf.push(node);return}}else{return}}switch(node.nodeType){case ELEMENT_NODE:if(!visibleNamespaces)visibleNamespaces=[];var startVisibleNamespaces=visibleNamespaces.length;var attrs=node.attributes;var len=attrs.length;var child=node.firstChild;var nodeName=node.tagName;isHTML=htmlns===node.namespaceURI||isHTML;buf.push(\"<\",nodeName);for(var i=0;i\");if(isHTML&&/^script$/i.test(nodeName)){while(child){if(child.data){buf.push(child.data)}else{serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces)}child=child.nextSibling}}else{while(child){serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);child=child.nextSibling}}buf.push(\"\")}else{buf.push(\"/>\")}return;case DOCUMENT_NODE:case DOCUMENT_FRAGMENT_NODE:var child=node.firstChild;while(child){serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);child=child.nextSibling}return;case ATTRIBUTE_NODE:return buf.push(\" \",node.name,'=\"',node.value.replace(/[<&\"]/g,_xmlEncoder),'\"');case TEXT_NODE:return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));case CDATA_SECTION_NODE:return buf.push(\"\");case COMMENT_NODE:return buf.push(\"\");case DOCUMENT_TYPE_NODE:var pubid=node.publicId;var sysid=node.systemId;buf.push(\"')}else if(sysid&&sysid!=\".\"){buf.push(' SYSTEM \"',sysid,'\">')}else{var sub=node.internalSubset;if(sub){buf.push(\" [\",sub,\"]\")}buf.push(\">\")}return;case PROCESSING_INSTRUCTION_NODE:return buf.push(\"\");case ENTITY_REFERENCE_NODE:return buf.push(\"&\",node.nodeName,\";\");default:buf.push(\"??\",node.nodeName)}}function importNode(doc,node,deep){var node2;switch(node.nodeType){case ELEMENT_NODE:node2=node.cloneNode(false);node2.ownerDocument=doc;case DOCUMENT_FRAGMENT_NODE:break;case ATTRIBUTE_NODE:deep=true;break}if(!node2){node2=node.cloneNode(false)}node2.ownerDocument=doc;node2.parentNode=null;if(deep){var child=node.firstChild;while(child){node2.appendChild(importNode(doc,child,deep));child=child.nextSibling}}return node2}function cloneNode(doc,node,deep){var node2=new node.constructor;for(var n in node){var v=node[n];if(typeof v!=\"object\"){if(v!=node2[n]){node2[n]=v}}}if(node.childNodes){node2.childNodes=new NodeList}node2.ownerDocument=doc;switch(node2.nodeType){case ELEMENT_NODE:var attrs=node.attributes;var attrs2=node2.attributes=new NamedNodeMap;var len=attrs.length;attrs2._ownerElement=node2;for(var i=0;i65535){code-=65536;var surrogate1=55296+(code>>10),surrogate2=56320+(code&1023);return String.fromCharCode(surrogate1,surrogate2)}else{return String.fromCharCode(code)}}function entityReplacer(a){var k=a.slice(1,-1);if(k in entityMap){return entityMap[k]}else if(k.charAt(0)===\"#\"){return fixedFromCharCode(parseInt(k.substr(1).replace(\"x\",\"0x\")))}else{errorHandler.error(\"entity not found:\"+a);return a}}function appendText(end){if(end>start){var xt=source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);locator&&position(start);domBuilder.characters(xt,0,end-start);start=end}}function position(p,m){while(p>=lineEnd&&(m=linePattern.exec(source))){lineStart=m.index;lineEnd=lineStart+m[0].length;locator.lineNumber++}locator.columnNumber=p-lineStart+1}var lineStart=0;var lineEnd=0;var linePattern=/.*(?:\\r\\n?|\\n)|.*$/g;var locator=domBuilder.locator;var parseStack=[{currentNSMap:defaultNSMapCopy}];var closeMap={};var start=0;while(true){try{var tagStart=source.indexOf(\"<\",start);if(tagStart<0){if(!source.substr(start).match(/^\\s*$/)){var doc=domBuilder.doc;var text=doc.createTextNode(source.substr(start));doc.appendChild(text);domBuilder.currentElement=text}return}if(tagStart>start){appendText(tagStart)}switch(source.charAt(tagStart+1)){case\"/\":var end=source.indexOf(\">\",tagStart+3);var tagName=source.substring(tagStart+2,end);var config=parseStack.pop();if(end<0){tagName=source.substring(tagStart+2).replace(/[\\s<].*/,\"\");errorHandler.error(\"end tag name: \"+tagName+\" is not complete:\"+config.tagName);end=tagStart+1+tagName.length}else if(tagName.match(/\\sstart){start=end}else{appendText(Math.max(tagStart,start)+1)}}}function copyLocator(f,t){t.lineNumber=f.lineNumber;t.columnNumber=f.columnNumber;return t}function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){var attrName;var value;var p=++start;var s=S_TAG;while(true){var c=source.charAt(p);switch(c){case\"=\":if(s===S_ATTR){attrName=source.slice(start,p);s=S_EQ}else if(s===S_ATTR_SPACE){s=S_EQ}else{throw new Error(\"attribute equal must after attrName\")}break;case\"'\":case'\"':if(s===S_EQ||s===S_ATTR){if(s===S_ATTR){errorHandler.warning('attribute value must after \"=\"');attrName=source.slice(start,p)}start=p+1;p=source.indexOf(c,start);if(p>0){value=source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);el.add(attrName,value,start-1);s=S_ATTR_END}else{throw new Error(\"attribute value no end '\"+c+\"' match\")}}else if(s==S_ATTR_NOQUOT_VALUE){value=source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);el.add(attrName,value,start);errorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+\")!!\");start=p+1;s=S_ATTR_END}else{throw new Error('attribute value must after \"=\"')}break;case\"/\":switch(s){case S_TAG:el.setTagName(source.slice(start,p));case S_ATTR_END:case S_TAG_SPACE:case S_TAG_CLOSE:s=S_TAG_CLOSE;el.closed=true;case S_ATTR_NOQUOT_VALUE:case S_ATTR:case S_ATTR_SPACE:break;default:throw new Error(\"attribute invalid close char('/')\")}break;case\"\":errorHandler.error(\"unexpected end of input\");if(s==S_TAG){el.setTagName(source.slice(start,p))}return p;case\">\":switch(s){case S_TAG:el.setTagName(source.slice(start,p));case S_ATTR_END:case S_TAG_SPACE:case S_TAG_CLOSE:break;case S_ATTR_NOQUOT_VALUE:case S_ATTR:value=source.slice(start,p);if(value.slice(-1)===\"/\"){el.closed=true;value=value.slice(0,-1)}case S_ATTR_SPACE:if(s===S_ATTR_SPACE){value=attrName}if(s==S_ATTR_NOQUOT_VALUE){errorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');el.add(attrName,value.replace(/&#?\\w+;/g,entityReplacer),start)}else{if(currentNSMap[\"\"]!==\"http://www.w3.org/1999/xhtml\"||!value.match(/^(?:disabled|checked|selected)$/i)){errorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')}el.add(value,value,start)}break;case S_EQ:throw new Error(\"attribute value missed!!\")}return p;case\"€\":c=\" \";default:if(c<=\" \"){switch(s){case S_TAG:el.setTagName(source.slice(start,p));s=S_TAG_SPACE;break;case S_ATTR:attrName=source.slice(start,p);s=S_ATTR_SPACE;break;case S_ATTR_NOQUOT_VALUE:var value=source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);errorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');el.add(attrName,value,start);case S_ATTR_END:s=S_TAG_SPACE;break}}else{switch(s){case S_ATTR_SPACE:var tagName=el.tagName;if(currentNSMap[\"\"]!==\"http://www.w3.org/1999/xhtml\"||!attrName.match(/^(?:disabled|checked|selected)$/i)){errorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')}el.add(attrName,attrName,start);start=p;s=S_ATTR;break;case S_ATTR_END:errorHandler.warning('attribute space is required\"'+attrName+'\"!!');case S_TAG_SPACE:s=S_ATTR;start=p;break;case S_EQ:s=S_ATTR_NOQUOT_VALUE;start=p;break;case S_TAG_CLOSE:throw new Error(\"elements closed character '/' and '>' must be connected to\")}}}p++}}function appendElement(el,domBuilder,currentNSMap){var tagName=el.tagName;var localNSMap=null;var i=el.length;while(i--){var a=el[i];var qName=a.qName;var value=a.value;var nsp=qName.indexOf(\":\");if(nsp>0){var prefix=a.prefix=qName.slice(0,nsp);var localName=qName.slice(nsp+1);var nsPrefix=prefix===\"xmlns\"&&localName}else{localName=qName;prefix=null;nsPrefix=qName===\"xmlns\"&&\"\"}a.localName=localName;if(nsPrefix!==false){if(localNSMap==null){localNSMap={};_copy(currentNSMap,currentNSMap={})}currentNSMap[nsPrefix]=localNSMap[nsPrefix]=value;a.uri=\"http://www.w3.org/2000/xmlns/\";domBuilder.startPrefixMapping(nsPrefix,value)}}var i=el.length;while(i--){a=el[i];var prefix=a.prefix;if(prefix){if(prefix===\"xml\"){a.uri=\"http://www.w3.org/XML/1998/namespace\"}if(prefix!==\"xmlns\"){a.uri=currentNSMap[prefix||\"\"]}}}var nsp=tagName.indexOf(\":\");if(nsp>0){prefix=el.prefix=tagName.slice(0,nsp);localName=el.localName=tagName.slice(nsp+1)}else{prefix=null;localName=el.localName=tagName}var ns=el.uri=currentNSMap[prefix||\"\"];domBuilder.startElement(ns,localName,tagName,el);if(el.closed){domBuilder.endElement(ns,localName,tagName);if(localNSMap){for(prefix in localNSMap){domBuilder.endPrefixMapping(prefix)}}}else{el.currentNSMap=currentNSMap;el.localNSMap=localNSMap;return true}}function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){if(/^(?:script|textarea)$/i.test(tagName)){var elEndStart=source.indexOf(\"\",elStartEnd);var text=source.substring(elStartEnd+1,elEndStart);if(/[&<]/.test(text)){if(/^script$/i.test(tagName)){domBuilder.characters(text,0,text.length);return elEndStart}text=text.replace(/&#?\\w+;/g,entityReplacer);domBuilder.characters(text,0,text.length);return elEndStart}}return elStartEnd+1}function fixSelfClosed(source,elStartEnd,tagName,closeMap){var pos=closeMap[tagName];if(pos==null){pos=source.lastIndexOf(\"\");if(pos\",start+4);if(end>start){domBuilder.comment(source,start+4,end-start-4);return end+3}else{errorHandler.error(\"Unclosed comment\");return-1}}else{return-1}default:if(source.substr(start+3,6)==\"CDATA[\"){var end=source.indexOf(\"]]>\",start+9);domBuilder.startCDATA();domBuilder.characters(source,start+9,end-start-9);domBuilder.endCDATA();return end+3}var matchs=split(source,start);var len=matchs.length;if(len>1&&/!doctype/i.test(matchs[0][0])){var name=matchs[1][0];var pubid=len>3&&/^public$/i.test(matchs[2][0])&&matchs[3][0];var sysid=len>4&&matchs[4][0];var lastMatch=matchs[len-1];domBuilder.startDTD(name,pubid&&pubid.replace(/^(['\"])(.*?)\\1$/,\"$2\"),sysid&&sysid.replace(/^(['\"])(.*?)\\1$/,\"$2\"));domBuilder.endDTD();return lastMatch.index+lastMatch[0].length}}return-1}function parseInstruction(source,start,domBuilder){var end=source.indexOf(\"?>\",start);if(end){var match=source.substring(start,end).match(/^<\\?(\\S*)\\s*([\\s\\S]*?)\\s*$/);if(match){var len=match[0].length;domBuilder.processingInstruction(match[1],match[2]);return end+2}else{return-1}}return-1}function ElementAttributes(source){}ElementAttributes.prototype={setTagName:function(tagName){if(!tagNamePattern.test(tagName)){throw new Error(\"invalid tagName:\"+tagName)}this.tagName=tagName},add:function(qName,value,offset){if(!tagNamePattern.test(qName)){throw new Error(\"invalid attribute:\"+qName)}this[this.length++]={qName:qName,value:value,offset:offset}},length:0,getLocalName:function(i){return this[i].localName},getLocator:function(i){return this[i].locator},getQName:function(i){return this[i].qName},getURI:function(i){return this[i].uri},getValue:function(i){return this[i].value}};function _set_proto_(thiz,parent){thiz.__proto__=parent;return thiz}if(!(_set_proto_({},_set_proto_.prototype)instanceof _set_proto_)){_set_proto_=function(thiz,parent){function p(){}p.prototype=parent;p=new p;for(parent in thiz){p[parent]=thiz[parent]}return p}}function split(source,start){var match;var buf=[];var reg=/'[^']+'|\"[^\"]+\"|[^\\s<>\\/=]+=?|(\\/?\\s*>|<)/g;reg.lastIndex=start;reg.exec(source);while(match=reg.exec(source)){buf.push(match);if(match[1])return buf}}exports.XMLReader=XMLReader},{}],\"/src/js/index.js\":[function(require,module,exports){\"use strict\";var _createClass=function(){function defineProperties(target,props){for(var i=0;i\"+xmlString+\"\");var offset=xmlDoc.getElementsByTagName(\"a:off\");var ext=xmlDoc.getElementsByTagName(\"a:ext\");part.ext={cx:parseInt(ext[0].getAttribute(\"cx\"),10),cy:parseInt(ext[0].getAttribute(\"cy\"),10)};part.offset={x:parseInt(offset[0].getAttribute(\"x\"),10),y:parseInt(offset[0].getAttribute(\"y\"),10)};return part}var ImageModule=function(){function ImageModule(options){_classCallCheck(this,ImageModule);this.name=\"ImageModule\";this.options=options||{};this.imgManagers={};if(this.options.centered==null){this.options.centered=false}if(this.options.getImage==null){throw new Error(\"You should pass getImage\")}if(this.options.getSize==null){throw new Error(\"You should pass getSize\")}this.imageNumber=1}_createClass(ImageModule,[{key:\"optionsTransformer\",value:function optionsTransformer(options,docxtemplater){\nvar relsFiles=docxtemplater.zip.file(/\\.xml\\.rels/).concat(docxtemplater.zip.file(/\\[Content_Types\\].xml/)).map(function(file){return file.name});this.fileTypeConfig=docxtemplater.fileTypeConfig;this.fileType=docxtemplater.fileType;this.zip=docxtemplater.zip;options.xmlFileNames=options.xmlFileNames.concat(relsFiles);return options}},{key:\"set\",value:function set(options){if(options.zip){this.zip=options.zip}if(options.xmlDocuments){this.xmlDocuments=options.xmlDocuments}}},{key:\"parse\",value:function parse(placeHolderContent){var module=moduleName;var type=\"placeholder\";if(placeHolderContent.substring(0,2)===\"%%\"){return{type:type,value:placeHolderContent.substr(2),module:module,centered:true}}if(placeHolderContent.substring(0,1)===\"%\"){return{type:type,value:placeHolderContent.substr(1),module:module,centered:false}}return null}},{key:\"postparse\",value:function postparse(parsed){var expandTo=void 0;var getInner=void 0;if(this.fileType===\"pptx\"){expandTo=\"p:sp\";getInner=getInnerPptx}else{expandTo=this.options.centered?\"w:p\":\"w:t\";getInner=getInnerDocx}return DocUtils.traits.expandToOne(parsed,{moduleName:moduleName,getInner:getInner,expandTo:expandTo})}},{key:\"render\",value:function render(part,options){this.imgManagers[options.filePath]=this.imgManagers[options.filePath]||new ImgManager(this.zip,options.filePath,this.xmlDocuments,this.fileType);var imgManager=this.imgManagers[options.filePath];if(!part.type===\"placeholder\"||part.module!==moduleName){return null}try{var tagValue=options.scopeManager.getValue(part.value);if(!tagValue){throw new Error(\"tagValue is empty\")}var imgBuffer=this.options.getImage(tagValue,part.value);var rId=imgManager.addImageRels(this.getNextImageName(),imgBuffer);var sizePixel=this.options.getSize(imgBuffer,tagValue,part.value);return this.getRenderedPart(part,rId,sizePixel)}catch(e){return{value:this.fileTypeConfig.tagTextXml}}}},{key:\"getRenderedPart\",value:function getRenderedPart(part,rId,sizePixel){if(isNaN(rId)){throw new Error(\"rId is NaN, aborting\")}var size=[DocUtils.convertPixelsToEmus(sizePixel[0]),DocUtils.convertPixelsToEmus(sizePixel[1])];var centered=this.options.centered||part.centered;var newText=void 0;if(this.fileType===\"pptx\"){newText=this.getRenderedPartPptx(part,rId,size,centered)}else{newText=this.getRenderedPartDocx(rId,size,centered)}return{value:newText}}},{key:\"getRenderedPartPptx\",value:function getRenderedPartPptx(part,rId,size,centered){var offset={x:part.offset.x,y:part.offset.y};var cellCX=part.ext.cx;var cellCY=part.ext.cy;var imgW=size[0];var imgH=size[1];if(centered){offset.x+=cellCX/2-imgW/2;offset.y+=cellCY/2-imgH/2}return templates.getPptxImageXml(rId,[imgW,imgH],offset)}},{key:\"getRenderedPartDocx\",value:function getRenderedPartDocx(rId,size,centered){return centered?templates.getImageXmlCentered(rId,size):templates.getImageXml(rId,size)}},{key:\"getNextImageName\",value:function getNextImageName(){var name=\"image_generated_\"+this.imageNumber+\".png\";this.imageNumber++;return name}}]);return ImageModule}();module.exports=ImageModule},{\"./imgManager\":2,\"./templates\":3,docxtemplater:5,xmldom:23}]},{},[])(\"/src/js/index.js\")});","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Docxtemplater=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o\":\">\"};var regexStripRegexp=/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g;DocUtils.escapeRegExp=function(str){return str.replace(regexStripRegexp,\"\\\\$&\")};DocUtils.charMapRegexes=Object.keys(DocUtils.charMap).map(function(endChar){var startChar=DocUtils.charMap[endChar];return{rstart:new RegExp(DocUtils.escapeRegExp(startChar),\"g\"),rend:new RegExp(DocUtils.escapeRegExp(endChar),\"g\"),start:startChar,end:endChar}});DocUtils.wordToUtf8=function(string){var r=void 0;for(var i=0,l=DocUtils.charMapRegexes.length;i\"){return i}}throwXmlTagNotFound({position:\"right\",element:element,parsed:parsed,index:index})};DocUtils.getLeft=function(parsed,element,index){for(var i=index;i>=0;i--){var part=parsed[i];if(part.value.indexOf(\"<\"+element)===0&&[\">\",\" \"].indexOf(part.value[element.length+1])!==-1){return i}}throwXmlTagNotFound({position:\"left\",element:element,parsed:parsed,index:index})};module.exports=DocUtils},{\"./errors\":2,\"./memoize\":5,xmldom:19}],2:[function(require,module,exports){\"use strict\";function XTError(message){this.name=\"GenericError\";this.message=message;this.stack=new Error(message).stack}XTError.prototype=Error.prototype;function XTTemplateError(message){this.name=\"TemplateError\";this.message=message;this.stack=new Error(message).stack}XTTemplateError.prototype=new XTError;function XTScopeParserError(message){this.name=\"ScopeParserError\";this.message=message;this.stack=new Error(message).stack}XTScopeParserError.prototype=new XTError;function XTInternalError(message){this.name=\"InternalError\";this.properties={explanation:\"InternalError\"};this.message=message;this.stack=new Error(message).stack}XTInternalError.prototype=new XTError;module.exports={XTError:XTError,XTTemplateError:XTTemplateError,XTInternalError:XTInternalError,XTScopeParserError:XTScopeParserError}},{}],3:[function(require,module,exports){\"use strict\";var loopModule=require(\"./modules/loop\");var spacePreserveModule=require(\"./modules/space-preserve\");var rawXmlModule=require(\"./modules/rawxml\");var expandPairTrait=require(\"./modules/expand-pair-trait\");var render=require(\"./modules/render\");var PptXFileTypeConfig={getTemplatedFiles:function getTemplatedFiles(zip){var slideTemplates=zip.file(/ppt\\/(slides|slideMasters)\\/(slide|slideMaster)\\d+\\.xml/).map(function(file){return file.name});return slideTemplates.concat([\"ppt/presentation.xml\"])},textPath:\"ppt/slides/slide1.xml\",tagsXmlTextArray:[\"a:t\",\"m:t\"],tagsXmlLexedArray:[\"p:sp\",\"a:tc\",\"a:tr\",\"a:table\",\"a:p\",\"a:r\"],tagRawXml:\"p:sp\",tagTextXml:\"a:t\",baseModules:[render,expandPairTrait,rawXmlModule,loopModule]};var DocXFileTypeConfig={getTemplatedFiles:function getTemplatedFiles(zip){var slideTemplates=zip.file(/word\\/(header|footer)\\d+\\.xml/).map(function(file){return file.name});return slideTemplates.concat([\"word/document.xml\"])},textPath:\"word/document.xml\",tagsXmlTextArray:[\"w:t\",\"m:t\"],tagsXmlLexedArray:[\"w:tc\",\"w:tr\",\"w:table\",\"w:p\",\"w:r\"],tagRawXml:\"w:p\",tagTextXml:\"w:t\",baseModules:[render,spacePreserveModule,expandPairTrait,rawXmlModule,loopModule]};module.exports={docx:DocXFileTypeConfig,pptx:PptXFileTypeConfig}},{\"./modules/expand-pair-trait\":8,\"./modules/loop\":9,\"./modules/rawxml\":10,\"./modules/render\":11,\"./modules/space-preserve\":12}],4:[function(require,module,exports){\"use strict\";var Errors=require(\"./errors\");var DocUtils=require(\"./doc-utils\");function inRange(range,match){return range[0]<=match.offset&&match.offset\",cursor);var tagText=content.slice(offset,cursor+1);var _getTag=getTag(tagText),tag=_getTag.tag,position=_getTag.position;var text=allMatches[tag];if(text==null){continue}totalMatches.push({type:\"tag\",position:position,text:text,offset:offset,value:tagText})}return totalMatches}function throwUnopenedTagException(options){var err=new Errors.XTTemplateError(\"Unopened tag\");err.properties={xtag:options.xtag.split(\" \")[0],id:\"unopened_tag\",context:options.xtag,explanation:\"The tag beginning with '\"+options.xtag.substr(0,10)+\"' is unclosed\"};throw err}function throwUnclosedTagException(options){var err=new Errors.XTTemplateError(\"Unclosed tag\");err.properties={xtag:options.xtag.split(\" \")[0].substr(1),id:\"unclosed_tag\",context:options.xtag,explanation:\"The tag beginning with '\"+options.xtag.substr(0,10)+\"' is unclosed\"};throw err}function assertDelimiterOrdered(delimiterMatches,fullText){var inDelimiter=false;var lastDelimiterMatch={offset:0};var xtag=void 0;delimiterMatches.forEach(function(delimiterMatch){xtag=fullText.substr(lastDelimiterMatch.offset,delimiterMatch.offset-lastDelimiterMatch.offset);if(delimiterMatch.position===\"start\"&&inDelimiter||delimiterMatch.position===\"end\"&&!inDelimiter){if(delimiterMatch.position===\"start\"){throwUnclosedTagException({xtag:xtag})}else{throwUnopenedTagException({xtag:xtag})}}inDelimiter=!inDelimiter;lastDelimiterMatch=delimiterMatch});var delimiterMatch={offset:fullText.length};xtag=fullText.substr(lastDelimiterMatch.offset,delimiterMatch.offset-lastDelimiterMatch.offset);if(inDelimiter){throwUnclosedTagException({xtag:xtag})}}function getAllIndexes(arr,val,position){var indexes=[];var offset=-1;do{offset=arr.indexOf(val,offset+1);if(offset!==-1){indexes.push({offset:offset,position:position})}}while(offset!==-1);return indexes}function Reader(innerContentParts){var _this=this;this.innerContentParts=innerContentParts;this.full=\"\";this.parseDelimiters=function(delimiters){_this.full=_this.innerContentParts.join(\"\");var offset=0;_this.ranges=_this.innerContentParts.map(function(part){offset+=part.length;return offset-part.length});var delimiterMatches=DocUtils.concatArrays([getAllIndexes(_this.full,delimiters.start,\"start\"),getAllIndexes(_this.full,delimiters.end,\"end\")]).sort(offsetSort);assertDelimiterOrdered(delimiterMatches,_this.full);var delimiterLength={start:delimiters.start.length,end:delimiters.end.length};var cutNext=0;var delimiterIndex=0;_this.parsed=_this.ranges.map(function(offset,i){var range=[offset,offset+this.innerContentParts[i].length];var partContent=this.innerContentParts[i];var delimitersInOffset=[];while(delimiterIndex0){cursor=cutNext;cutNext=0}delimitersInOffset.forEach(function(delimiterInOffset){var value=partContent.substr(cursor,delimiterInOffset.offset-offset-cursor);if(value.length>0){parts.push({type:\"content\",value:value})}parts.push({type:\"delimiter\",position:delimiterInOffset.position});cursor=delimiterInOffset.offset-offset+delimiterLength[delimiterInOffset.position]});cutNext=cursor-partContent.length;var value=partContent.substr(cursor);if(value.length>0){parts.push({type:\"content\",value:value})}return parts},_this)}}module.exports={parse:function parse(xmlparsed,delimiters){var inTextTag=false;var innerContentParts=[];xmlparsed.forEach(function(part){inTextTag=updateInTextTag(part,inTextTag);if(inTextTag&&part.type===\"content\"){innerContentParts.push(part.value)}});var reader=new Reader(innerContentParts);reader.parseDelimiters(delimiters);var newArray=[];var index=0;xmlparsed.forEach(function(part){inTextTag=updateInTextTag(part,inTextTag);if(part.type===\"content\"){part.position=inTextTag?\"insidetag\":\"outsidetag\"}if(inTextTag&&part.type===\"content\"){Array.prototype.push.apply(newArray,reader.parsed[index].map(function(p){if(p.type===\"content\"){p.position=\"insidetag\"}return p}));index++}else{newArray.push(part)}});return newArray},xmlparse:function xmlparse(content,xmltags){var matches=tagMatcher(content,xmltags.text,xmltags.other);var cursor=0;var parsed=matches.reduce(function(parsed,match){var value=content.substr(cursor,match.offset-cursor);if(value.length>0){parsed.push({type:\"content\",value:value})}cursor=match.offset+match.value.length;delete match.offset;if(match.value.length>0){parsed.push(match)}return parsed},[]);var value=content.substr(cursor);if(value.length>0){parsed.push({type:\"content\",value:value})}return parsed}}},{\"./doc-utils\":1,\"./errors\":2}],5:[function(require,module,exports){\"use strict\";function memoize(func){var stringifyJson=JSON.stringify,cache={};function cachedfun(){var hash=stringifyJson(arguments);return hash in cache?cache[hash]:cache[hash]=func.apply(this,arguments)}return cachedfun}module.exports=memoize},{}],6:[function(require,module,exports){\"use strict\";function getMinFromArrays(arrays,state){var minIndex=-1;for(var i=0,l=arrays.length;i=arrays[i].length){continue}if(minIndex===-1||arrays[i][state[i]].offset0});var resultArray=new Array(totalLength);var state=arrays.map(function(){return 0});var i=0;while(i<=totalLength-1){var arrayIndex=getMinFromArrays(arrays,state);resultArray[i]=arrays[arrayIndex][state[arrayIndex]];state[arrayIndex]++;i++}return resultArray}},{}],7:[function(require,module,exports){\"use strict\";function emptyFun(){}function identity(i){return i}module.exports=function(module){var defaults={set:emptyFun,parse:emptyFun,render:emptyFun,getTraits:emptyFun,optionsTransformer:identity,getRenderedMap:identity,postparse:identity};if(Object.keys(defaults).every(function(key){return!module[key]})){throw new Error(\"This module cannot be wrapped, because it doesn't define any of the necessary functions\")}Object.keys(defaults).forEach(function(key){module[key]=module[key]||defaults[key]});return module}},{}],8:[function(require,module,exports){\"use strict\";var traitName=\"expandPair\";var mergeSort=require(\"../mergesort\");var DocUtils=require(\"../doc-utils\");var wrapper=require(\"../module-wrapper\");var _require=require(\"../traits\"),getExpandToDefault=_require.getExpandToDefault;var Errors=require(\"../errors\");function throwUnmatchedLoopException(options){var location=options.location;var t=location===\"start\"?\"unclosed\":\"unopened\";var T=location===\"start\"?\"Unclosed\":\"Unopened\";var err=new Errors.XTTemplateError(T+\" loop\");var tag=options.part.value;err.properties={id:t+\"_loop\",explanation:\"The loop with tag \"+tag+\" is \"+t,xtag:tag};throw err}function throwClosingTagNotMatchOpeningTag(options){var tags=options.tags;var err=new Errors.XTTemplateError(\"Closing tag does not match opening tag\");err.properties={id:\"closing_tag_does_not_match_opening_tag\",explanation:'The tag \"'+tags[0].value+'\" is closed by the tag \"'+tags[1].value+'\"',openingtag:tags[0].value,closingtag:tags[1].value};throw err}function getOpenCountChange(part){switch(part.location){case\"start\":return 1;case\"end\":return-1;default:throw new Error(\"Location should be one of 'start' or 'end' (given : \"+part.location+\")\")}}function getPairs(traits){if(traits.length===0){return[]}var countOpen=1;var firstTrait=traits[0];for(var i=1;i\"){inChunk=true}if(inChunk){if(part.type===\"placeholder\"&&!part.module){chunk[0].value=''}chunk.push(part)}else{parsed.push(part)}if(part.type===\"tag\"&&part.position===\"end\"&&part.text&&part.value===\"\"){Array.prototype.push.apply(parsed,chunk);inChunk=false;chunk=[]}return parsed},[]);Array.prototype.push.apply(result,chunk);return result}};module.exports=function(){return wrapper(spacePreserve)}},{\"../module-wrapper\":7}],13:[function(require,module,exports){\"use strict\";var DocUtils=require(\"./doc-utils\");var parser={postparse:function postparse(parsed,modules){function getTraits(traitName,parsed){return modules.map(function(module){return module.getTraits(traitName,parsed)})}function postparse(parsed){return modules.reduce(function(parsed,module){return module.postparse(parsed,{postparse:postparse,getTraits:getTraits})},parsed)}return postparse(parsed)},parse:function parse(lexed,modules){function moduleParse(placeHolderContent,parsed){var moduleParsed=void 0;for(var i=0,l=modules.length;i0){return this.getValue(tag,this.num-1)}return result}},{key:\"createSubScopeManager\",value:function createSubScopeManager(scope,tag){var options={scopePath:this.scopePath.slice(0),scopeList:this.scopeList.slice(0)};options.parser=this.parser;options.scopeList=this.scopeList.concat(scope);options.scopePath=this.scopePath.concat(tag);return new ScopeManager(options)}}]);return ScopeManager}();ScopeManager.createBaseScopeManager=function(_ref){var parser=_ref.parser,tags=_ref.tags;var options={parser:parser,tags:tags};options.scopePath=[];options.scopeList=[tags];return new ScopeManager(options)};module.exports=ScopeManager},{\"./errors\":2}],16:[function(require,module,exports){\"use strict\";var DocUtils=require(\"./doc-utils\");var Errors=require(\"./errors\");function throwRawTagNotInParagraph(options){var err=new Errors.XTTemplateError(\"Raw tag not in paragraph\");var tag=options.part.value;err.properties={id:\"raw_tag_outerxml_invalid\",explanation:'The tag \"'+tag+'\"',rootError:options.rootError,xtag:tag,postparsed:options.postparsed,expandTo:options.expandTo,index:options.index};throw err}function lastTagIsOpenTag(array,tag){if(array.length===0){return false}var lastTag=array[array.length-1];var innerLastTag=lastTag.tag.substr(1);var innerCurrentTag=tag.substr(2,tag.length-3);return innerLastTag.indexOf(innerCurrentTag)===0}function addTag(array,tag){array.push({tag:tag});return array}function getListXmlElements(parts){var tags=parts.filter(function(part){return part.type===\"tag\"}).map(function(part){return part.value});var result=[];for(var i=0,tag;i\")===-1){res.content.replace(/^()([^<>]*)$/,replacerUnshift)}var r=new RegExp(\"^()([^<]+)\");res.content.replace(r,replacerUnshift);function replacerPush(){var pn={array:Array.prototype.slice.call(arguments)};pn.array.pop();var offset=pn.array.pop();pn.offset=offset;pn.last=true;res.matches.push(pn);res.charactersAdded.push(0);return res.charactersAddedCumulative.push(0)}r=new RegExp(\"(<(?:\"+res.tagsXmlArrayJoined+\")[^>]*>)([^>]+)$\");res.content.replace(r,replacerPush);return res}function xmlMatcher(content,tagsXmlArray){var res={};res.content=content;res.tagsXmlArray=tagsXmlArray;res.tagsXmlArrayJoined=res.tagsXmlArray.join(\"|\");var regexp=new RegExp(\"(<(?:\"+res.tagsXmlArrayJoined+\")[^>]*>)([^<>]*)\",\"g\");res.matches=DocUtils.pregMatchAll(regexp,res.content);res.charactersAddedCumulative=res.matches.map(function(){return 0});res.charactersAdded=res.matches.map(function(){return 0});return handleRecursiveCase(res)}var memoized=memoize(xmlMatcher);module.exports=function(content,tagsXmlArray){return DocUtils.cloneDeep(memoized(content,tagsXmlArray))}},{\"./doc-utils\":1,\"./memoize\":5}],18:[function(require,module,exports){\"use strict\";var _createClass=function(){function defineProperties(target,props){for(var i=0;i\",amp:\"&\",quot:'\"',apos:\"'\"};if(locator){domBuilder.setDocumentLocator(locator)}sax.errorHandler=buildErrorHandler(errorHandler,domBuilder,locator);sax.domBuilder=options.domBuilder||domBuilder;if(/\\/x?html?$/.test(mimeType)){entityMap.nbsp=\" \";entityMap.copy=\"©\";defaultNSMap[\"\"]=\"http://www.w3.org/1999/xhtml\"}defaultNSMap.xml=defaultNSMap.xml||\"http://www.w3.org/XML/1998/namespace\";if(source){sax.parse(source,defaultNSMap,entityMap)}else{sax.errorHandler.error(\"invalid doc source\")}return domBuilder.doc};function buildErrorHandler(errorImpl,domBuilder,locator){if(!errorImpl){if(domBuilder instanceof DOMHandler){return domBuilder}errorImpl=domBuilder}var errorHandler={};var isCallback=errorImpl instanceof Function;locator=locator||{};function build(key){var fn=errorImpl[key];if(!fn&&isCallback){fn=errorImpl.length==2?function(msg){errorImpl(key,msg)}:errorImpl}errorHandler[key]=fn&&function(msg){fn(\"[xmldom \"+key+\"]\\t\"+msg+_locator(locator))}||function(){}}build(\"warning\");build(\"error\");build(\"fatalError\");return errorHandler}function DOMHandler(){this.cdata=false}function position(locator,node){node.lineNumber=locator.lineNumber;node.columnNumber=locator.columnNumber}DOMHandler.prototype={startDocument:function(){this.doc=(new DOMImplementation).createDocument(null,null,null);if(this.locator){this.doc.documentURI=this.locator.systemId}},startElement:function(namespaceURI,localName,qName,attrs){var doc=this.doc;var el=doc.createElementNS(namespaceURI,qName||localName);var len=attrs.length;appendElement(this,el);this.currentElement=el;this.locator&&position(this.locator,el);for(var i=0;i=start+length||start){return new java.lang.String(chars,start,length)+\"\"}return chars}}\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){DOMHandler.prototype[key]=function(){return null}});function appendElement(hander,node){if(!hander.currentElement){hander.doc.appendChild(node)}else{hander.currentElement.appendChild(node)}}var XMLReader=require(\"./sax\").XMLReader;var DOMImplementation=exports.DOMImplementation=require(\"./dom\").DOMImplementation;exports.XMLSerializer=require(\"./dom\").XMLSerializer;exports.DOMParser=DOMParser},{\"./dom\":20,\"./sax\":21}],20:[function(require,module,exports){function copy(src,dest){for(var p in src){dest[p]=src[p]}}function _extends(Class,Super){var pt=Class.prototype;if(Object.create){var ppt=Object.create(Super.prototype);pt.__proto__=ppt}if(!(pt instanceof Super)){function t(){}t.prototype=Super.prototype;t=new t;copy(pt,t);Class.prototype=pt=t}if(pt.constructor!=Class){if(typeof Class!=\"function\"){console.error(\"unknow Class:\"+Class)}pt.constructor=Class}}var htmlns=\"http://www.w3.org/1999/xhtml\";var NodeType={};var ELEMENT_NODE=NodeType.ELEMENT_NODE=1;var ATTRIBUTE_NODE=NodeType.ATTRIBUTE_NODE=2;var TEXT_NODE=NodeType.TEXT_NODE=3;var CDATA_SECTION_NODE=NodeType.CDATA_SECTION_NODE=4;var ENTITY_REFERENCE_NODE=NodeType.ENTITY_REFERENCE_NODE=5;var ENTITY_NODE=NodeType.ENTITY_NODE=6;var PROCESSING_INSTRUCTION_NODE=NodeType.PROCESSING_INSTRUCTION_NODE=7;var COMMENT_NODE=NodeType.COMMENT_NODE=8;var DOCUMENT_NODE=NodeType.DOCUMENT_NODE=9;var DOCUMENT_TYPE_NODE=NodeType.DOCUMENT_TYPE_NODE=10;var DOCUMENT_FRAGMENT_NODE=NodeType.DOCUMENT_FRAGMENT_NODE=11;var NOTATION_NODE=NodeType.NOTATION_NODE=12;var ExceptionCode={};var ExceptionMessage={};var INDEX_SIZE_ERR=ExceptionCode.INDEX_SIZE_ERR=(ExceptionMessage[1]=\"Index size error\",1);var DOMSTRING_SIZE_ERR=ExceptionCode.DOMSTRING_SIZE_ERR=(ExceptionMessage[2]=\"DOMString size error\",2);var HIERARCHY_REQUEST_ERR=ExceptionCode.HIERARCHY_REQUEST_ERR=(ExceptionMessage[3]=\"Hierarchy request error\",3);var WRONG_DOCUMENT_ERR=ExceptionCode.WRONG_DOCUMENT_ERR=(ExceptionMessage[4]=\"Wrong document\",4);var INVALID_CHARACTER_ERR=ExceptionCode.INVALID_CHARACTER_ERR=(ExceptionMessage[5]=\"Invalid character\",5);var NO_DATA_ALLOWED_ERR=ExceptionCode.NO_DATA_ALLOWED_ERR=(ExceptionMessage[6]=\"No data allowed\",6);var NO_MODIFICATION_ALLOWED_ERR=ExceptionCode.NO_MODIFICATION_ALLOWED_ERR=(ExceptionMessage[7]=\"No modification allowed\",7);var NOT_FOUND_ERR=ExceptionCode.NOT_FOUND_ERR=(ExceptionMessage[8]=\"Not found\",8);var NOT_SUPPORTED_ERR=ExceptionCode.NOT_SUPPORTED_ERR=(ExceptionMessage[9]=\"Not supported\",9);var INUSE_ATTRIBUTE_ERR=ExceptionCode.INUSE_ATTRIBUTE_ERR=(ExceptionMessage[10]=\"Attribute in use\",10);var INVALID_STATE_ERR=ExceptionCode.INVALID_STATE_ERR=(ExceptionMessage[11]=\"Invalid state\",11);var SYNTAX_ERR=ExceptionCode.SYNTAX_ERR=(ExceptionMessage[12]=\"Syntax error\",12);var INVALID_MODIFICATION_ERR=ExceptionCode.INVALID_MODIFICATION_ERR=(ExceptionMessage[13]=\"Invalid modification\",13);var NAMESPACE_ERR=ExceptionCode.NAMESPACE_ERR=(ExceptionMessage[14]=\"Invalid namespace\",14);var INVALID_ACCESS_ERR=ExceptionCode.INVALID_ACCESS_ERR=(ExceptionMessage[15]=\"Invalid access\",15);function DOMException(code,message){if(message instanceof Error){var error=message}else{error=this;Error.call(this,ExceptionMessage[code]);this.message=ExceptionMessage[code];if(Error.captureStackTrace)Error.captureStackTrace(this,DOMException)}error.code=code;if(message)this.message=this.message+\": \"+message;return error}DOMException.prototype=Error.prototype;copy(ExceptionCode,DOMException);function NodeList(){}NodeList.prototype={length:0,item:function(index){return this[index]||null},toString:function(isHTML,nodeFilter){for(var buf=[],i=0;i=0){var lastIndex=list.length-1;while(i0},lookupPrefix:function(namespaceURI){var el=this;while(el){var map=el._nsMap;if(map){for(var n in map){if(map[n]==namespaceURI){return n}}}el=el.nodeType==ATTRIBUTE_NODE?el.ownerDocument:el.parentNode}return null},lookupNamespaceURI:function(prefix){var el=this;while(el){var map=el._nsMap;if(map){if(prefix in map){return map[prefix]}}el=el.nodeType==ATTRIBUTE_NODE?el.ownerDocument:el.parentNode}return null},isDefaultNamespace:function(namespaceURI){var prefix=this.lookupPrefix(namespaceURI);return prefix==null}};function _xmlEncoder(c){return c==\"<\"&&\"<\"||c==\">\"&&\">\"||c==\"&\"&&\"&\"||c=='\"'&&\""\"||\"&#\"+c.charCodeAt()+\";\"}copy(NodeType,Node);copy(NodeType,Node.prototype);function _visitNode(node,callback){if(callback(node)){return true}if(node=node.firstChild){do{if(_visitNode(node,callback)){return true}}while(node=node.nextSibling)}}function Document(){}function _onAddAttribute(doc,el,newAttr){doc&&doc._inc++;var ns=newAttr.namespaceURI;if(ns==\"http://www.w3.org/2000/xmlns/\"){el._nsMap[newAttr.prefix?newAttr.localName:\"\"]=newAttr.value}}function _onRemoveAttribute(doc,el,newAttr,remove){doc&&doc._inc++;var ns=newAttr.namespaceURI;if(ns==\"http://www.w3.org/2000/xmlns/\"){delete el._nsMap[newAttr.prefix?newAttr.localName:\"\"]}}function _onUpdateChild(doc,el,newChild){if(doc&&doc._inc){doc._inc++;var cs=el.childNodes;if(newChild){cs[cs.length++]=newChild}else{var child=el.firstChild;var i=0;while(child){cs[i++]=child;child=child.nextSibling}cs.length=i}}}function _removeChild(parentNode,child){var previous=child.previousSibling;var next=child.nextSibling;if(previous){previous.nextSibling=next}else{parentNode.firstChild=next}if(next){next.previousSibling=previous}else{parentNode.lastChild=previous}_onUpdateChild(parentNode.ownerDocument,parentNode);return child}function _insertBefore(parentNode,newChild,nextChild){var cp=newChild.parentNode;if(cp){cp.removeChild(newChild)}if(newChild.nodeType===DOCUMENT_FRAGMENT_NODE){var newFirst=newChild.firstChild;if(newFirst==null){return newChild}var newLast=newChild.lastChild}else{newFirst=newLast=newChild}var pre=nextChild?nextChild.previousSibling:parentNode.lastChild;newFirst.previousSibling=pre;newLast.nextSibling=nextChild;if(pre){pre.nextSibling=newFirst}else{parentNode.firstChild=newFirst}if(nextChild==null){parentNode.lastChild=newLast}else{nextChild.previousSibling=newLast}do{newFirst.parentNode=parentNode}while(newFirst!==newLast&&(newFirst=newFirst.nextSibling));_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);if(newChild.nodeType==DOCUMENT_FRAGMENT_NODE){newChild.firstChild=newChild.lastChild=null}return newChild}function _appendSingleChild(parentNode,newChild){var cp=newChild.parentNode;if(cp){var pre=parentNode.lastChild;cp.removeChild(newChild);var pre=parentNode.lastChild}var pre=parentNode.lastChild;newChild.parentNode=parentNode;newChild.previousSibling=pre;newChild.nextSibling=null;if(pre){pre.nextSibling=newChild}else{parentNode.firstChild=newChild}parentNode.lastChild=newChild;_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);return newChild}Document.prototype={nodeName:\"#document\",nodeType:DOCUMENT_NODE,doctype:null,documentElement:null,_inc:1,insertBefore:function(newChild,refChild){if(newChild.nodeType==DOCUMENT_FRAGMENT_NODE){var child=newChild.firstChild;while(child){var next=child.nextSibling;this.insertBefore(child,refChild);child=next}return newChild}if(this.documentElement==null&&newChild.nodeType==ELEMENT_NODE){this.documentElement=newChild}return _insertBefore(this,newChild,refChild),newChild.ownerDocument=this,newChild},removeChild:function(oldChild){if(this.documentElement==oldChild){this.documentElement=null}return _removeChild(this,oldChild)},importNode:function(importedNode,deep){return importNode(this,importedNode,deep)},getElementById:function(id){var rtv=null;_visitNode(this.documentElement,function(node){if(node.nodeType==ELEMENT_NODE){if(node.getAttribute(\"id\")==id){rtv=node;return true}}});return rtv},createElement:function(tagName){var node=new Element;node.ownerDocument=this;node.nodeName=tagName;node.tagName=tagName;node.childNodes=new NodeList;var attrs=node.attributes=new NamedNodeMap;attrs._ownerElement=node;return node},createDocumentFragment:function(){var node=new DocumentFragment;node.ownerDocument=this;node.childNodes=new NodeList;return node},createTextNode:function(data){var node=new Text;node.ownerDocument=this;node.appendData(data);return node},createComment:function(data){var node=new Comment;node.ownerDocument=this;node.appendData(data);return node},createCDATASection:function(data){var node=new CDATASection;node.ownerDocument=this;node.appendData(data);return node},createProcessingInstruction:function(target,data){var node=new ProcessingInstruction;node.ownerDocument=this;node.tagName=node.target=target;node.nodeValue=node.data=data;return node},createAttribute:function(name){var node=new Attr;node.ownerDocument=this;node.name=name;node.nodeName=name;node.localName=name;node.specified=true;return node},createEntityReference:function(name){var node=new EntityReference;node.ownerDocument=this;node.nodeName=name;return node},createElementNS:function(namespaceURI,qualifiedName){var node=new Element;var pl=qualifiedName.split(\":\");var attrs=node.attributes=new NamedNodeMap;node.childNodes=new NodeList;node.ownerDocument=this;node.nodeName=qualifiedName;node.tagName=qualifiedName;node.namespaceURI=namespaceURI;if(pl.length==2){node.prefix=pl[0];node.localName=pl[1]}else{node.localName=qualifiedName}attrs._ownerElement=node;return node},createAttributeNS:function(namespaceURI,qualifiedName){var node=new Attr;var pl=qualifiedName.split(\":\");node.ownerDocument=this;node.nodeName=qualifiedName;node.name=qualifiedName;node.namespaceURI=namespaceURI;node.specified=true;if(pl.length==2){node.prefix=pl[0];node.localName=pl[1]}else{node.localName=qualifiedName}return node}};_extends(Document,Node);function Element(){this._nsMap={}}Element.prototype={nodeType:ELEMENT_NODE,hasAttribute:function(name){return this.getAttributeNode(name)!=null},getAttribute:function(name){var attr=this.getAttributeNode(name);return attr&&attr.value||\"\"},getAttributeNode:function(name){return this.attributes.getNamedItem(name)},setAttribute:function(name,value){var attr=this.ownerDocument.createAttribute(name);attr.value=attr.nodeValue=\"\"+value;this.setAttributeNode(attr)},removeAttribute:function(name){var attr=this.getAttributeNode(name);attr&&this.removeAttributeNode(attr)},appendChild:function(newChild){if(newChild.nodeType===DOCUMENT_FRAGMENT_NODE){return this.insertBefore(newChild,null)}else{return _appendSingleChild(this,newChild)}},setAttributeNode:function(newAttr){return this.attributes.setNamedItem(newAttr)},setAttributeNodeNS:function(newAttr){return this.attributes.setNamedItemNS(newAttr)},removeAttributeNode:function(oldAttr){return this.attributes.removeNamedItem(oldAttr.nodeName)},removeAttributeNS:function(namespaceURI,localName){var old=this.getAttributeNodeNS(namespaceURI,localName);old&&this.removeAttributeNode(old)},hasAttributeNS:function(namespaceURI,localName){return this.getAttributeNodeNS(namespaceURI,localName)!=null},getAttributeNS:function(namespaceURI,localName){var attr=this.getAttributeNodeNS(namespaceURI,localName);return attr&&attr.value||\"\"},setAttributeNS:function(namespaceURI,qualifiedName,value){var attr=this.ownerDocument.createAttributeNS(namespaceURI,qualifiedName);attr.value=attr.nodeValue=\"\"+value;this.setAttributeNode(attr)},getAttributeNodeNS:function(namespaceURI,localName){return this.attributes.getNamedItemNS(namespaceURI,localName)},getElementsByTagName:function(tagName){return new LiveNodeList(this,function(base){var ls=[];_visitNode(base,function(node){if(node!==base&&node.nodeType==ELEMENT_NODE&&(tagName===\"*\"||node.tagName==tagName)){ls.push(node)}});return ls})},getElementsByTagNameNS:function(namespaceURI,localName){return new LiveNodeList(this,function(base){var ls=[];_visitNode(base,function(node){if(node!==base&&node.nodeType===ELEMENT_NODE&&(namespaceURI===\"*\"||node.namespaceURI===namespaceURI)&&(localName===\"*\"||node.localName==localName)){ls.push(node)}});return ls})}};Document.prototype.getElementsByTagName=Element.prototype.getElementsByTagName;Document.prototype.getElementsByTagNameNS=Element.prototype.getElementsByTagNameNS;_extends(Element,Node);function Attr(){}Attr.prototype.nodeType=ATTRIBUTE_NODE;_extends(Attr,Node);function CharacterData(){}CharacterData.prototype={data:\"\",substringData:function(offset,count){return this.data.substring(offset,offset+count)},appendData:function(text){text=this.data+text;this.nodeValue=this.data=text;this.length=text.length},insertData:function(offset,text){this.replaceData(offset,0,text)},appendChild:function(newChild){throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])},deleteData:function(offset,count){this.replaceData(offset,count,\"\")},replaceData:function(offset,count,text){var start=this.data.substring(0,offset);var end=this.data.substring(offset+count);text=start+text+end;this.nodeValue=this.data=text;this.length=text.length}};_extends(CharacterData,Node);function Text(){}Text.prototype={nodeName:\"#text\",nodeType:TEXT_NODE,splitText:function(offset){var text=this.data;var newText=text.substring(offset);text=text.substring(0,offset);this.data=this.nodeValue=text;this.length=text.length;var newNode=this.ownerDocument.createTextNode(newText);if(this.parentNode){this.parentNode.insertBefore(newNode,this.nextSibling)}return newNode}};_extends(Text,CharacterData);function Comment(){}Comment.prototype={nodeName:\"#comment\",nodeType:COMMENT_NODE};_extends(Comment,CharacterData);function CDATASection(){}CDATASection.prototype={nodeName:\"#cdata-section\",nodeType:CDATA_SECTION_NODE};_extends(CDATASection,CharacterData);function DocumentType(){}DocumentType.prototype.nodeType=DOCUMENT_TYPE_NODE;_extends(DocumentType,Node);function Notation(){}Notation.prototype.nodeType=NOTATION_NODE;_extends(Notation,Node);function Entity(){}Entity.prototype.nodeType=ENTITY_NODE;_extends(Entity,Node);function EntityReference(){}EntityReference.prototype.nodeType=ENTITY_REFERENCE_NODE;_extends(EntityReference,Node);function DocumentFragment(){}DocumentFragment.prototype.nodeName=\"#document-fragment\";DocumentFragment.prototype.nodeType=DOCUMENT_FRAGMENT_NODE;_extends(DocumentFragment,Node);function ProcessingInstruction(){}ProcessingInstruction.prototype.nodeType=PROCESSING_INSTRUCTION_NODE;_extends(ProcessingInstruction,Node);function XMLSerializer(){}XMLSerializer.prototype.serializeToString=function(node,isHtml,nodeFilter){return nodeSerializeToString.call(node,isHtml,nodeFilter)};Node.prototype.toString=nodeSerializeToString;function nodeSerializeToString(isHtml,nodeFilter){var buf=[];var refNode=this.nodeType==9?this.documentElement:this;var prefix=refNode.prefix;var uri=refNode.namespaceURI;if(uri&&prefix==null){var prefix=refNode.lookupPrefix(uri);if(prefix==null){var visibleNamespaces=[{namespace:uri,prefix:null}]}}serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);return buf.join(\"\")}function needNamespaceDefine(node,isHTML,visibleNamespaces){var prefix=node.prefix||\"\";var uri=node.namespaceURI;if(!prefix&&!uri){return false}if(prefix===\"xml\"&&uri===\"http://www.w3.org/XML/1998/namespace\"||uri==\"http://www.w3.org/2000/xmlns/\"){return false}var i=visibleNamespaces.length;while(i--){var ns=visibleNamespaces[i];if(ns.prefix==prefix){return ns.namespace!=uri}}return true}function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){if(nodeFilter){node=nodeFilter(node);if(node){if(typeof node==\"string\"){buf.push(node);return}}else{return}}switch(node.nodeType){case ELEMENT_NODE:if(!visibleNamespaces)visibleNamespaces=[];var startVisibleNamespaces=visibleNamespaces.length;var attrs=node.attributes;var len=attrs.length;var child=node.firstChild;var nodeName=node.tagName;isHTML=htmlns===node.namespaceURI||isHTML;buf.push(\"<\",nodeName);for(var i=0;i\");if(isHTML&&/^script$/i.test(nodeName)){while(child){if(child.data){buf.push(child.data)}else{serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces)}child=child.nextSibling}}else{while(child){serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);child=child.nextSibling}}buf.push(\"\")}else{buf.push(\"/>\")}return;case DOCUMENT_NODE:case DOCUMENT_FRAGMENT_NODE:var child=node.firstChild;while(child){serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);child=child.nextSibling}return;case ATTRIBUTE_NODE:return buf.push(\" \",node.name,'=\"',node.value.replace(/[<&\"]/g,_xmlEncoder),'\"');case TEXT_NODE:return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));case CDATA_SECTION_NODE:return buf.push(\"\");case COMMENT_NODE:return buf.push(\"\\x3c!--\",node.data,\"--\\x3e\");case DOCUMENT_TYPE_NODE:var pubid=node.publicId;var sysid=node.systemId;buf.push(\"')}else if(sysid&&sysid!=\".\"){buf.push(' SYSTEM \"',sysid,'\">')}else{var sub=node.internalSubset;if(sub){buf.push(\" [\",sub,\"]\")}buf.push(\">\")}return;case PROCESSING_INSTRUCTION_NODE:return buf.push(\"\");case ENTITY_REFERENCE_NODE:return buf.push(\"&\",node.nodeName,\";\");default:buf.push(\"??\",node.nodeName)}}function importNode(doc,node,deep){var node2;switch(node.nodeType){case ELEMENT_NODE:node2=node.cloneNode(false);node2.ownerDocument=doc;case DOCUMENT_FRAGMENT_NODE:break;case ATTRIBUTE_NODE:deep=true;break}if(!node2){node2=node.cloneNode(false)}node2.ownerDocument=doc;node2.parentNode=null;if(deep){var child=node.firstChild;while(child){node2.appendChild(importNode(doc,child,deep));child=child.nextSibling}}return node2}function cloneNode(doc,node,deep){var node2=new node.constructor;for(var n in node){var v=node[n];if(typeof v!=\"object\"){if(v!=node2[n]){node2[n]=v}}}if(node.childNodes){node2.childNodes=new NodeList}node2.ownerDocument=doc;switch(node2.nodeType){case ELEMENT_NODE:var attrs=node.attributes;var attrs2=node2.attributes=new NamedNodeMap;var len=attrs.length;attrs2._ownerElement=node2;for(var i=0;i65535){code-=65536;var surrogate1=55296+(code>>10),surrogate2=56320+(code&1023);return String.fromCharCode(surrogate1,surrogate2)}else{return String.fromCharCode(code)}}function entityReplacer(a){var k=a.slice(1,-1);if(k in entityMap){return entityMap[k]}else if(k.charAt(0)===\"#\"){return fixedFromCharCode(parseInt(k.substr(1).replace(\"x\",\"0x\")))}else{errorHandler.error(\"entity not found:\"+a);return a}}function appendText(end){if(end>start){var xt=source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);locator&&position(start);domBuilder.characters(xt,0,end-start);start=end}}function position(p,m){while(p>=lineEnd&&(m=linePattern.exec(source))){lineStart=m.index;lineEnd=lineStart+m[0].length;locator.lineNumber++}locator.columnNumber=p-lineStart+1}var lineStart=0;var lineEnd=0;var linePattern=/.*(?:\\r\\n?|\\n)|.*$/g;var locator=domBuilder.locator;var parseStack=[{currentNSMap:defaultNSMapCopy}];var closeMap={};var start=0;while(true){try{var tagStart=source.indexOf(\"<\",start);if(tagStart<0){if(!source.substr(start).match(/^\\s*$/)){var doc=domBuilder.doc;var text=doc.createTextNode(source.substr(start));doc.appendChild(text);domBuilder.currentElement=text}return}if(tagStart>start){appendText(tagStart)}switch(source.charAt(tagStart+1)){case\"/\":var end=source.indexOf(\">\",tagStart+3);var tagName=source.substring(tagStart+2,end);var config=parseStack.pop();if(end<0){tagName=source.substring(tagStart+2).replace(/[\\s<].*/,\"\");errorHandler.error(\"end tag name: \"+tagName+\" is not complete:\"+config.tagName);end=tagStart+1+tagName.length}else if(tagName.match(/\\sstart){start=end}else{appendText(Math.max(tagStart,start)+1)}}}function copyLocator(f,t){t.lineNumber=f.lineNumber;t.columnNumber=f.columnNumber;return t}function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){var attrName;var value;var p=++start;var s=S_TAG;while(true){var c=source.charAt(p);switch(c){case\"=\":if(s===S_ATTR){attrName=source.slice(start,p);s=S_EQ}else if(s===S_ATTR_SPACE){s=S_EQ}else{throw new Error(\"attribute equal must after attrName\")}break;case\"'\":case'\"':if(s===S_EQ||s===S_ATTR){if(s===S_ATTR){errorHandler.warning('attribute value must after \"=\"');attrName=source.slice(start,p)}start=p+1;p=source.indexOf(c,start);if(p>0){value=source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);el.add(attrName,value,start-1);s=S_ATTR_END}else{throw new Error(\"attribute value no end '\"+c+\"' match\")}}else if(s==S_ATTR_NOQUOT_VALUE){value=source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);el.add(attrName,value,start);errorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+\")!!\");start=p+1;s=S_ATTR_END}else{throw new Error('attribute value must after \"=\"')}break;case\"/\":switch(s){case S_TAG:el.setTagName(source.slice(start,p));case S_ATTR_END:case S_TAG_SPACE:case S_TAG_CLOSE:s=S_TAG_CLOSE;el.closed=true;case S_ATTR_NOQUOT_VALUE:case S_ATTR:case S_ATTR_SPACE:break;default:throw new Error(\"attribute invalid close char('/')\")}break;case\"\":errorHandler.error(\"unexpected end of input\");if(s==S_TAG){el.setTagName(source.slice(start,p))}return p;case\">\":switch(s){case S_TAG:el.setTagName(source.slice(start,p));case S_ATTR_END:case S_TAG_SPACE:case S_TAG_CLOSE:break;case S_ATTR_NOQUOT_VALUE:case S_ATTR:value=source.slice(start,p);if(value.slice(-1)===\"/\"){el.closed=true;value=value.slice(0,-1)}case S_ATTR_SPACE:if(s===S_ATTR_SPACE){value=attrName}if(s==S_ATTR_NOQUOT_VALUE){errorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');el.add(attrName,value.replace(/&#?\\w+;/g,entityReplacer),start)}else{if(currentNSMap[\"\"]!==\"http://www.w3.org/1999/xhtml\"||!value.match(/^(?:disabled|checked|selected)$/i)){errorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')}el.add(value,value,start)}break;case S_EQ:throw new Error(\"attribute value missed!!\")}return p;case\"€\":c=\" \";default:if(c<=\" \"){switch(s){case S_TAG:el.setTagName(source.slice(start,p));s=S_TAG_SPACE;break;case S_ATTR:attrName=source.slice(start,p);s=S_ATTR_SPACE;break;case S_ATTR_NOQUOT_VALUE:var value=source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);errorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');el.add(attrName,value,start);case S_ATTR_END:s=S_TAG_SPACE;break}}else{switch(s){case S_ATTR_SPACE:var tagName=el.tagName;if(currentNSMap[\"\"]!==\"http://www.w3.org/1999/xhtml\"||!attrName.match(/^(?:disabled|checked|selected)$/i)){errorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')}el.add(attrName,attrName,start);start=p;s=S_ATTR;break;case S_ATTR_END:errorHandler.warning('attribute space is required\"'+attrName+'\"!!');case S_TAG_SPACE:s=S_ATTR;start=p;break;case S_EQ:s=S_ATTR_NOQUOT_VALUE;start=p;break;case S_TAG_CLOSE:throw new Error(\"elements closed character '/' and '>' must be connected to\")}}}p++}}function appendElement(el,domBuilder,currentNSMap){var tagName=el.tagName;var localNSMap=null;var i=el.length;while(i--){var a=el[i];var qName=a.qName;var value=a.value;var nsp=qName.indexOf(\":\");if(nsp>0){var prefix=a.prefix=qName.slice(0,nsp);var localName=qName.slice(nsp+1);var nsPrefix=prefix===\"xmlns\"&&localName}else{localName=qName;prefix=null;nsPrefix=qName===\"xmlns\"&&\"\"}a.localName=localName;if(nsPrefix!==false){if(localNSMap==null){localNSMap={};_copy(currentNSMap,currentNSMap={})}currentNSMap[nsPrefix]=localNSMap[nsPrefix]=value;a.uri=\"http://www.w3.org/2000/xmlns/\";domBuilder.startPrefixMapping(nsPrefix,value)}}var i=el.length;while(i--){a=el[i];var prefix=a.prefix;if(prefix){if(prefix===\"xml\"){a.uri=\"http://www.w3.org/XML/1998/namespace\"}if(prefix!==\"xmlns\"){a.uri=currentNSMap[prefix||\"\"]}}}var nsp=tagName.indexOf(\":\");if(nsp>0){prefix=el.prefix=tagName.slice(0,nsp);localName=el.localName=tagName.slice(nsp+1)}else{prefix=null;localName=el.localName=tagName}var ns=el.uri=currentNSMap[prefix||\"\"];domBuilder.startElement(ns,localName,tagName,el);if(el.closed){domBuilder.endElement(ns,localName,tagName);if(localNSMap){for(prefix in localNSMap){domBuilder.endPrefixMapping(prefix)}}}else{el.currentNSMap=currentNSMap;el.localNSMap=localNSMap;return true}}function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){if(/^(?:script|textarea)$/i.test(tagName)){var elEndStart=source.indexOf(\"\",elStartEnd);var text=source.substring(elStartEnd+1,elEndStart);if(/[&<]/.test(text)){if(/^script$/i.test(tagName)){domBuilder.characters(text,0,text.length);return elEndStart}text=text.replace(/&#?\\w+;/g,entityReplacer);domBuilder.characters(text,0,text.length);return elEndStart}}return elStartEnd+1}function fixSelfClosed(source,elStartEnd,tagName,closeMap){var pos=closeMap[tagName];if(pos==null){pos=source.lastIndexOf(\"\");if(posstart){domBuilder.comment(source,start+4,end-start-4);return end+3}else{errorHandler.error(\"Unclosed comment\");return-1}}else{return-1}default:if(source.substr(start+3,6)==\"CDATA[\"){var end=source.indexOf(\"]]>\",start+9);domBuilder.startCDATA();domBuilder.characters(source,start+9,end-start-9);domBuilder.endCDATA();return end+3}var matchs=split(source,start);var len=matchs.length;if(len>1&&/!doctype/i.test(matchs[0][0])){var name=matchs[1][0];var pubid=len>3&&/^public$/i.test(matchs[2][0])&&matchs[3][0];var sysid=len>4&&matchs[4][0];var lastMatch=matchs[len-1];domBuilder.startDTD(name,pubid&&pubid.replace(/^(['\"])(.*?)\\1$/,\"$2\"),sysid&&sysid.replace(/^(['\"])(.*?)\\1$/,\"$2\"));domBuilder.endDTD();return lastMatch.index+lastMatch[0].length}}return-1}function parseInstruction(source,start,domBuilder){var end=source.indexOf(\"?>\",start);if(end){var match=source.substring(start,end).match(/^<\\?(\\S*)\\s*([\\s\\S]*?)\\s*$/);if(match){var len=match[0].length;domBuilder.processingInstruction(match[1],match[2]);return end+2}else{return-1}}return-1}function ElementAttributes(source){}ElementAttributes.prototype={setTagName:function(tagName){if(!tagNamePattern.test(tagName)){throw new Error(\"invalid tagName:\"+tagName)}this.tagName=tagName},add:function(qName,value,offset){if(!tagNamePattern.test(qName)){throw new Error(\"invalid attribute:\"+qName)}this[this.length++]={qName:qName,value:value,offset:offset}},length:0,getLocalName:function(i){return this[i].localName},getLocator:function(i){return this[i].locator},getQName:function(i){return this[i].qName},getURI:function(i){return this[i].uri},getValue:function(i){return this[i].value}};function _set_proto_(thiz,parent){thiz.__proto__=parent;return thiz}if(!(_set_proto_({},_set_proto_.prototype)instanceof _set_proto_)){_set_proto_=function(thiz,parent){function p(){}p.prototype=parent;p=new p;for(parent in thiz){p[parent]=thiz[parent]}return p}}function split(source,start){var match;var buf=[];var reg=/'[^']+'|\"[^\"]+\"|[^\\s<>\\/=]+=?|(\\/?\\s*>|<)/g;reg.lastIndex=start;reg.exec(source);while(match=reg.exec(source)){buf.push(match);if(match[1])return buf}}exports.XMLReader=XMLReader},{}],\"/src/js/docxtemplater.js\":[function(require,module,exports){\"use strict\";var _createClass=function(){function defineProperties(target,props){for(var i=0;i0){throw new Error(\"The constructor with parameters have been removed in docxtemplater 3.0, please check the upgrade guide.\")}this.compiled={};this.modules=[];this.setOptions({})}_createClass(Docxtemplater,[{key:\"attachModule\",value:function attachModule(module){this.modules.push(wrapper(module));return this}},{key:\"setOptions\",value:function setOptions(options){var _this=this;this.options=options;Object.keys(DocUtils.defaults).forEach(function(key){var defaultValue=DocUtils.defaults[key];_this[key]=_this.options[key]!=null?_this.options[key]:defaultValue});if(this.zip){this.updateFileTypeConfig()}return this}},{key:\"loadZip\",value:function loadZip(zip){if(zip.loadAsync){throw new Error(\"Docxtemplater doesn't handle JSZip version >=3, see changelog\")}this.zip=zip;this.updateFileTypeConfig();return this}},{key:\"compileFile\",value:function compileFile(fileName){var currentFile=this.createTemplateClass(fileName);currentFile.parse();this.compiled[fileName]=currentFile}},{key:\"compile\",value:function compile(){this.templatedFiles=this.fileTypeConfig.getTemplatedFiles(this.zip);return this}},{key:\"updateFileTypeConfig\",value:function updateFileTypeConfig(){this.fileType=this.zip.files[\"word/document.xml\"]?\"docx\":\"pptx\";this.fileTypeConfig=this.options.fileTypeConfig||Docxtemplater.FileTypeConfig[this.fileType];return this}},{key:\"render\",value:function render(){var _this2=this;this.options.xmlFileNames=[];this.modules=this.fileTypeConfig.baseModules.map(function(moduleFunction){return moduleFunction()}).concat(this.modules);this.options=this.modules.reduce(function(options,module){return module.optionsTransformer(options,_this2)},this.options);this.xmlDocuments=this.options.xmlFileNames.reduce(function(xmlDocuments,fileName){var content=_this2.zip.files[fileName].asText();xmlDocuments[fileName]=DocUtils.str2xml(content);return xmlDocuments},{});this.modules.forEach(function(module){module.set({zip:_this2.zip,xmlDocuments:_this2.xmlDocuments,data:_this2.data})});this.compile();this.modules.forEach(function(module){module.set({compiled:_this2.compiled})});this.templatedFiles.forEach(function(fileName){if(_this2.zip.files[fileName]!=null){_this2.compileFile(fileName)}});this.mapper=this.modules.reduce(function(value,module){return module.getRenderedMap(value)},{});Object.keys(this.mapper).forEach(function(to){var mapped=_this2.mapper[to];var from=mapped.from;var currentFile=_this2.compiled[from];currentFile.setTags(mapped.data);currentFile.render(to);_this2.zip.file(to,currentFile.content)});Object.keys(this.xmlDocuments).forEach(function(fileName){_this2.zip.remove(fileName);var content=DocUtils.xml2str(_this2.xmlDocuments[fileName]);return _this2.zip.file(fileName,content,{})});return this}},{key:\"setData\",value:function setData(data){this.data=data;return this}},{key:\"getZip\",value:function getZip(){return this.zip}},{key:\"createTemplateClass\",value:function createTemplateClass(path){var usedData=this.zip.files[path].asText();return this.createTemplateClassFromContent(usedData,path)}},{key:\"createTemplateClassFromContent\",value:function createTemplateClassFromContent(content,filePath){var _this3=this;var xmltOptions={filePath:filePath};Object.keys(DocUtils.defaults).forEach(function(key){xmltOptions[key]=_this3[key]});xmltOptions.fileTypeConfig=this.fileTypeConfig;xmltOptions.modules=this.modules;return new Docxtemplater.XmlTemplater(content,xmltOptions)}},{key:\"getFullText\",value:function getFullText(path){return this.createTemplateClass(path||this.fileTypeConfig.textPath).getFullText()}},{key:\"getTemplatedFiles\",value:function getTemplatedFiles(){this.compile();return this.templatedFiles}}]);return Docxtemplater}();Docxtemplater.DocUtils=require(\"./doc-utils\");Docxtemplater.Errors=require(\"./errors\");Docxtemplater.XmlTemplater=require(\"./xml-templater\");Docxtemplater.FileTypeConfig=require(\"./file-type-config\");Docxtemplater.XmlMatcher=require(\"./xml-matcher\");module.exports=Docxtemplater},{\"./doc-utils\":1,\"./errors\":2,\"./file-type-config\":3,\"./module-wrapper\":7,\"./traits\":16,\"./xml-matcher\":17,\"./xml-templater\":18}]},{},[])(\"/src/js/docxtemplater.js\")});","/*!\n\nJSZip - A Javascript class for generating and reading zip files\n\n\n(c) 2009-2014 Stuart Knightley \nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/master/LICENSE\n*/\n!function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,b.JSZip=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f-this.zero;return-1},d.prototype.readData=function(a){if(this.checkOffset(a),0===a)return[];var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{\"./dataReader\":6}],2:[function(a,b,c){\"use strict\";var d=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";c.encode=function(a,b){for(var c,e,f,g,h,i,j,k=\"\",l=0;l>2,h=(3&c)<<4|e>>4,i=(15&e)<<2|f>>6,j=63&f,isNaN(e)?i=j=64:isNaN(f)&&(j=64),k=k+d.charAt(g)+d.charAt(h)+d.charAt(i)+d.charAt(j);return k},c.decode=function(a,b){var c,e,f,g,h,i,j,k=\"\",l=0;for(a=a.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");l>4,e=(15&h)<<4|i>>2,f=(3&i)<<6|j,k+=String.fromCharCode(c),64!=i&&(k+=String.fromCharCode(e)),64!=j&&(k+=String.fromCharCode(f));return k}},{}],3:[function(a,b,c){\"use strict\";function d(){this.compressedSize=0,this.uncompressedSize=0,this.crc32=0,this.compressionMethod=null,this.compressedContent=null}d.prototype={getContent:function(){return null},getCompressedContent:function(){return null}},b.exports=d},{}],4:[function(a,b,c){\"use strict\";c.STORE={magic:\"\\0\\0\",compress:function(a,b){return a},uncompress:function(a){return a},compressInputType:null,uncompressInputType:null},c.DEFLATE=a(\"./flate\")},{\"./flate\":9}],5:[function(a,b,c){\"use strict\";var d=a(\"./utils\"),e=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];b.exports=function(a,b){if(\"undefined\"==typeof a||!a.length)return 0;var c=\"string\"!==d.getTypeOf(a);\"undefined\"==typeof b&&(b=0);var f=0,g=0,h=0;b^=-1;for(var i=0,j=a.length;i>>8^f;return b^-1}},{\"./utils\":22}],6:[function(a,b,c){\"use strict\";function d(a){this.data=null,this.length=0,this.index=0,this.zero=0}var e=a(\"./utils\");d.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.length=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return e.transformTo(\"string\",this.readData(a))},readData:function(a){},lastIndexOfSignature:function(a){},readDate:function(){var a=this.readInt(4);return new Date((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1)}},b.exports=d},{\"./utils\":22}],7:[function(a,b,c){\"use strict\";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!1,c.date=null,c.compression=null,c.compressionOptions=null,c.comment=null,c.unixPermissions=null,c.dosPermissions=null},{}],8:[function(a,b,c){\"use strict\";var d=a(\"./utils\");c.string2binary=function(a){return d.string2binary(a)},c.string2Uint8Array=function(a){return d.transformTo(\"uint8array\",a)},c.uint8Array2String=function(a){return d.transformTo(\"string\",a)},c.string2Blob=function(a){var b=d.transformTo(\"arraybuffer\",a);return d.arrayBuffer2Blob(b)},c.arrayBuffer2Blob=function(a){return d.arrayBuffer2Blob(a)},c.transformTo=function(a,b){return d.transformTo(a,b)},c.getTypeOf=function(a){return d.getTypeOf(a)},c.checkSupport=function(a){return d.checkSupport(a)},c.MAX_VALUE_16BITS=d.MAX_VALUE_16BITS,c.MAX_VALUE_32BITS=d.MAX_VALUE_32BITS,c.pretty=function(a){return d.pretty(a)},c.findCompression=function(a){return d.findCompression(a)},c.isRegExp=function(a){return d.isRegExp(a)}},{\"./utils\":22}],9:[function(a,b,c){\"use strict\";var d=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,e=a(\"pako\");c.uncompressInputType=d?\"uint8array\":\"array\",c.compressInputType=d?\"uint8array\":\"array\",c.magic=\"\\b\\0\",c.compress=function(a,b){return e.deflateRaw(a,{level:b.level||-1})},c.uncompress=function(a){return e.inflateRaw(a)}},{pako:25}],10:[function(a,b,c){\"use strict\";function d(a,b){return this instanceof d?(this.files={},this.comment=null,this.root=\"\",a&&this.load(a,b),void(this.clone=function(){var a=new d;for(var b in this)\"function\"!=typeof this[b]&&(a[b]=this[b]);return a})):new d(a,b)}var e=a(\"./base64\");d.prototype=a(\"./object\"),d.prototype.load=a(\"./load\"),d.support=a(\"./support\"),d.defaults=a(\"./defaults\"),d.utils=a(\"./deprecatedPublicUtils\"),d.base64={encode:function(a){return e.encode(a)},decode:function(a){return e.decode(a)}},d.compressions=a(\"./compressions\"),b.exports=d},{\"./base64\":2,\"./compressions\":4,\"./defaults\":7,\"./deprecatedPublicUtils\":8,\"./load\":11,\"./object\":14,\"./support\":18}],11:[function(a,b,c){\"use strict\";var d=a(\"./base64\"),e=a(\"./utf8\"),f=a(\"./utils\"),g=a(\"./zipEntries\");b.exports=function(a,b){var c,h,i,j;for(b=f.extend(b||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:e.utf8decode}),b.base64&&(a=d.decode(a)),h=new g(a,b),c=h.files,i=0;i>>=8;return d},u=function(a){return a=a||{},a.base64!==!0||null!==a.binary&&void 0!==a.binary||(a.binary=!0),a=e.extend(a,h),a.date=a.date||new Date,null!==a.compression&&(a.compression=a.compression.toUpperCase()),a},v=function(a,b,c){var d,f=e.getTypeOf(b);if(c=u(c),\"string\"==typeof c.unixPermissions&&(c.unixPermissions=parseInt(c.unixPermissions,8)),c.unixPermissions&&16384&c.unixPermissions&&(c.dir=!0),c.dosPermissions&&16&c.dosPermissions&&(c.dir=!0),c.dir&&(a=x(a)),c.createFolders&&(d=w(a))&&y.call(this,d,!0),c.dir||null===b||\"undefined\"==typeof b)c.base64=!1,c.binary=!1,b=null,f=null;else if(\"string\"===f)c.binary&&!c.base64&&c.optimizedBinaryString!==!0&&(b=e.string2binary(b));else{if(c.base64=!1,c.binary=!0,!(f||b instanceof k))throw new Error(\"The data of '\"+a+\"' is in an unsupported format !\");\"arraybuffer\"===f&&(b=e.transformTo(\"uint8array\",b))}var g=new s(a,b,c);return this.files[a]=g,g},w=function(a){\"/\"==a.slice(-1)&&(a=a.substring(0,a.length-1));var b=a.lastIndexOf(\"/\");return b>0?a.substring(0,b):\"\"},x=function(a){return\"/\"!=a.slice(-1)&&(a+=\"/\"),a},y=function(a,b){return b=\"undefined\"!=typeof b&&b,a=x(a),this.files[a]||v.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},z=function(a,b,c){var d,g=new k;return a._data instanceof k?(g.uncompressedSize=a._data.uncompressedSize,g.crc32=a._data.crc32,0===g.uncompressedSize||a.dir?(b=j.STORE,g.compressedContent=\"\",g.crc32=0):a._data.compressionMethod===b.magic?g.compressedContent=a._data.getCompressedContent():(d=a._data.getContent(),g.compressedContent=b.compress(e.transformTo(b.compressInputType,d),c))):(d=q(a),d&&0!==d.length&&!a.dir||(b=j.STORE,d=\"\"),g.uncompressedSize=d.length,g.crc32=f(d),g.compressedContent=b.compress(e.transformTo(b.compressInputType,d),c)),g.compressedSize=g.compressedContent.length,g.compressionMethod=b.magic,g},A=function(a,b){var c=a;return a||(c=b?16893:33204),(65535&c)<<16},B=function(a,b){return 63&(a||0)},C=function(a,b,c,d,h,i){var j,k,l,n,o=(c.compressedContent,i!==m.utf8encode),p=e.transformTo(\"string\",i(b.name)),q=e.transformTo(\"string\",m.utf8encode(b.name)),r=b.comment||\"\",s=e.transformTo(\"string\",i(r)),u=e.transformTo(\"string\",m.utf8encode(r)),v=q.length!==b.name.length,w=u.length!==r.length,x=b.options,y=\"\",z=\"\",C=\"\";l=b._initialMetadata.dir!==b.dir?b.dir:x.dir,n=b._initialMetadata.date!==b.date?b.date:x.date;var D=0,E=0;l&&(D|=16),\"UNIX\"===h?(E=798,D|=A(b.unixPermissions,l)):(E=20,D|=B(b.dosPermissions,l)),j=n.getHours(),j<<=6,j|=n.getMinutes(),j<<=5,j|=n.getSeconds()/2,k=n.getFullYear()-1980,k<<=4,k|=n.getMonth()+1,k<<=5,k|=n.getDate(),v&&(z=t(1,1)+t(f(p),4)+q,y+=\"up\"+t(z.length,2)+z),w&&(C=t(1,1)+t(this.crc32(s),4)+u,y+=\"uc\"+t(C.length,2)+C);var F=\"\";F+=\"\\n\\0\",F+=o||!v&&!w?\"\\0\\0\":\"\\0\\b\",F+=c.compressionMethod,F+=t(j,2),F+=t(k,2),F+=t(c.crc32,4),F+=t(c.compressedSize,4),F+=t(c.uncompressedSize,4),F+=t(p.length,2),F+=t(y.length,2);var G=g.LOCAL_FILE_HEADER+F+p+y,H=g.CENTRAL_FILE_HEADER+t(E,2)+F+t(s.length,2)+\"\\0\\0\\0\\0\"+t(D,4)+t(d,4)+p+y+s;return{fileRecord:G,dirRecord:H,compressedObject:c}},D={load:function(a,b){throw new Error(\"Load method is not defined. Is the file jszip-load.js included ?\")},filter:function(a){var b,c,d,f,g=[];for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],f=new s(d.name,d._data,e.extend(d.options)),c=b.slice(this.root.length,b.length),b.slice(0,this.root.length)===this.root&&a(c,f)&&g.push(f));return g},file:function(a,b,c){if(1===arguments.length){if(e.isRegExp(a)){var d=a;return this.filter(function(a,b){return!b.dir&&d.test(a)})}return this.filter(function(b,c){return!c.dir&&b===a})[0]||null}return a=this.root+a,v.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(e.isRegExp(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=y.call(this,b),d=this.clone();return d.root=c.name,d},remove:function(a){a=this.root+a;var b=this.files[a];if(b||(\"/\"!=a.slice(-1)&&(a+=\"/\"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d=252?6:h>=248?5:h>=240?4:h>=224?3:h>=192?2:1;g[254]=g[254]=1;var i=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;f>>6,b[g++]=128|63&c):c<65536?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},j=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return c<0?b:0===c?b:c+g[a[c]]>b?c:b},k=function(a){var b,c,e,f,h=a.length,i=new Array(2*h);for(c=0,b=0;b4)i[c++]=65533,b+=f-1;else{for(e&=2===f?31:3===f?15:7;f>1&&b1?i[c++]=65533:e<65536?i[c++]=e:(e-=65536,i[c++]=55296|e>>10&1023,i[c++]=56320|1023&e)}return i.length!==c&&(i.subarray?i=i.subarray(0,c):i.length=c),d.applyFromCharCode(i)};c.utf8encode=function(a){return e.nodebuffer?f(a,\"utf-8\"):i(a)},c.utf8decode=function(a){if(e.nodebuffer)return d.transformTo(\"nodebuffer\",a).toString(\"utf-8\");a=d.transformTo(e.uint8array?\"uint8array\":\"array\",a);for(var b=[],c=0,f=a.length,g=65536;c1;)try{\"array\"===f||\"nodebuffer\"===f?d.push(String.fromCharCode.apply(null,a.slice(g,Math.min(g+b,e)))):d.push(String.fromCharCode.apply(null,a.subarray(g,Math.min(g+b,e)))),g+=b}catch(i){b=Math.floor(b/2)}return d.join(\"\")}function g(a,b){for(var c=0;c1)throw new Error(\"Multi-volumes zip are not supported\")},readLocalFiles:function(){var a,b;for(a=0;a0)this.isSignature(c,j.CENTRAL_FILE_HEADER)||(this.reader.zero=e);else if(e<0)throw new Error(\"Corrupted zip: missing \"+Math.abs(e)+\" bytes.\")},prepareReader:function(a){var b=i.getTypeOf(a);if(i.checkSupport(b),\"string\"!==b||l.uint8array)if(\"nodebuffer\"===b)this.reader=new f(a);else if(l.uint8array)this.reader=new g(i.transformTo(\"uint8array\",a));else{if(!l.array)throw new Error(\"Unexpected error: unsupported type '\"+b+\"'\");this.reader=new h(i.transformTo(\"array\",a))}else this.reader=new e(a,this.loadOptions.optimizedBinaryString)},load:function(a){this.prepareReader(a),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},b.exports=d},{\"./arrayReader\":1,\"./nodeBufferReader\":13,\"./object\":14,\"./signature\":15,\"./stringReader\":16,\"./support\":18,\"./uint8ArrayReader\":19,\"./utils\":22,\"./zipEntry\":24}],24:[function(a,b,c){\"use strict\";function d(a,b){this.options=a,this.loadOptions=b}var e=a(\"./stringReader\"),f=a(\"./utils\"),g=a(\"./compressedObject\"),h=a(\"./object\"),i=a(\"./support\"),j=0,k=3;d.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},prepareCompressedContent:function(a,b,c){return function(){var d=a.index;a.setIndex(b);var e=a.readData(c);return a.setIndex(d),e}},prepareContent:function(a,b,c,d,e){return function(){var a=f.transformTo(d.uncompressInputType,this.getCompressedContent()),b=d.uncompress(a);if(b.length!==e)throw new Error(\"Bug : uncompressed data size mismatch\");return b}},readLocalPart:function(a){var b,c;if(a.skip(22),this.fileNameLength=a.readInt(2),c=a.readInt(2),this.fileName=a.readData(this.fileNameLength),a.skip(c),this.compressedSize==-1||this.uncompressedSize==-1)throw new Error(\"Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize == -1 || uncompressedSize == -1)\");if(b=f.findCompression(this.compressionMethod),null===b)throw new Error(\"Corrupted zip : compression \"+f.pretty(this.compressionMethod)+\" unknown (inner file : \"+f.transformTo(\"string\",this.fileName)+\")\");if(this.decompressed=new g,this.decompressed.compressedSize=this.compressedSize,this.decompressed.uncompressedSize=this.uncompressedSize,this.decompressed.crc32=this.crc32,this.decompressed.compressionMethod=this.compressionMethod,this.decompressed.getCompressedContent=this.prepareCompressedContent(a,a.index,this.compressedSize,b),this.decompressed.getContent=this.prepareContent(a,a.index,this.compressedSize,b,this.uncompressedSize),this.loadOptions.checkCRC32&&(this.decompressed=f.transformTo(\"string\",this.decompressed.getContent()),h.crc32(this.decompressed)!==this.crc32))throw new Error(\"Corrupted zip : CRC32 mismatch\");\n},readCentralPart:function(a){if(this.versionMadeBy=a.readInt(2),this.versionNeeded=a.readInt(2),this.bitFlag=a.readInt(2),this.compressionMethod=a.readString(2),this.date=a.readDate(),this.crc32=a.readInt(4),this.compressedSize=a.readInt(4),this.uncompressedSize=a.readInt(4),this.fileNameLength=a.readInt(2),this.extraFieldsLength=a.readInt(2),this.fileCommentLength=a.readInt(2),this.diskNumberStart=a.readInt(2),this.internalFileAttributes=a.readInt(2),this.externalFileAttributes=a.readInt(4),this.localHeaderOffset=a.readInt(4),this.isEncrypted())throw new Error(\"Encrypted zip are not supported\");this.fileName=a.readData(this.fileNameLength),this.readExtraFields(a),this.parseZIP64ExtraField(a),this.fileComment=a.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var a=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),a===j&&(this.dosPermissions=63&this.externalFileAttributes),a===k&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(a){if(this.extraFields[1]){var b=new e(this.extraFields[1].value);this.uncompressedSize===f.MAX_VALUE_32BITS&&(this.uncompressedSize=b.readInt(8)),this.compressedSize===f.MAX_VALUE_32BITS&&(this.compressedSize=b.readInt(8)),this.localHeaderOffset===f.MAX_VALUE_32BITS&&(this.localHeaderOffset=b.readInt(8)),this.diskNumberStart===f.MAX_VALUE_32BITS&&(this.diskNumberStart=b.readInt(4))}},readExtraFields:function(a){var b,c,d,e=a.index;for(this.extraFields=this.extraFields||{};a.index0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var c=h.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==p)throw new Error(k[c]);if(b.header&&h.deflateSetHeader(this.strm,b.header),b.dictionary){var e;if(e=\"string\"==typeof b.dictionary?j.string2buf(b.dictionary):\"[object ArrayBuffer]\"===m.call(b.dictionary)?new Uint8Array(b.dictionary):b.dictionary,c=h.deflateSetDictionary(this.strm,e),c!==p)throw new Error(k[c]);this._dict_set=!0}}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}function g(a,b){return b=b||{},b.gzip=!0,e(a,b)}var h=a(\"./zlib/deflate\"),i=a(\"./utils/common\"),j=a(\"./utils/strings\"),k=a(\"./zlib/messages\"),l=a(\"./zlib/zstream\"),m=Object.prototype.toString,n=0,o=4,p=0,q=1,r=2,s=-1,t=0,u=8;d.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?o:n,\"string\"==typeof a?e.input=j.string2buf(a):\"[object ArrayBuffer]\"===m.call(a)?e.input=new Uint8Array(a):e.input=a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new i.Buf8(f),e.next_out=0,e.avail_out=f),c=h.deflate(e,d),c!==q&&c!==p)return this.onEnd(c),this.ended=!0,!1;0!==e.avail_out&&(0!==e.avail_in||d!==o&&d!==r)||(\"string\"===this.options.to?this.onData(j.buf2binstring(i.shrinkBuf(e.output,e.next_out))):this.onData(i.shrinkBuf(e.output,e.next_out)))}while((e.avail_in>0||0===e.avail_out)&&c!==q);return d===o?(c=h.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===p):d!==r||(this.onEnd(p),e.avail_out=0,!0)},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===p&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=d,c.deflate=e,c.deflateRaw=f,c.gzip=g},{\"./utils/common\":28,\"./utils/strings\":29,\"./zlib/deflate\":33,\"./zlib/messages\":38,\"./zlib/zstream\":40}],27:[function(a,b,c){\"use strict\";function d(a){if(!(this instanceof d))return new d(a);this.options=h.assign({chunkSize:16384,windowBits:0,to:\"\"},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0===(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var c=g.inflateInit2(this.strm,b.windowBits);if(c!==j.Z_OK)throw new Error(k[c]);this.header=new m,g.inflateGetHeader(this.strm,this.header)}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}var g=a(\"./zlib/inflate\"),h=a(\"./utils/common\"),i=a(\"./utils/strings\"),j=a(\"./zlib/constants\"),k=a(\"./zlib/messages\"),l=a(\"./zlib/zstream\"),m=a(\"./zlib/gzheader\"),n=Object.prototype.toString;d.prototype.push=function(a,b){var c,d,e,f,k,l,m=this.strm,o=this.options.chunkSize,p=this.options.dictionary,q=!1;if(this.ended)return!1;d=b===~~b?b:b===!0?j.Z_FINISH:j.Z_NO_FLUSH,\"string\"==typeof a?m.input=i.binstring2buf(a):\"[object ArrayBuffer]\"===n.call(a)?m.input=new Uint8Array(a):m.input=a,m.next_in=0,m.avail_in=m.input.length;do{if(0===m.avail_out&&(m.output=new h.Buf8(o),m.next_out=0,m.avail_out=o),c=g.inflate(m,j.Z_NO_FLUSH),c===j.Z_NEED_DICT&&p&&(l=\"string\"==typeof p?i.string2buf(p):\"[object ArrayBuffer]\"===n.call(p)?new Uint8Array(p):p,c=g.inflateSetDictionary(this.strm,l)),c===j.Z_BUF_ERROR&&q===!0&&(c=j.Z_OK,q=!1),c!==j.Z_STREAM_END&&c!==j.Z_OK)return this.onEnd(c),this.ended=!0,!1;m.next_out&&(0!==m.avail_out&&c!==j.Z_STREAM_END&&(0!==m.avail_in||d!==j.Z_FINISH&&d!==j.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(e=i.utf8border(m.output,m.next_out),f=m.next_out-e,k=i.buf2string(m.output,e),m.next_out=f,m.avail_out=o-f,f&&h.arraySet(m.output,m.output,e,f,0),this.onData(k)):this.onData(h.shrinkBuf(m.output,m.next_out)))),0===m.avail_in&&0===m.avail_out&&(q=!0)}while((m.avail_in>0||0===m.avail_out)&&c!==j.Z_STREAM_END);return c===j.Z_STREAM_END&&(d=j.Z_FINISH),d===j.Z_FINISH?(c=g.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===j.Z_OK):d!==j.Z_SYNC_FLUSH||(this.onEnd(j.Z_OK),m.avail_out=0,!0)},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===j.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=d,c.inflate=e,c.inflateRaw=f,c.ungzip=e},{\"./utils/common\":28,\"./utils/strings\":29,\"./zlib/constants\":31,\"./zlib/gzheader\":34,\"./zlib/inflate\":36,\"./zlib/messages\":38,\"./zlib/zstream\":40}],28:[function(a,b,c){\"use strict\";var d=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if(\"object\"!=typeof c)throw new TypeError(c+\"must be non-object\");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;f=252?6:j>=248?5:j>=240?4:j>=224?3:j>=192?2:1;i[254]=i[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;f>>6,b[g++]=128|63&c):c<65536?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;c4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&c1?j[e++]=65533:f<65536?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return c<0?b:0===c?b:c+i[a[c]]>b?c:b}},{\"./common\":28}],30:[function(a,b,c){\"use strict\";function d(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do e=e+b[d++]|0,f=f+e|0;while(--g);e%=65521,f%=65521}return e|f<<16|0}b.exports=d},{}],31:[function(a,b,c){\"use strict\";b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],32:[function(a,b,c){\"use strict\";function d(){for(var a,b=[],c=0;c<256;c++){a=c;for(var d=0;d<8;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function e(a,b,c,d){var e=f,g=d+c;a^=-1;for(var h=d;h>>8^e[255&(a^b[h])];return a^-1}var f=d();b.exports=e},{}],33:[function(a,b,c){\"use strict\";function d(a,b){return a.msg=I[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(E.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){F._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,E.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=G(a.adler,b,e,c):2===a.state.wrap&&(a.adler=H(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-la?a.strstart-(a.w_size-la):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ka,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do;while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&fg){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}while((b=l[b&k])>i&&0!==--e);return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-la)){E.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do d=a.head[--b],a.head[b]=d>=g?d-g:0;while(--c);c=g,b=c;do d=a.prev[--b],a.prev[b]=d>=g?d-g:0;while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=ja)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===J)return ua;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return ua;if(a.strstart-a.block_start>=a.w_size-la&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?ua:ua}function o(a,b){for(var c,d;;){if(a.lookahead=ja&&(a.ins_h=(a.ins_h<=ja)if(d=F._tr_tally(a,a.strstart-a.match_start,a.match_length-ja),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=ja){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<=ja&&(a.ins_h=(a.ins_h<4096)&&(a.match_length=ja-1)),a.prev_length>=ja&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-ja,d=F._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-ja),a.lookahead-=a.prev_length-1,a.prev_length-=2;do++a.strstart<=e&&(a.ins_h=(a.ins_h<=ja&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ka;do;while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&ea.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=ja?(c=F._tr_tally(a,1,a.match_length-ja),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===J)return ua;break}if(a.match_length=0,c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function s(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e}function t(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=D[a.level].max_lazy,a.good_match=D[a.level].good_length,a.nice_match=D[a.level].nice_length,a.max_chain_length=D[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=ja-1,a.match_available=0,a.ins_h=0}function u(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=$,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new E.Buf16(2*ha),this.dyn_dtree=new E.Buf16(2*(2*fa+1)),this.bl_tree=new E.Buf16(2*(2*ga+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new E.Buf16(ia+1),this.heap=new E.Buf16(2*ea+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new E.Buf16(2*ea+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function v(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=Z,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?na:sa,a.adler=2===b.wrap?0:1,b.last_flush=J,F._tr_init(b),O):d(a,Q)}function w(a){var b=v(a);return b===O&&t(a.state),b}function x(a,b){return a&&a.state?2!==a.state.wrap?Q:(a.state.gzhead=b,O):Q}function y(a,b,c,e,f,g){if(!a)return Q;var h=1;if(b===T&&(b=6),e<0?(h=0,e=-e):e>15&&(h=2,e-=16),f<1||f>_||c!==$||e<8||e>15||b<0||b>9||g<0||g>X)return d(a,Q);8===e&&(e=9);var i=new u;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<N||b<0)return a?d(a,Q):Q;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===ta&&b!==M)return d(a,0===a.avail_out?S:Q);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===na)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8),h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=V||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=H(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=oa):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=V||h.level<2?4:0),i(h,ya),h.status=sa);else{var m=$+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=V||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=ma),m+=31-m%31,h.status=sa,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===oa)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=pa)}else h.status=pa;if(h.status===pa)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=qa)}else h.status=qa;if(h.status===qa)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=ra)}else h.status=ra;if(h.status===ra&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=sa)):h.status=sa),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,O}else if(0===a.avail_in&&e(b)<=e(c)&&b!==M)return d(a,S);if(h.status===ta&&0!==a.avail_in)return d(a,S);if(0!==a.avail_in||0!==h.lookahead||b!==J&&h.status!==ta){var o=h.strategy===V?r(h,b):h.strategy===W?q(h,b):D[h.level].func(h,b);if(o!==wa&&o!==xa||(h.status=ta),o===ua||o===wa)return 0===a.avail_out&&(h.last_flush=-1),O;if(o===va&&(b===K?F._tr_align(h):b!==N&&(F._tr_stored_block(h,0,0,!1),b===L&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,O}return b!==M?O:h.wrap<=0?P:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?O:P)}function B(a){var b;return a&&a.state?(b=a.state.status,b!==na&&b!==oa&&b!==pa&&b!==qa&&b!==ra&&b!==sa&&b!==ta?d(a,Q):(a.state=null,b===sa?d(a,R):O)):Q}function C(a,b){var c,d,e,g,h,i,j,k,l=b.length;if(!a||!a.state)return Q;if(c=a.state,g=c.wrap,2===g||1===g&&c.status!==na||c.lookahead)return Q;for(1===g&&(a.adler=G(a.adler,b,l,0)),c.wrap=0,l>=c.w_size&&(0===g&&(f(c.head),c.strstart=0,c.block_start=0,c.insert=0),k=new E.Buf8(c.w_size),E.arraySet(k,b,l-c.w_size,c.w_size,0),b=k,l=c.w_size),h=a.avail_in,i=a.next_in,j=a.input,a.avail_in=l,a.next_in=0,a.input=b,m(c);c.lookahead>=ja;){d=c.strstart,e=c.lookahead-(ja-1);do c.ins_h=(c.ins_h<>>24,p>>>=w,q-=w,w=v>>>16&255,0===w)C[h++]=65535&v;else{if(!(16&w)){if(0===(64&w)){v=r[(65535&v)+(p&(1<>>=w,q-=w),q<15&&(p+=B[f++]<>>24,p>>>=w,q-=w,w=v>>>16&255,!(16&w)){if(0===(64&w)){v=s[(65535&v)+(p&(1<k){a.msg=\"invalid distance too far back\",c.mode=d;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&c.sane){a.msg=\"invalid distance too far back\",c.mode=d;break a}if(z=0,A=o,0===n){if(z+=l-w,w2;)C[h++]=A[z++],C[h++]=A[z++],C[h++]=A[z++],x-=3;x&&(C[h++]=A[z++],x>1&&(C[h++]=A[z++]))}else{z=h-y;do C[h++]=C[z++],C[h++]=C[z++],C[h++]=C[z++],x-=3;while(x>2);x&&(C[h++]=C[z++],x>1&&(C[h++]=C[z++]))}break}}break}}while(f>3,f-=x,q-=x<<3,p&=(1<>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new s.Buf16(320),this.work=new s.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg=\"\",b.wrap&&(a.adler=1&b.wrap),b.mode=L,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new s.Buf32(pa),b.distcode=b.distdyn=new s.Buf32(qa),b.sane=1,b.back=-1,D):G}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):G}function h(a,b){var c,d;return a&&a.state?(d=a.state,b<0?(c=0,b=-b):(c=(b>>4)+1,b<48&&(b&=15)),b&&(b<8||b>15)?G:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):G}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==D&&(a.state=null),c):G}function j(a){return i(a,sa)}function k(a){if(ta){var b;for(q=new s.Buf32(512),r=new s.Buf32(32),b=0;b<144;)a.lens[b++]=8;for(;b<256;)a.lens[b++]=9;for(;b<280;)a.lens[b++]=7;for(;b<288;)a.lens[b++]=8;for(w(y,a.lens,0,288,q,0,a.work,{bits:9}),b=0;b<32;)a.lens[b++]=5;w(z,a.lens,0,32,r,0,a.work,{bits:5}),ta=!1}a.lencode=q,a.lenbits=9,a.distcode=r,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<=f.wsize?(s.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),s.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(s.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whave>>8&255,c.check=u(c.check,Ba,2,0),m=0,n=0,c.mode=M;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg=\"incorrect header check\",c.mode=ma;break}if((15&m)!==K){a.msg=\"unknown compression method\",c.mode=ma;break}if(m>>>=4,n-=4,wa=(15&m)+8,0===c.wbits)c.wbits=wa;else if(wa>c.wbits){a.msg=\"invalid window size\",c.mode=ma;break}c.dmax=1<>8&1),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=N;case N:for(;n<32;){if(0===i)break a;i--,m+=e[g++]<>>8&255,Ba[2]=m>>>16&255,Ba[3]=m>>>24&255,c.check=u(c.check,Ba,4,0)),m=0,n=0,c.mode=O;case O:for(;n<16;){if(0===i)break a;i--,m+=e[g++]<>8),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=P;case P:if(1024&c.flags){for(;n<16;){if(0===i)break a;i--,m+=e[g++]<>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=Q;case Q:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wa=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),s.arraySet(c.head.extra,e,g,q,wa)),512&c.flags&&(c.check=u(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=R;case R:if(2048&c.flags){if(0===i)break a;q=0;do wa=e[g+q++],c.head&&wa&&c.length<65536&&(c.head.name+=String.fromCharCode(wa));while(wa&&q>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=W;break;case U:for(;n<32;){if(0===i)break a;i--,m+=e[g++]<>>=7&n,n-=7&n,c.mode=ja;break}for(;n<3;){if(0===i)break a;i--,m+=e[g++]<>>=1,n-=1,3&m){case 0:c.mode=Y;break;case 1:if(k(c),c.mode=ca,b===C){m>>>=2,n-=2;break a}break;case 2:c.mode=_;break;case 3:a.msg=\"invalid block type\",c.mode=ma}m>>>=2,n-=2;break;case Y:for(m>>>=7&n,n-=7&n;n<32;){if(0===i)break a;i--,m+=e[g++]<>>16^65535)){a.msg=\"invalid stored block lengths\",c.mode=ma;break}if(c.length=65535&m,m=0,n=0,c.mode=Z,b===C)break a;case Z:c.mode=$;case $:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;s.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=W;break;case _:for(;n<14;){if(0===i)break a;i--,m+=e[g++]<>>=5,n-=5,c.ndist=(31&m)+1,m>>>=5,n-=5,c.ncode=(15&m)+4,m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg=\"too many length or distance symbols\",c.mode=ma;break}c.have=0,c.mode=aa;case aa:for(;c.have>>=3,n-=3}for(;c.have<19;)c.lens[Ca[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,ya={bits:c.lenbits},xa=w(x,c.lens,0,19,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg=\"invalid code lengths set\",c.mode=ma;break}c.have=0,c.mode=ba;case ba:for(;c.have>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<>>=qa,n-=qa,c.lens[c.have++]=sa;else{if(16===sa){for(za=qa+2;n>>=qa,n-=qa,0===c.have){a.msg=\"invalid bit length repeat\",c.mode=ma;break}wa=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sa){for(za=qa+3;n>>=qa,n-=qa,wa=0,q=3+(7&m),m>>>=3,n-=3}else{for(za=qa+7;n>>=qa,n-=qa,wa=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg=\"invalid bit length repeat\",c.mode=ma;break}for(;q--;)c.lens[c.have++]=wa}}if(c.mode===ma)break;if(0===c.lens[256]){a.msg=\"invalid code -- missing end-of-block\",c.mode=ma;break}if(c.lenbits=9,ya={bits:c.lenbits},xa=w(y,c.lens,0,c.nlen,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg=\"invalid literal/lengths set\",c.mode=ma;break}if(c.distbits=6,c.distcode=c.distdyn,ya={bits:c.distbits},xa=w(z,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,ya),c.distbits=ya.bits,xa){a.msg=\"invalid distances set\",c.mode=ma;break}if(c.mode=ca,b===C)break a;case ca:c.mode=da;case da:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,v(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===W&&(c.back=-1);break}for(c.back=0;Aa=c.lencode[m&(1<>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(ta+qa<=n);){if(0===i)break a;i--,m+=e[g++]<>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,c.length=sa,0===ra){c.mode=ia;break}if(32&ra){c.back=-1,c.mode=W;break}if(64&ra){a.msg=\"invalid literal/length code\",c.mode=ma;break}c.extra=15&ra,c.mode=ea;case ea:if(c.extra){for(za=c.extra;n>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=fa;case fa:for(;Aa=c.distcode[m&(1<>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(ta+qa<=n);){if(0===i)break a;i--,m+=e[g++]<>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,64&ra){a.msg=\"invalid distance code\",c.mode=ma;break}c.offset=sa,c.extra=15&ra,c.mode=ga;case ga:if(c.extra){for(za=c.extra;n>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg=\"invalid distance too far back\",c.mode=ma;break}c.mode=ha;case ha:if(0===j)break a;if(q=p-j,c.offset>q){if(q=c.offset-q,q>c.whave&&c.sane){a.msg=\"invalid distance too far back\",c.mode=ma;break}q>c.wnext?(q-=c.wnext,r=c.wsize-q):r=c.wnext-q,q>c.length&&(q=c.length),pa=c.window}else pa=f,r=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pa[r++];while(--q);0===c.length&&(c.mode=da);break;case ia:if(0===j)break a;f[h++]=c.length,j--,c.mode=da;break;case ja:if(c.wrap){for(;n<32;){if(0===i)break a;i--,m|=e[g++]<=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return p[q++]=20971520,p[q++]=20971520,s.bits=1,0;for(F=1;F0&&(a===h||1!==G))return-1;for(Q[1]=0,D=1;Df||a===j&&L>g)return 1;for(var T=0;;){T++,z=D-J,r[E]y?(A=R[S+r[E]],B=N[O+r[E]]):(A=96,B=0),t=1<>J)+u]=z<<24|A<<16|B|0;while(0!==u);for(t=1<>=1;if(0!==t?(M&=t-1,M+=t):M=0,E++,0===--P[D]){if(D===G)break;D=b[c+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<f||a===j&&L>g)return 1;v=M&w,p[v]=H<<24|I<<16|x-q|0}}return 0!==M&&(p[x+M]=D-J<<24|64<<16|0),s.bits=H,0}},{\"../utils/common\":28}],38:[function(a,b,c){\"use strict\";b.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},{}],39:[function(a,b,c){\"use strict\";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length}function f(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b}function g(a){return a<256?ia[a]:ia[256+(a>>>7)]}function h(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function i(a,b,c){a.bi_valid>X-c?(a.bi_buf|=b<>X-a.bi_valid,a.bi_valid+=c-X):(a.bi_buf|=b<>>=1,c<<=1;while(--b>0);return c>>>1}function l(a){16===a.bi_valid?(h(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function m(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;f<=W;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;co&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)e=a.heap[--c],e>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function n(a,b,c){var d,e,f=new Array(W+1),g=0;for(d=1;d<=W;d++)f[d]=g=g+c[d-1]<<1;for(e=0;e<=b;e++){var h=a[2*e+1];0!==h&&(a[2*e]=k(f[h]++,h))}}function o(){var a,b,c,d,f,g=new Array(W+1);for(c=0,d=0;d>=7;d8?h(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function r(a,b,c,d){q(a),d&&(h(a,c),h(a,~c)),G.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function s(a,b,c,d){var e=2*b,f=2*c;return a[e]>1;c>=1;c--)t(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],t(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,t(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],m(a,b),n(f,j,a.bl_count)}function w(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;d<=c;d++)e=g,g=b[2*(d+1)+1],++h=3&&0===a.bl_tree[2*ea[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function z(a,b,c,d){var e;for(i(a,b-257,5),i(a,c-1,5),i(a,d-4,4),e=0;e>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return I;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return J;for(b=32;b0?(a.strm.data_type===K&&(a.strm.data_type=A(a)),v(a,a.l_desc),v(a,a.d_desc),g=y(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,f<=e&&(e=f)):e=f=c+5,c+4<=e&&b!==-1?C(a,b,c,d):a.strategy===H||f===e?(i(a,(M<<1)+(d?1:0),3),u(a,ga,ha)):(i(a,(N<<1)+(d?1:0),3),z(a,a.l_desc.max_code+1,a.d_desc.max_code+1,g+1),u(a,a.dyn_ltree,a.dyn_dtree)),p(a),d&&q(a)}function F(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(ja[c]+R+1)]++,a.dyn_dtree[2*g(b)]++),a.last_lit===a.lit_bufsize-1}var G=a(\"../utils/common\"),H=4,I=0,J=1,K=2,L=0,M=1,N=2,O=3,P=258,Q=29,R=256,S=R+1+Q,T=30,U=19,V=2*S+1,W=15,X=16,Y=7,Z=256,$=16,_=17,aa=18,ba=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],ca=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],da=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],ea=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],fa=512,ga=new Array(2*(S+2));d(ga);var ha=new Array(2*T);d(ha);var ia=new Array(fa);d(ia);var ja=new Array(P-O+1);d(ja);var ka=new Array(Q);d(ka);var la=new Array(T);d(la);var ma,na,oa,pa=!1;c._tr_init=B,c._tr_stored_block=C,c._tr_flush_block=E,c._tr_tally=F,c._tr_align=D},{\"../utils/common\":28}],40:[function(a,b,c){\"use strict\";function d(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}b.exports=d},{}]},{},[10])(10)});\n","var EventEmitter = require(\"events\").EventEmitter;\n\nclass Account extends EventEmitter {\n constructor() {\n super();\n\n this.isAuthenticated = false;\n this._config = null;\n\n this._listRoles = null;\n // {array}\n // a list of all the Defined Roles in the Tenant's system.\n\n this._listScopes = null;\n // {array | null}\n // a list of all the Defined Scopes in the Tenant's sytem.\n\n this._listUsers = null;\n // {array | null}\n // a list of all the Defined Users in the Tenant's system.\n }\n\n init(AB) {\n // {ABFactory} AB\n\n this.AB = AB;\n var UserConfig = this.AB.Config.userConfig();\n if (UserConfig) {\n this.isAuthenticated = true;\n this._config = UserConfig;\n }\n\n var MetaConfig = this.AB.Config.metaConfig();\n if (MetaConfig) {\n this._listRoles = MetaConfig.roles || [];\n this._listScopes = MetaConfig.scopes || [];\n this._listUsers = MetaConfig.users || [];\n }\n\n this.AB.Network.on(\"account.logout\", (context, err, data) => {\n if (err) {\n console.error(err);\n return;\n }\n this.emit(\"logout\", data);\n });\n\n return Promise.resolve();\n }\n\n canSwitcheroo() {\n return (\n this.roles((r) => r.uuid === \"320ef94a-73b5-476e-9db4-c08130c64bb8\")\n .length > 0\n );\n }\n\n isSwitcherood() {\n return this.AB.Config.userReal();\n }\n\n isSystemDesigner() {\n return (\n this.roles((r) => r.uuid === \"6cc04894-a61b-4fb5-b3e5-b8c3f78bd331\")\n .length > 0\n );\n }\n\n email() {\n return this._config?.email ?? \"\";\n }\n\n language() {\n return this._config?.languageCode ?? \"en\";\n }\n\n logout() {\n return this.AB.Network.post(\n {\n url: \"/auth/logout\",\n data: { tenantUrl: this.AB.Tenant.setting(\"url\") },\n },\n {\n key: \"account.logout\",\n context: {},\n }\n );\n }\n\n roles(fn = () => true) {\n return (this._config?.roles || []).filter(fn);\n }\n rolesAll() {\n return this._listRoles;\n }\n\n scopes() {\n return this._listScopes;\n }\n\n username() {\n return this._config?.username;\n }\n\n userList() {\n return this._listUsers;\n }\n\n uuid() {\n return this._config?.uuid;\n }\n\n imageID() {\n return this._config?.image_id;\n }\n\n sendEmailNotifications() {\n return this._config?.sendEmailNotifications;\n }\n}\n\nexport default new Account();\n","/*\n * Multilingual\n * manage our multilingual Translations/Labels/etc.\n */\n\nvar MLClass = require(\"../AppBuilder/platform/ABMLClass\");\n\nclass Multilingual extends MLClass {\n constructor() {\n super([], {});\n // super()\n // [] = no labels\n // {} = placeholder ABFactory entry until .init() is called.\n\n this.isAuthenticated = false;\n this._config = null;\n\n this._missingLabelID = false;\n this._missingLabels = {};\n this._pluginLabelsMissing = {};\n\n this.isLabelUpdateEnabled = false;\n // {bool}\n // we can only update labels on the server if this is enabled.\n // Only on a Developers environment should we enable this:\n // javascript console: > window.AB.Multilingual.enableLabelUpdates();\n }\n\n init(AB) {\n // {ABFactory} AB\n\n this.AB = AB;\n\n this.labels = this.AB.Config.labelConfig();\n this._languages = this.AB.Config.languageConfig();\n\n this.pluginLabels = {};\n\n // this isn't actually an Async operation, so just resolve()\n return Promise.resolve();\n }\n\n currentLanguage() {\n return this.AB.Account.language();\n }\n\n enableLabelUpdates() {\n this.isLabelUpdateEnabled = true;\n }\n\n label(key, altText, values = [], postMissing = true) {\n // part of our transition: L(\"single string\") should start to work:\n if (typeof altText == \"undefined\" && key) {\n altText = key;\n }\n\n // other case: L(\"single string {0}\", [])\n if (arguments.length == 2 && Array.isArray(altText)) {\n values = altText;\n altText = key;\n }\n\n // We need to escape \" characters or else they will get added to the the lang.js\n // then we get errors next time we try to parse it as JSON (see appbuilder.label-missing)\n altText = altText.replace(/\"/g, '\\\\\"');\n key = key.replace(/\"/g, '\\\\\"');\n\n // NOTE: transition to new Labels\n // currently our code still uses the L(key, altText, values) format, but\n // the labels we get back are in L(altText, values) format.\n //\n // we are going to keep this like this until we have a well functioning\n // UI display of our Apps, which should flesh out most of the missing\n // labels to our files.\n //\n // After that, convert our L(k, t, v) to L(t, v)\n\n var newKey = altText;\n if (newKey[0] == \"*\") {\n newKey = newKey.slice(1);\n }\n var label = this.labels[newKey];\n if (!label) {\n if (postMissing) {\n this.postMissingLabel(key, altText);\n }\n label = altText;\n }\n\n values.forEach((v, i) => {\n var sub = `{${i}}`;\n label = label.replaceAll(sub, v);\n });\n label = label.replace(/\\\\\"/g, '\"'); // unescape \" in the label\n return label;\n }\n\n labelPlugin(plugin, altText, values = []) {\n // 1st check to see if it is a common label from platform:\n var label = this.label(altText, altText, values, false);\n if (!label) {\n // ok, so check to see if it is a Plugin Label:\n label = this.pluginLabels[plugin][altText];\n }\n if (!label) {\n // !! record it missing.\n this._pluginLabelsMissing[plugin] =\n this._pluginLabelsMissing[plugin] || {};\n this._pluginLabelsMissing[plugin][altText] = altText;\n label = altText;\n }\n values.forEach((v, i) => {\n var sub = `{${i}}`;\n label = label.replaceAll(sub, v);\n });\n return label;\n }\n\n languages() {\n return this._languages;\n\n // console.error(\n // \"Multilingual:languages(): Implement Language Storage/Retrieval.\"\n // );\n // return [];\n }\n\n pluginLoadLabels(key, labels) {\n this.pluginLabels[key] = labels;\n }\n pluginLabelReport(key) {\n console.warn(\"missing labels for plugin: \", key);\n console.warn(\"current language:\", this.currentLanguage());\n var labels = JSON.stringify(this._pluginLabelsMissing[key], null, 3);\n console.warn(labels);\n }\n\n postMissingLabel(key, altText) {\n if (!this.isLabelUpdateEnabled) return;\n\n if (this._missingLabelID) {\n clearTimeout(this._missingLabelID);\n }\n var batchLength = 50;\n var sendBatch = () => {\n var batchLabels = [];\n let missingLabels = Object.keys(this._missingLabels).map(\n (k) => this._missingLabels[k]\n );\n if (missingLabels.length <= batchLength) {\n batchLabels = missingLabels;\n this._missingLabels = {};\n } else {\n for (var i = 0; i <= batchLength; i++) {\n var l = missingLabels.shift();\n batchLabels.push(l);\n delete this._missingLabels[l.key];\n }\n }\n this.AB.Network.post({\n url: \"/multilingual/label-missing\",\n data: { labels: JSON.stringify(batchLabels) },\n })\n .then(() => {\n if (Object.keys(this._missingLabels).length > 0) {\n sendBatch();\n }\n })\n .catch((err) => {\n const strErr = err.toString();\n if (strErr.indexOf(\"unable to get\") > -1) {\n console.error(\n \"Missing language file for :\" + this.currentLanguage()\n );\n }\n });\n };\n this._missingLabelID = setTimeout(() => {\n sendBatch();\n }, 1000);\n\n this._missingLabels[key] = { key, altText };\n }\n ///\n /// Disable un-needed ABMLClass functionality\n ///\n /// NOTE: we are mainly Piggybacking on ABMLClass for it's\n /// .translate() and .unTranslate() capabilities. So disable these\n /// for good measure.\n destroy() {\n console.error(\"Multilingual:destroy(): Should not be called.\");\n return Promise.resolve();\n }\n save() {\n console.error(\"Multilingual:save(): Should not be called.\");\n return Promise.resolve();\n }\n toObj() {\n console.error(\"Multilingual:toObj(): Should not be called.\");\n return {};\n }\n toDefinition() {\n console.error(\"Multilingual:toDefinition(): Should not be called.\");\n return {};\n }\n}\n\nexport default new Multilingual();\n","/*\n * Network.js\n * A network manager for interfacing with our AppBuilder server.\n */\n/* global Connection */\nvar EventEmitter = require(\"events\").EventEmitter;\nimport performance from \"../utils/performance\";\nimport NetworkRest from \"./NetworkRest\";\nimport NetworkRestSocket from \"./NetworkRestSocket\";\n// import NetworkRelay from \"./NetworkRelay\";\n\nclass Network extends EventEmitter {\n constructor() {\n super();\n\n this.setMaxListeners(0);\n // we'll have > 10 for sure!\n\n this.queueLock = null;\n // {Lock} .queueLock\n // our semaphore for coordinating our access to our local storage.\n\n this._config = null;\n this._network = null;\n // {NetworkRelay | NetworkRest | NetworkSocket}\n // the underlying Network connection object actually performing the\n // communications with the Server.\n // Which one is specified in the config.appbuilder.networkType setting\n\n this._queueCount = 0;\n // {int} _queueCount\n // the # of network operations currently queued, pending Network\n // reconnect.\n\n this.cachJobResponse = {};\n // { jobID : { jobResponse } }\n // hash of the queued jobResponses for network requests that are in\n // our queue.\n // We need to keep our own cache that isn't serialized so that once\n // we complete the request, we can resume the resolve() promise chains\n }\n\n init(AB) {\n // {ABFactory} AB\n\n this.AB = AB;\n\n this.queueLock = new this.AB.Lock();\n\n this._config = this.AB.Config.siteConfig();\n if (this._config) {\n switch (this._config.appbuilder.networkType) {\n case \"relay\":\n // this._network = new NetworkRelay();\n break;\n\n case \"socket\":\n this._network = new NetworkRestSocket(this);\n break;\n\n case \"rest\":\n default:\n this._network = new NetworkRest(this);\n break;\n }\n\n return this._network.init(AB);\n } else {\n console.error(\"??? Why No site config ???\");\n }\n\n //\n // Handle reconnections and flushing the Queue:\n //\n if (io && io.socket) {\n // When our Socket reconnects, be sure to flush any pending transactions.\n io.socket.on(\"connected\", () => {\n this.queueFlush();\n if (this.idConnectionCheck) {\n clearTimeout(this.idConnectionCheck);\n this.idConnectionCheck = null;\n }\n });\n } else {\n console.error(\"!!! Network.init() : Did not find io.socket\");\n window.addEventListener(\"online\", () => this.queueFlush());\n }\n\n return Promise.resolve();\n }\n\n //\n // Interface API\n //\n /**\n * Network.isRealTime\n * indicates wether or not the current network connection supports\n * RealTime updates.\n * @return {bool}\n */\n get isRealTime() {\n return this._network.isRealTime;\n }\n\n /**\n * Network.get(options, jobResponse)\n * perform a GET request back to the AppBuilder server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n get(...params) {\n return this._network.get(...params).then((data) => {\n return this.normalizeData(data);\n });\n }\n\n /**\n * Network.post()\n * perform an AJAX POST request to the AppBuilder server.\n * this is a CREATE operation.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n post(...params) {\n return this._network.post(...params).then((data) => {\n return this.normalizeData(data);\n });\n }\n\n /**\n * Network.put()\n * perform a PUT request to the AppBuilder server.\n * This is for UPDATE/REPLACE operations to data on the server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n put(...params) {\n return this._network.put(...params).then((data) => {\n return this.normalizeData(data);\n });\n }\n\n /**\n * Network.delete()\n * perform an AJAX DELETE request to the AppBuilder server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n delete(...params) {\n return this._network.delete(...params).then((data) => {\n return this.normalizeData(data);\n });\n }\n\n ////\n //// Network Utilities\n ////\n\n _connectionCheck() {\n // if (!this.idConnectionCheck) {\n if (this.isNetworkConnected()) {\n this.queueFlush().catch(() => {\n // on an error, we are still having connection issues\n this.idConnectionCheck = setTimeout(() => {\n this._connectionCheck();\n }, 250);\n });\n this.idConnectionCheck = null;\n } else {\n this.idConnectionCheck = setTimeout(() => {\n this._connectionCheck();\n }, 250);\n }\n // }\n }\n\n /**\n * Check whether the network is slow\n * @returns {Boolean}\n */\n isNetworkSlow() {\n return !!this._networkSlow;\n }\n\n /**\n * Register the network speed test worker\n * @param {Worker} worker\n * @param {boolean} slow is the current state slow?\n */\n registerNetworkTestWorker(worker, slow) {\n this._networkTestWorker = worker;\n this._networkSlow = slow;\n this._networkTestWorker.onmessage = ({ data }) => {\n if (this._networkSlow !== data) {\n this._networkSlow = data;\n this.emit(\"networkslow\", this._networkSlow);\n // Tell sentry our network speed changed\n performance.setContext(\"breadcrumb\", {\n category: \"network\",\n message: this._networkSlow\n ? \"Slow network detected\"\n : \"Network speed restored\",\n level: \"info\",\n });\n }\n };\n }\n\n /**\n * @method networkStatus\n * return the connection type currently registered with the network\n * plugin.\n * @return {string}\n */\n networkStatus() {\n return navigator.connection.type;\n }\n\n /**\n * @method isNetworkConnected\n * return true/false if the device is currently connected to the\n * internet.\n * @return {bool}\n */\n isNetworkConnected() {\n // if this is a Web Client and using sails.socket.io\n if (typeof io != \"undefined\" && io.socket && io.socket.isConnected) {\n return io.socket.isConnected();\n }\n\n // if this isn't a Cordova Plugin, then return navigator data:\n if (typeof Connection == \"undefined\") {\n // NOTE: this technically only detects if we are connected to a\n // network. It doesn't guarantee we can communicate across the 'net\n return navigator.onLine;\n }\n\n // Cordova Plugin:\n return this.networkStatus() != Connection.NONE;\n }\n\n /**\n * publishResponse()\n * emit the requested response for this network operation.\n * @param {obj} jobResponse\n * @param {obj} error\n * @param {obj} data\n */\n publishResponse(jobResponse, error, data) {\n if (data) {\n data = this.normalizeData(data);\n }\n this.emit(jobResponse.key, jobResponse.context, error, data);\n }\n\n normalizeData(data) {\n // Data returning from our server is wrapped in an outer layer of\n // information that is for our Networking API.\n // the outer wrapper should be:\n // on success :\n // {\n // status: \"success\",\n // data:{Data For App}\n // }\n // on Error:\n // {\n // status: \"error\",\n // id: {int} error code\n // ... other data here\n // }\n\n // we have physically received a data packet from the server,\n // but we are informed that our transaction was problematic\n // (400 level USER problem?)\n if (data.status === \"error\") {\n // TODO: review Error procedure here\n return data;\n }\n\n // on success\n // make sure we return the Application Level Data packet:\n return data.data || data;\n }\n\n ////\n //// Queued Requests\n ////\n\n /**\n * refQueue()\n * sub classes can override this for their own separate Queue Data\n * @return {string}\n */\n refQueue() {\n return \"networkQueue\";\n }\n\n /**\n * queueCount()\n * return the # of messages in the queue.\n * @return {int}\n */\n queueCount() {\n return this._queueCount;\n }\n\n /**\n * Adds a request to the outgoing queue.\n *\n * @param {object} data\n * @param {object} jobResponse\n * @return {Promise}\n */\n queue(data, jobResponse) {\n var refQueue = this.refQueue();\n\n return new Promise((resolve, reject) => {\n this.queueLock\n .acquire()\n .then(() => {\n return this.AB.Storage.get(refQueue);\n })\n .then((queue) => {\n queue = queue || [];\n let jID = this.AB.jobID();\n this.cachJobResponse[jID] = jobResponse;\n queue.push({ data, jobResponse: jID });\n this.AB.log(\n `:::: ${queue.length} request${\n queue.length > 1 ? \"s\" : \"\"\n } queued`\n );\n this._queueCount = queue.length;\n return this.AB.Storage.set(refQueue, queue);\n })\n .then(() => {\n this.emit(\"queued\");\n // if we are not already polling the network, start\n if (!this.idConnectionCheck) {\n this._connectionCheck();\n }\n this.queueLock.release();\n resolve();\n })\n .catch((err) => {\n this.AB.notify.developer(err, {\n message: \"Error while queueing data\",\n });\n this.AB.Analytics.logError(err);\n reject(err);\n\n this.queueLock.release();\n });\n });\n }\n\n /**\n * queueFlush()\n * Flush the queue and send the contents to the relay server.\n */\n queueFlush() {\n var refQueue = this.refQueue();\n\n // if we are not connected, then stop\n if (!this.isNetworkConnected()) {\n var error = new Error(\"Not connected to the internet.\");\n error.code = \"E_NOTCONNECTED\";\n return Promise.reject(error);\n }\n\n // otherwise, attempt to flush the queue:\n return new Promise((resolve, reject) => {\n this.queueLock\n .acquire()\n\n //\n // Get queue contents\n //\n .then(() => {\n return this.AB.Storage.get(refQueue);\n })\n\n //\n // Send off each queued request\n //\n .then((queue) => {\n // default to [] if not found\n queue = queue || [];\n\n let hasResponded = false;\n let resCount = 0;\n let resNumber = queue.length;\n\n let done = (res, rej, err) => {\n if (!hasResponded) {\n if (err) {\n rej(err);\n hasResponded = true;\n return;\n }\n resCount++;\n if (resCount >= resNumber) {\n hasResponded = true;\n res();\n }\n }\n };\n // recursively process each pending queue request\n var processRequest = (cb) => {\n if (queue.length == 0) {\n cb();\n } else {\n var entry = queue.shift();\n var params = entry.data;\n let job = this.cachJobResponse[entry.jobResponse];\n // var job = entry.jobResponse;\n this._network\n .resend(params, job)\n .then(() => {\n delete this.cachJobResponse[entry.jobResponse];\n // processRequest(cb);\n cb();\n })\n .catch((err) => {\n // if the err was due to a network connection error\n if (err && err.code == \"E_TOMANYRETRIES\") {\n cb(err);\n return;\n }\n // otherwise, try the next\n // processRequest(cb);\n });\n processRequest(cb);\n }\n };\n\n return new Promise((res, rej) => {\n processRequest((err) => {\n done(res, rej, err);\n // if (err) {\n // rej(err);\n // } else {\n // res();\n // }\n });\n });\n })\n\n //\n // Clear queue contents\n //\n .then(() => {\n this.cachJobResponse = {};\n this._queueCount = 0;\n return this.AB.Storage.set(refQueue, []);\n })\n\n // release the Lock\n .then(() => {\n this.emit(\"queue.synced\");\n return this.queueLock.release();\n })\n\n // all done.\n .then(() => {\n resolve();\n })\n\n // respond to errors:\n .catch((err) => {\n this.AB.notify.developer(err, {\n message: \"commAPI queueFlush error\",\n });\n this.AB.Analytics.logError(err);\n\n this.queueLock.release().then(() => {\n reject(err);\n });\n });\n });\n }\n\n /**\n * Reset credentials to a blank state.\n * @return {Promise}\n */\n reset() {\n return Promise.resolve();\n }\n\n /**\n * type()\n * return the type of network connection we are using.\n * [\"rest\", \"socket\", \"relay\"]\n * @return {string}\n */\n type() {\n return this._config.appbuilder.networkType;\n }\n\n // uuid() {\n // return this.AB.uuid();\n // }\n\n getTokens() {\n // called in appPage.js : openRelayLoader()\n return {};\n }\n}\n\nexport default new Network();\n","/*\n * NetworkRest.js\n * The base Networking class. This class is responsible for job submissions\n * and outlines the basic Network interface.\n */\n\n/* global Connection */\n// import Account from \"./Account\";\n// import analytics from \"./Analytics\";\n// import EventEmitter from \"eventemitter2\";\nvar EventEmitter = require(\"events\").EventEmitter;\n// import Lock from \"./Lock\";\n\n// import { storage } from \"./Storage\";\n// import Tenant from \"./Tenant\";\n// import { v4 as uuidv4 } from \"uuid\";\n\n// Temp placeholders until Resources are implemented:\n\n// End Temp\n\nconst Atomic = require(\"atomicjs/dist/atomic.min.js\");\n// Atomic : a small $.ajax() replacement\n\nvar Config = null;\n// {} Config\n// the site specific configuration information\n\nclass NetworkRest extends EventEmitter {\n constructor(parent) {\n // {Network} parent\n\n super({\n wildcard: true,\n newListener: false,\n maxListeners: 0,\n });\n\n this.baseURL = null;\n // {string} .baseURL\n // the url of our site.\n\n this.numRetries = 3;\n // {int} .numRetries\n // the number or times we should attempt to issue a network request.\n\n this._network = parent;\n // {Network} ._network\n // the Parent Network Resource that the rest of the Platform actually\n // works with.\n\n this.isRealTime = false;\n // {bool}\n // does this Network type support RealTime updates. (socket = true);\n }\n\n /**\n * @method init\n * @param {ABFactory} AB\n * @param {object} options\n * @param {string} options.baseURL\n * @return {Promise}\n */\n init(AB, options) {\n this.AB = AB;\n\n Config = this.AB.Config.siteConfig();\n options = options || {};\n if (options) {\n this.baseURL = options.baseURL || Config.appbuilder.urlCoreServer;\n this.numRetries =\n options.networkNumRetries || Config.appbuilder.networkNumRetries;\n }\n return Promise.resolve();\n }\n\n //\n // Interface API\n //\n /**\n * Network.get(options, jobResponse)\n * perform a GET request back to the AppBuilder server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n get(params, jobResponse) {\n params.type = params.type || \"GET\";\n\n // data sent to params on a \"GET\" request need to be converted to\n // uri querystring values:\n var data = params.data || params.params;\n if (data) {\n var useThese = [\"string\", \"number\", \"boolean\"];\n var search = Object.keys(data)\n .map(function (key) {\n var val = data[key];\n if (useThese.indexOf(typeof val) == -1) {\n val = JSON.stringify(val);\n }\n return key + \"=\" + encodeURIComponent(val);\n })\n .join(\"&\");\n\n var join = \"?\";\n if (params.url.indexOf(\"?\") > -1) {\n join = \"&\";\n }\n params.url = [params.url, search].join(join);\n }\n\n return this._request(params, jobResponse);\n }\n\n /**\n * Network.post()\n * perform an AJAX POST request to the AppBuilder server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n post(params, jobResponse) {\n params.type = params.type || \"POST\";\n return this._request(params, jobResponse);\n }\n\n /**\n * Network.put()\n * perform a PUT request to the AppBuilder server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n put(params, jobResponse) {\n params.type = params.type || \"PUT\";\n return this._request(params, jobResponse);\n }\n\n /**\n * Network.delete()\n * perform an AJAX DELETE request to the AppBuilder server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n delete(params, jobResponse) {\n params.type = params.type || \"DELETE\";\n return this._request(params, jobResponse);\n }\n\n ////\n //// Network Utilities\n ////\n\n isNetworkConnected() {\n return this._network.isNetworkConnected();\n }\n\n salSend(params) {\n return Atomic(params.url, params).then((packet) => {\n // {json} packet\n // the response from Atomic is in format:\n // {data: {…}, xhr: XMLHttpRequest}\n // we just want to send back our { status:\"\", data:xxx } packet.\n return packet.data;\n });\n }\n\n /**\n * _request()\n * perform the actual AJAX request for this operation.\n * @param {obj} params the jQuery.ajax() formatted params\n * @param {obj} jobRequest the information about the request's response.\n * @return {Promise}\n */\n _request(params, jobResponse) {\n // make sure we don't process too many retries:\n params._retry = params._retry || 0;\n if (params._retry >= this.numRetries) {\n var err = new Error(\n `Too many retries (${this.numRetries}) for ${params.url}`\n );\n err.code = \"E_TOMANYRETRIES\";\n this.AB.notify.developer(err, {\n context: \"NetworkRest:_request: Too Many Retries\",\n });\n // this.AB.Analytics.logError(err);\n if (jobResponse) {\n this._network.publishResponse(jobResponse, err);\n }\n\n return Promise.reject(err);\n }\n\n return new Promise((resolve, reject) => {\n params.url = params.url || \"/\";\n if (params.url[0] == \"/\") {\n params.url = this.baseURL + params.url;\n }\n\n params.headers = params.headers || {};\n if (this.AB.Account.authToken) {\n params.headers.Authorization = this.AB.Account.authToken;\n }\n // Fix: don't set content-type if passed in data is a FormData object.\n if (\n Object.prototype.toString.call(params.data) !== \"[object FormData]\"\n ) {\n params.headers[\"Content-type\"] = \"application/json\";\n }\n\n var tenantID = this.AB.Tenant.id();\n if (tenantID) {\n params.headers[\"tenant-token\"] = tenantID;\n }\n\n // params.timeout = params.timeout || 6000;\n\n if (this.isNetworkConnected()) {\n params.method = params.method || params.type;\n params.timeout = 6000; // ??\n params.data = params.data || params.params;\n delete params.params;\n\n this.salSend(params)\n .then((packet) => {\n // TODO: check if packet.status == \"error\"\n // and then .publishResponse() as an error\n\n //\n var data = packet;\n if (jobResponse) {\n this._network.publishResponse(jobResponse, null, data);\n }\n resolve(data);\n })\n .catch((err) => {\n // err.status\n // err.statusText\n // err.responseText\n // err.message {socket}\n // err.stack {socket}\n\n // if this is a network connection error, send the attempt again:\n if (\n err.statusText == \"Request timeout\" ||\n (err.message && err.message.indexOf(\"disconnected\") > -1)\n ) {\n //// Network Error: conneciton refused, access denied, etc...\n this.AB.Analytics.log(\n \"NetworkRest._request():network connection error detected. Trying again\"\n );\n\n params._retry++;\n\n // retry the attempt:\n this._request(params, jobResponse)\n .then((data) => {\n // console.log('--- timeout.then():',data);\n this.AB.warn(\n \"*** NetworkRest._request().then(): attempt resolved.\"\n );\n resolve(data);\n })\n .catch((_err) => {\n this.AB.notify.developer(_err, {\n message:\n \"*** NetworkRest._request().catch(): retry failed:\",\n });\n reject(_err);\n });\n\n return;\n } else {\n // Else attempt to emit() some common Error types for\n // additional Platform Handling.\n if (err.status == 403) {\n this.emit(\"error.badAuth\", err);\n } else if (err.status >= 400 && err.status < 500) {\n this.emit(\"error.badRequest\", err);\n } else if (err.status >= 500) {\n this.emit(\"error.badServer\", err);\n }\n }\n\n var packet = null;\n if (err.responseText) {\n try {\n packet = JSON.parse(err.responseText);\n } catch (e) {\n /* ignore */\n }\n }\n // if this is an req.ab.error() response:\n if (packet && packet.status == \"error\") {\n // check if REAUTH Error:\n if (packet.id == 5 || packet.code == \"E_REAUTH\") {\n this._network.emit(\"reauth\");\n return;\n }\n\n this.AB.notify.developer(new Error(packet.message), {\n context:\n \"NetworkRest:_request:Error returned from Server (req.ab.error())\",\n data: packet.data,\n status: packet.status,\n });\n // this.AB.Analytics.logError(packet.data);\n // this.AB.error(packet.data);\n if (jobResponse) {\n this._network.publishResponse(\n jobResponse,\n packet,\n null\n );\n }\n let error = new Error(packet.message ?? packet.data);\n error.response = packet;\n error.text = packet.message;\n error.url = `${params.method} ${params.url}`;\n return reject(error);\n } else {\n // unknown/unexpected error:\n let error = new Error(\n `${err.status} ${err.statusText || err.message}: ${\n params.method\n } ${params.url}`\n );\n error.response = err.responseText;\n error.text = err.statusText;\n error.err = err;\n error.url = `${params.method} ${params.url}`;\n this.AB.notify.developer(error, {\n context:\n \"NetworkRest:_request:Unknown Error returned from server\",\n err,\n response: err.responseText,\n text: err.statusText || err.message,\n url: error.url,\n });\n // this.AB.Analytics.logError(error);\n // this.AB.error(error);\n if (jobResponse) {\n this._network.publishResponse(jobResponse, error);\n }\n return reject(error);\n }\n });\n } else {\n // now Queue this request params.\n this.AB.Analytics.log(\n \"NetworkRest:_request(): Network is offline. Queuing request.\"\n );\n this._network\n .queue(params, jobResponse)\n .then(() => {\n resolve({ status: \"queued\" });\n })\n .catch(reject);\n }\n });\n }\n\n /**\n * resend()\n * processes messages that were queued due to network connectivity\n * issues.\n * @param {obj} params the jQuery.ajax() formatted params\n * @param {obj} jobRequest the information about the request's response.\n * @return {Promise}\n */\n resend(params, jobResponse) {\n // var op = params.type.toLowerCase();\n return this._request(params, jobResponse);\n }\n}\n\nexport default NetworkRest;\n","/*\n * NetworkRest.js\n * The base Networking class. This class is responsible for job submissions\n * and outlines the basic Network interface.\n */\n\nimport performance from \"../utils/performance\";\nimport NetworkRest from \"./NetworkRest\";\n\nconst listSocketEvents = [\n // NOTE: ABFactory.definitionXXX() will manage emitting these\n // events internally:\n // \"ab.abdefinition.create\",\n // \"ab.abdefinition.update\",\n // \"ab.abdefinition.delete\",\n \"ab.datacollection.create\",\n \"ab.datacollection.update\",\n \"ab.datacollection.stale\",\n \"ab.datacollection.delete\",\n \"ab.inbox.create\",\n \"ab.inbox.update\",\n \"ab.task.userform\",\n // \"ab.object.update\",\n];\n// {array}\n// The io.socket.* events we are listening for that relate to our datacollection\n// maintainence.\n\nfunction socketDataSave(key, length) {\n if (!HashSocketJobs[key]) {\n HashSocketJobs[key] = {\n packets: 0,\n length: 0,\n };\n }\n\n HashSocketJobs[key].packets++;\n HashSocketJobs[key].length += length;\n}\nfunction socketDataLog(AB, key, data) {\n let length = \"??\";\n try {\n length = JSON.stringify(data).length;\n data.__length = length;\n } catch (e) {\n console.log(e);\n //\n }\n\n if (data.objectId) {\n let obj = AB.objectByID(data.objectId);\n if (!obj) {\n console.warn(`socket: ${key} unkown object (${length})`, data);\n } else {\n console.warn(\n `socket: ${key} ${obj.label ?? obj.name}(${length})`,\n data\n );\n }\n } else {\n console.warn(`socket: ${key} (${length})`, data);\n }\n\n if (data.jobID) {\n socketDataSave(data.jobID, length);\n socketDataSave(`${data.jobID}-${key}`, length);\n }\n}\n\nlet HashSocketJobs = {\n /* jobID : { #packets, length } */\n};\n\nlet keyBlacklist = {\n /* key : true */\n};\n// a list of incoming message keys, that indicate wether or not we have\n// processed this message. If a message has been processed, we skip it.\n\n/**\n * @function blacklistKey()\n * create a unique key for this network event.\n * @param {event} ev\n * the incoming network event key (ab.datacollection.create)\n * @param {obj} data\n * the related network packet of the incoming event.\n * @return {string}\n */\nfunction blacklistKey(AB, ev, data) {\n let parts = [ev];\n\n if (data.jobID) {\n parts.push(data.jobID);\n }\n\n if (data.data) {\n let PK = \"uuid\";\n let obj = AB.objectByID(data.objectId);\n if (obj) {\n PK = obj.PK();\n }\n parts.push(data.data[PK] || data.data.id);\n }\n\n if (data.__length) {\n parts.push(data.__length);\n } else {\n let length = \"??\";\n try {\n length = JSON.stringify(data).length;\n } catch (e) {\n // ignore\n }\n parts.push(length);\n }\n\n return parts.join(\"-\");\n}\n\n/**\n * @function isBlacklisted()\n * return True/False if a given key is already blacklisted.\n * @param {string} key\n * the () we are checking\n * @return {bool}\n */\nfunction isBlacklisted(key) {\n return keyBlacklist[key] ?? false;\n}\n\n/**\n * @function blacklist()\n * mark a given key as blacklisted. This prevents additional calls with\n * the same key from being processed.\n * A Key is only blacklisted for a given amount of time (1s by default).\n * @param {string} key\n * the blacklistKey() we are checking\n * @param {int} time\n * The duration in ms of how long to keep the key blacklisted.\n */\nfunction blacklist(key, time = 1000) {\n keyBlacklist[key] = true;\n setTimeout(() => {\n delete keyBlacklist[key];\n }, time);\n}\n\nclass NetworkRestSocket extends NetworkRest {\n constructor(parent) {\n // {Network} parent\n\n super(parent);\n\n this.isRealTime = true;\n // {bool}\n // does this Network type support RealTime updates. (socket = true);\n\n // Pass the io.socket.on(*) events to our AB factory.\n listSocketEvents.forEach((ev) => {\n io.socket.on(ev, (data) => {\n // data should be in the format:\n // {\n // objectId: {uuid},\n // data: {object}\n // }\n socketDataLog(this.AB, ev, data);\n\n // ensure we only process a network update 1x\n let blKey = blacklistKey(this.AB, ev, data);\n if (isBlacklisted(blKey)) return;\n blacklist(blKey, 5000); // now prevent additional ones\n\n // check if the ev contains 'datacollection'\n // and do a single normalizeData() on the incoming data here\n // before sending it off to be processed.\n if (ev.indexOf(\"ab.datacollection\") > -1) {\n let values = data.data;\n if (values) {\n let obj = this.AB.objectByID(data.objectId);\n if (obj) {\n if (ev != \"ab.datacollection.delete\") {\n // if data is packed, then unpack it\n let model = obj.model();\n if (model.isCsvPacked(values)) {\n let lengthPacked = data.__length;\n delete data.__length;\n values = model.csvUnpack(values);\n data.data = values.data;\n let lengthUnpacked = JSON.stringify(data).length;\n data.__length = lengthUnpacked;\n data.__lengthPacked = lengthPacked;\n console.log(\n `CSV Pack: ${lengthUnpacked} -> ${lengthPacked} (${(\n (lengthPacked / lengthUnpacked) *\n 100\n ).toFixed(2)}%)`\n );\n }\n\n let jobID = this.AB.jobID();\n performance.mark(`${ev}:normalization`, {\n op: \"function\",\n data: { jobID },\n });\n model.normalizeData(data.data);\n performance.measure(`${ev}:normalization`);\n }\n }\n }\n }\n this.AB.emit(ev, data);\n });\n });\n }\n\n //\n // Interface API\n //\n\n socketLog() {\n console.warn(JSON.stringify(HashSocketJobs, null, 4));\n }\n\n socketLogClear() {\n HashSocketJobs = {};\n }\n\n ////\n //// Network Utilities\n ////\n\n isNetworkConnected() {\n return io.socket.isConnected();\n }\n\n salSend(params) {\n let route, query;\n try {\n // Extract paramitized route (ex: `/app_builder/model/:ID`) for performance tracking\n [, route, query] = params.url.match(\n /https?:\\/\\/[^/]+(\\/[^?]+)\\??(.*)/\n );\n route = route.replace(/\\b[a-fA-F\\d-]{36}\\b/g, \":ID\");\n performance.mark(route, {\n op: \"websocket.client\",\n data: {\n http: {\n query: query || undefined,\n method: params.method,\n },\n url: params.url,\n },\n });\n } catch (err) {\n this.AB.notify.developer(err, {\n context: `salSend() create performance.mark`,\n });\n }\n\n return new Promise((resolve, reject) => {\n params.method = params.method.toLowerCase();\n\n io.socket.request(params, (data, jwres) => {\n // {json} data\n // the data response from the request\n // {json} jwres\n // A JSON WebSocket Response object.\n // {json} jwres.headers : header values\n // {int} jwres.statusCode : http response code\n // {json} jwres.body === resData\n\n // if this is an error\n if (jwres.statusCode >= 400) {\n // Our NetworkRest.error( err ) should be in this format:\n // err.status\n // err.statusText\n // err.responseText\n\n var errStr = jwres.error ? jwres.error.toString() : jwres.body;\n\n var err = new Error(`Socket Error: ${errStr}`);\n err.status = jwres.statusCode;\n err.statusText = errStr;\n err.responseText = jwres.body;\n\n // on RequestTimeout:\n // err.statusText == \"Request timeout\"\n\n reject(err);\n } else {\n // some errors like socket disconnected return an Error for data\n if (data instanceof Error) {\n reject(data);\n return;\n }\n\n if (typeof data == \"string\") {\n performance.mark(\"JSON.parse\", { op: \"serialize\" });\n data = JSON.parse(data);\n performance.measure(\"JSON.parse\");\n }\n\n // Got a JSON response but was the service response an error?\n // this would be a strange case where the .statusCode < 400\n if (data?.status == \"error\") {\n // make sure to reject an err.responseText = data\n reject({\n status: jwres.statusCode,\n responseText: JSON.Stringify(data),\n });\n }\n // Success!\n else {\n performance.measure(route);\n resolve(data);\n }\n }\n });\n });\n }\n}\n\nexport default NetworkRestSocket;\n","var EventEmitter = require(\"events\").EventEmitter;\n\nimport StorageLocal from \"./StorageLocal.js\";\n\nclass Storage extends EventEmitter {\n constructor() {\n super();\n\n this.tenantStorage = null;\n this._config = null;\n this._storage = null;\n }\n\n init(AB) {\n // {ABFactory} AB\n\n this.AB = AB;\n var config = this.AB.Config.siteConfig();\n if (config) {\n if (config.storage && config.storage.encrypted) {\n console.error(\"TODO: Implement Encrypted Storage\");\n // this._storage = StorageEncrypted;\n this._storage = StorageLocal;\n } else {\n this._storage = StorageLocal;\n }\n\n return this._storage.init(AB);\n } else {\n console.error(\"??? Why No site config ???\");\n }\n\n return Promise.resolve();\n }\n\n set(...params) {\n return this._storage.set(...params);\n }\n\n get(...params) {\n return this._storage.get(...params);\n }\n\n clear(...params) {\n return this._storage.clear(...params);\n }\n\n clearAll(...params) {\n return this._storage.clearAll(...params);\n }\n}\n\nexport default new Storage();\n","/*\n * StorageLocal\n *\n * An interface for storing and retrieving Client Side data. Data stored\n * in StorageLoacal is NOT encrypted.\n *\n * This implementation is based upon the webix.storage.local library.\n * See: https://docs.webix.com/api__refs__storage.local.html\n *\n */\n\nvar EventEmitter = require(\"events\").EventEmitter;\n\nclass StorageLocal extends EventEmitter {\n constructor() {\n super();\n\n this.tenantStorage = null;\n // {Webix.storage} object.\n // We divide the storage data according to the tenant we are working\n // with. This way Users who can move between different Tenants can\n // keep their local data separated.\n }\n\n init(AB) {\n // {ABFactory} AB\n\n this.AB = AB;\n var tenantID = this.AB.Tenant.id();\n if (!tenantID) {\n tenantID = \"noAuth\";\n // \"noAuth\" is considered the tenant on our Login sequence\n // which should have a minimum of data stored (language maybe?)\n }\n\n this.tenantStorage = this.AB.Webix.storage.prefix(\n tenantID,\n this.AB.Webix.storage.local\n );\n\n // this isn't actually an Async operation, so just resolve()\n return Promise.resolve();\n }\n\n set(key, value /* , options = {} */) {\n return Promise.resolve().then(() => {\n return this.tenantStorage.put(key, value);\n });\n }\n\n get(key /*, options = {} */) {\n return Promise.resolve().then(() => {\n return this.tenantStorage.get(key);\n });\n }\n\n clear(key) {\n return Promise.resolve().then(() => {\n return this.tenantStorage.remove(key);\n });\n }\n\n clearAll() {\n return Promise.resolve().then(() => {\n return this.tenantStorage.clear();\n });\n }\n}\n\nexport default new StorageLocal();\n","var EventEmitter = require(\"events\").EventEmitter;\n\nimport Config from \"../config/Config.js\";\n\nclass Tenant extends EventEmitter {\n constructor() {\n super();\n\n this.text = false;\n this._config = null;\n this.textClickToEnter = null;\n }\n\n init() {\n var config = Config.tenantConfig();\n if (config) {\n // check if we have options that are stored as a string\n if (\n typeof config.options === \"string\" ||\n config.options instanceof String\n ) {\n // if we do try to parse them into a JSON object\n try {\n config.options = JSON.parse(config.options);\n } catch (error) {\n console.error(error);\n }\n }\n this._config = config;\n this.textClickToEnter = config.options.textClickToEnter;\n }\n\n // this isn't actually an Async operation, so just resolve()\n return Promise.resolve();\n }\n\n id() {\n if (!this._config || this._config.id == \"??\") {\n return null;\n }\n return this._config.id;\n }\n\n setting(key, value) {\n if (this._config) {\n if (value) {\n this._config.options[key] = value;\n return;\n }\n return this._config.options[key];\n }\n }\n}\n\nexport default new Tenant();\n","/*\n * custom_activelist\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomActiveList {\n get key() {\n return \"activelist\";\n }\n\n constructor(App, key) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.ui.list, webix.ActiveContent);\n }\n};\n","/*\n * countfooter\n *\n * Add the count footer to the webix's datatable.\n *\n */\n\nmodule.exports = class ABCountFooter {\n get key() {\n return \"countfooter\";\n }\n\n constructor(App, key) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {};\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {};\n\n // Our webix UI definition:\n var _ui = {};\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix :\n webix.ui.datafilter.countColumn = webix.extend(\n {\n refresh: function (datatable, node, info) {\n var result = 0;\n\n var rowData = datatable.find({}) || [];\n rowData.forEach((row) => {\n if (row == null) return;\n\n var data =\n row[info.columnId] || row[info.columnId + \"__relation\"];\n\n // array\n if (data && Array.isArray(data)) {\n result += data.length;\n } else if (\n data != null &&\n data != \"\" &&\n data != false &&\n data != \"false\" &&\n data != \"0\"\n ) {\n result += 1;\n }\n });\n\n node.innerHTML = result;\n },\n },\n webix.ui.datafilter.summColumn\n );\n }\n};\n","/*\n * Custom Component Manager\n * Make sure our {ABComponent}s are initialized with our custom\n * Webix Components.\n */\n\n// Import our Custom Components here:\nvar componentList = [\n require(\"./activelist\"),\n require(\"./countfooter\"),\n require(\"./datetimepicker\"),\n require(\"./editlist\"),\n require(\"./edittree\"),\n require(\"./editunitlist\"),\n require(\"./focusableTemplate\"),\n require(\"./formioPreview\"),\n require(\"./formioBuilder\").default,\n require(\"./numbertext\"),\n require(\"./thaicalendar\"),\n require(\"./timepicker\"),\n require(\"./tinyMce\").default,\n require(\"./totalfooter\"),\n require(\"./treesuggest\"),\n // require('./savablelayout')\n];\n\nmodule.exports = class ABCustomComponentManager {\n constructor() {}\n\n initComponents(App) {\n App.custom = App.custom || {};\n\n componentList.forEach((Component) => {\n var component = new Component(App);\n App.custom[component.key] = component;\n });\n\n // Transition to v2:\n App.AB.custom = App.custom;\n }\n};\n","/*\n * custom_datetimepicker\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomDateTimePicker {\n //.extend(ComponentKey, function(App, componentKey ) {\n\n get key() {\n return \"datetimepicker\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // componentKey {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: App.unique(\"custom_datetimepicker\"), // keep this unique for this App instance.\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.editors.$popup.datetime = {\n view: \"popup\",\n width: 250,\n height: 250,\n padding: 0,\n body: {\n view: \"calendar\",\n icons: true,\n borderless: true,\n timepicker: true,\n },\n };\n\n webix.editors.datetime = webix.extend(\n {\n popupType: \"datetime\",\n },\n webix.editors.date\n );\n }\n};\n","/*\n * custom_editlist\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomEditList {\n // .extend(ComponentKey, function(App, componentKey ) {\n\n get key() {\n return \"editlist\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.EditAbility, webix.ui.list);\n }\n};\n","/*\n * custom_edittree\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomEditTree {\n // .extend(ComponentKey, function(App, componentKey ) {\n\n get key() {\n return \"edittree\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.EditAbility, webix.ui.tree);\n }\n};\n","/*\n * custom_editunitlist\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomEditUnitList {\n // .extend(ComponentKey, function(App, componentKey ) {\n\n get key() {\n return \"editunitlist\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n /*\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n*/\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.EditAbility, webix.ui.unitlist);\n }\n};\n","/*\n * custom_activelist\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomFocusableTemplate {\n get key() {\n return \"focusabletemplate\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n focus: function () {\n return false;\n },\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.ui.template, webix.UIManager);\n }\n};\n","/*\n * formioBuilder\n *\n * Create a custom webix component.\n *\n * Note: Moved from ABDesigner to prevent loading formIO library globally or\n * duplicating it. Revisit when formIOv5 releases as it should then be possible\n * to package the form renderer without the builder.\n *\n * Note: This component is lazy loaded and requires calling .init() before using\n */\nimport ABLazyCustomComponent from \"./lazyComponent.js\";\nexport default class ABCustomFormBuilderBuilder extends ABLazyCustomComponent {\n get key() {\n return \"formiobuilder\";\n }\n\n constructor(App) {\n super(App);\n this.label = this.AB.Label();\n this.view = this.key;\n }\n\n /**\n * Load the FormIO dependency and add the component to webix\n * @returns {Promise}\n */\n async init() {\n if (this.initialized) return;\n const { FormBuilder } = await import(\n /* webpackPrefetch: true */\n /* webpackFetchPrioirtiy: \"low\" */\n \"../init/formio.js\"\n );\n this.FormBuilder = FormBuilder;\n // Tell Webix to create an INSTANCE of our custom component:\n this.AB.Webix.protoUI(this.ui(), this.AB.Webix.ui.popup);\n this.initialized = true;\n }\n\n /**\n * Generate the custom webix ui\n * @method ui\n * @returns {Object} custom webix ui\n */\n ui() {\n const _this = this;\n\n return {\n name: this.key,\n defaults: {\n css: \"scrolly forceOpen\",\n hidden: false,\n autofit: true,\n },\n $init: async function (config) {\n let comp = {},\n defaultComponent;\n if (config.dataFields)\n Object.assign(\n comp,\n this.parseDataFields(config.dataFields, {\n isCommonForm: config.isCommonForm,\n })\n );\n if (config.isCommonForm) {\n Object.assign(comp, _this.inputComponents());\n defaultComponent = comp.saveButton.schema;\n } else defaultComponent = comp.approveButton.schema;\n\n const formComponents = config.formComponents\n ? config.formComponents\n : { components: [defaultComponent] };\n\n try {\n this.builder = new this.FormBuilder(this.$view, formComponents, {\n noDefaultSubmitButton: true,\n noNewEdit: true,\n builder: {\n basic: false,\n advanced: false,\n customBasic: false,\n premium: false,\n custom: {\n title: this.label(\"Fields\"),\n weight: 0,\n default: true,\n components: comp,\n },\n layout: {\n components: {\n table: true,\n },\n },\n },\n });\n await this.builder.ready;\n } catch (err) {\n this.notify(\"Error initializing formio builder\", err);\n }\n },\n // set up a function that can be called to request the form schema\n getFormData: function () {\n return this.builder.schema ?? this.builder.form;\n },\n // Pass functions into the Webix component to be use in $init\n label: this.label,\n parseDataFields: this.parseDataFields,\n notify: this.AB.notify.developer,\n FormBuilder: this.FormBuilder,\n };\n }\n\n /**\n * Generate the formio custom components based on the fields.\n * Used internally in the webix component.\n * @method parseDataFields\n * @param {object[]} fields {field: ABField, key, label, object: ABObject}\n * @returns {object} each key is a formio component\n */\n parseDataFields(fields, { isCommonForm } = { isCommonForm: true }) {\n const components = {};\n fields?.forEach(({ field, key, label }) => {\n if (!field) {\n components[key] = {\n title: label,\n key,\n schema: {\n label: label.split(\"->\")[1],\n disabled: true,\n key,\n _key: key,\n type: \"textarea\",\n input: true,\n },\n };\n return;\n }\n\n const schema = {\n abFieldID: field.id,\n label: field.label,\n disabled: true,\n key,\n _key: key,\n type: \"textfield\",\n input: true,\n };\n\n switch (field.key) {\n case \"boolean\":\n schema.type = \"checkbox\";\n break;\n case \"calculate\":\n schema.inputType = \"text\";\n schema.calculateValue = `value = ${field.settings.formula\n .replace(/{/g, \"data['\")\n .replace(/}/g, \"']\")}`;\n break;\n case \"connectObject\":\n schema.inputType = \"text\";\n schema.calculateValue = `value = data['${key}.format']`;\n break;\n case \"date\":\n schema.type = \"datetime\";\n schema.format = \"MMMM d, yyyy\";\n break;\n case \"datetime\":\n schema.type = \"datetime\";\n schema.format = \"MMMM d, yyyy h:mm a\";\n break;\n case \"email\":\n schema.type = \"email\";\n break;\n case \"file\":\n schema.type = \"htmlelement\";\n schema.tag = \"a\";\n schema.className = \"btn btn-primary btn-block\";\n schema.content = ` {{data['${key}']?.filename ?? \"No File\"}}`;\n schema.attrs = [\n {\n attr: \"href\",\n value: field.urlFile(`{{data['${key}'].uuid}}`),\n },\n {\n attr: \"target\",\n value: \"_blank\",\n },\n ];\n schema.refreshOnChange = true;\n schema.input = false;\n break;\n case \"image\":\n schema.type = \"htmlelement\";\n schema.tag = \"img\";\n schema.className = \"img-thumbnail max100\";\n schema.content = \"\";\n (schema.attrs = [\n {\n attr: \"src\",\n value: field.urlImage(`{{data['${key}']}}`),\n },\n ]),\n (schema.refreshOnChange = true);\n schema.input = false;\n break;\n case \"list\":\n var values = [];\n field.settings.options.forEach((opt) => {\n values.push({\n label: opt.text,\n value: opt.id,\n });\n });\n schema.type = \"select\";\n schema.data = { values };\n schema.multiple = field.settings.isMultiple;\n break;\n case \"LongText\":\n schema.type = \"textarea\";\n break;\n case \"number\":\n schema.type = \"number\";\n break;\n case \"TextFormula\":\n schema.inputType = \"text\";\n schema.calculateValue = `value = '${field.settings.textFormula}'`;\n break;\n default:\n break;\n }\n components[key] = {\n title: label,\n key,\n icon: field.icon,\n schema,\n };\n });\n\n if (!isCommonForm) {\n components[\"approveButton\"] = {\n title: this.label(\"Approve Button\"),\n key: \"approve\",\n icon: \"check-square\",\n schema: {\n label: this.label(\"Approve\"),\n type: \"button\",\n key: \"approve\",\n event: \"approve\",\n block: true,\n size: \"lg\",\n input: false,\n leftIcon: \"fa fa-thumbs-up\",\n action: \"event\",\n theme: \"success\",\n },\n };\n components[\"denyButton\"] = {\n title: this.label(\"Deny Button\"),\n key: \"deny\",\n icon: \"ban\",\n schema: {\n label: this.label(\"Deny\"),\n type: \"button\",\n key: \"deny\",\n event: \"deny\",\n block: true,\n size: \"lg\",\n input: false,\n leftIcon: \"fa fa-thumbs-down\",\n action: \"event\",\n theme: \"danger\",\n },\n };\n components[\"customButton\"] = {\n title: this.label(\"Custom Action Button\"),\n key: \"custom\",\n icon: \"cog\",\n schema: {\n label: this.label(\"Custom Name\"),\n type: \"button\",\n key: \"custom\",\n event: \"yourEvent\",\n block: true,\n size: \"lg\",\n input: false,\n leftIcon: \"fa fa-cog\",\n action: \"event\",\n theme: \"primary\",\n },\n };\n }\n\n return components;\n }\n\n inputComponents() {\n return {\n textbox: {\n title: \"Textbox\",\n key: \"YOUR_KEY\",\n icon: \"font\",\n schema: {\n type: \"textfield\",\n key: \"YOUR_KEY\",\n label: \"[YOUR LABEL]\",\n placeholder: \"Enter your information.\",\n input: true,\n },\n },\n textarea: {\n title: \"Textarea\",\n key: \"YOUR_KEY\",\n icon: \"bold\",\n schema: {\n type: \"textarea\",\n key: \"YOUR_KEY\",\n label: \"[YOUR LABEL]\",\n placeholder: \"Enter your information.\",\n },\n },\n saveButton: {\n title: \"Submit Button\",\n key: \"submit\",\n icon: \"check-square\",\n schema: {\n label: \"Submit\",\n type: \"button\",\n key: \"submit\",\n event: \"submit\",\n block: true,\n size: \"lg\",\n input: false,\n leftIcon: \"fa fa-check-square\",\n action: \"event\",\n theme: \"success\",\n },\n },\n };\n }\n}\n","/*\n * formioBuilder\n *\n * Create a custom webix component.\n *\n * Note: This component is lazy loaded and requires calling .init() before using\n *\n */\nconst ABLazyCustomComponent = require(\"./lazyComponent.js\");\nmodule.exports = class ABCustomFormIOPreview extends ABLazyCustomComponent {\n get key() {\n return \"formiopreview\";\n }\n\n async init() {\n if (this.initialized) return;\n const { Form } = await import(\n /* webpackPrefetch: true */\n /* webpackFetchPrioirtiy: \"low\" */\n \"../init/formio.js\"\n );\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n defaults: {\n css: \"scrolly\",\n borderless: true,\n },\n $init: async function (config) {\n this.$ready.push(() => this.initForm(config));\n },\n\n initForm: async (config) => {\n var formComponents = config.formComponents ?? {};\n var formData = config.formData ?? {};\n const component = $$(config.id);\n\n // JOHNNY: we now have formio designs where we need to pull out\n // more than just an .id from connected fields. Let's no longer\n // do this:\n // // we need to find out when we are passing an array of objects and reduce it down to an array of IDs\n // for (var data in formData) {\n // if (\n // Array.isArray(formData[data]) &&\n // typeof formData[data][0] == \"object\"\n // ) {\n // formData[data] = formData[data].map((item) => item.id);\n // }\n // }\n\n const form = new Form(component.$view, formComponents);\n component._formio = form;\n // readOnly: true\n // sanitizeConfig: {\n // addTags: [\"a\", \"label\", \"img\", \"i\"],\n // addAttr: [\"src\", \"href\", \"class\", \"target\"]\n // }\n // }).then(function (form) {\n await form.build();\n // now that it is set up we can push it into the global var\n // formBuilder = builder;\n // Provide a default submission.\n form.instance.submission = {\n data: formData,\n };\n (formComponents.components || []).forEach((comp) => {\n if (\n comp.type == \"button\" &&\n comp.action == \"event\" &&\n comp.event\n ) {\n form.instance.once(comp.event, function (/* click */) {\n config?.onButton(comp.event);\n // _this.emit(\"button\", comp.event);\n });\n }\n });\n // });\n },\n };\n this.view = this.key;\n\n // our internal business logic\n this._logic = {};\n\n // Tell Webix to create an INSTANCE of our custom component:\n this.AB.Webix.protoUI(_ui, this.AB.Webix.ui.view);\n this.initialized = true;\n }\n};\n","/**\n * Base class for any custom webix component that we want to initalize lazily,\n * usually to reduce the dependency size required on load.\n */\nvar ABEmitter = require(\"../AppBuilder/platform/ABEmitter.js\");\nmodule.exports = class ABLazyCustomComponent extends ABEmitter {\n constructor({ AB }) {\n super();\n this.initialized = false;\n this.AB = AB;\n this.setDefaultUI();\n }\n\n /**\n * Sets a default UI used before the actual webix component is ready. Meant as\n * a helper to future developers.\n */\n setDefaultUI() {\n this.AB.Webix.protoUI(\n {\n name: this.key,\n defaults: {\n template:\n \"This custom webix component has not been initialized.
    Call AB.custom.#key#.init() before using this component.\",\n data: { key: this.key },\n },\n $init: () =>\n console.warn(\n `${this.key} custom webix component used before being initalized`\n ),\n },\n this.AB.Webix.ui.template\n );\n }\n};\n","/*\n * numbertext\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomNumberText {\n get key() {\n return \"numbertext\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n\n defaults: {\n css: \"webix_el_text\",\n },\n\n // override this function to return number value type\n $getValue: function () {\n var val = this.getInputNode().value;\n if (val) return JSON.parse(val);\n // Convert to number\n else return \"\";\n },\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.ui.text);\n }\n};\n","/*\n * Thai Calendar\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomThaiCalendar {\n get key() {\n return \"thaicalendar\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // componentKey {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n this.view = this.key;\n\n const i18n = webix.i18n;\n\n // Our webix UI definition:\n const _ui = {\n name: this.key,\n defaults: {\n calendarHeader: function (d) {\n return `${i18n.calendar.monthFull[d.getMonth()]} ${\n d.getFullYear() + 543\n }`;\n },\n },\n };\n\n if (webix.ui.calendar.$protoWait[0]._zoom_logic) {\n _ui._zoom_logic = AB.cloneDeep(\n webix.ui.calendar.$protoWait[0]._zoom_logic\n );\n _ui._zoom_logic[1] = Object.assign(_ui._zoom_logic[1], {\n _getTitle: this._getYearTitle,\n });\n _ui._zoom_logic[2] = Object.assign(_ui._zoom_logic[2], {\n _getTitle: this._getYearRangeTitle,\n _getContent: this._getYearContent,\n _setContent: this._setYear,\n });\n }\n\n if (webix.ui.calendar.$protoWait[0].Qd) {\n _ui.Qd = AB.cloneDeep(webix.ui.calendar.$protoWait[0].Qd);\n _ui.Qd[1] = Object.assign(_ui.Qd[1], {\n Jv: this._getYearTitle,\n });\n _ui.Qd[2] = Object.assign(_ui.Qd[2], {\n Jv: this._getYearRangeTitle,\n Zv: this._getYearContent,\n Xv: this._setYear,\n });\n }\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.ui.calendar);\n\n webix.editors.$popup.thaidate = {\n view: \"popup\",\n width: 250,\n height: 250,\n padding: 0,\n body: {\n view: this.key,\n icons: true,\n borderless: true,\n timepicker: false,\n },\n };\n\n webix.editors.$popup.thaidatetime = {\n view: \"popup\",\n width: 250,\n height: 250,\n padding: 0,\n body: {\n view: this.key,\n icons: true,\n borderless: true,\n timepicker: true,\n },\n };\n\n webix.editors.thaidate = webix.extend(\n {\n popupType: \"thaidate\",\n },\n webix.editors.date\n );\n\n webix.editors.thaidatetime = webix.extend(\n {\n popupType: \"thaidatetime\",\n },\n webix.editors.date\n );\n }\n\n _getYearTitle(date) {\n return date.getFullYear() + 543;\n }\n\n _getYearRangeTitle(date, calendar) {\n let start = date.getFullYear() + 543;\n calendar._zoom_start_date = start = start - (start % 10) - 1;\n return start + \" - \" + (start + 10 + 1);\n }\n\n _getYearContent(i, calendar) {\n return calendar._zoom_start_date + i;\n }\n\n _setYear(next, i, calendar) {\n next.setFullYear(calendar._zoom_start_date - 543 + i);\n }\n};\n","/*\n * custom_timepicker\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomTimePicker {\n //.extend(ComponentKey, function(App, componentKey ) {\n\n get key() {\n return \"timepicker\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // componentKey {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: App.unique(\"custom_timepicker\"), // keep this unique for this App instance.\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.editors.$popup.time = {\n view: \"popup\",\n body: {\n view: \"calendar\",\n width: 220,\n height: 200,\n type: \"time\",\n },\n };\n\n webix.editors.time = webix.extend(\n {\n popupType: \"time\",\n },\n webix.editors.date\n );\n }\n};\n","/*\n * tinyMce\n *\n * Create a custom webix component.\n *\n * Note: This component is lazy loaded and requires calling .init() before using\n */\nimport ABLazyCustomComponent from \"./lazyComponent.js\";\nexport default class ABCustomTinyMCE extends ABLazyCustomComponent {\n get key() {\n return \"tinymce-editor\";\n }\n\n async init() {\n if (this.initialized) return;\n\n await import(\n /* webpackPrefetch: true */\n \"../js/webix/extras/tinymce.js\"\n );\n this.initialized = true;\n }\n}\n","/*\n * totalfooter\n *\n * Add the contents of records to show in footer of the webix's datatable.\n *\n */\n\nmodule.exports = class ABTotalFooter {\n get key() {\n return \"totalfooter\";\n }\n\n constructor(App, key) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {};\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {};\n\n // Our webix UI definition:\n var _ui = {};\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix :\n webix.ui.datafilter.totalColumn = webix.extend(\n {\n refresh: function (datatable, node, info) {\n var result = 0;\n\n datatable.eachRow(function (row) {\n var record = datatable.getItem(row);\n\n var data = info.field.format(record);\n\n // array\n if (data) {\n result += parseFloat(data); // we need to use parseFloat because numbers could be decimals\n }\n });\n\n node.innerHTML = result;\n },\n },\n webix.ui.datafilter.summColumn\n );\n }\n};\n","/*\n * custom_editlist\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomEditList {\n // .extend(ComponentKey, function(App, componentKey ) {\n\n get key() {\n return \"treesuggest\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n defaults: {\n type: \"tree\",\n width: 0,\n body: {\n borderless: true,\n select: true,\n template: function (obj, common) {\n return (\n \"\" +\n (obj.$count ? \"\" + obj.value + \"\" : obj.value) +\n \"\"\n );\n },\n ready: function () {\n this.openAll();\n },\n on: {\n onAfterSelect: function (id, e) {\n if (this.getItem(id).$count) {\n this.getParentView().setMasterValue(\"\");\n this.show(\n $$(this.getParentView().config.master).getInputNode()\n );\n }\n },\n },\n },\n },\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.ui.suggest);\n }\n};\n","/* (ignored) */","/* (ignored) */","/* (ignored) */"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/assets/AB.3bf5db93c75d99b70a26.js b/assets/AB.b42df031aa8d5bacdbad.js similarity index 98% rename from assets/AB.3bf5db93c75d99b70a26.js rename to assets/AB.b42df031aa8d5bacdbad.js index 6dbfa800..68b3ddc3 100644 --- a/assets/AB.3bf5db93c75d99b70a26.js +++ b/assets/AB.b42df031aa8d5bacdbad.js @@ -389,6 +389,7 @@ class ABValidator { constructor(AB) { this.AB = AB; this.errors = []; + this.platform = "web"; } addError(name, message) { @@ -6313,6 +6314,8 @@ module.exports = class ABDefinitionCore { // const _ = require("lodash"); // const uuidv4 = require("uuid"); +const ABClassManager = __webpack_require__(/*! ../platform/ABClassManager */ 56938); + const ABApplication = __webpack_require__(/*! ../platform/ABApplication */ 27223); const ABApplicationMobile = __webpack_require__(/*! ../platform/ABApplicationMobile */ 31221); const ABDefinition = __webpack_require__(/*! ../platform/ABDefinition */ 8592); @@ -6402,6 +6405,9 @@ class ABFactory extends EventEmitter { this._allDatacollections = []; // {array} of all the ABDataCollection(s) in our site. + this.ClassManager = ABClassManager; + // {ClassManager} the single source for our Class Libraries. + // // Class References // @@ -6580,6 +6586,10 @@ class ABFactory extends EventEmitter { } init() { + // BEFORE Definitions are loaded, + // make sure any local Plugins are loaded. + this.ClassManager.registerLocalPlugins(this.pluginAPI()); + let allDefinitions = Object.keys(this._definitions).map( (k) => this._definitions[k] ); @@ -6984,13 +6994,20 @@ class ABFactory extends EventEmitter { objectNew(values) { var newObj = null; - if (values.isExternal == true) + if (values.plugin_key) { + // If this is from a plugin, create it from ClassManager + newObj = this.ClassManager.createObject( + values.plugin_key, + values, + this + ); + } else if (values.isExternal == true) newObj = new ABObjectExternal(values, this); else if (values.isImported == true) newObj = new ABObjectImport(values, this); - else if (values.isNetsuite == true) + else if (values.isNetsuite == true) { newObj = new ABObjectApiNetsuite(values, this); - else if (values.isAPI == true) newObj = new ABObjectApi(values, this); + } else if (values.isAPI == true) newObj = new ABObjectApi(values, this); else newObj = new ABObject(values, this); /* @@ -7012,6 +7029,14 @@ class ABFactory extends EventEmitter { return this.objectByID("d84cd351-d96c-490f-9afb-2a0b880ca0ec"); } + objectPlugin() { + return this.objectByID("8a20528a-e472-4e80-911a-b14285425caf"); + } + + objectPluginLinks() { + return this.objectByID("7ff322ff-3434-4611-9fd1-4d2996414c1a"); + } + objectProcessDefinition() { return this.objectByID("af91fc75-fb73-4d71-af14-e22832eb5915"); } @@ -7048,6 +7073,27 @@ class ABFactory extends EventEmitter { return this.objectByID("db5b3b26-5300-4c92-bc73-8ce4f4696992"); } + // + // Plugin + // + pluginAPI() { + let api = this.ClassManager.getPluginAPI(); + api.AB = this; + api.platform = this.platform ?? "service"; + return api; + } + + pluginRegister(plugin) { + let pluginClass = plugin(this.pluginAPI()); + if (Array.isArray(pluginClass)) { + pluginClass.forEach((p) => { + this.ClassManager.pluginRegister(p); + }); + } else { + this.ClassManager.pluginRegister(pluginClass); + } + } + // // Hints // @@ -12431,6 +12477,7 @@ var AllViews = [ __webpack_require__(/*! ../platform/views/ABViewFormSelectSingle */ 46125), __webpack_require__(/*! ../platform/views/ABViewFormTextbox */ 10449), __webpack_require__(/*! ../platform/views/ABViewFormTree */ 35865), + __webpack_require__(/*! ../platform/views/ABViewFormURL */ 71616), ]; /* @@ -12480,8 +12527,8 @@ module.exports = class ABViewManagerCore { if (!isPlugin(values.key)) { console.error( "!! View[" + - values.key + - "] not yet defined. Have an ABView instead:" + values.key + + "] not yet defined. Have an ABView instead:" ); } return new Views["view"](values, application, parent); @@ -29983,11 +30030,11 @@ module.exports = class ABViewCore extends ABMLClass { var form = null; var curr = this; - while (curr.key != "form" && !curr.isRoot() && curr.parent) { + while (!curr.isForm && !curr.isRoot() && curr.parent) { curr = curr.parent; } - if (curr.key == "form") { + if (curr.isForm) { form = curr; } @@ -31764,6 +31811,7 @@ const ABViewFormPropertyComponentDefaults = { module.exports = class ABViewFormCore extends ABViewContainer { constructor(values, application, parent, defaultValues) { super(values, application, parent, defaultValues || ABViewFormDefaults); + this.isForm = true; } static common() { @@ -35432,6 +35480,24 @@ module.exports = class ABClassApplication extends ABApplicationCore { return super.save(); } + viewAll(fn = () => true) { + let vmViews = super.viewAll(fn); + let pluginViews = this.AB.ClassManager.viewAll(fn); + let allViews = [...vmViews, ...pluginViews]; + let L = this.AB.Label(); + + // Sort by label from common() if available, otherwise by key + return allViews.sort((a, b) => { + const aCommon = a.common ? a.common() : {}; + const bCommon = b.common ? b.common() : {}; + const aLabel = + aCommon.label || L(aCommon.labelKey || aCommon.key) || ""; + const bLabel = + bCommon.label || L(bCommon.labelKey || bCommon.key) || ""; + return aLabel.localeCompare(bLabel); + }); + } + warningsEval() { super.warningsEval(); @@ -35572,6 +35638,200 @@ module.exports = class ABClassApplicationMobile extends ( }; +/***/ }), + +/***/ 56938: +/*!***********************************************!*\ + !*** ./AppBuilder/platform/ABClassManager.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ allObjectProperties: () => (/* binding */ allObjectProperties), +/* harmony export */ createObject: () => (/* binding */ createObject), +/* harmony export */ createPropertiesObject: () => (/* binding */ createPropertiesObject), +/* harmony export */ getPluginAPI: () => (/* binding */ getPluginAPI), +/* harmony export */ pluginRegister: () => (/* binding */ pluginRegister), +/* harmony export */ registerLocalPlugins: () => (/* binding */ registerLocalPlugins), +/* harmony export */ viewAll: () => (/* binding */ viewAll), +/* harmony export */ viewCreate: () => (/* binding */ viewCreate), +/* harmony export */ viewEditorAll: () => (/* binding */ viewEditorAll), +/* harmony export */ viewEditorCreate: () => (/* binding */ viewEditorCreate), +/* harmony export */ viewPropertiesAll: () => (/* binding */ viewPropertiesAll) +/* harmony export */ }); +/* harmony import */ var _plugins_ABUIPlugin_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./plugins/ABUIPlugin.js */ 4341); +/* harmony import */ var _plugins_ABPropertiesObjectPlugin__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./plugins/ABPropertiesObjectPlugin */ 56965); +/* harmony import */ var _plugins_ABObjectPlugin_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./plugins/ABObjectPlugin.js */ 84788); +/* harmony import */ var _plugins_ABModelPlugin_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./plugins/ABModelPlugin.js */ 84364); +/* harmony import */ var _plugins_ABViewPlugin_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./plugins/ABViewPlugin.js */ 65006); +/* harmony import */ var _plugins_ABViewComponentPlugin_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./plugins/ABViewComponentPlugin.js */ 7105); +/* harmony import */ var _plugins_ABViewPropertiesPlugin_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./plugins/ABViewPropertiesPlugin.js */ 49243); +/* harmony import */ var _plugins_ABViewEditorPlugin_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./plugins/ABViewEditorPlugin.js */ 98487); + + + + + + + + + +const classRegistry = { + ObjectTypes: new Map(), + ObjectPropertiesTypes: new Map(), + FieldTypes: new Map(), + ViewTypes: new Map(), + ViewPropertiesTypes: new Map(), + ViewEditorTypes: new Map(), +}; + +function registerViewPropertiesTypes(name, ctor) { + classRegistry.ViewPropertiesTypes.set(name, ctor); +} + +function registerViewEditorTypes(name, ctor) { + classRegistry.ViewEditorTypes.set(name, ctor); +} + +function registerObjectPropertiesTypes(name, ctor) { + classRegistry.ObjectPropertiesTypes.set(name, ctor); +} + +function registerObjectTypes(name, ctor) { + classRegistry.ObjectTypes.set(name, ctor); +} + +function registerViewTypes(name, ctor) { + classRegistry.ViewTypes.set(name, ctor); +} + +/** + * @method getPluginAPI() + * This is the data structure we provide to each of our plugins so they + * can register their custom classes. + * We provide base objects from which they can extend. + * @returns {Object} + */ +function getPluginAPI() { + return { + ABUIPlugin: _plugins_ABUIPlugin_js__WEBPACK_IMPORTED_MODULE_0__["default"], + ABPropertiesObjectPlugin: _plugins_ABPropertiesObjectPlugin__WEBPACK_IMPORTED_MODULE_1__["default"], + ABObjectPlugin: _plugins_ABObjectPlugin_js__WEBPACK_IMPORTED_MODULE_2__["default"], + ABModelPlugin: _plugins_ABModelPlugin_js__WEBPACK_IMPORTED_MODULE_3__["default"], + ABViewPlugin: _plugins_ABViewPlugin_js__WEBPACK_IMPORTED_MODULE_4__["default"], + ABViewComponentPlugin: _plugins_ABViewComponentPlugin_js__WEBPACK_IMPORTED_MODULE_5__["default"], + ABViewPropertiesPlugin: _plugins_ABViewPropertiesPlugin_js__WEBPACK_IMPORTED_MODULE_6__["default"], + ABViewEditorPlugin: _plugins_ABViewEditorPlugin_js__WEBPACK_IMPORTED_MODULE_7__["default"], + // ABFieldPlugin, + // ABViewPlugin, + }; +} + +// export function createField(type, config) { +// const FieldClass = classRegistry.FieldTypes.get(type); +// if (!FieldClass) throw new Error(`Unknown object type: ${type}`); +// return new FieldClass(config); +// } +function createObject(key, config, AB) { + const ObjectClass = classRegistry.ObjectTypes.get(key); + if (!ObjectClass) throw new Error(`Unknown object type: ${key}`); + return new ObjectClass(config, AB); +} + +function createPropertiesObject(key, config, AB) { + const ObjectClass = classRegistry.ObjectPropertiesTypes.get(key); + if (!ObjectClass) throw new Error(`Unknown object type: ${key}`); + return new ObjectClass(config, AB); +} + +function allObjectProperties() { + return Array.from(classRegistry.ObjectPropertiesTypes.values()); +} + +// export function createObjectProperty(key, config) { +// const ObjectClass = classRegistry.ObjectPropertiesTypes.get(key); +// if (!ObjectClass) throw new Error(`Unknown object type: ${key}`); +// return new ObjectClass(config); +// } + +function viewCreate(type, config, application, parent) { + const ViewClass = classRegistry.ViewTypes.get(type); + if (!ViewClass) throw new Error(`Unknown View type: ${type}`); + return new ViewClass(config, application, parent); +} + +function viewAll(fn = () => true) { + return Array.from(classRegistry.ViewTypes.values()).filter(fn); +} + +function viewPropertiesAll(fn = () => true) { + return Array.from(classRegistry.ViewPropertiesTypes.values()).filter(fn); +} + +function viewEditorCreate(key, view, base, ids) { + const EditorClass = classRegistry.ViewEditorTypes.get(key); + if (!EditorClass) throw new Error(`Unknown View Editor type: ${key}`); + return new EditorClass(view, base, ids); +} + +function viewEditorAll(fn = () => true) { + return Array.from(classRegistry.ViewEditorTypes.values()).filter(fn); +} + +function pluginRegister(pluginClass) { + let type = pluginClass.getPluginType(); + switch (type) { + case "object": + registerObjectTypes(pluginClass.getPluginKey(), pluginClass); + break; + case "properties-object": + registerObjectPropertiesTypes(pluginClass.getPluginKey(), pluginClass); + break; + // case "field": + // break; + case "view": + registerViewTypes(pluginClass.getPluginKey(), pluginClass); + break; + case "properties-view": + registerViewPropertiesTypes(pluginClass.getPluginKey(), pluginClass); + break; + case "editor-view": + registerViewEditorTypes(pluginClass.getPluginKey(), pluginClass); + break; + default: + throw new Error( + `ABClassManager.pluginRegister():: Unknown plugin type: ${type}` + ); + } +} + +/// +/// For development +/// +// import propertyNSAPI from "../../../plugins/ab_plugin_object_netsuite_api/properties/ABPropertiesObjectNetsuiteAPI.js"; +// import objectNSAPI from "./plugins/developer/ABObjectNetsuiteAPI.js"; + +function registerLocalPlugins(API) { + // let { registerObjectTypes, registerObjectPropertiesTypes } = API; + // let cPropertyNSAPI = propertyNSAPI(API); + // registerObjectPropertiesTypes(cPropertyNSAPI.getPluginKey(), cPropertyNSAPI); + // let cObjectNSAPI = objectNSAPI(API); + // registerObjectTypes(cObjectNSAPI.getPluginKey(), cObjectNSAPI); +} + +// module.exports = { +// getPluginAPI, +// createPropertiesObject, +// // createField, +// // createObjectProperty, +// // createView, +// // classRegistry, // Expose the registry for testing or introspection +// registerLocalPlugins, +// }; + + /***/ }), /***/ 85450: @@ -37078,32 +37338,6 @@ module.exports = class ABModel extends ABModelCore { /// Instance Methods /// - // Prepare multilingual fields to be untranslated - // Before untranslating we need to ensure that values.translations is set. - prepareMultilingualData(values) { - // if this object has some multilingual fields, translate the data: - var mlFields = this.object.multilingualFields(); - // if mlFields are inside of the values saved we want to translate otherwise do not because it will reset the translation field and you may loose unchanged translations - var shouldTranslate = false; - if (mlFields.length) { - mlFields.forEach(function (field) { - if (values[field] != null) { - shouldTranslate = true; - } - }); - } - if (shouldTranslate) { - if ( - values.translations == null || - typeof values.translations == "undefined" || - values.translations == "" - ) { - values.translations = []; - } - this.object.unTranslate(values, values, mlFields); - } - } - request(method, params) { return this.AB.Network[method](params); } @@ -39646,8 +39880,31 @@ module.exports = class ABStep extends ABStepCore { /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const ABViewManagerCore = __webpack_require__(/*! ../core/ABViewManagerCore */ 74834); +const ClassManager = __webpack_require__(/*! ./ABClassManager */ 56938); -module.exports = class ABViewManager extends ABViewManagerCore {}; +module.exports = class ABViewManager extends ABViewManagerCore { + /** + * @function newView + * return an instance of an ABView based upon the values.key value. + * @return {ABView} + */ + static newView(values, application, parent) { + parent = parent || null; + + // check to see if this is a plugin view + if (values.plugin_key) { + // If this is from a plugin, create it from ClassManager + return ClassManager.viewCreate( + values.plugin_key, + values, + application, + parent + ); + } + + return super.newView(values, application, parent); + } +}; /***/ }), @@ -49324,6 +49581,1411 @@ module.exports = class ABMobileViewTimeline extends ABMobileViewTimelineCore { }; +/***/ }), + +/***/ 56419: +/*!********************************************************!*\ + !*** ./AppBuilder/platform/plugins/ABClassUIPlugin.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ ABClassUIPlugin) +/* harmony export */ }); +/* harmony import */ var _ui_ClassUI_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../ui/ClassUI.js */ 93692); + + +class ABClassUIPlugin extends _ui_ClassUI_js__WEBPACK_IMPORTED_MODULE_0__["default"] { + constructor(base = "class_ui", ids = {}) { + // base: {string} unique base id reference + // ids: {hash} { key => '' } + // this is provided by the Sub Class and has the keys + // unique to the Sub Class' interface elements. + + super(base, ids); + + this.base = base; + + this.AB = null; + // {ABFactory} + // Our common ABFactory for our application. + // Should be set via init(AB) method + + this.CurrentApplicationID = null; + // {string} uuid + // The current ABApplication.id we are working with. + + this.CurrentDatacollectionID = null; + // {string} + // the ABDataCollection.id of the datacollection we are working with. + + this.CurrentObjectID = null; + // {string} + // the ABObject.id of the object we are working with. + + this.CurrentProcessID = null; + // {string} + // the ABProcess.id of the process we are working with. + + this.CurrentQueryID = null; + // {string} + // the ABObjectQuery.id of the query we are working with. + + this.CurrentViewID = null; + // {string} + // the ABView.id of the view we are working with. + + this.CurrentVersionID = null; + // {string} + // the ABVersion.id of the version we are working with. + } + + /** + * @method static L() + * A static method to return a multilingual label function. + * NOTE: Sub classes should override this to provide their plugin name. + * @return {function} A function that returns multilingual labels + */ + // static L() { + // return function (...params) { + // // Default implementation - sub classes should override + // return params[0] || ""; + // }; + // } + + /** + * @function applicationLoad + * save the ABApplication.id of the current application. + * @param {ABApplication} app + */ + applicationLoad(app) { + this.CurrentApplicationID = app?.id; + } + + /** + * @function datacollectionLoad + * save the ABDataCollection.id of the current datacollection. + * @param {ABDataCollection} dc + */ + datacollectionLoad(dc) { + this.CurrentDatacollectionID = dc?.id; + } + + /** + * @function objectLoad + * save the ABObject.id of the current object. + * @param {ABObject} obj + */ + objectLoad(obj) { + this.CurrentObjectID = obj?.id; + } + + /** + * @function processLoad + * save the ABProcess.id of the current process. + * @param {ABProcess} process + */ + processLoad(process) { + this.CurrentProcessID = process?.id; + } + + /** + * @function queryLoad + * save the ABObjectQuery.id of the current query. + * @param {ABObjectQuery} query + */ + queryLoad(query) { + this.CurrentQueryID = query?.id; + } + + /** + * @function versionLoad + * save the ABVersion.id of the current version. + * @param {ABVersion} version + */ + versionLoad(version) { + this.CurrentVersionID = version?.id; + } + + /** + * @function viewLoad + * save the ABView.id of the current view. + * @param {ABView} view + */ + viewLoad(view) { + this.CurrentViewID = view?.id; + + if (view?.application) { + this.applicationLoad(view.application); + } + } + + /** + * @method CurrentApplication + * return the current ABApplication being worked on. + * @return {ABApplication} application + */ + get CurrentApplication() { + return this.AB?.applicationByID(this.CurrentApplicationID); + } + + /** + * @method CurrentDatacollection() + * A helper to return the current ABDataCollection we are working with. + * @return {ABDataCollection} + */ + get CurrentDatacollection() { + return this.AB?.datacollectionByID(this.CurrentDatacollectionID); + } + + /** + * @method CurrentObject() + * A helper to return the current ABObject we are working with. + * @return {ABObject} + */ + get CurrentObject() { + let obj = this.AB?.objectByID(this.CurrentObjectID); + if (!obj) { + obj = this.AB?.queryByID(this.CurrentObjectID); + } + return obj; + } + + /** + * @method CurrentProcess() + * A helper to return the current ABProcess we are working with. + * @return {ABProcess} + */ + get CurrentProcess() { + return this.AB?.processByID(this.CurrentProcessID); + } + + /** + * @method CurrentQuery() + * A helper to return the current ABObjectQuery we are working with. + * @return {ABObjectQuery} + */ + get CurrentQuery() { + return this.AB?.queryByID(this.CurrentQueryID); + } + + /** + * @method CurrentView() + * A helper to return the current ABView we are working with. + * @return {ABView} + */ + get CurrentView() { + return this.CurrentApplication?.views( + (v) => v.id == this.CurrentViewID + )[0]; + } + + /** + * @method CurrentVersion() + * A helper to return the current ABVersion we are working with. + * @return {ABVersion} + */ + // get CurrentVersion() { + // return this.AB?.versionByID?.(this.CurrentVersionID); + // } + + /** + * @method datacollectionsIncluded() + * return a list of datacollections that are included in the current + * application. + * @return [{id, value, icon}] + * id: {string} the ABDataCollection.id + * value: {string} the label of the ABDataCollection + * icon: {string} the icon to display + */ + datacollectionsIncluded() { + return this.CurrentApplication?.datacollectionsIncluded() + .filter((dc) => { + const obj = dc.datasource; + return ( + dc.sourceType == "object" && !obj?.isImported && !obj?.isReadOnly + ); + }) + .map((d) => { + let entry = { id: d.id, value: d.label }; + if (d.sourceType == "query") { + entry.icon = "fa fa-filter"; + } else { + entry.icon = "fa fa-database"; + } + return entry; + }); + } + + /** + * @method uniqueIDs() + * add a unique identifier to each of our this.ids to ensure they are + * unique. Useful for components that are repeated, like items in a list. + */ + uniqueIDs() { + let uniqueInstanceID = webix.uid(); + Object.keys(this.ids).forEach((k) => { + this.ids[k] = `${this.ids[k]}_${uniqueInstanceID}`; + }); + } + + /** + * @method warningsRefresh() + * reset the warnings on the provided ABObject and then start propogating + * the "warnings" display updates. + * @param {ABObject} ABObject + */ + warningsRefresh(ABObject) { + ABObject?.warningsEval?.(); + this.emit("warnings"); + } + + /** + * @method warningsPropogate() + * If any of the passed in ui elements issue a "warnings" event, we will + * propogate that upwards. + * @param {Array} elements + * Array of UI elements that can emit "warnings" events + */ + warningsPropogate(elements = []) { + elements.forEach((e) => { + e.on("warnings", () => { + this.emit("warnings"); + }); + }); + } + + /** + * @method init() + * Initialize the plugin with the ABFactory instance. + * @param {ABFactory} AB + */ + async init(AB) { + this.AB = AB; + } +} + + +/***/ }), + +/***/ 84364: +/*!******************************************************!*\ + !*** ./AppBuilder/platform/plugins/ABModelPlugin.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ ABModelPlugin) +/* harmony export */ }); +const ABModel = __webpack_require__(/*! ../ABModel */ 90940); + +class ABModelPlugin extends ABModel {} + + +/***/ }), + +/***/ 84788: +/*!*******************************************************!*\ + !*** ./AppBuilder/platform/plugins/ABObjectPlugin.js ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ ABObjectPlugin) +/* harmony export */ }); +/* harmony import */ var _ABObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ABObject.js */ 84154); +/* harmony import */ var _ABObject_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_ABObject_js__WEBPACK_IMPORTED_MODULE_0__); + + +class ABObjectPlugin extends (_ABObject_js__WEBPACK_IMPORTED_MODULE_0___default()) { + // constructor(...params) { + // super(...params); + + // } + + static getPluginKey() { + console.error("ABObjectPlugin.getPluginKey() not overwritten!"); + return "ab-object-plugin"; + } + + static getPluginType() { + return "object"; + } + + // Format our getDbInfo() response for the ABDesigner info options. + async getDbInfo() { + /* + // Data format: + { + "definitionId": "f2416a1a-d75c-40f2-8180-bad9b5f8b9cc", + "tableName": "AB_MockupHR_TeamTargetLocation", + "fields": [ + { + "Field": "uuid", + "Type": "varchar(255)", + "Null": "NO", + "Key": "PRI", + "Default": null, + "Extra": "" + }, + { + "Field": "created_at", + "Type": "datetime", + "Null": "YES", + "Key": "", + "Default": null, + "Extra": "" + }, + { + "Field": "updated_at", + "Type": "datetime", + "Null": "YES", + "Key": "", + "Default": null, + "Extra": "" + }, + { + "Field": "properties", + "Type": "text", + "Null": "YES", + "Key": "", + "Default": null, + "Extra": "" + } + ] + } + */ + let PK = this.PK(); + let fieldInfo = []; + this.fields().forEach((f) => { + let field = { + Field: f.columnName, + Type: f.key, + Null: f.settings.required ? "NO" : "YES", + Key: PK == f.columnName ? "PRI" : "", + Default: "", + Extra: "", + }; + fieldInfo.push(field); + }); + + let TableInfo = { + definitionId: this.id, + tableName: this.tableName, + fields: fieldInfo, + }; + + return TableInfo; + } + + toObj() { + const result = super.toObj(); + result.plugin_key = this.constructor.getPluginKey(); + // plugin_key : is what tells our ABFactory.objectNew() to create this object from the plugin class. + return result; + } +} + + +/***/ }), + +/***/ 56965: +/*!*****************************************************************!*\ + !*** ./AppBuilder/platform/plugins/ABPropertiesObjectPlugin.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ ABPropertiesObjectPlugin) +/* harmony export */ }); +/* harmony import */ var _ABUIPlugin_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ABUIPlugin.js */ 4341); + + +function scanForSaveButton(el, idButtonSave) { + if (el.rows || el.cols || el.cells) { + let res = false; + (el.rows || el.cols || el.cells).forEach((e) => { + if (e) { + res = res || scanForSaveButton(e, idButtonSave); + } + }); + return res; + } + if (el.id && el.id == idButtonSave) { + return true; + } + return false; +} + +class ABPropertiesObjectPlugin extends _ABUIPlugin_js__WEBPACK_IMPORTED_MODULE_0__["default"] { + constructor(key, ids = {}, AB) { + key = key ?? ABPropertiesObjectPlugin.getPluginKey(); + // make sure we have these ids defined: + ids = Object.assign( + { + form: "", + buttonSave: "", + buttonCancel: "", + }, + ids + ); + super(key, ids, AB); + // console.log("ABPropertiesObjectPlugin constructor", this); + + this.width = 800; + this.height = 500; + } + + static getPluginKey() { + return "ab-properties-object-plugin"; + } + + async init(AB) { + this.AB = AB; + + // + // setup our listeners + // + this.on("save.error", (...params) => { + this.onError(...params); + }); + + this.on("save.success", (...params) => { + this.onSuccess(...params); + }); + } + + /** + * @method onError() + * Our Error handler when the data we provided our parent + * ui_work_object_list_newObject object had an error saving + * the values. + * @param {Error|ABValidation|other} err + * The error information returned. This can be several + * different types of objects: + * - A javascript Error() object + * - An ABValidation object returned from our .isValid() + * method + * - An error response from our API call. + */ + onError(err) { + let L = this.L(); + if (err) { + console.error(err); + let message = L("the entered data is invalid"); + // if this was our Validation() object: + if (err.updateForm) { + err.updateForm(this.$form); + } else { + if (err.code && err.data) { + message = err.data?.sqlMessage ?? message; + } else { + message = err?.message ?? message; + } + } + + const values = this.$form.getValues(); + webix.alert({ + title: L("Error creating Object: {0}", [values.name]), + ok: L("fix it"), + text: message, + type: "alert-error", + }); + } + // get notified if there was an error saving. + $$(this.ids.buttonSave).enable(); + } + + /** + * @method onSuccess() + * Our success handler when the data we provided our parent + * ui_work_object_list_newObject successfully saved the values. + */ + onSuccess() { + this.formClear(); + $$(this.ids.buttonSave).enable(); + } + + ui() { + return { + id: this.ids.component, + header: this.header(), + body: { + view: "form", + id: this.ids.form, + width: this.width, + height: this.height, + rules: this.rules(), + elements: this.elementsCombined(), + }, + }; + } + + elementsCombined() { + let elements = this.elements(); + + // function scan(el) { + // if (el.rows || el.cols || el.cells) { + // let res = false; + // (el.rows || el.cols || el.cells).forEach((e) => { + // res = res || scan(e); + // }); + // return res; + // } + // if (el.id && el.id == this.ids.buttonSave) { + // return true; + // } + // return false; + // } + + let hasSaveButton = false; + elements.forEach((el) => { + if (scanForSaveButton(el, this.ids.buttonSave)) { + hasSaveButton = true; + } + }); + if (!hasSaveButton) { + let L = this.L(); + elements.push({ + margin: 5, + cols: [ + { fillspace: true }, + { + view: "button", + id: this.ids.buttonCancel, + value: L("Cancel"), + css: "ab-cancel-button", + autowidth: true, + click: () => { + this.cancel(); + }, + on: { + onAfterRender() { + _ABUIPlugin_js__WEBPACK_IMPORTED_MODULE_0__["default"].CYPRESS_REF(this); + }, + }, + }, + { + view: "button", + id: this.ids.buttonSave, + css: "webix_primary", + value: L("Add Object"), + autowidth: true, + type: "form", + click: () => { + return this.save(); + }, + on: { + onAfterRender() { + _ABUIPlugin_js__WEBPACK_IMPORTED_MODULE_0__["default"].CYPRESS_REF(this); + }, + }, + }, + ], + }); + } + return elements; + } + + cancel() { + this.formClear(); + this.emit("cancel"); + } + + formClear() { + $$(this.ids.form).clearValidation(); + $$(this.ids.form).clear(); + } + + /** + * @function save + * + * verify the current info is ok, package it, and return it to be + * added to the application.createModel() method. + */ + async save() { + var saveButton = $$(this.ids.buttonSave); + saveButton.disable(); + + // if it doesn't pass the basic form validation, return: + if (!(await this.formIsValid())) { + saveButton.enable(); + return false; + } + + var values = await this.formValues(); + + this.emit("save", values); + } + + busy() { + const $form = $$(this.ids.form); + const $saveButton = $$(this.ids.buttonSave); + + $form.showProgress({ type: "icon" }); + $saveButton.disable(); + } + + ready() { + const $form = $$(this.ids.form); + const $saveButton = $$(this.ids.buttonSave); + + $form.hideProgress(); + $saveButton.enable(); + } + + /// + /// These methods are to be overridden by the Plugin definition + /// + header() { + // this is the name used when choosing the Object Type + // tab selector. + let L = this.L(); + return L("PropertiesObjectPlugin"); + } + + rules() { + return { + // name: webix.rules.isNotEmpty, + }; + } + + elements() { + // return the webix form element definitions to appear on the page. + return []; + } + + async formIsValid() { + var Form = $$(this.ids.form); + + Form?.clearValidation(); + + // if it doesn't pass the basic form validation, return: + if (!Form.validate()) { + $$(this.ids.buttonSave)?.enable(); + return false; + } + } + + async formValues() { + var Form = $$(this.ids.form); + return Form?.getValues(); + } +} + + +/***/ }), + +/***/ 4341: +/*!***************************************************!*\ + !*** ./AppBuilder/platform/plugins/ABUIPlugin.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ ABUIPlugin) +/* harmony export */ }); +/* harmony import */ var _ui_ClassUI_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../ui/ClassUI.js */ 93692); + + +class ABUIPlugin extends _ui_ClassUI_js__WEBPACK_IMPORTED_MODULE_0__["default"] { + constructor(...params) { + super(...params); + + // this.AB = AB; + // {ABFactory} + // Our common ABFactory for our application. + + this.CurrentApplicationID = null; + // {string} uuid + // The current ABApplication.id we are working with. + + this.CurrentDatacollectionID = null; + // {string} + // the ABDataCollection.id of the datacollection we are working with. + + this.CurrentObjectID = null; + // {string} + // the ABObject.id of the object we are working with. + + this.CurrentProcessID = null; + // {string} + // the ABProcess.id of the process we are working with. + + this.CurrentQueryID = null; + // {string} + // the ABObjectQuery.id of the query we are working with. + + this.CurrentViewID = null; + // {string} + // the ABView.id of the view we are working with. + } + + static getPluginKey() { + return "ab-ui-plugin"; + } + + /** + * @method L() + * return a function that can be used to retrieve the a multilingual + * label for this plugin. + * @returns {string} + */ + L() { + let _self = this; + return function (...params) { + return _self.AB.Multilingual.labelPlugin( + _self.constructor.getPluginKey(), + ...params + ); + }; + } + + /** + * @function applicationLoad + * save the ABApplication.id of the current application. + * @param {ABApplication} app + */ + applicationLoad(app) { + this.CurrentApplicationID = app?.id; + } + + datacollectionLoad(dc) { + this.CurrentDatacollectionID = dc?.id; + } + + objectLoad(obj) { + this.CurrentObjectID = obj?.id; + } + + processLoad(process) { + this.CurrentProcessID = process?.id; + } + + queryLoad(query) { + this.CurrentQueryID = query?.id; + } + + versionLoad(version) { + this.CurrentVersionID = version?.id; + } + + viewLoad(view) { + this.CurrentViewID = view?.id; + + if (view?.application) { + this.applicationLoad(view.application); + } + } + + /** + * @method CurrentApplication + * return the current ABApplication being worked on. + * @return {ABApplication} application + */ + get CurrentApplication() { + return this.AB.applicationByID(this.CurrentApplicationID); + } + + /** + * @method CurrentDatacollection() + * A helper to return the current ABDataCollection we are working with. + * @return {ABObject} + */ + get CurrentDatacollection() { + return this.AB.datacollectionByID(this.CurrentDatacollectionID); + } + + /** + * @method CurrentObject() + * A helper to return the current ABObject we are working with. + * @return {ABObject} + */ + get CurrentObject() { + let obj = this.AB.objectByID(this.CurrentObjectID); + if (!obj) { + obj = this.AB.queryByID(this.CurrentObjectID); + } + return obj; + } + + /** + * @method CurrentProcess() + * A helper to return the current ABProcess we are working with. + * @return {ABProcess} + */ + get CurrentProcess() { + return this.AB.processByID(this.CurrentProcessID); + } + + /** + * @method CurrentQuery() + * A helper to return the current ABObjectQuery we are working with. + * @return {ABObjectQuery} + */ + get CurrentQuery() { + return this.AB.queryByID(this.CurrentQueryID); + } + + /** + * @method CurrentView() + * A helper to return the current ABView we are working with. + * @return {ABView} + */ + get CurrentView() { + return this.CurrentApplication?.views( + (v) => v.id == this.CurrentViewID + )[0]; + } + + /** + * @method datacollectionsIncluded() + * return a list of datacollections that are included in the current + * application. + * @return [{id, value, icon}] + * id: {string} the ABDataCollection.id + * value: {string} the label of the ABDataCollection + * icon: {string} the icon to display + */ + datacollectionsIncluded() { + return this.CurrentApplication?.datacollectionsIncluded() + .filter((dc) => { + const obj = dc.datasource; + return ( + dc.sourceType == "object" && !obj?.isImported && !obj?.isReadOnly + ); + }) + .map((d) => { + let entry = { id: d.id, value: d.label }; + if (d.sourceType == "query") { + entry.icon = "fa fa-filter"; + } else { + entry.icon = "fa fa-database"; + } + return entry; + }); + } + + /** + * @method uniqueIDs() + * add a unique identifier to each of our this.ids to ensure they are + * unique. Useful for components that are repeated, like items in a list. + */ + uniqueIDs() { + let uniqueInstanceID = webix.uid(); + Object.keys(this.ids).forEach((k) => { + this.ids[k] = `${this.ids[k]}_${uniqueInstanceID}`; + }); + } + + /** + * @method warningsRefresh() + * reset the warnings on the provided ABObject and then start propogating + * the "warnings" display updates. + */ + warningsRefresh(ABObject) { + ABObject?.warningsEval?.(); + this.emit("warnings"); + } + + /** + * @method warningsPropogate() + * If any of the passed in ui elements issue a "warnings" event, we will + * propogate that upwards. + */ + warningsPropogate(elements = []) { + elements.forEach((e) => { + e.on("warnings", () => { + this.emit("warnings"); + }); + }); + } +} + + +/***/ }), + +/***/ 7105: +/*!**************************************************************!*\ + !*** ./AppBuilder/platform/plugins/ABViewComponentPlugin.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ ABViewComponentPlugin) +/* harmony export */ }); +/* harmony import */ var _views_viewComponent_ABViewComponent_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../views/viewComponent/ABViewComponent.js */ 23687); + + +class ABViewComponentPlugin extends _views_viewComponent_ABViewComponent_js__WEBPACK_IMPORTED_MODULE_0__["default"] { + constructor(...params) { + super(...params); + } +} + + +/***/ }), + +/***/ 98487: +/*!***********************************************************!*\ + !*** ./AppBuilder/platform/plugins/ABViewEditorPlugin.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ ABViewEditorPlugin) +/* harmony export */ }); +/* harmony import */ var _ABClassUIPlugin_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ABClassUIPlugin.js */ 56419); + + +class ABViewEditorPlugin extends _ABClassUIPlugin_js__WEBPACK_IMPORTED_MODULE_0__["default"] { + constructor(view, base = "view_editor", ids = {}) { + // view: {ABView} The ABView instance this editor is for + // base: {string} unique base id reference + // ids: {hash} { key => '' } + // this is provided by the Sub Class and has the keys + // unique to the Sub Class' interface elements. + + var common = { + component: "", + }; + + Object.keys(ids).forEach((k) => { + if (typeof common[k] != "undefined") { + console.error( + `!!! ABViewEditorPlugin:: passed in ids contains a restricted field : ${k}` + ); + return; + } + common[k] = ""; + }); + + super(base, common); + + this.AB = view.AB; + this.view = view; + // {ABView} + // The ABView instance this editor is editing + + this.settings = view?.settings || {}; + // {hash} + // shortcut to reference the view's settings + + this.base = base; + + this.component = this.view.component(this.ids.component); + // {ABComponent} + // The component instance for this view. + // Should be set via init() or component() method + + // Load the view to set CurrentViewID + if (view) { + this.viewLoad(view); + } + } + + /** + * @method static key + * Return the key identifier for this editor type. + * NOTE: Sub classes should override this to return their specific key. + * @return {string} + */ + static get key() { + return this.getPluginKey(); + } + + /** + * @method ui() + * Return the Webix UI definition for this editor. + * NOTE: Sub classes should override this to provide their specific UI. + * @return {object} Webix UI definition + */ + ui() { + // Default implementation - try to get UI from component + if (this.component) { + return typeof this.component.ui == "function" + ? this.component.ui() + : this.component.ui; + } + + // Fallback: return a simple placeholder + return { + view: "template", + template: `
    ${ + this.view?.label || "View Editor" + }
    `, + }; + } + + /** + * @method init() + * Initialize the editor with the ABFactory instance. + * @param {ABFactory} AB + */ + async init(AB) { + await super.init(AB); + + // Initialize the component if it has an init method + if (this.component?.init) { + return this.component.init(AB, 2); + // in our editor, we provide accessLv = 2 + } + } + + /** + * @method detatch() + * Detach the editor component. + * Called when the editor is being removed or hidden. + */ + detatch() { + this.component?.detatch?.(); + } + + /** + * @method onShow() + * Called when the editor is shown. + * Sub classes can override this to perform actions when the editor becomes visible. + */ + onShow() { + this.component?.onShow?.(); + } + + /** + * @method onHide() + * Called when the editor is hidden. + * Sub classes can override this to perform actions when the editor becomes hidden. + */ + onHide() { + this.component?.onHide?.(); + } +} + + +/***/ }), + +/***/ 65006: +/*!*****************************************************!*\ + !*** ./AppBuilder/platform/plugins/ABViewPlugin.js ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ ABViewPlugin) +/* harmony export */ }); +/* harmony import */ var _views_ABView_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../views/ABView.js */ 30747); +/* harmony import */ var _views_ABView_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_views_ABView_js__WEBPACK_IMPORTED_MODULE_0__); + + +class ABViewPlugin extends (_views_ABView_js__WEBPACK_IMPORTED_MODULE_0___default()) { + constructor(...params) { + super(...params); + } + + static getPluginKey() { + return "ab-view-plugin"; + } + + static getPluginType() { + return "view"; + } + + toObj() { + const result = super.toObj(); + result.plugin_key = this.constructor.getPluginKey(); + // plugin_key : is what tells our ABFactory.objectNew() to create this object from the plugin class. + return result; + } + + static newInstance(application, parent) { + // return a new instance from ABViewManager: + return application.viewNew( + { key: this.common().key, plugin_key: this.getPluginKey() }, + application, + parent + ); + } +} + + +/***/ }), + +/***/ 49243: +/*!***************************************************************!*\ + !*** ./AppBuilder/platform/plugins/ABViewPropertiesPlugin.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ ABViewPropertiesPlugin) +/* harmony export */ }); +/* harmony import */ var _ABClassUIPlugin_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ABClassUIPlugin.js */ 56419); + + +class ABViewPropertiesPlugin extends _ABClassUIPlugin_js__WEBPACK_IMPORTED_MODULE_0__["default"] { + constructor(base = "properties_abview", ids = {}) { + // base: {string} unique base id reference + // ids: {hash} { key => '' } + // this is provided by the Sub Class and has the keys + // unique to the Sub Class' interface elements. + + var common = { + label: "", + }; + + Object.keys(ids).forEach((k) => { + if (typeof common[k] != "undefined") { + console.error( + `!!! ABFieldProperty:: passed in ids contains a restricted field : ${k}` + ); + return; + } + common[k] = ""; + }); + + super(base, common); + + this.base = base; + + this.fieldsHide = { + /* id.tag : bool */ + }; + // {hash} + // indicates if a given field should be hidden. + // this allows sub classes to hide fields from parent classes: + // this.fieldsHide.required = true; hides the required field. + } + + static get key() { + return this.getPluginKey(); + } + + // + // ABView + // + + ui(elements = [], rules = {}) { + let ids = this.ids; + + let L = this.AB.Label(); + + let _ui = { + view: "form", + id: ids.component, + scroll: true, + elements: [ + { + id: ids.label, + view: "text", + label: L("Name"), + name: "name", + value: "", + hidden: this.fieldsHide.label ? true : false, + }, + ], + rules: { + // label: webix.rules.isNotEmpty, + }, + }; + + elements.forEach((e) => { + _ui.elements.push(e); + }); + + Object.keys(rules).forEach((r) => { + _ui.rules[r] = rules[r]; + }); + + return _ui; + } + + async init(AB) { + await super.init(AB); + + this.$form = $$(this.ids.component); + AB.Webix.extend(this.$form, webix.ProgressBar); + + var VC = this.ViewClass(); + if (VC) { + /* +// TODO: + $$(this.ids.fieldDescription).define( + "label", + L(FC.defaults().description) + ); + } else { + $$(this.ids.fieldDescription).hide(); +*/ + } + } + + /** + * @method clear() + * clear the property form. + */ + clear() { + $$(this.ids.label).setValue(""); + } + + propertyDatacollections(view) { + return view.application.datacollectionsIncluded().map((d) => { + return { id: d.id, value: d.label }; + }); + } + + /** + * @method defaults() + * Return the ViewClass() default values. + * NOTE: the child class MUST implement ViewClass() to return the + * proper ABViewXXX class definition. + * @return {obj} + */ + defaults() { + var ViewClass = this.ViewClass(); + if (!ViewClass) { + console.error("!!! properties/views/ABView: could not find ViewClass"); + return null; + } + return ViewClass.common(); + } + + formValues() { + return $$(this.ids.component).getValues(); + } + + /** + * @method isValid() + * Verify the common ABField settings are valid before allowing + * us to create the new field. + * @return {bool} + */ + isValid() { + /* +// TODO: + var ids = this.ids; + var isValid = $$(ids.component).validate(), + colName = this.formValues()["columnName"]; + + // validate reserve column names + var FC = this.FieldClass(); + if (!FC) { + this.AB.notify.developer( + new Error("Unable to resolve FieldClass"), + { + context: "ABFieldProperty: isValid()", + base: this.ids.component, + } + ); + } + + // columnName should not be one of the reserved names: + if (FC?.reservedNames.indexOf(colName.trim().toLowerCase()) > -1) { + this.markInvalid("columnName", L("This is a reserved name")); + isValid = false; + } + + // columnName should not be in use by other fields on this object + // get All fields with matching colName + var fieldColName = this.currentObject?.fields( + (f) => f.columnName == colName + ); + // ignore current edit field + if (this._CurrentField) { + fieldColName = fieldColName.filter( + (f) => f.id != this._CurrentField.id + ); + } + // if any more matches, this is a problem + if (fieldColName.length > 0) { + this.markInvalid( + "columnName", + L("This column name is in use by another field ({0})", [ + fieldColName.label, + ]) + ); + isValid = false; + } + + return isValid; +*/ + } + + markInvalid(name, message) { + $$(this.ids.component).markInvalid(name, message); + } + + /** + * @method onChange() + * emit a "changed" event so our property manager can know + * there are new values that need saving. + */ + onChange() { + this.emit("changed"); + } + + /** + * @function populate + * populate the property form with the given ABField instance provided. + * @param {ABView} view + * The ABViewXXX instance that we are editing the settings for. + */ + populate(view) { + this.viewLoad(view); + $$(this.ids.label)?.setValue(view.label); + } + + requiredOnChange() { + // Sub Class should overwrite this if it is necessary. + } + + /* + * @function values + * + * return the values for this form. + * @return {obj} + */ + values() { + let vals = {}; + vals.label = $$(this.ids.label).getValue(); + return vals; + } + + /** + * @method ViewClass() + * A method to return the proper ABViewXXX Definition. + * NOTE: Can be overwritten by the Child Class + */ + ViewClass() { + return this._ViewClass(this.constructor.key); + } + + _ViewClass(key) { + var app = this.CurrentApplication; + if (!app) { + app = this.AB.applicationNew({}); + } + return app.viewAll((V) => V.common().key == key)[0]; + } +} + + /***/ }), /***/ 41260: @@ -55494,10 +57156,6 @@ module.exports = class ABViewForm extends ABViewFormCore { const obj = dv.datasource; if (obj == null) return; - // get ABModel - const model = dv.model; - if (model == null) return; - // show progress icon $formView.showProgress?.({ type: "icon" }); @@ -55581,23 +57239,16 @@ module.exports = class ABViewForm extends ABViewFormCore { $formView.hideProgress?.(); return; } - let newFormVals; - // {obj} - // The fully populated values returned back from service call - // We use this in our post processing Rules - try { - // is this an update or create? - if (formVals.id) { - newFormVals = await model.update(formVals.id, formVals); - } else { - newFormVals = await model.create(formVals); - } + newFormVals = await this.submitValues(formVals); } catch (err) { formError(err.data); - throw err; + return; } + // {obj} + // The fully populated values returned back from service call + // We use this in our post processing Rules /* // OLD CODE: @@ -55711,6 +57362,19 @@ module.exports = class ABViewForm extends ABViewFormCore { } } + async submitValues(formVals) { + // get ABModel + const model = this.datacollection.model; + if (model == null) return; + + // is this an update or create? + if (formVals.id) { + return await model.update(formVals.id, formVals); + } else { + return await model.create(formVals); + } + } + /** * @method deleteData * delete data in to database @@ -56171,6 +57835,56 @@ module.exports = class ABViewFormTree extends ABViewFormTreeCore { }; +/***/ }), + +/***/ 71616: +/*!****************************************************!*\ + !*** ./AppBuilder/platform/views/ABViewFormURL.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +const ABViewForm = __webpack_require__(/*! ./ABViewForm */ 10365); + +const ABViewFormURLDefaults = { + key: "form-url", // unique key identifier for this ABViewForm + icon: "list-alt", // icon reference: (without 'fa-' ) + labelKey: "FormUrl", // {string} the multilingual label key for the class label +}; + +module.exports = class ABViewFormURL extends ABViewForm { + static common() { + return ABViewFormURLDefaults; + } + + async submitValues(formVals) { + let url = this.settings.url; + let method = this.settings.method || "get"; + method = method.toLowerCase(); + if (!["get", "post", "put", "delete"].includes(method)) { + throw new Error( + `Invalid method "${method}" specified for ABViewFormURL` + ); + } + + // remove empty id from formVals + if (formVals.id === "") { + delete formVals.id; + } + + let params = { + data: formVals, + url, + }; + + if (this.settings.headers) { + params.headers = this.settings.headers; + } + + return await this.AB.Network[method](params); + } +}; + + /***/ }), /***/ 70973: @@ -65446,7 +67160,7 @@ module.exports = class ABViewFormComponent extends ABViewComponent { fieldValidations.forEach((f) => { // init each ui to have the properties (app and fields) of the object we are editing - f.filter.applicationLoad(dc.datasource.application); + f.filter.applicationLoad?.(dc.datasource.application); // depreciated. f.filter.fieldsLoad(dc.datasource.fields()); // now we can set the value because the fields are properly initialized f.filter.setValue(f.validationRules); @@ -65457,11 +67171,14 @@ module.exports = class ABViewFormComponent extends ABViewComponent { complexValidations[f.columnName] = []; // now we can push the rules into the hash - complexValidations[f.columnName].push({ - filters: $$(f.view).getFilterHelper(), - // values: $$(ids.form).getValues(), - invalidMessage: f.invalidMessage, - }); + // what happens if $$(f.view) isn't present? + if ($$(f.view)) { + complexValidations[f.columnName].push({ + filters: $$(f.view).getFilterHelper(), + // values: $$(ids.form).getValues(), + invalidMessage: f.invalidMessage, + }); + } }); const ids = this.ids; @@ -65473,14 +67190,17 @@ module.exports = class ABViewFormComponent extends ABViewComponent { name: key, }); + if (!formField) return; + // store the rules in a data param to be used later formField.$view.complexValidations = complexValidations[key]; // define validation rules formField.define("validate", function (nval, oval, field) { // get field now that we are validating - const fieldValidating = $$(ids.form).queryView({ + const fieldValidating = $$(ids.form)?.queryView({ name: field, }); + if (!fieldValidating) return true; // default valid is true let isValid = true; @@ -82626,6 +84346,10 @@ class Multilingual extends MLClass { } label(key, altText, values = [], postMissing = true) { + if (typeof key == "undefined") { + return ""; + } + // part of our transition: L("single string") should start to work: if (typeof altText == "undefined" && key) { altText = key; @@ -85789,4 +87513,4 @@ module.exports = class ABCustomEditList { /***/ }) }]); -//# sourceMappingURL=AB.3bf5db93c75d99b70a26.js.map \ No newline at end of file +//# sourceMappingURL=AB.b42df031aa8d5bacdbad.js.map \ No newline at end of file diff --git a/assets/AB.b42df031aa8d5bacdbad.js.map b/assets/AB.b42df031aa8d5bacdbad.js.map new file mode 100644 index 00000000..bdbc971d --- /dev/null +++ b/assets/AB.b42df031aa8d5bacdbad.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AB.b42df031aa8d5bacdbad.js","mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvSiD;;AAE1B;AACK;AACI;AACI;AACW;AACM;AACc;AACtC;;AAE7B;AACA;AACA;AACyC;AACzC;;AAE8C;AAC9C;;AAEuC;;AAES;AAChD;;AAEwD;AACxD;;AAE8C;AAC9C;;AAE8C;AAC9C;;AAEqD;;AAET;AAC5C;;AAEgD;AACgC;AAChF;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,8BAA8B;AACvD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B;AAC9B;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,wBAAwB,4DAAa;AACrC;AACA;;AAEA;AACA,oBAAoB,yDAAM;;AAE1B;AACA;AACA;AACA,qBAAqB,6DAAO;AAC5B,oBAAoB,gEAAM;AAC1B,0BAA0B,kEAAY;AACtC,qBAAqB,6DAAO;AAC5B,qBAAqB,6DAAO;AAC5B,oBAAoB,6DAAM;AAC1B;;AAEA;AACA,qBAAqB,uDAAO;;AAE5B;AACA,iCAAiC,iEAAa;AAC9C,iCAAiC,iEAAa;AAC9C,6BAA6B,kFAAS;AACtC,mCAAmC,yFAAe;;AAElD;AACA;AACA,sBAAsB;AACtB,2BAA2B;AAC3B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB,2DAAW;;AAEpC,wBAAwB,8DAAU;;AAElC;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,yBAAyB;AAC5F;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,oBAAoB,KAAK;AACzB;AACA,oBAAoB,KAAK;AACzB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;;AAEtB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,yBAAyB;AAC5F;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA,oBAAoB,SAAS;AAC7B;AACA,oBAAoB,iBAAiB;AACrC;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA,yBAAyB;;AAEzB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA,gCAAgC,iBAAiB;;AAEjD;AACA,UAAU,KAAK;AACf;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA,UAAU,OAAO;;AAEjB;AACA,UAAU,QAAQ,QAAQ;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA,qBAAqB;AACrB;AACA,6CAA6C;AAC7C;;AAEA;;AAEA;AACA,iBAAiB,6CAAM;AACvB,iBAAiB,6CAAM;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2BAA2B,6CAAM;AACjC,aAAa;;AAEb;AACA,UAAU;;AAEV;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA,4BAA4B,6CAAM;;AAElC;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ;AAC5B;AACA,qBAAqB;AACrB;AACA;AACA,mBAAmB,6CAAM;AACzB,UAAU;;AAEV;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ;AAC5B;AACA,qBAAqB;AACrB;AACA;AACA,mBAAmB,6CAAM;AACzB,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,wBAAwB,EAAE,wBAAwB;AAC3E;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf,kCAAkC,cAAc;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,mCAAmC,GAAG;AACtC,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf,kCAAkC,cAAc;AAChD;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,mCAAmC,GAAG;AACtC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,OAAO;AACrB,cAAc,MAAM;AACpB;AACA;AACA,MAAM,2DAAW;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,uDAAW;AACxB;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,gBAAgB,QAAQ;AACxB;AACA;AACA,aAAa,0DAAc;AAC3B;;AAEA;AACA;AACA,+BAA+B,iBAAiB,IAAI,mBAAmB;AACvE;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,aAAa,+CAAM;AACnB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,aAAa,mDAAO;AACpB;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA,oBAAoB,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,GAAG;AAClF;AACA;AACA;AACA;;AAEA;AACA,aAAa,mDAAO;AACpB;;AAEA;AACA,aAAa,qDAAS;AACtB;;AAEA;AACA,aAAa,kDAAM;AACnB;;AAEA;AACA,aAAa,uDAAW;AACxB;;AAEA;AACA,aAAa,mDAAO;AACpB;;AAEA;AACA,aAAa,oDAAQ;AACrB;;AAEA;AACA,aAAa,mDAAO;AACpB;;AAEA;AACA,aAAa,mDAAO;AACpB;;AAEA;AACA,aAAa,iDAAM;AACnB;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,aAAa,sDAAU;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,IAAI;AACvE;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wDAAwD,IAAI;AAC5D;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA,aAAa,sDAAU;AACvB;AACA;AACA,OAAO;AACP;;AAEA;AACA,aAAa,wDAAY;AACzB;AACA;;AAEA,iEAAe,SAAS,EAAC;;;;;;;;;;;;;;;;AC7jCzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,UAAU;AACV,OAAO;AACP,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ,CAAC,EAAC;;;;;;;;;;;ACzIF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,mBAAO,CAAC,sCAA2B;AACzD,gBAAgB,mBAAO,CAAC,kCAAuB;;AAE/C;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;AACA,UAAU,QAAQ;;AAElB;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA;AACA,UAAU,KAAK;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA,UAAU,KAAK;AACf;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;AACA;AACA;;AAEA;AACA,UAAU,MAAM;AAChB;AACA;AACA,yEAAyE;AACzE;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,cAAc,cAAc;AAC5B;;AAEA;AACA,UAAU,MAAM;AAChB;AACA;AACA,UAAU,MAAM;AAChB;AACA,UAAU,MAAM;AAChB;;AAEA;AACA;AACA;AACA,UAAU,IAAI;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,OAAO;AACjB,kBAAkB,WAAW;AAC7B;AACA,0BAA0B,OAAO;AACjC;;AAEA;AACA,UAAU,OAAO;AACjB,kBAAkB,aAAa;AAC/B;AACA,0BAA0B,SAAS;;AAEnC;AACA,UAAU,OAAO;AACjB,kBAAkB,kBAAkB;AACpC;AACA,0BAA0B,gBAAgB;AAC1C;;AAEA;AACA,UAAU,OAAO;AACjB,kBAAkB,qBAAqB;AACvC;AACA,0BAA0B,iBAAiB;AAC3C;;AAEA,yBAAyB,WAAW;AACpC;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,sBAAsB,QAAQ,oCAAoC,GAAG;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,QAAQ,oCAAoC,GAAG;AACxE;AACA;AACA,OAAO;AACP;AACA,UAAU,OAAO;AACjB,8BAA8B,aAAa;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,OAAO;;AAEP;AACA,UAAU,OAAO;AACjB,8BAA8B,aAAa;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,0BAA0B,QAAQ;AAClC,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe,SAAS;AACxB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,kCAAkC;AAC/D,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,UAAU;AACxB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gCAAgC,WAAW;AAC3C,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,cAAc,IAAI;AAClB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA,0CAA0C;AAC1C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,MAAM,EAAE,MAAM,EAAE,MAAM;AAC/D,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,mCAAmC;AACnC,cAAc,QAAQ;AACtB;AACA,cAAc,MAAM;AACpB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACx/BA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,mBAAO,CAAC,4CAAiC;AACrE,oBAAoB,mBAAO,CAAC,sCAA2B;;AAEvD;AACA;AACA;AACA,+BAA+B;AAC/B;;AAEA;AACA,UAAU;AACV,cAAc,aAAa;AAC3B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAO,CAAC,kCAAuB;;AAEjD;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;;AAEA;AACA,IAAI;AACJ;;AAEA;AACA,IAAI,OAAO;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,aAAa;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA,WAAW,IAAI;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,UAAU;AACV,iEAAiE;AACjE;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA,qBAAqB,iBAAiB;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA;AACA,UAAU,KAAK;AACf;;AAEA;AACA;AACA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA;AACA,UAAU,QAAQ;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAK;AACf;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU,MAAM;AAChB;;AAEA;AACA;AACA;AACA,UAAU,MAAM;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX,OAAO;AACP,UAAU,cAAc;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU,KAAK;AACf;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU,KAAK;AACf;AACA;;AAEA;AACA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA,mCAAmC,UAAU,IAAI,QAAQ,+BAA+B,2BAA2B;AACnH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;;AAEb;AACA,gBAAgB;AAChB,UAAU;AACV;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,UAAU,IAAI,QAAQ;AACvD;AACA,6CAA6C,8BAA8B;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,wBAAwB;AACtC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;;AAEvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA,oCAAoC,YAAY;AAChD;AACA;AACA;AACA;AACA;AACA,qCAAqC,6BAA6B;AAClE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,gBAAgB;;AAEhB;AACA,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;;AAEA,gBAAgB;;AAEhB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;;AAEA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,wDAAwD,OAAO;AAC/D;;AAEA;AACA;AACA;AACA,+BAA+B,GAAG,OAAO;AACzC;AACA;AACA,4BAA4B;AAC5B,yBAAyB;;AAEzB;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAA0C,SAAS;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,0CAA0C,SAAS;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,wCAAwC;AACxC;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qDAAqD;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kDAAkD;;AAElD;AACA;;AAEA;AACA,+BAA+B,+BAA+B,aAAa;;AAE3E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA,2BAA2B;AAC3B;AACA,2BAA2B;AAC3B;AACA,2BAA2B;AAC3B;AACA,2BAA2B;AAC3B;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gDAAgD,KAAK;AACrD,mDAAmD,KAAK;AACxD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA,aAAa,MAAM;AACnB;AACA,2BAA2B,QAAQ;AACnC,uBAAuB,MAAM;;AAE7B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,mCAAmC,GAAG,OAAO;AAC7C;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA,sCAAsC,GAAG,OAAO;AAChD;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C;AAC5C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,QAAQ,GAAG,OAAO;AAC5D,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA,6CAA6C,QAAQ,GAAG,OAAO;AAC/D,4BAA4B;AAC5B;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC;AACzC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;;AAEA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,gCAAgC;AAChC;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA;AACA,6BAA6B,MAAM;AACnC;AACA,mCAAmC,MAAM;AACzC;AACA,uBAAuB,OAAO;AAC9B,wBAAwB,OAAO;AAC/B,yBAAyB;AACzB;AACA,kBAAkB,eAAe,IAAI;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA,uBAAuB,aAAa,GAAG,aAAa;AACpD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,UAAU;AACV;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,qBAAqB,GAAG,wBAAwB;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,mBAAmB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iDAAiD;AACjD,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,cAAc;AACd,0BAA0B;AAC1B;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;;AAEnC;AACA;AACA;AACA;;AAEA,oCAAoC;;AAEpC;;AAEA;;AAEA,+BAA+B,MAAM,kBAAkB,MAAM;AAC7D;;AAEA;AACA;AACA,iCAAiC,YAAY,kBAAkB,YAAY;AAC3E;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA,sCAAsC;;AAEtC;;AAEA;AACA,qCAAqC,MAAM;AAC3C;AACA;;AAEA,YAAY;;AAEZ;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA,UAAU;;AAEV;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oCAAoC,cAAc;;AAElD,QAAQ;;AAER;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAQ;AACR;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,2BAA2B,MAAM,GAAG,IAAI;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,MAAM,GAAG,QAAQ;AAC1D,mBAAmB;;AAEnB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,wEAAwE;AACxE;;AAEA;AACA;;AAEA;;AAEA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,uBAAuB;AACvB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B,WAAW;AACtC;AACA;AACA;AACA,aAAa;;AAEb,UAAU;;AAEV;AACA;AACA;;;;;;;;;;;AC76GA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf,yBAAyB,MAAM;AAC/B;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA;;AAEA,uBAAuB,mBAAO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AACA,WAAW;AACX;AACA,qDAAqD,KAAK;AAC1D;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,OAAO;;AAEjB,uDAAuD;AACvD;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA,gBAAgB;AAChB,uBAAuB,SAAS;AAChC;AACA,qBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB;;AAErB;AACA,qBAAqB;;AAErB;AACA,qBAAqB;;AAErB;AACA,qBAAqB;;AAErB;AACA,qBAAqB;;AAErB;AACA;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA,cAAc,MAAM;AACpB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA,eAAe;AACf;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA,eAAe;AACf;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,yBAAyB,MAAM,OAAO,GAAG;AACzC,cAAc,UAAU;AACxB,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,GAAG;AAC7B;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA,wBAAwB,EAAE,GAAG;AAC7B;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,WAAW;AACzB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA,oDAAoD;AACpD;;AAEA;AACA,6CAA6C;AAC7C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,wCAAwC;AACxC;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,OAAO;AACrB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACrpCA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG,mBAAO,CAAC,iDAAsC;AACjD,GAAG,mBAAO,CAAC,mDAAwC;AACnD,GAAG,mBAAO,CAAC,iDAAsC;AACjD,GAAG,mBAAO,CAAC,+CAAoC;AAC/C,GAAG,mBAAO,CAAC,mDAAwC;AACnD,GAAG,mBAAO,CAAC,kDAAuC;AAClD,GAAG,mBAAO,CAAC,+CAAoC;AAC/C,GAAG,mBAAO,CAAC,+CAAoC;AAC/C,GAAG,mBAAO,CAAC,gDAAqC;AAChD,GAAG,mBAAO,CAAC,+CAAoC;AAC/C,GAAG,mBAAO,CAAC,+CAAqC;AAChD,GAAG,mBAAO,CAAC,+CAAoC;AAC/C,GAAG,mBAAO,CAAC,kDAAuC;AAClD,GAAG,mBAAO,CAAC,oDAAyC;AACpD,GAAG,mBAAO,CAAC,sDAA2C;AACtD,GAAG,mBAAO,CAAC,kDAAuC;AAClD,GAAG,mBAAO,CAAC,mDAAyC;AACpD,GAAG,mBAAO,CAAC,+CAAoC;AAC/C,GAAG,mBAAO,CAAC,kDAAuC;AAClD,GAAG,mBAAO,CAAC,sDAA2C;AACtD;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,YAAY,IAAI,WAAW,eAAe,YAAY;AACnH;AACA;AACA;AACA;AACA;;;;;;;;;;;AC7FA;;AAEA,gBAAgB,mBAAO,CAAC,kCAAuB;AAC/C,gBAAgB,mBAAO,CAAC,0BAAe;;AAEvC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,oDAAoD;AACpD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,QAAQ;AAC1B,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC9IA,kBAAkB,mBAAO,CAAC,kCAAuB;;AAEjD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,UAAU,IAAI,QAAQ,oCAAoC,EAAE;AACvF;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,qBAAqB,UAAU,IAAI,QAAQ;AAC3C;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA,gBAAgB,UAAU,GAAG,UAAU;AACvC;;AAEA;AACA;;AAEA,gBAAgB,UAAU;AAC1B;AACA;;;;;;;;;;;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,mBAAO,CAAC,kCAAuB;AAC/C;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,MAAM;AACpB,kEAAkE,WAAW;AAC7E;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,2BAA2B;AAC3B,4BAA4B;;AAE5B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,uCAAuC;AACvC,gBAAgB;AAChB;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,aAAa,GAAG,SAAS;AACxD,iCAAiC;AACjC,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,MAAM;AACpB,kEAAkE,WAAW;AAC7E;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;;;;;;;;;;;ACnPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA,WAAW,UAAU;;AAErB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B;AAC/B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,WAAW;AACX;;AAEA;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,0GAA0G,4BAA4B;AACtI;;AAEA;AACA,4GAA4G,4BAA4B;AACxI;AACA;;AAEA;AACA;AACA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA,iGAAiG,4BAA4B;;AAE7H;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA,0BAA0B,QAAQ,UAAU;AAC5C;;AAEA,6BAA6B,2BAA2B;AACxD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,MAAM;AACzB;AACA,mBAAmB,SAAS;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,cAAc;AAC7C,mBAAmB;;AAEnB;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,sBAAsB,UAAU;AAChC;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,wCAAwC,KAAK;AAC7C;AACA,wBAAwB,KAAK,GAAG,KAAK,OAAO,KAAK;AACjD,WAAW;AACX;AACA;AACA,kDAAkD,MAAM;AACxD;AACA;AACA;AACA,4BAA4B,KAAK,GAAG,KAAK,OAAO,KAAK;AACrD,4BAA4B,KAAK,GAAG,KAAK,OAAO,KAAK;AACrD;AACA,WAAW;AACX;AACA;AACA,gCAAgC,MAAM;AACtC;AACA;AACA;AACA,yCAAyC,KAAK,GAAG,KAAK,OAAO,KAAK;AAClE,yCAAyC,KAAK,GAAG,KAAK,OAAO,KAAK;AAClE;AACA,yCAAyC,KAAK,GAAG,KAAK,OAAO,KAAK;AAClE;AACA,WAAW;;AAEX,eAAe,cAAc;AAC7B,eAAe,KAAK;AACpB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,6BAA6B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,OAAO;AACP;;AAEA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;;AAEA;AACA;;AAEA;AACA,2CAA2C;;AAE3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC,cAAc;;AAE9C;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;;AAEA,eAAe;;AAEf,0BAA0B;AAC1B,WAAW;;AAEX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,cAAc;;AAE1C;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA,WAAW;AACX;AACA;AACA,WAAW;;AAEX;;AAEA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,aAAa;AACb;AACA;AACA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,8DAA8D;AAC9D;;AAEA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;;AAEA;AACA;AACA,gEAAgE,YAAY;AAC5E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,6BAA6B,KAAK,GAAG,KAAK,OAAO,KAAK;AACtD;AACA;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA,4BAA4B,aAAa;AACzC,4BAA4B,aAAa;AACzC;AACA,0BAA0B;AAC1B,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,KAAK,GAAG,KAAK,OAAO,KAAK;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,aAAa;AAC7B,gBAAgB,aAAa;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,YAAY;;AAEvB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,iEAAiE,GAAG;AACpE;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,aAAa;AAC7B,gBAAgB,aAAa;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,KAAK,GAAG,KAAK,OAAO,KAAK;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB;;AAEzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,oBAAoB;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,8CAA8C,KAAK;AACnD,sDAAsD,QAAQ;AAC9D,wDAAwD,aAAa;AACrE,oDAAoD,aAAa;AACjE;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,2CAA2C,KAAK;AAChD,mDAAmD,QAAQ;AAC3D,qDAAqD,aAAa;AAClE,iDAAiD,aAAa;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;;;;;;;;;;;ACz5CA,iBAAiB,mBAAO,CAAC,iCAAsB;AAC/C,mBAAmB,mBAAO,CAAC,mCAAwB;;AAEnD;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,aAAa,GAAG;;AAE5C;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA,qBAAqB,aAAa;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;;;;;;;;;;;AC/HA,oBAAoB,mBAAO,CAAC,oCAAyB;AACrD,2BAA2B,mBAAO,CAAC,2CAAgC;;AAEnE;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,aAAa,GAAG;;AAE5C;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAa;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;;;;;;;;;;ACxHA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc,mBAAO,CAAC,gCAAqB;AAC3C,gBAAgB,mBAAO,CAAC,kCAAuB;;AAE/C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA,wDAAwD;AACxD,UAAU,QAAQ;AAClB;AACA,sBAAsB,UAAU;;AAEhC;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA,UAAU,QAAQ;;AAElB;AACA;AACA;AACA,UAAU,MAAM;;AAEhB;AACA,UAAU;AACV,UAAU,MAAM;AAChB;AACA;;AAEA;AACA,UAAU,MAAM;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mDAAmD;AACnD,UAAU,QAAQ;AAClB,eAAe,SAAS,EAAE,UAAU;AACpC;AACA;AACA;AACA;;AAEA,mEAAmE;AACnE,UAAU,QAAQ;AAClB;AACA;AACA;;AAEA,+DAA+D;AAC/D,UAAU,QAAQ;AAClB;;AAEA;;AAEA;;AAEA;AACA,UAAU,MAAM;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAK;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,QAAQ;AAClB;AACA;AACA;;AAEA;AACA,UAAU,OAAO;AACjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,oBAAoB,UAAU,wCAAwC,GAAG;AACzE;AACA;AACA,wBAAwB,cAAc,gCAAgC;AACtE,aAAa;AACb;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,oBAAoB,UAAU,wCAAwC,GAAG;AACzE;AACA;AACA,wBAAwB,cAAc,gCAAgC;AACtE,aAAa;AACb;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB,6CAA6C,MAAM;AACnD,8BAA8B,OAAO;AACrC,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,gDAAgD;AAChD,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB,6CAA6C,MAAM;AACnD,8BAA8B,OAAO;AACrC,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,oBAAoB,UAAU,qCAAqC,GAAG;AACtE;AACA;AACA,wBAAwB,cAAc,gCAAgC;AACtE,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB,6CAA6C,MAAM;AACnD,8BAA8B,OAAO;AACrC,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,gDAAgD;AAChD,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,aAAa;;AAEzC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,mCAAmC,QAAQ;AAC3C;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,yCAAyC,QAAQ;AACjD;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,mCAAmC,QAAQ,GAAG,GAAG;AACjD;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,oCAAoC,QAAQ;AAC5C;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,iDAAiD,QAAQ;AACzD;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,mCAAmC,QAAQ;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,4BAA4B,OAAO;AACnC,YAAY,OAAO,UAAU,OAAO;AACpC,sCAAsC,GAAG,IAAI;;AAE7C;AACA;AACA,iDAAiD,iBAAiB;;AAElE;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,mBAAmB,EAAE,WAAW;AAChC;AACA;AACA;AACA;;AAEA,4BAA4B,OAAO;AACnC,YAAY,OAAO,UAAU,OAAO;AACpC,sCAAsC,GAAG,IAAI;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,iBAAiB;;AAElE;AACA;;AAEA;AACA;AACA,2BAA2B,UAAU,EAAE,SAAS;AAChD,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,2BAA2B,+CAA+C;AAC1E;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA,0BAA0B,MAAM;AAChC;AACA,gCAAgC,MAAM;AACtC;AACA,oBAAoB,OAAO;AAC3B,qBAAqB,OAAO;AAC5B,sBAAsB;AACtB;AACA,eAAe,eAAe,IAAI;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uHAAuH;AACvH;AACA,oBAAoB;AACpB;AACA,+CAA+C,MAAM;AACrD;;AAEA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5jCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,mBAAO,CAAC,iCAAsB;AAC7C,mBAAmB,mBAAO,CAAC,qCAA0B;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;;AAGF,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA,UAAU,OAAO;AACjB;;AAEA;AACA,UAAU,OAAO,IAAI,gBAAgB;AACrC;;AAEA;AACA,UAAU,OAAO,GAAG,iBAAiB;AACrC;;AAEA;AACA,UAAU,OAAO,GAAG,UAAU;AAC9B;;AAEA;AACA,UAAU,OAAO,IAAI,eAAe;AACpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,2BAA2B;AAC3B,WAAW;AACX;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA,6CAA6C;;AAE7C;AACA;AACA;AACA,UAAU,OAAO,IAAI,aAAa,IAAI;AACtC;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA,sBAAsB,YAAY;;AAElC;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;AACA,iCAAiC;;AAEjC;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA,qCAAqC,kBAAkB;AACvD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,0CAA0C,WAAW;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA,sCAAsC;AACtC;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,4BAA4B,SAAS;AACrC,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW;AACX;AACA;;AAEA;AACA,UAAU,OAAO;AACjB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,8DAA8D,aAAa;AAC3E;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA,+EAA+E,8BAA8B;AAC7G;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;;AAEA;;AAEA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA,gDAAgD;AAChD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,aAAa,GAAG;;AAE5C;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC3qBA;;AAEA,gBAAgB,mBAAO,CAAC,kCAAuB;AAC/C,gBAAgB,mBAAO,CAAC,0BAAe;;AAEvC,gCAAgC,mBAAO,CAAC,8DAAmD;;AAE3F;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,uBAAuB,UAAU,iDAAiD,IAAI;AACtF,oBAAoB;AACpB;AACA;AACA;AACA,OAAO;;AAEP;;AAEA,oCAAoC;AACpC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,6XAA6X,QAAQ;AACrY;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B,kBAAkB,SAAS;AAC3B,eAAe;AACf,oBAAoB,QAAQ;AAC5B,sBAAsB,QAAQ;AAC9B,sBAAsB,QAAQ;AAC9B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,kBAAkB;AACpC,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B,cAAc,YAAY;AAC1B,cAAc,MAAM;AACpB,eAAe;AACf,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,IAAI;AACrB;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB;AAClB;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3nBA;;AAEA,gBAAgB,mBAAO,CAAC,kCAAuB;AAC/C,gBAAgB,mBAAO,CAAC,0BAAe;;A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AEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR,kDAAkD,WAAW;AAC7D,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wCAAwC,IAAI;AAC5C;AACA;AACA;;;;;;;;;;;ACrGA,oBAAoB,mBAAO,CAAC,oCAAyB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,uBAAuB;AACvB;AACA;AACA,0BAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA,8BAA8B;AAC9B,UAAU;;AAEV;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;;AAEA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+CAA+C;AAC/C;AACA,cAAc;AACd;;AAEA;;AAEA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA,iDAAiD;;AAEjD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,OAAO,cAAc,GAAG;AAC9C,uBAAuB,OAAO;AAC9B,uBAAuB,GAAG;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,sBAAsB,OAAO,QAAQ,GAAG;AACxC,uBAAuB,OAAO;AAC9B,uBAAuB,GAAG;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,6BAA6B,MAAM,GAAG,IAAI;AAC1C,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,qBAAqB,UAAU;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,eAAe,GAAG,QAAQ;;AAEjD;AACA;AACA;;AAEA;AACA,cAAc;AACd,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA,kBAAkB;AAClB,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,eAAe,GAAG,QAAQ;;AAEjD,4BAA4B;AAC5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;;AAEA;;AAEA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC/9CA,oBAAoB,mBAAO,CAAC,oCAAyB;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,uBAAuB;AACvB;AACA;AACA,wBAAwB;;AAExB;AACA;;AAEA;AACA;AACA;AACA,8BAA8B;AAC9B,UAAU;;AAEV;AACA;AACA;AACA,qBAAqB,MAAM;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA,kDAAkD;;AAElD;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B,OAAO,cAAc,GAAG;AACpD,6BAA6B,OAAO;AACpC,6BAA6B,GAAG;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,4BAA4B,OAAO,QAAQ,GAAG;AAC9C,6BAA6B,OAAO;AACpC,6BAA6B,GAAG;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,mCAAmC,MAAM,GAAG,IAAI;AAChD,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3yBA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA,WAAW,wCAAwC;AACnD,WAAW,4CAA4C;AACvD,WAAW,2CAA2C;AACtD,WAAW,2CAA2C;AACtD,WAAW,yCAAyC;AACpD,WAAW,2CAA2C;AACtD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;;;;;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACjHA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC;AAChC;;AAEA;AACA;AACA,sCAAsC;;AAEtC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;;AAE5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;;AAE5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;;AAE5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,OAAO,GAAG,SAAS;AAC3C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,SAAS;AACvB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,gBAAgB;;AAE/C;AACA,uBAAuB,sBAAsB,GAAG,aAAa;AAC7D;;AAEA;AACA;AACA,kCAAkC,UAAU,IAAI;AAChD;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,yBAAyB,OAAO;;AAEhC;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA,gCAAgC,WAAW,IAAI;AAC/C;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA,mCAAmC,UAAU,IAAI;AACjD;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;;;;;;;;;;;ACrVA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,QAAQ;AACf;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;;;;;;;;;;;AChKA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc,mBAAO,CAAC,8CAAmC;;AAEzD;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,0BAA0B,0BAA0B,GAAG,6BAA6B;AACpF;AACA,IAAI;AACJ,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO,MAAM;AACb;AACA;;AAEA;AACA,OAAO,SAAS;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,UAAU;AACjB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,WAAW,EAAE;AAC9C;AACA;AACA,mBAAmB,SAAS,GAAG,8CAA8C;AAC7E,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW,IAAI,QAAQ,8BAA8B,yBAAyB;AAC1G;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,cAAc;AAC7B;AACA;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA;AACA,4BAA4B,WAAW,IAAI,QAAQ,8BAA8B,yBAAyB;AAC1G;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,GAAG;AACjB,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,0BAA0B,iBAAiB,GAAG,oBAAoB;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB,GAAG,0BAA0B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;AACA,eAAe;AACf;AACA,yCAAyC;AACzC;AACA;AACA;AACA;;AAEA,0BAA0B,uBAAuB,GAAG,0BAA0B;;AAE9E;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACpcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAO,CAAC,qCAA0B;;AAEpD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,YAAY,OAAO;;AAEnB;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,yCAAyC;AACzC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA,0BAA0B,+BAA+B,GAAG,gBAAgB;;AAE5E;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,iBAAiB,IAAI,WAAW;AACzD;AACA;AACA;AACA;;;;;;;;;;;ACpWA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,sBAAsB;AACtB,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,6BAA6B,EAAE,OAAO,EAAE,OAAO,EAAE;;AAEjD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,GAAG,KAAK,EAAE;AAC9D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,GAAG,KAAK,EAAE;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,GAAG,KAAK,EAAE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,EAAE;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,EAAE;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,EAAE;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,EAAE;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,EAAE;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,EAAE;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,EAAE;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,EAAE;AACxD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE;;;;;;;;;;;AC5bnD;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,mBAAO,CAAC,8BAAmB;;AAEnD;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA6B,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;;AAE5E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,gBAAgB,YAAY,EAAE,WAAW;AACzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,MAAM;AACpB,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB;AACpB,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;;;;;;;;;;;AC7N1D;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;AACA;AACA,8BAA8B,wBAAwB,6BAA6B,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,iCAAiC,GAAG;;AAE/J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxIA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,oBAAoB,QAAQ;AAC5B;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO,gBAAgB,QAAQ;AAC9C;AACA;AACA,0BAA0B,+BAA+B,GAAG,gBAAgB;;AAE5E;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,oBAAoB,QAAQ;AAC5B;AACA,8DAA8D;AAC9D,cAAc,KAAK;AACnB;AACA;AACA,mCAAmC;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,uDAAuD,QAAQ;;AAE/D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC7RA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzIA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA,UAAU,6BAA6B;AACvC,cAAc,QAAQ;AACtB,gBAAgB,QAAQ;AACxB,eAAe,QAAQ;AACvB,wBAAwB,KAAK;;AAE7B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,UAAU;AACtC,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA,+BAA+B;AAC/B;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;;;;;;;;;;;AC5QA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;;AAEA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,iBAAiB;AAC1D;AACA;AACA;AACA;;;;;;;;;;;ACzMA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc;;AAEd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,8BAA8B;AACzC;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,WAAW,8BAA8B;AACzC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,EAAE;AAC5D;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,EAAE;AACzD;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP,gBAAgB,QAAQ,EAAE,QAAQ,EAAE,QAAQ;AAC5C;;AAEA,kCAAkC;AAClC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,MAAM;AACpC;AACA,aAAa;AACb,WAAW;AACX,QAAQ;AACR;AACA;;AAEA;AACA,sBAAsB,aAAa,EAAE,aAAa;;AAElD;AACA;AACA;AACA,sBAAsB,yBAAyB,EAAE,WAAW;AAC5D;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;;;;;;;;;;ACtYA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA,QAAQ;;AAER;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,KAAK;AACrD;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAA0C,GAAG;AAC7C;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtMA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,8CAAmC;;AAE3D;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,QAAQ;AACf;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;;AAEA;AACA;;AAEA,yBAAyB,IAAI,GAAG;AAChC;AACA;AACA,2CAA2C,EAAE;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,kCAAkC,2BAA2B;AAC7D;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;;AAEJ;AACA;;AAEA;AACA;AACA;AACA,WAAW,WAAW;AACtB,WAAW,QAAQ;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,YAAY;AACnC;AACA;AACA,OAAO;AACP;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA,OAAO;AACP;AACA;AACA,sBAAsB,YAAY;AAClC;AACA;AACA,OAAO;AACP;AACA;AACA,uBAAuB,YAAY;AACnC;AACA;AACA,OAAO;AACP;AACA;AACA,2BAA2B,YAAY;AACvC;AACA;AACA,OAAO;AACP;AACA;AACA,4BAA4B,YAAY;AACxC;AACA;AACA,OAAO;AACP;AACA;AACA,yBAAyB,YAAY;AACrC;AACA;AACA,OAAO;AACP;AACA;AACA,+BAA+B,YAAY;AAC3C;AACA;AACA,OAAO;AACP;AACA;AACA,+BAA+B,YAAY;AAC3C;AACA;AACA,OAAO;AACP;AACA;AACA,0BAA0B,YAAY;AACtC;AACA;AACA,OAAO;AACP;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA,OAAO;AACP;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA,OAAO;AACP;AACA;AACA,6BAA6B,YAAY;AACzC;AACA;AACA,OAAO;AACP,QAAQ,uEAAuE;AAC/E;AACA;AACA,gCAAgC,eAAe;AAC/C;AACA;AACA,OAAO;AACP;AACA;AACA,uCAAuC,YAAY;AACnD;AACA;AACA,OAAO;AACP;AACA;AACA,yCAAyC,YAAY;AACrD;AACA;AACA,OAAO;AACP;AACA;AACA,6BAA6B,YAAY;AACzC;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,eAAe;AAC9B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B;AAC3B,8BAA8B,IAAI;AAClC,mCAAmC,IAAI;AACvC,4BAA4B;AAC5B;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC7tBA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,mBAAO,CAAC,yDAA8C;;AAEjF;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1JA;AACA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,mBAAO,CAAC,qDAA0C;;AAEzE;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ,OAAO,MAAM,GAAG;AAChB;AACA,YAAY,IAAI;AAChB;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM,GAAG;AAChB;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO,QAAQ;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACvIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,mBAAO,CAAC,+CAAoC;AACjE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,MAAM;AACb;AACA;AACA;;AAEA;AACA,OAAO,MAAM;AACb;AACA;;AAEA;AACA,OAAO,MAAM;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,0BAA0B;AAC1B,WAAW;;AAEX;AACA;;AAEA,0BAA0B;AAC1B,UAAU,KAAK;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,SAAS;AACnB;;AAEA;AACA,UAAU,OAAO;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,MAAM;AAChB;AACA;;AAEA;AACA;AACA;AACA,UAAU,MAAM;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,sBAAsB,sBAAsB,IAAI,oBAAoB,UAAU,UAAU,IAAI,QAAQ,+BAA+B,GAAG;AACtI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,eAAe;AACf,yBAAyB,MAAM;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,cAAc,SAAS;AACvB;AACA,eAAe,SAAS;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACzdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,qCAA0B;;AAElD;AACA,2BAA2B,QAAQ;AACnC,gCAAgC,QAAQ;AACxC,yBAAyB,QAAQ;AACjC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,cAAc,sBAAsB;AACpC,eAAe;AACf;AACA;AACA;AACA;AACA,WAAW,wBAAwB;AACnC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,2BAA2B;AAC3B,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAU,KAAK;AACf;;AAEA;AACA;;AAEA;AACA,UAAU,KAAK;AACf,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,8BAA8B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,0BAA0B,QAAQ;AAClC,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,WAAW;AACX;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,wDAAwD,SAAS;AACjE;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,SAAS;AACpF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B,WAAW,IAAI,QAAQ;AACjD;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,cAAc,SAAS;AACvB;AACA,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB,kBAAkB,aAAa;AAC/B;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,eAAe;AACf,kBAAkB,MAAM;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,cAAc,KAAK;AACnB;AACA,qCAAqC;AACrC;AACA,eAAe;AACf;AACA;AACA,wCAAwC;AACxC;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,cAAc,KAAK;AACnB;AACA,qCAAqC;AACrC;AACA,8BAA8B;AAC9B;AACA,eAAe;AACf;AACA;AACA,uCAAuC;AACvC;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,YAAY,UAAU,2BAA2B;;AAEhE,+CAA+C,cAAc;AAC7D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,qBAAqB;;AAEzE;AACA;AACA;AACA;AACA;AACA,+CAA+C,KAAK;AACpD;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB;AACzB;AACA,gBAAgB;AAChB;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;;;;;;;;;;;ACj9BA,qBAAqB,mBAAO,CAAC,+CAAoC;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA6B,QAAQ;AACrC,wBAAwB,QAAQ;AAChC,2BAA2B,QAAQ;AACnC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzDA,qBAAqB,mBAAO,CAAC,+CAAoC;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,QAAQ;;AAEf;AACA,OAAO,QAAQ;;AAEf;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrHA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;;AAEA;AACA,+BAA+B,QAAQ;AACvC,+BAA+B,QAAQ;AACvC,6BAA6B,QAAQ;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC7BA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC,wBAAwB,QAAQ;AAChC,4BAA4B,QAAQ;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxDA,qBAAqB,mBAAO,CAAC,+CAAoC;;AAEjE,qBAAqB,mBAAO,CAAC,qDAA2C;AACxE,qBAAqB,mBAAO,CAAC,sDAA2C;;AAExE;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA,mBAAmB,KAAK;AACxB,oBAAoB,OAAO;AAC3B,iBAAiB;AACjB;AACA;AACA;AACA;AACA,mBAAmB,KAAK;AACxB,iBAAiB;AACjB;AACA;AACA,OAAO;AACP;;AAEA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA,mBAAmB,KAAK;AACxB,oBAAoB,OAAO;AAC3B,iBAAiB;AACjB;AACA;AACA,eAAe;AACf,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA,0CAA0C,2BAA2B;AACrE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,kBAAkB;AAC1E;AACA;AACA;;AAEA,uCAAuC,2BAA2B;AAClE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mCAAmC,2BAA2B;AAC9D;AACA;;;;;;;;;;;AChQA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;;AAEA;AACA;AACA,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;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,mCAAmC,QAAQ;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC/BA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;;AAEA;AACA,mCAAmC,QAAQ;AAC3C,wBAAwB,QAAQ;AAChC,iCAAiC,QAAQ;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC/BA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC,yBAAyB,QAAQ;AACjC,4BAA4B,QAAQ;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9CA,qBAAqB,mBAAO,CAAC,+CAAoC;;AAEjE;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,QAAQ;AACpC,qBAAqB,QAAQ;AAC7B,0BAA0B,QAAQ;AAClC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,gCAAgC;;AAEhC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzGA,qBAAqB,mBAAO,CAAC,+CAAoC;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC,wBAAwB,QAAQ;AAChC,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzDA,qBAAqB,mBAAO,CAAC,+CAAoC;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,QAAQ;AACvC,yBAAyB,QAAQ;AACjC,6BAA6B,QAAQ;AACrC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,mBAAO,CAAC,wDAA6C;;AAElF;AACA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA,OAAO,QAAQ;AACf;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;;;;;;;;;;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAO,CAAC,qCAA0B;;AAEpD;AACA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,oCAAoC;AACpC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC9JA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG,mBAAO,CAAC,sDAA2C;AACtD,GAAG,mBAAO,CAAC,kEAAwD;AACnE,GAAG,mBAAO,CAAC,4DAAiD;AAC5D,GAAG,mBAAO,CAAC,8DAAmD;AAC9D,GAAG,mBAAO,CAAC,uFAA4E;AACvF,GAAG,mBAAO,CAAC,8EAAoE;AAC/E,GAAG,mBAAO,CAAC,mFAAwE;AACnF,GAAG,mBAAO,CAAC,iFAAsE;AACjF,GAAG,mBAAO,CAAC,gEAAsD;AACjE,GAAG,mBAAO,CAAC,uEAA4D;AACvE,GAAG,mBAAO,CAAC,0EAA+D;AAC1E,GAAG,mBAAO,CAAC,mEAAwD;AACnE,GAAG,mBAAO,CAAC,iFAAsE;AACjF,GAAG,mBAAO,CAAC,iEAAsD;AACjE,GAAG,mBAAO,CAAC,2DAAgD;AAC3D,GAAG,mBAAO,CAAC,kEAAwD;AACnE,GAAG,mBAAO,CAAC,mEAAwD;AACnE,GAAG,mBAAO,CAAC,8DAAoD;AAC/D,GAAG,mBAAO,CAAC,0DAA+C;AAC1D,GAAG,mBAAO,CAAC,mEAAwD;AACnE,GAAG,mBAAO,CAAC,+DAAoD;AAC/D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,IAAI;;AAEJ;AACA;AACA,IAAI;;AAEJ;AACA;AACA,IAAI;;AAEJ;AACA;AACA,IAAI;;AAEJ;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAI;AACJ;;;;;;;;;;;ACxIA,gBAAgB,mBAAO,CAAC,wCAA6B;;AAErD;AACA;AACA;;AAEA,yCAAyC;AACzC,UAAU,KAAK;AACf;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU,WAAW;AACrB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB,cAAc;AAC9D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA,oCAAoC;AACpC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,eAAe;AAC7B;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,+BAA+B,UAAU,IAAI,IAAI;AACjD,mBAAmB;AACnB;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA,QAAQ,IAAI,kBAAkB;AAC9B;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,QAAQ,yBAAyB,MAAM;AACtD;AACA;AACA;;AAEA;AACA;AACA;AACA,uEAAuE,eAAe;AACtF;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC,iCAAiC;AAClE,6BAA6B,mBAAmB;AAChD;AACA;;AAEA;AACA;AACA;AACA;AACA,4EAA4E,eAAe;AAC3F;AACA,yCAAyC,YAAY;AACrD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,gFAAgF,IAAI;AACpF;AACA,+CAA+C,YAAY;AAC3D;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,OAAO;AACrB;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChfA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe;AACf;;AAEA;AACA,aAAa;AACb;AACA;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxGA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;AACA;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpJA;AACA,qDAAqD;AACrD,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC7IA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChKA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtKA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACvKA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChKA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA,uBAAuB,WAAW;AAClC;AACA,6CAA6C;AAC7C;AACA,cAAc,mCAAmC;AACjD;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA,UAAU;AACV;AACA;AACA;;;;;;;;;;;AC3EA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA,uBAAuB,WAAW;AAClC;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA,cAAc,mCAAmC;AACjD;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClKA;AACA,qDAAqD;AACrD,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB,WAAW;AAC9B;AACA;AACA;;;;;;;;;;;ACjEA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,sBAAsB,WAAW;AACjC;AACA;AACA,yBAAyB,mBAAmB;AAC5C;AACA;AACA,aAAa;AACb;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACjKA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF,oBAAoB,mBAAO,CAAC,gDAAqC;;AAEjE;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChJA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,OAAO;;AAEP;AACA,8BAA8B,eAAe,SAAS,WAAW,0CAA0C,IAAI;AAC/G;AACA;AACA,0CAA0C,2BAA2B;AACrE;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,sBAAsB,WAAW;AACjC;AACA,UAAU;;AAEV;AACA;AACA,uBAAuB,QAAQ,GAAG,KAAK;AACvC,yBAAyB,WAAW,gBAAgB,QAAQ;AAC5D;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ,GAAG,sBAAsB;AACrD,oBAAoB,QAAQ;AAC5B,sBAAsB,WAAW;AACjC;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,oBAAoB,kBAAkB;AACtC,2CAA2C,UAAU;AACrD;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B,kBAAkB,SAAS;AAC3B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B,kBAAkB,SAAS;AAC3B,eAAe;AACf,oBAAoB,QAAQ;AAC5B,sBAAsB,QAAQ;AAC9B,sBAAsB,QAAQ;AAC9B,oBAAoB,QAAQ;AAC5B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B,kBAAkB,SAAS;AAC3B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACpbA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF,oBAAoB,mBAAO,CAAC,wDAA6C;;AAEzE;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA,mBAAmB,KAAK;AACxB,sBAAsB,WAAW;AACjC,2BAA2B,KAAK;AAChC;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,KAAK;;AAErC;AACA;AACA,oBAAoB,KAAK;AACzB,sBAAsB,WAAW;AACjC;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACzGA;AACA,qDAAqD;AACrD,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,sBAAsB,WAAW;AACjC,UAAU;AACV;AACA;AACA;;;;;;;;;;;ACjFA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,WAAW,IAAI,WAAW;AACnD;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC3FA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe;AACf;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC3EA;AACA,qDAAqD;AACrD,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,KAAK,GAAG,SAAS;AAC3C,4BAA4B,WAAW,IAAI,aAAa,IAAI,YAAY;AACxE;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA,uBAAuB,KAAK;AAC5B,yBAAyB,WAAW,IAAI,aAAa;AACrD;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA,2EAA2E,QAAQ,6CAA6C,cAAc;AAC9I;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC9MA,yBAAyB,mBAAO,CAAC,gEAAqD;;AAEtF;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,oBAAoB,GAAG,sBAAsB;AAC3E,QAAQ;AACR;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B,8BAA8B,GAAG,6BAA6B;AAC5F;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK;AAC5E;AACA;;;;;;;;;;;ACtKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,mBAAO,CAAC,qCAA0B;AAClD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,UAAU;AACV,sBAAsB,UAAU;AAChC;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,4EAA4E,cAAc;AAC1F;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,UAAU;AACnC;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA,iCAAiC,QAAQ;;AAEzC;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA,iBAAiB,gBAAgB,mBAAmB;AACpD;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACjLA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,sCAA2B;AAChD,kBAAkB,mBAAO,CAAC,yBAAc;AACxC,IAAI,OAAO,IAAI,SAAS;AACxB;AACA,iDAAiD,SAAS;AAC1D,WAAW,SAAS,0BAA0B,OAAO;;AAErD;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,mBAAO,CAAC,+CAAqC;AAC9D;;AAEA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,kBAAkB;AAChC;AACA,cAAc,WAAW;AACzB;AACA,eAAe,MAAM;AACrB;AACA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,sCAA2B;;AAEhD;AACA;AACA;AACA,eAAe,mBAAO,CAAC,0CAA+B;AACtD;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,mBAAO,CAAC,+CAAoC;AAC7D,eAAe,mBAAO,CAAC,0CAA+B;AACtD,gBAAgB,mBAAO,CAAC,0CAAgC;;AAExD;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,mBAAO,CAAC,6CAAmC;AAChE,sBAAsB,mBAAO,CAAC,+CAAoC;AAClE,oBAAoB,mBAAO,CAAC,6CAAkC;;AAE9D;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mBAAO,CAAC,yBAAc;;AAErD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mBAAO,CAAC,yBAAc;;AAErD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC;;AAEjC;;;;;;;;;;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,mBAAO,CAAC,6CAAkC;;AAE9D;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,sCAA2B;AAChD;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG,mBAAO,CAAC,8CAAmC;AAC9C,GAAG,mBAAO,CAAC,6CAAmC;AAC9C,GAAG,mBAAO,CAAC,6CAAkC;AAC7C;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,sCAA2B;AAChD,gBAAgB,mBAAO,CAAC,wBAAc;AACtC,IAAI,OAAO,IAAI,SAAS;AACxB;AACA,qDAAqD,SAAS;AAC9D,WAAW,SAAS;;AAEpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,sCAA2B;AAChD;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,QAAQ;AACR;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,mBAAO,CAAC,sCAA2B;;AAEhD;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,GAAG,GAAG,yCAAyC;AAChE,mBAAmB,MAAM,IAAI,yCAAyC;AACtE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrFA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA,iCAAiC,QAAQ;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACnEA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE,qBAAqB,mBAAO,CAAC,qDAA2C;;AAExE;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,MAAM;AACN;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,QAAQ,GAAG,WAAW;AAC7B;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA,yBAAyB,KAAK;AAC9B,0BAA0B,OAAO;AACjC,uBAAuB;AACvB;AACA;AACA;AACA;AACA,yBAAyB,KAAK;AAC9B,uBAAuB;AACvB;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,uCAAuC,mCAAmC;AAC1E,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,sCAAsC,mCAAmC;AACzE;AACA,OAAO;;AAEP;AACA;AACA;;;;;;;;;;;ACtJA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,QAAQ;AAChC,sBAAsB,QAAQ;AAC9B,6BAA6B,QAAQ;AACrC;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACrGA,6BAA6B,mBAAO,CAAC,sDAA2C;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,QAAQ;AAC5B,2BAA2B,QAAQ;AACnC,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClFA,6BAA6B,mBAAO,CAAC,sDAA2C;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,QAAQ;AAC3B,0BAA0B,QAAQ;AAClC,wBAAwB,QAAQ;AAChC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtFA,wBAAwB,mBAAO,CAAC,iDAAsC;;AAEtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,QAAQ;AAC7B,0BAA0B,QAAQ;AAClC,0BAA0B,QAAQ;AAClC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACtIA,6BAA6B,mBAAO,CAAC,sDAA2C;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,QAAQ;AAC5B,2BAA2B,QAAQ;AACnC,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACvFA,6BAA6B,mBAAO,CAAC,sDAA2C;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,QAAQ;AAC3B,0BAA0B,QAAQ;AAClC,wBAAwB,QAAQ;AAChC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5EA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uBAAuB,QAAQ;AAC/B,yBAAyB,QAAQ;AACjC,4BAA4B,QAAQ;AACpC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,4BAA4B;;AAE5B;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA;;;;;;;;;;;AC3IA,wBAAwB,mBAAO,CAAC,iDAAsC;;AAEtE;AACA;AACA,uBAAuB;AACvB;;AAEA;AACA;AACA;AACA,0CAA0C,QAAQ;AAClD;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzEA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,QAAQ;AAC3C,uBAAuB,QAAQ;AAC/B,0CAA0C,QAAQ;AAClD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,mBAAO,CAAC,wCAA6B;;AAEpD;AACA;AACA;;AAEA;AACA,6BAA6B,QAAQ;AACrC,wBAAwB,QAAQ;AAChC,8BAA8B,QAAQ;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA,wEAAwE;AACxE,QAAQ;AACR;AACA;;AAEA;AACA,oEAAoE;AACpE,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,qCAA0B;;AAElD;AACA,oBAAoB,QAAQ;AAC5B,gCAAgC,QAAQ;AACxC,uCAAuC,QAAQ;AAC/C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,cAAc,sBAAsB;AACpC,eAAe;AACf;AACA;AACA;AACA;AACA,WAAW,wBAAwB;AACnC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,2BAA2B;AAC3B,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;;AAEA;AACA,UAAU,QAAQ;AAClB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAU,KAAK;AACf;;AAEA;AACA;;AAEA;AACA,UAAU,KAAK;AACf,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,8BAA8B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,0BAA0B,QAAQ;AAClC,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,wDAAwD,SAAS;AACjE;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,SAAS;AACpF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,WAAW,IAAI,QAAQ;AAC3C;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,cAAc,SAAS;AACvB;AACA,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,eAAe;AACf,kBAAkB,MAAM;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,cAAc,KAAK;AACnB;AACA,qCAAqC;AACrC;AACA,eAAe;AACf;AACA;AACA,wCAAwC;AACxC;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,cAAc,KAAK;AACnB;AACA,qCAAqC;AACrC;AACA,8BAA8B;AAC9B;AACA,eAAe;AACf;AACA;AACA,uCAAuC;AACvC;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,YAAY,UAAU,2BAA2B;;AAEhE,+CAA+C,cAAc;AAC7D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,qBAAqB;;AAEzE;AACA;AACA;AACA;AACA;AACA,+CAA+C,KAAK;AACpD;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB;AACzB;AACA,gBAAgB;AAChB;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;;;;;;;;;;;AC38BA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC,uBAAuB,QAAQ;AAC/B,gCAAgC,QAAQ;AACxC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClDA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC,oCAAoC,QAAQ;AAC5C,gCAAgC,QAAQ;AACxC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC9CA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA,kBAAkB,KAAK;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,QAAQ;AAChC,mBAAmB,QAAQ;AAC3B,8BAA8B,QAAQ;AACtC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACnFA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;;AAEA;AACA,8BAA8B,QAAQ;AACtC,+BAA+B,QAAQ;AACvC,kDAAkD,QAAQ;AAC1D;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AChCA;AACA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;AACA;AACA;;AAEA;AACA,6BAA6B,QAAQ;AACrC,wBAAwB,QAAQ;AAChC,iDAAiD,QAAQ;AACzD;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9BA,wBAAwB,mBAAO,CAAC,iDAAsC;;AAEtE;AACA,sBAAsB,QAAQ;AAC9B,4BAA4B,QAAQ;AACpC,2BAA2B,QAAQ;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACvGA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;;AAEA;AACA,4BAA4B,QAAQ;AACpC,6BAA6B,QAAQ;AACrC,gDAAgD,QAAQ;AACxD;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AChCA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC,sBAAsB,QAAQ;AAC9B,+CAA+C,QAAQ;AACvD;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1DA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;AChFA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;AACA;AACA;;AAEA;AACA,0BAA0B,QAAQ;AAClC,qBAAqB,QAAQ;AAC7B,8CAA8C,QAAQ;AACtD;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtDA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;;AAEA;AACA,0BAA0B,QAAQ;AAClC,wBAAwB,QAAQ;AAChC,8CAA8C,QAAQ;AACtD;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AChCA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC,4BAA4B,QAAQ;AACpC,iCAAiC,QAAQ;AACzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,6BAA6B,WAAW,GAAG,UAAU;AACrD;;AAEA;AACA,sBAAsB,uBAAuB;AAC7C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C;AAC3C;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;ACrGA,eAAe,mBAAO,CAAC,wCAA6B;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,QAAQ;;AAEf;AACA,OAAO,QAAQ;;AAEf;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5HA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;;AAEA;AACA,wBAAwB,QAAQ;AAChC,+BAA+B,QAAQ;AACvC,2CAA2C,QAAQ;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACnCA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;AACA;;AAEA;AACA,uBAAuB,QAAQ;AAC/B,wBAAwB,QAAQ;AAChC,4BAA4B,QAAQ;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtEA,wBAAwB,mBAAO,CAAC,iDAAsC;AACtE,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE,qBAAqB,mBAAO,CAAC,qDAA2C;AACxE,qBAAqB,mBAAO,CAAC,sDAA2C;;AAExE;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA,mBAAmB,KAAK;AACxB,oBAAoB,OAAO;AAC3B,iBAAiB;AACjB;AACA;AACA;AACA;AACA,mBAAmB,KAAK;AACxB,iBAAiB;AACjB;AACA;AACA,OAAO;AACP;;AAEA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA,mBAAmB,KAAK;AACxB,oBAAoB,OAAO;AAC3B,iBAAiB;AACjB;AACA;AACA,eAAe;AACf,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,0CAA0C,2BAA2B;AACrE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,kBAAkB;AAC1E;AACA;AACA;;AAEA,uCAAuC,2BAA2B;AAClE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mCAAmC,2BAA2B;AAC9D;AACA;;;;;;;;;;;AC9OA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;;AAEA;AACA;AACA,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtCA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;;AAEA;AACA,0BAA0B,QAAQ;AAClC,yBAAyB,QAAQ;AACjC,6CAA6C,QAAQ;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzCA,eAAe,mBAAO,CAAC,wCAA6B;;AAEpD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1DA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;;AAEA;AACA,oBAAoB,QAAQ;AAC5B,+BAA+B,QAAQ;AACvC,uCAAuC,QAAQ;AAC/C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrCA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;;AAEA;AACA,yBAAyB,QAAQ;AACjC,wBAAwB,QAAQ;AAChC,yCAAyC,QAAQ;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3EA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;;AAEA;AACA,6BAA6B,QAAQ;AACrC,2BAA2B,QAAQ;AACnC,2CAA2C,QAAQ;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACnCA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC,wBAAwB,QAAQ;AAChC,iDAAiD,QAAQ;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrCA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;;AAEA;AACA,4BAA4B,QAAQ;AACpC,wBAAwB,QAAQ;AAChC,+CAA+C,QAAQ;AACvD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrCA,uBAAuB,mBAAO,CAAC,gDAAqC;;AAEpE;AACA;AACA;;AAEA;AACA,uBAAuB,QAAQ;AAC/B,yBAAyB,QAAQ;AACjC,0CAA0C,QAAQ;AAClD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrCA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;;AAEA;AACA,wBAAwB,QAAQ;AAChC,wBAAwB,QAAQ;AAChC,uCAAuC,QAAQ;AAC/C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC9BA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA,OAAO;AACP,OAAO,qBAAqB;AAC5B;;AAEA;AACA,OAAO;AACP,OAAO,eAAe;AACtB;;AAEA;AACA,OAAO;AACP,OAAO,gBAAgB;;AAEvB;AACA,OAAO;AACP,OAAO,gBAAgB;;AAEvB;AACA,OAAO;AACP,OAAO,kBAAkB;;AAEzB;AACA,OAAO;AACP,OAAO,kBAAkB;;AAEzB;AACA,OAAO;AACP,OAAO,eAAe;AACtB;AACA;;AAEA;AACA,qBAAqB,QAAQ;AAC7B,sBAAsB,QAAQ;AAC9B,0BAA0B,QAAQ;AAClC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACjFA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,OAAO,GAAG,aAAa,GAAG,cAAc;AAC/C;AACA;AACA;AACA,UAAU;AACV;AACA,cAAc,QAAQ;AACtB,mBAAmB,QAAQ;AAC3B,iBAAiB;AACjB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA,oBAAoB,QAAQ;AAC5B,sBAAsB,QAAQ;AAC9B,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC/XA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,QAAQ;AAC7B,0BAA0B,QAAQ;AAClC,0BAA0B,QAAQ;AAClC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClEA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP,mBAAmB,YAAY;AAC/B;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP,WAAW,YAAY;AACvB;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,oCAAoC,OAAO,QAAQ;AACnD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACvFA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,QAAQ;AAC7B,qBAAqB,QAAQ;AAC7B,0BAA0B,QAAQ;AAClC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,gCAAgC;;AAEhC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACjHA,wBAAwB,mBAAO,CAAC,iDAAsC;AACtE,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,QAAQ;AAC9B,wBAAwB,QAAQ;AAChC,2BAA2B,QAAQ;AACnC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;ACjFA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,QAAQ;AAC5B,wBAAwB,QAAQ;AAChC,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC5CA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,QAAQ;AAC5B,yBAAyB,QAAQ;AACjC,yBAAyB,QAAQ;AACjC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sBAAsB,gCAAgC;AACtD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B,GAAG;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;;;;;;;;;;;AClTA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE,qBAAqB,mBAAO,CAAC,sDAA2C;;AAExE;AACA;AACA;;AAEA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA,mBAAmB,KAAK;AACxB,oBAAoB,OAAO;AAC3B,iBAAiB;AACjB;AACA;AACA,eAAe;AACf,OAAO;AACP;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC,2BAA2B,QAAQ;AACnC,iCAAiC,QAAQ;AACzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,+BAA+B,2BAA2B;AAC1D,OAAO;AACP;AACA;;;;;;;;;;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,mBAAO,CAAC,iDAAsC;AACtE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,0BAA0B;AAC1B,WAAW;;AAEX;AACA;;AAEA,0BAA0B;AAC1B,UAAU,KAAK;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,sBAAsB,sBAAsB,IAAI,oBAAoB,UAAU,UAAU,IAAI,QAAQ,+BAA+B,GAAG;AACtI;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA,mBAAmB;AACnB;AACA,cAAc;AACd,0BAA0B;AAC1B;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,eAAe;AACf,yBAAyB,MAAM;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA,cAAc,SAAS;AACvB;AACA,eAAe,SAAS;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,gBAAgB;AAClC;AACA,cAAc,SAAS;AACvB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACtdA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,QAAQ;AAC7B,qBAAqB,QAAQ;AAC7B,0BAA0B,QAAQ;AAClC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpGA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC,wBAAwB,QAAQ;AAChC,oCAAoC,QAAQ;AAC5C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxGA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzJA,qBAAqB,mBAAO,CAAC,8CAAmC;AAChE,wBAAwB,mBAAO,CAAC,iDAAsC;;AAEtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,QAAQ;AAC3B,gCAAgC,QAAQ;AACxC,wBAAwB,QAAQ;AAChC;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClFA,qBAAqB,mBAAO,CAAC,8CAAmC;;AAEhE;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP,WAAW,qBAAqB;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,iCAAiC,MAAM;AACvC;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,qCAAqC,cAAc;;AAEnD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA,4BAA4B,EAAE;AAC9B;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA,4BAA4B,EAAE;AAC9B;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;;AAEA;AACA,OAAO;;AAEP,kBAAkB,MAAM;AACxB,gCAAgC,GAAG;;AAEnC;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACrNA,eAAe,mBAAO,CAAC,wCAA6B;;AAEpD;AACA,0BAA0B,QAAQ;AAClC,gCAAgC,QAAQ;AACxC,yCAAyC,QAAQ;AACjD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACjDA,UAAU,mBAAO,CAAC,mBAAQ;;AAE1B;AACA,0BAA0B,mBAAO,CAAC,yCAA8B;;AAEhE,mBAAmB,mBAAO,CAAC,4BAAoB;AAC/C,sBAAsB,mBAAO,CAAC,4BAAiB;;AAE/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,UAAU;AAC/C;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,WAAW;AACzB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iEAAiE,UAAU;AAC3E;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yCAAyC,EAAE;AAC3C,iBAAiB;AACjB;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;;AAEA,iCAAiC;AACjC,mCAAmC,WAAW,KAAK,IAAI;AACvD,4BAA4B,eAAe;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;AClbA,UAAU,mBAAO,CAAC,mBAAQ;;AAE1B;AACA,gCAAgC,mBAAO,CAAC,+CAAoC;;AAE5E,yBAAyB,mBAAO,CAAC,kCAAuB;AACxD,sBAAsB,mBAAO,CAAC,4BAAiB;;AAE/C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5CiD;AACyB;AACjB;AACF;AACF;AACkB;AACE;AACR;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACO;AACP;AACA,gBAAgB;AAChB,8BAA8B;AAC9B,oBAAoB;AACpB,mBAAmB;AACnB,kBAAkB;AAClB,2BAA2B;AAC3B,4BAA4B;AAC5B,wBAAwB;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA,8DAA8D,KAAK;AACnE;AACA;AACO;AACP;AACA,6DAA6D,IAAI;AACjE;AACA;;AAEO;AACP;AACA,6DAA6D,IAAI;AACjE;AACA;;AAEO;AACP;AACA;;AAEA;AACA;AACA,gEAAgE,IAAI;AACpE;AACA;;AAEO;AACP;AACA,yDAAyD,KAAK;AAC9D;AACA;;AAEO;AACP;AACA;;AAEO;AACP;AACA;;AAEO;AACP;AACA,kEAAkE,IAAI;AACtE;AACA;;AAEO;AACP;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,KAAK;AAC3E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEO;AACP,YAAY,qDAAqD;AACjE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChKA,kBAAkB,mBAAO,CAAC,wBAAa;;AAEvC,+BAA+B,mBAAO,CAAC,iEAAsD;;AAE7F;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,gCAAgC;AAC9C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA,uBAAuB,WAAW;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;;AAE1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,mBAAmB;;AAEnB,qEAAqE,EAAE;AACvE,+CAA+C,EAAE;;AAEjD,qEAAqE,EAAE;AACvE,8CAA8C,EAAE;;AAEhD,qEAAqE,EAAE;AACvE,+CAA+C,EAAE;;AAEjD,qEAAqE,EAAE;AACvE,+CAA+C,EAAE;;AAEjD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,0BAA0B,QAAQ;AAClC,2BAA2B;AAC3B;AACA;AACA,4BAA4B,IAAI,EAAE,UAAU;AAC5C,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC,YAAY,GAAG,IAAI;AACnD;AACA;;;;;;;;;;;AC7KA,sBAAsB,mBAAO,CAAC,4BAAiB;AAC/C,6BAA6B,mBAAO,CAAC,yCAA8B;;AAEnE;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,uBAAuB,MAAM;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,sCAAsC,EAAE;AACxC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,mCAAmC;;AAEnC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,+BAA+B,MAAM,IAAI,MAAM;AAC/C;AACA;AACA;AACA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA,uBAAuB,aAAa,GAAG,aAAa;AACpD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iDAAiD;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,4CAA4C;AAC5C;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;;AAElE;AACA;;AAEA,sCAAsC;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B,sBAAsB,GAAG,MAAM,GAAG,MAAM;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB,gCAAgC;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;;AAEA,mCAAmC;AACnC;;AAEA;AACA,gCAAgC,MAAM,kBAAkB,MAAM;AAC9D;;AAEA;AACA;AACA;AACA,sBAAsB,YAAY,kBAAkB,YAAY;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,uCAAuC;;AAEvC;AACA;AACA,uCAAuC,MAAM;AAC7C;AACA;AACA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,qCAAqC,cAAc;;AAEnD;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA,qDAAqD,0BAA0B;AAC/E;AACA;AACA;;AAEA,iCAAiC;AACjC,sCAAsC,WAAW,KAAK,IAAI;AAC1D,4BAA4B,eAAe;AAC3C;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACjlBA,uBAAuB,mBAAO,CAAC,qCAA0B;;AAEzD;AACA;AACA;AACA;AACA;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,uDAA8B;;AAEjD;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;;;;;;;;;;;ACbA,mBAAmB,mBAAO,CAAC,+BAAoB;;AAE/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iDAAiD,EAAE;AACnD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO,IAAI,sCAAsC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,+BAA+B,gDAAgD;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,uBAAuB;AACvB,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uFAAuF,qBAAqB,EAAE;AAC9G;AACA,yBAAyB;AACzB,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChRA,oBAAoB,mBAAO,CAAC,gCAAqB;;AAEjD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA,oEAAoE,GAAG;AACvE,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,MAAM;AACpB;AACA;AACA,iCAAiC;AACjC,6BAA6B,WAAW,KAAK,IAAI;AACjD,4BAA4B,eAAe;AAC3C;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C,eAAe,SAAS,QAAQ;AAC5E;AACA,OAAO;AACP;;AAEA;AACA;AACA,4CAA4C,eAAe,SAAS,QAAQ;AAC5E,OAAO;AACP;AACA;;;;;;;;;;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAO,CAAC,kCAAuB;;AAEnD;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B,mBAAmB,MAAM;AACzB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,OAAO;AAC9E;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,OAAO;AAC7C,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzGA,oBAAoB,mBAAO,CAAC,gCAAqB;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kBAAkB,QAAQ;AAC1B;AACA,uBAAuB,KAAK;AAC5B;AACA,kBAAkB,OAAO;AACzB,mBAAmB,KAAK;AACxB,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,sBAAsB;AACrD;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,uCAAuC,EAAE,GAAG,QAAQ;AACpD,gBAAgB;;AAEhB,iCAAiC;;AAEjC;AACA,4BAA4B,gBAAgB,KAAK,cAAc,GAAG;AAClE;AACA;AACA,4BAA4B;AAC5B;AACA;;AAEA;AACA,2BAA2B,OAAO;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,2BAA2B,OAAO,wBAAwB,kBAAkB;;AAE5E;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA,aAAa;AACb,OAAO;AACP;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,cAAc;AAC5B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA,oDAAoD,QAAQ,sBAAsB;AAClF;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,aAAa;AACb,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA,yCAAyC;;AAEzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sDAAsD,cAAc;;AAEpE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA,gBAAgB;;AAEhB,6BAA6B;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,6CAA6C,cAAc;;AAE3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;;AAEA;;AAEA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA,qBAAqB,QAAQ;AAC7B,yBAAyB,QAAQ;AACjC,wBAAwB,QAAQ;AAChC,yBAAyB,MAAM;AAC/B,uBAAuB,MAAM;AAC7B,qBAAqB,SAAS;AAC9B,qBAAqB,SAAS;AAC9B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,cAAc,uBAAuB;AACrC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA,aAAa;AACb,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,cAAc;AACd;AACA;AACA;AACA,gBAAgB;AAChB;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACtmBA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,sBAAW;;AAEnC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,cAAc;AAC5B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC/EA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,sBAAW;;AAEnC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,sBAAsB;AAC/C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;;;;;;;;;;;AC3DA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,sBAAW;;AAEnC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,cAAc;AAC5B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpEA,qBAAqB,mBAAO,CAAC,iCAAsB;;AAEnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP,KAAK;AACL;AACA;;AAEA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA,UAAU;;AAEV;AACA,UAAU,QAAQ,QAAQ;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,6CAA6C,EAAE;AAC/C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,aAAa,MAAM,OAAO,GAAG;AAC7B,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,qBAAqB;AACrB,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA6B;;AAE7B;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;;AAEb;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;;AAEA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;;AAEA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA,kDAAkD,QAAQ;AAC1D,aAAa;AACb;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA,kDAAkD,QAAQ;AAC1D,aAAa;AACb;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA,8CAA8C;AAC9C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iCAAiC;AACjC,cAAc;AACd,iCAAiC;AACjC;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA,wDAAwD;AACxD,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,yCAAyC,EAAE,iBAAiB;AAC5D;AACA,2BAA2B,yCAAyC;AACpE;AACA,aAAa,GAAG;AAChB;;AAEA,4BAA4B,OAAO;AACnC,YAAY,OAAO,UAAU,OAAO;AACpC,sCAAsC,GAAG,IAAI;;AAE7C;AACA;AACA,iDAAiD,iBAAiB;;AAElE;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,2BAA2B,yCAAyC;AACpE;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,oEAAoE,GAAG;AACvE,OAAO;;AAEP;AACA,oEAAoE,GAAG;AACvE,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;;AAEA,iCAAiC;AACjC,8BAA8B,WAAW,KAAK,IAAI;AAClD,4BAA4B,eAAe;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAyC,QAAQ;AACjD,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,MAAM;AACxB,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACzxBA,iBAAiB,mBAAO,CAAC,qBAAU;AACnC,wBAAwB,mBAAO,CAAC,oCAAyB;;AAEzD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,OAAO;;AAEP;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;;AAEA;;AAEA,sBAAsB,2BAA2B;AACjD;;AAEA;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC/EA,gCAAgC,mBAAO,CAAC,4CAAiC;;AAEzE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACvEA,iBAAiB,mBAAO,CAAC,uBAAY;;AAErC;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACPA,iBAAiB,mBAAO,CAAC,uBAAY;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0BAA0B,mBAAO,CAAC,sCAA2B;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,EAAE;AACF;AACA;;AAEA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,UAAU,EAAE;AAC7C;AACA,0CAA0C,iBAAiB,GAAG,4BAA4B;AAC1F,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA,iCAAiC,UAAU,EAAE;AAC7C;AACA,mBAAmB,MAAM,GAAG,iBAAiB;;AAE7C;AACA;AACA,0BAA0B,kBAAkB;AAC5C,WAAW;AACX,0BAA0B,yBAAyB,GAAG,kBAAkB;AACxE;;AAEA;AACA;AACA,wDAAwD,kBAAkB;AAC1E;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,qBAAqB,kBAAkB;AACpD;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,qCAAqC,QAAQ;AAC7C;AACA,aAAa,qBAAqB,4BAA4B;AAC9D;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,qBAAqB,WAAW,+BAA+B;AAC/D;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,aAAa,+BAA+B;AAC5C;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;;AAEA,iCAAiC;AACjC,6BAA6B,WAAW,KAAK,IAAI;AACjD,4BAA4B,eAAe;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACjWA,sBAAsB,mBAAO,CAAC,kCAAuB;;AAErD;;AAEA;AACA;AACA;;AAEA;AACA,UAAU,OAAO;AACjB;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,aAAa;AACb,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,8CAA8C,EAAE;AAChD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO,IAAI,sCAAsC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA,4BAA4B,gDAAgD;AAC5E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,oBAAoB;AACpB,UAAU;AACV;;AAEA;AACA;AACA;;;;;;;;;;;ACtQA,mBAAmB,mBAAO,CAAC,+BAAoB;;AAE/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,gCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iDAAiD,EAAE;AACnD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO,IAAI,sCAAsC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,+BAA+B,gDAAgD;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,uBAAuB;AACvB,aAAa;AACb;AACA;AACA;AACA;AACA;;;;;;;;;;;AC9LA,0BAA0B,mBAAO,CAAC,sCAA2B;AAC7D,qBAAqB,mBAAO,CAAC,6BAAkB;;AAE/C;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACzBA,gCAAgC,mBAAO,CAAC,4CAAiC;;AAEzE;;;;;;;;;;;ACFA;AACA;;AAEA;AACA;AACA,UAAU,wBAAwB;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ,GAAG,WAAW;AACrC;AACA;AACA;AACA,WAAW,gCAAgC;AAC3C,WAAW,+BAA+B,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAC7E,WAAW,MAAM,yBAAyB,KAAK;AAC/C,WAAW,gCAAgC;AAC3C;AACA;;AAEA;AACA;AACA;AACA,cAAc,GAAG;AACjB;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oDAAoD,SAAS;AAC7D;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA,aAAa;;AAEb;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,eAAe;AACf;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA,UAAU,SAAS;;AAEnB;AACA,sBAAsB,gBAAgB;AACtC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChKA,0BAA0B,mBAAO,CAAC,sCAA2B;;AAE7D;;AAEA;AACA;AACA;AACA;AACA,WAAW,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,8BAA8B;AAC7D,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,KAAK;AAChB;AACA;AACA;AACA;AACA,8CAA8C,8BAA8B;AAC5E,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,uCAAuC,QAAQ;AAC/C;;AAEA;AACA,uCAAuC,QAAQ;AAC/C;;AAEA;AACA,uCAAuC;AACvC;;AAEA;;AAEA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA,+BAA+B;AAC/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA,+BAA+B,OAAO;AACtC,sCAAsC,OAAO;AAC7C,8BAA8B,OAAO;AACrC,OAAO;;AAEP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,sCAAsC,uBAAuB;AAC7D;AACA;AACA;AACA,6CAA6C;AAC7C,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,SAAS,EAAE,OAAO;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAA0B,0BAA0B,GAAG,6BAA6B;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,eAAe,GAAG,QAAQ;AACtD,gBAAgB;AAChB,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA,kCAAkC,EAAE;AACpC;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,wCAAwC;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,aAAa;AAC3B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;;;;;;;;;;;AC9nCA,sBAAsB,mBAAO,CAAC,iCAAuB;;AAErD;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mCAAmC,OAAO;AAC1C,oCAAoC,OAAO;AAC3C,sCAAsC,OAAO;;AAE7C,8BAA8B,OAAO;AACrC,+BAA+B,OAAO;AACtC,8BAA8B,OAAO;AACrC,oCAAoC,OAAO;;AAE3C,oCAAoC,OAAO;AAC3C,yCAAyC,OAAO;AAChD;AACA,eAAe,OAAO;AACtB;AACA;AACA,eAAe,OAAO;AACtB;AACA,oCAAoC,OAAO;;AAE3C,wCAAwC,OAAO;;AAE/C,qCAAqC,OAAO;;AAE5C,oCAAoC,OAAO;AAC3C,OAAO;;AAEP;AACA;;AAEA,qBAAqB;;AAErB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,MAAM;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kCAAkC,gBAAgB;AAClD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kCAAkC,iBAAiB;AACnD;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;ACvwCA;AACuC;AACvC,mBAAmB,mBAAO,CAAC,yCAA8B;;AAEzD;;AAEA,yBAAyB,mDAAO;AAChC;AACA;AACA,kBAAkB,OAAO;AACzB,oBAAoB,OAAO;AAC3B,mBAAmB,OAAO;AAC1B,OAAO;;AAEP;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,kCAAkC;AAC5D,0BAA0B,oCAAoC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA,oBAAoB;AACpB;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,eAAe,OAAO,IAAI,WAAW;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,8BAA8B;AAC9B,qCAAqC,SAAS;AAC9C,4BAA4B;AAC5B,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;;AAEA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;;AAEA,2BAA2B;AAC3B;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qDAAqD,SAAS;AAC9D;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA,6BAA6B;AAC7B,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,mBAAmB;AACjC;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,2BAA2B,cAAc;AACzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA,iEAAe,UAAU,EAAC;;;;;;;;;;;ACxmB1B;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,mBAAO,CAAC,8CAAmC;;AAE/D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,oBAAoB,OAAO;;AAE3B;AACA,YAAY;AACZ;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,kDAAkD,GAAG;AACrD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb,UAAU;;AAEV;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C,eAAe,SAAS,QAAQ;AAC5E,OAAO;AACP;;AAEA;AACA;AACA,4CAA4C,eAAe,SAAS,QAAQ;AAC5E,OAAO;AACP;;AAEA;AACA;AACA,4CAA4C,eAAe,SAAS,QAAQ;AAC5E,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,6BAA6B,KAAK;AAClC,iBAAiB,IAAI;AACrB,kBAAkB,IAAI;AACtB,oBAAoB;AACpB;AACA,eAAe,MAAM;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,0DAA0D,iBAAiB;AAC3E;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,qBAAqB,aAAa;AAClC,cAAc,KAAK;AACnB;AACA;AACA,cAAc,SAAS;AACvB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;;AAEf;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,6BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,MAAM;AACpB;AACA;AACA,iCAAiC;AACjC,uBAAuB,gBAAgB,GAAG,WAAW,KAAK,IAAI;AAC9D,4BAA4B,eAAe;AAC3C;;AAEA;AACA;AACA,yCAAyC,eAAe,SAAS,QAAQ;AACzE,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,MAAM;AACxB,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1fA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACrEA,2BAA2B,mBAAO,CAAC,qDAA0C;;AAE7E;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACnFA,6BAA6B,mBAAO,CAAC,uDAA4C;;AAEjF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B;AAC5B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AClEA,2BAA2B,mBAAO,CAAC,qDAA0C;;AAE7E;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oDAAoD,GAAG;AACvD;AACA;AACA,aAAa;AACb;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACnFA,2BAA2B,mBAAO,CAAC,qDAA0C;;AAE7E;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA,aAAa;AACb;;AAEA;;AAEA;AACA,iDAAiD;;AAEjD;AACA,gDAAgD;;AAEhD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,GAAG;AACjB,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX,6BAA6B;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,UAAU,8BAA8B,OAAO;AAC9G;AACA,aAAa;AACb;AACA;AACA,gEAAgE,oBAAoB;AACpF;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,sDAAsD,MAAM,sBAAsB,mBAAmB;AACrG;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA,oBAAoB,OAAO;AAC3B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA,yBAAyB,IAAI;;AAE7B,qBAAqB,IAAI;AACzB,iCAAiC,IAAI;AACrC;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;;AAEA,0DAA0D;AAC1D;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA,+BAA+B,UAAU;AACzC,mBAAmB;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA,aAAa;AACb,OAAO;AACP;;AAEA;AACA,gBAAgB,QAAQ,GAAG,sBAAsB;AACjD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,WAAW,UAAU,WAAW,EAAE,UAAU,EAAE,SAAS;AACzE;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,QAAQ;AACvC;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,WAAW;AACX;AACA;;AAEA;AACA,QAAQ;AACR;AACA,uDAAuD;AACvD;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,iBAAiB;AAChE;AACA;AACA;AACA;AACA;AACA,wCAAwC,iBAAiB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,GAAG;AACjB,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,8CAA8C,yBAAyB;AACvE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+CAA+C,yBAAyB;AACxE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,QAAQ;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACl9BA,wBAAwB,mBAAO,CAAC,kDAAuC;;AAEvE;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,uDAAuD;;AAEvD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,KAAK;AACtB;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;;;;;;;;;;AC/IA,4BAA4B,mBAAO,CAAC,sDAA2C;;AAE/E;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,uDAAuD;;AAEvD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,KAAK;AACtB;AACA;;AAEA;AACA,mBAAmB,uCAAuC,EAAE;AAC5D;AACA,WAAW;AACX,QAAQ;AACR,mBAAmB,mCAAmC,EAAE,mBAAmB;AAC3E;AACA;AACA;;;;;;;;;;;AClJA,yBAAyB,mBAAO,CAAC,kDAAwC;;AAEzE;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACtFA,wBAAwB,mBAAO,CAAC,kDAAuC;;AAEvE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qEAAqE,EAAE;AACvE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;;AAEzC;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,EAAE;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,EAAE;AACtD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,eAAe;AACpD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC;AACrC;AACA;AACA;;AAEA;AACA,uEAAuE,iBAAiB,qBAAqB,wBAAwB,yBAAyB,kBAAkB,qBAAqB,iBAAiB,mBAAmB,iBAAiB,EAAE,YAAY,mDAAmD,iBAAiB,iBAAiB,mBAAmB;AAChX,+BAA+B,iCAAiC;AAChE,UAAU;AACV,gEAAgE,aAAa,mBAAmB,6BAA6B,QAAQ;AACrI;AACA,UAAU;AACV;AACA,8BAA8B,YAAY,mDAAmD;AAC7F;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA,eAAe;AACf;AACA;AACA,6BAA6B,eAAe,GAAG,QAAQ,GAAG,oBAAoB;AAC9E;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA,sBAAsB,GAAG;AACzB;AACA;;;;;;;;;;;ACndA,2BAA2B,mBAAO,CAAC,qDAA0C;;AAE7E;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B;AAC5B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACnEA,yBAAyB,mBAAO,CAAC,mDAAwC;;AAEzE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,EAAE;AAC3E;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;;AAEA;AACA,oBAAoB;AACpB;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,WAAW;AACX,uBAAuB;AACvB;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mCAAmC,GAAG,OAAO;AAChE,QAAQ;AACR,mBAAmB,mCAAmC,GAAG,OAAO;AAChE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,6BAA6B,YAAY;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,UAAU;AACxC,oBAAoB,iCAAiC;AACrD;AACA;AACA;AACA;AACA,0BAA0B,YAAY;AACtC;AACA;AACA;AACA;AACA,6BAA6B,eAAe;AAC5C,QAAQ;AACR;AACA,oBAAoB,qBAAqB;AACzC;AACA,0BAA0B,YAAY;AACtC;AACA,6BAA6B,eAAe;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,gBAAgB;AAC9C;AACA,0BAA0B,YAAY;AACtC;AACA,6BAA6B,eAAe;AAC5C;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,sCAAsC,QAAQ,UAAU,gBAAgB;;AAExE,sCAAsC,QAAQ,UAAU,YAAY;;AAEpE;AACA,kEAAkE,EAAE,WAAW;AAC/E,8DAA8D,WAAW;AACzE;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB,cAAc,QAAQ;AACtB,kBAAkB,QAAQ;AAC1B,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;;AAEzC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,EAAE;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;;AAEhD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,aAAa;AACb,UAAU;AACV,QAAQ;AACR;AACA;;AAEA;AACA,kCAAkC,eAAe;AACjD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC;AACrC;AACA,6CAA6C,qBAAqB,GAAG;AACrE,QAAQ;AACR;AACA,wCAAwC;AACxC;AACA,gDAAgD;AAChD;AACA,cAAc,GAAG;AACjB;AACA;;AAEA;AACA,sDAAsD,YAAY;AAClE,0DAA0D,cAAc,SAAS,iBAAiB,EAAE,SAAS;AAC7G;;AAEA;AACA;AACA;AACA,sBAAsB,iCAAiC;AACvD;AACA;AACA;AACA;AACA;AACA,2BAA2B,aAAa,mDAAmD;AAC3F;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,2BAA2B;AAC1E;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kDAAkD,mBAAmB;AACrE;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA,sBAAsB,GAAG;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA,eAAe;AACf;AACA;AACA,6BAA6B,eAAe,GAAG,QAAQ,GAAG,oBAAoB;AAC9E;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,QAAQ;AACvC,OAAO;AACP;;AAEA;AACA;AACA,+BAA+B,QAAQ;AACvC,OAAO;AACP;AACA;;;;;;;;;;;AC/oBA,wBAAwB,mBAAO,CAAC,kDAAuC;;AAEvE;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+BAA+B;AAC/B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,kBAAkB,MAAM;AACxB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3FA,wBAAwB,mBAAO,CAAC,kDAAuC;;AAEvE;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC;AAChC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6DAA6D,UAAU;AACvE;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kDAAkD,eAAe,IAAI;AACrE;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;AACA;AACA,oCAAoC,UAAU,kCAAkC,eAAe,UAAU,SAAS,8BAA8B,OAAO;AACvJ;AACA;AACA,aAAa;AACb;AACA;AACA,gEAAgE,oBAAoB;AACpF;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,iBAAiB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,UAAU,kCAAkC,eAAe,IAAI,MAAM,sBAAsB,iBAAiB;AAC7I;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA,yCAAyC;AACzC;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA,gDAAgD;AAChD;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR,uDAAuD,OAAO;AAC9D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;;;;;;;;;;AC9dA,4BAA4B,mBAAO,CAAC,sDAA2C;;AAE/E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,8BAA8B;AAC9B;AACA;AACA,8DAA8D;AAC9D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;ACnHA,0BAA0B,mBAAO,CAAC,oDAAyC;;AAE3E;AACA,IAAI,MAAM;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAAgC;;AAEhC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC/EA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,sBAAW;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,kDAAkD,wBAAwB,mCAAmC;AAC7G,wBAAwB,aAAa,mBAAmB,eAAe;AACvE,kDAAkD,aAAa;AAC/D;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,0GAA0G;AAC1G;AACA;AACA;AACA,gBAAgB;AAChB;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,mBAAmB;AACnB,mCAAmC,aAAa,WAAW;AAC3D,wBAAwB,aAAa,mBAAmB,eAAe;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,gBAAgB,mBAAmB,eAAe;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpWA,0BAA0B,mBAAO,CAAC,oDAAyC;;AAE3E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,KAAK;AACrD;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3JA,+BAA+B,mBAAO,CAAC,yDAA8C;;AAErF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChFA,wBAAwB,mBAAO,CAAC,kDAAuC;;AAEvE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gBAAgB,mCAAmC,GAAG,OAAO;AAC7D;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uCAAuC,eAAe;AACtD;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,mFAAmF,eAAe;AAClG;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA,yBAAyB,OAAO;AAChC,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,6BAA6B;;AAE7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA,8CAA8C;;AAE9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;;AAE5B;AACA,0BAA0B;AAC1B,8CAA8C;AAC9C;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC5cA,2BAA2B,mBAAO,CAAC,qDAA0C;AAC7E,wBAAwB,mBAAO,CAAC,kDAAuC;;AAEvE;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB,GAAG,WAAW;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ,YAAY,aAAa;AAC/C,cAAc,KAAK;AACnB;AACA,cAAc,SAAS;AACvB;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sCAAsC,aAAa,6BAA6B,mBAAmB,sBAAsB;AACzH,6CAA6C;AAC7C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC7QA,yBAAyB,mBAAO,CAAC,+CAAoC;;AAErE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AChFA,yBAAyB,mBAAO,CAAC,kDAAuC;;AAExE;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,yDAAyD,GAAG;AAC5D,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,gDAAgD,yBAAyB;AACzE;AACA;AACA;AACA;;AAEA,iCAAiC;AACjC,uBAAuB,SAAS,GAAG,UAAU,KAAK,IAAI;AACtD,4BAA4B,eAAe;AAC3C;AACA;;;;;;;;;;;ACxGA,+BAA+B,mBAAO,CAAC,qDAA0C;;AAEjF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACZA,6BAA6B,mBAAO,CAAC,mDAAwC;;AAE7E,+BAA+B,mBAAO,CAAC,qCAA0B;;AAEjE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,wDAAwD,yBAAyB;AACjF;AACA;AACA;AACA;AACA;;;;;;;;;;;AClEA,mCAAmC,mBAAO,CAAC,yDAA8C;;AAEzF;AACA;AACA;;;;;;;;;;;ACJA,qCAAqC,mBAAO,CAAC,2DAAgD;;AAE7F;AACA;AACA;;;;;;;;;;;ACJA,oCAAoC,mBAAO,CAAC,0DAA+C;;AAE3F;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC5FA,mCAAmC,mBAAO,CAAC,yDAA8C;;AAEzF;AACA;AACA;;;;;;;;;;;ACJA,iCAAiC,mBAAO,CAAC,sDAA4C;;AAErF;;;;;;;;;;;ACFA,qCAAqC,mBAAO,CAAC,2DAAgD;;AAE7F;AACA;AACA;;;;;;;;;;;ACJA,kCAAkC,mBAAO,CAAC,wDAA6C;;AAEvF;AACA;AACA;;;;;;;;;;;ACJA,iCAAiC,mBAAO,CAAC,uDAA4C;;AAErF;;;;;;;;;;;ACFA,oCAAoC,mBAAO,CAAC,0DAA+C;;AAE3F;AACA;AACA;;;;;;;;;;;ACJA,kCAAkC,mBAAO,CAAC,wDAA6C;;AAEvF;AACA;AACA;;;;;;;;;;;ACJA,iCAAiC,mBAAO,CAAC,uDAA4C;;AAErF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACVA,mCAAmC,mBAAO,CAAC,yDAA8C;;AAEzF;AACA;AACA;;;;;;;;;;;ACJA,qCAAqC,mBAAO,CAAC,2DAAgD;;AAE7F;AACA;AACA;;;;;;;;;;;ACJA,2CAA2C,mBAAO,CAAC,gEAAsD;;AAEzG;AACA;AACA;;;;;;;;;;;ACJA,yCAAyC,mBAAO,CAAC,+DAAoD;;AAErG;AACA;AACA;;;;;;;;;;;ACJA,oCAAoC,mBAAO,CAAC,0DAA+C;;AAE3F;AACA;AACA;AACA;AACA;AACA,iCAAiC,GAAG;AACpC;AACA;;;;;;;;;;;ACTA,8BAA8B,mBAAO,CAAC,oDAAyC;AAC/E;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzBA,6BAA6B,mBAAO,CAAC,mDAAwC;;AAE7E;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uCAAuC,GAAG;AAC1C;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AClBA,iCAAiC,mBAAO,CAAC,uDAA4C;;AAErF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uCAAuC,GAAG;AAC1C;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;;;;;;;AClB6C;;AAE9B,8BAA8B,sDAAO;AACpD,0CAA0C;AAC1C,gBAAgB,QAAQ;AACxB,eAAe,SAAS;AACxB;AACA;;AAEA;;AAEA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,eAAe;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC,mBAAmB,QAAQ;AAC3B,sBAAsB,QAAQ;AAC9B,qBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,0BAA0B;AAC1B;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,YAAY,GAAG,iBAAiB;AAC1D,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC9QA,gBAAgB,mBAAO,CAAC,uBAAY;;AAErB;;;;;;;;;;;;;;;;;;ACFuB;;AAEvB,6BAA6B,qDAAQ;AACpD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACzFyC;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEe,uCAAuC,sDAAU;AAChE,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,0BAA0B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,8CAA8C,EAAE;AAChD;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,sDAAU;AAClC,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,sDAAU;AAClC,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,2BAA2B,cAAc;AACzC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AChR6C;;AAE9B,yBAAyB,sDAAO;AAC/C;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,eAAe;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC,mBAAmB,QAAQ;AAC3B,sBAAsB,QAAQ;AAC9B,qBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,0BAA0B;AAC1B;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,YAAY,GAAG,iBAAiB;AAC1D,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;;;;;;;;;;;;;;;;;ACtNwE;;AAEzD,oCAAoC,+EAAe;AAClE;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACNmD;;AAEpC,iCAAiC,2DAAe;AAC/D,mDAAmD;AACnD,gBAAgB,QAAQ;AACxB,gBAAgB,QAAQ;AACxB,eAAe,SAAS;AACxB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,uFAAuF,EAAE;AACzF;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC1HwC;;AAEzB,2BAA2B,yDAAM;AAChD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,yDAAyD;AACpE;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AC9BmD;;AAEpC,qCAAqC,2DAAe;AACnE,mDAAmD;AACnD,gBAAgB,QAAQ;AACxB,eAAe,SAAS;AACxB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,oFAAoF,EAAE;AACtF;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,2CAA2C;AAC3C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+BAA+B;AAC/B;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB;AAClB,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,EAAE;AAC/D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;;;;;;;;;;;ACtPA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAO,CAAC,iDAAsC;;AAEtE;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mBAAO,CAAC,wDAA6C;;AAEpF;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;;;;;;;;;;;AC5GA,6BAA6B,mBAAO,CAAC,gEAAqD;;AAE1F;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,qDAAqD,UAAU;AAC/D;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC;AAChC,uBAAuB,kBAAkB;AACzC;AACA,OAAO,KAAK,IAAI;AAChB,4BAA4B,eAAe;AAC3C;AACA;;;;;;;;;;;AC3RA,yBAAyB,mBAAO,CAAC,4DAAiD;;AAElF;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;;;;;;;;;;ACtBA,sCAAsC,mBAAO,CAAC,yEAA8D;;AAE5G;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1EA;AACA,qDAAqD;AACrD,+BAA+B,mBAAO,CAAC,kEAAuD;;AAE9F;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,iDAAiD,IAAI;AACrD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,6DAA6D,IAAI;AACjE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,IAAI;AAC9D;AACA;AACA;AACA;AACA;AACA,yCAAyC,IAAI;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC7GA,iCAAiC,mBAAO,CAAC,oEAAyD;;AAElG;;;;;;;;;;;ACFA,sCAAsC,mBAAO,CAAC,6FAAkF;;AAEhI;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,GAAG;AACrB,+BAA+B,GAAG;AAClC,yBAAyB,GAAG;AAC5B,+BAA+B,GAAG;AAClC,uCAAuC,GAAG;AAC1C,sBAAsB,GAAG;AACzB,4BAA4B,GAAG;AAC/B,uBAAuB,GAAG;AAC1B,2BAA2B,GAAG;AAC9B,mCAAmC,GAAG;AACtC,sBAAsB,GAAG;AACzB,oCAAoC,GAAG;AACvC,4BAA4B,GAAG;AAC/B,uBAAuB,GAAG;AAC1B,4BAA4B,GAAG;AAC/B;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA,6BAA6B,2CAA2C;AACxE;AACA;AACA,8BAA8B,+BAA+B;AAC7D,OAAO;;AAEP;AACA,kBAAkB;AAClB,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,oCAAoC;AACpE,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,8CAA8C;AACvE;AACA;AACA,6BAA6B,yBAAyB;AACtD,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC5XA,8BAA8B,mBAAO,CAAC,qFAA0E;;AAEhH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,GAAG;AACrB,4BAA4B,GAAG;AAC/B,sBAAsB,GAAG;AACzB,sBAAsB,GAAG;AACzB,uBAAuB,GAAG;AAC1B,0BAA0B,GAAG;AAC7B,yBAAyB,GAAG;AAC5B,2BAA2B,GAAG;AAC9B,2BAA2B,GAAG;AAC9B,6BAA6B,GAAG;AAChC,4BAA4B,GAAG;AAC/B,4BAA4B,GAAG;AAC/B,uBAAuB,GAAG;AAC1B,0BAA0B,GAAG;AAC7B,2BAA2B,GAAG;AAC9B,0BAA0B,GAAG;AAC7B,2BAA2B,GAAG;AAC9B,6BAA6B,GAAG;AAChC,iCAAiC,GAAG;AACpC,4BAA4B,GAAG;AAC/B,4BAA4B,GAAG;AAC/B;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA,6BAA6B,2CAA2C;AACxE;AACA;AACA,8BAA8B,+BAA+B;AAC7D,OAAO;;AAEP;AACA,kBAAkB;AAClB,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,oCAAoC;AACpE,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACnaA,kCAAkC,mBAAO,CAAC,yFAA8E;;AAExH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,GAAG;AACrB,gCAAgC,GAAG;AACnC,0BAA0B,GAAG;AAC7B,2BAA2B,GAAG;AAC9B,sBAAsB,GAAG;AACzB,2BAA2B,GAAG;AAC9B,+BAA+B,GAAG;AAClC,4BAA4B,GAAG;AAC/B,8BAA8B,GAAG;AACjC,4BAA4B,GAAG;AAC/B,+BAA+B,GAAG;AAClC,+BAA+B,GAAG;AAClC,+BAA+B,GAAG;AAClC,6BAA6B,GAAG;AAChC,iCAAiC,GAAG;AACpC,mCAAmC,GAAG;AACtC,uBAAuB,GAAG;AAC1B,4BAA4B,GAAG;AAC/B,0BAA0B,GAAG;AAC7B,gCAAgC,GAAG;AACnC,iCAAiC,GAAG;AACpC,gCAAgC,GAAG;AACnC;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA,6BAA6B,2CAA2C;AACxE;AACA;AACA,8BAA8B,+BAA+B;AAC7D,OAAO;;AAEP;AACA,kBAAkB;AAClB,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oCAAoC;AACvE,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC7bA,gCAAgC,mBAAO,CAAC,uFAA4E;;AAEpH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,GAAG;AACrB,+BAA+B,GAAG;AAClC,yBAAyB,GAAG;AAC5B,2BAA2B,GAAG;AAC9B,sBAAsB,GAAG;AACzB,6BAA6B,GAAG;;AAEhC,mCAAmC,GAAG;AACtC,4BAA4B,GAAG;AAC/B,uBAAuB,GAAG;AAC1B,mCAAmC,GAAG;AACtC,gCAAgC,GAAG;AACnC,4BAA4B,GAAG;AAC/B,uBAAuB,GAAG;;AAE1B,yBAAyB,GAAG;AAC5B;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA,6BAA6B,2CAA2C;AACxE;AACA;AACA,8BAA8B,+BAA+B;AAC7D,OAAO;;AAEP;AACA,kBAAkB;AAClB,OAAO;;AAEP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV,sDAAsD;AACtD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACrVA,oBAAoB,mBAAO,CAAC,uEAA4D;;AAExF;;AAEA;AACA;AACA,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sEAAsE,KAAK;AAC3E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,OAAO;AACP;AACA,iCAAiC,OAAO;AACxC;AACA;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C;AACA;AACA;AACA;AACA,wCAAwC,OAAO,OAAO,SAAS;AAC/D;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,mDAAmD,KAAK,OAAO,SAAS;AACxE;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC/EA,0BAA0B,mBAAO,CAAC,6EAAkE;;AAEpG;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,EAAE,YAAY;AACjC,UAAU;;AAEV,gCAAgC,GAAG,GAAG;AACtC;AACA;AACA;AACA;AACA,sDAAsD,MAAM;AAC5D;AACA;AACA,UAAU;AACV;AACA;AACA;;;;;;;;;;;AClCA;AACA,qDAAqD;AACrD,oDAAoD,mBAAO,CAAC,uFAA4E;;AAExI;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3BA,6BAA6B,mBAAO,CAAC,gFAAqE;;AAE1G;AACA;AACA;;AAEA;AACA;AACA;;AAEA,mDAAmD;AACnD;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5BA,sCAAsC,mBAAO,CAAC,yEAA8D;;AAE5G,oBAAoB,mBAAO,CAAC,oCAAyB;;AAErD;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,0CAA0C;AAC1C;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC7DA,uBAAuB,mBAAO,CAAC,uEAA4D;;AAE3F;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,GAAG;AACrB,sBAAsB,GAAG;AACzB,yBAAyB,GAAG;AAC5B;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,0BAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf,sBAAsB,MAAM;AAC5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,cAAc;AAC5B;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,4DAA4D,IAAI;AAChE,cAAc;AACd;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC7LA,8BAA8B,mBAAO,CAAC,iEAAsD;;AAE5F;;;;;;;;;;;ACFA,sCAAsC,mBAAO,CAAC,yEAA8D;;AAE5G;AACA;AACA;;;;;;;;;;;ACJA;AACA,qDAAqD;AACrD,sCAAsC,mBAAO,CAAC,wEAA8D;;AAE5G;AACA;AACA;;;;;;;;;;;ACNA,kCAAkC,mBAAO,CAAC,qEAA0D;;AAEpG;AACA;AACA;;;;;;;;;;;ACJA;AACA,qDAAqD;AACrD,6BAA6B,mBAAO,CAAC,gEAAqD;;AAE1F;;AAEA;;;;;;;;;;;ACNA,sCAAsC,mBAAO,CAAC,yEAA8D;;AAE5G;AACA;AACA;;;;;;;;;;;ACJA,kCAAkC,mBAAO,CAAC,qEAA0D;;AAEpG;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,mBAAO,CAAC,qCAA2B;AACpD,mBAAmB,+DAAmC;;AAEtD;;AAEA;AACA;AACA;;AAEA;AACA,+BAA+B,eAAe;AAC9C,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,uBAAuB,KAAK;AAC5B,0BAA0B,KAAK;AAC/B,wBAAwB,KAAK;AAC7B,mBAAmB,KAAK;AACxB,oBAAoB,KAAK;AACzB,uBAAuB,KAAK;AAC5B,uBAAuB,KAAK;AAC5B,oBAAoB,KAAK;AACzB;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA;;AAEA;AACA;AACA,WAAW;;AAEX;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA,iCAAiC,qBAAqB,GAAG,qBAAqB;;AAE9E,gBAAgB,GAAG,GAAG,qBAAqB;AAC3C;;AAEA;AACA;AACA;AACA,iDAAiD,IAAI;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,kBAAkB;AAClB,OAAO;;AAEP,wBAAwB,0CAA0C;;AAElE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC;AAChC,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,yCAAyC,OAAO;AAC3E,gBAAgB;;AAEhB;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,aAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,OAAO;AAChC,2BAA2B,OAAO;AAClC,0BAA0B,cAAc;AACxC,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,gDAAgD,mBAAmB;AACnE;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,gDAAgD,mBAAmB;AACnE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,GAAG;AACnB;;AAEA;AACA;AACA;AACA,0BAA0B,KAAK;AAC/B;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA,mBAAmB,kBAAkB;AACrC;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,iBAAiB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B;AAC/B;;AAEA;;AAEA;AACA;AACA,+BAA+B;AAC/B;;AAEA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iCAAiC,SAAS,IAAI,QAAQ;AACtD;AACA,4BAA4B,YAAY,SAAS,IAAI,QAAQ,GAAG;AAChE;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC10BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mBAAO,CAAC,0CAA+B;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,mBAAO,CAAC,6CAAkC;AAClE,uBAAuB,mBAAO,CAAC,+BAAqB;;AAEpD;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,kBAAkB;AAChC;AACA,cAAc,WAAW;AACzB,sBAAsB,WAAW;AACjC,eAAe,MAAM;AACrB;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA,kBAAkB,GAAG;AACrB,oBAAoB,GAAG;AACvB,qBAAqB,GAAG;AACxB;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,kBAAkB;AAChC;AACA,cAAc,WAAW;AACzB,cAAc,WAAW;AACzB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA,oDAAoD;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV,yBAAyB;AACzB;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,kBAAkB;AAChC;AACA,cAAc,WAAW;AACzB,cAAc,WAAW;AACzB,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA,0CAA0C;AAC1C,mCAAmC;;AAEnC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,IAAI;AACJ;;AAEA;;;;;;;;;;;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,mBAAO,CAAC,gDAAqC;;AAExE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;;;;;;;;;;;AC9EA,yBAAyB,mBAAO,CAAC,8CAAmC;;AAEpE;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,mBAAO,CAAC,6CAAkC;;AAElE;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0BAA0B,mBAAO,CAAC,+CAAoC;;AAEtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB,mBAAO,CAAC,8CAAmC;;AAEpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU,GAAG,SAAS;AAC1C,EAAE;AACF;AACA;AACA;AACA,mBAAmB,IAAI,GAAG,WAAW;AACrC,EAAE;AACF;AACA;AACA;AACA,mBAAmB,IAAI,GAAG,QAAQ;AAClC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG,IAAI;AACP,GAAG,QAAQ;AACX,GAAG;AACH;AACA;AACA;;AAEA,yBAAyB,mBAAO,CAAC,8CAAmC;;AAEpE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,mBAAO,CAAC,6CAAkC;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACnDA,mBAAmB,mBAAO,CAAC,2CAAgC;AAC3D,wBAAwB,8EAAkD;;AAE1E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sDAAsD;AACtD;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,yDAAyD,GAAG;AAC5D,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,gDAAgD,yBAAyB;AACzE;AACA;AACA;AACA;;AAEA,iCAAiC;AACjC,uBAAuB,SAAS,GAAG,UAAU,KAAK,IAAI;AACtD,4BAA4B,eAAe;AAC3C;AACA;;;;;;;;;;;ACnHA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;;AAEvF;AACA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;AACA;AACA;;;;;;;;;;;ACvBA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;;AAEvF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC3BA,2BAA2B,mBAAO,CAAC,gDAAqC;AACM;;AAE9E;AACA;;AAEiF;AACJ;;AAE7E;;AAEe;AACf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,8EAAuB;AACxC;;AAEA;AACA,+BAA+B,QAAQ;AACvC;;AAEA;AACA;AACA,mCAAmC,gFAAwB;AAC3D;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,qCAAqC,8EAAsB;;AAE3D;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,oBAAoB;AAC7D;AACA;AACA;AACA;;;;;;;;;;;AC/EA,wBAAwB,mBAAO,CAAC,6CAAkC;AAClE,6BAA6B,mBAAO,CAAC,iDAAsC;;AAE3E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,0BAA0B;AACnE;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,0BAA0B;AACnE;AACA;AACA;AACA;;;;;;;;;;;ACrNA,4BAA4B,mBAAO,CAAC,iDAAsC;AAC1E,iCAAiC,mBAAO,CAAC,qDAA0C;;AAEnF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;AChBA,2BAA2B,mBAAO,CAAC,gDAAqC;AACxE,gCAAgC,mBAAO,CAAC,oDAAyC;;AAEjF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;AChBA,qBAAqB,mBAAO,CAAC,2BAAgB;AAC7C,sCAAsC,mBAAO,CAAC,0DAA+C;;AAE7F;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AChBA,4BAA4B,mBAAO,CAAC,iDAAsC;AAC1E,iCAAiC,mBAAO,CAAC,qDAA0C;;AAEnF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;AChBA,2BAA2B,mBAAO,CAAC,gDAAqC;AACxE,gCAAgC,mBAAO,CAAC,oDAAyC;;AAEjF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;AChBA,0BAA0B,mBAAO,CAAC,+CAAoC;AACtE,+BAA+B,mBAAO,CAAC,mDAAwC;;AAE/E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,wCAAwC,yBAAyB;AACjE;AACA;;AAEA;AACA;AACA;AACA,2CAA2C,4BAA4B;AACvE;AACA;;AAEA;AACA;AACA;AACA,wCAAwC,yBAAyB;AACjE;AACA;AACA;AACA;;;;;;;;;;;ACzCA,uCAAuC,mBAAO,CAAC,4DAAiD;AAChG,4CAA4C,mBAAO,CAAC,gEAAqD;;AAEzG;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC9CuF;AACS;;AAEjF,sCAAsC,gFAA2B;AAChF;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA,iBAAiB,uFAAgC;AACjD;AACA;;;;;;;;;;;ACZA,4BAA4B,mBAAO,CAAC,iDAAsC;AAC1E,iCAAiC,mBAAO,CAAC,qDAA0C;;AAEnF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;;;;;;;;;;;;;;;;;;AC/ByE;AACS;;AAEnE,+BAA+B,yEAAoB;AAClE;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA,iBAAiB,gFAAyB;AAC1C;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AClCyE;AACS;;AAEnE,+BAA+B,yEAAoB;AAClE;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA,iBAAiB,gFAAyB;AAC1C;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClCA,2BAA2B,mBAAO,CAAC,gDAAqC;AACxE,gCAAgC,mBAAO,CAAC,oDAAyC;;AAEjF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,cAAc,QAAQ;AACtB;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1CA,yBAAyB,mBAAO,CAAC,8CAAmC;AACpE,8BAA8B,mBAAO,CAAC,kDAAuC;;AAE7E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,cAAc,QAAQ;AACtB;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;AACA;AACA;;;;;;;;;;;AC9BA,iCAAiC,mBAAO,CAAC,sDAA2C;AACpF,sCAAsC,mBAAO,CAAC,yDAA+C;;AAE7F;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,gCAAgC,mBAAO,CAAC,qDAA0C;AAClF;AACA,GAAG,qFAAyD;;AAE5D,qCAAqC,mBAAO,CAAC,yDAA8C;;AAE3F;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACrCA,+BAA+B,mBAAO,CAAC,mDAAyC;AAChF,oCAAoC,mBAAO,CAAC,wDAA6C;;AAEzF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;;AAEvF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,6BAA6B,mBAAO,CAAC,kDAAuC;AAC5E,kCAAkC,mBAAO,CAAC,sDAA2C;;AAErF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;AChBA,6BAA6B,mBAAO,CAAC,kDAAuC;AAC5E,kCAAkC,mBAAO,CAAC,sDAA2C;;AAErF;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrBA,6BAA6B,mBAAO,CAAC,iDAAuC;AAC5E,kCAAkC,mBAAO,CAAC,sDAA2C;;AAErF;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrBA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;;AAEvF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,kBAAkB;;AAElB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5CA,uBAAuB,mBAAO,CAAC,4CAAiC;AAChE,4BAA4B,mBAAO,CAAC,gDAAqC;AACzE,yBAAyB,mBAAO,CAAC,+BAAoB;AACrD,yBAAyB,mBAAO,CAAC,+BAAoB;AACrD,0BAA0B,mBAAO,CAAC,gCAAqB;AACvD,6BAA6B,mBAAO,CAAC,mCAAwB;AAC7D,iCAAiC,mBAAO,CAAC,uCAA4B;AACrE,0BAA0B,mBAAO,CAAC,gCAAqB;AACvD,uBAAuB,mBAAO,CAAC,6BAAkB;;AAEjD;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B,cAAc,UAAU;AACxB,cAAc,kBAAkB;AAChC,cAAc,kBAAkB;AAChC;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,+DAA+D;;AAE/D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,YAAY;AAC1B,cAAc,UAAU;AACxB,cAAc,QAAQ;AACtB;AACA,eAAe,SAAS;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B,6BAA6B,EAAE,aAAa;AACvE;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,8BAA8B,SAAS,IAAI,YAAY;AACvD;AACA,aAAa;;AAEb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,KAAK;AACtD,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iCAAiC,cAAc;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;;AAEA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACvkBA,6BAA6B,mBAAO,CAAC,kDAAuC;AAC5E,kCAAkC,mBAAO,CAAC,sDAA2C;;AAErF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,+BAA+B,mBAAO,CAAC,oDAAyC;AAChF,oCAAoC,mBAAO,CAAC,wDAA6C;;AAEzF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;AACvF;AACA,GAAG,qFAAyD;AAC5D;AACA,GAAG,sFAA0D;;AAE7D;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;AACb;AACA;AACA,qEAAqE;AACrE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACrGA,6BAA6B,mBAAO,CAAC,iDAAuC;AAC5E,kCAAkC,mBAAO,CAAC,sDAA2C;;AAErF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,iCAAiC,mBAAO,CAAC,sDAA2C;AACpF,sCAAsC,mBAAO,CAAC,0DAA+C;;AAE7F;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,2BAA2B,mBAAO,CAAC,gDAAqC;AACxE,gCAAgC,mBAAO,CAAC,mDAAyC;;AAEjF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACzCA,2BAA2B,mBAAO,CAAC,gDAAqC;AACxE,gCAAgC,mBAAO,CAAC,oDAAyC;;AAEjF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,6BAA6B,mBAAO,CAAC,kDAAuC;AAC5E,kCAAkC,mBAAO,CAAC,sDAA2C;;AAErF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,+BAA+B,mBAAO,CAAC,mDAAyC;AAChF,oCAAoC,mBAAO,CAAC,wDAA6C;;AAEzF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,qCAAqC,mBAAO,CAAC,0DAA+C;AAC5F,0CAA0C,mBAAO,CAAC,8DAAmD;;AAErG;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACdA,mCAAmC,mBAAO,CAAC,wDAA6C;AACxF,wCAAwC,mBAAO,CAAC,4DAAiD;;AAEjG;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACdA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;;AAEvF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,2BAA2B,mBAAO,CAAC,gDAAqC;AACxE,gCAAgC,mBAAO,CAAC,oDAAyC;;AAEjF;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACbA,mBAAmB,mBAAO,CAAC,yBAAc;;AAEzC;AACA;AACA;AACA,4BAA4B,QAAQ;AACpC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,OAAO;AACtC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;ACvCwE;;AAExE,wBAAwB,mBAAO,CAAC,6CAAkC;;AAEnD;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA,iBAAiB,2EAAoB;AACrC;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA,QAAQ;AACR;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,mDAAmD,+BAA+B;AAClF;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACzCA,uBAAuB,mBAAO,CAAC,4CAAiC;AACM;AACG;AACzE;AACA,GAAG,sFAA0D;;AAE9C;AACf;AACA,cAAc,KAAK;AACnB,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,0DAA0D;;AAE1D;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA,iBAAiB,0EAAmB;AACpC;;AAEA;AACA;AACA,mCAAmC,gFAAgB;AACnD;AACA,eAAe,QAAQ;AACvB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA;;AAE0C;;AAE3B,sCAAsC,mDAAO;AAC5D;AACA;;AAEA;AACA,yBAAyB,OAAO;AAChC,kBAAkB,OAAO;AACzB,OAAO;;AAEP;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,mCAAmC;AACpD,iBAAiB,qCAAqC;AACtD,iBAAiB,iCAAiC;AAClD,iBAAiB,mCAAmC;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,2BAA2B,2BAA2B;AACtD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA,iFAAiF,KAAK;AACtF;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC9OA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE0C;AACH;;AAEvC;;AAEe,wCAAwC,mDAAO;AAC9D;;AAEA;AACA;;AAEA;AACA,uBAAuB,OAAO;AAC9B,oBAAoB,OAAO;AAC3B,OAAO;;AAEP;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;;AAEV,4BAA4B,mDAAU;AACtC,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,cAAc;;AAE7D;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;;AAEA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,iBAAiB;AACjB;AACA;AACA,aAAa;AACb,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AChPA;AACA;AACA;AACA;AACA;AACA;;AAE0C;;AAE1C;;AAEe,uDAAuD,mDAAO;AAC7E;AACA;;AAEA;AACA,uBAAuB,OAAO;AAC9B,kBAAkB,OAAO;AACzB,kBAAkB,OAAO;AACzB,OAAO;;AAEP;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA,eAAe,OAAO,IAAI,YAAY;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,aAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,wCAAwC;AACzD,iBAAiB,yCAAyC;AAC1D;AACA;AACA;AACA;AACA,iBAAiB,+BAA+B;AAChD,iBAAiB,gCAAgC;AACjD;AACA;AACA;AACA;AACA;AACA,iBAAiB,+BAA+B;AAChD,iBAAiB,gCAAgC;AACjD;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+DAA+D,wBAAwB;AACvF;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+DAA+D,wBAAwB;AACvF;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,MAAM;AACpB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yCAAyC;;AAEzC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;;;;;;;;;;;ACtkBA,wBAAwB,mBAAO,CAAC,6CAAkC;AAClE,6BAA6B,mBAAO,CAAC,iDAAsC;;AAE3E;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC9BA,yBAAyB,mBAAO,CAAC,8CAAmC;AACpE,8BAA8B,mBAAO,CAAC,kDAAuC;;AAE7E;AACA,GAAG,sFAA0D;;AAE9C;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;AACA;AACA;;;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,8EAAkD;AAC1E,mBAAmB,mBAAO,CAAC,yBAAc;AACzC,yBAAyB,mBAAO,CAAC,+BAAoB;;AAErD;AACA;;AAEA;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV,sBAAsB,YAAY;AAClC;;AAEA,+CAA+C;AAC/C,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,kCAAkC,QAAQ,GAAG,MAAM,GAAG,MAAM;AAC5D;;AAEA;;AAEA;AACA,0CAA0C;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,yCAAyC,cAAc;;AAEvD;AACA;AACA;AACA;AACA;AACA;;AAEA,kDAAkD,cAAc;AAChE,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,kDAAkD,cAAc;AAChE,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kDAAkD,cAAc;AAChE,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB,kDAAkD,cAAc;AAChE,sBAAsB;AACtB;;AAEA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC/PA,wBAAwB,mBAAO,CAAC,6CAAkC;AAClE,6BAA6B,mBAAO,CAAC,iDAAsC;;AAE3E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxBA,yBAAyB,mBAAO,CAAC,8CAAmC;AACpE,8BAA8B,mBAAO,CAAC,kDAAuC;;AAE7E;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpBA,uBAAuB,mBAAO,CAAC,4CAAiC;AAChE,4BAA4B,mBAAO,CAAC,gDAAqC;;AAEzE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;AACA;AACA;;;;;;;;;;;AC5BA,uBAAuB,mBAAO,CAAC,4CAAiC;AAChE,4BAA4B,mBAAO,CAAC,gDAAqC;;AAEzE;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,8BAA8B,mBAAO,CAAC,mDAAwC;AAC9E,mCAAmC,mBAAO,CAAC,uDAA4C;;AAEvF;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACZA,uBAAuB,mBAAO,CAAC,4CAAiC;;AAEhE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC/DA,wBAAwB,mBAAO,CAAC,6CAAkC;AAClE,6BAA6B,mBAAO,CAAC,iDAAsC;;AAE3E;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,yBAAyB;AAC1E;AACA;AACA;AACA;;;;;;;;;;;AC7BA,iCAAiC,mBAAO,CAAC,sDAA2C;AACpF,sCAAsC,mBAAO,CAAC,0DAA+C;;AAE7F;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpBA,4BAA4B,mBAAO,CAAC,iDAAsC;AAC1E,iCAAiC,mBAAO,CAAC,qDAA0C;;AAEnF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACpBA,sBAAsB,mBAAO,CAAC,2CAAgC;;AAE9D,2BAA2B,mBAAO,CAAC,+CAAoC;;AAEvE;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;;;;;;;;;;AC9CA,uBAAuB,mBAAO,CAAC,4CAAiC;;AAEhE,4BAA4B,mBAAO,CAAC,gDAAqC;;AAEzE;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;;;;;;;;;;ACbA,yBAAyB,mBAAO,CAAC,8CAAmC;;AAEpE;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;;AAEA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC9BA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,oCAAoC,YAAY;AAChD;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,iBAAiB,iBAAiB;AAClC;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA,0CAA0C,aAAa;;AAEvD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kBAAkB,IAAI,SAAS,QAAQ;AACvC;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACrIA,wBAAwB,gEAAoC;AAC5D,oBAAoB,mBAAO,CAAC,8BAAmB;;AAE/C;AACA;AACA;AACA;AACA,oCAAoC,YAAY;AAChD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB,oBAAoB,UAAU;AAC9B;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,4CAA4C,IAAI;AAChD;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;;AAEtB;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA,mBAAmB;AACnB;AACA,4CAA4C,IAAI;AAChD;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;;AAEA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB;AAChB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,WAAW;AAClC;AACA,uBAAuB,UAAU;AACjC;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA,UAAU;;AAEV;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA;;AAEA,8BAA8B,cAAc;;AAE5C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,aAAa;AACb;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,0CAA0C,EAAE;AAC5C;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,uCAAuC;AACxD,iBAAiB,yCAAyC;AAC1D;AACA;AACA,iBAAiB,uCAAuC;AACxD,iBAAiB,yCAAyC;AAC1D;AACA;AACA,iBAAiB,yCAAyC;AAC1D,iBAAiB,+CAA+C;AAChE;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAmB;AAC5C,kDAAkD,OAAO,YAAY,QAAQ;AAC7E,gBAAgB;AAChB;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,0BAA0B;AACrC;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,GAAG;AACxE;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,kCAAkC,cAAc;;AAEhD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,mBAAmB,2BAA2B;AAC9C,qBAAqB,kBAAkB;AACvC;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB,WAAW,GAAG,eAAe;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;;AAEb;AACA,+BAA+B,UAAU,GAAG,WAAW,GAAG,eAAe;;AAEzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;;AAEnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,gBAAgB;;AAEhB;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,sCAAsC;AACtC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA,cAAc,qCAAqC;AACnD,UAAU;;AAEV;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sDAAsD;;AAEtD,mDAAmD;;AAEnD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6CAA6C,GAAG;AAChD;AACA;AACA,mCAAmC,SAAS;AAC5C;AACA,UAAU;AACV;AACA,sDAAsD,GAAG;AACzD;AACA;AACA,4CAA4C,cAAc;AAC1D;AACA,6CAA6C,GAAG;AAChD;AACA,6CAA6C,GAAG;AAChD,+CAA+C,GAAG;;AAElD;AACA;AACA,QAAQ;AACR,oDAAoD,iBAAiB;AACrE;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,4CAA4C,OAAO;AACnD,sCAAsC,QAAQ;AAC9C,4CAA4C,SAAS;AACrD,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,uBAAuB;AAC7C;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,4BAA4B;AAC7C;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,0BAA0B;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA,iCAAiC,GAAG;AACpC;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,2BAA2B,cAAc;AACzC;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,6CAA6C,iBAAiB;;AAE9D;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,4CAA4C,iBAAiB;;AAE7D;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,6BAA6B,+BAA+B;AAC5D,WAAW;;AAEX;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU,MAAM,MAAM,oBAAoB;AAC1C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,mBAAmB;AACnB;;AAEA;AACA,oDAAoD;;AAEpD;AACA;AACA;AACA,mBAAmB;AACnB,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0CAA0C,+BAA+B;AACzE;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;AAC5B;AACA,sBAAsB;;AAEtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;;AAEA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA,aAAa;;AAEb;AACA,4BAA4B,8BAA8B;AAC1D,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iDAAiD;AAClE;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;ACz3DgD;;AAEjC,sCAAsC,wDAAe;AACpE;AACA;AACA;AACA,qCAAqC,YAAY;AACjD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,6CAA6C;AAC7C;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gDAAgD,GAAG;AACnD;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA,0CAA0C,GAAG;AAC7C;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,eAAe,cAAc,EAAE,YAAY;AAC3C;AACA;AACA;AACA;AACA;AACA,kBAAkB,cAAc,kBAAkB,YAAY;AAC9D;AACA;AACA;AACA;AACA;AACA,kBAAkB,cAAc,cAAc,YAAY;AAC1D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,uBAAuB,mBAAmB,GAAG,OAAO;AACpD;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA,qCAAqC,OAAO;AAC5C;AACA,UAAU;AACV,kCAAkC,OAAO;AACzC;AACA,UAAU;AACV;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kCAAkC,cAAc;AAChD;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;AACb;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,+BAA+B;AAC5D;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,kBAAkB,wBAAwB,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AACrP,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB,mBAAmB;AACnB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gDAAgD,mBAAmB,GAAG,MAAM;AAC5E;AACA,mCAAmC,kCAAkC;AACrE,yBAAyB,WAAW,GAAG,qBAAqB;AAC5D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,UAAU;;AAE1C;AACA;AACA;;;;;;;;;;;AClhBA,sCAAsC,mBAAO,CAAC,4CAAiC;;AAE/E;AACA;AACA;AACA;AACA,mDAAmD,YAAY;AAC/D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,0CAA0C,uBAAuB,GAAG;AACpE;AACA,UAAU;AACV;AACA;AACA,oDAAoD,uBAAuB,GAAG;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACvDA,sCAAsC,mBAAO,CAAC,4CAAiC;;AAE/E;AACA;AACA;AACA;AACA,kDAAkD,YAAY;AAC9D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,0CAA0C,uBAAuB,GAAG;AACpE;AACA,UAAU;AACV;AACA;AACA;AACA,6CAA6C,uBAAuB,GAAG;AACvE;AACA;AACA;AACA,uDAAuD,uBAAuB,GAAG;AACjF;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACnDA,iCAAiC,mBAAO,CAAC,uCAA4B;;AAErE;AACA;AACA,+CAA+C,YAAY;AAC3D;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC7DA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,2CAA2C,YAAY;AACvD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,6BAA6B,wBAAwB;AAC9E;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACtDA,sCAAsC,mBAAO,CAAC,4CAAiC;;AAE/E;AACA;AACA;AACA;AACA,mDAAmD,YAAY;AAC/D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,0CAA0C,uBAAuB,GAAG;AACpE;AACA,UAAU;AACV;AACA;AACA,oDAAoD,uBAAuB,GAAG;AAC9E;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACtCA,sCAAsC,mBAAO,CAAC,4CAAiC;;AAE/E;AACA;AACA;AACA;AACA,kDAAkD,YAAY;AAC9D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,uBAAuB,GAAG;AAC/E;AACA;AACA,iDAAiD,uBAAuB,GAAG;AAC3E;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC7BA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,oCAAoC,YAAY;AAChD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,mDAAmD,cAAc;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,mDAAmD,cAAc;;AAEjE;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,0BAA0B;;AAE1B;;AAEA,iCAAiC;;AAEjC;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,gDAAgD,cAAc;;AAE9D;;AAEA;;AAEA;AACA,qCAAqC,cAAc;AACnD;;AAEA;AACA;AACA;;AAEA;;AAEA,gDAAgD,cAAc;;AAE9D;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;ACrTA;AACA;AACA;AACA;AAC6C;;AAE9B,8BAA8B,mDAAO;AACpD;AACA,gCAAgC,YAAY;;AAE5C;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA,uBAAuB,cAAc;AACrC,uBAAuB,QAAQ;AAC/B,uBAAuB,IAAI;AAC3B;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA,4BAA4B,cAAc;AAC1C,4BAA4B,QAAQ;AACpC,6BAA6B,IAAI;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpMA,iCAAiC,mBAAO,CAAC,uCAA4B;;AAErE;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,YAAY;AAC7D;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA,yBAAyB,aAAa;AACtC,yBAAyB,eAAe;AACxC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACtKgD;;AAEjC,+CAA+C,wDAAe;AAC7E;AACA;AACA;AACA,8CAA8C,YAAY;AAC1D;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kCAAkC,oBAAoB,OAAO,YAAY;AACzE;AACA;AACA,uBAAuB,yBAAyB;AAChD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA,oEAAoE;AACpE,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;;AAEA;AACA,iCAAiC,yBAAyB,EAAE,YAAY;AACxE;AACA;AACA;;AAEA;AACA;AACA;;AAEA,2BAA2B,wBAAwB;AACnD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,kCAAkC;AAC7D;AACA;AACA;AACA;;;;;;;;;;;AC3IA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA,mDAAmD,YAAY;;AAE/D;AACA;;AAEA;AACA,uBAAuB,eAAe;AACtC;AACA,UAAU;AACV;;AAEA;AACA,uBAAuB,eAAe;AACtC;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,+CAA+C;AAC/C;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2DAA2D,YAAY;;AAEvE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B,QAAQ,GAAG,OAAO;;AAE7C;;AAEA;AACA;AACA,4BAA4B,0BAA0B,6BAA6B,oCAAoC;AACvH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;;;;;;;;;;;AC1LgD;AACY;AACgB;AACrD;;AAER,wCAAwC,wDAAe;AACtE;AACA;AACA;AACA,uCAAuC,YAAY;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA,yDAAyD;AACzD;;AAEA;AACA;;AAEA,UAAU;AACV;AACA,oCAAoC,kEAAgB;AACpD,wCAAwC,yBAAyB;AACjE;AACA;AACA;AACA;AACA,OAAO;;AAEP,8BAA8B,gFAAkB;AAChD;AACA,0CAA0C,yBAAyB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,yBAAyB;AACrF;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,yBAAyB;AACnF;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,mDAAmD,yBAAyB;AAC5E;AACA;AACA,yCAAyC,oBAAoB;AAC7D;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB,iBAAiB;AACjB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB,uBAAuB;AACvB;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB;;AAElB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA,qCAAqC,oBAAoB,OAAO,YAAY;AAC5E;AACA;AACA,0BAA0B,yBAAyB;AACnD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA;AACA,uEAAuE;AACvE,gBAAgB;AAChB,aAAa;AACb;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,yBAAyB,EAAE,YAAY;AACtD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,QAAQ;AACR;AACA;AACA;;AAEA,2BAA2B,gCAAgC;AAC3D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA,WAAW,qDAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA,WAAW,qDAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,0BAA0B,yBAAyB;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,yBAAyB;AACjD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,yBAAyB;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AC3agD;AACjC,wCAAwC,wDAAe;AACtE;AACA;AACA;AACA,uCAAuC,YAAY;AACnD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACrDA,wBAAwB,gEAAoC;AAC5D,8BAA8B,mBAAO,CAAC,oCAAyB;AAC/D;AACA,GAAG,uFAA2D;;AAE9D;AACA;AACA;AACA;AACA,qCAAqC,YAAY;AACjD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,MAAM,EAAE,YAAY;AACnD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAM,EAAE,MAAM,EAAE,YAAY;AACtD;AACA;AACA;AACA,iCAAiC,MAAM,EAAE,MAAM,EAAE,YAAY;AAC7D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtYA,kCAAkC,mBAAO,CAAC,wCAA6B;;AAEvE;AACA;AACA;AACA;AACA,wDAAwD,YAAY;AACpE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iDAAiD,mBAAmB;AACpE;AACA,iBAAiB,EAAE,2DAA2D;;AAE9E;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACvCA,sBAAsB,mBAAO,CAAC,gCAAqB;AACnD,iCAAiC,mBAAO,CAAC,uCAA4B;;AAErE;AACA;AACA,gDAAgD,YAAY;AAC5D;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kCAAkC,8BAA8B,EAAE,YAAY;;AAE9E;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB,uEAAuE,eAAe,6BAA6B,OAAO,WAAW,UAAU,MAAM;AACrJ;;AAEA;AACA,oBAAoB;AACpB;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sDAAsD,WAAW;AACjE;;AAEA;AACA;AACA,yBAAyB;AACzB;AACA,kEAAkE,eAAe,WAAW,UAAU,cAAc,SAAS,UAAU,MAAM;AAC7I;AACA,sBAAsB;;AAEtB;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACnOA,kCAAkC,mBAAO,CAAC,wCAA6B;;AAEvE;AACA;AACA;AACA;AACA,uDAAuD,YAAY;AACnE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,YAAY;AAC9D;AACA,iBAAiB,EAAE,2DAA2D;;AAE9E;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA,uDAAuD,YAAY;AACnE;AACA,UAAU;AACV,6DAA6D,SAAS;;AAEtE;AACA;AACA;;;;;;;;;;;AC3CA,kCAAkC,mBAAO,CAAC,wCAA6B;;AAEvE;AACA;AACA;AACA;AACA,sDAAsD,YAAY;AAClE;;AAEA;AACA;AACA;AACA;;AAEA,6DAA6D;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,mBAAmB;AAClE;AACA,iBAAiB,EAAE,2DAA2D;;AAE9E;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,6DAA6D;AAC7D;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC1EA,kCAAkC,mBAAO,CAAC,wCAA6B;;AAEvE;AACA;AACA;AACA;AACA,qDAAqD,YAAY;AACjE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,mBAAmB,EAAE,WAAW;AAC9E;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA,cAAc,2BAA2B;AACzC;AACA;AACA;AACA,mCAAmC,wBAAwB,oCAAoC,wBAAwB,SAAS,KAAK,SAAS,MAAM,IAAI,UAAU,SAAS,kBAAkB;AAC7L,qBAAqB,SAAS;AAC9B;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACjEA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uCAAuC,YAAY;AACnD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA,gCAAgC;AAChC;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,4CAA4C,kBAAkB,kBAAkB;AAChF,oDAAoD,aAAa,mBAAmB,gBAAgB;;AAEpG;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA,oEAAoE;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA,mCAAmC,OAAO,yBAAyB;AACnE;AACA;;AAEA,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;;;;;;;;;;;AC1IA,kCAAkC,mBAAO,CAAC,wCAA6B;;AAEvE;AACA;AACA;AACA;AACA,oDAAoD,YAAY;AAChE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,mBAAmB,EAAE,WAAW;AAC7E;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC9BA,kCAAkC,mBAAO,CAAC,wCAA6B;;AAEvE;AACA;AACA;AACA;AACA,oDAAoD,YAAY;AAChE;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,mCAAmC,eAAe;AAClD;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,SAAS,IAAI,KAAK;AACpD;AACA,mBAAmB;;AAEnB;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;;AAEA;AACA,8GAA8G,OAAO,WAAW,IAAI,KAAK;AACzI,UAAU;;AAEV;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC5FA,sBAAsB,mBAAO,CAAC,wDAA6C;AAC3E,oBAAoB,mBAAO,CAAC,oEAAyD;AACrF,mBAAmB,mBAAO,CAAC,gDAAqC;AAChE,cAAc,mBAAO,CAAC,wCAA6B;AACnD,eAAe,mBAAO,CAAC,uBAAY;;AAEnC,uBAAuB,mBAAO,CAAC,4CAAiC;AAChE,qBAAqB,mBAAO,CAAC,yCAA+B;AAC5D,sBAAsB,mBAAO,CAAC,gCAAqB;;AAEnD,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,wCAAwC,YAAY;AACpD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,wDAAwD,MAAM,EAAE,YAAY;AAC5E;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,6CAA6C,YAAY,GAAG,WAAW;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B;;AAE/B;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;;AAE5B;AACA,yBAAyB;;AAEzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA,sBAAsB;AACtB,gBAAgB;AAChB;AACA,UAAU;;AAEV;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,gBAAgB,iBAAiB,oCAAoC;;AAErE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B,aAAa;;AAE1C;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;;AAEA;AACA;AACA,aAAa;;AAEb;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mEAAmE,uBAAuB,sBAAsB,GAAG,SAAS;;AAE5H;AACA;;AAEA;AACA;;AAEA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,gDAAgD;AAChD,iBAAiB;AACjB;;AAEA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA,4BAA4B,KAAK;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,wDAAwD;;AAExD,8EAA8E;;AAE9E;;AAEA,+CAA+C;AAC/C;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA,cAAc;AACd;;AAEA;;AAEA;AACA;AACA;;AAEA,wEAAwE;;AAExE;;AAEA,yCAAyC;AACzC;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iDAAiD,EAAE;AACnD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;;AAE/D;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,sCAAsC,aAAa;AACnD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB,aAAa;AACb,uBAAuB;AACvB,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;;;;;;;;;;ACr2BA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA,oDAAoD,YAAY;AAChE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,yCAAyC,QAAQ;AACjD;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,yCAAyC,QAAQ;AACjD;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,wCAAwC,QAAQ;AAChD;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA,0EAA0E;;AAE1E;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC;;AAEhC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;;;;;;;;;;;AC9OA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA,sDAAsD,YAAY;AAClE;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACdA,wBAAwB,gEAAoC;AAC5D,uBAAuB,mBAAO,CAAC,8BAAmB;AAClD,0BAA0B,mBAAO,CAAC,iCAAsB;AACxD,yBAAyB,mBAAO,CAAC,gCAAqB;AACtD,0BAA0B,mBAAO,CAAC,iCAAsB;AACxD,uBAAuB,mBAAO,CAAC,8BAAmB;;AAElD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB,aAAa,GAAG,KAAK;AAC1C;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;;AAEV;;AAEA;AACA;;AAEA,2CAA2C;AAC3C;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,iBAAiB;AAC9E;AACA,4BAA4B;AAC5B;AACA,0BAA0B;AAC1B;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb,UAAU;AACV,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sCAAsC,cAAc;AACpD;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yCAAyC,iBAAiB,KAAK;AAC/D;;AAEA;AACA;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;;AAEV;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,4CAA4C;;AAE5C;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACzkBA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,YAAY;AACpD;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,uDAAuD,iBAAiB;;AAExE;AACA;AACA;AACA,UAAU;AACV;;AAEA,4CAA4C;AAC5C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA,oBAAoB,OAAO;AAC3B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAY,GAAG,UAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,eAAe,YAAY,GAAG,WAAW;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc,GAAG,SAAS;AACjD;AACA,UAAU;;AAEV;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,6BAA6B,cAAc;AAC3C;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,+DAA+D;;AAE/D;;AAEA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,kEAAkE,EAAE;AACpE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,mDAAmD,EAAE;AACrD;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;;AAEA;AACA,wBAAwB,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,mBAAmB;AACxF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kCAAkC,cAAc;AAChD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACjqBA,gCAAgC,mBAAO,CAAC,qCAA2B;AACnE,qBAAqB,mBAAO,CAAC,yCAA+B;AAC5D,0BAA0B,mBAAO,CAAC,kEAAuD;;AAEzF;;AAEA;AACA;AACA;AACA;AACA,oDAAoD,YAAY;AAChE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mEAAmE,eAAe,kBAAkB,WAAW,yBAAyB,wBAAwB,iBAAiB,oBAAoB,eAAe,+BAA+B,cAAc;AACjQ;AACA,mEAAmE,kBAAkB,uBAAuB,mBAAmB,aAAa,WAAW,qBAAqB,wBAAwB,iBAAiB,oBAAoB,eAAe,WAAW,cAAc;AACjR;;AAEA;AACA;;AAEA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA,gDAAgD,2BAA2B;AAC3E;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,2BAA2B;AAC3B;;AAEA;AACA;AACA,uDAAuD;AACvD,uDAAuD;AACvD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,qBAAqB;AACrB;;AAEA;AACA,wBAAwB,cAAc,EAAE,WAAW,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB;AAC3G;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC3LA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA,wDAAwD,YAAY;AACpE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACvHA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,qCAAqC,YAAY;AACjD,yBAAyB,cAAc;AACvC;AACA;;AAEA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,wCAAwC;AACxC;AACA,mDAAmD;AACnD;;AAEA;;AAEA;AACA;AACA,2BAA2B,WAAW,UAAU,WAAW,EAAE,UAAU;AACvE;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA,qBAAqB,WAAW,EAAE,kBAAkB,EAAE,UAAU;AAChE;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;ACpGA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA,kDAAkD,YAAY;AAC9D;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,8BAA8B;AAC3D,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC,sBAAsB;AACxD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,+BAA+B,sBAAsB;AACrD;AACA;AACA,UAAU;AACV;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrKA,gCAAgC,mBAAO,CAAC,qCAA2B;AACnE,wBAAwB,mBAAO,CAAC,2DAAgD;;AAEhF;AACA;AACA;AACA;AACA,oDAAoD,YAAY;;AAEhE;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACxBA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,YAAY;AACrD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,4BAA4B;AAC/C;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;;AAER;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,0DAA0D,kBAAkB,WAAW,yBAAyB,wBAAwB,iBAAiB,mBAAmB,gCAAgC,YAAY;AACxN;AACA,oDAAoD,wBAAwB,IAAI,uBAAuB,mBAAmB,aAAa,WAAW,yBAAyB,wBAAwB,iBAAiB,mBAAmB,IAAI,YAAY;AACvP;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,uCAAuC,cAAc;AACrD;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC3HA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA,4DAA4D,YAAY;AACxE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,gDAAgD,SAAS;AACzD;;AAEA;;AAEA;AACA,4DAA4D,eAAe,WAAW,UAAU,cAAc,OAAO,UAAU,KAAK;AACpI;AACA,gBAAgB;;AAEhB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC3FA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA,0DAA0D,YAAY;AACtE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gDAAgD,WAAW;AAC3D;;AAEA;AACA,4DAA4D,eAAe,WAAW,UAAU,cAAc,SAAS,UAAU,YAAY;AAC7I;;AAEA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;;;;;;;;;;ACzEA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA;AACA;AACA,qDAAqD,YAAY;AACjE;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,iCAAiC,cAAc,OAAO,kBAAkB;AACxE;AACA,iBAAiB,EAAE,0BAA0B;;AAE7C;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChFA,gCAAgC,mBAAO,CAAC,qCAA2B;;AAEnE;AACA;AACA,kDAAkD,YAAY;AAC9D;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,0DAA0D,kBAAkB,WAAW,yBAAyB,wBAAwB,iBAAiB,mBAAmB,+BAA+B,cAAc;AACzN;AACA,6DAA6D,uBAAuB,mBAAmB,aAAa,WAAW,yBAAyB,wBAAwB,iBAAiB,mBAAmB,WAAW,cAAc;AAC7O;;AAEA;;AAEA;;AAEA,0BAA0B,cAAc;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iDAAiD,SAAS;;AAE1D;AACA;AACA,8BAA8B;AAC9B;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;AC3EgD;;AAEjC,mCAAmC,wDAAe;AACjE;AACA;AACA;AACA,kCAAkC,YAAY;AAC9C;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU,UAAU,SAAS,SAAS;AACtC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,cAAc,qCAAqC;AACnD;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,0BAA0B,2BAA2B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,UAAU;AACV,yBAAyB,6BAA6B;AACtD,wBAAwB;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,cAAc,iDAAiD;AAC/D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kEAAkE,kCAAkC;AACpG;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kEAAkE,kCAAkC;AACpG;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACzkBgD;AACK;AACa;AACN;;AAE7C,kCAAkC,wDAAe;AAChE;AACA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA;AACA;;AAEA,gCAAgC,KAAK;AACrC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA,yDAAyD;AACzD;;AAEA;AACA;AACA;AACA,UAAU,IAAI;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA,6BAA6B,8DAAa;AAC1C;AACA,UAAU;AACV;;AAEA,0CAA0C,kEAAsB;AAChE;AACA;AACA;AACA;;AAEA,6CAA6C,kEAAgB;AAC7D;AACA;AACA;AACA,OAAO;AACP,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA,aAAa;AACb;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,UAAU,QAAQ,aAAa,aAAa,GAAG,cAAc;AAC7D;AACA;;AAEA;AACA;;AAEA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,UAAU;AACnC,sBAAsB,UAAU;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA,mBAAmB,UAAU;AAC7B;AACA,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,kCAAkC;AACpE;;AAEA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,cAAc;AACd;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,kCAAkC;AAClC,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,cAAc;AAC1D;;AAEA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA,cAAc,KAAK;AACnB,mBAAmB,eAAe,UAAU;AAC5C,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mBAAmB;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA,mBAAmB;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,sBAAsB;;AAEtB;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,wCAAwC,qBAAqB;AAC7D,+BAA+B,kBAAkB,IAAI,QAAQ;AAC7D;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;;AAEpB,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,gBAAgB;AAChB,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB;AACnB,oBAAoB,wEAAwE;;AAE5F;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,mBAAmB;AACnB,WAAW;AACX,QAAQ;;AAER;;AAEA;;AAEA;AACA,mCAAmC;AACnC;AACA;AACA;;AAEA;;AAEA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uDAAuD,EAAE;AACzD;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B;AAC5B,8BAA8B;AAC9B;AACA;AACA;AACA,yBAAyB;AACzB,OAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA,4CAA4C;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,iBAAiB,KAAK;AAClE;;AAEA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sCAAsC,IAAI;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,sCAAsC;AACtC;AACA;;AAEA;AACA,UAAU,OAAO;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,6CAA6C;AACnE;AACA,kDAAkD,kBAAkB;AACpE,mBAAmB,wBAAwB;AAC3C,UAAU;AACV;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,wBAAwB;AAC3C,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2CAA2C;AAC9D,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,kBAAkB;AAC5D,mBAAmB,wBAAwB;AAC3C,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2CAA2C,mBAAmB;AAC9D,mBAAmB,wBAAwB;AAC3C,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B;AAC9B;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA,gBAAgB,QAAQ,GAAG,uCAAuC;AAClE;;AAEA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA,2CAA2C,eAAe;;AAE1D;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,yCAAyC,oBAAoB;;AAE7D;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA,WAAW;AACX;AACA,iDAAiD,kBAAkB,eAAe,gBAAgB;AAClG;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV,QAAQ;AACR;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACr2EA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,kCAAkC,YAAY;AAC9C,yBAAyB,WAAW;AACpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,iBAAiB;AACjB;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,+BAA+B,kBAAkB,YAAY,gBAAgB,WAAW,eAAe;AACvG;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AClDA,wBAAwB,gEAAoC;AAC5D,wBAAwB,mBAAO,CAAC,yCAA8B;;AAE9D;AACA;AACA;AACA;AACA,mCAAmC,YAAY;AAC/C;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,gDAAgD,uBAAuB,iCAAiC;AACzH;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,4DAA4D,UAAU;AACtE;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,cAAc;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,cAAc;AACd;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,kCAAkC,SAAS;AAC3C,kCAAkC,SAAS;AAC3C,kCAAkC,SAAS;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChkBA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA,+CAA+C,YAAY;AAC3D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;ACxDA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA,gDAAgD,YAAY;;AAE5D,wDAAwD,KAAK;;AAE7D;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,UAAU;AACV,6BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACxEA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,iCAAiC,YAAY;AAC7C,yBAAyB,UAAU;AACnC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACnDA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,qDAAqD;AAC1E;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA,QAAQ;AACR;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,yBAAyB,gBAAgB,EAAE,SAAS,EAAE,aAAa;AACnE;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC3PA,wBAAwB,gEAAoC;;AAE5D;AACA;;AAEA;AACA;AACA;AACA;AACA,wCAAwC,YAAY;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,kCAAkC,0BAA0B,IAAI,IAAI;AACpE,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8OAGL;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA,6CAA6C,WAAW;AACxD;AACA,aAAa;;AAEb;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B,aAAa;AACvC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;AACb,UAAU;;AAEV;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,+BAA+B,0BAA0B;AACzD;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,6BAA6B,aAAa,GAAG,WAAW;AACxD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ,qCAAqC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB;AACxB;AACA,gBAAgB,qCAAqC;AACrD;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA,oDAAoD,UAAU;AAC9D;;AAEA;AACA,0CAA0C,uBAAuB;AACjE;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gBAAgB,gCAAgC;AAChD;;AAEA;AACA;AACA;AACA;AACA,OAAO,QAAQ,0CAA0C;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,qCAAqC;AAClD;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,0BAA0B,IAAI,WAAW;AACrD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,4BAA4B;AAClD;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC3sBA,wBAAwB,gEAAoC;AAC5D,yBAAyB,mBAAO,CAAC,8CAAmC;AACpE,uBAAuB,mBAAO,CAAC,4CAAiC;AAChE,sBAAsB,mBAAO,CAAC,2CAAgC;AAC9D;AACA;AACA;AACA;AACA;AACA,kCAAkC,YAAY;AAC9C,yBAAyB,WAAW;AACpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA,sBAAsB;;AAEtB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;;;;;;;;;;AC/HA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,0CAA0C,YAAY;AACtD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAqB;AACrB;;AAEA;AACA;;AAEA,qBAAqB;AACrB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;;AAEA;AACA;;AAEA,yCAAyC,aAAa;;AAEtD;;AAEA;AACA;;AAEA;;AAEA;AACA,aAAa;;AAEb;;AAEA,qBAAqB;AACrB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;;AAEA;AACA;;AAEA,kDAAkD,IAAI;;AAEtD;;AAEA;AACA;;AAEA;;AAEA;AACA,aAAa;;AAEb;;AAEA,qBAAqB;AACrB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,mBAAmB;;AAEnB;AACA;;AAEA,qBAAqB;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA,aAAa;;AAEb;AACA;;AAEA;;AAEA;AACA;AACA;AACA,+BAA+B,KAAK,GAAG,KAAK,GAAG;AAC/C;AACA,mBAAmB;AACnB;AACA,aAAa;;AAEb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sCAAsC,MAAM,GAAG,2BAA2B;AAC1E,sCAAsC,MAAM;AAC5C;;AAEA;AACA;AACA;AACA,sCAAsC,MAAM,GAAG,2BAA2B;AAC1E,sCAAsC,MAAM;AAC5C;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yCAAyC,MAAM,mBAAmB,MAAM;AACxE,0CAA0C,MAAM;AAChD;;AAEA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA,2DAA2D;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC,mBAAmB;AACnB,aAAa;;AAEb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB,GAAG,gBAAgB;AACtE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,2CAA2C,wBAAwB,GAAG,wBAAwB;;AAE9F;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;;AAEhB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA,gBAAgB;AAChB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mCAAmC;AACnC;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,kCAAkC,oBAAoB;AACtD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;;AAEhB,sCAAsC;AACtC,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,6BAA6B;;AAE7B,sBAAsB,kBAAkB;;AAExC;AACA;AACA,2BAA2B,kBAAkB,GAAG,WAAW;;AAE3D;AACA;AACA;AACA;AACA;AACA,kCAAkC,IAAI;AACtC;AACA;AACA;AACA,kCAAkC,IAAI;AACtC;AACA;AACA;AACA,iBAAiB;AACjB,cAAc;;AAEd;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,UAAU;;AAEV;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC99BA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,sCAAsC,YAAY;AAClD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,mBAAmB,IAAI;AACvB,sBAAsB,4BAA4B,EAAE,aAAa;AACjE,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA,iBAAiB,6DAA6D;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,iBAAiB;AACrE,mBAAmB;AACnB,gBAAgB;AAChB,iBAAiB;AACjB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,iCAAiC;AACjC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,sCAAsC;AACnE;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,kCAAkC,iCAAiC;AACnE;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C,aAAa,KAAK,GAAG;AAChE;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC3VA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,gCAAgC,YAAY;AAC5C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,QAAQ;AACjC;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,0BAA0B;;AAE/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA,4BAA4B;AAC5B,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA,4BAA4B;AAC5B,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,8DAA8D,UAAU,IAAI,QAAQ,kDAAkD,aAAa;AACnJ,iEAAiE;AACjE;AACA;;AAEA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;;AAEA;AACA;;AAEA;AACA;AACA,sCAAsC,iBAAiB;AACvD;;AAEA;AACA;AACA;AACA,4CAA4C,iBAAiB;AAC7D;;AAEA;AACA,sCAAsC,eAAe;AACrD;;AAEA;AACA;AACA;AACA,0CAA0C,eAAe;AACzD;;AAEA;AACA;AACA,yCAAyC,QAAQ;AACjD;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,2BAA2B,GAAG,QAAQ;AACrE;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,QAAQ;AAC9D;;AAEA;;AAEA;AACA;AACA,8CAA8C,WAAW,EAAE,SAAS,EAAE,YAAY;AAClF;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;;AAEA,4CAA4C,QAAQ;;AAEpD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,WAAW;AACX;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,wDAAwD,cAAc;;AAEtE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA,gCAAgC,OAAO;AACvC;AACA,OAAO;AACP;AACA;;;;;;;;;;;AChkBA,wBAAwB,gEAAoC;;AAE5D;AACA;AACA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;ACrE6C;;AAE9B,6BAA6B,mDAAO;AACnD;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACnG8C;AACK;AACE;;AAErD;;AAEe,oCAAoC,uDAAc;AACjE;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,OAAO;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV,0CAA0C;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6BAA6B;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA,mCAAmC,OAAO;AAC1C;AACA,oCAAoC,OAAO;AAC3C;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,wBAAwB,EAAE,UAAU;AACjF,0DAA0D,wDAAwD,OAAO;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA,yBAAyB;AACzB,uBAAuB;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,wDAAwD,sBAAsB;AAC9E,2DAA2D;AAC3D,mEAAmE;AACnE;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC,0DAAgB;AACrD,qCAAqC,2DAAiB;AACtD;AACA;;AAEA;AACA;AACA,qCAAqC,0DAAgB;AACrD;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D,yCAAyC;AACzC,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;;AAEA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;;AAEA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AChY4D;;AAE5D;;AAEe,qCAAqC,8DAAqB;AACzE;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,OAAO;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,6BAA6B;AAC7B,aAAa;AACb,UAAU;;AAEV,0CAA0C;AAC1C;AACA,0CAA0C;;AAE1C;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;AAChB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,SAAS,IAAI,QAAQ;AACvD,sBAAsB;AACtB;AACA,gBAAgB;AAChB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6BAA6B;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sCAAsC,OAAO;AAC7C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;ACjKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,UAAU;AAC7B;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAO,CAAC,4BAAiB;AACG;AACiB;;AAE/D;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,gDAAgD,sEAAe;AAC/D;AACA;AACA,oBAAoB;AACpB;AACA;;AAEe,uCAAuC,uDAAc;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA,mDAAmD,mBAAmB;AACtE,UAAU;AACV;AACA;;AAEA;AACA,YAAY,mBAAmB;AAC/B;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,gCAAgC;;AAEhC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA,+CAA+C,YAAY;AAC3D,0CAA0C,eAAe;AACzD;AACA;;;;;;;;;;;;;;;;;;AClhB8C;AACiB;;AAE/D;;AAEA,8CAA8C,sEAAe;AAC7D;AACA;AACA,oBAAoB;;AAEpB;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEe,qCAAqC,uDAAc;AAClE;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK,YAAY,OAAO;AACtC,cAAc,OAAO;AACrB,cAAc,MAAM;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO,GAAG,IAAI,GAAG,iBAAiB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,oBAAoB,iBAAiB;AACrC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA,oBAAoB,KAAK,YAAY,OAAO;AAC5C,oBAAoB,OAAO;AAC3B,oBAAoB,MAAM;AAC1B;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB;AACA,cAAc,iDAAiD;AAC/D,gBAAgB,iDAAiD;AACjE,gBAAgB,iDAAiD;AACjE,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA,oBAAoB;;AAEpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB,UAAU;;AAEV;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA,aAAa,eAAe;AAC5B,aAAa;AACb;;AAEA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;;;;;;;;;;AC7WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mBAAO,CAAC,sDAA2C;;AAE9E;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA,4CAA4C;;AAE5C,gCAAgC;AAChC;AACA,oCAAoC,2BAA2B;AAC/D,OAAO;;AAEP,kCAAkC;AAClC;AACA;AACA;;AAEA,6BAA6B;;AAE7B,iCAAiC;AACjC;;AAEA,4BAA4B;;AAE5B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO,GAAG,IAAI,GAAG,iBAAiB;AACrD;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;;AAEb;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA,0BAA0B;AAC1B;AACA;;AAEA;AACA;;AAEA,0CAA0C;AAC1C;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gEAAgE;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,UAAU;;AAEV;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,yCAAyC;AACzC;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA,gCAAgC;;AAEhC;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC1dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,YAAY;AAC1B;AACA;AACA;;AAEA,+BAA+B;;AAE/B;;AAEA,4BAA4B;;AAE5B,4BAA4B;AAC5B,kDAAkD;;AAElD,sCAAsC;AACtC;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,8BAA8B,OAAO,GAAG,IAAI;AAC5C;;AAEA;AACA;AACA;AACA,uBAAuB,sBAAsB,GAAG,YAAY;AAC5D,OAAO;;AAEP,uBAAuB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,YAAY,MAAM;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB;AACA,cAAc,iDAAiD;AAC/D,gBAAgB,iDAAiD;AACjE,gBAAgB,iDAAiD;AACjE,gBAAgB;AAChB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE,2BAA2B,cAAc;AACzC,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,kBAAkB,4BAA4B;AAC3E;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,uBAAuB,OAAO;AAC9B,mBAAmB,OAAO;AAC1B,6BAA6B,OAAO;;AAEpC,oBAAoB,OAAO;AAC3B,kBAAkB,OAAO;;AAEzB,oBAAoB,OAAO;AAC3B,iBAAiB,OAAO;AACxB,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,0BAA0B,4BAA4B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,sBAAsB;AACtB;AACA,mBAAmB;AACnB;AACA,yBAAyB,4BAA4B;AACrD;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,uBAAuB,iBAAiB;AACxC;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA,UAAU;;AAEV;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA,YAAY,eAAe;AAC3B,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB,UAAU;;AAEV;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACpZA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mBAAO,CAAC,6BAAkB;AACjD,mBAAmB,mBAAO,CAAC,wBAAc;;AAEzC,2BAA2B,mBAAO,CAAC,+DAAoD;AACvF,4BAA4B,mBAAO,CAAC,wEAA6D;AACjG,4BAA4B,mBAAO,CAAC,wEAA6D;AACjG,4BAA4B,mBAAO,CAAC,wEAA6D;;AAEjG;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mBAAO,CAAC,6BAAkB;AACjD,mBAAmB,mBAAO,CAAC,wBAAc;;AAEzC,2BAA2B,mBAAO,CAAC,uEAA4D;AAC/F,sBAAsB,mBAAO,CAAC,kEAAuD;AACrF,uBAAuB,mBAAO,CAAC,mEAAwD;AACvF,uBAAuB,mBAAO,CAAC,mEAAwD;AACvF,oBAAoB,mBAAO,CAAC,+DAAqD;AACjF,kBAAkB,mBAAO,CAAC,6DAAmD;;AAE7E;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAY;AAC3B;AACA,wCAAwC,YAAY;AACpD,yCAAyC,YAAY;AACrD,yCAAyC,YAAY;AACrD,sCAAsC,YAAY;AAClD,oCAAoC,YAAY;AAChD;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAO,CAAC,4DAAiD;;AAEjF;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,yBAAyB,KAAK;AAC9B,yBAAyB,YAAY;AACrC,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA,+BAA+B;;AAE/B;AACA;AACA;;AAEA;AACA;;AAEA;AACA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,wBAAwB;AACxB;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,mBAAO,CAAC,4DAAiD;;AAE/G;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yCAAyC;AACzC;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,yBAAyB,KAAK;AAC9B,yBAAyB,YAAY;AACrC,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;AACb,OAAO;AACP;AACA;;;;;;;;;;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,mBAAO,CAAC,4CAAiC;;AAE/E;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,mBAAO,CAAC,4CAAiC;AAC/E,uBAAuB,mBAAO,CAAC,qDAA0C;AACzE,2BAA2B,mBAAO,CAAC,uDAA4C;;AAE/E;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,8BAA8B;AAC9B;;AAEA,mCAAmC;AACnC;;AAEA,+BAA+B;;AAE/B,4BAA4B;AAC5B,+BAA+B;AAC/B;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;AACA,eAAe,OAAO,IAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,2BAA2B,SAAS;AACpC,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA,6CAA6C;;AAE7C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;;AAElB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,gBAAgB;AAChB;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,+BAA+B;;AAE/B;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,yBAAyB,KAAK;AAC9B,yBAAyB,YAAY;AACrC,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,4BAA4B;;AAE5B;AACA;AACA;AACA,iBAAiB,IAAI;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,gBAAgB;;AAEhB,yCAAyC,iBAAiB,MAAM;AAChE;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB,GAAG,aAAa;AAClE;AACA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB,oBAAoB,KAAK;AACzB;AACA,uDAAuD;AACvD;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,6BAA6B,kBAAkB;AAC/C;AACA;;AAEA,gCAAgC;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,UAAU,GAAG;AACb,OAAO,GAAG;AACV;;AAEA;AACA;AACA;AACA,cAAc,KAAK,0BAA0B;AAC7C;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxhBA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;;AAEtD;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iCAAiC;;AAEjC,0BAA0B;AAC1B;AACA,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV,uBAAuB;AACvB;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;AACP;AACA;;;;;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;;AAEtD;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iCAAiC;;AAEjC,0BAA0B;AAC1B;AACA,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB,OAAO;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV,uBAAuB;;AAEvB;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA,OAAO;AACP;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;AC1JA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;AACtD,uBAAuB,mBAAO,CAAC,qDAA0C;AACzE,qBAAqB,mBAAO,CAAC,mDAAwC;;AAErE;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+BAA+B;;AAE/B,0BAA0B;AAC1B;AACA,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB,mBAAmB,OAAO;AAC1B,kBAAkB,OAAO;AACzB,+BAA+B,OAAO;AACtC,sBAAsB,OAAO;AAC7B,qBAAqB,OAAO;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,gCAAgC;AAChC,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,+BAA+B,qCAAqC,GAAG;AACvE;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;;AAEb;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D,mCAAmC;AACnC,gDAAgD,mBAAmB;AACnE,4CAA4C,iBAAiB;;AAE7D;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wBAAwB;AACjD;AACA,4BAA4B,wBAAwB;AACpD,4BAA4B,0BAA0B;AACtD,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,0BAA0B,yCAAyC;AACnE,0BAA0B,qCAAqC;AAC/D;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA,qDAAqD,oBAAoB;;AAEzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA,gDAAgD,eAAe;AAC/D;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA,UAAU;;AAEV;AACA,sCAAsC,YAAY,0CAA0C,YAAY;AACxG,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,SAAS,GAAG,eAAe;AAC9D,sCAAsC,cAAc,GAAG,SAAS,GAAG,YAAY;AAC/E,uBAAuB;AACvB,oCAAoC,eAAe;AACnD,sCAAsC,cAAc,GAAG,QAAQ;AAC/D;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,MAAM,GAAG,KAAK;AAChD,qCAAqC,SAAS,GAAG,QAAQ;AACzD,yBAAyB;AACzB,sBAAsB;AACtB;AACA,aAAa;;AAEb;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,wCAAwC,IAAI,EAAE,YAAY;;AAE1D;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,mBAAmB,KAAK;AACxB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,kCAAkC;AAClC;;AAEA;AACA,6BAA6B;AAC7B;AACA;AACA;;AAEA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,EAAE,SAAS;AAC5D;;AAEA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;ACvuBA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;;AAEtD;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iCAAiC;;AAEjC,0BAA0B;AAC1B;AACA,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B,OAAO;AACjC;;AAEA;AACA,eAAe,uDAAuD;;AAEtE;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,QAAQ;AACzC,8BAA8B;AAC9B,6BAA6B,QAAQ;AACrC,8BAA8B,OAAO;AACrC;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;;AAEA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;ACxQA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;;AAEtD;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iCAAiC;;AAEjC,0BAA0B;AAC1B;AACA,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV,uBAAuB;;AAEvB;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;AACP;AACA;;;;;;;;;;;AC/FA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;;AAEtD;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iCAAiC;;AAEjC,0BAA0B;AAC1B;AACA,YAAY;AACZ;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB,OAAO;AAC5B;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV,uBAAuB;;AAEvB;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA,yBAAyB,+CAA+C;AACxE;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;;;;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAO,CAAC,gCAAqB;;AAEtD;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA,gCAAgC;;AAEhC,0BAA0B;AAC1B;AACA,YAAY;AACZ;;AAEA,4BAA4B;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,OAAO,GAAG,IAAI,GAAG,iBAAiB;AACrD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;;AAEA;AACA,UAAU;;AAEV;AACA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;;AAEb;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;;AAEb;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA,wCAAwC,gBAAgB;AACxD;;AAEA;AACA,UAAU;;AAEV;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,2BAA2B;AAC3B,8BAA8B;AAC9B,UAAU;;AAEV;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA,wDAAwD;;AAExD;AACA;AACA;AACA,oBAAoB;AACpB;AACA,wDAAwD;AACxD;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,2CAA2C;;AAE3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC,4BAA4B;AACrE,aAAa;;AAEb;AACA;AACA,iBAAiB,iDAAiD;AAClE;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,iCAAiC;AACxE,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;;AAErC;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA,+BAA+B;;AAE/B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA,4CAA4C,4BAA4B;AACxE,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,qBAAqB;AAChE;AACA;AACA;AACA;;AAEA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,qBAAqB;AAChE;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,oBAAoB;AACpB,gEAAgE;AAChE,sCAAsC;AACtC;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA,oBAAoB;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC;AAChC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D,4CAA4C;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,eAAe,WAAW;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oFAAoF;;AAEpF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC;AAClC,gCAAgC;AAChC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF;;AAEvF;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,UAAU;AACV,UAAU;AACV;;AAEA;AACA;AACA,cAAc,KAAK;AACnB,eAAe;AACf;AACA;;AAEA;AACA,oDAAoD;AACpD;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,gBAAgB;AAChB;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc,MAAM;AACpB;AACA;;AAEA,oCAAoC;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA,OAAO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;;;AC70CA;AACA;AACA;AACA;AACA;;AAE4C;AACF;AACd;;AAE5B,iEAAe;AACf;AACA;AACA;AACA,gBAAgB,qDAAY;AAC5B;AACA,aAAa,sDAAa;AAC1B,IAAI;AACJ,UAAU,8CAAK;AACf,CAAC,EAAC;;;;;;;;;;;;;;;;ACnBF;AACA;AACA;AACA;;AAEA;;AAEA,iEAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC,EAAC;;;;;;;;;;;;;;;;ACtDF;AACA;AACA;AACA;;AAEA;;AAEA,iEAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC,EAAC;;;;;;;;;;;;;;;;ACpDF,iEAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAC;;;;;;;;;;;ACrxBF,aAAa,GAAG,IAAsD,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ACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,EAAE,GAAG;AAC1B;AACA,OAAO;AACP,0CAA0C;AAC1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,EAAE,GAAG;AAC1B;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qCAAqC;AACzD,UAAU;AACV;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,OAAO;;AAEP,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,kBAAkB,EAAC;;;;;;;;;;;;;;;;;;;ACnNlC;AACA;AACA;AACA;AACA;AACA,mBAAmB,uDAA8B;AACF;AACP;AACY;AACpD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU,MAAM;AAChB;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,UAAU,KAAK;AACf;AACA;;AAEA;AACA,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,WAAW;;AAErB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,0DAAiB;AACpD;;AAEA;AACA;AACA,mCAAmC,oDAAW;AAC9C;AACA;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA,6CAA6C,MAAM;AACnD;AACA;AACA;AACA;AACA,YAAY,0DAAW;AACvB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB,KAAK;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA,0BAA0B,cAAc;AACxC;AACA,oBAAoB;AACpB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA,aAAa;AACb,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,OAAO;AACP;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,aAAa,EAAC;;;;;;;;;;;;;;;;ACthB7B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,uDAA8B;AACjD;;AAEA,YAAY,UAAU;AACtB;AACA,YAAY,eAAe;;AAE3B;;AAEA;;AAEA,eAAe,mBAAO,CAAC,uCAA6B;AACpD;;AAEA;AACA,MAAM;AACN;;AAEA;AACA;AACA,UAAU,SAAS;;AAEnB;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA,UAAU,QAAQ;AAClB;;AAEA;AACA,UAAU,KAAK;AACf;;AAEA;AACA,UAAU,SAAS;AACnB;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,cAAc,WAAW;AACzB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB;AACA,cAAc,KAAK;AACnB;AACA;AACA,iCAAiC;AACjC;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa,MAAM;AACnB;AACA,aAAa,OAAO,EAAE;AACtB,4CAA4C,sBAAsB;AAClE;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,gBAAgB,QAAQ,WAAW;AACpE;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mCAAmC;AACnC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,mCAAmC;AACnC,mCAAmC;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,yBAAyB;;AAEzB;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,eAAe,EAAE,WAAW;AAChE;AACA,oBAAoB;AACpB;AACA;AACA,2BAA2B,YAAY,EAAE,8BAA8B;AACvE;AACA,0BAA0B,EAAE,WAAW;AACvC;AACA;AACA;AACA;AACA,oCAAoC,eAAe,EAAE,WAAW;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C,gBAAgB;AAChB;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,WAAW,EAAC;;;;;;;;;;;;;;;;;;AC7Y3B;AACA;AACA;AACA;AACA;;AAE+C;AACP;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,iCAAiC,KAAK,iBAAiB,OAAO;AAC9D,QAAQ;AACR;AACA,uBAAuB,KAAK,EAAE,sBAAsB,GAAG,OAAO;AAC9D;AACA;AACA;AACA,KAAK;AACL,8BAA8B,KAAK,GAAG,OAAO;AAC7C;;AAEA;AACA;AACA,wBAAwB,WAAW,GAAG,IAAI;AAC1C;AACA;;AAEA;AACA,gBAAgB,mBAAmB;AACnC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA,WAAW,KAAK;AAChB;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA,gCAAgC,oDAAW;AAC3C;AACA,UAAU,SAAS;;AAEnB;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B,KAAK;AAClC,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,gBAAgB,KAAK,cAAc,GAAG;AACjF;AACA;AACA,2CAA2C;AAC3C;AACA;;AAEA;AACA,wBAAwB,0DAAW,SAAS,GAAG;AAC/C;AACA,mCAAmC,OAAO;AAC1C,yBAAyB;AACzB;AACA,wBAAwB,0DAAW,YAAY,GAAG;AAClD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,GAAG;AACjD,SAAS,0DAAW;AACpB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;AACb,UAAU;AACV,QAAQ;AACR;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA,gBAAgB,MAAM;AACtB;AACA,gBAAgB,MAAM;AACtB;AACA,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;;AAEzB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oDAAoD,OAAO;AAC3D;AACA;AACA;;AAEA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB,0DAAW,sBAAsB,iBAAiB;AACpE;AACA,kBAAkB,0DAAW;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,kBAAkB,0DAAW;AAC7B;AACA;AACA;AACA,UAAU;AACV,OAAO;AACP;AACA;;AAEA,iEAAe,iBAAiB,EAAC;;;;;;;;;;;;;;;;;AClUjC,mBAAmB,uDAA8B;;AAEJ;;AAE7C;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAU,WAAW;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wDAAY;AACxC,WAAW;AACX,4BAA4B,wDAAY;AACxC;;AAEA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,aAAa,EAAC;;;;;;;;;;;;;;;;ACpD7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,uDAA8B;;AAEjD;AACA;AACA;;AAEA;AACA,UAAU,eAAe;AACzB;AACA;AACA;AACA;;AAEA;AACA,UAAU,WAAW;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oCAAoC;AACpC;AACA;AACA,OAAO;AACP;;AAEA,4BAA4B;AAC5B;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA,iEAAe,kBAAkB,EAAC;;;;;;;;;;;;;;;;;ACrElC,mBAAmB,uDAA8B;;AAER;;AAEzC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,yDAAM;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,YAAY,EAAC;;;;;;;;;;;ACtD5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C;AAC9C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;;;;;;;;;;;AClEA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;;AAEA;AACA;AACA,GAAG,mBAAO,CAAC,yBAAc;AACzB,GAAG,mBAAO,CAAC,0BAAe;AAC1B,GAAG,mBAAO,CAAC,6BAAkB;AAC7B,GAAG,mBAAO,CAAC,uBAAY;AACvB,GAAG,mBAAO,CAAC,uBAAY;AACvB,GAAG,mBAAO,CAAC,2BAAgB;AAC3B,GAAG,mBAAO,CAAC,gCAAqB;AAChC,GAAG,mBAAO,CAAC,4BAAiB;AAC5B,GAAG,8DAAkC;AACrC,GAAG,mBAAO,CAAC,yBAAc;AACzB,GAAG,mBAAO,CAAC,2BAAgB;AAC3B,GAAG,mBAAO,CAAC,yBAAc;AACzB,GAAG,wDAA4B;AAC/B,GAAG,mBAAO,CAAC,0BAAe;AAC1B,GAAG,mBAAO,CAAC,0BAAe;AAC1B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;;;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,uBAAuB,QAAQ;;AAE/B;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;;;;;;;;;;AChEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;AACA;AACA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACuD;AACxC,yCAAyC,0DAAqB;AAC7E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,cAAc,cAAc,QAAQ,+RAI7B;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,cAAc;;AAEd;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,UAAU,QAAQ;AAChC,gBAAgB,QAAQ;AACxB;AACA,6BAA6B,eAAe,IAAI,oBAAoB;AACpE;AACA,yBAAyB,mBAAmB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD,6BAA6B;AAC7B,6BAA6B,UAAU;AACvC;AACA;AACA;AACA,wDAAwD,IAAI;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,QAAQ,IAAI,2BAA2B;AAC1G;AACA;AACA;AACA,6CAA6C,QAAQ,IAAI,SAAS;AAClE,mBAAmB;AACnB;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,QAAQ,IAAI,IAAI;AAC9D,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,2BAA2B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;;;;;;;;;;;ACpVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mBAAO,CAAC,+BAAoB;AAC1D;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,OAAO,QAAQ,+RAItB;AACP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb,gBAAgB;AAChB,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA,gBAAgB,mBAAO,CAAC,gDAAqC;AAC7D;AACA,iBAAiB,IAAI;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,eAAe;AACtC,aAAa;AACb;AACA;AACA,qBAAqB,UAAU;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;;;;;;;;;;;AClCA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,uBAAuB,QAAQ;;AAE/B;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uCAAuC;AAChE;AACA,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;ACvHA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,uBAAuB,QAAQ;;AAE/B;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACuD;AACxC,8BAA8B,0DAAqB;AAClE;AACA;AACA;;AAEA;AACA;;AAEA,YAAY,wTAGL;AACP;AACA;AACA;;;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,iDAAiD;AACjD;AACA,gBAAgB;;AAEhB;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;;;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB,cAAc,QAAQ;;AAEtB;;AAEA;;AAEA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC1EA;;;;;;;;;;ACAA;;;;;;;;;;ACAA","sources":["webpack://ab_platform_web/./node_modules/moment/locale/ sync ^\\.\\/.*$","webpack://ab_platform_web/./AppBuilder/ABFactory.js","webpack://ab_platform_web/./AppBuilder/_factory_utils/Dialog.js","webpack://ab_platform_web/./AppBuilder/core/ABApplicationCore.js","webpack://ab_platform_web/./AppBuilder/core/ABApplicationMobileCore.js","webpack://ab_platform_web/./AppBuilder/core/ABDataCollectionCore.js","webpack://ab_platform_web/./AppBuilder/core/ABDefinitionCore.js","webpack://ab_platform_web/./AppBuilder/core/ABFactoryCore.js","webpack://ab_platform_web/./AppBuilder/core/ABFieldManager.js","webpack://ab_platform_web/./AppBuilder/core/ABHintCore.js","webpack://ab_platform_web/./AppBuilder/core/ABIndexCore.js","webpack://ab_platform_web/./AppBuilder/core/ABMLClassCore.js","webpack://ab_platform_web/./AppBuilder/core/ABModelCore.js","webpack://ab_platform_web/./AppBuilder/core/ABObjectApiCore.js","webpack://ab_platform_web/./AppBuilder/core/ABObjectApiNetsuiteCore.js","webpack://ab_platform_web/./AppBuilder/core/ABObjectCore.js","webpack://ab_platform_web/./AppBuilder/core/ABObjectQueryCore.js","webpack://ab_platform_web/./AppBuilder/core/ABProcessCore.js","webpack://ab_platform_web/./AppBuilder/core/ABStepCore.js","webpack://ab_platform_web/./AppBuilder/core/ABViewManagerCore.js","webpack://ab_platform_web/./AppBuilder/core/ABViewManagerMobileCore.js","webpack://ab_platform_web/./AppBuilder/core/FilterComplexCore.js","webpack://ab_platform_web/./AppBuilder/core/RowFilterCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldAutoIndexCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldBooleanCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldCalculateCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldCombineCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldConnectCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldDateCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldDateTimeCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldEmailCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldFileCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldFormulaCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldImageCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldJsonCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldListCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldLongTextCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldNumberCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldStringCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldTextFormulaCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldTreeCore.js","webpack://ab_platform_web/./AppBuilder/core/dataFields/ABFieldUserCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobilePageCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewCustomCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormButtonCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormCheckboxCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormConnectCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormCustomCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormDateCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormDatetimeCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormEmailCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormFileCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormFormulaCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormImageCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormItemCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormNumberCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormReadonlyCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormSelectMultipleCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormSelectSingleCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewFormTextboxCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewLabelCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewListCore.js","webpack://ab_platform_web/./AppBuilder/core/mobile/ABMobileViewTimelineCore.js","webpack://ab_platform_web/./AppBuilder/core/process/ABProcessLaneCore.js","webpack://ab_platform_web/./AppBuilder/core/process/ABProcessParticipantCore.js","webpack://ab_platform_web/./AppBuilder/core/process/ABProcessTaskManager.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessElementCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessEndCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessGatewayExclusiveCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskEmailCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceAccountingBatchProcessingCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceAccountingFPCloseCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceAccountingFPYearCloseCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceAccountingJEArchiveCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceApiCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceCalculateCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceGetResetPasswordUrlCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceInsertRecordCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskServiceQueryCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskSubProcessCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskUserApprovalCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskUserCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskUserExternalCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTaskUserFormCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTriggerCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTriggerLifecycleCore.js","webpack://ab_platform_web/./AppBuilder/core/process/tasks/ABProcessTriggerTimerCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLFindCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLManagerCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLRootObjectCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLRow.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLRowPluckCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLRowSaveCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLRowUpdateCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLSet.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLSetFirstCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLSetPluckCore.js","webpack://ab_platform_web/./AppBuilder/core/ql/ABQLSetSaveCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewCSVExporterCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewCSVImporterCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewCarouselCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewChartAreaCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewChartBarCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewChartCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewChartLineCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewChartPieCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewCommentCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewConditionalContainerCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewConnectDataFilterCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewContainerCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDataFilterCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDataSelectCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDataviewCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailCheckboxCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailConnectCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailCustomCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailImageCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailItemCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailTextCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDetailTreeCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewDocxBuilderCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormButtonCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormCheckboxCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormConnectCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormCustomCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormDatepickerCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormItemCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormJsonCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormNumberCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormReadonlyCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormSelectMultipleCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormSelectSingleCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormTextboxCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewFormTreeCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewGanttCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewGridCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewImageCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewKanbanCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewLabelCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewLayoutCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewListCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewMenuCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewPDFImporterCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewPageCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewPivotCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewReportsManagerCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewSchedulerCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewTabCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewTextCore.js","webpack://ab_platform_web/./AppBuilder/core/views/ABViewWidgetCore.js","webpack://ab_platform_web/./AppBuilder/platform/ABApplication.js","webpack://ab_platform_web/./AppBuilder/platform/ABApplicationMobile.js","webpack://ab_platform_web/./AppBuilder/platform/ABClassManager.js","webpack://ab_platform_web/./AppBuilder/platform/ABComponent.js","webpack://ab_platform_web/./AppBuilder/platform/ABDataCollection.js","webpack://ab_platform_web/./AppBuilder/platform/ABDefinition.js","webpack://ab_platform_web/./AppBuilder/platform/ABEmitter.js","webpack://ab_platform_web/./AppBuilder/platform/ABHint.js","webpack://ab_platform_web/./AppBuilder/platform/ABIndex.js","webpack://ab_platform_web/./AppBuilder/platform/ABMLClass.js","webpack://ab_platform_web/./AppBuilder/platform/ABModel.js","webpack://ab_platform_web/./AppBuilder/platform/ABModelApi.js","webpack://ab_platform_web/./AppBuilder/platform/ABModelApiNetsuite.js","webpack://ab_platform_web/./AppBuilder/platform/ABModelQuery.js","webpack://ab_platform_web/./AppBuilder/platform/ABObject.js","webpack://ab_platform_web/./AppBuilder/platform/ABObjectApi.js","webpack://ab_platform_web/./AppBuilder/platform/ABObjectApiNetsuite.js","webpack://ab_platform_web/./AppBuilder/platform/ABObjectExternal.js","webpack://ab_platform_web/./AppBuilder/platform/ABObjectImport.js","webpack://ab_platform_web/./AppBuilder/platform/ABObjectQuery.js","webpack://ab_platform_web/./AppBuilder/platform/ABProcess.js","webpack://ab_platform_web/./AppBuilder/platform/ABStep.js","webpack://ab_platform_web/./AppBuilder/platform/ABViewManager.js","webpack://ab_platform_web/./AppBuilder/platform/ABViewManagerMobile.js","webpack://ab_platform_web/./AppBuilder/platform/CSVImporter.js","webpack://ab_platform_web/./AppBuilder/platform/FilterComplex.js","webpack://ab_platform_web/./AppBuilder/platform/RowFilter.js","webpack://ab_platform_web/./AppBuilder/platform/RowUpdater.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABField.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldAutoIndex.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldBoolean.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldCalculate.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldCombine.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldConnect.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldDate.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldDateTime.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldEmail.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldFile.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldFormula.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldImage.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldJson.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldList.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldLongText.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldNumber.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldSelectivity.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldString.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldTextFormula.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldTree.js","webpack://ab_platform_web/./AppBuilder/platform/dataFields/ABFieldUser.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobilePage.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileView.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewCustom.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewForm.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormButton.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormCheckbox.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormConnect.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormCustom.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormDate.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormDatetime.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormEmail.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormFile.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormFormula.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormImage.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormItem.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormNumber.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormReadonly.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormSelectMultiple.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormSelectSingle.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewFormTextbox.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewLabel.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewList.js","webpack://ab_platform_web/./AppBuilder/platform/mobile/ABMobileViewTimeline.js","webpack://ab_platform_web/./AppBuilder/platform/plugins/ABClassUIPlugin.js","webpack://ab_platform_web/./AppBuilder/platform/plugins/ABModelPlugin.js","webpack://ab_platform_web/./AppBuilder/platform/plugins/ABObjectPlugin.js","webpack://ab_platform_web/./AppBuilder/platform/plugins/ABPropertiesObjectPlugin.js","webpack://ab_platform_web/./AppBuilder/platform/plugins/ABUIPlugin.js","webpack://ab_platform_web/./AppBuilder/platform/plugins/ABViewComponentPlugin.js","webpack://ab_platform_web/./AppBuilder/platform/plugins/ABViewEditorPlugin.js","webpack://ab_platform_web/./AppBuilder/platform/plugins/ABViewPlugin.js","webpack://ab_platform_web/./AppBuilder/platform/plugins/ABViewPropertiesPlugin.js","webpack://ab_platform_web/./AppBuilder/platform/process/ABProcessLane.js","webpack://ab_platform_web/./AppBuilder/platform/process/ABProcessParticipant.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessElement.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessEnd.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessGatewayExclusive.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskEmail.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskService.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceAccountingBatchProcessing.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceAccountingFPClose.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceAccountingFPYearClose.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceAccountingJEArchive.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceApi.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceCalculate.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceGetResetPasswordUrl.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceInsertRecord.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskServiceQuery.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskSubProcess.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskUser.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskUserApproval.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskUserExternal.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTaskUserForm.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTrigger.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTriggerLifecycle.js","webpack://ab_platform_web/./AppBuilder/platform/process/tasks/ABProcessTriggerTimer.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQL.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLFind.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLManager.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLRootObject.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLRowPluck.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLRowSave.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLRowUpdate.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLSetFirst.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLSetPluck.js","webpack://ab_platform_web/./AppBuilder/platform/ql/ABQLSetSave.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABView.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewCSVExporter.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewCSVImporter.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewCarousel.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewChart.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewChartArea.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewChartBar.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewChartContainer.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewChartLine.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewChartPie.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewComment.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewConditionalContainer.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewConnectDataFilter.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewContainer.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDataFilter.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDataSelect.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDataview.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetail.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailCheckbox.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailConnect.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailCustom.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailImage.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailItem.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailText.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDetailTree.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewDocxBuilder.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewForm.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormButton.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormCheckbox.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormConnect.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormCustom.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormDatepicker.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormItem.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormJson.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormNumber.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormReadonly.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormSelectMultiple.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormSelectSingle.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormTextbox.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormTree.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewFormURL.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewGantt.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewGrid.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewGridPopupExport.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewGridPopupMassUpdate.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewGridPopupSortFields.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewImage.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewKanban.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewKanbanFormSidePanel.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewLabel.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewLayout.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewList.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewMenu.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewPDFImporter.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewPage.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewPivot.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewReportsManager.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewScheduler.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewTab.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewText.js","webpack://ab_platform_web/./AppBuilder/platform/views/ABViewWidget.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewCSVExporterComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewCSVImporterComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewCarouselComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewChartAreaComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewChartBarComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewChartComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewChartContainerComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewChartLineComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewChartPieComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewCommentComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewConditionalContainerComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewConnectDataFilterComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewContainerComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDataFilterComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDataSelectComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDataviewComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailCheckboxComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailConnectComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailCustomComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailImageComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailItemComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailTextComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDetailTreeComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewDocxBuilderComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormButtonComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormCheckboxComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormConnectComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormCustomComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormDatepickerComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormItemComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormJsonComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormNumberComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormReadonlyComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormSelectMultipleComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormSelectSingleComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormTextboxComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewFormTreeComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewGanttComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewGridComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewImageComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewKanbanComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewLabelComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewLayoutComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewListComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewMenuComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewPDFImporterComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewPivotComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewReportsManagerComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewSchedulerComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewTabComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewComponent/ABViewTextComponent.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewProperties/ABViewProperty.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewProperties/ABViewPropertyAddPage.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewProperties/ABViewPropertyEditPage.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewProperties/ABViewPropertyFilterData.js","webpack://ab_platform_web/./AppBuilder/platform/views/viewProperties/ABViewPropertyLinkPage.js","webpack://ab_platform_web/./AppBuilder/rules/ABViewQueryBuilderObjectFieldConditions.js","webpack://ab_platform_web/./AppBuilder/rules/ABViewRule.js","webpack://ab_platform_web/./AppBuilder/rules/ABViewRuleAction.js","webpack://ab_platform_web/./AppBuilder/rules/ABViewRuleList.js","webpack://ab_platform_web/./AppBuilder/rules/ABViewRuleListFormRecordRules.js","webpack://ab_platform_web/./AppBuilder/rules/ABViewRuleListFormSubmitRules.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormRecordRuleInsertConnected.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormRecordRuleRemoveConnected.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormRecordRuleUpdate.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormRecordRuleUpdateConnected.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormSubmitRuleClosePopup.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormSubmitRuleConfirmMessage.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormSubmitRuleEmail.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormSubmitRuleExistPage.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormSubmitRuleParentPage.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionFormSubmitRuleWebsite.js","webpack://ab_platform_web/./AppBuilder/rules/ruleActions/ABViewRuleActionObjectUpdater.js","webpack://ab_platform_web/./AppBuilder/uiSettings/config.js","webpack://ab_platform_web/./AppBuilder/uiSettings/configDesktop.js","webpack://ab_platform_web/./AppBuilder/uiSettings/configMobile.js","webpack://ab_platform_web/./AppBuilder/uiSettings/icons.js","webpack://ab_platform_web/./js/docxtemplater-image-module.v3.0.2.min.js","webpack://ab_platform_web/./js/docxtemplater.v3.0.12.min.js","webpack://ab_platform_web/./js/jszip.min.js","webpack://ab_platform_web/./resources/Account.js","webpack://ab_platform_web/./resources/Multilingual.js","webpack://ab_platform_web/./resources/Network.js","webpack://ab_platform_web/./resources/NetworkRest.js","webpack://ab_platform_web/./resources/NetworkRestSocket.js","webpack://ab_platform_web/./resources/Storage.js","webpack://ab_platform_web/./resources/StorageLocal.js","webpack://ab_platform_web/./resources/Tenant.js","webpack://ab_platform_web/./webix_custom_components/activelist.js","webpack://ab_platform_web/./webix_custom_components/countfooter.js","webpack://ab_platform_web/./webix_custom_components/customComponentManager.js","webpack://ab_platform_web/./webix_custom_components/datetimepicker.js","webpack://ab_platform_web/./webix_custom_components/editlist.js","webpack://ab_platform_web/./webix_custom_components/edittree.js","webpack://ab_platform_web/./webix_custom_components/editunitlist.js","webpack://ab_platform_web/./webix_custom_components/focusableTemplate.js","webpack://ab_platform_web/./webix_custom_components/formioBuilder.js","webpack://ab_platform_web/./webix_custom_components/formioPreview.js","webpack://ab_platform_web/./webix_custom_components/lazyComponent.js","webpack://ab_platform_web/./webix_custom_components/numbertext.js","webpack://ab_platform_web/./webix_custom_components/thaicalendar.js","webpack://ab_platform_web/./webix_custom_components/timepicker.js","webpack://ab_platform_web/./webix_custom_components/tinyMce.js","webpack://ab_platform_web/./webix_custom_components/totalfooter.js","webpack://ab_platform_web/./webix_custom_components/treesuggest.js","webpack://ab_platform_web/ignored|/home/runner/work/ab_service_web/ab_service_web/ab_platform_web/node_modules/image-size/dist/types|fs","webpack://ab_platform_web/ignored|/home/runner/work/ab_service_web/ab_service_web/ab_platform_web/node_modules/image-size/dist|fs","webpack://ab_platform_web/ignored|/home/runner/work/ab_service_web/ab_service_web/ab_platform_web/node_modules/image-size/dist|path"],"sourcesContent":["var map = {\n\t\"./af\": 19183,\n\t\"./af.js\": 19183,\n\t\"./ar\": 31035,\n\t\"./ar-dz\": 47214,\n\t\"./ar-dz.js\": 47214,\n\t\"./ar-kw\": 40830,\n\t\"./ar-kw.js\": 40830,\n\t\"./ar-ly\": 68899,\n\t\"./ar-ly.js\": 68899,\n\t\"./ar-ma\": 77258,\n\t\"./ar-ma.js\": 77258,\n\t\"./ar-ps\": 19121,\n\t\"./ar-ps.js\": 19121,\n\t\"./ar-sa\": 64096,\n\t\"./ar-sa.js\": 64096,\n\t\"./ar-tn\": 97826,\n\t\"./ar-tn.js\": 97826,\n\t\"./ar.js\": 31035,\n\t\"./az\": 20051,\n\t\"./az.js\": 20051,\n\t\"./be\": 23813,\n\t\"./be.js\": 23813,\n\t\"./bg\": 64323,\n\t\"./bg.js\": 64323,\n\t\"./bm\": 57837,\n\t\"./bm.js\": 57837,\n\t\"./bn\": 75780,\n\t\"./bn-bd\": 25959,\n\t\"./bn-bd.js\": 25959,\n\t\"./bn.js\": 75780,\n\t\"./bo\": 81451,\n\t\"./bo.js\": 81451,\n\t\"./br\": 76480,\n\t\"./br.js\": 76480,\n\t\"./bs\": 91607,\n\t\"./bs.js\": 91607,\n\t\"./ca\": 23232,\n\t\"./ca.js\": 23232,\n\t\"./cs\": 91034,\n\t\"./cs.js\": 91034,\n\t\"./cv\": 54213,\n\t\"./cv.js\": 54213,\n\t\"./cy\": 95800,\n\t\"./cy.js\": 95800,\n\t\"./da\": 40739,\n\t\"./da.js\": 40739,\n\t\"./de\": 66951,\n\t\"./de-at\": 82181,\n\t\"./de-at.js\": 82181,\n\t\"./de-ch\": 61339,\n\t\"./de-ch.js\": 61339,\n\t\"./de.js\": 66951,\n\t\"./dv\": 16938,\n\t\"./dv.js\": 16938,\n\t\"./el\": 59573,\n\t\"./el.js\": 59573,\n\t\"./en-au\": 62458,\n\t\"./en-au.js\": 62458,\n\t\"./en-ca\": 51816,\n\t\"./en-ca.js\": 51816,\n\t\"./en-gb\": 8069,\n\t\"./en-gb.js\": 8069,\n\t\"./en-ie\": 15586,\n\t\"./en-ie.js\": 15586,\n\t\"./en-il\": 60009,\n\t\"./en-il.js\": 60009,\n\t\"./en-in\": 51207,\n\t\"./en-in.js\": 51207,\n\t\"./en-nz\": 83724,\n\t\"./en-nz.js\": 83724,\n\t\"./en-sg\": 1953,\n\t\"./en-sg.js\": 1953,\n\t\"./eo\": 1292,\n\t\"./eo.js\": 1292,\n\t\"./es\": 66328,\n\t\"./es-do\": 61452,\n\t\"./es-do.js\": 61452,\n\t\"./es-mx\": 94444,\n\t\"./es-mx.js\": 94444,\n\t\"./es-us\": 81285,\n\t\"./es-us.js\": 81285,\n\t\"./es.js\": 66328,\n\t\"./et\": 7181,\n\t\"./et.js\": 7181,\n\t\"./eu\": 62830,\n\t\"./eu.js\": 62830,\n\t\"./fa\": 19565,\n\t\"./fa.js\": 19565,\n\t\"./fi\": 85541,\n\t\"./fi.js\": 85541,\n\t\"./fil\": 65661,\n\t\"./fil.js\": 65661,\n\t\"./fo\": 26087,\n\t\"./fo.js\": 26087,\n\t\"./fr\": 25396,\n\t\"./fr-ca\": 96581,\n\t\"./fr-ca.js\": 96581,\n\t\"./fr-ch\": 81294,\n\t\"./fr-ch.js\": 81294,\n\t\"./fr.js\": 25396,\n\t\"./fy\": 12533,\n\t\"./fy.js\": 12533,\n\t\"./ga\": 55796,\n\t\"./ga.js\": 55796,\n\t\"./gd\": 50847,\n\t\"./gd.js\": 50847,\n\t\"./gl\": 60439,\n\t\"./gl.js\": 60439,\n\t\"./gom-deva\": 46514,\n\t\"./gom-deva.js\": 46514,\n\t\"./gom-latn\": 66525,\n\t\"./gom-latn.js\": 66525,\n\t\"./gu\": 34232,\n\t\"./gu.js\": 34232,\n\t\"./he\": 50915,\n\t\"./he.js\": 50915,\n\t\"./hi\": 22095,\n\t\"./hi.js\": 22095,\n\t\"./hr\": 10762,\n\t\"./hr.js\": 10762,\n\t\"./hu\": 88275,\n\t\"./hu.js\": 88275,\n\t\"./hy-am\": 73094,\n\t\"./hy-am.js\": 73094,\n\t\"./id\": 27769,\n\t\"./id.js\": 27769,\n\t\"./is\": 99676,\n\t\"./is.js\": 99676,\n\t\"./it\": 74313,\n\t\"./it-ch\": 25141,\n\t\"./it-ch.js\": 25141,\n\t\"./it.js\": 74313,\n\t\"./ja\": 11985,\n\t\"./ja.js\": 11985,\n\t\"./jv\": 53908,\n\t\"./jv.js\": 53908,\n\t\"./ka\": 32808,\n\t\"./ka.js\": 32808,\n\t\"./kk\": 33930,\n\t\"./kk.js\": 33930,\n\t\"./km\": 71532,\n\t\"./km.js\": 71532,\n\t\"./kn\": 69461,\n\t\"./kn.js\": 69461,\n\t\"./ko\": 60502,\n\t\"./ko.js\": 60502,\n\t\"./ku\": 18660,\n\t\"./ku-kmr\": 58035,\n\t\"./ku-kmr.js\": 58035,\n\t\"./ku.js\": 18660,\n\t\"./ky\": 83088,\n\t\"./ky.js\": 83088,\n\t\"./lb\": 65742,\n\t\"./lb.js\": 65742,\n\t\"./lo\": 25417,\n\t\"./lo.js\": 25417,\n\t\"./lt\": 64968,\n\t\"./lt.js\": 64968,\n\t\"./lv\": 41202,\n\t\"./lv.js\": 41202,\n\t\"./me\": 34438,\n\t\"./me.js\": 34438,\n\t\"./mi\": 18498,\n\t\"./mi.js\": 18498,\n\t\"./mk\": 6744,\n\t\"./mk.js\": 6744,\n\t\"./ml\": 63949,\n\t\"./ml.js\": 63949,\n\t\"./mn\": 4459,\n\t\"./mn.js\": 4459,\n\t\"./mr\": 46679,\n\t\"./mr.js\": 46679,\n\t\"./ms\": 56960,\n\t\"./ms-my\": 47483,\n\t\"./ms-my.js\": 47483,\n\t\"./ms.js\": 56960,\n\t\"./mt\": 99989,\n\t\"./mt.js\": 99989,\n\t\"./my\": 64978,\n\t\"./my.js\": 64978,\n\t\"./nb\": 88460,\n\t\"./nb.js\": 88460,\n\t\"./ne\": 23993,\n\t\"./ne.js\": 23993,\n\t\"./nl\": 95378,\n\t\"./nl-be\": 62678,\n\t\"./nl-be.js\": 62678,\n\t\"./nl.js\": 95378,\n\t\"./nn\": 67560,\n\t\"./nn.js\": 67560,\n\t\"./oc-lnc\": 87060,\n\t\"./oc-lnc.js\": 87060,\n\t\"./pa-in\": 62187,\n\t\"./pa-in.js\": 62187,\n\t\"./pl\": 93532,\n\t\"./pl.js\": 93532,\n\t\"./pt\": 49396,\n\t\"./pt-br\": 92485,\n\t\"./pt-br.js\": 92485,\n\t\"./pt.js\": 49396,\n\t\"./ro\": 33179,\n\t\"./ro.js\": 33179,\n\t\"./ru\": 93797,\n\t\"./ru.js\": 93797,\n\t\"./sd\": 40675,\n\t\"./sd.js\": 40675,\n\t\"./se\": 59036,\n\t\"./se.js\": 59036,\n\t\"./si\": 59160,\n\t\"./si.js\": 59160,\n\t\"./sk\": 31266,\n\t\"./sk.js\": 31266,\n\t\"./sl\": 74699,\n\t\"./sl.js\": 74699,\n\t\"./sq\": 69728,\n\t\"./sq.js\": 69728,\n\t\"./sr\": 87129,\n\t\"./sr-cyrl\": 55000,\n\t\"./sr-cyrl.js\": 55000,\n\t\"./sr.js\": 87129,\n\t\"./ss\": 74346,\n\t\"./ss.js\": 74346,\n\t\"./sv\": 9877,\n\t\"./sv.js\": 9877,\n\t\"./sw\": 918,\n\t\"./sw.js\": 918,\n\t\"./ta\": 24787,\n\t\"./ta.js\": 24787,\n\t\"./te\": 6199,\n\t\"./te.js\": 6199,\n\t\"./tet\": 91851,\n\t\"./tet.js\": 91851,\n\t\"./tg\": 33881,\n\t\"./tg.js\": 33881,\n\t\"./th\": 87828,\n\t\"./th.js\": 87828,\n\t\"./tk\": 99677,\n\t\"./tk.js\": 99677,\n\t\"./tl-ph\": 29253,\n\t\"./tl-ph.js\": 29253,\n\t\"./tlh\": 95586,\n\t\"./tlh.js\": 95586,\n\t\"./tr\": 17254,\n\t\"./tr.js\": 17254,\n\t\"./tzl\": 61192,\n\t\"./tzl.js\": 61192,\n\t\"./tzm\": 69631,\n\t\"./tzm-latn\": 72841,\n\t\"./tzm-latn.js\": 72841,\n\t\"./tzm.js\": 69631,\n\t\"./ug-cn\": 71720,\n\t\"./ug-cn.js\": 71720,\n\t\"./uk\": 28048,\n\t\"./uk.js\": 28048,\n\t\"./ur\": 86751,\n\t\"./ur.js\": 86751,\n\t\"./uz\": 96343,\n\t\"./uz-latn\": 60513,\n\t\"./uz-latn.js\": 60513,\n\t\"./uz.js\": 96343,\n\t\"./vi\": 44821,\n\t\"./vi.js\": 44821,\n\t\"./x-pseudo\": 23973,\n\t\"./x-pseudo.js\": 23973,\n\t\"./yo\": 15000,\n\t\"./yo.js\": 15000,\n\t\"./zh-cn\": 43762,\n\t\"./zh-cn.js\": 43762,\n\t\"./zh-hk\": 9246,\n\t\"./zh-hk.js\": 9246,\n\t\"./zh-mo\": 41107,\n\t\"./zh-mo.js\": 41107,\n\t\"./zh-tw\": 79014,\n\t\"./zh-tw.js\": 79014\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 35358;","import ABFactoryCore from \"./core/ABFactoryCore\";\n\nimport _ from \"lodash\";\nimport moment from \"moment\";\nimport { nanoid } from \"nanoid\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport performance from \"../utils/performance\";\nimport FilterComplex from \"./platform/FilterComplex\";\nimport SortPopup from \"./platform/views/ABViewGridPopupSortFields\";\nimport Papa from \"papaparse\";\n\n//\n// Our Common Resources\n//\nimport Config from \"../config/Config.js\";\n// Config : responsible for all the configuration/settings of our instance.\n\nimport Account from \"../resources/Account.js\";\n// Account : manages the current Logged in User and Account information.\n\nimport ClassUI from \"../ui/ClassUI.js\";\n\nimport Dialog from \"./_factory_utils/Dialog.js\";\n// Dialog : common UI dialogs.\n\nimport Multilingual from \"../resources/Multilingual.js\";\n// Multilingual: our interface Labels and language options\n\nimport Network from \"../resources/Network.js\";\n// Network: our interface for communicating to our server\n\nimport Storage from \"../resources/Storage.js\";\n// Storage: manages our interface for local storage\n\nimport ABViewManager from \"./core/ABViewManagerCore\";\n\nimport Tenant from \"../resources/Tenant.js\";\n// Tenant: manages the Tenant information of the current instance\n\nimport UISettings from \"./uiSettings/config.js\";\nimport ABViewComponent from \"./platform/views/viewComponent/ABViewComponent.js\";\n// UISettings: detailed settings for our common UI elements\n\nclass ABValidator {\n constructor(AB) {\n this.AB = AB;\n this.errors = [];\n this.platform = \"web\";\n }\n\n addError(name, message) {\n this.errors.push({ name: name, message: message });\n }\n\n pass() {\n return this.errors.length == 0;\n }\n\n fail() {\n return this.errors.length > 0;\n }\n\n toValidationObject() {\n var obj = {\n error: \"E_VALIDATION\",\n invalidAttributes: {},\n };\n\n var attr = obj.invalidAttributes;\n\n this.errors.forEach((e) => {\n attr[e.name] = attr[e.name] || [];\n attr[e.name].push(e);\n });\n\n return obj;\n }\n\n updateForm(form) {\n var vObj = this.toValidationObject();\n this.AB.Validation.isFormValidationError(vObj, form);\n }\n\n updateGrid(rowID, grid) {\n var vObj = this.toValidationObject();\n this.AB.Validation.isGridValidationError(vObj, rowID, grid);\n }\n}\n\n//\n// AppBuilder Objects\n//\n\nclass ABFactory extends ABFactoryCore {\n constructor(definitions) {\n super(definitions);\n\n // Common Reference to Configuration Values\n this.Config = Config;\n\n //\n // Resources\n //\n this.Account = Account;\n this.Dialog = Dialog;\n this.Multilingual = Multilingual;\n this.Network = Network;\n this.Storage = Storage;\n this.Tenant = Tenant;\n this.Webix = webix;\n\n // Plugin Classes\n this.ClassUI = ClassUI;\n\n // additional Class definitions\n this.Class.FilterComplex = FilterComplex;\n this.Class.ABViewManager = ABViewManager;\n this.Class.SortPopup = SortPopup;\n this.Class.ABViewComponent = ABViewComponent;\n\n // Temp placeholders until Resources are implemented:\n this.Analytics = {\n log: () => {},\n logError: () => {},\n };\n this.Lock = class Lock {\n constructor() {}\n\n acquire() {\n return Promise.resolve();\n }\n release() {\n return Promise.resolve();\n }\n };\n\n this.performance = performance;\n\n this.UISettings = UISettings;\n\n this.Validation = {\n validator: () => {\n return new ABValidator(this);\n },\n\n errorSailsCleanup: function (error) {\n if (error) {\n //// if the error obj is provided by Sails response,\n //// do some clean up on the error object:\n\n // dig down to sails provided error object:\n if (\n error.error &&\n error.error == \"E_UNKNOWN\" &&\n error.raw &&\n error.raw.length > 0\n ) {\n error = error.raw[0];\n }\n\n // drill down to the embedded .err object if it exists\n if (error.err) {\n error = error.err;\n }\n\n // if this is from our server response:\n if (\n error.data &&\n error.data.error &&\n error.data.error == \"E_VALIDATION\"\n ) {\n error = error.data;\n }\n }\n\n return error;\n },\n\n /**\n * @function AB.Validation.isFormValidationError\n *\n * scans the given error to see if it is a sails' response about an invalid\n * value from one of the form elements.\n *\n * @codestart\n * var form = $$('formID');\n * var values = form.getValues();\n * model.attr(values);\n * model.save()\n * .fail(function(err){\n * if (!OP.Form.isFormValidationError(err, form)) {\n * OP.error.log('Error saving current model ()', {error:err, values:values});\n * }\n * })\n * .then(function(newData){\n *\n * });\n * @codeend\n *\n * @param {obj} error\n * the error response object\n * @param {obj} form\n * the webix form instance (or reference)\n * @return {bool}\n * true if error was about a form element.\n * false otherwise.\n */\n isFormValidationError: function (error, form) {\n var hasFocused = false;\n // {bool} have we set focus to form component?\n\n // if we have an error object:\n if (error) {\n //// if the error obj is provided by Sails response,\n //// do some clean up on the error object:\n\n error = this.errorSailsCleanup(error);\n\n //// Now process the error object\n ////\n if (\n (error.error && error.error == \"E_VALIDATION\") ||\n (error.code && error.code == \"E_VALIDATION\")\n ) {\n var attrs = error.invalidAttributes;\n if (attrs) {\n var wasForm = false;\n for (var attr in attrs) {\n // if this is a field in the form:\n if (form.elements[attr]) {\n var errors = attrs[attr];\n var msg = [];\n errors.forEach(function (err) {\n msg.push(err.message);\n });\n\n // set the invalid error message\n form.markInvalid(attr, msg.join(\", \"));\n\n // set focus to the 1st form element we mark:\n if (!hasFocused) {\n form.elements[attr].focus();\n hasFocused = true;\n }\n\n wasForm = true;\n }\n }\n\n if (wasForm) {\n return true;\n }\n }\n }\n }\n\n // if we missed updating our form with an error\n // this was not a validation error so return false\n return false;\n },\n\n /**\n * @method AB.Validation.isGridValidationError\n *\n * scans the given error to see if it is a sails' response about an invalid\n * value from one of our grid columns.\n *\n * @codestart\n * var grid = $$('myGrid');\n * model.attr(values);\n * model.save()\n * .fail(function(err){\n * if (!OP.Validation.isGridValidationError(err, editor, grid)) {\n * OP.error.log('Error saving current model ()', {error:err, values:values});\n * }\n * })\n * .then(function(newData){\n *\n * });\n * @codeend\n *\n * @param {Error} error\n * the error response object\n * @param {integer} row\n * the row id of the Grid to update.\n * @param {webix.datatable} Grid\n * the webix grid instance (or reference)\n * @return {bool}\n * true if error was about a grid column.\n * false otherwise.\n */\n isGridValidationError: function (error, row, Grid) {\n // if we have an error object:\n if (error) {\n //// if the error obj is provided by Sails response,\n //// do some clean up on the error object:\n\n error = this.errorSailsCleanup(error);\n\n //// Now process the error object\n ////\n if (\n (error.error && error.error == \"E_VALIDATION\") ||\n (error.code && error.code == \"E_VALIDATION\")\n ) {\n var attrs = error.invalidAttributes;\n if (attrs) {\n var wasGrid = false;\n for (var attr in attrs) {\n Grid.addCellCss(row, attr, \"webix_invalid\");\n Grid.addCellCss(row, attr, \"webix_invalid_cell\");\n\n var msg = [];\n attrs[attr].forEach((e) => {\n msg.push(e.message);\n });\n\n webix.alert({\n text: attr + \": \" + msg.join(\", \"),\n });\n\n wasGrid = true;\n }\n\n Grid.refresh(row);\n Grid.clearSelection();\n\n if (wasGrid) {\n return true;\n }\n }\n }\n }\n\n // if we missed updating our Grid with an error\n // this was not a validation error so return false\n return false;\n },\n };\n\n // TODO: make sure \"error\" s are handled and sent to logs\n // this.on(\"error\", ()=>{ Analytics.error })\n\n this.Definitions = {};\n // {obj} the provided interface for working with the ABDefinition table.\n // NOTE: on the web client, we simply perform web API calls to perform\n // the actions. These are defined below.\n\n this.on(\"error\", (err) => {\n // this simply prevents thrown errors if there are no listeners.\n console.error(err);\n });\n\n this._plugins = [];\n // {array} of loaded Plugin.applications.\n\n this._pendingNetworkRequests = {};\n // {hash} uuid : {Promise}\n // convert our definitionsXXXX() operations to be Relay/offline compatible.\n // if a queued operation is sent after a web browser refresh, then\n // we will NOT have a pending promise to .resolve()/.reject()\n\n this.Network.on(\"definition.create\", (context, err, fullDef) => {\n var pending = this._pendingNetworkRequests[context.uuid];\n if (err) {\n // this.error(err);\n pending?.reject(err);\n return;\n }\n\n // for immediate feedback to our UI:\n // simulate the RT update from our sockets:\n var pkt = {\n id: fullDef.id,\n data: fullDef,\n };\n this.emit(\"ab.abdefinition.create\", pkt);\n\n let newDef = this.definitionNew(fullDef);\n pending?.resolve(newDef);\n });\n\n this.Network.on(\"definition.update\", (context, err, serverDef) => {\n var pending = this._pendingNetworkRequests[context.uuid];\n if (err) {\n if (err.toString().indexOf(\"Not Found\") > -1) {\n return this.definitionCreate(context.values)\n .then(pending?.resolve)\n .catch(pending?.reject);\n }\n // log the error\n // this.error(err);\n pending?.reject(err);\n return;\n }\n\n this._definitions[context.id] = serverDef;\n\n // for immediate feedback to our UI:\n // simulate the RT update from our sockets:\n var pkt = {\n id: serverDef.id,\n data: serverDef,\n };\n this.emit(\"ab.abdefinition.update\", pkt);\n\n pending?.resolve(serverDef);\n });\n\n this.Network.on(\"definition.delete\", (context, err, serverDef) => {\n var pending = this._pendingNetworkRequests[context.uuid];\n if (err) {\n // log the error\n // this.error(err);\n pending?.reject(err);\n return;\n }\n\n delete this._definitions[context.id];\n\n // for immediate feedback to our UI:\n // simulate the RT update from our sockets:\n var pkt = {\n id: context.id,\n data: serverDef,\n };\n this.emit(\"ab.abdefinition.delete\", pkt);\n\n pending?.resolve();\n });\n\n //\n // Rules\n //\n const platformRules = {\n /**\n * @method toDate\n *\n * @param {string} dateText\n * @param {Object} options - {\n * format: \"string\",\n * ignoreTime: boolean\n * }\n * @return {Date}\n */\n toDate: (dateText = \"\", options = {}) => {\n if (!dateText) return;\n\n if (options.ignoreTime) dateText = dateText.replace(/T.*/, \"\");\n\n let result = options.format\n ? moment(dateText, options.format)\n : moment(dateText);\n\n let supportFormats = [\n \"YYYY-MM-DD\",\n \"YYYY/MM/DD\",\n \"DD/MM/YYYY\",\n \"MM/DD/YYYY\",\n \"DD-MM-YYYY\",\n \"MM-DD-YYYY\",\n ];\n\n supportFormats.forEach((format) => {\n if (!result || !result.isValid())\n result = moment(dateText, format);\n });\n\n return new Date(result);\n },\n\n /**\n * @method toDateFormat\n *\n * @param {Date} date\n * @param {Object} options - {\n * format: \"string\",\n * localeCode: \"string\"\n * }\n *\n * @return {string}\n */\n toDateFormat: (date, options) => {\n if (!date) return \"\";\n\n let momentObj = moment(date);\n\n if (options.localeCode) momentObj.locale(options.localeCode);\n\n return momentObj.format(options.format);\n },\n\n /**\n * @method subtractDate\n *\n * @param {Date} date\n * @param {number} number\n * @param {string} unit\n *\n * @return {Date}\n */\n subtractDate: (date, number, unit) => {\n return moment(date).subtract(number, unit).toDate();\n },\n\n /**\n * @method addDate\n *\n * @param {Date} date\n * @param {number} number\n * @param {string} unit\n *\n * @return {Date}\n */\n addDate: (date, number, unit) => {\n return moment(date).add(number, unit).toDate();\n },\n\n /**\n * Get today's UTC time range in \"YYYY-MM-DD HH:MM:SS\" format.\n *\n * It converts the start and end of today to UTC to keep things consistent\n * across time zones. Handy when you need to deal with dates in different regions.\n *\n * @returns {string} UTC time range for today.\n */\n\n getUTCDayTimeRange: () => {\n let now = new Date();\n let year = now.getFullYear();\n let month = now.getMonth();\n let date = now.getDate();\n let startOfDay = new Date(year, month, date, 0, 0, 0);\n let endOfDay = new Date(year, month, date, 23, 59, 59);\n\n // Convert to UTC by subtracting the timezone offset\n let startOfDayUTC = new Date(\n startOfDay.getTime() + startOfDay.getTimezoneOffset() * 60000\n );\n let endOfDayUTC = new Date(\n endOfDay.getTime() + endOfDay.getTimezoneOffset() * 60000\n );\n\n // Format the date in \"YYYY-MM-DD HH:MM:SS\" format\n let formatDate = (date) => {\n let isoString = date.toISOString();\n return `${isoString.slice(0, 10)} ${isoString.slice(11, 19)}`;\n };\n return formatDate(startOfDayUTC).concat(\n \"|\",\n formatDate(endOfDayUTC)\n );\n },\n };\n (Object.keys(platformRules) || []).forEach((k) => {\n this.rules[k] = platformRules[k];\n });\n }\n\n /**\n * init()\n * prepare the ABFactory for operation. This includes parsing the\n * definitions into useable objects, preparing the System Resources, etc.\n * @return {Promise}\n */\n async init() {\n //\n // Prepare our Resources First\n //\n var allInits = [];\n\n allInits.push(this.Account.init(this));\n allInits.push(this.Multilingual.init(this));\n allInits.push(this.Network.init(this));\n allInits.push(this.Tenant.init(this));\n\n await Promise.all(allInits);\n await this.Storage.init(this);\n var data = await this.Storage.get(\"local_settings\");\n this._localSettings = data || {};\n\n //\n // Real Time Update Handlers\n //\n\n // new ABDefinition created:\n this.on(\"ab.abdefinition.create\", (pkt) => {\n // pkt.id : definition.id\n // pkt.data : definition\n\n if (typeof pkt.data.json == \"string\") {\n try {\n pkt.data.json = JSON.parse(pkt.data.json);\n } catch (e) {\n console.log(e);\n }\n }\n this._definitions[pkt.id] = pkt.data;\n this.definitionSync(\"created\", pkt.id, pkt.data);\n });\n\n // ABDefinition updated:\n this.on(\"ab.abdefinition.update\", (pkt) => {\n // pkt.id : definition.id\n // pkt.data : definition\n if (typeof pkt.data.json == \"string\") {\n try {\n pkt.data.json = JSON.parse(pkt.data.json);\n } catch (e) {\n console.log(e);\n }\n }\n this._definitions[pkt.id] = pkt.data;\n this.definitionSync(\"updated\", pkt.id, pkt.data);\n });\n\n // ABDefinition delete:\n this.on(\"ab.abdefinition.delete\", (pkt) => {\n // pkt.id : definition.id\n // pkt.data : definition\n if (typeof pkt.data.json == \"string\") {\n try {\n pkt.data.json = JSON.parse(pkt.data.json);\n } catch (e) {\n console.log(e);\n }\n }\n delete this._definitions[pkt.id];\n this.definitionSync(\"destroyed\", pkt.id, pkt.data);\n });\n\n return super.init();\n\n // return Promise.all(allInits)\n // .then(() => {\n // // some Resources depend on the above to be .init() before they can\n // // .init() themselves.\n // return this.Storage.init(this).then(() => {\n // return this.Storage.get(\"local_settings\").then((data) => {\n // this._localSettings = data || {};\n // });\n // });\n // })\n // .then(() => {\n // //\n // // RealTime Updates of our ABDefinitions\n // //\n\n // // new ABDefinition created:\n // this.on(\"ab.abdefinition.create\", (pkt) => {\n // // pkt.id : definition.id\n // // pkt.data : definition\n\n // if (typeof pkt.data.json == \"string\") {\n // try {\n // pkt.data.json = JSON.parse(pkt.data.json);\n // } catch (e) {\n // console.log(e);\n // }\n // }\n // this._definitions[pkt.id] = pkt.data;\n // this.definitionSync(\"created\", pkt.id, pkt.data);\n // });\n\n // // ABDefinition updated:\n // this.on(\"ab.abdefinition.update\", (pkt) => {\n // // pkt.id : definition.id\n // // pkt.data : definition\n // if (typeof pkt.data.json == \"string\") {\n // try {\n // pkt.data.json = JSON.parse(pkt.data.json);\n // } catch (e) {\n // console.log(e);\n // }\n // }\n // this._definitions[pkt.id] = pkt.data;\n // this.definitionSync(\"updated\", pkt.id, pkt.data);\n // });\n\n // // ABDefinition delete:\n // this.on(\"ab.abdefinition.delete\", (pkt) => {\n // // pkt.id : definition.id\n // // pkt.data : definition\n // if (typeof pkt.data.json == \"string\") {\n // try {\n // pkt.data.json = JSON.parse(pkt.data.json);\n // } catch (e) {\n // console.log(e);\n // }\n // }\n // delete this._definitions[pkt.id];\n // this.definitionSync(\"destroyed\", pkt.id, pkt.data);\n // });\n\n // return super.init();\n // });\n }\n\n /**\n * definiitonCreate(def)\n * create a new ABDefinition\n * @param {obj} def\n * the value hash of the new definition entry\n * @return {Promise}\n * resolved with a new {ABDefinition} for the entry.\n */\n async definitionCreate(def) {\n // we will set our uuid\n if (typeof def.id == \"undefined\") {\n def.id = this.uuid();\n def.json.id = def.id;\n }\n\n return new Promise((resolve, reject) => {\n var uuid = this.uuid();\n this._pendingNetworkRequests[uuid] = { resolve, reject };\n var jobResponse = {\n key: \"definition.create\",\n context: {\n uuid,\n },\n };\n this.Network.post(\n {\n url: `/definition/create`,\n data: def,\n },\n jobResponse\n ).catch((err) => {\n var message = \"Error attempting to CREATE definitions\";\n if (err.code == \"E_NOPERM\") {\n message = \"User Doesn't have permission to CREATE definitions\";\n }\n this.notify.developer(err, {\n context: \"ABFactory.definitionCreate()\",\n message,\n def,\n });\n\n // NOTE: when using jobResponse type calls, expect that\n // handler to be handling the errors.\n // don't keep propagating them here.\n });\n });\n }\n\n /**\n * definitionDestroy(id)\n * delete an ABDefinition\n * @param {string} id\n * the uuid of the ABDefinition to delete\n * @return {Promise}\n */\n async definitionDestroy(id) {\n return new Promise((resolve, reject) => {\n var uuid = this.uuid();\n this._pendingNetworkRequests[uuid] = { resolve, reject };\n var jobResponse = {\n key: \"definition.delete\",\n context: {\n id,\n uuid,\n },\n };\n this.Network.delete(\n {\n url: `/definition/${id}`,\n },\n jobResponse\n ).catch((err) => {\n var message = \"Error attempting to DESTROY definitions\";\n if (err.code == \"E_NOPERM\") {\n message = \"User Doesn't have permission to DELETE definitions\";\n }\n this.notify.developer(err, {\n context: \"ABFactory.definitionDestroy()\",\n message,\n id,\n });\n\n // NOTE: when using jobResponse type calls, expect that\n // handler to be handling the errors.\n // don't keep propagating them here.\n });\n });\n }\n\n /**\n * definitionUpdate(id, def)\n * update an existing ABDefinition\n * @param {string} id\n * the uuid of the ABDefinition to update.\n * @param {obj} values\n * the value hash of the new definition values\n * @return {Promise}\n * resolved with a new {ABDefinition} for the entry.\n */\n async definitionUpdate(id, values) {\n return new Promise((resolve, reject) => {\n var uuid = this.uuid();\n this._pendingNetworkRequests[uuid] = { resolve, reject };\n var jobResponse = {\n key: \"definition.update\",\n context: {\n id,\n uuid,\n values,\n },\n };\n this.Network.put(\n {\n url: `/definition/${id}`,\n data: values,\n },\n jobResponse\n ).catch((err) => {\n var message = \"Error attempting to UPDATE definitions\";\n if (err.code == \"E_NOPERM\") {\n message = \"User Doesn't have permission to UPDATE definitions\";\n }\n this.notify.developer(err, {\n context: \"ABFactory.definitionUpdate()\",\n message,\n });\n\n // NOTE: when using jobResponse type calls, expect that\n // handler to be handling the errors.\n // don't keep propagating them here.\n });\n });\n }\n\n /**\n * definitionsParse()\n * include the incoming definitions into our ABFactory. These new\n * definitions will replace any existing ones with the same .id.\n * @param {array[ABDefinitioin]} defs\n * the incoming array of ABDefinitions to parse.\n * @return {Promise}\n */\n // definitionsParse(defs = []) {\n // if (!Array.isArray(defs)) {\n // defs = [defs];\n // }\n\n // // store/replace the incoming definitions\n // // 1st: insert ALL our definitions internally\n // defs.forEach((d) => {\n // this._definitions[d.id] = d;\n // });\n // // 2nd: Now we can then go through and signal the \"updates\"\n // // and the related objects can find their dependent definitions.\n // defs.forEach((d) => {\n // this.definitionSync(\"updated\", d.id, d);\n // });\n\n // return Promise.resolve();\n // }\n\n /**\n * will send alerts to a group of people. These alerts are usually about\n * configuration errors, or software problems.\n * @param {string} domain which group of people we are sending a notification to.\n * @param {Error} error An error object generated at the point of issue.\n * @param {json} info Additional related information concerning the issue.\n */\n notify(domain, error, info) {\n performance.notify(domain, error, info);\n }\n\n plugins() {\n return this._plugins;\n }\n pluginLoad(p) {\n this._plugins.push(p);\n }\n\n //\n // Utilities\n //\n alert(options) {\n this.Webix.alert(options);\n }\n\n cloneDeep(value) {\n return _.cloneDeep(value);\n }\n\n /**\n * implements the _.defaultsDeep function\n * @param {object} target\n * @param {object} source\n * @returns {object} the merged object\n */\n defaultsDeep(target, source) {\n return _.defaultsDeep(target, source);\n }\n\n error(message, ...rest) {\n var emitData = {\n message: `ABFactory[${this.Tenant.id()}]:${message.toString()}`,\n };\n\n console.error(emitData.message);\n if (message instanceof Error) {\n emitData.error = message;\n // this dumps the error.stack\n console.error(message);\n }\n\n if (rest.length > 0) {\n rest.forEach((r) => {\n if (r instanceof Error) {\n emitData.error = r;\n // this dumps the error.stack\n console.error(r);\n }\n\n if (typeof r == \"object\") {\n for (var k in r) {\n emitData[k] = r[k];\n console.error(k, r[k]);\n }\n }\n });\n }\n this.emit(\"error\", emitData);\n }\n\n jobID() {\n return nanoid();\n }\n\n Label() {\n return (...params) => {\n return this.Multilingual.label(...params);\n };\n }\n\n localSettings(key, value) {\n if (typeof value == \"undefined\") {\n // this is a getter:\n return this._localSettings[key];\n } else {\n // setting a value:\n this._localSettings[key] = value;\n return this.Storage.set(`local_settings`, this._localSettings);\n }\n }\n\n log(message, ...rest) {\n console.log(message);\n rest.forEach((r) => {\n console.log(r);\n });\n }\n\n isNil(value) {\n return _.isNil(value);\n }\n\n /**\n * @method rules.isUUID\n * evaluate a given value to see if it matches the format of a uuid\n * @param {string} key\n * @return {boolean}\n */\n isUUID(key) {\n var checker = RegExp(\n \"^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$\",\n \"i\"\n );\n return checker.test(key);\n }\n\n merge(...params) {\n return _.merge(...params);\n }\n\n orderBy(...params) {\n return _.orderBy(...params);\n }\n\n uniq(...params) {\n return _.uniq(...params);\n }\n\n kebabCase(...params) {\n return _.kebabCase(...params);\n }\n\n sumBy(...params) {\n return _.sumBy(...params);\n }\n\n meanBy(...params) {\n return _.meanBy(...params);\n }\n\n maxBy(...params) {\n return _.maxBy(...params);\n }\n\n minBy(...params) {\n return _.minBy(...params);\n }\n\n uuid() {\n return uuidv4();\n }\n\n warn(message, ...rest) {\n console.warn(message);\n rest.forEach((r) => {\n console.warn(r);\n });\n }\n\n isString(...params) {\n return _.isString(params);\n }\n\n async scriptLoad(url) {\n await new Promise((resolve, reject) => {\n var cb = () => resolve();\n // Adding the script tag to the head as suggested before\n const head = document.head;\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = url;\n\n // Then bind the event to the callback function.\n // There are several events for cross browser compatibility.\n script.onreadystatechange = cb;\n script.onload = cb;\n script.onerror = () => {\n reject(\n new Error(\n `Preloader:ScriptLoad(): Error loading script (${url})`\n )\n );\n };\n // Fire the loading\n head.appendChild(script);\n });\n }\n\n async scriptLoadAll(urls) {\n urls = urls.filter((u) => u);\n await Promise.all(urls.map((url) => this.scriptLoad(url)));\n }\n\n async cssLoad(url) {\n await new Promise((resolve, reject) => {\n const head = document.head;\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = url;\n\n link.onload = () => resolve();\n link.onerror = () => {\n reject(new Error(`Error loading CSS file (${url})`));\n };\n\n head.appendChild(link);\n });\n }\n\n async cssLoadAll(urls) {\n urls = urls.filter((u) => u);\n await Promise.all(urls.map((url) => this.cssLoad(url)));\n }\n\n csvToJson(csvData) {\n return Papa.parse(csvData, {\n header: true,\n skipEmptyLines: true,\n });\n }\n\n jsonToCsv(jsonData) {\n return Papa.unparse(jsonData);\n }\n}\n\nexport default ABFactory;\n","//\n// Dialog\n// A common set of UI dialogs to show the User.\n//\n// NOTE: IN TRANSITION: this is our previous method of handling\n// dialogs. In future, refactor to use webix directly in code.\n//\n\nexport default {\n // Instance properties\n\n // Alert\n // A dialogue that popup with a message, and requires an [ok] button press\n Alert: function (opts) {\n webix.alert({\n title:\n opts.title ||\n AB.Multilingual.label(\"opp.dialog.alert.title\", \"*Alert\"),\n text:\n opts.text ||\n opts.message ||\n AB.Multilingual.label(\n \"opp.dialog.alert.text\",\n \"*Something is wrong.\"\n ),\n ok: opts.ok || AB.Multilingual.label(\"opp.dialog.alert.ok\", \"*OK\"),\n });\n },\n\n // Confirm\n // A [Yes] [No] dialogue that pops up with a message\n Confirm: function (opts) {\n var title =\n opts.title ||\n AB.Multilingual.label(\"opp.dialog.confirm.confirmTitle\", \"* Confirm\");\n var message =\n opts.text ||\n opts.message ||\n AB.Multilingual.label(\n \"opp.dialog.confirm.confirmMsg\",\n \"* Are you sure you want to do this?\"\n );\n\n var labelYes =\n opts.labelYes ||\n opts.ok ||\n AB.Multilingual.label(\"opp.common.yes\", \"* yes\");\n var labelNo =\n opts.labelNo ||\n opts.cancel ||\n AB.Multilingual.label(\"opp.common.no\", \"* no\");\n\n // var fnYes = opts.fnYes || function () { };\n // var fnNo = opts.fnNo || function () { };\n\n webix.confirm({\n title: title,\n text: message,\n\n ok: labelYes,\n cancel: labelNo,\n\n callback: function (result) {\n if (result) {\n if (opts.fnYes) opts.fnYes();\n } else {\n if (opts.fnNo) opts.fnNo();\n }\n\n if (opts.callback) opts.callback(result);\n },\n });\n\n // bootbox.dialog({\n // title: title,\n // message: message,\n // buttons: {\n // yes: {\n // label: labelYes,\n // className: 'btn-primary',\n // callback: fnYes\n // },\n // no: {\n // label: labelNo,\n // className: 'btn-default',\n // callback: fnNo\n // }\n // }\n // });\n },\n\n // ConfirmDelete\n // A Confirm dialogue geared towards deleting items.\n // [delete] [cancel]\n ConfirmDelete: function (opts) {\n this.Confirm({\n title:\n opts.title ||\n AB.Multilingual.label(\n \"opp.dialog.confirm.deleteTitle\",\n \"* Confirm Delete\"\n ),\n ok: opts.ok || AB.Multilingual.label(\"opp.common.delete\", \"* Delete\"),\n cancel:\n opts.cancel ||\n AB.Multilingual.label(\"opp.common.cancel\", \"* Cancel\"),\n text:\n opts.text ||\n opts.message ||\n AB.Multilingual.label(\n \"opp.dialog.confirm.deleteMsg\",\n \"* Are you sure you want to delete this?\",\n [\"this\"]\n ),\n callback: function (result) {\n if (result) {\n if (opts.fnYes) opts.fnYes();\n } else {\n if (opts.fnNo) opts.fnNo();\n }\n\n if (opts.callback) opts.callback(result);\n },\n });\n },\n\n // Message\n // A simple message displayed to the user. Can time out\n Message: function (opts) {\n var message = opts.text || opts.message;\n var timeout = opts.timeout || 2000;\n\n webix.message({\n text: message,\n expire: timeout,\n });\n },\n};\n","/**\n * ABApplicationCore\n *\n * This is the core ABApplication class that manages the common operations\n * of an ABApplication across platforms.\n *\n * It's primary responsibility is to decode a given set of attributes into\n * a working instance of an ABApplication that can return instances of\n * it's defined sub objects.\n *\n * Platform Specific versions of those objects should be defined in a peer\n * directory named platform. These versions of the objects should override\n * these Core objects with platform specific methods of operation (like\n * .save()).\n *\n * Initially your target application should load your platform/ABApplication.js\n * file, which will include this file and sub class it.\n *\n * However, this file will include the remaining files from your platform/*\n * versions.\n */\n\n// webpack can handle 'require()' statements, but node can't handle import\n// so let's use require():\nconst ABViewManager = require(\"../platform/ABViewManager\");\nvar ABMLClass = require(\"../platform/ABMLClass\");\n\nfunction toBool(val) {\n if (typeof val == \"undefined\") {\n return false;\n }\n\n if (val === \"\" || val === \"false\" || val === \"0\") {\n return false;\n }\n\n if (val === \"true\" || val === \"1\") {\n return true;\n }\n\n return val;\n}\n\nmodule.exports = class ABApplicationCore extends ABMLClass {\n constructor(attributes, AB) {\n super([\"label\", \"description\"], AB);\n\n // attributes should be in format:\n // {\n // id:##,\n // json:{},\n // name:\"XYZ\"\n // }\n attributes.json = attributes.json || {};\n\n // ABApplication Attributes\n this.id = attributes.id;\n // {string} uuid\n\n this.type = attributes.type || \"application\";\n // {string} .type\n // the ABDefinition.type of this object.\n\n this.appType = attributes.appType || \"web\";\n // {string} .appType\n // the kind of Application this is. [\"web\", \"mobile\"]\n\n this.json = attributes.json;\n if (typeof this.json == \"string\") this.json = JSON.parse(this.json);\n // {obj} .json\n // the full settings of this ABApplication\n\n this.json[\"versionData\"] = attributes.json?.versionData || {\n versionNumber: \"1.0.0\",\n changeLog: {\n \"1.0.0\": {\n author: \"N/A\",\n version: \"1.0.0\",\n keepVersion: 0,\n commitMessage: \"Initial Version\",\n timestamp: new Date().toISOString(),\n },\n },\n };\n\n if (typeof this.json.versionData == \"string\")\n this.json.versionData = JSON.parse(this.json.versionData);\n // {obj} .json\n // the full version log data of this ABApplication\n\n this.name = attributes.name || this.json.name || \"\";\n // {string} .name\n // the hard coded name of this ABDefinition Object, not to be confused\n // with the .label. The .name is created at design time and is a text\n // reference for this object.\n\n this.icon = attributes.icon || \"fa-rocket\";\n // {string} .icon\n // this is a reference to a font awesome icon including the `fa-`\n // example `fa-child` should be stored for the `child` icon to be used\n // if user wants to get creative they can add more to this field following\n // these examples https://fontawesome.com/v4/examples/\n\n this.isSystemObject = toBool(attributes.isSystemObject);\n // {bool} .isSystemObject\n // is this one of the integrated System Objects used by our framework?\n // Some ABApplications and ABObjects are central to the running of the\n // AppBuilder site. They are marked with .isSystemObject = true; It\n // requires the role \"System Designer\" in order to edit/modify them.\n\n this.roleAccess = attributes.roleAccess || [];\n if (!Array.isArray(this.roleAccess)) {\n this.roleAccess = [this.roleAccess];\n }\n this.roleAccess = this.roleAccess.filter((r) => r);\n // {array}\n // the {ABSiteRole.id}s of the roles allowed to work with this\n // ABApplication. (see .isAccessManaged for more info)\n\n this.isAccessManaged = JSON.parse(attributes.isAccessManaged || false);\n // {bool} .isAccessManaged\n // does this Application imploy the more sophisticated Access\n // permissions, or the simpler Role access permissions.\n // {true} : allows an administrator to set which role can View|Edit|Delete\n // elements of an application.\n // {false}: indicates users having one of the .roleAccess values can have\n // full access to this application\n\n this.accessManagers = attributes.accessManagers;\n if (typeof this.accessManagers == \"string\")\n this.accessManagers = JSON.parse(this.accessManagers);\n // {??} .accessManagers\n // if .isAccessManaged == true, then .accessManagers contain the definitions\n // of the detailed access permissions.\n\n this.isTranslationManaged = JSON.parse(\n attributes.isTranslationManaged || false\n );\n this.translationManagers = attributes.translationManagers;\n if (typeof this.translationManagers == \"string\")\n this.translationManagers = JSON.parse(this.translationManagers);\n\n this.isTutorialManaged = JSON.parse(\n attributes.isTutorialManaged || false\n );\n this.tutorialManagers = attributes.tutorialManagers;\n if (typeof this.tutorialManagers == \"string\")\n this.tutorialManagers = JSON.parse(this.tutorialManagers);\n\n this.hintIDs = attributes.json.hintIDs || [];\n // {array} .hintIDs\n // All the {ABHint.id} values that have been pulled into this\n // ABApplication for use in it's design environment. This is how we\n // determine which {ABHint}s are included or excluded from\n // this app.\n\n this.objectIDs = attributes.json.objectIDs || [];\n // {array} .objectIDs\n // All the {ABObject.id} values that have been pulled into this\n // ABApplication for use in it's design environment. This is how we\n // determine which {ABObject}s are included or excluded from this app.\n\n this.queryIDs = attributes.json.queryIDs || [];\n // {array} .queryIDs\n // All the {ABObjectQuery.id} values that have been pulled into this\n // ABApplication for use in it's design environment. This is how we\n // determine which {ABObjectQueries}s are included or excluded from\n // this app.\n\n this.datacollectionIDs = attributes.json.datacollectionIDs || [];\n // {array} .datacollectionIDs\n // All the {ABDataCollection.id} values that have been pulled into this\n // ABApplication for use in it's design environment. This is how we\n // determine which {ABDataCollection}s are included or excluded from\n // this app.\n\n // import all our {ABViewPage}s\n let newPages = [];\n (attributes.json.pageIDs || []).forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (def) {\n newPages.push(this.pageNew(def));\n } else {\n this.emit(\n \"warning\",\n `App[${this.id}] is referenceing an unknown Page[${id}]`,\n {\n appID: this.id,\n pageID: id,\n }\n );\n // console.error(\n // `App[${this.id}] is referenceing an unknown Page[${id}]`\n // );\n }\n });\n this._pages = newPages;\n // {array} ._pages\n // an array of all the {ABViewPages} this ABApplication offers as\n // interfaces for working with our Data.\n // ABViewPages operate within the confines of an ABApplication so\n // they are created/stored/accessed from within an ABApplication\n\n (attributes.json.processIDs || []).forEach((pID) => {\n var p = this.AB.processByID(pID);\n if (!p) {\n this.emit(\n \"warning\",\n `Application is referencing an unknown process.`,\n { appID: this.id, processID: pID }\n );\n }\n });\n\n this.processIDs = attributes.json.processIDs || [];\n // {array} .processIDs\n // an array of all the {ABProcess.id}s referenced by this Application.\n\n // Object List Settings\n attributes.json.objectListSettings =\n attributes.json.objectListSettings || {};\n this.objectListSettings = this.objectListSettings || {};\n this.objectListSettings.isOpen = JSON.parse(\n attributes.json.objectListSettings.isOpen || false\n );\n this.objectListSettings.searchText =\n attributes.json.objectListSettings.searchText || \"\";\n this.objectListSettings.sortDirection =\n attributes.json.objectListSettings.sortDirection || \"asc\";\n this.objectListSettings.isGroup = JSON.parse(\n attributes.json.objectListSettings.isGroup || false\n );\n\n // let the MLClass now process the translations:\n // transition issues:\n attributes.translations =\n attributes.translations || attributes.json.translations;\n\n super.fromValues(attributes);\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n ///\n /// Instance Methods\n ///\n\n get ViewManager() {\n return ABViewManager;\n }\n\n /// ABApplication data methods\n /**\n * @method isAccessibleForRoles()\n * return true/false if this ABApplication is accessible for one of the\n * passed in ABRoles.\n * @param {array[ABRole]} roles\n * an array of {ABRole} instances.\n * @return {bool}\n */\n isAccessibleForRoles(roles) {\n var foundRole = false;\n\n // if we are on the basic Role assignments:\n if (!this.isAccessManaged) {\n (roles || []).forEach((r) => {\n if (this.roleAccess.indexOf(r.uuid || r) > -1) {\n foundRole = true;\n }\n });\n return foundRole;\n }\n\n // isAccessManaged has been set, so 2 kinds of ppl can\n // see this App\n // 1) an AccessManager\n if (parseInt(this.accessManagers.useRole)) {\n (roles || []).forEach((r) => {\n if (this.accessManagers.role.indexOf(r.uuid || r) > -1) {\n foundRole = true;\n }\n });\n }\n\n // stop here if found.\n if (foundRole) return foundRole;\n\n // 2) someone who has a role that can see one of it's pages.\n // scan each Page of this Application\n (this.pages() || []).forEach((p) => {\n // check to see if that page.isAccessibleForRoles()\n if (p.isAccessibleForRoles(roles)) {\n foundRole = true;\n }\n });\n return foundRole;\n }\n\n get isWebApp() {\n return this.appType == \"web\";\n }\n\n get isMobile() {\n return this.appType == \"mobile\";\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n // MLClass translation\n let versionData = this.json.versionData;\n\n this.json = super.toObj();\n\n this.json.name = this.name;\n\n this.json.versionData = versionData;\n\n this.json.objectIDs = this.objectIDs;\n\n this.json.objectListSettings = this.objectListSettings;\n\n this.json.hintIDs = this.hintIDs;\n\n this.json.queryIDs = this.queryIDs;\n\n this.json.datacollectionIDs = this.datacollectionIDs;\n\n this.json.pageIDs = (this._pages || []).map((p) => p.id);\n\n this.json.processIDs = this.processIDs || [];\n\n // // for each MobileApp: compile to json\n // var currApps = [];\n // this._mobileApps.forEach((app) => {\n // currApps.push(app.toObj())\n // })\n // this.json.mobileApps = currApps;\n\n return {\n id: this.id,\n type: this.type || \"application\",\n appType: this.appType || \"web\",\n name: this.name,\n icon: this.icon,\n isSystemObject: this.isSystemObject,\n json: this.json,\n roleAccess: this.roleAccess,\n translations: this.json.translations,\n isAccessManaged: this.isAccessManaged,\n isTranslationManaged: this.isTranslationManaged,\n isTutorialManaged: this.isTutorialManaged,\n accessManagers: this.accessManagers,\n translationManagers: this.translationManagers,\n tutorialManagers: this.tutorialManagers,\n };\n }\n\n ///\n /// Mobile Apps\n ///\n\n ///\n /// Datacollections\n ///\n\n // datacollectionNew(values) {\n // return new ABDataCollectionCore(values, this);\n // }\n\n datacollectionsExcluded(filter = () => true) {\n return this.AB.datacollections((o) => {\n return this.datacollectionIDs.indexOf(o.id) == -1;\n }).filter(filter);\n }\n\n datacollectionsIncluded(filter = () => true, sort) {\n // by default sort by label\n const sortFn = sort ?? ((a, b) => a.label.localeCompare(b.label));\n return this.AB.datacollections((o) => {\n return this.datacollectionIDs.indexOf(o.id) > -1;\n })\n .filter(filter)\n .sort(sortFn);\n }\n\n ///\n /// Objects\n ///\n\n objectsExcluded(filter = () => true) {\n return this.AB.objects((o) => {\n return this.objectIDs.indexOf(o.id) == -1;\n }).filter(filter);\n }\n\n objectsIncluded(filter = () => true, sort) {\n // by default sort by label\n const sortFn = sort ?? ((a, b) => a.label.localeCompare(b.label));\n return this.AB.objects((o) => {\n return this.objectIDs.indexOf(o.id) > -1;\n })\n .filter(filter)\n .sort(sortFn);\n }\n\n ///\n /// Hints\n ///\n\n hintsExcluded(filter = () => true) {\n return this.AB.hints((h) => {\n return this.hintIDs.indexOf(h.id) == -1;\n }).filter(filter);\n }\n\n hintsIncluded(filter = () => true, sort) {\n // by default sort by label\n const sortFn = sort ?? ((a, b) => a.label.localeCompare(b.label));\n return this.AB.hints((h) => {\n return this.hintIDs.indexOf(h.id) > -1;\n })\n .filter(filter)\n .sort(sortFn);\n }\n\n /**\n * @method connectedObjects()\n *\n * return an array of all the connected ABObjects for a given ABObject.\n *\n * @param {string} id\n * an ID of an ABObject\n * @return {array} array of options for webix select\n * [ {id, value}, ... ]\n */\n connectedObjects(id) {\n console.error(\n \"ABApplicationCore.connectedObjects(): who is calling this?\"\n );\n\n if (id == \"\") return [];\n\n // Determine the object from the ID\n var myObj = this.AB.objectByID(id);\n\n // Get all the connected Fields for that object\n var connectedFields = myObj.connectFields();\n // Store the related fields associatively inside their related Objects ID\n var connectedObj = {};\n connectedFields.forEach((f) => {\n connectedObj[f.settings.linkObject] = this.AB.objectByID(\n f.settings.linkObject\n );\n });\n // Look up the objects by their ID and push them in an options array\n var linkedObjects = [];\n Object.keys(connectedObj).forEach(function (key /*, index */) {\n linkedObjects.push({\n id: this[key].id,\n value: this[key].label,\n });\n }, connectedObj /* = this. inside fn */);\n\n return linkedObjects;\n }\n\n /**\n * @method connectedFields()\n * return an array of all the connected ABFields for a given ABObject\n * @param {string} currObjID\n * an ID of the current ABObject\n * @param {string} linkedObjectID\n * an ID of the linked ABObject\n * @return {array}\n * array of options for webix select\n */\n connectedFields(currObjID, linkedObjectID) {\n console.error(\"!!! Who is calling this?\");\n\n // Determine the object from the currObjID\n var myObj = this.AB.objectByID(currObjID);\n\n // Get all the connected Fields for our object that match the linkedObjectID\n var connectedFields = myObj.connectFields(\n (f) => f.settings.linkObject == linkedObjectID\n );\n // Build an arry of options for the webix select\n var linkedFields = [];\n connectedFields.forEach((f) => {\n linkedFields.push({ id: f.columnName, value: f.label });\n });\n\n return linkedFields;\n }\n\n ///\n /// Pages\n ///\n\n /**\n * @method pages()\n * return an array of all the ABViewPages for this ABApplication.\n * @param {fn} filter\n * a filter fn to return a set of ABViewPages that this fn\n * returns true for.\n * @param {boolean} deep\n * flag to search in sub pages\n * @return {array}\n * array of ABViewPages\n */\n pages(filter = () => true, deep = false) {\n var result = [];\n\n if (!this._pages || this._pages.length < 1) return result;\n\n // find into sub-pages recursively\n if (filter && deep) {\n // function searchDeep(curr) {\n // let resultsCurr = curr._pages.filter(filter);\n\n // for (let p of curr._pages) {\n // let resultsP = searchDeep(p);\n // if (resultsP.length) {\n // resultsCurr = resultsCurr.concat(resultsP);\n // }\n // }\n // // if we get here, end\n // return resultsCurr;\n // }\n\n // result = searchDeep(this);\n result = this._searchDeep(this, \"_pages\", filter);\n }\n // find root pages\n else {\n result = (this._pages || []).filter(filter);\n }\n\n return result;\n }\n\n /**\n * @method _searchDeep()\n * search each node of a tree and return all matches that pass the provided\n * filter.\n * @param {AB*} curr\n * An object that contains a tree structure.\n * @param {string} key\n * The curr[key] reference of the array of items to search\n * @param {function} filter\n * The curr[key].filter(filter) that returns true/false if a node is\n * to be included in the result.\n * @return {array}\n */\n _searchDeep(curr, key, filter) {\n let items = curr[key] ?? [];\n let resultsCurr = items.filter?.(filter) ?? [];\n\n for (let p of items) {\n let resultsP = this._searchDeep(p, key, filter);\n if (resultsP.length) {\n resultsCurr = resultsCurr.concat(resultsP);\n }\n }\n\n return resultsCurr;\n }\n\n ///\n /// Processes\n ///\n\n /**\n * @method processes()\n * return an array of all the ABProcesses for this ABApplication.\n * @param {fn} filter\n * a filter fn to return a set of ABProcesses that\n * this fn returns true for.\n * @return {array}\n * array of ABProcesses\n */\n processes(filter = () => true) {\n return this.AB.processes((p) => {\n return this.processIDs.indexOf(p.id) > -1;\n }).filter(filter);\n }\n\n hasProcess(process) {\n if (process && process.id) {\n return this.processIDs.indexOf(process.id) > -1;\n } else {\n return false;\n }\n }\n\n ///\n /// Views\n ///\n\n /**\n * @method views()\n * return an array of all the Views for this ABApplication.\n * @param {fn} filter\n * a filter fn to return a set of Views that this fn\n * returns true for.\n * @return {array}\n * array of Views\n */\n views(filter) {\n var result = [];\n var views = [];\n var pages = [];\n\n if (\n (!this._pages || this._pages.length < 1) &&\n (!this._views || this._views.length < 1)\n )\n return result;\n\n function lookDeep(view) {\n if (view._pages && view._pages.length) {\n view._pages.forEach((p) => {\n // check the page views recusively\n var pageViews = p.views(filter, true);\n // if there was a match store it\n if (pageViews && pageViews.length > 0) {\n result = pageViews;\n }\n // if no match move on to the subpages\n if (result.length < 1) {\n // loop through each subpage recursively\n var subPages = p.pages(filter, true);\n // if there was a match store it\n if (subPages && subPages.length > 0) {\n result = subPages;\n }\n if (result.length < 1) {\n lookDeep(p);\n }\n }\n });\n }\n }\n\n // look at views recursively\n if (filter) {\n // look at views recursively (views can have subviews and so on)\n if (this._views) {\n views = this._views.filter(filter);\n\n if (views.length < 1) {\n this._views.forEach((v) => {\n var subViews = v.views(filter, true);\n if (subViews && subViews.length > 0) {\n views = subViews;\n }\n });\n }\n }\n\n // if no views of the root page match now look at the sub pages and their views\n if (views.length) {\n result = views;\n } else {\n // check the first level subpages\n result = this._pages.filter(filter);\n\n // if no match check each pages views and subpages\n if (result.length < 1) {\n // looping through pages\n lookDeep(this);\n }\n }\n }\n // find all views\n else {\n // recusively gather all views on this view\n if (this._views) {\n views = this._views;\n if (views.length) {\n views.forEach((v) => {\n var subViews = v.views(() => true, true);\n if (subViews && subViews.length) {\n views = views.concat(subViews);\n }\n });\n }\n }\n\n // recursively gather all pages and their views\n if (this._pages) {\n pages = this._pages;\n if (pages.length) {\n pages.forEach((p) => {\n // grab all views on this page\n var pageViews = p.views(() => true, true);\n if (pageViews && pageViews.length) {\n views = views.concat(pageViews);\n }\n // grab all subpages on this page\n var subPages = p.pages(() => true, true);\n if (subPages && subPages.length) {\n pages = pages.concat(subPages);\n subPages.forEach((sub) => {\n var subViews = sub.views(() => true, true);\n if (subViews && subViews.length) {\n views = views.concat(subViews);\n }\n });\n }\n });\n }\n }\n\n result = result.concat(pages, views);\n }\n\n return result;\n }\n\n /**\n * @method viewAll()\n * return a list of all the {ABViewxxx} classes available.\n * @return {array} of ABView objects\n */\n viewAll(fn = () => true) {\n return this.ViewManager.allViews(fn);\n }\n\n ///\n /// Queries\n ///\n\n /**\n * queriesExcluded()\n * return a list of ABObjectQuery(s) that are not included in this\n * ABApplication.\n * @param {fn} filter\n * a filter fn to further reduce which queries to return.\n * @return {array}\n */\n queriesExcluded(filter = () => true) {\n return this.AB.queries((q) => {\n return this.queryIDs.indexOf(q.id) == -1;\n }).filter(filter);\n }\n\n /**\n * queriesIncluded()\n * return a list of ABObjectQuery(s) that are included in this\n * ABApplication.\n * @param {fn} filter\n * a filter fn to further reduce which queries to return.\n * @param {fn} [sort] function to sort by, default is .label\n * @return {array}\n */\n queriesIncluded(filter = () => true, sort) {\n // by default sort by label\n const sortFn = sort ?? ((a, b) => a.label.localeCompare(b.label));\n return this.AB.queries((q) => {\n return this.queryIDs.indexOf(q.id) > -1;\n })\n .filter(filter)\n .sort(sortFn);\n }\n\n ///\n /// Roles\n ///\n\n /**\n * @method roles()\n * return an array of all the ABRole for this ABApplication.\n * @param {fn} filter\n * a filter fn to further reduce which roles to return.\n * @return {array} array of ABRole\n */\n // roles(filter = () => true) {\n // return (this.role || []).filter(filter);\n // }\n\n /**\n * @method urlResolve()\n * given an object pointer, return the specific object referenced.\n * pointer must start with a '#', use '/' as delimiters, and either\n * reference an object's .id, or an object's .property.\n * for example:\n * #/_objects : resolves to the array of ._objects pointed to by this\n * application.\n * #/_objects/[object.id] : reolved to a specific object\n * #/_objects/[object.id]/_fields/[field.id] : resolves to a specific data field\n * refereced by object.id.\n *\n * @param {string} pointer : the string url referencing the object you want\n * to retrieve.\n * @return {obj}\n */\n urlResolve(pointer) {\n var parts = pointer.split(\"/\");\n\n var parseStep = (obj, steps) => {\n // we're done. obj is what we are looking for:\n if (steps.length == 0) {\n return obj;\n }\n\n // pull the next step key:\n var key = steps.shift();\n\n // special case, \"#\" makes sure we are talking about the\n // Application object\n if (key == \"#\") {\n return parseStep(this, steps);\n }\n\n // if obj is an [], then key should be an .id reference to\n // lookup:\n if (Array.isArray(obj)) {\n obj = obj.filter(function (o) {\n return o.id == key;\n })[0];\n return parseStep(obj, steps);\n }\n\n // otherwise obj should be an {} and key a property:\n if (obj && obj[key]) {\n return parseStep(obj[key], steps);\n }\n\n if (key == \"_objects\") {\n console.error(new Error(\"REFACTOR: old objectBy url reference:\"));\n\n // This can be gotten from our AB\n var id = steps.shift();\n return parseStep(this.AB.objectByID(id), steps);\n }\n\n // if we got here, there is an error!\n // console.error('!!! failed to lookup url:'+pointer);\n console.error(\"!!! failed to lookup url:\" + pointer);\n return null;\n };\n\n return parseStep(this, parts);\n }\n\n /**\n * @method urlPointer()\n * return the url pointer for this application.\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlPointer(acrossApp) {\n // NOTE: if we need to expand this to search across\n // applications, then add in this application.id here:\n if (acrossApp) return \"#/\" + this.id + \"/\";\n else return \"#/\";\n }\n\n /**\n * @method urlObject()\n * return the url pointer for objects in this application.\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlObject(acrossApp) {\n return this.urlPointer(acrossApp) + \"_objects/\";\n }\n\n /**\n * @method urlView()\n * return the url pointer for pages in this application.\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlPage(acrossApp) {\n return this.urlPointer(acrossApp) + \"_pages/\";\n }\n\n /**\n * @method urlQuery()\n * return the url pointer for queries in this application.\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlQuery(acrossApp) {\n return this.urlPointer(acrossApp) + \"_queries/\";\n }\n\n /**\n * @method version()\n * return the current version of this Application.\n * Version information is in format \"{Major}.{Minor}.{patch}\"\n * @return {string}\n */\n get version() {\n return this.json?.versionData?.versionNumber ?? \"0.0.0\";\n }\n\n ///\n /// Object List Settings\n ///\n get objectlistIsOpen() {\n return this.objectListSettings.isOpen;\n }\n\n set objectlistIsOpen(isOpen) {\n this.objectListSettings.isOpen = isOpen;\n }\n\n get objectlistSearchText() {\n return this.objectListSettings.searchText;\n }\n\n set objectlistSearchText(searchText) {\n this.objectListSettings.searchText = searchText;\n }\n\n get objectlistSortDirection() {\n return this.objectListSettings.sortDirection;\n }\n\n set objectlistSortDirection(sortDirection) {\n this.objectListSettings.sortDirection = sortDirection;\n }\n\n get objectlistIsGroup() {\n return this.objectListSettings.isGroup;\n }\n\n set objectlistIsGroup(isGroup) {\n this.objectListSettings.isGroup = isGroup;\n }\n\n ///\n /// Instance generators\n ///\n\n /**\n * @method pageNew()\n *\n * return an instance of a new (unsaved) ABViewPage that is tied to this\n * ABApplication.\n *\n * NOTE: this new page is not included in our this.pages until a .save()\n * is performed on the page.\n *\n * @return {ABViewPage}\n */\n pageNew(values) {\n // make sure this is an ABViewPage description\n // values.key = ABViewPageCore.common().key;\n values.key = \"page\";\n\n return this.ViewManager.newView(values, this, null);\n }\n\n /**\n * @method pageByID()\n * return pages from the given {id}\n * @param {string} id\n * the uuid of the page to return.\n * @param {bool} deep\n * should this search deep (through all our children's children)\n * @return {ABViewPage}\n */\n pageByID(id, deep = true) {\n return this.pages((f) => f.id == id, deep)[0];\n }\n\n /**\n * @method viewNew()\n *\n * return an instance of a new (unsaved) ABView.\n *\n * @return {ABView}\n */\n viewNew(values, application, parent) {\n return this.ViewManager.newView(values, application, parent);\n }\n\n ///\n /// Utilities\n ///\n\n cloneDeep(/* object */) {\n var errorDepreciated = new Error(\n \"ABApplicationCore.cloneDeep(): Depreciated! Use AB.cloneDeep() instead.\"\n );\n throw errorDepreciated;\n\n // return JSON.parse(JSON.stringify(object));\n }\n};\n","/**\n * ABApplicationMobileCore\n *\n * This is the core ABApplicationMobile class that manages the common operations\n * of a Mobile PWA ABApplication.\n */\n\n// webpack can handle 'require()' statements, but node can't handle import\n// so let's use require():\nconst ABViewManagerMobile = require(\"../platform/ABViewManagerMobile\");\nvar ABApplication = require(\"../platform/ABApplication\");\n\nmodule.exports = class ABApplicationMobileCore extends ABApplication {\n constructor(attributes, AB) {\n super(attributes, AB);\n this.appType = \"mobile\"; // Just making sure.\n this.networkType = attributes.networkType;\n\n this.pageDefault = attributes.pageDefault;\n // {uuid}\n // the {ABMobilePage}.uuid of the page that is our default Page.\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n ///\n /// Instance Methods\n ///\n\n get ViewManager() {\n return ABViewManagerMobile;\n }\n\n pageNew(def) {\n console.error(\"TODO: pageNew for ApplicationMobile\");\n return null;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var json = super.toObj();\n json.appType = \"mobile\";\n json.networkType = this.networkType;\n\n json.pageDefault = this.pageDefault;\n\n return json;\n }\n};\n","/*\n * ABDataCollection\n * Defines a set of data that other parts of the Application can work with.\n * it can point to either an ABObject, or ABObjectQuery, and can have an\n * filter, and sorts defined.\n *\n *\n *\n */\n// const ABEmitter = require(\"../platform/ABEmitter\");\nconst ABMLClass = require(\"../platform/ABMLClass\");\n\n// const ABObject = require(\"../platform/ABObject\");\n// const ABObjectQuery = require(\"../platform/ABObjectQuery\");\n// const RowFilter = require(\"../platform/RowFilter\");\n\nvar DefaultValues = {\n id: \"uuid\",\n label: \"\", // label\n object: {}, // json of ABObject\n query: {}, // json of ABObjectQuery\n settings: {\n datasourceID: \"\", // id of ABObject or ABObjectQuery\n linkDatacollectionID: \"\", // id of ABDatacollection\n linkFieldID: \"\", // id of ABField\n followDatacollectionID: \"\", // id of ABDatacollection\n objectWorkspace: {\n filterConditions: {\n // array of filters to apply to the data table\n glue: \"and\",\n rules: [],\n },\n sortFields: [], // array of columns with their sort configurations\n },\n loadAll: false,\n // preventPopulate: false, depreciating in favour of populate\n populate: true, // true/false or array of columns to populate.\n isQuery: false, // if true it is a query, otherwise it is a object.\n\n fixSelect: \"\", // _CurrentUser, _FirstRecord, _FirstRecordDefault or row id\n\n syncType: 1, // 1 (Server), 2 (Client)\n },\n};\n\nconst QueuedOperations = [];\n// {array} of operations that we want to perform but allow some space\n// between operations.\nvar _queueTimer = null;\n\nfunction runQueue() {\n // if (!_queueTimer) {\n // _queueTimer = setInterval(() => {\n // runQueue();\n // }, 20);\n // }\n if (QueuedOperations.length == 0) {\n // stop\n // clearInterval(_queueTimer);\n _queueTimer = null;\n return;\n }\n var op = QueuedOperations.shift();\n op.fn();\n _queueTimer = setTimeout(runQueue, op.timeout);\n}\nfunction queueOperation(fn, timeout = 20) {\n QueuedOperations.push({ fn, timeout });\n if (!_queueTimer) {\n runQueue();\n }\n}\n\n/**\n * @function SearchWhereCond()\n * Recursively search through the where condition and find any\n * rules that match one of the provided rules.\n * If one is found, we call the given callback with that rule.\n * @param {*} cond\n * The current condition to search through. Could be the base\n * glue logic, or an individual rule.\n * @param {array} rules\n * An array of cond.rule values to search for.\n * eg: [\"equals\", \"contains\", \"in_data_collection\"]\n * @param {fn} cb\n * A callback function to call when a matching rule is found.\n */\nfunction SearchWhereCond(cond, rules, cb) {\n if (!cond) return;\n if (cond.rules) {\n cond.rules.forEach((r) => {\n SearchWhereCond(r, rules, cb);\n });\n return;\n }\n if (rules.filter((f) => f == cond.rule).length > 0) {\n cb(cond);\n }\n}\n\nmodule.exports = class ABDataCollectionCore extends ABMLClass {\n constructor(attributes, AB) {\n super([\"label\"], AB);\n\n attributes = attributes || {};\n\n // this.application = application;\n\n this.fromValues(attributes);\n\n this.__dataCollection = this._dataCollectionNew([]);\n // {DataCollection}\n // This is a working instance of a DataCollection, not an {ABDatacCollection}\n // On web/mobile this is a webix component. So keep the creation as part of\n // the platform/ABDataCollection implementation.\n\n // Set filter value\n this.refreshFilterConditions();\n\n this.__bindComponentIds = [];\n this.__flexComponentIds = [];\n\n // refresh a data collection\n // this.init();\n\n // mark data status does not be initialized\n this._dataStatus = this.dataStatusFlag.notInitial;\n\n this.__filterCond = null;\n // {QueryCondition}\n // A passed in Query Condition for filtering our DataCollection.\n // This value is ANDed with our normal filter conditions.\n\n this.__model = null;\n // {ABModel}\n // An instance of the ABModel used for this DataCollection to\n // access data on the server.\n\n this._pendingLoadDataResolves = {\n /* jobID : {pendingResolve } */\n };\n }\n\n /**\n * contextKey()\n *\n * return a unique key that represents data from/for this type of object.\n *\n * used when creating Network jobs and needing to be notified when a job\n * is complete. We send a contextKey() to the Network job and then listen\n * for it to know when it is complete.\n * @return {string}\n */\n static contextKey() {\n return \"datacollection\";\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n this.id = values.id;\n // {string} .id\n // the uuid of this ABDataCollection Definition.\n\n this.name = values.name || null;\n // {string} .name\n // the unchanging name of this ABDataCollection\n\n this.type = values.type || \"datacollection\";\n // {string} .type\n // the type of ABDefinition this is.\n\n values.settings = values.settings || {};\n this.settings = this.settings || {};\n // {obj} .settings\n // the specific operation values for this ABDataCollection\n\n this.settings.linkDatacollectionID =\n values.settings.linkDatacollectionID ||\n DefaultValues.settings.linkDatacollectionID;\n // {string} .settings.linkDatacollectionID\n // the uuid of another ABDataCollection that provides the link/trigger\n // for filtering the values of this ABDataCollection.\n\n this.settings.linkFieldID =\n values.settings.linkFieldID || DefaultValues.settings.linkFieldID;\n // {string} .settings.linkFieldID\n // this.fieldLink is intended to be the way to connect to the column in\n // the datacollectionLink that we are following. However this field\n // is the field in this.datasource that connects to the field in\n // datacollectionLink that has the value we are linked to.\n // So, If this DC(ObjB), and our datacollectionLink (ObjA)\n // then this.fieldLink = ObjB->FieldB\n // To find the corresponding field in ObjA, we do:\n // this.fieldLink.fieldLink (ObjA->FieldA)\n\n this.settings.followDatacollectionID =\n values.settings.followDatacollectionID ||\n DefaultValues.settings.followDatacollectionID;\n // {string} .settings.followDatacollectionID\n // the uuid of another ABDataCollection that provides the follow cursor data collection\n\n this.settings.objectWorkspace = values.settings.objectWorkspace || {\n filterConditions:\n DefaultValues.settings.objectWorkspace.filterConditions,\n sortFields: DefaultValues.settings.objectWorkspace.sortFields,\n };\n // {obj} .settings.objectWorkspace\n // the default settings for what is shown in the AppBuilder's\n // DataCollection workspace\n\n this.settings.fixSelect = values.settings.fixSelect;\n\n // Convert to boolean\n this.settings.loadAll = JSON.parse(\n values.settings.loadAll || DefaultValues.settings.loadAll\n );\n // {bool} .settings.loadAll\n // do we load all the data at one time? false == load by pages.\n\n this.settings.isQuery = JSON.parse(\n values.settings.isQuery || DefaultValues.settings.isQuery\n );\n // {bool} .settings.isQuery\n // is the data source for this ABDataCollection based upon an\n // ABObjectQuery?\n\n this.settings.populate = (() => {\n // First check .populate\n if (values.settings.populate != undefined) {\n return values.settings.populate;\n // Then check legacy .preventPopulate\n } else if (\n values.settings.preventPopulate == true ||\n values.settings.preventPopulate == \"1\"\n ) {\n return false;\n } else return DefaultValues.settings.populate;\n })();\n // {bool | array} populate\n // Control whcih related connections to populate. Default, true, populates\n // all connections. False loads no connnections. Also accepts an array of\n // column names to load specefic connections.\n\n // Convert to number\n this.settings.syncType = parseInt(\n values.settings.syncType || DefaultValues.settings.syncType\n );\n // {int} .settings.syncType\n // how is the data between this ABDataCollection and it's\n // .datasource synced?\n\n // Skip CSV packing\n this.settings.skipPack = values?.settings?.skipPack ?? false;\n\n // Selected fields\n this.settings.select = values?.settings?.select ?? null;\n\n this.__datasource = null;\n // {obj} .__datasource\n // the reference to the ABObject/ABObjectQuery that this ABDataCollection\n // is based off of.\n\n this.settings.datasourceID =\n values.settings.datasourceID || DefaultValues.settings.datasourceID;\n // {string} .settings.datasourceID\n // the uuid of the .__datasource object to use\n\n // now lookup and reference the proper datasource\n if (this.settings.datasourceID) {\n // check for an ABObject\n var obj = this.AB.objectByID(this.settings.datasourceID);\n if (!obj) {\n // this must be an ABObjectQuery then ...\n obj = this.AB.queryByID(this.settings.datasourceID);\n }\n\n if (obj) {\n this.__datasource = obj;\n this.settings.isQuery = obj.type === \"query\";\n if (this.settings.isQuery) {\n if (this.__datasource.isGroup) {\n if (!this.__treeCollection)\n this.__treeCollection = this._treeCollectionNew();\n // {TreeCollection}\n // This is a webix TreeCollection (or similar)\n // keep it's implementation as part of the platform\n\n this.__isGroup = true;\n }\n }\n } else {\n console.error(\n `ABDataCollection[${this.name}][${this.id}] unable to find datasource [${this.settings.datasourceID}]`\n );\n }\n }\n\n // // Populate data source: ABObject or ABObjectQuery\n // if (values.query && values.query[0]) {\n // this.__datasource = new ABObjectQuery(\n // values.query[0],\n // this.application\n // );\n // this.settings.isQuery = true;\n\n // if (this.__datasource.isGroup) {\n // if (!this.__treeCollection)\n // this.__treeCollection = this._treeCollectionNew();\n\n // this.__isGroup = true;\n // }\n // } else if (values.object && values.object[0]) {\n // this.__datasource = new ABObject(values.object[0], this.application);\n // this.settings.isQuery = false;\n // }\n\n // let the MLClass now process the translations:\n super.fromValues(values);\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var obj = super.toObj(); // untranslate the object\n\n return {\n id: this.id,\n name: this.name || this.label,\n type: this.type || \"datacollection\",\n settings: this.AB.cloneDeep(this.settings || {}),\n translations: obj.translations,\n };\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABDatacollection with it's parent\n *\n *\n * @return {Promise}\n * .resolve( {this} )\n */\n async save() {\n if (!this.id) {\n this.label = this.label || this.name;\n }\n await super.save();\n return this;\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABDatacollection\n *\n * also remove it from our parent application\n *\n * @return {Promise}\n */\n destroy() {\n var removeFromApplications = () => {\n return new Promise((next, err) => {\n // this.AB.applications().then((apps) => {\n\n const apps = this.AB.applications();\n // NOTE: apps is a webix datacollection\n\n var allRemoves = [];\n\n var appsWithObject = apps.filter((a) => {\n return a.datacollectionsIncluded((o) => o.id == this.id);\n });\n appsWithObject.forEach((app) => {\n allRemoves.push(app.datacollectionRemove(this));\n });\n\n return Promise.all(allRemoves).then(next).catch(err);\n // });\n });\n };\n\n return Promise.resolve()\n .then(() => {\n return removeFromApplications();\n })\n .then(() => {\n return super.destroy();\n })\n .then(() => {\n this.emit(\"destroyed\");\n });\n }\n\n /**\n * @property $dc\n * return the underlying webix datacollection\n * @return {webix.datacollection}\n */\n get $dc() {\n return this.__dataCollection;\n }\n\n /**\n * @property datasource\n * return a object of this component.\n *\n * @return {ABObject|ABObjectQuery}\n */\n get datasource() {\n if (!this.__datasource) {\n if (this.id && this.name) {\n // occassionally we have blank DCs (without .id or .name)\n // and I don't want to see errors for those\n var err = new Error(\n `DataCollection[${this.name}][${this.id}] missing reference datasource`\n );\n this.AB.notify(\"builder\", err, { datacollection: this.toObj() });\n }\n return null;\n }\n var obj = this.AB.objectByID(this.__datasource.id);\n if (!obj) {\n obj = this.AB.queryByID(this.__datasource.id);\n }\n return obj;\n }\n\n /**\n * @property datasource\n * set a object to data collection\n *\n * @param {ABObject|ABObjectQuery} object\n */\n set datasource(object) {\n this.__datasource = object;\n\n this.refreshFilterConditions();\n }\n\n /**\n * @property sourceType\n * return type of source.\n *\n * @return {string} - 'object' or 'query'\n */\n get sourceType() {\n return this.settings.isQuery ? \"query\" : \"object\";\n }\n\n /**\n * @method datacollectionLink\n * return a ABDatacollection that link of this.\n *\n * @return {ABDatacollection}\n */\n get datacollectionLink() {\n if (!this.AB) return null;\n\n return this.AB.datacollectionByID(this.settings.linkDatacollectionID);\n }\n\n /**\n * @property fieldLink\n * return a ABFieldConnect field that link of this.\n *\n * @return {ABFieldConnect}\n */\n get fieldLink() {\n let object = this.datasource;\n if (!object) return null;\n\n return object.fieldByID(this.settings.linkFieldID);\n }\n\n /**\n * @property model\n * return a source model\n *\n * @return ABModel\n */\n get model() {\n if (!this.__model) {\n let object = this.datasource; // already notified\n\n this.__model = object ? object.model() : null;\n }\n return this.__model;\n }\n\n get dataStatusFlag() {\n return {\n notInitial: 0,\n initializing: 1,\n initialized: 2,\n };\n }\n\n get dataStatus() {\n return this._dataStatus;\n }\n\n get isDataInitialized() {\n return this.dataStatus == this.dataStatusFlag.initialized;\n }\n\n dataInitialized() {\n this._dataStatus = this.dataStatusFlag.initialized;\n }\n\n ///\n /// Cursor\n ///\n\n setCursor(itemId) {\n // If the static cursor is set, then this DC could not set cursor to other rows\n if (\n this.settings.fixSelect &&\n (this.settings.fixSelect != \"_FirstRecordDefault\" ||\n this.settings.fixSelect == itemId)\n )\n return;\n\n if (this.__treeCollection) {\n // set cursor of tree collection\n this.setCursorTree(itemId);\n\n // pull current row id\n let currTreeId = this.__treeCollection.getCursor();\n if (currTreeId) {\n let currTreeItem = this.__treeCollection.getItem(currTreeId);\n if (currTreeItem) itemId = currTreeItem._itemId;\n }\n }\n\n let dc = this.__dataCollection;\n if (dc) {\n // Store the old cursor id\n this.__previousCursorId = dc.getCursor();\n\n // clear cursor\n if (itemId == null) {\n dc.setCursor(null);\n }\n // If set rowId equal current cursor, it will not trigger .onAfterCursorChange event\n else if (dc.getCursor() == itemId) {\n this.emit(\"changeCursor\", this.getCursor());\n }\n // set new cursor\n else if (dc.exists(itemId)) {\n dc.setCursor(itemId);\n }\n }\n }\n\n /**\n *\n * @param {string|number} itemId - Id of item or Id of row data\n */\n setCursorTree(itemId) {\n let tc = this.__treeCollection;\n if (tc && tc.getCursor() != itemId) {\n // If it is id of tree collection, then find row id of data\n let treeCursor = tc.find({ id: itemId }, true);\n if (treeCursor) {\n tc.setCursor(itemId);\n }\n // If it is not id of tree collection, then find/set root of data\n else {\n let treeItem = tc.find({ _itemId: itemId, $parent: 0 }, true);\n if (treeItem) tc.setCursor(treeItem.id);\n else tc.setCursor(null);\n }\n }\n }\n\n getCursor(treeCursor = false) {\n // Cursor of tree collection\n if (treeCursor && this.__treeCollection) {\n let currId = this.__treeCollection.getCursor();\n if (currId) {\n let currItem = this.__treeCollection.getItem(currId);\n\n // filter current id for serialize\n this.__treeCollection.filter(\n (item) => item._itemId == currItem._itemId\n );\n\n // pull item with child items\n let currItemAndChilds =\n this.__treeCollection.serialize()[0] || null;\n\n // refresh filter\n this.refreshLinkCursor();\n\n return currItemAndChilds;\n }\n }\n\n let dc = this.__dataCollection;\n if (dc == null) return null;\n\n let currId = dc.getCursor();\n let currItem = dc.getItem(currId);\n\n return currItem;\n }\n\n getFirstRecord() {\n var dc = this.__dataCollection;\n if (dc == null) return null;\n\n var currId = dc.getFirstId();\n var currItem = dc.getItem(currId);\n\n return currItem;\n }\n\n getNextRecord(record) {\n var dc = this.__dataCollection;\n if (dc == null) return null;\n\n var currId = dc.getNextId(record.id);\n var currItem = dc.getItem(currId);\n\n return currItem;\n }\n\n /**\n * @method refreshLinkCursor\n * If the data collection is bound to another and it is the child connection\n * it finds it's parents current set cursor and then filters its data\n * based off of the cursor.\n *\n * In cases where a DC has set .loadAll, our job is to filter existing data\n * that is already loaded in the internal __dataCollection.\n *\n * Otherwise this is not the place to trigger a data refresh. We depend\n * on other mechanisms (.reloadData(), datacollection .select()) to trigger\n * an update.\n */\n refreshLinkCursor(force = false) {\n // our filter conditions need to know there was an updated cursor.\n // some of our filters are based upon our linked data.\n this.refreshFilterConditions();\n\n // NOTE: If DC does not set load all data, then it does not need to filter by the parent DC.\n // because it fetch data when the cursor of the parent DC changes.\n if (!this.settings.loadAll && !force) return;\n\n // do not set the filter unless this dc is initialized \"dataStatusFlag==2\"\n // if (this.dataStatus != this.dataStatusFlag.initialized) return;\n\n // filter the data in the data collection\n // using its parents current cursor because all the data in this child\n // data collection has been loaded and the frontend can decide what is\n // seen or not seen\n let linkCursor;\n let dvLink = this.datacollectionLink;\n if (dvLink) {\n linkCursor = dvLink.getCursor();\n }\n\n let filterData = (rowData) => {\n // This row is not loaded yet. It will be loaded when scrolling.\n if (rowData == null) return true;\n\n // if link dc cursor is null:\n // ... if there's no parent show all data\n // ... if we have a parent hide all data - address cases where user see\n // unexpected data (ns_app#318) - should this be a DC setting?\n if (!linkCursor) return dvLink ? false : true;\n else return this.isParentFilterValid(rowData);\n };\n\n if (this.__dataCollection) this.__dataCollection.filter(filterData);\n if (this.__treeCollection) this.__treeCollection.filter(filterData);\n }\n\n setStaticCursor() {\n if (this.settings.fixSelect) {\n // set cursor to the current user\n if (this.settings.fixSelect == \"_CurrentUser\") {\n var username = this.currentUserUsername();\n var userFields = this.datasource.fields((f) => f.key == \"user\");\n\n // find a row that contains the current user\n var row = this.__dataCollection.find((r) => {\n var found = false;\n\n userFields.forEach((f) => {\n if (found || r[f.columnName] == null) return;\n\n if (r[f.columnName].filter) {\n // Array - isMultiple\n found =\n r[f.columnName].filter((data) => data.id == username)\n .length > 0;\n } else if (r[f.columnName] == username) {\n found = true;\n }\n });\n\n return found;\n }, true);\n\n // set a first row of current user to cursor\n if (row) {\n this.__dataCollection.setCursor(row.id);\n\n this.setCursorTree(row.id);\n }\n } else if (\n this.settings.fixSelect == \"_FirstRecord\" ||\n this.settings.fixSelect == \"_FirstRecordDefault\"\n ) {\n // // find a row that contains the current user\n // var row = this.__dataCollection.find((r) => {\n\n // var found = false;\n // if (!found) {\n // found = true;\n // return true; // just give us the first record\n // }\n\n // }, true);\n\n // // set a first row of current user to cursor\n // if (row)\n // this.__dataCollection.setCursor(row.id);\n\n let currRowId = this.__dataCollection.getCursor();\n if (\n !currRowId ||\n (currRowId && !this.__dataCollection.exists(currRowId))\n ) {\n // If current cursor is filtered by parent DC, then select new cursor\n\n // set a first row to cursor\n let rowId = this.__dataCollection.getFirstId();\n // if (rowId) {\n this.__dataCollection.setCursor(rowId || null);\n\n // NOTE: differnece between ab_platform_web and ab_platform_pwa\n if (\n this.__dataCollection.data?.count?.() == 0 ||\n this.__dataCollection.data?.length == 0\n ) {\n this.emit(\"collectionEmpty\", {});\n }\n\n this.setCursorTree(rowId);\n // }\n }\n } else {\n this.__dataCollection.setCursor(this.settings.fixSelect);\n\n this.setCursorTree(this.settings.fixSelect);\n }\n }\n\n // Set the cursor to the first row\n if (this.isCursorFollow) {\n const rowId = this.__dataCollection.getFirstId();\n this.setCursor(rowId || null);\n this.setCursorTree(rowId || null);\n\n // If no data but the parent DC set cursor, then this should be reload data.\n const dcFollow = this.datacollectionFollow;\n if (!rowId && dcFollow?.getCursor()) {\n this.loadData();\n }\n }\n }\n\n ///\n /// Data\n ///\n\n /**\n * @method filterCondition()\n * Provide a temporary filter condition to modify the data we are returning.\n * Used by User search criterias.\n * @param {json} cond\n * A valid QueryCondition to filter the response.\n */\n filterCondition(cond = null) {\n this.__filterCond = cond;\n }\n\n init() {\n // prevent initialize many times\n if (this.initialized) return;\n this.initialized = true;\n\n if (!this.__dataCollection.___AD.onAfterCursorChange) {\n this.__dataCollection.___AD.onAfterCursorChange =\n this.__dataCollection.attachEvent(\"onAfterCursorChange\", () => {\n // debugger;\n var currData = this.getCursor();\n\n this.emit(\"changeCursor\", currData);\n });\n }\n\n // relate data functions\n let isRelated = (relateData, rowId, PK = \"id\") => {\n if (Array.isArray(relateData)) {\n return relateData.filter((v) => (v[PK] || v) == rowId).length > 0;\n } else {\n return relateData && (relateData[PK] || relateData) == rowId;\n }\n };\n\n // events\n this.on(\"ab.datacollection.create\", (data) => {\n // NOTE: UPDATing this process to add another check.\n // .isCursorFollow only invalidates the 1st half of the routine.\n // .isCursorFollow STILL needs to follow the 2nd half of the routine\n // // If this DC is following cursor for other DC, then it should not add the new item to their list.\n // if (this.isCursorFollow) return;\n\n let obj = this.datasource;\n if (!obj) return;\n\n if (!data || !data.data) return;\n\n let needAdd = false;\n let updatedVals = [];\n\n // Don't do First Step if .isCursorFollow\n if (!this.isCursorFollow) {\n // First Step\n // Does this new entry need to be part of the data we are currently\n // tracking? If so, add it.\n Promise.resolve()\n .then(() => {\n return new Promise((next, bad) => {\n // Query\n if (obj instanceof this.AB.Class.ABObjectQuery) {\n let objList =\n obj.objects((o) => o.id == data.objectId) || [];\n\n needAdd = objList.length > 0;\n\n if (!needAdd) return next();\n\n let where = {\n glue: \"or\",\n rules: [],\n };\n\n objList.forEach((o) => {\n let newDataId = data.data[`${o.PK()}`];\n if (!newDataId) return;\n\n where.rules.push({\n key: `${\n o.alias || obj.objectAlias(o.id)\n }.${o.PK()}`,\n rule: \"equals\",\n value: newDataId,\n });\n });\n\n obj.model()\n .findAll({\n where: where,\n })\n .then((newQueryData) => {\n updatedVals = newQueryData.data || [];\n updatedVals.forEach((v) => {\n delete v.id;\n });\n\n next();\n })\n .catch(bad);\n }\n // Object\n else {\n needAdd = obj.id == data.objectId;\n updatedVals = [data.data];\n next();\n }\n });\n })\n .then(() => {\n if (needAdd) {\n (updatedVals || []).forEach((updatedV) => {\n // If this DC uses a query, it pulls refreshed data from the server in the previous step,\n // so there is no need to recheck the query's filter.\n const skipDatasourceFilter =\n obj instanceof this.AB.Class.ABObjectQuery;\n\n // filter condition before add\n if (!this.isValidData(updatedV, skipDatasourceFilter))\n return;\n\n // filter the cursor of parent DC\n const dcLink = this.datacollectionLink;\n if (dcLink && !this.isParentFilterValid(updatedV))\n return;\n\n // check to see if item already exisits in data collection\n // and check to see that we are not loading the data serverside from cursor\n if (\n !this.__dataCollection.exists(\n updatedV[`${obj.PK()}`]\n ) &&\n !this.__reloadWheres\n ) {\n this.__dataCollection.add(updatedV, 0);\n this.emit(\"create\", updatedV);\n // this.__dataCollection.setCursor(rowData.id);\n } else if (\n !this.__dataCollection.exists(\n updatedV[`${obj.PK()}`]\n ) &&\n this.__reloadWheres\n ) {\n // debugger;\n if (this.isParentFilterValid(updatedV)) {\n // we track bound components and flexlayout components\n var attachedComponents =\n this.__bindComponentIds.concat(\n this.__flexComponentIds\n );\n attachedComponents.forEach((bcids) => {\n // if the reload button already exisits move on\n if ($$(bcids + \"_reloadView\")) {\n return false;\n }\n\n // find the position of the data view\n var pos = 0;\n var parent = $$(bcids).getParentView();\n if ($$(bcids).getParentView().index) {\n pos = $$(bcids)\n .getParentView()\n .index($$(bcids));\n } else if (\n $$(bcids).getParentView().getParentView()\n .index\n ) {\n // this is a data view and it is inside a\n // scroll view that is inside an accodion\n // so we need to go deeper to add the button\n parent = $$(bcids)\n .getParentView()\n .getParentView();\n pos = $$(bcids)\n .getParentView()\n .getParentView()\n .index($$(bcids).getParentView());\n }\n\n // store the datacollection so we can pass it to the button later\n var DC = this;\n // add a button that reloads the view when clicked\n if (parent.addView) {\n var L = this.AB.Label();\n parent.addView(\n {\n id: bcids + \"_reloadView\",\n view: \"button\",\n value: L(\n \"New data available. Click to reload.\"\n ),\n css: \"webix_primary webix_warn\",\n click: function (id, event) {\n DC.reloadData();\n $$(id)\n .getParentView()\n .removeView(id);\n },\n },\n pos\n );\n }\n });\n // this.emit(\"create\", updatedV);\n }\n }\n });\n\n if (\n this.__treeCollection // && this.__treeCollection.exists(updatedVals.id)\n ) {\n this.parseTreeCollection({\n data: updatedVals,\n });\n }\n }\n\n // ABObject only\n if (!(obj instanceof this.AB.Class.ABObjectQuery)) {\n // if it is a linked object\n let connectedFields = this.datasource.connectFields(\n (f) =>\n f.datasourceLink &&\n f.datasourceLink.id == data.objectId\n );\n\n // It should always be only one item for ABObject\n updatedVals = updatedVals[0];\n\n // update relation data\n if (\n updatedVals &&\n connectedFields &&\n connectedFields.length > 0\n ) {\n // various PK name\n let PK = connectedFields[0].object.PK();\n if (!updatedVals.id && PK != \"id\")\n updatedVals.id = updatedVals[PK];\n\n this.__dataCollection.find({}).forEach((d) => {\n let updateItemData = {};\n\n connectedFields.forEach((f) => {\n var updateRelateVal = {};\n if (f && f.fieldLink) {\n updateRelateVal =\n updatedVals[f.fieldLink.relationName()] ||\n {};\n }\n\n let rowRelateVal = d[f.relationName()] || {};\n\n let valIsRelated = isRelated(\n updateRelateVal,\n d.id,\n PK\n );\n\n // Relate data\n if (\n Array.isArray(rowRelateVal) &&\n rowRelateVal.filter(\n (v) =>\n v == updatedVals.id ||\n v.id == updatedVals.id ||\n v[PK] == updatedVals.id\n ).length < 1 &&\n valIsRelated\n ) {\n rowRelateVal.push(updatedVals);\n\n updateItemData[f.relationName()] =\n rowRelateVal;\n updateItemData[f.columnName] = updateItemData[\n f.relationName()\n ].map((v) => v.id || v[PK] || v);\n } else if (\n !Array.isArray(rowRelateVal) &&\n (rowRelateVal != updatedVals.id ||\n rowRelateVal.id != updatedVals.id ||\n rowRelateVal[PK] != updatedVals.id) &&\n valIsRelated\n ) {\n updateItemData[f.relationName()] = updatedVals;\n updateItemData[f.columnName] =\n updatedVals.id || updatedVals;\n }\n });\n\n // If this item needs to update\n if (Object.keys(updateItemData).length > 0) {\n this.__dataCollection.updateItem(\n d.id,\n updateItemData\n );\n\n if (this.__treeCollection)\n this.__treeCollection.updateItem(\n d.id,\n updateItemData\n );\n\n this.emit(\n \"update\",\n this.__dataCollection.getItem(d.id)\n );\n }\n });\n }\n }\n\n this.updateRelationalDataFromLinkDC(data.objectId, data.data);\n // filter link data collection's cursor\n this.refreshLinkCursor();\n this.setStaticCursor();\n });\n }\n\n // SECOND Step:\n // Try to detect if this newly created entry connects to one of the\n // values this DC is currently managing. If so, than add this value\n // to the connection.\n\n let incomingObj = this.AB.objectByID(data.objectId);\n if (!incomingObj) return;\n\n // find any of incomingObj connections that are tied to my object:\n let connectedFields = incomingObj\n .connectFields((f) => f.datasourceLink?.id == obj.id)\n .filter((f) => f); // <-- safety check, no undefined or nulls\n if (connectedFields.length == 0) return;\n\n let iPK = incomingObj.PK();\n let PK = obj.PK();\n let newData = this.AB.cloneDeep(data.data);\n\n let currCursor = this.getCursor();\n let needsRefresh = false;\n\n connectedFields.forEach((f) => {\n // pull the values in this connected fields\n let values = data.data[f.columnName]; // just need the PK\n\n if (!Array.isArray(values))\n values = [values].filter((v) => !this.AB.isNil(v));\n\n values.forEach((v) => {\n v = v[PK] || v; // just in case this was an {} and not the {uuid}\n\n // if this is one of the items we are managing\n if (this.__dataCollection.exists(v)) {\n let localField = f.fieldLink;\n if (localField) {\n let row = this.__dataCollection.getItem(v);\n let colName = localField.columnName;\n let relName = localField.relationName();\n\n if (localField.linkType() == \"many\") {\n if (!Array.isArray(row[colName])) {\n row[colName] = [row[colName]].filter(\n (r) => !this.AB.isNil(r)\n );\n }\n // if it isn't already in the array, add it\n let rval = localField.getRelationValue(newData);\n if (row[colName].indexOf(rval) == -1) {\n row[colName].push(rval);\n }\n\n if (!Array.isArray(row[relName])) {\n row[relName] = [row[relName]].filter(\n (r) => !this.AB.isNil(r)\n );\n }\n if (\n row[relName].filter((r) => r[iPK] == newData[iPK])\n .length == 0\n ) {\n row[relName].push(newData);\n }\n } else {\n row[colName] = localField.getRelationValue(newData);\n row[relName] = newData;\n }\n\n // pass updated data back into DC:\n this.__dataCollection.updateItem(v, row);\n\n if (this.__treeCollection)\n this.__treeCollection.updateItem(v, row);\n\n this.emit(\"update\", this.__dataCollection.getItem(v));\n\n // if we just updated our Current Cursor, we need to\n // let our connected DC's know to refresh.\n if (currCursor?.id == v) {\n needsRefresh = true;\n }\n }\n }\n });\n });\n\n if (needsRefresh) {\n this.emit(\"cursorStale\", null);\n }\n });\n\n this.on(\"ab.datacollection.connection-added\", (data) => {\n // This event notifies us of a specific relation being created between\n // two records. In this case the source object that was originally\n // operated on, is sent along in data.data.\n //\n // eg: if this was a `create` operation, the newly created value is\n // included in data.data.\n // eg: if this was an `update` operation, the row that was modified\n // is included.\n //\n // {json} data\n // incoming socket payload:\n // data.objectID {string}\n // the ABObject this connection is being added to\n // data.fieldID {string}\n // which connect Field in this ABObject the value is added to\n // data.rowID {string}\n // which specific row/entry this is being added to\n // data.data {json}\n // The value being added.\n //\n\n let obj = this.datasource;\n if (!obj) return;\n\n if (!data.rowID) return;\n\n // ABObject only\n if (!(obj instanceof this.AB.Class.ABObjectQuery)) {\n // if this is the object we are managing\n if (obj.id === data.objectID) {\n let field = obj.fieldByID(data.fieldID);\n if (field) {\n // figure out if we actually have the value that was changed:\n let isExists = this.__dataCollection.exists(data.rowID);\n if (isExists) {\n let newData = this.AB.cloneDeep(data.data);\n let row = this.__dataCollection.getItem(data.rowID);\n\n let colName = field.columnName;\n let relName = field.relationName();\n\n if (field.linkType() == \"many\") {\n if (!Array.isArray(row[colName])) {\n // in case row[col]:{obj} this will make sure it\n // is included as an [ {obj} ], but will also prevent\n // [ undefined ] if row[col] isn't set:\n row[colName] = [row[colName]].filter(\n (r) => !this.AB.isNil(r)\n );\n }\n row[colName].push(field.getRelationValue(newData));\n\n if (!Array.isArray(row[relName])) {\n row[relName] = [row[relName]].filter(\n (r) => !this.AB.isNil(r)\n );\n }\n row[relName].push(newData);\n } else {\n row[colName] = field.getRelationValue(newData);\n row[relName] = newData;\n }\n\n // pass updated data back into DC:\n this.__dataCollection.updateItem(data.rowID, row);\n\n if (this.__treeCollection)\n this.__treeCollection.updateItem(data.rowID, row);\n\n this.emit(\n \"update\",\n this.__dataCollection.getItem(data.rowID)\n );\n }\n }\n }\n } else if (obj instanceof this.AB.Class.ABObjectQuery) {\n // ABQuery\n\n // NOTE: that in this case, if this change is about one of the\n // objects we track, we will most likely have to reload the data\n // to make sure we are displaying proper data.\n\n // This will follow the same logic as in \"ab.datacollection.create\"\n // so instead of repeating that here, let's call our \"create\"\n // handler instead:\n\n ///// LEFT OFF HERE:\n // need to pull out the data in data.data that represents the\n // connection to data.objectId\n\n //// WAIT!!!!!!\n //// Instead, of this \"connection-added\", lets add the logic in\n //// a \"created\" handler to detect if we should add the new entry\n //// into A value we currently track.\n //// ===> This way we only have to send out \"Created\" messages\n ////\n\n let newPacket = {\n objectId: data.objectId,\n data: this.AB.cloneDeep(data.data),\n };\n this.emit(\"ab.datacollection.create\", newPacket);\n }\n });\n\n this.on(\"ab.datacollection.update\", (data) => {\n // {json} data\n // incoming socket payload:\n // data.objectId {string} uuid of the ABObject's row that was updated\n // data.data {json} the new updated value of that row entry.\n\n let obj = this.datasource;\n if (!obj) return;\n\n // updated values\n let values = data.data;\n if (!values) return;\n\n // #Johnny: removing this check. A DC that is following another cursor\n // still has a value that might need updating.\n // DC who is following cursor should update only current cursor.\n // if (\n // this.isCursorFollow &&\n // this.getCursor()?.id != (values[obj.PK()] ?? values.id)\n // ) {\n // return;\n // }\n\n let needUpdate = false;\n let skipDatasourceFilter = false;\n let isExists = false;\n let updatedIds = [];\n // {array}\n // an array of the row indexs in our DataCollection that have values\n // that need to be updated.\n\n let updatedTreeIds = [];\n let updatedVals = {};\n\n //\n // Case 1: This DC contains the value that was updated\n // In this case, we want to replace our current entry with\n // the new one passed in.\n // EX: This is a DC of Users, and the incoming Entry is a User\n // that we are already displaying.\n //\n\n // Query\n if (obj instanceof this.AB.Class.ABObjectQuery) {\n let objList = obj.objects((o) => o.id == data.objectId) || [];\n needUpdate = objList.length > 0;\n if (needUpdate) {\n // NOTE: Data needs to be updated in the query even if it doesn't match the filter conditions.\n skipDatasourceFilter =\n obj instanceof this.AB.Class.ABObjectQuery;\n\n (objList || []).forEach((o) => {\n updatedIds = updatedIds.concat(\n this.__dataCollection\n .find((item) => {\n return (\n item[\n `${this.datasource.objectAlias(\n o.id\n )}.${o.PK()}`\n ] == (values[o.PK()] || values.id)\n );\n })\n .map((o) => o.id) || []\n );\n\n // grouped queries\n if (this.__treeCollection) {\n updatedTreeIds = updatedTreeIds.concat(\n this.__treeCollection\n .find((item) => {\n return (\n item[\n `${this.datasource.objectAlias(\n o.id\n )}.${o.PK()}`\n ] == (values[o.PK()] || values.id)\n );\n })\n .map((o) => o.id) || []\n );\n }\n });\n\n isExists = updatedIds.length > 0;\n\n updatedVals = this._queryUpdateData(objList, values);\n }\n }\n // Object\n else {\n needUpdate = obj.id == data.objectId;\n if (needUpdate) {\n // various PK name\n if (!values.id && obj.PK() != \"id\") values.id = values[obj.PK()];\n\n updatedIds.push(values.id);\n\n isExists = this.__dataCollection.exists(values.id);\n updatedVals = values;\n }\n }\n\n // if it is the source object\n if (needUpdate) {\n if (isExists) {\n if (this.isValidData(updatedVals, skipDatasourceFilter)) {\n // only spread around cloned copies because some objects (I'm\n // looking at you ABFieldUser) will modify some data for local\n // usage.\n updatedVals = this.AB.cloneDeep(updatedVals);\n if (this.__dataCollection) {\n updatedIds = this.AB.uniq(updatedIds);\n updatedIds.forEach((itemId) => {\n this.__dataCollection.updateItem(itemId, updatedVals);\n });\n }\n\n if (this.__treeCollection) {\n // update data in tree\n updatedTreeIds = this.AB.uniq(updatedTreeIds);\n updatedTreeIds.forEach((itemId) => {\n this.__treeCollection.updateItem(itemId, updatedVals);\n });\n }\n\n this.emit(\"update\", updatedVals);\n\n // If the update item is current cursor, then should tell components to update.\n let currData = this.getCursor();\n if (currData?.id == updatedVals.id) {\n this.emit(\"cursorStale\", currData);\n }\n } else {\n // Johnny: Here we are simply removing the DataCollection Entries that are\n // no longer valid.\n // Just cycle through the collected updatedIds and remove them.\n let currData = this.getCursor();\n updatedIds.forEach((id) => {\n // If the item is current cursor, then the current cursor should be cleared.\n\n if (currData?.id == id) this.emit(\"cursorStale\", null);\n\n this.__dataCollection.remove(id);\n\n // NOTE: Preserve the current cursor after item removal.\n // Webix v.10.1 automatically clears the cursor when an item is removed from the collection.\n if (currData && currData.id != id) {\n this.__dataCollection.setCursor(currData.id);\n }\n\n // TODO: update tree list\n // if (this.__treeCollection) {\n // this.__treeCollection.remove(id);\n // }\n\n this.emit(\"delete\", id);\n });\n }\n }\n // filter before add new record\n else if (this.isValidData(updatedVals)) {\n // OK we have a value, that COULD be in our DC\n // before we add it, let's make sure we are not limited in our selection of items:\n if (!this.isCursorFollow && !this.settings.fixSelect) {\n // this means the updated record was not loaded yet so we are adding it to the top of the grid\n // the placement will probably change on the next load of the data\n this.__dataCollection.add(updatedVals, 0);\n\n if (this.__treeCollection)\n this.parseTreeCollection({\n data: [updatedVals],\n });\n\n this.emit(\"create\", updatedVals);\n }\n }\n }\n\n //\n // Case 2: This DC has entries that CONNECT to the updated value.\n // We need to make sure our connections, properly reflect the\n // current state of the incoming data.\n //\n // EG: This DC is a list of Roles that connect to User, and an updated\n // User is passed in.\n\n let currCursor = this.getCursor();\n let updateCursor = null;\n\n // if it is a linked object\n // look for connected fields that link to the incoming objectId\n let connectedFields = obj.connectFields(\n (f) => f.datasourceLink && f.datasourceLink.id == data.objectId\n );\n\n // update relation data\n if (\n obj instanceof this.AB.Class.ABObject &&\n connectedFields?.length > 0\n ) {\n // various PK name\n // webix datacollections require an .id value, so make sure\n // this incoming value has an .id set\n let PK = obj.PK();\n if (!values.id && PK != \"id\") values.id = values[PK];\n\n if (this.__dataCollection.count() > 0) {\n this.__dataCollection.find({}).forEach((d) => {\n let updateItemData = {\n id: d.id,\n };\n\n connectedFields.forEach((f) => {\n if (!f) return;\n\n let updateRelateVal = {};\n let rowRelateVal = d[f.relationName()] || {};\n\n if (f.fieldLink)\n updateRelateVal =\n values[f.fieldLink.relationName()] || {};\n\n // check to see if we are supposed to be related to this\n let valIsRelated = isRelated(updateRelateVal, d.id, PK);\n\n // If NO, then make sure we Unrelate data\n // if this is an array -> filter out the entry\n if (\n Array.isArray(rowRelateVal) &&\n rowRelateVal.filter(\n (v) =>\n v == values.id ||\n v.id == values.id ||\n v[PK] == values.id\n ).length > 0 &&\n !valIsRelated\n ) {\n updateItemData[f.relationName()] = rowRelateVal.filter(\n // NOTE: Special case: the incoming value.id will be .uuid\n // however in case of User Fields, v.id == username and not .uuid\n // so we put our default check to be v[PK] here to play nice\n (v) => (v[PK] || v.id || v) != values.id\n );\n updateItemData[f.columnName] = updateItemData[\n f.relationName()\n ].map((v) => v.id || v[PK] || v);\n } else if (\n // this is not an array so set link to null\n !Array.isArray(rowRelateVal) &&\n (rowRelateVal == values.id ||\n rowRelateVal.id == values.id ||\n rowRelateVal[PK] == values.id) &&\n !valIsRelated\n ) {\n updateItemData[f.relationName()] = null;\n updateItemData[f.columnName] = null;\n }\n\n // However, if we are supposed to be related => make sure we are\n // If this is an array, then add to list\n // AND YES: make sure it is cloned\n if (valIsRelated) {\n values = this.AB.cloneDeep(values);\n }\n if (Array.isArray(rowRelateVal) && valIsRelated) {\n // update relate data\n if (\n rowRelateVal.filter(\n (v) =>\n v == values.id ||\n v.id == values.id ||\n v[PK] == values.id\n ).length > 0\n ) {\n // just update the one entry in my array with the new\n // value\n rowRelateVal.forEach((v, index) => {\n if (\n v == values.id ||\n v.id == values.id ||\n v[PK] == values.id\n )\n rowRelateVal[index] = values;\n });\n }\n // add new relate\n else {\n rowRelateVal.push(values);\n }\n\n updateItemData[f.relationName()] = rowRelateVal;\n updateItemData[f.columnName] = updateItemData[\n f.relationName()\n ].map(\n (v) => f.getRelationValue(v) /*v.id || v[PK] || v*/\n );\n } else if (\n !Array.isArray(rowRelateVal) &&\n (rowRelateVal != values.id ||\n rowRelateVal.id != values.id ||\n rowRelateVal[PK] != values.id) &&\n valIsRelated\n ) {\n updateItemData[f.relationName()] = values;\n // make ConnectedField use .getRelationValue() here!\n updateItemData[f.columnName] =\n f.getRelationValue(values);\n }\n });\n\n // Refresh Formula Fields when the connected fields are populated\n if (this.settings?.populate) {\n obj.fields(\n (fld) =>\n fld &&\n fld.key == \"formula\" &&\n connectedFields.filter((conFld) => {\n return (\n conFld.id == fld.settings.field &&\n // Populate all connect fields\n (this.settings?.populate == true ||\n // Populate specific connect fields\n (Array.isArray(this.settings?.populate) &&\n this.settings?.populate.indexOf(\n conFld.id\n ) > -1))\n );\n }).length > 0\n ).forEach((formulaField) => {\n updateItemData[formulaField.columnName] =\n formulaField.format(updateItemData, true);\n });\n }\n\n // If this item needs to update\n // meaning there is > 1 key in the object (we always have .id)\n if (Object.keys(updateItemData).length > 1) {\n // normalize data before add to data collection\n // UPDATE: this should already have happened in NetworkRestSocket\n // when the initial data is received.\n\n // NOTE: We could not normalize relational data because they are not full data\n // Merge update data to exists data instead\n\n if (this.__treeCollection?.exists(d.id)) {\n const treeItem = Object.assign(\n this.__treeCollection.getItem(d.id),\n updateItemData\n );\n this.__treeCollection.updateItem(d.id, treeItem);\n }\n\n if (this.__dataCollection?.exists(d.id)) {\n const dcItem = Object.assign(\n this.__dataCollection.getItem(d.id),\n updateItemData\n );\n this.__dataCollection.updateItem(d.id, dcItem);\n this.emit(\n \"update\",\n this.__dataCollection.getItem(d.id)\n );\n if (currCursor?.id == dcItem.id) {\n updateCursor = dcItem;\n }\n }\n }\n });\n }\n }\n\n //\n // Case 3: Our DC is linked to a DC that was effected by this update.\n //\n // We will approach it from another direction, if the current DC made\n // an update to it's current Cursor, then we will emit a \"cursorStale\"\n // event, so our linked DCs will update themselves with the new value:\n if (updateCursor) {\n this.emit(\"cursorStale\", null);\n }\n // this.updateRelationalDataFromLinkDC(data.objectId, values);\n this.refreshLinkCursor();\n\n this.setStaticCursor();\n });\n\n // We are subscribing to notifications from the server that an item may be stale and needs updating\n // We will improve this later and verify that it needs updating before attempting the update on the client side\n this.on(\"ab.datacollection.stale\", (data) => {\n // debugger;\n // if we don't have a datasource or model, there is nothing we can do here:\n // Verify the datasource has the object we are listening for if not just stop here\n if (\n !this.datasource ||\n !this.model ||\n this.datasource.id != data.objectId\n ) {\n return;\n }\n\n // updated values\n var values = data.data;\n\n if (!values) return;\n\n // use the Object's defined Primary Key:\n var PK = this.model.object.PK();\n if (!values[PK]) {\n PK = \"id\";\n }\n\n // DC who is following cursor should update only current cursor.\n if (\n this.isCursorFollow &&\n this.getCursor()?.[PK] != (values[PK] ?? values?.id)\n ) {\n return;\n }\n\n if (values) {\n if (this.__dataCollection.exists(values[PK])) {\n var cond = { where: {} };\n cond.where[PK] = values[PK];\n // this data collection has the record so we need to query the server to find out what it's latest data is so we can update all instances\n this.model.staleRefresh(cond).then((res) => {\n // check to make sure there is data to work with\n if (Array.isArray(res.data) && res.data.length) {\n // debugger;\n let obj = this.datasource;\n if (!obj) return;\n // normalize data before add to data collection\n\n // UPDATE: this should already have happened in NetworkRestSocket\n // when the initial data is received.\n //var model = obj.model();\n // model.normalizeData(res.data[0]);\n\n // tell the webix data collection to update using their API with the row id (values.id) and content (res.data[0])\n if (this.__dataCollection.exists(values[PK])) {\n this.__dataCollection.updateItem(\n values[PK],\n res.data[0]\n );\n }\n\n // If the update item is current cursor, then should tell components to update.\n var currData = this.getCursor();\n if (currData?.[PK] == values[PK]) {\n this.emit(\"cursorStale\", currData);\n }\n } else {\n // If there is no data in the object then it was deleted...lets clean things up\n // If the deleted item is current cursor, then the current cursor should be cleared.\n var currId = this.getCursor();\n if (currId == values[PK]) this.emit(\"cursorStale\", null);\n\n this.__dataCollection.remove(values[PK]);\n this.emit(\"delete\", values[PK]);\n }\n });\n }\n }\n\n // filter link data collection's cursor\n this.refreshLinkCursor();\n this.setStaticCursor();\n });\n\n this.on(\"ab.datacollection.delete\", (data) => {\n // debugger;\n let obj = this.datasource;\n if (!obj) return;\n\n let deleteId = data.data;\n let needDelete = false;\n let deletedIds = [];\n let deletedTreeIds = [];\n\n // Query\n if (obj instanceof this.AB.Class.ABObjectQuery) {\n let objList = obj.objects((o) => o.id == data.objectId) || [];\n needDelete = objList.length > 0;\n if (needDelete) {\n (objList || []).forEach((o) => {\n deletedIds =\n this.__dataCollection\n .find((item) => {\n return item[`${o.alias}.${o.PK()}`] == deleteId;\n })\n .map((o) => o.id) || [];\n\n // grouped queries\n if (this.__treeCollection) {\n deletedTreeIds =\n this.__treeCollection\n .find((item) => {\n return item[`${o.alias}.${o.PK()}`] == deleteId;\n })\n .map((o) => o.id) || [];\n }\n });\n }\n }\n // Object\n else {\n needDelete = obj.id == data.objectId;\n if (needDelete) {\n deletedIds.push(deleteId);\n }\n }\n\n // if it is the source object\n if (needDelete) {\n // If the deleted item is current cursor, then the current cursor should be cleared.\n var currData = this.getCursor();\n\n deletedIds.forEach((delId) => {\n if (currData?.[obj.PK()] == delId)\n this.emit(\"cursorStale\", null);\n\n if (this.__dataCollection.exists(delId))\n this.__dataCollection.remove(delId);\n });\n\n if (this.__treeCollection) {\n deletedTreeIds.forEach((delId) => {\n if (this.__treeCollection.exists(delId))\n this.__treeCollection.remove(delId);\n });\n }\n\n if (deletedIds[0]) this.emit(\"delete\", deletedIds[0]);\n }\n\n // if it is a linked object\n let connectedFields = obj.connectFields(\n (f) => f.datasourceLink && f.datasourceLink.id == data.objectId\n );\n\n // update relation data\n if (\n obj instanceof this.AB.Class.ABObject &&\n connectedFields &&\n connectedFields.length > 0\n ) {\n // various PK name\n let PK = connectedFields[0].object.PK();\n\n this.__dataCollection.find({}).forEach((d) => {\n let updateRelateVals = {};\n\n connectedFields.forEach((f) => {\n let relateVal = d[f.relationName()];\n if (relateVal == null) return;\n\n if (\n Array.isArray(relateVal)\n // JOHNNY: for speed improvements, don't make this check:\n // just do it and that will reduce 1x through the array.\n // &&\n // relateVal.filter(\n // (v) =>\n // v == deleteId ||\n // v.id == deleteId ||\n // v[PK] == deleteId\n // ).length > 0\n ) {\n updateRelateVals[f.relationName()] = relateVal.filter(\n (v) => (v.id || v[PK] || v) != deleteId\n );\n updateRelateVals[f.columnName] = updateRelateVals[\n f.relationName()\n ].map((v) => v.id || v[PK] || v);\n } else if (\n relateVal == deleteId ||\n relateVal.id == deleteId ||\n relateVal[PK] == deleteId\n ) {\n updateRelateVals[f.relationName()] = null;\n updateRelateVals[f.columnName] = null;\n }\n });\n\n // If this item needs to update\n if (Object.keys(updateRelateVals).length > 0) {\n // normalize data before add to data collection\n\n // var model = obj.model();\n // model.normalizeData(updateRelateVals);\n\n this.__dataCollection.updateItem(d.id, updateRelateVals);\n\n if (this.__treeCollection)\n this.__treeCollection.updateItem(d.id, updateRelateVals);\n\n this.emit(\"update\", this.__dataCollection.getItem(d.id));\n }\n });\n }\n });\n\n // add listeners when cursor of link data collection is changed\n const linkDC = this.datacollectionLink;\n // if (linkDC && this.settings.loadAll) {\n if (linkDC) {\n this.eventAdd({\n emitter: linkDC,\n eventName: \"changeCursor\",\n listener: (currentCursor) => {\n // NOTE: we can clear data here to update UI display, then data will be fetched when webix.dataFeed event\n if (\n !this.settings?.loadAll &&\n linkDC.previousCursorId != null &&\n linkDC.previousCursorId != currentCursor?.id\n )\n this.clearAll();\n\n this.refreshLinkCursor();\n this.setStaticCursor();\n },\n });\n\n this.eventAdd({\n emitter: linkDC,\n eventName: \"cursorStale\",\n listener: (currentCursor) => {\n // cursorStale : the current cursor hasn't CHANGED, but the data\n // of that value has changed.\n // This is triggered by one of our socket updates that detects\n // changes to the cursor data.\n\n // if don't have .loadAll set, we'll need to update our data:\n if (!this.settings?.loadAll) {\n // What I do here depends on what my linked DC has set for\n // it's .loadConnections (shouldPopulate) value\n let dvLink = this.datacollectionLink;\n let isMyDataThere = dvLink.shouldPopulate;\n if (Array.isArray(isMyDataThere)) {\n // if this was an array: it should be an array of columnNames\n // of the dvLink that are being populated.\n\n // the column I'm interested in:\n let colName = this.fieldLink.fieldLink.columnName;\n\n // is it there?\n isMyDataThere = isMyDataThere.indexOf(colName) > -1;\n }\n if (!isMyDataThere) {\n // If it didn't populate it's data, then I can't be\n // efficient about how to update my data.\n // we'll just have to reload:\n\n // find out how many entries we have already loaded and try to\n // load at least that many again.:\n let count = 20;\n if (this.__dataCollection.count() > count)\n count = this.__dataCollection.count();\n if (this.__treeCollection?.count() > count)\n count = this.__treeCollection.count();\n\n let currCursor = this.__dataCollection.getCursor();\n this.clearAll();\n this.reloadData(0, count).then(() => {\n this.__dataCollection.setCursor(currCursor);\n this.emit(\"cursorSelect\", currCursor);\n });\n } else {\n // if the linked DC does have my data populated:\n\n // the values I currently contain can fall into 1 of 3 categories:\n // 1) A value I currently have that I need to Keep\n // 2) A value I currently have that I need to remove\n // 3) A value I don't have, but need to Add\n\n // the current value of the cursor should have the ID references\n // to what SHOULD be in my display\n\n // get the current cursor of our linked DC\n let linkCursor;\n\n if (dvLink) {\n linkCursor = dvLink.getCursor();\n }\n if (!linkCursor) {\n // if linkCursor is no longer set, then we should clear()\n this.clearAll();\n return;\n }\n\n let PK = this.datasource.PK();\n\n // lets start by assuming all the current values in cursor are #3\n // -> all the values into valuesToAdd:\n\n let colName = this.fieldLink?.fieldLink?.relationName?.();\n let valuesToAdd = {};\n let valuesIn = colName ? linkCursor[colName] || [] : [];\n if (!Array.isArray(valuesIn)) valuesIn = [valuesIn];\n valuesIn = valuesIn.filter((v) => v);\n valuesIn.forEach((v) => {\n valuesToAdd[v[PK]] = v;\n });\n\n let valuesToRemove = [];\n // step through all the values I currently have\n let currValues = this.__dataCollection.find(() => true);\n currValues.forEach((value) => {\n // if value is in valuesToAdd\n if (valuesToAdd[value[PK]]) {\n // we already have it so turns out we don't need to add\n // it after all\n delete valuesToAdd[value[PK]];\n } else {\n // the current state of the Link Cursor value doesn't have\n // this value, so we need to remove it:\n valuesToRemove.push(value[PK]);\n }\n });\n\n // now remove the items we don't want:\n this.__dataCollection.remove(valuesToRemove);\n\n // then we have to ask for the values we need to add:\n valuesToAdd = Object.keys(valuesToAdd); // convert to []\n // NOTE: .staleRefresh() is designed to handle a single requst\n // that will be compiled with other requests to be more efficient\n // so we need to make 1 .staleRefresh() at a time and then\n // compile those results into our data collection.\n let prmsAllRefreshes = [];\n let allAdds = [];\n (valuesToAdd || []).forEach((v) => {\n let cond = { where: {} };\n cond.where[PK] = v;\n // NOTE: we are using the abbreviated condition syntax here.\n\n // NOTE: staleRefresh() has some buffering capabilities\n // that combine multiple calls into 1 more efficient call:\n prmsAllRefreshes.push(\n this.model.staleRefresh(cond).then((res) => {\n // check to make sure there is data to work with\n if (Array.isArray(res.data) && res.data.length) {\n res.data.forEach((d) => {\n allAdds.push(d);\n });\n } else {\n if (res.data) {\n allAdds.push(res.data);\n }\n }\n })\n );\n });\n Promise.all(prmsAllRefreshes).then(() => {\n allAdds.forEach((d) => {\n if (this.isValidData(d)) {\n if (!this.__dataCollection.exists(d[PK])) {\n this.__dataCollection.add(d);\n }\n }\n });\n });\n }\n\n return;\n }\n\n // Otherwise, we need to refilter our data:\n this.refreshLinkCursor();\n this.setStaticCursor();\n },\n });\n }\n\n // add listeners when cursor of the followed data collection is changed\n const followDC = this.datacollectionFollow;\n if (followDC) {\n this.eventAdd({\n emitter: followDC,\n eventName: \"changeCursor\",\n listener: () => {\n const followCursor = followDC.getCursor();\n const currentCursor = this.getCursor();\n\n // If the cursor is not the new, then it should not reload.\n if (\n followCursor?.[followDC.datasource.PK()] ==\n currentCursor?.[this.datasource.PK()]\n )\n return;\n\n this.clearAll();\n this.loadData();\n },\n });\n\n this.eventAdd({\n emitter: followDC,\n eventName: \"cursorStale\",\n listener: () => {\n // cursorStale : the current cursor hasn't CHANGED, but the data\n // of that value has changed.\n // This is triggered by one of our socket updates that detects\n // changes to the cursor data.\n\n this.clearAll();\n this.loadData();\n },\n });\n }\n\n // add listeners to Datacollection that we are filtering using\n // in_data_collection conditions:\n let listFilterDCs = [];\n let [whereCond] = this.getWhereClause(0, 0);\n SearchWhereCond(\n whereCond,\n [\"in_data_collection\", \"not_in_data_collection\"],\n (rule) => {\n // value should be the ID reference to the cond DC\n let condDC = this.AB.datacollectionByID(rule.value);\n if (condDC) {\n listFilterDCs.push(condDC);\n }\n }\n );\n listFilterDCs.forEach((condDC) => {\n this.eventAdd({\n emitter: condDC,\n eventName: \"loadData\",\n listener: () => {\n // the filter by datacollection has changed values\n // so we need to reload based upon the new values\n this.clearAll();\n this.loadData();\n },\n });\n });\n }\n\n /*\n * waitForDataCollectionToInitialize()\n * there are certain situations where this datacollection shouldn't\n * load until another one has loaded. In those cases, the fn()\n * will wait for the required datacollection to emit \"initializedData\"\n * before continuing on.\n * @param {ABViewDataCollection} DC\n * the DC this datacollection depends on.\n * @returns {Promise}\n */\n async waitForDataCollectionToInitialize(DC, msg) {\n DC.init();\n\n return new Promise((resolve, reject) => {\n /* eslint-disable no-fallthrough */\n switch (DC.dataStatus) {\n // if that DC hasn't started initializing yet, start it!\n case DC.dataStatusFlag.notInitial:\n DC.loadData().catch(reject);\n // no break;\n\n // once in the process of initializing\n\n case DC.dataStatusFlag.initializing:\n /* eslint-enable no-fallthrough*/\n // listen for \"initializedData\" event from the DC\n // then we can continue.\n this.eventRemove(\"initializedData\", DC);\n this.eventAdd({\n emitter: DC,\n eventName: \"initializedData\",\n listener: () => {\n // go next\n resolve();\n },\n });\n break;\n\n // if it is already initialized, we can continue:\n case DC.dataStatusFlag.initialized:\n resolve();\n break;\n\n // just in case, if the status is not known, just continue\n default:\n resolve();\n break;\n }\n /* eslint-enable no-fallthrough */\n });\n }\n\n // /**\n // * @method whereCleanUp()\n // * Parse through the current where condition and remove any null or\n // * empty logical blocks.\n // * @param {obj} curr\n // * 1) The current where condition in ABQuery Format:\n // * {\n // * glue: [AND, OR],\n // * rules: [ {rule} ]\n // * }\n // * or 2) The current {rule} to validate\n // * {\n // * key:{string},\n // * rule:{string},\n // * vlaue:{mixed}\n // * }\n // * @return {ABQuery.where} / { Rule }\n // */\n // whereCleanUp(curr) {\n // if (curr) {\n // if (curr.glue && curr.rules) {\n // // this is a logical Block (AND, OR)\n // // we need to filter the children\n // let newValue = { glue: curr.glue, rules: [] };\n // curr.rules.forEach((r) => {\n // let cleanRule = this.whereCleanUp(r);\n // // don't add values that didn't pass\n // if (cleanRule) {\n // newValue.rules.push(cleanRule);\n // }\n // });\n\n // // if we have a non empty block, then return it:\n // if (newValue.rules.length > 0) {\n // return newValue;\n // }\n\n // // this isn't really a valid conditional, so null\n // return null;\n // }\n\n // // This is a specific rule, that isn't null so:\n // return curr;\n // }\n // return null;\n // }\n\n /**\n * @method getWhereClause()\n * Return the current where condition for the datacollection.\n * The where condition might change depending if we are following\n * another datacollection or not.\n *\n * NOTE: start and limit might be effected by some of our settings\n * so we include them here and then return those values as well.\n *\n * @param {int} start\n * @param {int} limit\n * @returns [ wheres, start, limit ]\n */\n getWhereClause(start, limit) {\n // pull filter conditions\n let wheres = this.AB.cloneDeep(\n this.settings.objectWorkspace.filterConditions ?? {}\n );\n // if we pass new wheres with a reload use them instead\n if (this.__reloadWheres) {\n wheres = this.__reloadWheres;\n }\n wheres.glue = wheres.glue || \"and\";\n wheres.rules = wheres.rules || [];\n\n const __additionalWheres = {\n glue: \"and\",\n rules: [],\n };\n\n // add the filterCond if there are rules to add\n if (this.__filterCond?.rules?.length > 0) {\n __additionalWheres.rules.push(this.__filterCond);\n }\n\n // Filter by a selected cursor of a link DC\n let linkRule = this.ruleLinkedData();\n if (!this.settings.loadAll && linkRule) {\n __additionalWheres.rules.push(linkRule);\n }\n // pull data rows following the follow data collection\n else if (this.datacollectionFollow) {\n const followCursor = this.datacollectionFollow.getCursor();\n // store the PK as a variable\n let PK = this.datasource.PK();\n // if the datacollection we are following is a query\n // add \"BASE_OBJECT.\" to the PK so we can select the\n // right value to report the cursor change to\n if (this.datacollectionFollow.settings.isQuery) {\n PK = \"BASE_OBJECT.\" + PK;\n }\n if (followCursor) {\n start = 0;\n limit = null;\n wheres = {\n glue: \"and\",\n rules: [\n {\n key: this.datasource.PK(),\n rule: \"equals\",\n value: followCursor[PK],\n },\n ],\n };\n }\n // Set no return rows\n else {\n wheres = {\n glue: \"and\",\n rules: [\n {\n key: this.datasource.PK(),\n rule: \"equals\",\n value: \"NO RESULT ROW\",\n },\n ],\n };\n }\n }\n\n // Combine setting & program filters\n if (__additionalWheres.rules.length) {\n if (wheres.rules.length) {\n __additionalWheres.rules.unshift(wheres);\n }\n wheres = __additionalWheres;\n }\n\n // Handle conditions that have in_data_collection\n // The server doesn't know the current state of the datacollections\n // running on the client, so if we are using a condition that\n // references our datacollection, we need to pass along the\n // where condition of that datacollection\n let patch = (rule) => {\n // value should be the ID reference to the cond DC\n let condDC = this.AB.datacollectionByID(rule.value);\n if (condDC) {\n let [cond] = condDC.getWhereClause(0, 0);\n if (cond) {\n // store that under .linkCond\n rule.linkCond = cond;\n }\n }\n };\n SearchWhereCond(\n wheres,\n [\"in_data_collection\", \"not_in_data_collection\"],\n patch\n );\n\n // remove any null in the .rules\n // if (wheres?.rules?.filter) wheres.rules = wheres.rules.filter((r) => r);\n if (this.datasource) {\n wheres = this.datasource.whereCleanUp(wheres);\n }\n\n return [wheres, start, limit];\n }\n\n async loadData(start, limit) {\n // mark data status is initializing\n if (this._dataStatus == this.dataStatusFlag.notInitial) {\n this._dataStatus = this.dataStatusFlag.initializing;\n this.emit(\"initializingData\", {});\n }\n\n var obj = this.datasource;\n if (obj == null) {\n this._dataStatus = this.dataStatusFlag.initialized;\n return Promise.resolve([]);\n }\n\n var model = obj.model();\n if (model == null) {\n this._dataStatus = this.dataStatusFlag.initialized;\n return Promise.resolve([]);\n }\n\n // pull the defined sort values\n var sorts = this.settings.objectWorkspace.sortFields || [];\n\n // Wait for any dependent DCs to initialize\n\n //\n // Step 1: make sure any DataCollections we are linked to are\n // initialized first. Then proceed with our initialization.\n //\n const parentDc = this.datacollectionLink ?? this.datacollectionFollow;\n // If we are linked to another datacollection then wait for it\n if (parentDc) {\n await this.waitForDataCollectionToInitialize(parentDc);\n }\n\n //\n // Step 2: if we have any filter rules that depend on other DataCollections,\n // then wait for them to be initialized first.\n // eg: \"(not_)in_data_collection\" rule filters\n // get a preWheres that will at least include our specific filter data\n // and use that to determine if we need to wait for any other DCs to load\n let [preWheres] = this.getWhereClause(start, limit);\n if (preWheres?.rules?.length) {\n const dcFilters = [];\n\n // this is a recursive search that should catch all rules\n SearchWhereCond(\n preWheres,\n [\"in_data_collection\", \"not_in_data_collection\"],\n (rule) => {\n let dv = this.AB.datacollectionByID(rule.value);\n if (dv) {\n dcFilters.push(this.waitForDataCollectionToInitialize(dv));\n }\n }\n );\n\n await Promise.all(dcFilters);\n }\n\n // NOW that any dependent DCs are initialized,\n // we can proceed with calculating our where clause for real this time\n\n let [wheres, s2, l2] = this.getWhereClause(start, limit);\n start = s2;\n limit = l2;\n\n // set query condition\n var cond = {\n where: wheres || {},\n // limit: limit || 20,\n skip: start || 0,\n sort: sorts,\n populate: this.shouldPopulate,\n };\n\n // Select specific fields\n if (this.settings?.select) cond.select = this.settings.select;\n\n // Skip CSV packing\n if (this.settings?.skipPack) cond.skipPack = this.settings.skipPack;\n\n //// NOTE: we no longer set a default limit on loadData() but\n //// require the platform.loadData() to pass in a default limit.\n if (limit != null) {\n cond.limit = limit;\n }\n\n // if settings specify loadAll, then remove the limit\n if (this.settings.loadAll && !this.isCursorFollow) {\n delete cond.limit;\n }\n\n //\n // Step 3: pull data to data collection\n // we will keep track of the resolve, reject for this\n // operation.\n // the actual resolve() should happen in the\n // .processIncomingData() after the data is processed.\n return new Promise((resolve, reject) => {\n const jobID = this.AB.jobID();\n cond.jobID = jobID;\n this._pendingLoadDataResolves[jobID] = { resolve, reject };\n this.platformFind(model, cond).catch((err) => {\n delete this._pendingLoadDataResolves[jobID];\n reject(err);\n });\n });\n }\n\n platformFind(model, cond) {\n //// Core Migration Note:\n //// the ABViewDataCollectionCore now manages data in a different way:\n //// local data vs Remote Data\n //// this will need to be updated to reflect that management:\n //// (and also explains why we refactored things into .processIncomingData())\n return model.findAll(cond).then((data) => {\n return this.processIncomingData(data);\n });\n }\n\n /**\n * @method shouldPopulate()\n * Return our populate status. We now want to query this info outside this\n * object.\n * @return {bool|Array}\n * true/false, or an array of columnNames that are being populated.\n */\n get shouldPopulate() {\n return (\n this.settings.populate ??\n (this.settings.preventPopulate ? false : true)\n );\n }\n\n /**\n * @method queuedParse()\n * This is an attempt at loading very large datasets into a Webix DC without locking up\n * the display.\n * @param {array} data\n * The data to load into the __dataCollection\n * @param {callback} cb\n * A callback to call when the data has been fully loaded.\n */\n async queuedParse(incomingData, cb) {\n const data = incomingData?.data || incomingData;\n if (!data?.length) {\n cb?.();\n return Promise.resolve();\n }\n\n const total_count = incomingData.total_count;\n\n let nextData;\n if (data.length > 250) {\n // let pos = this.__dataCollection.count();\n let pos = this.__dataCollection.find({}).length;\n let remain = data.splice(250);\n nextData = {\n data: remain,\n pos: pos + data.length,\n total_count,\n };\n }\n\n const parsedData = {\n data,\n pos: incomingData.pos,\n total_count,\n };\n this.__dataCollection.parse(parsedData);\n\n return new Promise((resolve) => {\n setTimeout(async () => {\n await this.queuedParse(nextData);\n\n // Introduce a delay to ensure the UI has fully rendered the list before proceeding\n setTimeout(async () => {\n cb?.();\n resolve();\n }, 50);\n }, 15);\n });\n }\n\n /**\n * processIncomingData()\n * is called from loadData() once the data is returned. This method\n * allows the platform to make adjustments to the data based upon any\n * platform defined criteria.\n * @param {obj} data the data as it was returned from the Server\n * which should be in following format:\n * {\n * status: \"success\", // or \"error\"\n * data:[ {ABObjectData}, {ABObjectData}, ...]\n * }\n */\n processIncomingData(data) {\n return Promise.resolve().then(() => {\n // store total count\n this.__totalCount = data.total_count;\n\n // Need to .parse at the first time\n if (!this.__dataCollection.find({}).length) {\n this.__dataCollection.clearAll();\n // this.__dataCollection.parse(data);\n }\n\n if (this.__throttleIncoming) clearTimeout(this.__throttleIncoming);\n this.__throttleIncoming = setTimeout(async () => {\n // using queuedParse() to responsively handle large datasets.\n await this.queuedParse(data);\n\n // In order to get the total_count updated I had to use .load()\n this.__dataCollection.load(async () => {\n setTimeout(() => {\n this.refreshLinkCursor();\n }, 250);\n\n return {\n // NOTE: return a empty array to prevent render items in DataTable twice. (Items are rendered in .queuedParse function)\n data: [],\n pos: data.pos,\n total_count: data.total_count,\n };\n });\n\n // this does nothing???\n this.parseTreeCollection(data);\n\n // if we are linked, then refresh our cursor\n var linkDv = this.datacollectionLink;\n if (linkDv) {\n // filter data by match link data collection\n this.refreshLinkCursor();\n this.setStaticCursor();\n } else {\n // set static cursor\n this.setStaticCursor();\n }\n\n // now we close out our .loadData() promise.resolve() :\n if (data.jobID) {\n this._pendingLoadDataResolves[data.jobID].resolve();\n delete this._pendingLoadDataResolves[data.jobID];\n }\n\n // If dc set load all, then it will not trigger .loadData in dc at\n // .onAfterLoad event\n if (this.settings.loadAll) {\n this.emit(\"loadData\", {});\n }\n\n // mark initialized data\n if (this._dataStatus != this.dataStatusFlag.initialized) {\n this._dataStatus = this.dataStatusFlag.initialized;\n this.emit(\"initializedData\", {});\n }\n }, 100);\n });\n }\n\n /**\n * @method reloadData()\n * Trigger the DataCollection to reload its data from the server.\n * @param {int} start\n * Start position of where we want the data to load.\n * @param {int} limit\n * How many entries to load at a time.\n * @return {Promise}\n */\n reloadData(start, limit) {\n // var waitForDataCollectionToInitialize = (DC) => {\n // return new Promise((resolve, reject) => {\n // switch (DC.dataStatus) {\n // // if that DC hasn't started initializing yet, start it!\n // case DC.dataStatusFlag.notInitial:\n // DC.loadData().catch(reject);\n // // no break;\n\n // // once in the process of initializing\n // /* eslint-disable no-fallthrough*/\n // case DC.dataStatusFlag.initializing:\n // /* eslint-enable no-fallthrough*/\n // // listen for \"initializedData\" event from the DC\n // // then we can continue.\n // this.eventAdd({\n // emitter: DC,\n // eventName: \"initializedData\",\n // listener: () => {\n // // go next\n // resolve();\n // },\n // });\n // break;\n\n // // if it is already initialized, we can continue:\n // case DC.dataStatusFlag.initialized:\n // resolve();\n // break;\n\n // // just in case, if the status is not known, just continue\n // default:\n // resolve();\n // break;\n // }\n // });\n // };\n\n return Promise.resolve().then(() => {\n // check if we are currently waiting for more data requests on this datacollection before continuing\n if (this.reloadTimer) {\n // if we are already waiting delete the current timer\n clearTimeout(this.reloadTimer);\n delete this.reloadTimer;\n }\n\n // return a promise\n if (!this.reloadPromise) {\n this.reloadPromise = new Promise((resolve, reject) => {\n this.reloadPromise__resolve = resolve;\n this.reloadPromise__reject = reject;\n });\n }\n\n // then create a new timeout to delete current timeout, clear data\n // and load new\n this.reloadTimer = setTimeout(() => {\n // clear the data from the dataCollection,\n this.clearAll();\n // then loads new data from the server\n return this.loadData(start, limit)\n .then(() => {\n if (this.reloadPromise) {\n this.reloadPromise__resolve();\n delete this.reloadPromise;\n delete this.reloadPromise__resolve;\n delete this.reloadPromise__reject;\n }\n\n // delete the current setTimeout\n clearTimeout(this.reloadTimer);\n delete this.reloadTimer;\n })\n .catch((err) => {\n if (this.reloadPromise) {\n this.reloadPromise__reject(err);\n delete this.reloadPromise;\n delete this.reloadPromise__resolve;\n delete this.reloadPromise__reject;\n }\n // delete the current setTimeout\n clearTimeout(this.reloadTimer);\n delete this.reloadTimer;\n });\n }, 50);\n // setting to 50ms because right now we do not see many\n // concurrent calls, we need to increase this if we begin to\n\n return this.reloadPromise;\n });\n }\n\n /**\n * reloadWheres()\n * stores the child data collections filters for subsequent loads.\n * It is called from bindParentDc() when child data collections that are not\n * marked to load all data are initializing. To do this we use webix\n * server side binding by setting the param of \"dataFeed\".\n * @param {obj} wheres the new filters for the data collection\n * This is a combination of any exisiting filters the data collection\n * alreay had as well as the filter for the current cursor set by the\n * master data collection. We store this in __reloadWheres for when\n * the data needs to be updated.\n * The format of the wheres is our Query Builder Format\n * ex: {\n * \"glue\": \"and\",\n * \"rules\": [{\n * \"key\": \"33ba8957-6b9c-4ddb-9533-c46b13878ae1\",\n * \"rule\": \"contains\",\n * \"value\": \"1594176994894\"\n * }]\n * }\n */\n reloadWheres(wheres) {\n this.__reloadWheres = wheres;\n }\n\n getData(filter) {\n var dc = this.__dataCollection;\n if (dc) {\n return dc.find((row) => {\n let isValid = true;\n\n // data collection filter\n // isValid = this.isValidData(row);\n\n // NOTE: data are filtered from the server side (webix.dataFeed)\n // parent dc filter\n let linkDv = this.datacollectionLink;\n if (linkDv && this.settings.loadAll && isValid) {\n isValid = this.isParentFilterValid(row);\n }\n\n // addition filter\n if (isValid && filter) {\n isValid = filter(row);\n }\n\n return isValid;\n });\n } else {\n return [];\n }\n }\n\n isParentFilterValid(rowData) {\n // data is empty\n if (rowData == null) return false;\n\n var linkDv = this.datacollectionLink;\n if (linkDv == null) return true;\n\n const linkObj = linkDv.datasource;\n if (linkObj == null) return true;\n\n var fieldLink = this.fieldLink;\n if (fieldLink == null) return true;\n\n // if the parent's cursor is not set we have not filted this collection\n // yet so the data that comes back should be valid\n var linkCursor = linkDv.getCursor();\n if (linkCursor == null) {\n return true;\n }\n\n var linkVal = rowData[fieldLink.relationName()];\n if (linkVal == null) {\n // try to get relation value(id) again\n if (rowData[fieldLink.columnName]) {\n linkVal = rowData[fieldLink.columnName];\n } else {\n return false;\n }\n }\n\n let PK = fieldLink.object.PK();\n\n // array - 1:M , M:N\n if (linkVal.filter) {\n return (\n linkVal.filter(\n (val) =>\n (val[PK] || val.id || val) ==\n (linkCursor[linkObj.PK()] || linkCursor.id || linkCursor)\n ).length > 0\n );\n } else {\n return (\n (linkVal[PK] || linkVal.id || linkVal) ==\n (linkCursor[linkObj.PK()] || linkCursor.id || linkCursor)\n );\n }\n }\n\n clearAll() {\n if (this.__dataCollection) this.__dataCollection.clearAll();\n\n if (this.__treeCollection) this.__treeCollection.clearAll();\n\n this._dataStatus = this.dataStatusFlag.notInitial;\n }\n\n get totalCount() {\n return this.__totalCount || 0;\n }\n\n ///\n /// Components\n ///\n\n /**\n * @method bind\n * @param {Object} component - a webix element instance\n */\n bind(/* component */) {\n console.error(\"Platform.ABDataCollection.bind() Not implemented\");\n }\n\n unbind(/* component */) {\n console.error(\"Platform.ABDataCollection.unbind() Not implemented\");\n }\n\n removeComponent(comId) {\n // get index\n let index = this.__bindComponentIds.indexOf(comId);\n\n // delete\n this.__bindComponentIds.splice(index, 1);\n }\n\n /**\n * @method ruleLinkedData()\n * return a QueryFilter rule that also checks that incoming data is linked\n * to our .datacollectionLink (if it exists).\n * @return {obj} {QueryFilterRule}\n */\n ruleLinkedData() {\n let rule = null;\n const dataCollectionLink = this.datacollectionLink;\n const fieldLink = this.fieldLink;\n if (dataCollectionLink && fieldLink) {\n const linkCursorId = dataCollectionLink?.getCursor()?.id;\n if (linkCursorId) {\n const linkType = `${fieldLink.linkType()}:${fieldLink.linkViaType()}`;\n\n let filterRule;\n // NOTE: If object is query, then use \"contains\" because ABOBjectQuery return JSON\n if (fieldLink.alias) {\n filterRule = \"contains\";\n }\n // M:1\n else if (linkType == \"many:one\") {\n filterRule = \"have_relation\";\n }\n // 1:M\n else {\n filterRule = \"equals\";\n }\n\n rule = {\n alias: fieldLink.alias, // ABObjectQuery\n key: fieldLink.id,\n rule: filterRule,\n value: fieldLink.getRelationValue(\n dataCollectionLink.__dataCollection.getItem(linkCursorId)\n ),\n };\n }\n }\n return rule;\n }\n\n /**\n * @method refreshFilterConditions()\n * This is called in two primary cases:\n * - on initialization of a DC to setup our filters.\n * - in the operation of the ABDesigner when using a DC to display data\n * in the Work_object_grid and the datacollection_work(?)\n * In the case of the ABDesigner, new temporary where conditions are provided\n * from the possible filters we can set, and those need to effect the data\n * we display.\n * @param {ABRowFilter.where} wheres\n * The filter condition from the ABRowFilter values we are storing.\n */\n refreshFilterConditions(wheres = null) {\n // There are 3 Filters that help us know if our data is Valid:\n // 1) A filter for any ABObjectQuery we are managing.\n // 2) A filter for our own filter condition\n // 3) A filter that represents what our scopes allows\n\n // Set filter of ABObject\n if (this.__filterDatasource == null)\n this.__filterDatasource = this.AB.filterComplexNew(\n `${this.id}_filterDatasource`\n );\n\n if (this.datasource) {\n // this.__filterDatasource.applicationLoad(this.datasource.application);\n this.__filterDatasource.fieldsLoad(this.datasource.fields());\n\n let filterConditions;\n\n // Query\n if (this.datasource instanceof this.AB.Class.ABObjectQuery) {\n filterConditions = this.datasource.where;\n }\n // Apr 29, 2021 Removed this because we do not want Object filters to\n // effect validation of DataCollections\n // Object\n\n // else if (this.datasource instanceof ABObject) {\n // let currentView = this.datasource.currentView();\n // if (currentView && currentView.filterConditions)\n // filterConditions = currentView.filterConditions;\n // }\n\n if (filterConditions)\n this.__filterDatasource.setValue(filterConditions);\n else this.__filterDatasource.setValue({});\n } else {\n this.__filterDatasource.fieldsLoad([]);\n this.__filterDatasource.setValue(\n DefaultValues.settings.objectWorkspace.filterConditions\n );\n }\n\n // Set filter of data view\n // Apr 29, 2021 Added this code back to validate with DataCollection Filters\n if (this.__filterDatacollection == null)\n this.__filterDatacollection = this.AB.filterComplexNew(\n `${this.id}_filterDatacollection`\n );\n\n // this.__filterDatacollection.applicationLoad(\n // this.datasource ? this.datasource.application : null\n // );\n this.__filterDatacollection.fieldsLoad(\n this.datasource ? this.datasource.fields() : []\n );\n\n // if we pass in wheres, then Save that value to our internal .filterConditions\n if (wheres) this.settings.objectWorkspace.filterConditions = wheres;\n\n let filter = this.AB.cloneDeep(\n this.settings.objectWorkspace?.filterConditions ?? {\n glue: \"and\",\n rules: [],\n }\n );\n // sanity checks:\n // I've learned not to trust: this.settings.objectWorkspace\n filter.glue = filter.glue || \"and\";\n filter.rules = filter.rules || [];\n\n // if there is a linkRule, add it to filter\n let linkRule = this.ruleLinkedData(); // returns a rule if we are linked\n if (linkRule) {\n // NOTE: linkRule was originally designed to produce a rule for the\n // loadData() routine. In SQL, our linkRule might have an \"equals\"\n // rule, to match. But in this context if our linktype is \"many\"\n // we need to change the rule to \"contains\":\n // QUESTION: If this is still required, consider moving it into the `ruleLinkedData` function for maintainability. ??\n // if (this.fieldLink?.linkType() == \"many\") {\n // linkRule.rule = \"contains\";\n // }\n\n // if linkRule not already IN filter:\n let isAlreadyThere = false;\n let keys = Object.keys(linkRule);\n (filter.rules || []).forEach((r) => {\n if (isAlreadyThere) return;\n let allMatch = true;\n keys.forEach((k) => {\n if (r[k] != linkRule[k]) {\n allMatch = false;\n }\n });\n isAlreadyThere = allMatch;\n });\n if (!isAlreadyThere) {\n // link Rule needs to be ANDed to our current Rules:\n if (filter.glue == \"and\") {\n filter.rules.push(linkRule);\n } else {\n filter = { glue: \"and\", rules: [filter, linkRule] };\n }\n }\n }\n\n if ((filter.rules || []).length > 0 && !this.isCursorFollow) {\n this.__filterDatacollection.setValue(filter);\n } else {\n this.__filterDatacollection.setValue(\n DefaultValues.settings.objectWorkspace.filterConditions\n );\n }\n\n // Set filter of user's scope\n if (this.__filterScope == null)\n this.__filterScope = this.AB.filterComplexNew(\n `${this.id}_filterScope`\n );\n\n if (this.datasource) {\n let scopeList = (this.userScopes || []).filter(\n (s) =>\n !s.allowAll &&\n (s.objectIds || []).indexOf(this.datasource.id) > -1\n );\n if (scopeList && scopeList.length > 0) {\n // this.__filterScope.applicationLoad(this.datasource.application);\n this.__filterScope.fieldsLoad(this.datasource.fields() || []);\n\n // concat all rules of scopes\n let scopeRules = [];\n scopeList\n .filter(\n (s) => s.filter && s.filter.rules && s.filter.rules.length\n )\n .forEach((s) => {\n let sRules = (s.filter.rules || []).filter(\n (r) =>\n this.datasource.fields((f) => f.id == r.key).length > 0\n );\n\n scopeRules = scopeRules.concat(sRules);\n });\n\n let scopeWhere = {\n glue: \"or\",\n rules: scopeRules,\n };\n this.__filterScope.setValue(scopeWhere);\n }\n }\n }\n\n get isGroup() {\n return this.__isGroup || false;\n }\n\n ///\n /// Sync type\n ///\n\n get syncTypeFlag() {\n return {\n server: 1,\n client: 2,\n };\n }\n\n get syncType() {\n return this.settings.syncType || DefaultValues.syncType;\n }\n\n /** Private methods */\n\n /**\n * @method _dataCollectionNew\n * Get webix.DataCollection\n *\n * @return {webix.DataCollection}\n *\n * @param {Array} data - initial data\n */\n _dataCollectionNew(/*data*/) {\n var error = new Error(\n \"the platform.ABDataCollection._dataCollectionNew() is expected to return a proper DataCollection!\"\n );\n console.error(error);\n return null;\n }\n\n /**\n * @method _treeCollectionNew\n * Get webix.TreeCollection\n *\n * @return {webix.TreeCollection}\n *\n */\n _treeCollectionNew() {\n console.error(\n \"the platform.ABDataCollection._treeCollectionNew() is expected to return a proper TreeCollection!\"\n );\n return null;\n }\n\n parseTreeCollection(data = {}) {\n // TODO all this does is log \"is missing?\"\n // if (false) {\n // console.log(\n // \"Platform.ABDataCollection.parseTreeCollection() missing!\"\n // );\n // }\n }\n // parseTreeCollection(data = {}) {\n\n // if (!(this.__datasource instanceof ABObjectQuery) ||\n // !this.__datasource.isGroup ||\n // !this.__treeCollection)\n // return;\n\n // let addRowToTree = (join = {}, parentAlias = null) => {\n\n // let alias = join.alias;\n\n // (data.data || []).forEach(row => {\n\n // let dataId = row[`${alias}.uuid`] || row[`${alias}.id`];\n // if (!dataId) return;\n\n // // find parent nodes\n // let parentItemIds = [];\n // let parentId = row[`${parentAlias}.uuid`] || row[`${parentAlias}.id`];\n // if (parentId) {\n // parentItemIds = this.__treeCollection\n // .find(item => item._alias == parentAlias && item._dataId == parentId)\n // .map(item => item.id);\n // }\n\n // // check exists\n // let exists = this.__treeCollection.find(item => {\n // return item._alias == alias &&\n // item._dataId == dataId &&\n // (parentItemIds.length == 0 || parentItemIds.indexOf(item.$parent) > -1);\n // }, true);\n // if (exists) return;\n\n // let treeNode = {};\n // treeNode._alias = alias;\n // treeNode._dataId = dataId;\n // treeNode._itemId = row.id; // Keep row id for set cursor to data collection\n\n // Object.keys(row).forEach(propName => {\n\n // // Pull value from alias\n // if (propName.indexOf(`${alias}.`) == 0) {\n // treeNode[propName] = row[propName];\n // }\n\n // });\n\n // if (row.translations)\n // treeNode.translations = row.translations;\n\n // // child nodes\n // if (parentItemIds.length > 0)\n // parentItemIds.forEach(parentItemId => {\n // this.__treeCollection.add(treeNode, null, parentItemId);\n // });\n // // root node\n // else\n // this.__treeCollection.add(treeNode, null);\n\n // });\n\n // // Sub-joins\n // (join.links || []).forEach(link => {\n // addRowToTree(link, alias);\n // });\n\n // };\n\n // // Show loading cursor\n // (this.__bindComponentIds || []).forEach(comId => {\n\n // let boundComp = $$(comId);\n // if (boundComp &&\n // boundComp.showProgress)\n // boundComp.showProgress({ type: \"icon\" });\n\n // });\n\n // addRowToTree(this.__datasource.joins());\n\n // // Hide loading cursor\n // (this.__bindComponentIds || []).forEach(comId => {\n\n // let boundComp = $$(comId);\n // if (boundComp &&\n // boundComp.hideProgress)\n // boundComp.hideProgress();\n\n // })\n // }\n\n /**\n * @method _queryUpdateData\n *\n * @param {Array} objList - List of ABObject\n * @param {Object} values\n */\n _queryUpdateData(objList, values) {\n let updatedVals = {};\n\n // Add alias to properties of update data\n Object.keys(values).forEach((key) => {\n objList.forEach((oItem) => {\n let alias = this.datasource.objectAlias(oItem.id);\n\n updatedVals[`${alias}.${key}`] = values[key];\n\n // Add alias to properties of .translations\n if (\n key == \"translations\" &&\n values[\"translations\"] &&\n values[\"translations\"].length\n ) {\n updatedVals.translations = [];\n\n values[\"translations\"].forEach((tran) => {\n let updatedTran = {};\n\n Object.keys(tran).forEach((tranKey) => {\n if (tranKey == \"language_code\")\n updatedTran[\"language_code\"] = tran[\"language_code\"];\n else updatedTran[`${alias}.${tranKey}`] = tran[tranKey];\n });\n\n updatedVals.translations.push(updatedTran);\n });\n }\n });\n });\n\n return updatedVals;\n }\n\n isValidData(rowData, skipDatasourceFilter = false) {\n let result = true;\n\n // NOTE: should we use filter of the current view of object to filter\n // if yes, update .wheres condition in .loadData too\n if (this.__filterDatasource && !skipDatasourceFilter)\n result = result && this.__filterDatasource.isValid(rowData);\n\n if (this.__filterDatacollection)\n result = result && this.__filterDatacollection.isValid(rowData);\n\n if (result && this.__filterScope)\n result = result && this.__filterScope.isValid(rowData);\n\n return result;\n }\n\n updateRelationalDataFromLinkDC(objectId, rowData) {\n const dcLink = this.datacollectionLink;\n const cursorLink = dcLink?.getCursor();\n\n // Add the new data that just relate to the Link DC\n if (\n dcLink?.datasource.id == objectId &&\n cursorLink &&\n cursorLink.id == rowData?.id\n ) {\n const obj = this.datasource;\n const linkedField = this.fieldLink;\n let relatedData = rowData[linkedField.fieldLink.relationName()];\n if (relatedData && !Array.isArray(relatedData))\n relatedData = [relatedData];\n\n (relatedData ?? []).forEach((item) => {\n if (item == null) return;\n\n if (!this.__dataCollection.exists(item[obj.PK()])) {\n // QUESTION: Should we .find to get fully info here ?\n const newItem = this.AB.cloneDeep(item);\n newItem[linkedField.relationName()] = [rowData];\n this.__dataCollection.add(newItem);\n }\n });\n\n // trigger to components to know there are updated data.\n this.emit(\"warnRefresh\");\n }\n }\n\n // Clone\n\n clone(settings) {\n settings = settings || this.toObj();\n var clonedDatacollection = new this.constructor(settings, this.AB);\n clonedDatacollection.__datasource = this.__datasource;\n clonedDatacollection._dataStatus = this._dataStatus;\n\n // clonedDatacollection.__dataCollection = this.__dataCollection.copy();\n clonedDatacollection.__filterDatacollection.setValue(\n settings.settings.objectWorkspace.filterConditions\n );\n\n var parseMe = () => {\n if (clonedDatacollection.__dataCollection) {\n clonedDatacollection.__dataCollection.parse(\n this.__dataCollection\n .find({})\n .filter((row) =>\n clonedDatacollection.__filterDatacollection.isValid(row)\n )\n );\n }\n if (clonedDatacollection.__treeCollection) {\n clonedDatacollection.__treeCollection.parse(\n this.__treeCollection\n .find({})\n .filter((row) =>\n clonedDatacollection.__filterDatacollection.isValid(row)\n )\n );\n }\n };\n\n parseMe();\n\n // return new Promise((resolve, reject) => {\n // // load the data\n // clonedDatacollection\n // .loadData()\n // .then(() => {\n\n // set the cursor\n clonedDatacollection.setStaticCursor();\n\n var cursorID = this.getCursor();\n if (cursorID) {\n // NOTE: webix documentation issue: .getCursor() is supposed to return\n // the .id of the item. However it seems to be returning the {obj}\n if (cursorID.id) cursorID = cursorID.id;\n\n clonedDatacollection.setCursor(cursorID);\n }\n\n return clonedDatacollection;\n\n // resolve(clonedDatacollection);\n // })\n // .catch(reject);\n // });\n }\n\n filteredClone(filters) {\n var obj = this.toObj();\n\n // check to see that filters are set (this is sometimes helpful to select the first record without doing so at the data collection level)\n if (filters?.rules?.length) {\n if (obj.settings.objectWorkspace.filterConditions?.rules?.length) {\n obj.settings.objectWorkspace.filterConditions.rules =\n obj.settings.objectWorkspace.filterConditions.rules.concat(\n filters.rules\n );\n } else {\n obj.settings.objectWorkspace.filterConditions = filters;\n }\n }\n let clonedDC = this.clone(obj);\n return clonedDC; // new ABViewDataCollection(settings, this.application, this.parent);\n }\n\n //\n // Event handles\n //\n\n /**\n * @method eventAdd()\n *\n *\n *\n * @param {object} evt - {\n * emitter: object,\n * eventName: string,\n * listener: function\n * }\n */\n eventAdd(evt) {\n if (!evt || !evt.emitter || !evt.listener) return;\n\n this.__events = this.__events || [];\n\n let exists = this.__events.find((e) => {\n return e.emitter == evt.emitter && e.eventName == evt.eventName;\n // && e.listener == evt.listener;\n });\n\n if (!exists || exists.length < 1) {\n // add to array\n this.__events.push({\n emitter: evt.emitter,\n eventName: evt.eventName,\n listener: evt.listener,\n });\n\n // listening this event\n evt.emitter.on(evt.eventName, evt.listener);\n }\n }\n\n /**\n * @method eventClear()\n * unsubscribe all events.\n * should do it before destroy a component\n *\n */\n eventClear() {\n if (this.__events && this.__events.length > 0) {\n this.__events.forEach((e) => {\n e.emitter.removeListener(e.eventName, e.listener);\n });\n }\n }\n\n /**\n * @method eventRemove()\n * unsubscribe a event.\n *\n * @param {string} eventName - Name of the event\n * @param {object} emitter - Emitter object\n */\n eventRemove(eventName, emitter = null) {\n if (this.__events?.length > 0 && eventName) {\n this.__events.forEach((e) => {\n if (eventName == e.eventName && (!emitter || emitter == e.emitter))\n e.emitter.removeListener(e.eventName, e.listener);\n });\n\n this.__events = this.__events.filter((e) => e.eventName != eventName);\n }\n }\n\n get userScopes() {\n return [];\n }\n\n get isCursorFollow() {\n return (\n this.settings.followDatacollectionID &&\n (!this.settings.linkDatacollectionID || !this.settings.linkFieldID)\n );\n }\n\n get datacollectionFollow() {\n if (!this.isCursorFollow) return null;\n\n return (this.AB ?? AB).datacollectionByID(\n this.settings.followDatacollectionID\n );\n }\n\n get previousCursorId() {\n return this.__previousCursorId;\n }\n\n waitReady() {\n // if (this.dataStatus == this.dataStatusFlag.initialized) {\n // return Promise.resolve();\n // }\n // console.log(`DC[${this.label}] waiting for initializedData.`);\n // return new Promise((resolve /*, reject */) => {\n // this.once(\"initializedData\", ()=>{\n // resolve();\n // })\n\n // })\n\n return this.waitForDataCollectionToInitialize(this);\n }\n};\n","// import ABApplication from \"./ABApplication\"\n\nmodule.exports = class ABDefinitionCore {\n constructor(attributes, AB) {\n this.AB = AB;\n this.fromValues(attributes);\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n fromValues(attributes) {\n /*\n\t\t{\n\t\t\tid: uuid(),\n\t\t\tname: 'name',\n\t\t\ttype: 'xxxxx',\n\t\t\tjson: \"{json}\"\n\t\t}\n\t\t*/\n if (attributes.id) {\n this.id = attributes.id;\n }\n this.name =\n attributes?.name ||\n attributes?.json?.name ||\n attributes?.json?.label ||\n attributes?.json?.translations?.[0]?.label ||\n \"\";\n if (!this.name) {\n this.AB.notify.builder(\n new Error(\"Attributes for definition had no 'name'\"),\n {\n context: \"ABDefinitionCore.fromValues()\",\n attributes,\n }\n );\n }\n this.type = attributes.type || attributes?.json?.type || \"\";\n this.json = attributes.json || null;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n return {\n id: this.id,\n name: this.name,\n type: this.type,\n json: this.json,\n };\n }\n\n /**\n * @method destroy()\n * destroy the current instance of ABDefinition\n * Also remove it from our parent application\n * @return {Promise}\n */\n destroy() {\n return this.AB.definitionDestroy(this.id);\n }\n\n /**\n * @method save()\n * persist this instance of ABObject with it's parent ABApplication\n * @return {Promise}\n * .resolve( {this} )\n */\n async save() {\n if (this.id) {\n return this.AB.definitionUpdate(this.id, this.toObj());\n } else {\n return this.AB.definitionCreate(this.toObj());\n }\n }\n};\n","/*\n * ABFactoryCore\n * an object that contains the definitions and references for a single tenant.\n * It is expected that an instance of this should be returned from an\n * ABBootstrap.init(req).then((AB)=>{}) call.\n */\n\n// const _ = require(\"lodash\");\n// const uuidv4 = require(\"uuid\");\n\nconst ABClassManager = require(\"../platform/ABClassManager\");\n\nconst ABApplication = require(\"../platform/ABApplication\");\nconst ABApplicationMobile = require(\"../platform/ABApplicationMobile\");\nconst ABDefinition = require(\"../platform/ABDefinition\");\n\nconst ABComponent = require(\"../platform/ABComponent\");\n\nconst ABFieldManager = require(\"./ABFieldManager\");\n\nconst ABIndex = require(\"../platform/ABIndex\");\nconst ABObject = require(\"../platform/ABObject\");\nconst ABObjectExternal = require(\"../platform/ABObjectExternal\");\nconst ABObjectImport = require(\"../platform/ABObjectImport\");\nconst ABObjectApi = require(\"../platform/ABObjectApi\");\nconst ABObjectApiNetsuite = require(\"../platform/ABObjectApiNetsuite\");\nconst ABDataCollection = require(\"../platform/ABDataCollection\");\nconst ABObjectQuery = require(\"../platform/ABObjectQuery\");\n\nconst ABHint = require(\"../platform/ABHint\");\nconst ABProcess = require(\"../platform/ABProcess\");\n\nconst ABProcessParticipant = require(\"../platform/process/ABProcessParticipant\");\nconst ABProcessLane = require(\"../platform/process/ABProcessLane\");\nconst ABProcessTaskManager = require(\"./process/ABProcessTaskManager\");\n\nconst ABStep = require(\"../platform/ABStep\");\n\nconst ABViewDetailItem = require(\"../platform/views/ABViewDetailItem\");\nconst ABViewFormItem = require(\"../platform/views/ABViewFormItem\");\nconst ABMobileViewFormItem = require(\"../platform/mobile/ABMobileViewFormItem\");\n\n// const ABObjectWorkspaceViewGrid = require(\"../platform/workspaceViews/ABObjectWorkspaceViewGrid\");\n// const ABObjectWorkspaceViewKanban = require(\"../platform/workspaceViews/ABObjectWorkspaceViewKanban\");\n// const ABObjectWorkspaceViewGantt = require(\"../platform/workspaceViews/ABObjectWorkspaceViewGantt\");\n\nconst RowFilter = require(\"../platform/RowFilter\");\nconst FilterComplex = require(\"../platform/FilterComplex\");\n\nconst ABMLClass = require(\"../platform/ABMLClass\");\n\nconst EventEmitter = require(\"../platform/ABEmitter\");\n\nclass ABFactory extends EventEmitter {\n constructor(definitions) {\n /**\n * @param {hash} definitions\n * { ABDefinition.id : {ABDefinition} }\n * of all the definitions defined for the current Tenant\n */\n\n super();\n this.setMaxListeners(0);\n\n this._definitions = definitions || {};\n // {hash} { ABDefinition.id : {ABDefinition} }\n // ensure ._definitions is a HASH{ ID : {ABDefinition}}\n if (Array.isArray(definitions)) {\n var hash = {};\n definitions.forEach((d) => {\n hash[d.id] = d;\n });\n this._definitions = hash;\n }\n\n //\n //\n // Manage our working objects\n //\n\n this._allApplications = [];\n // {array} of all the ABApplication(s) in our site.\n\n this._allObjects = [];\n // {array} of all the ABObject(s) in our site.\n\n this._allHints = [];\n // {array} of all the ABHint(s) in our site.\n\n this._allProcesses = [];\n // {array} of all the ABProcess(s) in our site.\n\n this._allQueries = [];\n // {array} of all the ABObjectQuery(s) in our site.\n\n this._allSteps = [];\n // {array} of all the ABStep(s) in our site.\n\n this._allDatacollections = [];\n // {array} of all the ABDataCollection(s) in our site.\n\n this.ClassManager = ABClassManager;\n // {ClassManager} the single source for our Class Libraries.\n\n //\n // Class References\n //\n this.Class = {\n ABApplication,\n ABComponent,\n ABDefinition,\n ABFieldManager,\n ABIndex,\n ABMLClass,\n ABObject,\n ABObjectExternal,\n ABObjectImport,\n ABObjectApi,\n ABObjectApiNetsuite,\n ABObjectQuery,\n ABProcessParticipant,\n // ABRole // Do we need this anymore?\n\n // ABObjectWorkspaceViewGrid,\n // ABObjectWorkspaceViewKanban,\n // ABObjectWorkspaceViewGantt,\n\n ABProcessTaskManager,\n\n ABViewDetailItem,\n ABViewFormItem,\n ABMobileViewFormItem,\n };\n\n //\n // Rules\n // These are a common set of \"rules\" for all platforms.\n //\n this.rules = {\n /**\n * @method AB.rules.isUUID\n * evaluate a given value to see if it matches the format of a uuid\n * @param {string} key\n * @return {boolean}\n */\n isUUID: function (key) {\n var checker = RegExp(\n \"^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$\",\n \"i\"\n );\n return checker.test(key);\n },\n\n /**\n * @method AB.rules.nameFilter()\n * return a properly formatted name for an AppBuilder object.\n * @param {string} name\n * The name of the object we are conditioning.\n * @return {string}\n */\n nameFilter: function (name) {\n return String(name).replace(/[^a-z0-9_.]/gi, \"\");\n },\n\n /**\n * @method AB.rules.toApplicationNameFormat()\n * return a properly formatted Application Name\n * @param {string} name\n * The name of the Application we are conditioning.\n * @return {string}\n */\n toApplicationNameFormat: function (name) {\n return \"AB_\" + this.nameFilter(name);\n },\n\n /**\n * @method AB.rules.toFieldRelationFormat()\n * This function uses for define relation name of Knex Objection\n * return a relation name of column\n * @param {string} colName\n * The name of the Column\n * @return {string}\n */\n toFieldRelationFormat: function (colName) {\n return this.nameFilter(colName) + \"__relation\";\n },\n\n /**\n * @method AB.rules.toJunctionTableFK()\n * return foriegnkey (FK) column name for a junction table name\n * @param {string} objectName\n * The name of the Object with a connection\n * @param {string} columnName\n * The name of the connection columnName.\n * @return {string}\n */\n toJunctionTableFK: function (objectName, columnName) {\n var fkName = objectName + \"_\" + columnName;\n\n if (fkName.length > 64) fkName = fkName.substring(0, 64);\n\n return fkName;\n },\n\n /**\n * @method AB.rules.toJunctionTableNameFormat()\n * return many-to-many junction table name\n * @param {string} appName\n * The name of the Application for this object\n * @param {string} sourceTableName\n * The name of the source object we are conditioning.\n * @param {string} targetTableName\n * The name of the target object we are conditioning.\n * @param {string} colName\n * @return {string}\n */\n toJunctionTableNameFormat: function (\n appName,\n sourceTableName,\n targetTableName,\n colName\n ) {\n // The maximum length of a table name in MySql is 64 characters\n appName = this.toApplicationNameFormat(appName);\n if (appName.length > 17) appName = appName.substring(0, 17);\n\n if (sourceTableName.length > 15)\n sourceTableName = sourceTableName.substring(0, 15);\n\n if (targetTableName.length > 15)\n targetTableName = targetTableName.substring(0, 15);\n\n colName = this.nameFilter(colName);\n if (colName.length > 14) colName = colName.substring(0, 14);\n\n return \"{appName}_{sourceName}_{targetName}_{colName}\"\n .replace(\"{appName}\", appName)\n .replace(\"{sourceName}\", sourceTableName)\n .replace(\"{targetName}\", targetTableName)\n .replace(\"{colName}\", colName);\n },\n\n /**\n * @method AB.rules.toObjectNameFormat\n * return a properly formatted Object/Table Name\n * @param {string} objectName\n * The {ABObject}.name of the Object we are conditioning.\n * @return {string}\n */\n toObjectNameFormat: function (objectName) {\n return `AB_${this.nameFilter(objectName)}`;\n },\n };\n\n // Notify Helpers\n this.notify.builder = (...params) => {\n this.notify(\"builder\", ...params);\n };\n\n this.notify.developer = (...params) => {\n this.notify(\"developer\", ...params);\n };\n }\n\n /**\n * @method definitionClean()\n * make sure the provided ABDefinition values are properly formatted\n * @param {ABDefinition} d\n * The json settings of an ABDefinition object.\n */\n definitionClean(d) {\n if (typeof d.json == \"string\") {\n try {\n d.json = JSON.parse(d.json);\n } catch (e) {\n console.log(e);\n console.error(` Error on definition id[${d.id}]`);\n }\n }\n }\n\n init() {\n // BEFORE Definitions are loaded,\n // make sure any local Plugins are loaded.\n this.ClassManager.registerLocalPlugins(this.pluginAPI());\n\n let allDefinitions = Object.keys(this._definitions).map(\n (k) => this._definitions[k]\n );\n // {array} all our definitions in an Array format.\n\n // make sure our definitions.json field is an {} and not string\n allDefinitions.forEach((d) => {\n this.definitionClean(d);\n });\n\n // perform these in order:\n [\n \"object\",\n \"query\",\n \"datacollection\",\n \"process\",\n \"hint\",\n \"step\",\n \"application\",\n ].forEach((type) => {\n var objTypes = allDefinitions.filter((d) => d.type == type);\n objTypes.forEach((def) => {\n let { keyList, keyFn } = this.objectKeysByDef(def);\n if (keyList) {\n this[keyList].push(this[keyFn](def.json));\n }\n });\n });\n\n this.emit(\"init.objects_ready\");\n return Promise.resolve();\n }\n\n /**\n * @method objectKeysByDef()\n * Analyze the provided ABDefinition json and return which set of list and\n * functions are used to create a new instance of this definition.\n * @param {json} def\n * the ABDefinition json of the definition we are evaluating\n * @return { keyList, keyFn }\n * keyList: {string} which of our internal lists to store this new\n * object.\n * keyFn: {string} which of our methods to call with the def.json\n * as the param that will create the new object.\n *\n * ex: this[keyList].push( this[keyFn](def.json));\n *\n * if this def is not one of the types we track,\n * keyList = keyFn = null;\n */\n objectKeysByDef(def) {\n switch (def.type) {\n case \"application\":\n return { keyList: \"_allApplications\", keyFn: \"applicationNew\" };\n\n case \"datacollection\":\n return {\n keyList: \"_allDatacollections\",\n keyFn: \"datacollectionNew\",\n };\n\n case \"hint\":\n return { keyList: \"_allHints\", keyFn: \"hintNew\" };\n\n case \"steps\":\n return { keyList: \"_allSteps\", keyFn: \"stepNew\" };\n\n case \"object\":\n return { keyList: \"_allObjects\", keyFn: \"objectNew\" };\n\n case \"process\":\n return { keyList: \"_allProcesses\", keyFn: \"processNew\" };\n\n case \"query\":\n return { keyList: \"_allQueries\", keyFn: \"queryNew\" };\n\n default:\n // we don't manage any other\n return { keyList: null, keyFn: null };\n }\n }\n\n //\n // Definitions\n //\n\n /**\n * definitionByID(id)\n * return an ABDefinition.json value ready for our objects to use.\n * @param {string} id\n * the uuid of the ABDefinition to delete\n * @param {bool} isRaw\n * indicates if we want the full ABDefinition, or the .json param\n * true : returns full ABDefinition value.\n * false: returns the .json parameter used by most ABObjects.\n * @return {Promise}\n */\n definitionByID(id, isRaw = false) {\n if (this._definitions[id]) {\n if (isRaw) {\n return this._definitions[id];\n } else {\n return this._definitions[id].json;\n }\n }\n return null;\n }\n\n /**\n * definitionNew(values)\n * return an ABDefinition object tied to this Tenant.\n * @param {obj} values\n * The value hash of the ABDefinition object to create.\n * @return {ABDefinition}\n */\n definitionNew(values) {\n return new ABDefinition(values, this);\n }\n\n /**\n * definitionsParse()\n * include the incoming definitions into our ABFactory. These new\n * definitions will replace any existing ones with the same .id.\n * @param {array[ABDefinitioin]} defs\n * the incoming array of ABDefinitions to parse.\n * @return {Promise}\n */\n definitionsParse(defs = []) {\n if (!Array.isArray(defs)) {\n defs = [defs];\n }\n\n // store/replace the incoming definitions\n // 1st: insert ALL our definitions internally\n defs.forEach((d) => {\n this.definitionClean(d);\n this._definitions[d.id] = d;\n });\n // 2nd: Now we can then go through and signal the \"updates\"\n // and the related objects can find their dependent definitions.\n defs.forEach((d) => {\n this.definitionSync(\"updated\", d.id, d);\n });\n\n return Promise.resolve();\n }\n\n /**\n * definitionSync()\n * Synchronize an individual definition into our repository of definitions.\n * @param {string} op\n * the type of synchronization this is\n * [ \"created\", \"updated\", \"destroyed\"]\n * @param {uuid} id\n * the definition.id of the definition we are synchronizing\n * @param {json} def\n * the ABDefinition attributes we are storing.\n */\n definitionSync(op, id, def) {\n var { keyList, keyFn } = this.objectKeysByDef(def);\n if (keyList) {\n var curr;\n switch (op) {\n case \"created\":\n this[keyList].push(this[keyFn](def.json));\n this.emit(\"definition.created\", def.json);\n break;\n\n case \"updated\":\n // get the current object\n curr = this[keyList].find((d) => d.id == id);\n\n // remove from list\n this[keyList] = this[keyList].filter((d) => d.id != id);\n // add new one:\n this[keyList].push(this[keyFn](def.json));\n\n // signal this object needs to be updated:\n // NOTE: if this is one of the objects we are tracking,\n // we don't need to this.emit() the message.\n if (curr) {\n curr.emit(\"definition.updated\", def.json);\n } else {\n this.emit(\"definition.updated\", def.json);\n }\n break;\n\n case \"destroyed\":\n // get the current object\n curr = this[keyList].find((d) => d.id == id);\n if (curr) {\n // remove from list\n this[keyList] = this[keyList].filter((d) => d.id != id);\n\n // signal this object needs to be updated:\n curr.emit(\"definition.deleted\", def.json);\n\n this.emit(\"definition.deleted\", def.json);\n }\n break;\n }\n }\n }\n\n //\n // ABObjects\n //\n /**\n * @method applications()\n * return all the ABApplications that match the provided filter.\n * @param {fn} fn\n * A filter function to select specific ABApplications.\n * Must return true to include the entry.\n * @return {array}\n */\n applications(fn = () => true) {\n return (this._allApplications || []).filter(fn);\n }\n\n /**\n * @method applicationByID()\n * returns a single ABApplication that matches the given ID.\n * @param {string} ID\n * the .id/.name/.label of the ABApplication we are searching\n * for.\n * @return {ABApplication}\n * the matching ABApplication object if found\n * {null} if not found.\n */\n applicationByID(ID) {\n return this.applications((a) => a.id == ID)[0];\n }\n\n /**\n * @method applicationNew()\n * Return a new instance of an ABApplication object.\n * @param {json} values\n * the ABDefinition.json of the ABApplication object we are\n * creating.\n * @return {ABApplication}\n */\n applicationNew(values) {\n // just in case we got here by mistake:\n if (values.appType == \"mobile\") {\n return this.applicationMobileNew(values);\n }\n\n return new ABApplication(values, this);\n }\n\n /**\n * @method applicationMobileNew()\n * Return a new instance of an ABApplicationMobile object.\n * @param {json} values\n * the ABDefinition.json of the ABApplicationMobile object we are\n * creating.\n * @return {ABApplicationMobile}\n */\n applicationMobileNew(values) {\n return new ABApplicationMobile(values, this);\n }\n\n /**\n * @method datacollections()\n * return an array of all the ABDataCollection for this ABApplication.\n * @param {fn} filter\n * a filter fn to return a set of ABDataCollection that\n * this fn returns true for.\n * @return {array}\n * array of ABDataCollection\n */\n datacollections(filter = () => true) {\n return (this._allDatacollections || []).filter(filter);\n }\n\n /**\n * @method datacollectionByID()\n * returns a single ABDatacollection that matches the given ID.\n * @param {string} ID\n * the .id/.name/.label of the ABDatacollection we are searching\n * for.\n * @return {ABDatacollection}\n * the matching ABDatacollection object if found\n * {null} if not found.\n */\n datacollectionByID(ID) {\n // an undefined or null ID should not match any DC.\n if (!ID) return null;\n\n return this.datacollections((dc) => {\n return dc.id == ID || dc.name == ID || dc.label == ID;\n })[0];\n }\n\n /**\n * @method datacollectionNew()\n * create a new instance of ABDataCollection\n * @param {obj} values\n * the initial values for the DC\n * @return {ABDatacollection}\n */\n datacollectionNew(values) {\n var dc = new ABDataCollection(values, this);\n dc.on(\"destroyed\", () => {\n // make sure it is no longer in our internal list\n this._allDatacollections = this._allDatacollections.filter(\n (d) => d.id != dc.id\n );\n });\n return dc;\n }\n\n /**\n * @method fieldNew()\n * return an instance of a new (unsaved) ABField that is tied to a given\n * ABObject.\n * NOTE: this new field is not included in our this.fields until a .save()\n * is performed on the field.\n * @param {obj} values the initial values for this field.\n * - { key:'{string}'} is required\n * @param {ABObject} object the parent object this field belongs to.\n * @return {ABField}\n */\n fieldNew(values, object) {\n // NOTE: ABFieldManager returns the proper ABFieldXXXX instance.\n return ABFieldManager.newField(values, object);\n }\n\n /**\n * @method indexNew()\n * return an instance of a new (unsaved) ABIndex.\n * @return {ABIndex}\n */\n indexNew(values, object) {\n return new ABIndex(values, object);\n }\n\n /**\n * @method Label()\n * a simple label factory.\n * It is expected to be called like this:\n * @codestart\n * var L = AB.Label();\n * var outputText = L(\"Hello World\");\n * var o2 = L(\"I'm {0} years old\", [5]);\n * @codeend\n * @return {fn}\n */\n Label() {\n return (key, altText, values = []) => {\n var label = key;\n if (altText) {\n if (Array.isArray(altText)) {\n values = altText;\n } else {\n label = altText;\n }\n }\n\n values.forEach((v, i) => {\n var sub = `{${i}}`;\n label = label.replaceAll(sub, v);\n });\n\n return label;\n };\n }\n\n /**\n * @method objects()\n * return an array of all the ABObjects for this ABApplication.\n * @param {fn} filter\n * a filter fn to return a set of ABObjects that this fn\n * returns true for.\n * @return {array}\n * array of ABObject\n */\n objects(filter = () => true) {\n return (this._allObjects || []).filter(filter);\n }\n\n /**\n * @method objectByID()\n * return the specific object requested by the provided id.\n * @param {string} ID\n * @return {obj}\n */\n objectByID(ID) {\n return this.objects((o) => {\n return o.id == ID || o.name == ID || o.label == ID;\n })[0];\n }\n\n /**\n * @method objectNew()\n * return an instance of a new (unsaved) ABObject that is tied to this\n * ABApplication.\n * NOTE: this new object is not included in our this.objects until a .save()\n * is performed on the object.\n * @return {ABObject}\n */\n objectNew(values) {\n var newObj = null;\n\n if (values.plugin_key) {\n // If this is from a plugin, create it from ClassManager\n newObj = this.ClassManager.createObject(\n values.plugin_key,\n values,\n this\n );\n } else if (values.isExternal == true)\n newObj = new ABObjectExternal(values, this);\n else if (values.isImported == true)\n newObj = new ABObjectImport(values, this);\n else if (values.isNetsuite == true) {\n newObj = new ABObjectApiNetsuite(values, this);\n } else if (values.isAPI == true) newObj = new ABObjectApi(values, this);\n else newObj = new ABObject(values, this);\n\n /*\n // IS THIS CORRECT?\n newObj.on(\"destroyed\", () => {\n // make sure it is no longer in our internal list\n this._allObjects = this._allObjects.filter((o) => o.id != newObj.id);\n });\n */\n\n return newObj;\n }\n\n objectFile() {\n return this.objectByID(\"4a9d89c9-f4eb-41af-91e4-909eff389f3e\");\n }\n\n objectLanguage() {\n return this.objectByID(\"d84cd351-d96c-490f-9afb-2a0b880ca0ec\");\n }\n\n objectPlugin() {\n return this.objectByID(\"8a20528a-e472-4e80-911a-b14285425caf\");\n }\n\n objectPluginLinks() {\n return this.objectByID(\"7ff322ff-3434-4611-9fd1-4d2996414c1a\");\n }\n\n objectProcessDefinition() {\n return this.objectByID(\"af91fc75-fb73-4d71-af14-e22832eb5915\");\n }\n\n objectProcessForm() {\n return this.objectByID(\"d36ae4c8-edef-48d8-bd9c-79a0edcaa067\");\n }\n\n objectProcessInstance() {\n return this.objectByID(\"2ba85be0-78db-4eda-ba43-c2c4e3831849\");\n }\n\n objectRole() {\n return this.objectByID(\"c33692f3-26b7-4af3-a02e-139fb519296d\");\n }\n\n objectScope() {\n return this.objectByID(\"af10e37c-9b3a-4dc6-a52a-85d52320b659\");\n }\n\n objectToken() {\n return this.objectByID(\"08826ac7-4b33-4745-a3d7-f7831ca4ff59\");\n }\n\n objectUser() {\n return this.objectByID(\"228e3d91-5e42-49ec-b37c-59323ae433a1\");\n }\n\n objectKey() {\n return this.objectByID(\"d734fe8c-b615-446c-8a5f-793ddece19f9\");\n }\n\n objectSecret() {\n return this.objectByID(\"db5b3b26-5300-4c92-bc73-8ce4f4696992\");\n }\n\n //\n // Plugin\n //\n pluginAPI() {\n let api = this.ClassManager.getPluginAPI();\n api.AB = this;\n api.platform = this.platform ?? \"service\";\n return api;\n }\n\n pluginRegister(plugin) {\n let pluginClass = plugin(this.pluginAPI());\n if (Array.isArray(pluginClass)) {\n pluginClass.forEach((p) => {\n this.ClassManager.pluginRegister(p);\n });\n } else {\n this.ClassManager.pluginRegister(pluginClass);\n }\n }\n\n //\n // Hints\n //\n /**\n * @method hints()\n * return all the ABHints that match the provided filter.\n * @param {fn} fn\n * A filter function to select specific ABHints.\n * Must return true to include the entry.\n * @return {array}\n */\n hints(filter = () => true) {\n return (this._allHints || []).filter(filter);\n }\n\n /**\n * @method hintByID()\n * return the specific hint requested by the provided id.\n * @param {string} ID\n * @return {obj}\n */\n hintID(ID) {\n return this.hints((h) => {\n return h.id == ID || h.name == ID || h.label == ID;\n })[0];\n }\n\n /**\n * @method hintNew()\n * return an instance of a new (unsaved) ABHint that is tied to this\n * ABApplication.\n * NOTE: this new hint is not included in our this.hints until a .save()\n * is performed on the object.\n * @return {ABHint}\n */\n hintNew(values) {\n var newHint = new ABHint(values, this);\n\n return newHint;\n }\n\n //\n // Steps\n //\n /**\n * @method steps()\n * return all the ABSteps that match the provided filter.\n * @param {fn} fn\n * A filter function to select specific ABSteps.\n * Must return true to include the entry.\n * @return {array}\n */\n steps(filter = () => true) {\n return (this._allSteps || []).filter(filter);\n }\n\n /**\n * @method stepByID()\n * return the specific step requested by the provided id.\n * @param {string} ID\n * @return {obj}\n */\n stepID(ID) {\n return this.steps((s) => {\n return s.id == ID || s.name == ID || s.label == ID;\n })[0];\n }\n\n /**\n * @method stepNew()\n * return an instance of a new (unsaved) ABStep that is tied to this\n * ABApplication.\n * NOTE: this new step is not included in our this.steps until a .save()\n * is performed on the object.\n * @return {ABHint}\n */\n stepNew(id, hintID) {\n var stepDef = this.definitionByID(id);\n if (stepDef) {\n var getStep = new ABStep(stepDef, this);\n return getStep;\n } else {\n var params = {\n settings: {\n hint: hintID,\n },\n };\n var newStep = new ABStep(params, this);\n return newStep;\n }\n // return null;\n }\n\n //\n // Processes\n //\n /**\n * @method processes()\n * return all the ABProcess that match the provided filter.\n * @param {fn} fn\n * A filter function to select specific ABProcess.\n * Must return true to include the entry.\n * @return {array}\n */\n processes(filter = () => true) {\n return (this._allProcesses || []).filter(filter);\n }\n\n /**\n * @method processByID()\n * return the specific process requested by the provided id.\n * @param {string} ID\n * @return {obj}\n */\n processByID(ID) {\n return this.processes((p) => {\n return p.id == ID || p.name == ID || p.label == ID;\n })[0];\n }\n\n /**\n * @method processNew()\n * Return a new instance of an ABProcess object.\n * @param {json} values\n * the ABDefinition.json of the ABProcess object we are\n * creating.\n * @return {ABProcess}\n */\n processNew(values) {\n return new ABProcess(values, this);\n }\n\n /**\n * @method processElementNew(id)\n * return an instance of a new ABProcessOBJ that is tied to a given\n * ABProcess.\n * @param {string} id\n * the ABDefinition.id of the element we are creating\n * @param {ABProcess} process\n * the process this task is a part of.\n * @return {ABProcessTask}\n */\n processElementNew(id, process) {\n var taskDef = this.definitionByID(id);\n if (taskDef) {\n switch (taskDef.type) {\n case ABProcessParticipant.defaults().type:\n return new ABProcessParticipant(taskDef, process, this);\n // break;\n\n case ABProcessLane.defaults().type:\n return new ABProcessLane(taskDef, process, this);\n // break;\n\n default:\n // default to a Task\n return ABProcessTaskManager.newTask(taskDef, process, this);\n // break;\n }\n }\n return null;\n }\n\n /**\n * @method processElementNewForModelDefinition(def)\n *\n * return an instance of a new ABProcess[OBJ] that is tied to the given\n * BPMI:Element definition.\n *\n * @param {BPMI:Element} element the element definition from our BPMI\n * modler.\n * @return {ABProcess[OBJ]}\n */\n processElementNewForModelDefinition(element, process) {\n var newElement = null;\n\n switch (element.type) {\n case \"bpmn:Participant\":\n newElement = new ABProcessParticipant({}, process, this);\n break;\n\n case \"bpmn:Lane\":\n newElement = new ABProcessLane({}, process, this);\n break;\n\n default:\n var defaultDef = ABProcessTaskManager.definitionForElement(element);\n if (defaultDef) {\n newElement = ABProcessTaskManager.newTask(\n defaultDef,\n process,\n this\n );\n }\n break;\n }\n\n // now make sure this new Obj pulls any relevant info from the\n // diagram element\n if (newElement) {\n newElement.fromElement(element);\n }\n return newElement;\n }\n\n /**\n * @method queries()\n * return an array of all the ABObjectQuery(s).\n * @param {fn} filter\n * a filter fn to return a set of ABObjectQuery(s) that this fn\n * returns true for.\n * @return {array}\n * array of ABObjectQuery\n */\n queries(filter = () => true) {\n return (this._allQueries || []).filter(filter);\n }\n // queriesAll() {\n // console.error(\n // \"ABFactory.queriesAll() Depreciated! Use .queries() instead. \"\n // );\n // return this.queries();\n // }\n\n /**\n * @method queryByID()\n * return the specific query requested by the provided id.\n * NOTE: this method has been extended to allow .name and .label\n * as possible lookup values.\n * @param {string} ID\n * @return {ABObjectQuery}\n */\n queryByID(ID) {\n return this.queries((q) => {\n return q.id == ID || q.name == ID || q.label == ID;\n })[0];\n }\n\n /**\n * @method queryNew()\n * return an instance of a new (unsaved) ABObjectQuery that is tied to this\n * ABFactory.\n * @return {ABObjectQuery}\n */\n queryNew(values) {\n return new ABObjectQuery(values, this);\n }\n\n /**\n * @method rowfilterNew()\n * return an instance of a new RowFilter that is tied to this\n * ABFactory.\n * @return {RowFilter}\n */\n rowfilterNew(App, idBase) {\n if (App) {\n console.error(\"!! Who is calling this with an App?\");\n }\n return new RowFilter(App || this._App, idBase, this);\n }\n\n /**\n * @method filterComplexNew()\n * return an instance of a new FilterComplex that is tied to this\n * ABFactory.\n * @return {FilterComplex}\n */\n filterComplexNew(idBase, options = {}) {\n return new FilterComplex(idBase, this, options);\n }\n\n /**\n * @method viewNewDetatched()\n * Return an instance of a View that is NOT attached to an ABApplication.\n * @return {ABViewXXX}\n */\n viewNewDetatched(values) {\n if (!this._mockApp) {\n this._mockApp = this.applicationNew({});\n }\n return this._mockApp.viewNew(values, this._mockApp);\n }\n\n //\n // Utilities\n //\n\n /**\n * notify()\n * will send alerts to a group of people. These alerts are usually about\n * configuration errors, or software problems.\n * @param {string} domain\n * which group of people we are sending a notification to.\n * @param {Error} error\n * An error object generated at the point of issue.\n * @param {json} info\n * Additional related information concerning the issue.\n */\n notify(/* ...params */) {\n console.error(\n \"ABFactory.notify() is expected to be overwritten by the platform!\"\n );\n }\n\n /**\n * notifyInfo()\n * a common routine to parse the info parameter provided to .notify() into\n * a more detailed set of data.\n * @param {json} info\n * @return {json}\n */\n _notifyInfo(info) {\n var moreInfo = {};\n\n if (info) {\n Object.keys(info).forEach((k) => {\n switch (k) {\n case \"field\":\n moreInfo.objectID = info[k].object?.id;\n moreInfo.objectName = info[k].object?.name;\n moreInfo.fieldID = info[k].id;\n moreInfo.fieldName = info[k].label || info[k].name;\n break;\n\n case \"object\":\n moreInfo.objectID = info[k].id;\n moreInfo.objectName = info[k].name;\n break;\n\n case \"datacollection\":\n moreInfo.datacollectionID = info[k].id;\n moreInfo.datacollectionName = info[k].label || info[k].name;\n var ds = info[k].datasource;\n if (ds) {\n moreInfo.datacollectionDSID = ds.id;\n moreInfo.datacollectionDSName = ds.name;\n }\n break;\n\n case \"process\":\n moreInfo.processID = info[k].id;\n moreInfo.processName = info[k].label || info[k].name;\n break;\n\n case \"req\":\n moreInfo.req = {\n jobID: info[k].jobID,\n tenantID: info[k]._tenantID,\n user: info[k]._user,\n };\n break;\n\n case \"task\":\n if (info[k].process) {\n moreInfo.processID = info[k].process.id;\n moreInfo.processName =\n info[k].process.label || info[k].process.name;\n }\n moreInfo.taskID = info[k].id;\n moreInfo.taskName = info[k].label || info[k].name;\n break;\n\n case \"view\":\n if (info[k].application) {\n moreInfo.applicationID = info[k].application.id;\n moreInfo.applicationName =\n info[k].application.label || info[k].application.name;\n }\n moreInfo.viewID = info[k].id;\n moreInfo.viewName = info[k].label || info[k].name;\n moreInfo.viewKey = info[k].key;\n break;\n default:\n moreInfo[k] = info[k];\n break;\n }\n });\n }\n\n return moreInfo;\n }\n}\n\nmodule.exports = ABFactory;\n","/*\n * ABFieldManager\n *\n * An interface for managing the different ABFields available in our AppBuilder.\n *\n */\n\n/*\n * Fields\n * A name => ABField hash of the different ABFields available.\n */\nvar Fields = {};\n\nvar AllFieldClasses = [\n require(\"../platform/dataFields/ABFieldString\"),\n require(\"../platform/dataFields/ABFieldLongText\"),\n require(\"../platform/dataFields/ABFieldNumber\"),\n require(\"../platform/dataFields/ABFieldDate\"),\n require(\"../platform/dataFields/ABFieldDateTime\"),\n require(\"../platform/dataFields/ABFieldBoolean\"),\n require(\"../platform/dataFields/ABFieldList\"),\n require(\"../platform/dataFields/ABFieldTree\"),\n require(\"../platform/dataFields/ABFieldEmail\"),\n require(\"../platform/dataFields/ABFieldFile\"),\n require(\"../platform/dataFields/ABFieldImage\"),\n require(\"../platform/dataFields/ABFieldUser\"),\n require(\"../platform/dataFields/ABFieldConnect\"),\n require(\"../platform/dataFields/ABFieldCalculate\"),\n require(\"../platform/dataFields/ABFieldTextFormula\"),\n require(\"../platform/dataFields/ABFieldFormula\"),\n require(\"../platform/dataFields/ABFieldAutoIndex\"),\n require(\"../platform/dataFields/ABFieldJson\"),\n require(\"../platform/dataFields/ABFieldCombine\"),\n require(\"../platform/dataFields/ABFieldSelectivity\"),\n];\n\nAllFieldClasses.forEach((FIELD) => {\n Fields[FIELD.defaults().key] = FIELD;\n});\n\nmodule.exports = class ABFieldManager {\n /*\n * @function allFields\n * return all the currently defined ABFields in an array.\n * @return [{ABField},...]\n */\n static allFields() {\n var fields = [];\n for (var f in Fields) {\n fields.push(Fields[f]);\n }\n return fields;\n }\n\n /**\n * @function fieldByKey()\n * Return a specific ABField that matches the given key\n * @param {string} key\n * The ABField.key value we are looking for.\n * @return {ABFieldXXX || undefined}\n */\n static fieldByKey(key) {\n return Fields[key];\n }\n\n /*\n * @function newField\n * return an instance of an ABField based upon the values.key value.\n * @return {ABField}\n */\n static newField(values, object) {\n if (values.key) {\n try {\n return new Fields[values.key](values, object);\n } catch (err) {\n console.log(\"Error\", err);\n console.log(\"Available fields\", Fields);\n console.log(\"Requested field\", values.key);\n }\n } else {\n console.log(\"-------\");\n console.log(\"values:\");\n console.error(values);\n console.log();\n console.error(\"object:\");\n console.error(object);\n console.log(\"-------\");\n throw new Error(\n `ABFieldManager.newField(): Unknown Field Key [${values.name}][${values.key}] for object[${object.name}]`\n );\n //// TODO: what to do here?\n }\n }\n};\n","// import ABApplication from \"./ABApplication\"\n\nvar ABMLClass = require(\"../platform/ABMLClass\");\nconst _concat = require(\"lodash/concat\");\n\nmodule.exports = class ABHintCore extends ABMLClass {\n constructor(attributes, AB) {\n super([\"name\", \"description\"], AB);\n\n this.fromValues(attributes);\n\n // indicate we are ready.\n // this.elements().forEach((e) => {\n // e.onProcessReady();\n // });\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n description: 'description',\n type: 'hint',\n settings: {\n active: {boolean},\n view: uuid\n }\n }\n */\n\n let active = attributes?.settings?.active ?? \"1\";\n\n this.id = attributes?.id || \"\";\n this.name = attributes?.name || \"New Tutorial\";\n this.description = attributes?.description || \"\";\n this.type = attributes?.type || \"hint\";\n this.settings = {};\n this.settings.active = active;\n this.settings.transition = attributes?.settings?.transition;\n this.settings.showIntroStep = attributes?.settings?.showIntroStep;\n this.settings.view = attributes?.settings?.view || \"\";\n this.stepIDs = attributes?.stepIDs || [];\n\n let currSteps = this?._steps || {};\n this._steps = {};\n (attributes?.stepIDs || []).forEach((sID) => {\n if (!sID) return;\n var ele = this.AB.stepNew(sID, this.id);\n if (ele) {\n this._steps[sID] = ele;\n }\n });\n if (attributes) super.fromValues(attributes); // perform translation on this object.\n // NOTE: keep this at the end of .fromValues();\n\n if (!this.label) {\n this.label = this.name;\n }\n }\n\n /**\n * @method toObj()\n * properly compile the current state of this ABProcess instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n toObj() {\n // default label value\n if (!this.label) {\n this.label = this.name;\n }\n\n // OP.Multilingual.unTranslate(this, this, [\"label\"]);\n var data = super.toObj();\n\n var fieldsToSave = [\"type\", \"settings\", \"stepIDs\", \"id\", \"name\"];\n fieldsToSave.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n\n /**\n * steps()\n * return an array of steps that match the given filter (or all steps\n * if no filter is provided).\n * @param {fn} fn an iterator that returns true if the provided element\n * should be returned.\n * @return {[ABStep]}\n */\n steps(fn = () => true) {\n var allSteps = Object.keys(this._steps).map((e) => {\n return this._steps[e];\n });\n return allSteps.filter(fn);\n }\n\n /**\n * stepAdd()\n * insert a step to be added to this hint.\n * @param {ABStep} element\n * the full instance of an ABStep to track.\n */\n stepAdd(step) {\n this._steps[step.id] = step;\n }\n\n /**\n * stepByID()\n * return the {ABStep} that has the given .id\n * @param {string} id\n * @return {ABStep[OBJ]}\n */\n stepByID(id) {\n return this._steps[id] ?? null;\n }\n\n /**\n * stepRemove()\n * remove a step from being displayed by this hint.\n * @param {id} ABStep ID\n * an ID of a step\n * to remove.\n */\n stepRemove(id) {\n // remove from stepIDs array\n let stepIndex = this.stepIDs.indexOf(id);\n if (stepIndex > -1) {\n this.stepIDs.splice(stepIndex, 1);\n }\n // remove from _steps definitions\n delete this._steps[id];\n }\n};\n","const ABMLClass = require(\"../platform/ABMLClass\");\n\nmodule.exports = class ABIndexCore extends ABMLClass {\n constructor(attributes, object) {\n super([\"label\"], object.AB);\n this.object = object;\n\n this.fromValues(attributes);\n }\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n fields:[\n {ABDataField.id}\n ],\n unique: {boolean}\n }\n */\n this.id = attributes.id;\n this.type = \"index\";\n this.name = attributes.name;\n this.unique = JSON.parse(attributes.unique || false);\n\n // Convert to an array\n if (attributes.fieldIDs && !Array.isArray(attributes.fieldIDs)) {\n attributes.fieldIDs = [attributes.fieldIDs];\n }\n\n this._unknownFieldIDs = [];\n this.fields = (attributes.fieldIDs || [])\n .map((f) => {\n let field = this.object.fieldByID(f);\n if (!field) {\n this._unknownFieldIDs.push(f);\n let err = new Error(\n `Index[${this.name}][${this.id}] is referencing an unknown field[${f}]`\n );\n this.AB.notify.developer(err, {\n index: this.id,\n field: f,\n });\n }\n return field;\n })\n .filter((fId) => fId);\n\n if (this.fields.length == 0) {\n let err = new Error(\n `Index[${this.name}][${this.id}] is not referencing any fields`\n );\n this.AB.notify.developer(err, {\n index: this.id,\n attributeFieldIDs: attributes.fieldIDs || [],\n });\n }\n\n // let the MLClass process the Translations\n super.fromValues(attributes);\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n let result = super.toObj();\n\n result.id = this.id;\n result.type = \"index\";\n result.name = this.name;\n result.unique = this.unique;\n\n // Convert to an array\n if (this.fields && !Array.isArray(this.fields)) {\n this.fields = [this.fields];\n }\n\n result.fieldIDs = (this.fields || [])\n .map((f) => {\n // Convert to the id of field\n return f.id || f;\n })\n .filter((fId) => fId);\n\n // carry along the unknown Field IDs so a\n // developer/builder can come along and trace\n // what happened.\n this._unknownFieldIDs.forEach((f) => {\n result.fieldIDs.push(f);\n });\n\n return result;\n }\n\n get indexName() {\n let tableName = this.object.dbTableName();\n\n // Maximum 64 characters long\n return `${tableName}_${this.name}`.replace(/ /g, \"\").substring(0, 64);\n }\n\n get uniqueName() {\n let indexName = this.indexName.substring(0, 57);\n\n return `${indexName}_unique`;\n }\n};\n","/**\n * ABMLClassCore\n * manage the multilingual information of an instance of a AB Defined Class.\n *\n * these classes have certain fields (\"label\", \"description\"), that can be\n * represented in different language options as defined by our platform.\n *\n * This core ABMLClass will internally track the multilingual fields\n * (this.mlFields) and auto\n */\nvar ABEmitter = require(\"../platform/ABEmitter\");\nmodule.exports = class ABMLClassCore extends ABEmitter {\n constructor(fieldList, AB) {\n super();\n this.mlFields = fieldList || [\"label\"];\n // {array}\n // field names of values that are multilingual\n\n this.AB = AB;\n // {ABFactory}\n // our common source of references for other AB objects\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n /**\n * @method fromValues\n * called during the .fromValues() work chain. Should be called\n * AFTER all the current data is already populated.\n */\n fromValues(attributes) {\n this.translations = attributes.translations;\n\n // if translations were provided\n if (this.translations) {\n // multilingual fields: label, description\n this.translate();\n } else {\n // maybe this came from a form that has ML values in the attributes, but\n // no .translations[] yet:\n // check for mlFields in attributes and record them here:\n (this.mlFields || []).forEach((field) => {\n if (attributes[field]) {\n this[field] = attributes[field];\n }\n });\n }\n }\n\n /**\n * @function defaultTranslations()\n * return an initial .translations entry to initialize the\n * translations values of a given translateable object.\n * @param {array} fields the multilingual fields this obj manages.\n * @param {json} values a default set of values for this object.\n * @return {array} of translation entries.\n */\n defaultTranslations(fields, values) {\n values = values || {};\n\n var entry = {\n // Question: should this be this.AB.Multilingual.currentLanguage() || \"en\"\n // currently since the defaults are sent in programattically, we are\n // expecting the labels to be in \"en\"\n language_code: \"en\",\n };\n\n fields.forEach((f) => {\n entry[f] = values[f] || f;\n });\n\n return [entry];\n }\n\n /**\n * @method languageDefault\n * return a default language code.\n * @return {string}\n */\n languageDefault() {\n return \"en\";\n }\n\n /**\n * @method toObj()\n * called during the .toObj() work chain. Should be called\n * BEFORE the current data is populated.\n */\n toObj() {\n this.unTranslate();\n\n return {\n translations: this.translations,\n };\n }\n\n /**\n * @method toDefinition()\n * convert this instance into an ABDefinition object.\n * @return {ABDefinition}\n */\n toDefinition() {\n return this.AB.definitionNew({\n id: this.id,\n name: this.name,\n type: this.type,\n json: this.toObj(),\n });\n }\n\n /**\n * @method translate\n * Given a set of json data, pull out any multilingual translations\n * and flatten those values to the base object.\n * @param {obj} obj The instance of the object being translated\n * @param {json} json The json data being used for translation.\n * There should be json.translations = [ {transEntry}, ...]\n * where transEntry = {\n * language_code:'en',\n * field1:'value',\n * ...\n * }\n * @param {array} fields an Array of multilingual fields to pull to\n * the obj[field] value.\n */\n translate(obj, json, fields, languageCode = null) {\n if (!obj) obj = this;\n if (!json) json = this;\n if (!fields) fields = this.mlFields || [];\n\n if (!json.translations) {\n json.translations = [];\n }\n\n if (typeof json.translations == \"string\") {\n json.translations = JSON.parse(json.translations);\n }\n\n var currLanguage = languageCode || this.languageDefault();\n\n if (fields && fields.length > 0) {\n // [fix] if no matching translation is in our json.translations\n // object, then just use the 1st one.\n var first = null; // the first translation entry encountered\n var found = false; // did we find a matching translation?\n\n json.translations.forEach(function (t) {\n if (!first) first = t;\n\n // find the translation for the current language code\n if (t.language_code == currLanguage) {\n found = true;\n\n // copy each field to the root object\n fields.forEach(function (f) {\n if (t[f] != null) obj[f] = t[f];\n\n obj[f] = t[f] || \"\"; // default to '' if not found.\n });\n }\n });\n\n // if !found, then use the 1st entry we did find. prepend desired\n // [language_code] to each of the fields.\n if (!found && first) {\n // copy each field to the root object\n fields.forEach(function (f) {\n if (first[f] != null && first[f] != \"\")\n obj[f] = `[${currLanguage}]${first[f]}`;\n else obj[f] = \"\"; // default to '' if not found.\n });\n }\n }\n }\n\n /**\n * @method unTranslate\n * Take the multilingual information in the base obj, and push that\n * down into the json.translations data.\n * @param {obj} obj The instance of the object with the translation\n * @param {json} json The json data being used for translation.\n * There should be json.translations = [ {transEntry}, ...]\n * where transEntry = {\n * language_code:'en',\n * field1:'value',\n * ...\n * }\n * @param {array} fields an Array of multilingual fields to pull from\n * the obj[field] value.\n */\n unTranslate(obj, json, fields) {\n if (!obj) obj = this;\n if (!json) json = this;\n if (!fields) fields = this.mlFields || [];\n\n if (!json.translations) {\n json.translations = [];\n }\n\n var currLanguage = this.languageDefault();\n\n if (fields && fields.length > 0) {\n var foundOne = false;\n\n json.translations.forEach(function (t) {\n // find the translation for the current language code\n if (t.language_code == currLanguage) {\n // copy each field to the root object\n fields.forEach(function (f) {\n // verify obj[f] is defined\n // --> DONT erase the existing translation\n if (obj[f] != null) {\n t[f] = obj[f];\n }\n });\n\n foundOne = true;\n }\n });\n\n // if we didn't update an existing translation\n if (!foundOne) {\n // create a translation entry:\n var trans = {};\n\n // assume current languageCode:\n trans.language_code = currLanguage;\n\n fields.forEach(function (field) {\n if (obj[field] != null) {\n trans[field] = obj[field];\n }\n });\n\n json.translations.push(trans);\n }\n }\n }\n};\n","//\n// ABModelCore\n//\n// Represents the Data interface for an ABObject data.\n//\n// to use an ABModel to load a DataTable:\n// Method 1:\n// gather all the data externally and send to the DataTable\n// Model.findAll()\n// .then((data)=>{\n// DataTable.parse(data);\n// })\n//\n\n// const { isArray } = require(\"lodash\");\n\nmodule.exports = class ABModelCore {\n constructor(object) {\n // link me to my ABObject\n this.object = object;\n this.AB = object.AB;\n\n this._where = null;\n this._sort = null;\n this._skip = null;\n this._limit = null;\n\n this.staleRefreshInProcess = false;\n this.staleRefreshMap = {\n /* id : Promise */\n };\n this.staleRefreshPending = [];\n this.staleRefreshTimerID = null;\n\n // include this\n this.responseContext = { key: \"--\", context: {} };\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n ///\n /// Instance Methods\n ///\n\n contextKey(key) {\n this.responseContext.key = key || \"--\";\n }\n\n contextValues(values) {\n this.responseContext.context = values || {};\n }\n\n // Prepare multilingual fields to be untranslated\n // Before untranslating we need to ensure that values.translations is set.\n prepareMultilingualData(values) {\n // if this object has some multilingual fields, translate the data:\n var mlFields = this.object.multilingualFields();\n // if mlFields are inside of the values saved we want to translate otherwise do not because it will reset the translation field and you may loose unchanged translations\n var shouldTranslate = false;\n if (mlFields.length) {\n mlFields.forEach(function (field) {\n if (values[field] != null) {\n shouldTranslate = true;\n }\n });\n }\n if (shouldTranslate) {\n if (\n values.translations == null ||\n typeof values.translations == \"undefined\" ||\n values.translations == \"\"\n ) {\n values.translations = [];\n }\n this.object.unTranslate(values, values, mlFields);\n }\n }\n\n request(/* method, params */) {\n console.error(\n \"!!! ABModelCore.request() should be overridden by platform.\"\n );\n return Promise.resolve();\n }\n\n // /**\n // * @method create\n // * update model values on the server.\n // */\n // create(values) {\n\n // this.prepareMultilingualData(values);\n\n // var params = {\n // url: this.object.urlRest(),\n // params: values\n // }\n // return this.request('post', params)\n // .then((data) => {\n\n // this.normalizeData(data);\n\n // return data;\n\n // // FIX: now with sockets, the triggers are fired from socket updates.\n // // trigger a create event\n // // triggerEvent('create', this.object, data);\n\n // })\n // .catch(reject);\n\n // }\n\n /**\n * @method delete\n * remove this model instance from the server\n * @param {integer} id the .id of the instance to remove.\n * @return {Promise}\n */\n // delete(id) {\n\n // var params = {\n // url: this.object.urlRestItem(id)\n // }\n // return this.request('delete', params)\n // .then((data) => {\n\n // return data;\n\n // // FIX: now with sockets, the triggers are fired from socket updates.\n // // trigger a delete event\n // // triggerEvent('delete', this.object, id);\n\n // })\n // }\n\n /**\n * @method findAll\n * performs a data find with the provided condition.\n */\n // findAll(cond) {\n\n // cond = cond || {};\n\n // var params = {\n // url: this.object.urlRest(),\n // params: cond\n // }\n // return this.request('get', params)\n // .then((data) => {\n\n // this.normalizeData(data.data);\n\n // resolve(data);\n // })\n // .catch((err) => {\n // /// TODO: this should be done in platform/ABModel:\n // // if (err && err.code) {\n // // switch(err.code) {\n // // case \"ER_PARSE_ERROR\":\n // // OP.Error.log('AppBuilder:ABModel:findAll(): Parse Error with provided condition', { error: err, condition:cond })\n // // break;\n\n // // default:\n // // OP.Error.log('AppBuilder:ABModel:findAll(): Unknown Error with provided condition', { error: err, condition:cond })\n // // break;\n // // }\n\n // // }\n // console.error(err);\n // })\n\n // }\n\n urlParamsCreate(values) {\n return {\n url: this.object.urlRest(),\n params: values,\n };\n }\n\n urlParamsDelete(id) {\n return {\n url: this.object.urlRestItem(id),\n };\n }\n\n urlParamsFind(cond) {\n return {\n url: this.object.urlRest(),\n params: cond || {},\n };\n }\n\n urlParamsUpdate(id, values) {\n return {\n url: this.object.urlRestItem(id),\n params: values,\n };\n }\n\n /**\n * @method count\n * count a data find with the provided condition.\n */\n count(cond) {\n cond = cond || {};\n\n var params = {\n url: this.object.urlRestCount(),\n params: cond,\n };\n return this.request(\"get\", params)\n .then((numberOfRows) => {\n // resolve(numberOfRows);\n return numberOfRows;\n })\n .catch((err) => {\n // TODO: this should be done in platform/ABModel\n\n // OP.Error.log('AppBuilder:ABModel:count(): Parse Error with provided condition', { error: err, condition:cond })\n\n // reject(err);\n console.error(err);\n });\n }\n\n /**\n * @method staleRefresh\n * Process a request to refresh the data for a given entry.\n * This method is called from a ABDataview when it receives\n * a 'ab.datacollection.stale' message.\n * This method will try to queue similar reqeusts and then issue 1 large\n * request, rather than numerous individual ones.\n * @param {obj} cond the condition of the entry we are requesting.\n * @return {Promise}\n */\n staleRefresh(cond) {\n // cond should be { where:{ id: X } } format.\n var PK = this.object.PK();\n\n var currID = cond[PK]; // just in case we get a { id: X }\n if (cond.where) {\n currID = cond.where[PK];\n }\n\n return new Promise((resolve, reject) => {\n if (!currID) {\n var Err = new Error(\n \"Model.staleRefresh(): could not resolve .\" + PK\n );\n Err.cond = cond;\n reject(Err);\n return;\n }\n\n // convert to PK : Promise object:\n var entry = {\n resolve: resolve,\n reject: reject,\n };\n entry[PK] = currID;\n\n // queue up refresh condition\n this.staleRefreshPending.push(entry);\n\n // if ! staleRefreshInProcess\n if (!this.staleRefreshInProcess) {\n // set timeout to another 200ms wait after LAST staleRefresh()\n if (this.staleRefreshTimerID) {\n clearTimeout(this.staleRefreshTimerID);\n }\n this.staleRefreshTimerID = setTimeout(() => {\n this.staleRefreshProcess();\n }, 200);\n }\n });\n }\n\n /**\n * @method staleRefreshProcess\n * Actually process the current pending requests.\n */\n staleRefreshProcess() {\n this.staleRefreshInProcess = true;\n var currentEntries = this.staleRefreshPending;\n this.staleRefreshPending = [];\n var PK = this.object.PK();\n\n var responseHash = {\n /* id : [{entry}] */\n };\n var cond = { where: {}, populate: true };\n cond.where[PK] = [];\n\n console.log(\n \"Model.staleRefreshProcess(): buffered \" +\n currentEntries.length +\n \" requests\"\n );\n currentEntries.forEach((e) => {\n responseHash[e[PK]] = responseHash[e[PK]] || [];\n responseHash[e[PK]].push(e);\n });\n\n cond.where[PK] = Object.keys(responseHash);\n\n this.findAll(cond).then((res) => {\n // for each entry we got back\n if (Array.isArray(res.data) && res.data.length) {\n res.data.forEach((data) => {\n // find it's matching request:\n if (responseHash[data[PK]]) {\n // respond to the pending promise\n // and remove these entries from responseHash\n var entries = responseHash[data[PK]];\n entries.forEach((entry) => {\n var resolve = entry.resolve;\n resolve({ data: [data] });\n });\n\n delete responseHash[data[PK]];\n } else {\n console.error(\n \"Model.staleRefreshProcess(): returned entry was not in our responseHash:\",\n data,\n responseHash\n );\n }\n });\n }\n\n // now if there are any entries left in responseHash,\n // respond with an empty entry:\n var allKeys = Object.keys(responseHash);\n if (allKeys.length > 0) {\n console.warn(\n \"Model.staleRefreshProcess(): \" +\n allKeys.length +\n \" entries with no responses. \"\n );\n }\n allKeys.forEach((key) => {\n let entry = responseHash[key];\n let resolve;\n if (Array.isArray(entry)) {\n resolve = entry[0].resolve;\n } else {\n resolve = entry.resolve;\n }\n resolve({ data: [] });\n delete responseHash[key];\n });\n\n // now check to see if there are any more pending requests:\n if (this.staleRefreshPending.length > 0) {\n // process them:\n this.staleRefreshProcess();\n } else {\n // mark we are no longer processing stale requests.\n this.staleRefreshInProcess = false;\n }\n });\n }\n\n /**\n * @method findConnected\n * return the connected data associated with an instance of this model.\n *\n * to limit the result to only a single connected column:\n * model.findConnected( 'col1', {data})\n * then ((data) => {\n * // data = [{obj1}, {obj2}, ... {objN}]\n * })\n *\n * To find >1 connected field data:\n * model.findConnected( ['col1', 'col2'], {data} )\n * .then((data) =>{\n * \n * // data = {\n * // col1 : [{obj1}, {obj2}, ... {objN}],\n * // col2 : [{obj1}, {obj2}, ... {objN}]\n * // }\n * })\n *\n * To find all connected field data:\n * model.findConnected( {data} )\n * .then((data) =>{\n * \n * // data = {\n * // connectedColName1 : [{obj1}, {obj2}, ... {objN}],\n * // connectedColName2 : [{obj1}, {obj2}, ... {objN}],\n * // ...\n * // connectedColNameN : [{obj1}, {obj2}, ... {objN}]\n * // }\n * })\n\n * @param {string/array} fields [optional] an array of connected fields you want to return.\n * @param {obj} data the current object instance (data) to lookup\n * @return {Promise}\n */\n findConnected(fields, data) {\n if (typeof data == \"undefined\") {\n if (!Array.isArray(fields) && typeof fields == \"object\") {\n data = fields;\n fields = []; // return all fields\n }\n }\n\n if (typeof fields == \"string\") {\n fields = [fields]; // convert to an array of values\n }\n\n return new Promise((resolve, reject) => {\n // sanity checking:\n if (!data.id) {\n // I can't find any connected items, if I can't find this one:\n resolve(null);\n return;\n }\n\n let cond = {};\n cond[this.object.PK()] = data.id;\n this.findAll({ where: cond, populate: true })\n .then((results) => {\n if (\n !results.data ||\n !Array.isArray(results.data) ||\n results.data.length == 0\n ) {\n resolve([]); // no data to return.\n return;\n }\n\n // work with the first object.\n var myObj = results.data[0];\n\n // if only 1 field requested, then return that\n if (fields.length == 1) {\n let data =\n myObj[\n fields[0].replace(/[^a-z0-9.]/gi, \"\") + \"__relation\"\n ];\n if (!data) return resolve([]);\n\n if (!Array.isArray(data)) data = [data];\n\n resolve(data);\n return;\n }\n\n // if no fields requested, return them all:\n if (fields.length == 0) {\n var allFields = this.object.fields((f) => {\n return f.settings.linkType;\n });\n allFields.forEach((f) => {\n fields.push(f.columnName);\n });\n }\n\n var returnData = {};\n fields.forEach((colName) => {\n returnData[colName] =\n myObj[colName.replace(/[^a-z0-9.]/gi, \"\") + \"__relation\"];\n });\n\n resolve(returnData);\n })\n .catch((err) => {\n console.error(\"!!! error with findConnected() attempt:\", err);\n reject(err);\n });\n });\n }\n\n // /**\n // * @method loadInto\n // * loads the current values into the provided Webix DataTable\n // * @param {DataTable} DT A Webix component that can dynamically load data.\n // */\n // loadInto(DT) {\n\n // // if a limit was applied, then this component should be loading dynamically\n // if (this._limit) {\n\n // DT.define('datafetch', this._limit);\n // DT.define('datathrottle', 250); // 250ms???\n\n // // catch the event where data is requested:\n // // here we will do our own findAll() so we can persist\n // // the provided .where condition.\n\n // // oh yeah, and make sure to remove any existing event handler when we\n // // perform a new .loadInto()\n // DT.___AD = DT.___AD || {};\n // if (DT.___AD.onDataRequestEvent) {\n // DT.detachEvent(DT.___AD.onDataRequestEvent);\n // }\n // DT.___AD.onDataRequestEvent = DT.attachEvent(\"onDataRequest\", (start, count) => {\n\n // var cond = {\n // where: this._where,\n // sort: this._sort,\n // limit: count,\n // skip: start\n // }\n\n // if (DT.showProgress)\n // DT.showProgress({ type: \"icon\" });\n\n // this.findAll(cond)\n // .then((data) => {\n // data.data.forEach((item) => {\n // if (item.properties != null && item.properties.height != \"undefined\" && parseInt(item.properties.height) > 0) {\n // item.$height = parseInt(item.properties.height);\n // } else if (parseInt(this._where.height) > 0) {\n // item.$height = parseInt(this._where.height)\n // }\n // });\n // DT.parse(data);\n\n // if (DT.hideProgress)\n // DT.hideProgress();\n\n // })\n\n // return false; // <-- prevent the default \"onDataRequest\"\n // });\n\n // DT.refresh();\n // }\n\n // // else just load it all at once:\n // var cond = {};\n // if (this._where) cond.where = this._where;\n // if (this._sort) cond.sort = this._sort;\n // if (this._limit != null) cond.limit = this._limit;\n // if (this._skip != null) cond.skip = this._skip;\n\n // if (DT.showProgress)\n // DT.showProgress({ type: \"icon\" });\n\n // this.findAll(cond)\n // .then((data) => {\n // data.data.forEach((item) => {\n // if (item.properties != null && item.properties.height != \"undefined\" && parseInt(item.properties.height) > 0) {\n // item.$height = parseInt(item.properties.height);\n // } else if (parseInt(this._where.height) > 0) {\n // item.$height = parseInt(this._where.height)\n // }\n // });\n // DT.parse(data);\n\n // if (DT.hideProgress)\n // DT.hideProgress();\n\n // })\n // .catch((err) => {\n // console.error('!!!!!', err);\n // })\n\n // }\n\n // /**\n // * @method limit\n // * set the limit value for this set of data\n // * @param {integer} limit the number or elements to return in this call\n // * @return {ABModel} this object that is chainable.\n // */\n // limit(limit) {\n // this._limit = limit;\n // return this;\n // }\n\n // /**\n // * @method skip\n // * set the skip value for this set of data\n // * @param {integer} skip the number or elements to skip\n // * @return {ABModel} this object that is chainable.\n // */\n // skip(skip) {\n // this._skip = skip;\n // return this;\n // }\n\n // /**\n // * @method update\n // * update model values on the server.\n // */\n // update(id, values) {\n\n // this.prepareMultilingualData(values);\n\n // // remove empty properties\n // for (var key in values) {\n // if (values[key] == null)\n // delete values[key];\n // }\n\n // var params = {\n // url: this.object.urlRestItem(id),\n // params: values\n // }\n // return this.request('put', params)\n // .then((data) => {\n\n // // .data is an empty object ??\n\n // this.normalizeData(data);\n\n // return data;\n\n // // FIX: now with sockets, the triggers are fired from socket updates.\n // // trigger a update event\n // // triggerEvent('update', this.object, data);\n\n // })\n // .catch((err)=>{\n // console.error(err);\n // });\n\n // }\n\n /**\n * @method upsert\n * upsert model values on the server.\n */\n upsert(values) {\n this.prepareMultilingualData(values);\n\n // remove empty properties\n for (var key in values) {\n if (values[key] == null) delete values[key];\n }\n\n var params = {\n url: this.object.urlRest(),\n params: values,\n };\n return this.request(\"put\", params)\n .then((data) => {\n // .data is an empty object ??\n\n this.normalizeData(data);\n\n return data;\n\n // FIX: now with sockets, the triggers are fired from socket updates.\n // trigger a update event\n // triggerEvent('update', this.object, data);\n })\n .catch((err) => {\n console.error(err);\n });\n }\n\n /**\n * @method where\n * set the where condition for the data being loaded.\n * @param {json} cond the json condition statement.\n * @return {ABModel} this object that is chainable.\n */\n where(cond) {\n this._where = cond;\n return this;\n }\n\n /**\n * @method where\n * set the sort condition for the data being loaded.\n * @param {json} cond the json condition statement.\n * @return {ABModel} this object that is chainable.\n */\n sort(cond) {\n this._sort = cond;\n return this;\n }\n\n /**\n * @method refresh\n * refresh model definition on the server.\n */\n refresh() {\n console.error(\"!!! Depreciated: where is this being called from?\");\n return Promise.resolve();\n\n // var params = {\n // url: this.object.urlRestRefresh(),\n // };\n // return this.request(\"put\", params);\n }\n\n /**\n * @method isCsvPacked\n * check if the data is packed in a csv format\n * @param {json} data the json condition statement.\n * @return {boolean} true if the data is packed in a csv format\n * false if the data is not packed in a csv format\n */\n isCsvPacked(data) {\n if (data.csv_packed) {\n return true;\n }\n return false;\n }\n\n csvPackPrepareFirstRow(myObject, content) {\n const firstRow = content[0];\n\n // Note: CSV will refer to the columns at the first row in a list to generate CSV columns.\n // if the first row were missing somecolumns and the next rows has those columns.\n // they will lost those columns and values\n if (firstRow) {\n const columnNames = Object.keys(firstRow);\n for (const missingField of myObject.fields(\n (f) => columnNames.indexOf(f.columnName) === -1\n ))\n firstRow[missingField.columnName] = undefined;\n }\n }\n\n csvPackStringifyFields(myObject, content) {\n // stringify any potential json data\n // starting with List data\n let keys = [\"list\", \"json\"];\n let stringifyFields = myObject.fields((f) => keys.indexOf(f.key) > -1);\n stringifyFields.forEach((f) => {\n for (let I = 0; I < content.length; I++) {\n let row = content[I];\n if (row[f.columnName]) {\n row[f.columnName] = JSON.stringify(row[f.columnName]);\n }\n }\n });\n }\n\n csvPackMergeRelations(relations, id, connHash) {\n relations[id] = this.AB.defaultsDeep(relations[id] || {}, connHash);\n }\n\n csvPackGetRelations(myObject, content, visited = new Set()) {\n let relations = {\n /* objectID: { row.id: entryJSON} */\n };\n\n // Check for circular reference\n if (visited.has(myObject.id)) {\n console.warn(`Circular reference detected for object ${myObject.id}`);\n return relations;\n }\n visited.add(myObject.id);\n\n // break out and compact the connected data\n let connections = myObject.connectFields();\n connections.forEach((connField) => {\n let connHash = {};\n let relationName = connField.relationName();\n\n // gather all the connected data for this field\n for (let I = 0; I < content.length; I++) {\n let row = content[I];\n if (row[relationName]) {\n if (Array.isArray(row[relationName])) {\n row[relationName].forEach((r) => {\n let rval = connField.getRelationValue(r);\n if (rval != null && !connHash[rval]) {\n connHash[rval] = r;\n }\n });\n } else {\n let r = row[relationName];\n let rval = connField.getRelationValue(r);\n if (rval != null && !connHash[rval]) {\n connHash[rval] = r;\n }\n }\n }\n }\n\n let connObject = connField.datasourceLink;\n let values = Object.values(connHash);\n if (values.length > 0) {\n this.csvPackMergeRelations(relations, connObject.id, connHash);\n\n let connRelations = this.csvPackGetRelations(\n connObject,\n values,\n visited\n );\n\n // merge these into my relations\n Object.keys(connRelations).forEach((id) => {\n this.csvPackMergeRelations(relations, id, connRelations[id]);\n });\n }\n });\n visited.delete(myObject.id);\n return relations;\n }\n\n csvPackReIndexRelations(relations) {\n Object.keys(relations).forEach((id) => {\n Object.keys(relations[id]).forEach((cid, indx) => {\n relations[id][cid]._csvID = indx;\n });\n });\n }\n\n csvPackReEncodeRelations(relations, myObject, content) {\n let connections = myObject.connectFields();\n connections.forEach((connField) => {\n let relationName = connField.relationName();\n let connObject = connField.datasourceLink;\n let connHash = relations[connObject.id];\n\n // now reencode the connection data to reference the new _csvID\n for (let I = 0; I < content.length; I++) {\n let row = content[I];\n let ids = [];\n let hasRelationData = false;\n if (row[relationName]) {\n hasRelationData = true;\n if (Array.isArray(row[relationName])) {\n row[relationName].forEach((r) => {\n let rval = connField.getRelationValue(r);\n if (\n rval != null &&\n connHash[rval] &&\n connHash[rval]._csvID != null\n ) {\n ids.push(connHash[rval]._csvID);\n }\n });\n } else {\n let r = row[relationName];\n let rval = connField.getRelationValue(r);\n if (\n rval != null &&\n connHash[rval] &&\n connHash[rval]._csvID != null\n ) {\n ids.push(connHash[rval]._csvID);\n }\n }\n }\n // only make an update if it did have relation data\n if (hasRelationData) {\n row[connField.columnName] = JSON.stringify(ids);\n delete row[relationName];\n }\n }\n });\n }\n\n csvPackFinalModifications(myObject, content) {\n let connPK = myObject.PK();\n const isPKID = connPK === \"id\";\n content.forEach((c) => {\n if (!isPKID && c.id == c[connPK]) {\n delete c.id;\n }\n\n // if translations are present return them to an object\n if (c.translations && typeof c.translations != \"string\") {\n c.translations = JSON.stringify(c.translations);\n }\n });\n }\n\n /**\n * @method csvPack\n * pack the data into a csv format\n * @param {json} data\n * The original data format.\n * {\n * data: [{obj1}, {obj2}, ... {objN}],\n * total_bytes:xx,\n * }\n * @return {json} the csv packed data\n * {\n * csv_packed:{\n * data: \"\",\n * relations: {\n * {connectionID}: \"\",\n * {connectionID}: \"\",\n * ...\n * },\n * },\n * total_bytes:xx,\n * }\n */\n async csvPack(data, batchSize = 10000, jobID) {\n // data should be the original json data packet we want to send\n // {\n // data: [{obj1}, {obj2}, ... {objN}],\n // total_bytes:xx,\n // }\n // we want to convert this to:\n // {\n // csv_packed:{\n // data: \"csv data\",\n // relations: {\n // {connectionID}: \"csv data\", // each entry has entry._csvID, that is the lookup\n // {connectionID}: \"csv data\",\n // ...\n // }\n // total_bytes:xx,\n // }\n\n if (!data || typeof data !== \"object\") {\n throw new Error(\"csvPack: Invalid data parameter\");\n }\n if (data.data === undefined) {\n throw new Error(\"csvPack: data.data is required\");\n }\n\n let packedData = { data: \"\", relations: {} };\n let myObject = this.object;\n\n let content = data.data;\n if (!content || (Array.isArray(content) && content.length === 0)) {\n // Return the original data if there is no content to pack\n // existing code will handle this fine.\n return data;\n }\n this.csvPackPrepareFirstRow(myObject, content);\n\n let returnType = \"array\";\n if (!Array.isArray(content)) {\n returnType = \"single\";\n content = [content];\n }\n content = content.filter((row) => !this.AB.isNil(row));\n\n this.csvPackStringifyFields(myObject, content);\n\n let relations = this.csvPackGetRelations(myObject, content);\n // { objectID: { row.id: entryJSON}}\n\n this.csvPackReIndexRelations(relations);\n\n // now reencode the connection data to reference the new _csvID\n // do this for the main content\n this.csvPackReEncodeRelations(relations, myObject, content);\n this.csvPackFinalModifications(myObject, content);\n\n // do this for the relations as well\n let allIds = Object.keys(relations);\n for (let i = 0; i < allIds.length; i++) {\n let id = allIds[i];\n let relatedObj = this.AB.objectByID(id);\n if (relatedObj) {\n let values = Object.values(relations[id]);\n this.csvPackReEncodeRelations(relations, relatedObj, values);\n this.csvPackFinalModifications(relatedObj, values);\n packedData.relations[id] = await this.AB.jsonToCsvBatched(\n values,\n batchSize,\n jobID\n );\n }\n }\n\n // now convert the data to CSV\n packedData.data = await this.AB.jsonToCsvBatched(\n content,\n batchSize,\n jobID\n );\n packedData.type = returnType; // single or array\n\n let newData = {};\n Object.keys(data).forEach((key) => {\n if (key != \"data\") {\n newData[key] = data[key];\n }\n });\n newData.csv_packed = packedData;\n return newData;\n }\n\n csvUnpackUnstringifyFields(myObject, data) {\n let connPK = myObject.PK();\n let keyFields = [\"list\", \"boolean\", \"number\", \"json\"];\n let parseFields = myObject.fields((f) => keyFields.indexOf(f.key) > -1);\n data.forEach((row) => {\n // unstringify any list,bool,number fields\n parseFields.forEach((f) => {\n let val = row[f.columnName];\n if (val && typeof val == \"string\") {\n try {\n row[f.columnName] = JSON.parse(val);\n } catch (e) {\n // sometimes \"list\" fields are not JSON parseable\n if (f.key != \"list\") {\n console.error(\n \"Error parsing JSON data for column: \" + f.columnName,\n val,\n e\n );\n }\n }\n }\n });\n\n // if translations are present return them to an object\n if (row.translations) {\n try {\n row.translations = JSON.parse(row.translations);\n } catch (e) {\n // just leave it as it is\n }\n }\n\n // readd .id to the row\n if (!row.id) {\n if (row[connPK]) {\n row.id = row[connPK];\n }\n }\n });\n }\n\n csvUnpackReconnectRelations(relations, myObject, data) {\n let connections = myObject.connectFields();\n connections.forEach((connField) => {\n let relationName = connField.relationName();\n\n let relationObject = connField.datasourceLink;\n let connHash = relations[relationObject.id];\n if (connHash) {\n data.forEach((row) => {\n let ids = [];\n let populatedData = [];\n let entries = [];\n if (typeof row[connField.columnName] !== \"undefined\") {\n try {\n // ok, we know this is a possibility, so just skip it\n if (row[connField.columnName] !== \"\") {\n entries = JSON.parse(row[connField.columnName]);\n }\n } catch (e) {\n if (row[connField.columnName] == \"\") {\n // not a problem, just no data\n } else {\n // this might be a situation on the server where\n // row[columnName] has a value, but row[relationName] is empty.\n if (typeof row[relationName] == \"undefined\") {\n row[relationName] = null;\n }\n // console.error(\n // \"Error parsing JSON data for column: \" +\n // connField.columnName,\n // e\n // );\n }\n }\n if (!Array.isArray(entries)) {\n entries = [entries];\n }\n entries.forEach((id) => {\n if (id != null && connHash[id]) {\n let connEntry = connHash[id];\n ids.push(connField.getRelationValue(connEntry));\n // Alternatively, we could remove the row[columnName] and let\n // normalizeData() repopulate it.\n populatedData.push(connEntry);\n } else if (id != null) {\n console.warn(\n `Missing relation entry for _csvID: ${id}`\n );\n }\n });\n if (connField.linkType() == \"many\") {\n row[connField.columnName] = ids;\n row[connField.relationName()] = populatedData;\n } else {\n row[connField.columnName] = ids[0] ?? null;\n row[connField.relationName()] = populatedData[0] ?? null;\n }\n }\n });\n }\n });\n\n // final pass to clear up stringified relation data\n data.forEach((row) => {\n connections.forEach((connField) => {\n // many connections must be an array, not \"[]\"\n if (connField.linkType() == \"many\") {\n let val = row[connField.columnName];\n if (val && typeof val == \"string\") {\n row[connField.columnName] = JSON.parse(val);\n }\n }\n });\n });\n }\n\n csvUnpackClearCSVID(relations) {\n Object.keys(relations).forEach((id) => {\n Object.keys(relations[id]).forEach((cid) => {\n delete relations[id][cid]._csvID;\n });\n });\n }\n\n /**\n * @method csvUnpack\n * unpack the data from our csv format\n * @param {json} data\n * The csv packed data format.\n * @return {json} the unpacked data\n */\n csvUnpack(data) {\n // data should be a data packet returned from the server\n // {\n // csv_packed:{\n // data: \"csv data\",\n // relations: {\n // {connectionID}: \"csv data\", // each entry has entry._csvID, that is the lookup\n // {connectionID}: \"csv data\",\n // ...\n // }\n // total_bytes:xx,\n // }\n // we want to convert this to:\n // {\n // data: [{obj1}, {obj2}, ... {objN}],\n // total_bytes:xx,\n // }\n if (!data || !data.csv_packed) {\n throw new Error(\"csvUnpack: Invalid data format - csv_packed missing\");\n }\n if (typeof data.csv_packed.data !== \"string\") {\n throw new Error(\"csvUnpack: Invalid csv_packed.data format\");\n }\n\n let myObject = this.object;\n let parseResult = this.AB.csvToJson(data.csv_packed.data);\n // parseResult = { data: [], errors:[], meta:{}}\n\n let returnType = data.csv_packed.type;\n\n if (parseResult.errors?.length) {\n // ignore common error when .data is \"\"\n if (data.csv_packed.data !== \"\") {\n console.error(\"Error parsing CSV data:\", parseResult.errors);\n console.error(\"Original CSV data:\");\n console.error(data.csv_packed.data);\n console.error(\"result:\");\n console.error(parseResult.data);\n }\n }\n let jsonData = parseResult.data;\n\n let relations = {};\n Object.keys(data.csv_packed.relations).forEach((id) => {\n relations[id] = this.AB.csvToJson(data.csv_packed.relations[id]).data;\n });\n\n this.csvUnpackUnstringifyFields(myObject, jsonData);\n Object.keys(relations).forEach((id) => {\n let relatedObj = this.AB.objectByID(id);\n if (relatedObj) {\n this.csvUnpackUnstringifyFields(relatedObj, relations[id]);\n // to hash by _csvID\n let hash = {};\n relations[id].forEach((c) => {\n hash[c._csvID] = c;\n });\n relations[id] = hash;\n }\n });\n\n // now reconnect the data\n Object.keys(relations).forEach((id) => {\n let relatedObj = this.AB.objectByID(id);\n if (relatedObj) {\n let values = Object.values(relations[id]);\n this.csvUnpackReconnectRelations(relations, relatedObj, values);\n }\n });\n\n this.csvUnpackReconnectRelations(relations, myObject, jsonData);\n\n this.csvUnpackClearCSVID(relations);\n\n let returnData = {};\n Object.keys(data).forEach((key) => {\n if (key != \"csv_packed\") {\n returnData[key] = data[key];\n }\n });\n returnData.data = jsonData;\n\n if (returnType == \"single\" && Array.isArray(returnData.data)) {\n returnData.data = returnData.data[0];\n }\n return returnData;\n }\n\n normalizeData(data) {\n // convert to array\n if (!(data instanceof Array)) data = [data];\n\n // find all connected fields\n var connectedFields = this.object.connectFields();\n\n // if this object has some multilingual fields, translate the data:\n var mlFields = this.object.multilingualFields();\n\n // if this object has some date fields, convert the data to date object:\n var dateFields =\n this.object.fields(function (f) {\n return f.key == \"date\" || f.key == \"datetime\";\n }) || [];\n\n // calculate fields\n var calculatedFields = this.object.fields((f) => f.key == \"calculate\");\n\n data.forEach((d) => {\n if (d == null) return;\n\n // various PK name\n if (!d.id && this.object.PK() != \"id\") d.id = d[this.object.PK()];\n\n // loop through data's connected fields\n connectedFields.forEach((c) => {\n // get the relation name so we can change the original object\n var relationName = c.relationName();\n\n // if (d[c.columnName] == null)\n // d[c.columnName] = '';\n\n // Our client side tools need to know that this value is null if it\n // isn't provided:\n if (\n typeof d[relationName] == \"undefined\" &&\n typeof d[c.columnName] == \"undefined\"\n ) {\n d[relationName] = null;\n d[c.columnName] = null;\n return;\n }\n\n // if there is no data we can exit now\n if (d[relationName] == null) return;\n\n // if relation data is still a string and isn't empty\n if (\n typeof d[relationName] == \"string\" &&\n d[relationName].length > 0\n ) {\n // parse the string into an object\n d[relationName] = JSON.parse(d[relationName]);\n }\n\n // if the data is an array we need to loop through it\n if (Array.isArray(d[relationName])) {\n d[relationName].forEach((r) => {\n // if translations are present and they are still a string\n if (r.translations && typeof r.translations == \"string\") {\n // parse the string into an object\n r.translations = JSON.parse(r.translations);\n }\n });\n // if the data is not an array it is a single item...check that has translations and it is a string\n } else if (\n d[relationName].translations &&\n typeof d[relationName].translations == \"string\"\n ) {\n // if so parse the string into an object\n d[relationName].translations = JSON.parse(\n d[relationName].translations\n );\n }\n\n // set .id to relation columns\n let objectLink = c.datasourceLink;\n\n // if we didn't get the linked object, just return.\n if (!objectLink) return;\n\n let olPK = objectLink.PK();\n var relatedMlFields = objectLink.multilingualFields();\n\n if (Array.isArray(d[relationName])) {\n d[relationName].forEach((subData) => {\n // update .id values\n // if (olPK != \"id\" && subData[olPK]) subData.id = subData[olPK];\n const relationValue = c.getRelationValue(subData);\n if (olPK != \"id\") subData.id = relationValue;\n\n // perform Translation\n if (relatedMlFields.length) {\n objectLink.translate(subData, subData, relatedMlFields);\n }\n });\n } else {\n // update .id value\n // if (d[relationName][olPK]) {\n // d[relationName].id = d[relationName][olPK];\n // }\n const relationValue = c.getRelationValue(d[relationName]);\n if (relationValue) {\n d[relationName].id = relationValue;\n }\n\n // perform Translation\n if (relatedMlFields.length) {\n objectLink.translate(\n d[relationName],\n d[relationName],\n relatedMlFields\n );\n }\n }\n\n // if (\n // objectLink &&\n // olPK != \"id\" &&\n // d[relationName] &&\n // !d[relationName].id\n // ) {\n // // is array\n // if (d[relationName].forEach) {\n // d[relationName].forEach((subData) => {\n // if (subData[olPK]) subData.id = subData[olPK];\n // });\n // } else if (d[relationName][olPK]) {\n // d[relationName].id = d[relationName][olPK];\n // }\n // }\n\n // if (relatedMlFields.length) {\n // d[relationName];\n // objectLink.translate(\n // d[relationName],\n // d[relationName],\n // relatedMlFields\n // );\n // }\n\n // Change property name of connected field\n if (!d[c.columnName]) {\n if (c.linkType() == \"one\") {\n if (d[relationName]) {\n // d[c.columnName] = d[relationName][olPK];\n d[c.columnName] = c.getRelationValue(d[relationName]);\n } else {\n d[c.columnName] = null;\n }\n } else {\n if (d[relationName]) {\n if (Array.isArray(d[relationName])) {\n try {\n d[c.columnName] = (d[relationName] || []).map(\n // (i) => i[olPK]\n (i) => c.getRelationValue(i)\n );\n } catch (e) {\n console.log(\"+++++++++++++++\");\n console.log(`ID:[${c.id}]`);\n console.log(`ColumnName:[${c.label}]`);\n console.log(`relationName:[${relationName}]`);\n console.log(`linkType:[${c.linkType()}]`);\n console.log(\"data:\");\n console.log(JSON.stringify(d[relationName]));\n console.log(\"+++++++++++++++\");\n }\n } else {\n // this is strange: supposed to be \"many\" but coming in\n // as \"one\"\n console.log(\"+++++++++++++++\");\n console.log(`ID:[${c.id}]`);\n console.log(`ColumnName:[${c.label}]`);\n console.log(`relationName:[${relationName}]`);\n console.log(`linkType:[${c.linkType()}]`);\n console.log(\"data:\");\n console.log(JSON.stringify(d[relationName]));\n console.log(\"+++++++++++++++\");\n // d[c.columnName] = [d[relationName][olPK]];\n d[c.columnName] = [c.getRelationValue(d[relationName])];\n }\n } else {\n d[c.columnName] = [];\n }\n }\n }\n });\n\n if (mlFields.length) {\n this.object.translate(d, d, mlFields);\n }\n\n // convert the data to date object\n dateFields.forEach((date) => {\n if (d && d[date.columnName] != null) {\n // check to see if data has already been converted to a date object\n if (typeof d[date.columnName] == \"string\") {\n if (date.key == \"date\") {\n // if we are ignoring the time it means we ignore timezone as well\n // so lets trim that off when creating the date so it can be a simple date\n d[date.columnName] = this.AB.rules.toDate(\n d[date.columnName],\n {\n format: \"MM/DD/YYYY\",\n ignoreTime: true,\n }\n );\n } else {\n // Convert UTC to Date\n d[date.columnName] = this.AB.rules.toDate(\n d[date.columnName]\n );\n // d[date.columnName] = new Date(moment(d[date.columnName]));\n }\n }\n }\n });\n\n calculatedFields.forEach((calField) => {\n d[calField.columnName] = calField.format(d);\n });\n });\n }\n};\n","const ABObject = require(\"../platform/ABObject\");\nconst ABModelApi = require(\"../platform/ABModelApi\");\n\nmodule.exports = class ABObjectApiCore extends ABObject {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n this.isAPI = true;\n\n this.fromValues(attributes);\n }\n\n ///\n /// Instance Methods\n ///\n\n /// ABApplication data methods\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.readonly = parseInt(attributes.readonly) || 0;\n this.apiType = attributes.apiType || \"Read\";\n this.request = attributes.request ?? {};\n this.request.headers = attributes.request?.headers ?? [];\n this.response = attributes.response ?? {};\n this.response.fields = attributes.response?.fields ?? [];\n this.isFetched = attributes.isFetched ?? false;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABObjectQuery instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n const result = super.toObj();\n\n result.isAPI = this.isAPI;\n result.readonly = this.readonly;\n result.apiType = this.apiType;\n result.request = this.request ?? {};\n result.request.headers = this.request?.headers ?? [];\n result.response = this.response ?? {};\n result.response.fields = this.response?.fields ?? [];\n result.isFetched = this.isFetched;\n\n return result;\n }\n\n /**\n * @method model\n * return a Model object that will allow you to interact with the data for\n * this ABObjectQuery.\n */\n model() {\n var model = new ABModelApi(this);\n\n // default the context of this model's operations to this object\n model.contextKey(this.constructor.contextKey());\n model.contextValues({ id: this.id }); // the datacollection.id\n\n return model;\n }\n\n /**\n * @function getPagingValues()\n *\n * @return {Object} - {\n * start: \"Property name of the API for start index\",\n * limit: \"Property name of the API for limit return the item number\"\n * }\n */\n getPagingValues({ skip, limit }) {\n const result = {};\n const pagingSettings = this.request?.paging ?? {};\n\n if (pagingSettings.start && skip != null) {\n result[pagingSettings.start] = skip;\n }\n if (pagingSettings.limit && limit != null) {\n result[pagingSettings.limit] = limit;\n }\n\n return result;\n }\n\n dataFromKey(data) {\n let result = [];\n\n if (!Array.isArray(data)) data = [data];\n\n data.forEach((item) => {\n // Clone item\n let itemResult = { ...item };\n\n // Pull data from `Data key` of the API object\n // FORMAT: \"Property.Name.Value\"\n (this.response.dataKey ?? \"\").split(\".\").forEach((key) => {\n if (key == \"\" || key == null) return;\n itemResult = itemResult?.[key];\n });\n\n if (Array.isArray(itemResult)) {\n result = result.concat(itemResult);\n } else if (itemResult) {\n result.push(itemResult);\n }\n });\n\n return result;\n }\n\n get headers() {\n const headers = {};\n\n (this.request.headers ?? []).forEach((header) => {\n if (header?.value == null) return;\n\n headers[header.key] = header.value;\n });\n\n return headers;\n }\n};\n","const ABObjectApi = require(\"../platform/ABObjectApi\");\nconst ABModelApiNetsuite = require(\"../platform/ABModelApiNetsuite\");\n\nmodule.exports = class ABObjectApiNetsuiteCore extends ABObjectApi {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n this.isNetsuite = true;\n\n this.fromValues(attributes);\n }\n\n ///\n /// Instance Methods\n ///\n\n /// ABApplication data methods\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.credentials = attributes.credentials ?? {};\n this.columnRef = attributes.columnRef ?? {};\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABObjectQuery instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n const result = super.toObj();\n\n result.isNetsuite = true;\n result.credentials = this.credentials;\n result.columnRef = this.columnRef;\n\n return result;\n }\n\n /**\n * @method model\n * return a Model object that will allow you to interact with the data for\n * this ABObjectQuery.\n */\n model() {\n var model = new ABModelApiNetsuite(this);\n\n // default the context of this model's operations to this object\n model.contextKey(this.constructor.contextKey());\n model.contextValues({ id: this.id }); // the datacollection.id\n\n return model;\n }\n\n /**\n * @function getPagingValues()\n *\n * @return {Object} - {\n * start: \"Property name of the API for start index\",\n * limit: \"Property name of the API for limit return the item number\"\n * }\n */\n /*\n getPagingValues({ skip, limit }) {\n const result = {};\n const pagingSettings = this.request?.paging ?? {};\n\n if (pagingSettings.start && skip != null) {\n result[pagingSettings.start] = skip;\n }\n if (pagingSettings.limit && limit != null) {\n result[pagingSettings.limit] = limit;\n }\n\n return result;\n }\n\n dataFromKey(data) {\n let result = [];\n\n if (!Array.isArray(data)) data = [data];\n\n data.forEach((item) => {\n // Clone item\n let itemResult = { ...item };\n\n // Pull data from `Data key` of the API object\n // FORMAT: \"Property.Name.Value\"\n (this.response.dataKey ?? \"\").split(\".\").forEach((key) => {\n if (key == \"\" || key == null) return;\n itemResult = itemResult?.[key];\n });\n\n if (Array.isArray(itemResult)) {\n result = result.concat(itemResult);\n } else if (itemResult) {\n result.push(itemResult);\n }\n });\n\n return result;\n }\n\n get headers() {\n const headers = {};\n\n (this.request.headers ?? []).forEach((header) => {\n if (header?.value == null) return;\n\n headers[header.key] = header.value;\n });\n\n return headers;\n }\n\n */\n};\n","/**\n * ABObjectCore\n *\n * Manage the loading of specific ABObject data into useable objects\n * that can instantiate themselves and provide field and model resources.\n */\n\nvar ABModel = require(\"../platform/ABModel\");\nvar ABMLClass = require(\"../platform/ABMLClass\");\n\n/* eslint-disable-next-line no-undef */\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABObjectCore extends ABMLClass {\n constructor(attributes, AB) {\n super([\"label\"], AB);\n\n /*\n{\n\tid: uuid(),\n\tconnName: 'string', // Sails DB connection name: 'appdev_default', 'legacy_hris', etc. Default is 'appBuilder'.\n\tname: 'name',\n\tlabelFormat: 'xxxxx',\n\tlabelSettings: Object,\n\tisImported: 1/0,\n\tisExternal: 1/0,\n\ttableName:'string', // NOTE: store table name of import object to ignore async\n\tprimaryColumnName: 'string', // NOTE: store column name of PK\n\ttransColumnName: 'string', // NOTE: store column name of translations table\n\turlPath:'string',\n\timportFromObject: 'string', // JSON Schema style reference: '#[ABApplication.id]/objects/[ABObject.id]'\n\t\t\t\t\t\t\t\t// to get other object:\t ABApplication.objectFromRef(obj.importFromObject);\n\ttranslations:[\n\t\t{}\n\t],\n\tfields:[\n\t\t{ABDataField}\n ],\n indexes: [\n {ABIndex}\n ]\n}\n*/\n\n this.fromValues(attributes);\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n static contextKey() {\n return \"object\";\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n connName: 'string', // Sails DB connection name: 'appdev_default', 'legacy_hris', etc. Default is 'appBuilder'.\n name: 'name',\n labelFormat: 'xxxxx',\n labelSettings: Object,\n isImported: 1/0,\n isExternal: 1/0,\n tableName:'string', // NOTE: store table name of import object to ignore async\n primaryColumnName: 'string', // NOTE: store column name of PK\n transColumnName: 'string', // NOTE: store column name of translations table\n urlPath:'string',\n importFromObject: 'string', // JSON Schema style reference: '#[ABApplication.id]/objects/[ABObject.id]'\n // to get other object: ABApplication.objectFromRef(obj.importFromObject);\n translations:[\n {}\n ],\n fields:[\n {ABDataField}\n ],\n indexes: [\n {ABIndex}\n ]\n }\n */\n\n this.id = attributes.id;\n // {string} .id\n // the uuid of this ABObject Definition.\n\n this.type = attributes.type || \"object\";\n // {string} .type\n // the type of ABDefinition this is.\n\n this.connName = attributes.connName || undefined; // undefined == 'appBuilder'\n // {string} .connName\n // the sails.config.connections[connName] configuration reference.\n // if not set ({undefined}), then our default \"appBuilder\" config is used\n\n this.name = attributes.name || \"\";\n // {string} .name\n // A name reference for this ABObject. This is a reference that isn't\n // translateable and will be used for lookups across languages.\n\n this.labelFormat = attributes.labelFormat || \"\";\n // {string} .labelFormat\n // A string template for how to display an entry for this ABObject in\n // common UI elements like grids, lists, etc...\n\n this.labelSettings = attributes.labelSettings || {};\n // {Object} .labelSettings\n\n this.labelSettings.isNoLabelDisplay = parseInt(\n this.labelSettings.isNoLabelDisplay || 0\n );\n // {bool} .isNoLabelDisplay\n\n this.isImported = parseInt(attributes.isImported || 0);\n // {depreciated}\n // {bool} .isImported\n // previously used to mark ABObjects that were created in other\n // ABApplicaitons. No longer relevant with Global ABObjects\n\n this.isExternal = parseInt(attributes.isExternal || 0);\n // {bool} .isExternal\n // Marks this ABObject as referencing a pre-existing table in the DB that\n // we are treating as an ABObject.\n // These objects are not allowed to create/update/destroy the db table\n // nor can we add/remove fields.\n // However we are able to customize the Field definitions to change the\n // column names, hidden attributes, Object label, etc...\n // We can update our Defintion attributes, but not any actual DB changes.\n\n this.tableName = attributes.tableName || \"\"; // NOTE: store table name of import object to ignore async\n // {string} .tableName\n // the `{database}.{tableName}` of the db table that this ABObject's data\n // is stored in.\n // knex does not like .(dot) in table and column names\n // https://github.com/knex/knex/issues/2762\n this.tableName = this.tableName.replace(/[^a-zA-Z0-9_ ]/gi, \"\");\n\n this.primaryColumnName = attributes.primaryColumnName || \"\"; // NOTE: store column name of PK\n // {string} .primaryColumnName\n // is the col_name of which key is the primary key. By default it is\n // \"uuid\", but in some external objects this might be something else\n // (\"id\", \"ren_id\", etc...).\n\n this.transColumnName = attributes.transColumnName || \"\"; // NOTE: store column name of translations table\n // {string} .transColumnName\n // this is a workaround to include hris_ren_data and hris_ren_trans data\n\n this.urlPath = attributes.urlPath || \"\";\n\n // this.importFromObject = attributes.importFromObject || \"\";\n\n this.isSystemObject = attributes.isSystemObject;\n // {bool} .isSystemObject\n // We are now storing some of our System Required Data as ABObjects as well.\n // These Objects should not be allowed to be modified by typical AppBuilder\n // designer. However we can enable a mode for AB Designer to then expand these\n // ABObjects, and eventually we can use the AppBuilder to Create the AppBuilder.\n if (\n typeof this.isSystemObject == \"undefined\" ||\n this.isSystemObject == \"false\"\n ) {\n this.isSystemObject = false;\n }\n\n this.createdInAppID = attributes.createdInAppID;\n // {string} .createdInAppID\n // the .id of the ABApplication that originally created this ABObject.\n\n // if attributes.objectWorkspace DOES exist, make sure it is fully\n // populated.\n if (typeof attributes.objectWorkspace != \"undefined\") {\n if (typeof attributes.objectWorkspace.sortFields == \"undefined\")\n attributes.objectWorkspace.sortFields = [];\n if (typeof attributes.objectWorkspace.filterConditions == \"undefined\")\n attributes.objectWorkspace.filterConditions = [];\n if (typeof attributes.objectWorkspace.frozenColumnID == \"undefined\")\n attributes.objectWorkspace.frozenColumnID = \"\";\n if (typeof attributes.objectWorkspace.hiddenFields == \"undefined\")\n attributes.objectWorkspace.hiddenFields = [];\n }\n this.objectWorkspace = attributes.objectWorkspace || {\n sortFields: [], // array of columns with their sort configurations\n filterConditions: [], // array of filters to apply to the data table\n frozenColumnID: \"\", // id of column you want to stop freezing\n hiddenFields: [], // array of [ids] to add hidden:true to\n };\n // {obj} .objectWorkspace\n // When in the ABObject editor in the AppBuilder Designer, different\n // views of the information can be created. These views are stored here\n // and are avaiable to other users in the Designer.\n\n // pull in field definitions:\n var fields = [];\n this.fieldIDs = attributes.fieldIDs || [];\n // {array} [ ABField.id, ... ]\n // this is a collection of ALL the ABFields this object references.\n // This will include ABFields that were directly created for this object\n // and will include ABFields that were imported.\n\n this.importedFieldIDs = attributes.importedFieldIDs || [];\n // {array} [ ABField.id, ... ]\n // this is a collection of the ABFields in our .fieldIDs that were\n // IMPORTED.\n\n this._unknownFieldIDs = [];\n this.fieldIDs.forEach((id) => {\n if (!id) return;\n\n var def = this.AB.definitionByID(id);\n if (def) {\n fields.push(this.AB.fieldNew(def, this));\n } else {\n this._unknownFieldIDs.push(id);\n let err = new Error(\n `O[${this.name}] is referenceing an unknown field id[${id}]`\n );\n this.AB.notify.builder(err, {\n field: { id, object: { id: this.id, name: this.name } },\n });\n }\n });\n this._fields = fields;\n\n // pull in index definitions:\n this.importIndexes(attributes.indexIDs);\n\n // let the MLClass now process the translations:\n super.fromValues(attributes);\n }\n\n /**\n * @method importIndexes\n * instantiate a set of indexes from the given ids.\n * @param {array} indexIDs The different ABDefinition IDs for each index\n * [ \"uuid11\", \"uuid2\", ... \"uuidN\" ]\n */\n importIndexes(indexIDs) {\n this._unknownIndex = [];\n var indexes = [];\n (indexIDs || []).forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (def) {\n indexes.push(this.AB.indexNew(def, this));\n } else {\n this._unknownIndex.push(id);\n let err = new Error(\n `O[${this.name}] is referenceing an unknown index id[${id}]`\n );\n this.AB.notify.builder(err, {\n field: { id, object: { id: this.id, name: this.name } },\n });\n }\n });\n this._indexes = indexes;\n }\n\n /**\n * @method exportFields\n * convert our array of fields into a settings object for saving to disk.\n * @return {array}\n */\n // exportFields() {\n // var currFields = [];\n // this._fields.forEach((obj) => {\n // currFields.push(obj.toObj());\n // });\n // return currFields;\n // }\n\n // /**\n // * @method exportFields\n // * convert our array of fields into a settings object for saving to disk.\n // * @return {array}\n // */\n // exportIndexes() {\n // var currIndexes = [];\n // this._indexes.forEach((idx) => {\n // currIndexes.push(idx.toObj());\n // });\n // return currIndexes;\n // }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n // MLClass translation\n var obj = super.toObj();\n\n // track the field .ids of our fields\n var fieldIDs = this.fields().map((f) => f.id);\n (this._unknownFieldIDs || []).forEach((id) => {\n fieldIDs.push(id);\n });\n // NOTE: we keep the ._unknownFieldIDs so a developer/builder\n // can come back and track down what happened to the missing\n // ids.\n\n // track the index .ids of our indexes\n var indexIDs = this.indexes().map((f) => f.id);\n (this._unknownIndex || []).forEach((id) => {\n indexIDs.push(id);\n });\n\n return {\n id: this.id,\n type: this.type || \"object\",\n connName: this.connName,\n name: this.name,\n labelFormat: this.labelFormat,\n labelSettings: this.labelSettings || {},\n isImported: this.isImported,\n isExternal: this.isExternal,\n tableName: this.tableName,\n // NOTE: store table name of import object to ignore async\n primaryColumnName: this.primaryColumnName,\n // NOTE: store column name of PK\n transColumnName: this.transColumnName,\n // NOTE: store column name of translations table\n urlPath: this.urlPath,\n // importFromObject: this.importFromObject,\n objectWorkspace: this.objectWorkspace,\n isSystemObject: this.isSystemObject,\n\n translations: obj.translations,\n fieldIDs: fieldIDs,\n importedFieldIDs: this.importedFieldIDs,\n indexIDs: indexIDs,\n createdInAppID: this.createdInAppID,\n };\n }\n\n ///\n /// Objects\n ///\n\n /**\n * @method objectLinks()\n *\n * return an array of ABObject that's connected.\n *\n * @param {object} filter\n * @return {array} - An array of ABObject\n */\n objectLinks(/* filter */) {\n var connectFields = this.connectFields();\n\n return connectFields.map((f) => f.datasourceLink);\n }\n\n ///\n /// Fields\n ///\n\n /**\n * @method fields()\n * return an array of all the ABFields for this ABObject.\n * @param {fn} fn\n * a filter function that returns {true} if a value should\n * be included, or {false} otherwise.\n * @return {array[ABFieldxxx]}\n */\n fields(fn = () => true) {\n return this._fields.filter(fn);\n }\n\n /**\n * @method fieldByID()\n * return the object's field from the given {ABField.id}\n * @param {string} id\n * the uuid of the field to return.\n * @return {ABFieldxxx}\n */\n fieldByID(id) {\n return this.fields((f) => f?.id == id)[0];\n }\n\n /**\n * @method connectFields()\n *\n * return an array of the ABFieldConnect that is connect object fields.\n * @param {fn} fn\n * a filter function that returns {true} if a value should\n * be included, or {false} otherwise.\n * @return {array}\n */\n connectFields(fn = () => true) {\n return this.fields((f) => f && f.isConnection).filter(fn);\n }\n\n /**\n * @method fieldImport\n * register the given ABField.id as an imported field for this ABObject.\n * The ABField definition should be available before making this call.\n * After this call, the ABField is included in the ABObject, but the ABObject\n * has NOT been saved.\n * @param {ABField} fieldID The ABDefinition.id for a field that is imported\n * into this object.\n */\n fieldImport(id) {\n if (!id) return;\n\n if (this.importedFieldIDs.indexOf(id) == -1) {\n this.importedFieldIDs.push(id);\n }\n\n // just to be safe:\n var isThere = this._fields.find((f) => f.id == id);\n if (!isThere) {\n var def = this.AB.definitionByID(id);\n if (def) {\n this._fields.push(this.AB.fieldNew(def, this));\n } else {\n this._unknownFieldIDs = this._unknownFieldIDs || [];\n this._unknownFieldIDs.push(id);\n let err = new Error(\n `O[${this.name}] is importing an unknown field id[${id}]`\n );\n this.AB.notify.builder(err, {\n field: { id, object: { id: this.id, name: this.name } },\n });\n }\n }\n }\n\n /**\n * @method fieldNew()\n *\n * return an instance of a new (unsaved) ABField that is tied to this\n * ABObject.\n *\n * NOTE: this new field is not included in our this.fields until a .save()\n * is performed on the field.\n *\n * @return {ABField}\n */\n fieldNew(values) {\n return this.AB.fieldNew(values, this);\n }\n\n /**\n * @method fieldRemove()\n *\n * remove the given ABField from our ._fields array and persist the current\n * values.\n *\n * @param {ABField} field The instance of the field to remove.\n * @return {Promise}\n */\n fieldRemove(field) {\n var origLen = this._fields.length;\n this._fields = this.fields(function (o) {\n return o.id != field.id;\n });\n\n // be sure to remove this from our imported ids if it was\n // listed there.\n this.importedFieldIDs = this.importedFieldIDs.filter(\n (fid) => fid != field.id\n );\n\n if (this._fields.length < origLen) {\n return this.save();\n }\n\n // if we get here, then nothing changed so nothing to do.\n return Promise.resolve();\n }\n\n /**\n * @method fieldReorder()\n *\n * reorder the fields in our object\n *\n * @param {ABField} field The instance of the field to remove.\n * @return {Promise}\n */\n fieldReorder(sourceId, targetId) {\n // We know what was moved and what item it has replaced/pushed forward\n // so first we want to splice the item moved out of the array of fields\n // and store it so we can put it somewhere else\n let itemMoved = null;\n let oPos = 0; // original position\n for (var i = 0; i < this._fields.length; i++) {\n if (this._fields[i].columnName == sourceId) {\n itemMoved = this._fields[i];\n this._fields.splice(i, 1);\n oPos = i;\n break;\n }\n }\n // once we have removed/stored it we can find where its new position\n // will be by looping back through the array and finding the item it\n // is going to push forward\n for (var j = 0; j < this._fields.length; j++) {\n if (this._fields[j].columnName == targetId) {\n // if the original position was before the new position we will\n // follow webix's logic that the drop should go after the item\n // it was placed on\n if (oPos <= j) {\n j++;\n }\n this._fields.splice(j, 0, itemMoved);\n break;\n }\n }\n\n return this.save();\n }\n\n /**\n * @method fieldSave()\n *\n * save the given ABField in our ._fields array and persist the current\n * values.\n *\n * @param {ABField} field The instance of the field to save.\n * @return {Promise}\n */\n fieldSave(field) {\n var isIncluded = this.fieldByID(field.id);\n if (!isIncluded) {\n this._fields.push(field);\n return this.save();\n }\n\n return Promise.resolve();\n }\n\n /**\n * @method fieldAdd()\n *\n * save the given ABField in our ._fields array and persist the current\n * values if they changed.\n *\n * @param {ABField} field The instance of the field to save.\n * @return {Promise}\n */\n fieldAdd(field) {\n var isIncluded = this.fieldByID(field.id);\n if (!isIncluded) {\n // if not already included, then add and save the Obj definition:\n this._fields.push(field);\n return this.save();\n }\n\n // Nothing was required so return\n return Promise.resolve();\n }\n\n /**\n * @method imageFields()\n *\n * return an array of the ABFieldImage fields this object has.\n * @param {fn} fn\n * a filter function that returns {true} if a value should\n * be included, or {false} otherwise.\n * @return {array}\n */\n imageFields(fn = () => true) {\n return this.fields((f) => f && f.key == \"image\").filter(fn);\n }\n\n /**\n * @method multilingualFields()\n *\n * return an array of columnnames that are multilingual.\n *\n * @return {array}\n */\n multilingualFields() {\n return this.fields((f) => f && f.isMultilingual).map((f) => f.columnName);\n }\n\n /**\n * @method indexes()\n *\n * return an array of all the ABIndex for this ABObject.\n *\n * @param filter {Object}\n *\n * @return {array}\n */\n indexes(filter = () => true) {\n return this._indexes.filter(filter);\n }\n\n /**\n * @method indexByID()\n * return the object's index from the given {ABIndex.id}\n * @param {string} id\n * the id of the ABIndex to return.\n * @return {ABIndex}\n */\n indexByID(id) {\n return this.indexes((f) => f.id == id)[0];\n }\n\n /**\n * @method indexRemove()\n * remove the given ABIndex from our ._indexes array and persist the current\n * values.\n * @param {ABIndex} index\n * @return {Promise}\n */\n indexRemove(index) {\n var origLen = this._indexes.length;\n this._indexes = this.indexes(function (idx) {\n return idx.id != index.id;\n });\n\n // persist our changes if something changed.\n if (origLen != this._indexes.length) {\n return this.save();\n }\n\n // nothing was removed, so continue on.\n return Promise.resolve();\n }\n\n /**\n * @method indexSave()\n * save the given ABIndex in our ._indexes array and persist the current\n * values.\n * @param {ABIndex} index\n * @return {Promise}\n */\n indexSave(index) {\n var isIncluded = this.indexByID(index.id);\n if (!isIncluded) {\n this._indexes.push(index);\n return this.save();\n }\n\n return Promise.resolve();\n }\n\n ///\n /// Working with data from server\n ///\n\n /**\n * @method model\n * return a Model object that will allow you to interact with the data for\n * this ABObject.\n */\n model() {\n var model = new ABModel(this);\n\n // default the context of this model's operations to this object\n model.contextKey(ABObjectCore.contextKey());\n model.contextValues({ id: this.id });\n\n return model;\n }\n\n ///\n /// URL\n ///\n\n /**\n * @method urlRest\n * return the url to access the data for this object.\n * @return {string}\n */\n urlRest() {\n return `/app_builder/model/${this.id}`;\n }\n\n /**\n * @method urlRestBatch\n * return the url to use for batch creates for this object\n * @return {string}\n */\n urlRestBatch() {\n return `/app_builder/batch/model/${this.id}`;\n }\n\n /**\n * @method urlRestItem\n * return the url to access the data for an instance of this object.\n * @return {string}\n */\n urlRestItem(id) {\n return `/app_builder/model/${this.id}/${id}`;\n }\n\n /**\n * @method urlRestLog\n * return the url to access the logs for this ABObject.\n * @return {string}\n */\n urlRestLog() {\n return `/app_builder/object/${this.id}/track`;\n }\n\n /**\n * @method urlRestRefresh\n * return the url to signal a refresh for this object.\n * @return {string}\n */\n urlRestRefresh() {\n return `/app_builder/model/refreshobject/${this.id}`;\n }\n\n /**\n * @method urlCount\n * return the url to count of data for this object.\n * @return {string}\n */\n urlRestCount() {\n return `/app_builder/model/${this.id}/count`;\n }\n\n ///\n ///\tObject Workspace Settings\n ///\n get workspaceSortFields() {\n // new version\n if (this.workspaceViews) {\n let currView = this.workspaceViews.getCurrentView();\n if (currView) return currView.sortFields;\n else return null;\n }\n // old version\n else {\n return this.objectWorkspace.sortFields;\n }\n }\n\n set workspaceSortFields(fields) {\n // new version\n if (this.workspaceViews) {\n let currView = this.workspaceViews.getCurrentView();\n if (currView) currView.sortFields = fields;\n }\n // old version\n else {\n this.objectWorkspace.sortFields = fields;\n }\n }\n\n get workspaceFilterConditions() {\n // new version\n if (this.workspaceViews) {\n let currView = this.workspaceViews.getCurrentView();\n if (currView) return currView.filterConditions;\n else return null;\n }\n // old version\n else {\n return this.objectWorkspace.filterConditions;\n }\n }\n\n set workspaceFilterConditions(filterConditions) {\n // new version\n if (this.workspaceViews) {\n let currView = this.workspaceViews.getCurrentView();\n if (currView) currView.filterConditions = filterConditions;\n }\n // old version\n else {\n this.objectWorkspace.filterConditions = filterConditions;\n }\n }\n\n get workspaceFrozenColumnID() {\n return this.objectWorkspace.frozenColumnID;\n }\n\n set workspaceFrozenColumnID(id) {\n this.objectWorkspace.frozenColumnID = id;\n }\n\n get workspaceHiddenFields() {\n return this.objectWorkspace.hiddenFields || [];\n }\n\n set workspaceHiddenFields(fields) {\n this.objectWorkspace.hiddenFields = fields;\n }\n\n /**\n * @method isReadOnly\n *\n * @return {boolean}\n */\n get isReadOnly() {\n return this.isImported || this.isExternal || this.readonly;\n }\n\n /**\n * @method defaultValues\n * Collect a hash of key=>value pairs that represent the default values\n * from each of our fields.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @return {array}\n */\n defaultValues() {\n var values = {};\n this.fields().forEach((f) => {\n f.defaultValue(values);\n });\n\n return values;\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an array of any invalid\n * value errors.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @return {array}\n */\n isValidData(/* data */) {\n // NOTE: the platform needs to define a way to verify the data\n console.warn(\"Platform.ABObject.isValidData() missing\");\n return true;\n }\n\n /**\n * @method urlPointer()\n * return the url pointer that references this object. This url pointer\n * should be able to be used by this.application.urlResolve() to return\n * this object.\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlPointer(acrossApp) {\n console.error(\"Who is calling this?\");\n\n if (this.application == null) return null;\n\n return this.application.urlObject(acrossApp) + this.id;\n }\n\n /**\n * @method urlField\n * return a string pointer to this object's fields\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlField(acrossApp) {\n console.error(\"Who is calling this?\");\n\n return this.urlPointer(acrossApp) + \"/_fields/\";\n }\n\n /**\n * @method PK\n * return a string of the primary column name\n *\n * @return {string}\n */\n PK() {\n return this.primaryColumnName || \"uuid\";\n }\n\n remoteCreate(data) {\n console.log(\n \"object[\" + this.name + \"] received a remoteCreate() with data:\",\n data\n );\n }\n\n /**\n * @method clone\n * return a clone of ABObject\n *\n * @return {ABObjectBase}\n */\n clone() {\n // ignore properties who're spend much performance\n // NOTE: do not clone them. Just copy reference\n let ignoreProps = [\"application\", \"_fields\"];\n\n let cloneOne = JSON.parse(JSON.stringify(this));\n\n ignoreProps.forEach((prop) => {\n cloneOne[prop] = this[prop];\n });\n\n return cloneOne;\n }\n\n /**\n * @method minRelationData()\n * return an array of ABField.columnNames that make up\n * the minimum fields required to display this objects __RELATION\n * data in our UI widgets.\n */\n minRelationData() {\n var fields = [this.PK()];\n\n if (this.multilingualFields().length > 0) {\n fields.push(\"translations\");\n }\n\n var labelData = this.labelFormat || \"\";\n\n // get column ids in {colId} template\n // ['{colId1}', ..., '{colIdN}']\n var colIds = labelData.match(/\\{[^}]+\\}/g);\n\n if (colIds && colIds.forEach) {\n colIds.forEach((colId) => {\n var colIdNoBracket = colId.replace(\"{\", \"\").replace(\"}\", \"\");\n\n var field = this.fieldByID(colIdNoBracket);\n if (field == null) return;\n\n fields.push(field.columnName);\n });\n }\n // Default defining label\n else {\n const defaultFld = this.fields((f) => f.fieldUseAsLabel())[0];\n if (defaultFld) fields.push(defaultFld.columnName);\n }\n\n // System requires to include number field values\n // because they are used on Formula/Calculate fields on client side\n fields = fields.concat(\n this.fields((f) => f.key == \"number\").map((f) => f.columnName)\n );\n\n return fields;\n }\n\n // Display data with label format of object\n displayData(rowData) {\n if (rowData == null) return \"\";\n\n // translate multilingual\n //// TODO: isn't this a MLObject?? use this.translate()\n var mlFields = this.multilingualFields();\n this.translate(rowData, rowData, mlFields);\n\n var labelData = this.labelFormat || \"\";\n\n // default label\n if (!labelData && this.fields().length > 0) {\n var defaultField = this.fields((f) => f.fieldUseAsLabel())[0];\n if (defaultField) labelData = \"{\" + defaultField.id + \"}\";\n else {\n // if label is empty, then show .id\n if (!labelData.trim()) {\n let labelSettings = this.labelSettings || {};\n if (labelSettings && labelSettings.isNoLabelDisplay) {\n labelData = L(labelSettings.noLabelText || \"[No Label]\");\n } else {\n // show id of row\n labelData = `${\n this.AB.rules.isUUID(rowData.id) ? \"ID: \" : \"\"\n }${rowData.id}`;\n }\n }\n }\n }\n\n // get column ids in {colId} template\n // ['{colId1}', ..., '{colIdN}']\n var colIds = labelData.match(/\\{[^}]+\\}/g);\n\n // Using rawString to catch actual values we are pulling out.\n // the label data might have additional characters \"-\" and such that will\n // remain, and doing a .trim() on that wont catch that the label data\n // is actually empty.\n let rawString = \"\";\n if (colIds && colIds.forEach) {\n colIds.forEach((colId) => {\n var colIdNoBracket = colId.replace(\"{\", \"\").replace(\"}\", \"\");\n\n var field = this.fieldByID(colIdNoBracket);\n if (field == null) return;\n\n let valField = field.format(rowData) || \"\";\n labelData = labelData.replace(colId, valField);\n rawString = `${rawString}${valField}`;\n });\n }\n\n // if label is empty, then show .id\n if (!rawString.trim()) {\n let labelSettings = this.labelSettings || {};\n if (labelSettings && labelSettings.isNoLabelDisplay) {\n labelData = L(labelSettings.noLabelText || \"[No Label]\");\n } else {\n // show id of row\n labelData = `${this.AB.rules.isUUID(rowData.id) ? \"ID: \" : \"\"}${\n rowData.id\n }`;\n }\n }\n\n return labelData;\n }\n\n /**\n * @method whereCleanUp()\n * Parse through the current where condition and remove any null or\n * empty logical blocks.\n * @param {obj} curr\n * 1) The current where condition in ABQuery Format:\n * {\n * glue: [AND, OR],\n * rules: [ {rule} ]\n * }\n * or 2) The current {rule} to validate\n * {\n * key:{string},\n * rule:{string},\n * vlaue:{mixed}\n * }\n * @return {ABQuery.where} / { Rule }\n */\n whereCleanUp(curr) {\n if (curr) {\n if (curr.glue && curr.rules) {\n // SENTRY Error AB-APPBUILDER-4H\n // \"curr.rules.forEach is not a function\"\n // curr.rules is supposed to be an array. If we are not\n // getting that, then let's send an alert to figure out what\n // is happening here:\n if (!Array.isArray(curr.rules)) {\n // what is this entry?\n let err = new Error(\n `ABObjectCore.whereCleanUP(): Sentry Error: AB-APPBUILDER-4H: current rule is not properly formed: ${JSON.stringify(\n curr\n )}`\n );\n this.AB.notify.developer(err, { curr });\n }\n\n // this is a logical Block (AND, OR)\n // we need to filter the children\n let newValue = { glue: curr.glue, rules: [] };\n curr.rules.forEach((r) => {\n let cleanRule = this.whereCleanUp(r);\n // don't add values that didn't pass\n if (cleanRule) {\n newValue.rules.push(cleanRule);\n }\n });\n\n // if we have a non empty block, then return it:\n if (newValue.rules.length > 0) {\n return newValue;\n }\n\n // this isn't really a valid conditional, so null\n return null;\n }\n\n // This is a specific rule, that isn't null so:\n // if it isn't {}, then return it\n if (Object.keys(curr).length > 0) return curr;\n\n // otherwise we skip this as well\n return null;\n }\n return null;\n }\n};\n","//\n// ABObjectQuery\n//\n// A type of Object in our system that is based upon a complex relationship of multiple\n// existing Objects.\n//\n// In the QueryBuilder section of App Builder, a new Query Object can be created.\n// An initial Object can be chosen from our current list of Objects. After that, additional Objects\n// and a specified join type can be specified.\n//\n// A list of fields from each specified Object can also be included as the data to be returned.\n//\n// A where statement is also part of the definition.\n//\n\nvar ABObject = require(\"../platform/ABObject\");\nvar ABModelQuery = require(\"../platform/ABModelQuery\");\n\nmodule.exports = class ABObjectQueryCore extends ABObject {\n constructor(attributes, AB) {\n super(attributes, AB);\n /*\n{\n\tid: uuid(),\n\tname: 'name',\n\tlabelFormat: 'xxxxx',\n\tisImported: 1/0,\n\turlPath:'string',\n\timportFromObject: 'string', // JSON Schema style reference: '#[ABApplication.id]/objects/[ABObject.id]'\n\t\t\t\t\t\t\t\t// to get other object: ABApplication.objectFromRef(obj.importFromObject);\n\ttranslations:[\n\t\t{}\n\t],\n\n\n\n\t// ABOBjectQuery Specific Changes\n\t// we store a list of fields by their urls:\n\tfields:[\n\t\t{\n\t\t\talias: \"\",\n\t\t\tfieldURL:'#/url/to/field',\n\t\t}\n\t],\n\n\n\t// we store a list of joins:\n\tjoins:{\n\t\talias: \"\",\t\t\t\t\t\t\t// the alias name of table - use in SQL command\n\t\tobjectURL:\"#/...\",\t\t\t\t\t// the base object of the join\n\t\tlinks: [\n\t\t\t{\n\t\t\t\talias: \"\",\t\t\t\t\t\t\t// the alias name of table - use in SQL command\n\t\t\t\tfieldID: \"uuid\",\t\t\t\t\t// the connection field of the object we are joining with.\n\t\t\t\ttype:[left, right, inner, outer]\t// join type: these should match the names of the knex methods\n\t\t\t\t\t\t=> innerJoin, leftJoin, leftOuterJoin, rightJoin, rightOuterJoin, fullOuterJoin\n\t\t\t\tlinks: [\n\t\t\t\t\t...\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\n\t},\n\n\n\twhere: { QBWhere }\n}\n*/\n this.isQuery = true;\n // {bool}\n // a property to mark the difference between an ABObject and ABObjectQuery.\n\n this.__missingObject = this.__missingObject ?? [];\n // {array} fieldInfo\n // the field info that defined an object we can't find.\n\n this.__missingFields = this.__missingFields ?? [];\n // {array} [ { objID, fieldID }, ... ]\n // a list of field definitions that we are unable to resolve.\n\n this.__cantFilter = [];\n // {array} [ {field, fieldInfo}, ... ]\n // a list of field that were assigned but can't be used for filtering.\n\n this.__duplicateFields = [];\n // {array} [ {fieldInfo}, ... ]\n // a list of duplicate field definitions.\n\n this.__linkProblems = [];\n // {array} [ { message, data }, ...]\n // a list of warning messages related to link objects\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n /**\n * contextKey()\n * returns a unique key that represents a query in\n * our networking job resolutions.\n * @return {string}\n */\n static contextKey() {\n return \"query\";\n }\n\n ///\n /// Instance Methods\n ///\n\n /// ABApplication data methods\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.type = \"query\";\n\n // populate connection objects\n // this._objects = {};\n // this.obj2Alias = attributes.obj2Alias || {};\n\n this.alias2Obj = {}; // this gets built in the .importJoins()\n // { \"alias\" : object.id }\n // this is a lookup hash of a referenced alias to the Object it\n // references.\n\n this.objectIDs = [];\n // {array} of ABObject.id s that are referenced by this query.\n // this is how we limit our searches on objects.\n // this gets built in the .importJoins();\n\n this.viewName = attributes.viewName || \"\";\n // {string}\n // this is the SQL tablename of where our Query will store it's\n // view data.\n\n // import all our ABObjects\n this.importJoins(attributes.joins || {});\n\n // import fields after joins are imported\n this._fields = null;\n this.importFields(attributes.fields || []);\n // {array} [ { alias, field}, {},... ]\n // an array of field definition structures that mark what fields this\n // query is interested in pulling data from.\n // .alias : {string} matches the alias of the ABObject that the field\n // is from\n // .field : {ABFieldXXX} the link to the actual ABField instance\n\n // Import our Where condition\n this.where = attributes.where || {}; // .workspaceFilterConditions\n // Fix default where.glue value\n if (\n this.where &&\n !this.where.glue &&\n this.where.rules &&\n this.where.rules.length > 0\n )\n this.where.glue = \"and\";\n\n this._objectWorkspaceViews = attributes.objectWorkspaceViews || {};\n\n this.settings = this.settings || {};\n\n if (attributes && attributes.settings) {\n // convert from \"0\" => true/false\n this.settings.grouping = JSON.parse(\n attributes.settings.grouping || false\n );\n this.settings.hidePrefix = JSON.parse(\n attributes.settings.hidePrefix || false\n );\n }\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABObjectQuery instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n var result = super.toObj();\n\n result.viewName = this.viewName;\n\n result.joins = this.exportJoins();\n result.fields = this.exportFields();\n result.where = this.where; // .workspaceFilterConditions\n\n result.settings = this.settings;\n\n return result;\n }\n\n ///\n /// Fields\n ///\n\n /**\n * @method importFields\n * instantiate a set of fields from the given attributes.\n * Our attributes are a set of field URLs That should already be created in their respective\n * ABObjects.\n * @param {array} fieldSettings The different field urls for each field\n */\n importFields(fieldSettings) {\n var newFields = [];\n (fieldSettings || []).forEach((fieldInfo) => {\n if (fieldInfo == null) return;\n\n // pull object by alias name\n let object = this.objectByAlias(fieldInfo.alias);\n\n // Pull object from .AB\n if (!object && this.AB) {\n object = this.AB.objectByID(fieldInfo.objectID);\n\n // keep\n if (object) {\n this._objects = this._objects || {};\n this._objects[fieldInfo.alias] = object;\n }\n }\n\n if (!object) {\n this.__missingObject = this.__missingObject ?? [];\n this.__missingObject.push(fieldInfo);\n return;\n }\n\n let field = object.fieldByID(fieldInfo.fieldID);\n if (!field) {\n this.__missingFields = this.__missingFields ?? [];\n this.__missingFields.push({\n objID: object.id,\n fieldID: fieldInfo.fieldID,\n fieldInfo,\n });\n return;\n }\n\n if (!this.canFilterField(field)) {\n this.__cantFilter = this.__cantFilter ?? [];\n this.__cantFilter.push({ field, fieldInfo });\n }\n\n // check duplicate\n let isNew =\n newFields.filter(\n (f) =>\n f.alias == fieldInfo.alias && f.field.id == fieldInfo.fieldID\n ).length < 1;\n\n if (!isNew) {\n this.__duplicateFields = this.__duplicateFields ?? [];\n this.__duplicateFields.push({ fieldInfo });\n }\n\n // should be a field of base/join objects\n if (field && this.canFilterField(field) && isNew) {\n // add alias to field\n // create new instance of this field:\n var def = field.toObj();\n let clonedField = new field.constructor(def, field.object);\n\n clonedField.alias = fieldInfo.alias;\n\n let alias = fieldInfo.alias;\n if (Array.isArray(this.joins())) {\n // NOTE: query v1\n alias = field.object.name;\n }\n\n newFields.push({\n alias: alias,\n field: clonedField,\n });\n }\n });\n this._fields = newFields;\n }\n\n /**\n * @method exportFields\n * convert our array of fields into a settings object for saving to disk.\n * @return {array}\n */\n exportFields() {\n var currFields = [];\n this._fields.forEach((fieldInfo) => {\n currFields.push({\n alias: fieldInfo.alias,\n objectID: fieldInfo.field.object.id,\n fieldID: fieldInfo.field.id,\n });\n });\n\n // let's persist the faulty settings so a developer or builder can\n // review and fix it by hand.\n (this.__missingObject || []).forEach((f) => {\n currFields.push(f);\n });\n\n (this.__cantFilter || []).forEach((f) => {\n currFields.push(f.fieldInfo);\n });\n\n return currFields;\n }\n\n /**\n * @method fields()\n *\n * Support the ABObject api by returning a list of fields relevant\n * to this ABObjectQuery.\n *\n * @return {array}\n */\n fields(fn = () => true) {\n if (!fn) fn = () => true;\n return this._fields.map((f) => f.field).filter(fn);\n }\n\n ///\n /// Joins & Objects\n ///\n\n /**\n * @method joins()\n *\n * return an object of joins for this Query.\n *\n * @return {Object}\n */\n joins() {\n return this._joins || {};\n }\n\n /**\n * @method objects()\n *\n * return an array of all the relevant ABObjects for this Query.\n *\n * @return {array}\n */\n objects(fn = () => true) {\n // FOR proper expected operation, this fn must only return object\n // matches for which this ABQuery is managing objects:\n\n return this.AB.objects((o) => this.objectIDs.indexOf(o.id) > -1).filter(\n fn\n );\n }\n\n /**\n * @method objectAlias()\n *\n * return alias of of ABObjects.\n *\n * @return {string}\n */\n objectAlias(objectId) {\n let result = null;\n\n Object.keys(this.alias2Obj || {}).forEach((alias) => {\n if (!result && this.alias2Obj[alias] == objectId) {\n result = alias;\n }\n });\n\n return result;\n }\n\n /**\n * @method objectBase\n * return the origin object\n *\n * @return {ABObject}\n */\n objectBase() {\n if (!this._joins.objectID) return null;\n\n return this.AB.objectByID(this._joins.objectID) || null;\n }\n\n /**\n * @method objectByAlias()\n * return ABObject search by alias name\n *\n * @param {string} - alias name\n * @return {ABClassObject}\n */\n objectByAlias(alias) {\n var objID = this.alias2Obj[alias];\n if (objID) {\n return this.objects((o) => o.id == objID)[0];\n }\n return null;\n }\n\n /**\n * @method objectByID()\n * return ABObject search by ID\n * @param {string} objID\n * The requested {ABObject}.id of the object to return.\n * @return {ABObject} | null\n */\n objectByID(objID) {\n if (objID) {\n return this.objects((o) => o.id == objID)[0];\n }\n return null;\n }\n\n /**\n * @method links()\n *\n * return an array of links for this Query.\n *\n * @return {array}\n */\n links(filter = () => true) {\n return (this._links || []).filter(filter);\n }\n\n /**\n * @method importJoins\n * instantiate a set of joins from the given attributes.\n * Our joins contain a set of ABObject URLs that should already be created in our Application.\n * @param {Object} settings The different field urls for each field\n *\t\t\t\t\t{ }\n */\n importJoins(settings) {\n // copy join settings\n this._joins = this.AB.cloneDeep(settings);\n\n var uniqueObjectIDs = {};\n // { obj.id : obj.id }\n // a hash of object.ids for all the relevant ABObjects necessary for this\n // ABObjectQuery\n\n var newLinks = [];\n // {array} of link definitions\n // build the operating values for this._links\n\n let storeObject = (object, alias) => {\n if (!object) return;\n\n // var inThere = newObjects.filter(obj => obj.id == object.id && obj.alias == alias ).length > 0;\n // if (!inThere) {\n // newObjects[alias] = object;\n // this.obj2Alias[object.id] = alias;\n this.alias2Obj[alias] = object.id;\n uniqueObjectIDs[object.id] = object.id;\n // newObjects.push({\n // \talias: alias,\n // \tobject: object\n // });\n // }\n };\n\n let storeLinks = (links) => {\n (links || []).forEach((link) => {\n // var inThere = newLinks.filter(l => l.fieldID == link.fieldID).length > 0;\n // if (!inThere) {\n newLinks.push(link);\n // }\n });\n };\n\n this.__linkProblems = this.__linkProblems ?? [];\n\n let processJoin = (baseObject, joins) => {\n if (!baseObject) return;\n\n (joins || []).forEach((link) => {\n // Convert our saved settings:\n //\t{\n //\t\talias: \"\",\t\t\t\t\t\t\t// the alias name of table - use in SQL command\n //\t\tobjectID: \"uuid\",\t\t\t\t\t// id of the connection object\n //\t\tlinks: [\n //\t\t\t{\n //\t\t\t\talias: \"\",\t\t\t\t\t\t\t// the alias name of table - use in SQL command\n //\t\t\t\tfieldID: \"uuid\",\t\t\t\t\t// uhe connection field of the object we are joining with.\n //\t\t\t\ttype:[left, right, inner, outer]\t// join type: these should match the names of the knex methods\n //\t\t\t\t\t\t=> innerJoin, leftJoin, leftOuterJoin, rightJoin, rightOuterJoin, fullOuterJoin\n //\t\t\t\tlinks: [\n //\t\t\t\t\t...\n //\t\t\t\t]\n //\t\t\t}\n //\t\t]\n //\t},\n\n var linkField = baseObject.fieldByID(link.fieldID);\n if (!linkField) {\n this.__linkProblems.push({\n message: `could not resolve our linkField[${link.fieldID}]`,\n data: {\n link,\n },\n });\n return;\n }\n\n // track our linked object\n var linkObject = this.AB.objectByID(linkField.settings.linkObject);\n if (!linkObject) {\n this.__linkProblems.push({\n message: `could not resolve our linked field -> linkObject[${linkField.settings.linkObject}]`,\n data: {\n link,\n },\n });\n return;\n }\n\n storeObject(linkObject, link.alias);\n\n storeLinks(link.links);\n\n processJoin(linkObject, link.links);\n });\n };\n\n // if (!this._joins.objectURL)\n // \t// TODO: this is old query version\n // \treturn;\n\n // store the root object\n var rootObject = this.objectBase();\n if (!rootObject) {\n // this._objects = newObjects;\n this.__linkProblems.push({\n message: \"could not resolve our base object\",\n data: {\n objectID: this._joins?.objectID,\n },\n });\n return;\n }\n\n storeObject(rootObject, \"BASE_OBJECT\");\n\n storeLinks(settings.links);\n\n processJoin(rootObject, settings.links);\n\n // this._objects = newObjects;\n this._links = newLinks;\n this.objectIDs = Object.keys(uniqueObjectIDs);\n }\n\n /**\n * @method exportJoins\n * save our list of objects into our format for persisting on the server\n * @param {array} settings\n */\n exportJoins() {\n return this.AB.cloneDeep(this._joins || {});\n }\n\n ///\n /// Working with Client Components:\n ///\n\n /**\n * @method model\n * return a Model object that will allow you to interact with the data for\n * this ABObjectQuery.\n */\n model() {\n var model = new ABModelQuery(this);\n\n // default the context of this model's operations to this object\n model.contextKey(this.constructor.contextKey());\n model.contextValues({ id: this.id }); // the datacollection.id\n\n return model;\n }\n\n /**\n * @method canFilterObject\n * evaluate the provided object to see if it can directly be filtered by this\n * query.\n * @param {ABObject} object\n * @return {bool}\n */\n canFilterObject(object) {\n if (!object) return false;\n\n // I can filter this object if it is one of the objects in my joins\n return (\n this.objects((obj) => {\n return obj.id == object.id;\n }).length > 0\n );\n }\n\n /**\n * @method canFilterField\n * evaluate the provided field to see if it can be filtered by this\n * query.\n * @param {ABObject} object\n * @return {bool}\n */\n canFilterField(field) {\n if (!field) return false;\n\n // I can filter a field if it's object OR the object it links to can be filtered:\n let object = field.object;\n // Transition:\n // let linkedObject = this.objects(\n // (obj) => obj.id == field.settings.linkObject\n // )[0];\n var linkedObject = field.datasourceLink;\n\n return this.canFilterObject(object) || this.canFilterObject(linkedObject);\n }\n\n /**\n * @method urlPointer()\n * return the url pointer that references this object. This url pointer\n * should be able to be used by this.AB.urlResolve() to return\n * this object.\n *\n * @param {boolean} acrossApp - flag to include application id to url\n *\n * @return {string}\n */\n urlPointer(acrossApp) {\n console.error(\n \"ABQueryCore.urlPointer(): Depreciated: Where is this being called?\"\n );\n return this.application.urlQuery(acrossApp) + this.id;\n }\n\n /**\n * @method isGroup\n *\n * @return {boolean}\n */\n get isGroup() {\n return this.settings.grouping || false;\n }\n\n /**\n * @method isReadOnly\n *\n * @return {boolean}\n */\n get isReadOnly() {\n return true;\n }\n\n /**\n * @method isDisabled()\n * check this contains removed objects or fields\n *\n * @return {boolean}\n */\n isDisabled() {\n return this.disabled || false;\n }\n\n get workspaceFilterConditions() {\n let filterConditions = super.workspaceFilterConditions;\n if (\n filterConditions == null ||\n filterConditions.rules == null ||\n !filterConditions.rules.length\n ) {\n filterConditions = this.where;\n }\n\n return filterConditions;\n }\n};\n","// import ABApplication from \"./ABApplication\"\n\nvar ABMLClass = require(\"../platform/ABMLClass\");\nconst _concat = require(\"lodash/concat\");\n\nconst ABProcessTaskSubProcess = require(\"../platform/process/tasks/ABProcessTaskSubProcess\");\n\nmodule.exports = class ABProcessCore extends ABMLClass {\n constructor(attributes, AB) {\n super([\"label\"], AB);\n\n this.fromValues(attributes);\n\n // indicate we are ready.\n this.elements().forEach((e) => {\n e.onProcessReady();\n });\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n this.id = attributes.id;\n this.name = attributes.name || \"\";\n this.type = attributes.type || \"process\";\n this.xmlDefinition = attributes.xmlDefinition || null;\n\n // this.json = attributes.json || null;\n let currElements = this._elements || {};\n this._elements = {};\n (attributes.elementIDs || []).forEach((eID) => {\n var ele = this.AB.processElementNew(eID, this);\n if (ele) {\n this._elements[eID] = ele;\n } else {\n // current eID isn't one of our definitions yet, so might be\n // a temporary .diagramID from an unsaved task:\n if (currElements[eID]) {\n this._elements[eID] = currElements[eID];\n } else {\n this.emit(\n \"warning\",\n `P[${this.name}] is referencing an unknown process element id[${eID}]`,\n { process: this.id, eID }\n );\n }\n }\n });\n\n this._connections = attributes.connections || {};\n\n super.fromValues(attributes); // perform translation on this object.\n // NOTE: keep this at the end of .fromValues();\n\n if (!this.label) {\n this.label = this.name;\n }\n }\n\n /**\n * @method toObj()\n * properly compile the current state of this ABProcess instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n toObj() {\n // default label value\n if (!this.label) {\n this.label = this.name;\n }\n\n // OP.Multilingual.unTranslate(this, this, [\"label\"]);\n var data = super.toObj();\n\n var fieldsToSave = [\"id\", \"name\", \"xmlDefinition\"];\n fieldsToSave.forEach((f) => {\n data[f] = this[f];\n });\n\n data.elementIDs = [];\n for (var e in this._elements) {\n // NOTE: when a task is initially created, it doesn't have an .id\n // so we need to reference it by it's .diagramID\n data.elementIDs.push(\n this._elements[e].id ?? this._elements[e].diagramID\n );\n }\n\n data.connections = this._connections;\n\n // data.participantIDs = [];\n // for (var p in this._participants) {\n // data.participantIDs.push(this._participants[p].id);\n // }\n\n return data;\n }\n\n //\n // XML Model\n //\n\n /**\n * modelDefinition()\n * return the current xml definition for this process\n * @return {string}\n */\n modelDefinition() {\n return this.xmlDefinition;\n }\n\n /**\n * modelNew()\n * initialze our xml definition to a new state.\n * @return {string}\n */\n modelNew() {\n this.xmlDefinition = `\n\n \n \n \n \n \n \n \n \n \n \n`;\n\n //// TODO: create a default Start Task here??\n }\n\n /**\n * modelUpdate()\n * update our xml definition from the provided description.\n * @param {string} xml bpmn2 xml definition from our modeler.\n * @return {string}\n */\n modelUpdate(xml) {\n this.xmlDefinition = xml;\n }\n\n //\n // Diagram Elements\n //\n\n /**\n * connections()\n * return an array of connections that describe the relationships between\n * our process elements.\n * @param {fn} fn an iterator that returns true if the provided element\n * should be returned.\n * @return [{SimpleConnectionObj}]\n */\n connections(fn = () => true) {\n var allConnections = Object.keys(this._connections).map((e) => {\n return this._connections[e];\n });\n\n // If parent, merge connections\n if (this.process && this.key === \"SubProcess\") {\n allConnections = allConnections.concat(this.process.connections());\n }\n\n return allConnections.filter(fn);\n }\n\n /**\n * connectionForDiagramID()\n * return the connection for the given diagram id\n * @param {string} dID\n * the bpmn:Element diagram id\n */\n connectionForDiagramID(dID) {\n return this.connections((t) => {\n return t.id == dID;\n })[0];\n }\n\n /**\n * connectionsIncoming()\n * return the connections that are entering this Element\n * @param {string} dID\n * the bpmn:Element diagram id\n */\n connectionsIncoming(dID) {\n return this.connections((c) => {\n return c.to == dID;\n });\n }\n\n /**\n * connectionsOutgoing()\n * return the connections that are leaving this Element\n * @param {string} dID\n * the bpmn:Element diagram id\n */\n connectionsOutgoing(dID) {\n return this.connections((c) => {\n return c.from == dID;\n });\n }\n\n /**\n * connectionRemove()\n * remove the connection info for the given bpmn:element\n * @param {BMPNDiagramOBJ} element\n * the {element} returned from the BPMN.io modeling library event.\n */\n connectionRemove(element) {\n delete this._connections[element.id];\n }\n\n /**\n * connectionSimplyElement()\n * given a BPMN diagram element, return a simplified object that describes\n * the connection between two elements.\n * @param {BMPNDiagramOBJ} element\n * the {element} returned from the BPMN.io modeling library event.\n * @return {SimpleConnectionObj}\n * .id : {string} diagram id of the connection element\n * .type : {string} the type of connection\n * .from : {string} the diagram id of the source element\n * .to : {string} the diagram id of the dest element\n */\n connectionSimplyElement(element) {\n var bo = element.businessObject;\n var from = null;\n if (bo.sourceRef) {\n from = bo.sourceRef.id;\n }\n\n var to = null;\n if (bo.targetRef) {\n to = bo.targetRef.id;\n }\n\n var connection = {\n id: element.id,\n type: element.type,\n from: from,\n to: to,\n };\n return connection;\n }\n\n /**\n * connectionUpsert()\n * add or update the connection information for the given bpmn:element\n * @param {BMPNDiagramOBJ} element\n * the {element} returned from the BPMN.io modeling library event.\n */\n connectionUpsert(element) {\n var simpleConn = this.connectionSimplyElement(element);\n if (simpleConn.from && simpleConn.to && element.parent) {\n this._connections[simpleConn.id] = simpleConn;\n } else {\n // this connection is no longer connecting anything thing.\n // it is being removed.\n this.connectionRemove(element);\n }\n }\n\n /**\n * elements()\n * return an array of elements that match the given filter (or all elements\n * if no filter is provided).\n * @param {fn} fn an iterator that returns true if the provided element\n * should be returned.\n * @return {[ABProcessTask, ABProcessParticipant, etc...]}\n */\n elements(fn = () => true) {\n var allElements = Object.keys(this._elements).map((e) => {\n return this._elements[e];\n });\n return allElements.filter(fn);\n }\n\n /**\n * elementAdd()\n * insert an element to be tracked by this process.\n * @param {ABProcessElement} element\n * the full instance of an ABProcessElement to track.\n */\n elementAdd(element) {\n this._elements[element.id || element.diagramID] = element;\n }\n\n /**\n * elementByID()\n * return the {ABProcessElement} that has the given .id\n * @param {string} id\n * @return {ABProcess[OBJ]}\n */\n elementByID(id) {\n return this._elements[id] ?? null;\n }\n\n /**\n * elementForDiagramID()\n * return the object that is tied to the given xml diagram ID.\n * @param {string} dID the diagram ID\n * @return {ABProcess[OBJ]}\n */\n elementForDiagramID(dID) {\n return this.elements((t) => {\n return t.diagramID == dID;\n })[0];\n }\n\n /**\n * elementRemove()\n * remove an element from being tracked by this process.\n * @param {obj|ABProcessElement} def\n * a definition of, or full Object instance of the ABProcessElement\n * to remove.\n */\n elementRemove(def) {\n delete this._elements[def.id || def.diagramID];\n }\n\n /**\n * isTriggeredBy()\n * scan our tasks and see if we have a \"trigger\" task that responds to\n * the provided key.\n * @param {string} key the trigger key\n * @return {bool}\n */\n isTriggeredBy(key) {\n return this.taskForTriggerKey(key) != null;\n }\n\n /**\n * connectionNextTask()\n * return the ABProcessElement(s) that are after the given Element\n * (eg connects to) this element.\n * @param {ABProcessElement} currElement\n * @return {array}\n */\n connectionNextTask(currElement) {\n var elements = [];\n var nextConnections = this.connections((c) => {\n return c.from == currElement.diagramID;\n });\n nextConnections.forEach((c) => {\n var element = this.elements((e) => {\n return e.diagramID == c.to;\n })[0];\n if (element) {\n elements.push(element);\n }\n });\n return elements;\n }\n\n /**\n * connectionPreviousTask()\n * return the ABProcessElement(s) that was a previous Element\n * (eg connects to) this element.\n * @param {ABProcessElement} currElement\n * @return {array}\n */\n connectionPreviousTask(currElement) {\n var elements = [];\n var prevConnections = this.connections((c) => {\n return c.to == currElement.diagramID;\n });\n prevConnections.forEach((c) => {\n var element = this.elements((e) => {\n return e.diagramID == c.from;\n })[0];\n if (element) {\n elements.push(element);\n }\n });\n return elements;\n }\n\n /**\n * processData()\n * return an array of avaiable ABObjects that are represented\n * by the data previous ProcessElements are working with.\n * @param {ABProcessElement} currElement\n * the ABProcessElement that is requesting the data.\n * @return {array} | null\n */\n processData(currElement, params) {\n // var tasksToAsk = this.connectionPreviousTask(currElement);\n // var values = queryPreviousTasks(tasksToAsk, \"processData\", params, this);\n // return values.length > 0\n // ? values.length > 1\n // ? values\n // : values[0]\n // : null;\n\n var tasksToAsk = this.allPreviousTasks(currElement);\n var values = queryPreviousTasks(tasksToAsk, \"processData\", params, this);\n return values.length > 0\n ? values.length > 1\n ? values\n : values[0]\n : null;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can request from other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @param {ABProcessElement} currElement\n * the ABProcessElement that is requesting the data.\n * @return {array} | null\n */\n processDataFields(currElement) {\n var tasksToAsk = this.allPreviousTasks(currElement);\n // var tasksToAsk = this.connectionPreviousTask(currElement);\n var fields = queryPreviousTasks(\n tasksToAsk,\n \"processDataFields\",\n null,\n this\n );\n // Include data from the main process as well\n if (this.key === \"SubProcess\") {\n const parentFields = this.process.processDataFields(this);\n if (parentFields) {\n fields.push(...parentFields);\n }\n }\n return fields.length > 0 ? fields : null;\n }\n\n /**\n * allPreviousConnections()\n * walk through the current graph and return all the previous connections\n * leading up to the given {ProcessElement}\n * @param {Connection} conn\n * @param {hash} hashConn\n * { connection.id : connection }\n * @return {array}\n */\n allPreviousConnectionsForConnection(conn, hashConn) {\n var prevConnections = this.connections((c) => {\n return c.to == conn.from;\n });\n\n prevConnections.forEach((c) => {\n if (!hashConn[c.id]) {\n hashConn[c.id] = c;\n this.allPreviousConnectionsForConnection(c, hashConn);\n }\n });\n }\n allPreviousConnectionsForElement(currElement) {\n var prevConnections = this.connections((c) => {\n return c.to == currElement.diagramID;\n });\n var hashConn = {\n /* connection.id : connection */\n };\n // hashConn will contains the final collection of connections.\n\n prevConnections.forEach((c) => {\n hashConn[c.id] = c;\n this.allPreviousConnectionsForConnection(c, hashConn);\n });\n\n // TODO: detect circle backs and remove connections that\n // resolve back to currElement\n\n // convert our hash into an array\n return Object.keys(hashConn).map((k) => hashConn[k]);\n }\n\n allPreviousTasks(currElement) {\n var prevTasks = {}; /* task.id : task */\n var allPreviousConnections =\n this.allPreviousConnectionsForElement(currElement);\n var task;\n allPreviousConnections.forEach((conn) => {\n // each conn has a .to and a .from => grab both tasks\n task = this.elementForDiagramID(conn.to);\n if (task) prevTasks[task.id] = task;\n\n task = this.elementForDiagramID(conn.from);\n if (task) prevTasks[task.id] = task;\n });\n\n var tasksToAsk = Object.keys(prevTasks)\n .map((k) => prevTasks[k])\n .filter((t) => t.id != currElement.id);\n\n return tasksToAsk;\n }\n\n /**\n * processDataObjects()\n * return an array of avaiable ABObjects that are represented\n * by the data previous ProcessElements are working with.\n * @param {ABProcessElement} currElement\n * the ABProcessElement that is requesting the data.\n * @return {array} | null\n */\n processDataObjects(currElement) {\n var tasksToAsk = this.connectionPreviousTask(currElement);\n var fields = queryPreviousTasks(\n tasksToAsk,\n \"processDataObjects\",\n null,\n this\n );\n return fields.length > 0 ? fields : null;\n }\n\n /**\n * taskForTriggerKey()\n * return one or more tasks that respond to the given trigger key\n * @param {string} key a trigger key\n * @return {[ABProcessTask,...]}\n */\n taskForTriggerKey(key) {\n var trigger = this.elements((t) => {\n return t.triggerKey == key;\n })[0];\n if (trigger) {\n return trigger;\n } else {\n return null;\n }\n }\n\n //\n // Participants\n //\n\n // /**\n // * participants()\n // * return an array of participants that match the given filter (or all tasks\n // * if no filter is provided).\n // * @param {fn} fn an iterator that returns true if the provided participants\n // * should be returned.\n // * @return {[ABProcessParticipant,...]}\n // */\n // participants(fn) {\n // if (!fn)\n // fn = () => {\n // return true;\n // };\n // var all = Object.keys(this._participants).map((p) => {\n // return this._participants[p];\n // });\n // return all.filter(fn);\n // }\n\n // /**\n // * participantsForDiagramID()\n // * return the participant(s) that are tied to the given xml diagram ID.\n // * @param {string} dID the diagram ID\n // * @return {[ABProcessParticipant,...]}\n // */\n // participantsForDiagramID(dID) {\n // return this.participants((p) => {\n // return p.diagramID == dID;\n // });\n // }\n};\n\nvar queryPreviousTasks = (\n list,\n method,\n param,\n process,\n responses,\n processedIDs\n) => {\n // recursive fn() to step through our graph and compile\n // results.\n if (typeof responses == \"undefined\") {\n responses = [];\n }\n if (typeof processedIDs == \"undefined\") {\n processedIDs = [];\n }\n if (list.length == 0) {\n return responses;\n } else {\n // get next task\n const task = list.shift();\n\n // if we haven't already done task:\n if (processedIDs.indexOf(task.diagramID) == -1) {\n // mark this task as having been processed\n processedIDs.push(task.diagramID);\n\n let value = null;\n\n // get any field's it provides\n if (!(task instanceof ABProcessTaskSubProcess))\n value = task[method].apply(task, param);\n\n // value = task[method].apply(task, param);\n\n if (value == null) value = [];\n responses = _concat(responses, value);\n\n // add any previous tasks to our list\n list = _concat(list, process.connectionPreviousTask(task));\n }\n\n // process next Task\n return queryPreviousTasks(\n list,\n method,\n param,\n process,\n responses,\n processedIDs\n );\n }\n};\n","// import ABApplication from \"./ABApplication\"\n\nvar ABMLClass = require(\"../platform/ABMLClass\");\nconst _concat = require(\"lodash/concat\");\n\nmodule.exports = class ABStepCore extends ABMLClass {\n constructor(attributes, AB) {\n super([\"name\", \"text\"], AB);\n\n this.fromValues(attributes);\n\n // indicate we are ready.\n // this.elements().forEach((e) => {\n // e.onProcessReady();\n // });\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n this.id = attributes.id;\n this.name = attributes.name || \"New Step\";\n this.type = attributes.type || \"step\";\n this.text = attributes.text || \"\";\n this.settings = attributes.settings || {};\n this.settings.event = attributes?.settings?.event || \"click\";\n this.settings.el = attributes?.settings?.el || \"\";\n // this.xmlDefinition = attributes.xmlDefinition || null;\n\n super.fromValues(attributes); // perform translation on this object.\n // NOTE: keep this at the end of .fromValues();\n\n if (!this.label) {\n this.label = this.name;\n }\n }\n\n /**\n * @method toObj()\n * properly compile the current state of this ABProcess instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n toObj() {\n // debugger;\n // default label value\n if (!this.label) {\n this.label = this.name;\n }\n\n // OP.Multilingual.unTranslate(this, this, [\"label\"]);\n var data = super.toObj();\n\n var fieldsToSave = [\"id\", \"name\", \"settings\", \"type\"];\n fieldsToSave.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n\n // /**\n // * steps()\n // * return an array of steps that match the given filter (or all steps\n // * if no filter is provided).\n // * @param {fn} fn an iterator that returns true if the provided element\n // * should be returned.\n // * @return {[ABStep]}\n // */\n // steps(fn = () => true) {\n // var allSteps = Object.keys(this._steps).map((e) => {\n // return this._steps[e];\n // });\n // return allSteps.filter(fn);\n // }\n\n // /**\n // * stepAdd()\n // * insert a step to be added to this hint.\n // * @param {ABStep} element\n // * the full instance of an ABStep to track.\n // */\n // stepAdd(step) {\n // this._steps[step.id] = step;\n // }\n\n // /**\n // * stepByID()\n // * return the {ABStep} that has the given .id\n // * @param {string} id\n // * @return {ABStep[OBJ]}\n // */\n // stepByID(id) {\n // return this._step[id] ?? null;\n // }\n\n // /**\n // * stepRemove()\n // * remove a step from being displayed by this hint.\n // * @param {obj|ABStep} def\n // * a definition of, or full Object instance of the ABStep\n // * to remove.\n // */\n // stepRemove(def) {\n // delete this._steps[def.id];\n // }\n};\n","/*\n * ABViewManager\n *\n * An interface for managing the different ABViews available in our AppBuilder.\n *\n */\n\nvar AllViews = [\n require(\"../platform/views/ABView\"),\n require(\"../platform/views/ABViewCarousel\"),\n require(\"../platform/views/ABViewChart\"),\n require(\"../platform/views/ABViewChartArea\"),\n require(\"../platform/views/ABViewChartBar\"),\n require(\"../platform/views/ABViewChartLine\"),\n require(\"../platform/views/ABViewChartPie\"),\n require(\"../platform/views/ABViewComment\"),\n require(\"../platform/views/ABViewConditionalContainer\"),\n require(\"../platform/views/ABViewConnectDataFilter\"),\n require(\"../platform/views/ABViewContainer\"),\n require(\"../platform/views/ABViewCSVExporter\"),\n require(\"../platform/views/ABViewCSVImporter\"),\n require(\"../platform/views/ABViewDataFilter\"),\n require(\"../platform/views/ABViewDataSelect\"),\n require(\"../platform/views/ABViewDataview\"),\n require(\"../platform/views/ABViewDocxBuilder\"),\n require(\"../platform/views/ABViewGrid\"),\n require(\"../platform/views/ABViewImage\"),\n require(\"../platform/views/ABViewLabel\"),\n require(\"../platform/views/ABViewLayout\"),\n require(\"../platform/views/ABViewList\"),\n require(\"../platform/views/ABViewMenu\"),\n require(\"../platform/views/ABViewPage\"),\n require(\"../platform/views/ABViewPDFImporter\"),\n require(\"../platform/views/ABViewPivot\"),\n require(\"../platform/views/ABViewTab\"),\n require(\"../platform/views/ABViewText\"),\n\n //\n // Special Editors\n //\n require(\"../platform/views/ABViewGantt\"),\n require(\"../platform/views/ABViewKanban\"),\n require(\"../platform/views/ABViewReportsManager\"),\n require(\"../platform/views/ABViewScheduler\"),\n\n //\n // Detail Components\n //\n require(\"../platform/views/ABViewDetail\"),\n require(\"../platform/views/ABViewDetailCheckbox\"),\n require(\"../platform/views/ABViewDetailConnect\"),\n require(\"../platform/views/ABViewDetailCustom\"),\n require(\"../platform/views/ABViewDetailImage\"),\n // require(\"../platform/views/ABViewDetailSelectivity\"),\n require(\"../platform/views/ABViewDetailText\"),\n require(\"../platform/views/ABViewDetailTree\"),\n\n //\n // Form Components\n //\n require(\"../platform/views/ABViewForm\"),\n require(\"../platform/views/ABViewFormButton\"),\n require(\"../platform/views/ABViewFormCheckbox\"),\n require(\"../platform/views/ABViewFormConnect\"),\n require(\"../platform/views/ABViewFormCustom\"),\n require(\"../platform/views/ABViewFormDatepicker\"),\n require(\"../platform/views/ABViewFormJson\"),\n require(\"../platform/views/ABViewFormNumber\"),\n require(\"../platform/views/ABViewFormReadonly\"),\n require(\"../platform/views/ABViewFormSelectMultiple\"),\n require(\"../platform/views/ABViewFormSelectSingle\"),\n require(\"../platform/views/ABViewFormTextbox\"),\n require(\"../platform/views/ABViewFormTree\"),\n require(\"../platform/views/ABViewFormURL\"),\n];\n\n/*\n * Views\n * A name => ABView hash of the different ABViews available.\n */\nvar Views = {};\nAllViews.forEach((v) => {\n if (v.default?.common) {\n v = v.default;\n }\n Views[v.common().key] = v;\n});\n\nmodule.exports = class ABViewManagerCore {\n /**\n * @function allViews\n * return all the currently defined ABViews in an array.\n * @return [{ABView},...]\n */\n static allViews(fn = () => true) {\n var views = [];\n for (var v in Views) {\n var V = Views[v];\n if (fn(V)) {\n views.push(V);\n }\n }\n return views;\n }\n\n /**\n * @function newView\n * return an instance of an ABView based upon the values.key value.\n * @return {ABView}\n */\n static newView(values, application, parent) {\n parent = parent || null;\n\n if (values.key == \"detailselectivity\") {\n values.key = \"detailconnect\";\n }\n\n //\t\tif ((values.key) && (Views[values.key])) {\n if (values.key) {\n if (!Views[values.key]) {\n if (!isPlugin(values.key)) {\n console.error(\n \"!! View[\" +\n values.key +\n \"] not yet defined. Have an ABView instead:\"\n );\n }\n return new Views[\"view\"](values, application, parent);\n }\n\n return new Views[values.key](values, application, parent);\n } else {\n var err = new Error(`Unknown view key [${values.key}]`);\n console.error(err); // show the stack.\n console.error({\n error: err,\n values: values,\n application: application,\n });\n return null;\n }\n }\n\n static viewClass(key) {\n if (Views[key]) {\n return Views[key];\n }\n console.error(`Unknown View Key[${key}]`);\n return;\n }\n\n static addViewClass(View) {\n Views[View.common().key] = View;\n }\n};\n\n/**\n * Check if the key starts with plugin_\n */\nfunction isPlugin(key) {\n return key.split(\"_\")[0] === \"plugin\";\n}\n","/*\n * ABViewManagerMobile\n *\n * An interface for managing the different ABViews available in our AppBuilder.\n *\n */\n\n/*\n * Views\n * A name => ABView hash of the different ABViews available.\n */\nvar Views = {};\n[\n require(\"../platform/mobile/ABMobilePage\"),\n require(\"../platform/mobile/ABMobileView\"),\n require(\"../platform/mobile/ABMobileViewCustom\"),\n require(\"../platform/mobile/ABMobileViewForm\"),\n require(\"../platform/mobile/ABMobileViewFormButton\"),\n require(\"../platform/mobile/ABMobileViewFormCheckbox\"),\n require(\"../platform/mobile/ABMobileViewFormConnect\"),\n require(\"../platform/mobile/ABMobileViewFormDate\"),\n require(\"../platform/mobile/ABMobileViewFormDatetime\"),\n require(\"../platform/mobile/ABMobileViewFormEmail\"),\n require(\"../platform/mobile/ABMobileViewFormFile\"),\n require(\"../platform/mobile/ABMobileViewFormFormula\"),\n require(\"../platform/mobile/ABMobileViewFormImage\"),\n require(\"../platform/mobile/ABMobileViewFormNumber\"),\n require(\"../platform/mobile/ABMobileViewFormReadonly\"),\n require(\"../platform/mobile/ABMobileViewFormSelectMultiple\"),\n require(\"../platform/mobile/ABMobileViewFormSelectSingle\"),\n require(\"../platform/mobile/ABMobileViewFormTextbox\"),\n require(\"../platform/mobile/ABMobileViewLabel\"),\n require(\"../platform/mobile/ABMobileViewList\"),\n require(\"../platform/mobile/ABMobileViewTimeline\"),\n].forEach((v) => {\n if (v.default?.common) {\n v = v.default;\n }\n Views[v.common().key] = v;\n});\n\nmodule.exports = class ABViewManagerCore {\n /**\n * @function allViews\n * return all the currently defined ABViews in an array.\n * @return [{ABView},...]\n */\n static allViews(fn = () => true) {\n var views = [];\n for (var v in Views) {\n var V = Views[v];\n if (fn(V)) {\n views.push(V);\n }\n }\n return views;\n }\n\n /**\n * @function newView\n * return an instance of an ABView based upon the values.key value.\n * @return {ABView}\n */\n static newView(values, application, parent) {\n parent = parent || null;\n\n if (values.key == \"detailselectivity\") {\n values.key = \"detailconnect\";\n }\n\n //\t\tif ((values.key) && (Views[values.key])) {\n if (values.key) {\n if (!Views[values.key]) {\n console.error(\n \"!! View[\" +\n values.key +\n \"] not yet defined. Have an ABView instead:\"\n );\n return new Views[\"mobile-view\"](values, application, parent);\n }\n\n return new Views[values.key](values, application, parent);\n } else {\n var err = new Error(`Unknown view key [${values.key}]`);\n console.error(err); // show the stack.\n console.error({\n error: err,\n values: values,\n application: application,\n });\n return null;\n }\n }\n\n static viewClass(key) {\n if (Views[key]) {\n return Views[key];\n }\n console.error(`Unknown View Key[${key}]`);\n return;\n }\n};\n","const ABComponent = require(\"../platform/ABComponent\");\n// const ABObjectQuery = require(\"../platform/ABObjectQuery\");\n\n/**\n * support get data from objects and queries\n */\nfunction getFieldVal(rowData, field) {\n if (!field) return null;\n if (!field.columnName) return null;\n const columnName = field.columnName;\n\n let value = null;\n\n if (columnName.indexOf(\".\") > -1) {\n let colName = columnName.split(\".\")[1];\n value = rowData[columnName] || rowData[colName];\n } else {\n value = rowData[columnName];\n }\n\n // pull relation data\n if (value == null && field.relationName) {\n const relationName = field.relationName();\n const pureRelationName = relationName.split(\".\")[1]; // support [BASE_OBJECT.columnName] field name of ABQuery\n value = rowData[relationName] || rowData[pureRelationName];\n }\n\n if (value != null && !isNaN(value)) {\n return value;\n }\n\n // otherwise, this might be a process check where the rowData keys have\n // '[diagramID].[field.id]'\n for (const k in rowData) {\n const key = k.split(\".\")[1];\n if (key && key == field.id) {\n value = rowData[k];\n }\n }\n\n if (\n (value == null || (typeof value == \"number\" && isNaN(value))) &&\n field.format\n )\n value = field.format(rowData);\n\n return value;\n}\n\nfunction getConnectFieldValue(rowData, field) {\n let connectedVal = \"\";\n\n const extractVal = (itemData) => {\n let val;\n const relationName = field.relationName();\n if (itemData[relationName]) {\n val =\n (field.indexField\n ? itemData[relationName][field.indexField.columnName]\n : null) ?? // custom index\n (field.indexField2\n ? itemData[relationName][field.indexField2.columnName]\n : null) ?? // custom index 2\n itemData[relationName].id ??\n itemData[relationName];\n } else {\n let fieldVal = getFieldVal(itemData, field);\n if (fieldVal != null) {\n val = fieldVal;\n }\n }\n return val;\n };\n\n if (Array.isArray(rowData)) {\n connectedVal = rowData.map((data) => extractVal(data));\n } else if (rowData) {\n connectedVal = extractVal(rowData);\n }\n return connectedVal;\n}\n\nmodule.exports = class FilterComplexCore extends ABComponent {\n constructor(idBase, AB) {\n idBase = idBase || \"ab_filter_complex\";\n\n if (typeof AB === \"undefined\") {\n console.error(\"FilterComplexCore(): being called without an AB!\");\n }\n\n super(null, idBase, AB);\n\n this.Account = { username: \"??\", email: \"??\" };\n this._settings = {};\n this.condition = {};\n // const batchName; // we need to revert to this default when switching away from a in/by query field\n\n this._QueryFields = [];\n this._Fields;\n\n // internal business logic\n const _logic = (this._logic = {\n callbacks: {\n onChange: () => {},\n },\n\n removeHtmlTags: function (text) {\n let result = \"\";\n try {\n let div = document.createElement(\"div\");\n div.innerHTML = text;\n\n result = div.textContent || div.innerText || \"\";\n } catch (err) {\n result = (text || \"\").replace(/(<([^>]+)>)/gi, \"\");\n }\n\n return result;\n },\n });\n\n // Interface methods for parent component:\n // this.objectLoad = _logic.objectLoad;\n // this.viewLoad = _logic.viewLoad;\n // this.setValue = _logic.setValue;\n // this.isValid = _logic.isValid;\n }\n\n init(options = {}) {\n this._settings = options;\n }\n\n /**\n * @method isValid\n * validate the row data is valid filter condition\n *\n * @param rowData {Object} - data row\n * @param condition {Object} - [Optional] {\n * glue: \"and\" | \"or\",\n * rules: []\n * }\n */\n isValid(rowData, condition = this.condition) {\n // If conditions but no data return false\n if (condition?.rules?.length && rowData == null) return false;\n\n // If no conditions, then return true\n if (!condition?.rules?.length || rowData == null) return true;\n\n let result = condition.glue === \"and\" ? true : false;\n\n condition.rules.forEach((filter) => {\n // Nested filters\n if (filter?.rules?.length) {\n if (condition.glue === \"or\")\n result = result || this.isValid(rowData, filter);\n else result = result && this.isValid(rowData, filter);\n return;\n }\n // Skip incomplete filter condition\n else if (!filter || !filter.key || !filter.rule) return;\n\n const fieldInfo = (this._Fields || []).filter(\n (f) => f.id == filter.key || f.columnName == filter.key\n )[0];\n\n if (!fieldInfo) return;\n\n let condResult = null;\n\n // Filters that have \"this_object\" don't have a fieldInfo.key, so in that case,\n // define a special .key == \"this_object\"\n let ruleFieldType = fieldInfo.key;\n\n if (typeof fieldInfo.key == \"undefined\") {\n if (fieldInfo.id != \"this_object\") {\n fieldInfo.key = \"connectField\"; // if you are looking at the parent object it won't have a key to analyze\n ruleFieldType = fieldInfo.key;\n } else ruleFieldType = \"this_object\";\n }\n\n let value = null;\n\n if (fieldInfo.relationName) {\n value = getConnectFieldValue(rowData, fieldInfo);\n } else {\n value = getFieldVal(rowData, fieldInfo);\n }\n\n switch (ruleFieldType) {\n case \"string\":\n case \"LongText\":\n case \"email\":\n if (value == null) value = \"\";\n\n condResult = this.textValid(value, filter.rule, filter.value);\n break;\n case \"date\":\n case \"datetime\":\n condResult = this.dateValid(value, filter.rule, filter.value);\n break;\n case \"number\":\n case \"calculate\":\n case \"formula\":\n condResult = this.numberValid(value, filter.rule, filter.value);\n break;\n case \"list\":\n condResult = this.listValid(value, filter.rule, filter.value);\n break;\n case \"boolean\":\n condResult = this.booleanValid(value, filter.rule, filter.value);\n break;\n case \"user\":\n condResult = this.userValid(value, filter.rule, filter.value);\n break;\n case \"connectField\":\n case \"connectObject\":\n condResult = this.connectFieldValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"this_object\":\n condResult = this.thisObjectValid(\n rowData,\n filter.rule,\n filter.value\n );\n break;\n }\n\n if (condition.glue === \"and\") {\n result = result && condResult;\n } else {\n result = result || condResult;\n }\n });\n\n return result;\n }\n\n textValid(value, rule, compareValue) {\n let result = false;\n\n value = value.trim().toLowerCase();\n value = this._logic.removeHtmlTags(value); // remove html tags - rich text editor\n\n compareValue = compareValue.trim().toLowerCase().replace(/ +/g, \" \");\n\n // support \"john smith\" => \"john\" OR/AND \"smith\"\n const compareArray = compareValue.split(\" \");\n\n switch (rule) {\n case \"contains\":\n compareArray.forEach((val) => {\n if (result == false)\n // OR\n result = value.indexOf(val) > -1;\n });\n break;\n case \"not_contains\":\n result = true;\n compareArray.forEach((val) => {\n if (result == true)\n // AND\n result = value.indexOf(val) < 0;\n });\n break;\n case \"equals\":\n compareArray.forEach((val) => {\n if (result == false)\n // OR\n result = value == val;\n });\n break;\n case \"not_equal\":\n result = true;\n compareArray.forEach((val) => {\n if (result == true)\n // AND\n result = value != val;\n });\n break;\n case \"is_empty\":\n result = value == \"\" || value == null;\n break;\n case \"is_not_empty\":\n result = value != \"\" && value != null;\n break;\n default:\n result = this.queryFieldValid(value, rule, compareValue);\n break;\n }\n\n return result;\n }\n\n dateValid(value, rule, compareValue) {\n let result = false;\n\n if (value && !(value instanceof Date)) value = new Date(value);\n\n if (compareValue && !(compareValue instanceof Date))\n compareValue = new Date(compareValue);\n switch (rule) {\n case \"less\":\n result = value < compareValue;\n break;\n case \"greater\":\n result = value > compareValue;\n break;\n case \"less_or_equal\":\n result = value <= compareValue;\n break;\n case \"greater_or_equal\":\n result = value >= compareValue;\n break;\n case \"less_current\":\n result = value.setHours?.(0, 0, 0, 0) < (new Date()).setHours(0, 0, 0, 0);\n break;\n case \"greater_current\":\n result = value.setHours?.(0, 0, 0, 0) > (new Date()).setHours(0, 0, 0, 0);\n break;\n case \"less_or_equal_current\":\n result = value.setHours?.(0, 0, 0, 0) <= (new Date()).setHours(0, 0, 0, 0);\n break;\n case \"greater_or_equal_current\":\n result = value.setHours?.(0, 0, 0, 0) >= (new Date()).setHours(0, 0, 0, 0);\n break\n case \"is_current_date\":\n result =\n value.setHours?.(0, 0, 0, 0) == compareValue.setHours(0, 0, 0, 0);\n break;\n case \"is_null\":\n case \"is_empty\":\n result = !value;\n break;\n case \"is_not_null\":\n case \"is_not_empty\":\n result = !!value;\n break;\n default:\n result = this.queryFieldValid(value, rule, compareValue);\n break;\n }\n return result;\n }\n\n numberValid(value, rule, compareValue) {\n let result = false;\n\n value = Number(value);\n compareValue = Number(compareValue);\n\n switch (rule) {\n case \"equal\":\n case \"equals\":\n result = value == compareValue;\n break;\n case \"not_equal\":\n result = value != compareValue;\n break;\n case \"less\":\n result = value < compareValue;\n break;\n case \"greater\":\n result = value > compareValue;\n break;\n case \"less_or_equal\":\n result = value <= compareValue;\n break;\n case \"greater_or_equal\":\n result = value >= compareValue;\n break;\n default:\n result = this.queryFieldValid(value, rule, compareValue);\n break;\n }\n\n return result;\n }\n\n listValid(value, rule, compareValue) {\n let result = false;\n\n // compareValue = compareValue.toLowerCase();\n\n if (!Array.isArray(compareValue)) compareValue = [compareValue];\n\n switch (rule) {\n case \"equals\":\n if (value) result = compareValue.indexOf(value) > -1;\n break;\n case \"not_equal\":\n if (value) result = compareValue.indexOf(value) < 0;\n else result = true;\n break;\n default:\n result = this.queryFieldValid(value, rule, compareValue);\n break;\n }\n\n return result;\n }\n\n booleanValid(value, rule, compareValue) {\n let result = false;\n\n switch (rule) {\n case \"checked\":\n result = value == true || value > 0 || value == \"true\";\n break;\n case \"unchecked\":\n result =\n value == false ||\n value <= 0 ||\n value == \"false\" ||\n value == null;\n break;\n default:\n result = this.queryFieldValid(value, rule, compareValue);\n break;\n }\n\n return result;\n }\n\n emailValid(value, rule, compareValue) {\n let result = false;\n\n switch (rule) {\n case \"is_current_email\":\n result = value == compareValue;\n break;\n case \"is_not_current_email\":\n result = value != compareValue;\n break;\n }\n\n return result;\n }\n\n userValid(value, rule, compareValue) {\n if (!value || !value?.length) return false;\n let result = false;\n\n if (!Array.isArray(value)) value = [value];\n\n /* eslint-disable no-fallthrough */\n switch (rule) {\n case \"is_current_user\":\n result =\n value.filter((v) => (v?.username || v) == this.Account.username)\n .length > 0;\n break;\n case \"is_not_current_user\":\n result =\n value.filter((v) => (v?.username || v) != this.Account.username)\n .length > 0;\n break;\n case \"contain_current_user\":\n compareValue = this.Account.username;\n // break; <-- NO BREAK HERE: fall through to \"equals\"\n\n case \"equals\":\n result =\n value.filter((v) => (v?.username || v) == compareValue).length >\n 0;\n break;\n case \"not_contain_current_user\":\n compareValue = this.Account.username;\n // break; <-- NO BREAK HERE: fall through to \"not_equals\"\n\n case \"not_equal\":\n result =\n value.filter((v) => (v?.username || v) == compareValue).length <\n 1;\n break;\n default:\n result = this.queryFieldValid(value, rule, compareValue);\n break;\n }\n /* eslint-enable no-fallthrough */\n\n return result;\n }\n\n queryFieldValid(rowData, rule, compareValue) {\n let result = false;\n\n if (!compareValue) return result;\n\n // queryId:fieldId\n const queryId = compareValue.split(\":\")[0],\n fieldId = compareValue.split(\":\")[1];\n\n // if no query\n const query = this.AB.queries((q) => q.id == queryId)[0];\n if (!query) return result;\n\n // if no field\n const field = query.fields((f) => f.id == fieldId)[0];\n if (!field) return result;\n\n let qIdBase = \"{idBase}-query-field-{id}\"\n .replace(\"{idBase}\", this.idBase)\n .replace(\"{id}\", query.id),\n inQueryFieldFilter = new this.constructor(qIdBase, this.AB);\n inQueryFieldFilter.Account = this.Account;\n inQueryFieldFilter.fieldsLoad(query.fields());\n inQueryFieldFilter.setValue(query.workspaceFilterConditions);\n\n switch (rule) {\n case \"in_query_field\":\n result = inQueryFieldFilter.isValid(rowData);\n break;\n case \"not_in_query_field\":\n result = !inQueryFieldFilter.isValid(rowData);\n break;\n }\n\n return result;\n }\n\n inQueryValid(rowData, rule, compareValue) {\n let result = false;\n\n if (!compareValue || !this.AB) return result;\n\n // if no query\n let query = this.AB.queries((q) => q.id == compareValue)[0];\n if (!query) return result;\n\n let qIdBase = \"{idBase}-query-{id}\"\n .replace(\"{idBase}\", this.idBase)\n .replace(\"{id}\", query.id),\n inQueryFilter = new this.constructor(qIdBase, this.AB);\n inQueryFilter.Account = this.Account;\n inQueryFilter.fieldsLoad(query.fields());\n inQueryFilter.setValue(query.workspaceFilterConditions);\n\n switch (rule) {\n case \"in_query\":\n result = inQueryFilter.isValid(rowData);\n break;\n case \"not_in_query\":\n result = !inQueryFilter.isValid(rowData);\n break;\n }\n\n return result;\n }\n\n dataCollectionValid(value, rule, compareValue) {\n let result = false;\n\n if (!compareValue) return result;\n\n let dc = this.AB.datacollections((d) => d.id == compareValue)[0];\n\n switch (rule) {\n case \"in_data_collection\":\n if (!dc) return false;\n\n result = dc.getData((d) => d.id == value.id).length > 0;\n break;\n case \"not_in_data_collection\":\n if (!dc) return true;\n\n result = dc.getData((d) => d.id == value.id).length < 1;\n break;\n }\n\n return result;\n }\n\n connectFieldValid(rowData, field, rule, compareValue) {\n let relationName = field.relationName();\n\n let connectedVal = \"\";\n\n let linkType = field.linkType();\n\n if (rowData) {\n if (rowData[relationName]) {\n if (linkType == \"many\") {\n // lets get an array of connected ids => stringified()\n connectedVal = JSON.stringify(\n getConnectFieldValue(rowData, field).map((i) => i.id || i)\n );\n } else {\n // connectedVal = (\n // (field.indexField\n // ? rowData[relationName][field.indexField.columnName]\n // : null) ?? // custom index\n // (field.indexField2\n // ? rowData[relationName][field.indexField2.columnName]\n // : null) ?? // custom index 2\n // rowData[relationName].id ??\n // rowData[relationName]\n // )\n connectedVal = getConnectFieldValue(rowData, field)\n .toString()\n .toLowerCase();\n }\n } else {\n let fieldVal = getFieldVal(rowData, field);\n if (fieldVal != null) {\n connectedVal = fieldVal;\n }\n }\n }\n\n // If value will be the connected object, then pull value (string)\n if (typeof connectedVal == \"object\") {\n connectedVal =\n (field.indexField\n ? connectedVal[field.indexField.columnName]\n : null) ??\n (field.indexField2\n ? connectedVal[field.indexField2.columnName]\n : null) ??\n connectedVal[field.columnName] ??\n connectedVal.id ??\n connectedVal;\n }\n\n // Compare value isn't always a string?\n // https://appdev-designs.sentry.io/issues/5056850389/\n let compareValueLowercase =\n typeof compareValue === \"string\"\n ? compareValue.toLowerCase?.()\n : compareValue;\n\n // NOTE: if linkType == many, and rule is equals/not_equal,\n // these will be interpreted as \"contains/not_contains\"\n let ruleSafe = rule;\n if (linkType == \"many\") {\n switch (rule) {\n case \"equals\":\n ruleSafe = \"contains\";\n break;\n case \"not_equal\":\n ruleSafe = \"not_contains\";\n break;\n }\n }\n\n switch (ruleSafe) {\n case \"contains\":\n return connectedVal.toString().indexOf(compareValueLowercase) > -1;\n case \"not_contains\":\n return connectedVal.toString().indexOf(compareValueLowercase) == -1;\n case \"equals\":\n return connectedVal == compareValueLowercase;\n case \"not_equal\":\n return connectedVal != compareValueLowercase;\n case \"in_query\":\n case \"not_in_query\":\n return this.inQueryValid(rowData[relationName], rule, compareValue);\n case \"is_current_user\":\n case \"is_not_current_user\":\n case \"contain_current_user\":\n case \"not_contain_current_user\":\n return this.userValid(connectedVal, rule, compareValue);\n case \"is_empty\":\n return (\n rowData[relationName] == null ||\n rowData[relationName].length < 1 ||\n rowData[relationName] == \"\"\n );\n case \"is_not_empty\":\n return (\n rowData[relationName] != null &&\n ((Array.isArray(rowData[relationName]) &&\n rowData[relationName].length > 0) ||\n rowData[relationName] != \"\")\n );\n case \"in_data_collection\":\n case \"not_in_data_collection\":\n return this.dataCollectionValid(connectedVal, rule, compareValue);\n }\n }\n\n thisObjectValid(rowData, rule, compareValue) {\n let result = false;\n let query = null;\n let listThisObjects = null;\n let alias = null;\n let newRowData = null;\n\n switch (rule) {\n // if in_query condition\n case \"in_query\":\n case \"not_in_query\":\n if (!this._Object) return result;\n\n // if > 1 copy of this object in query ==> Error!\n query = this.AB.queries((q) => q.id == compareValue)[0];\n\n if (!query) return result;\n\n listThisObjects = query.objects((o) => {\n return o.id == this._Object.id;\n });\n\n if (listThisObjects.length > 1) {\n // Alternative: choose the 1st instance of this object in the query, and make the compare on that.\n // Be sure to warn the developer of the limitiations of an \"this_object\" \"in_query\" when query has > 1 copy of\n // this object as part of the query.\n\n console.error(\n \"HEY! Can't compare this_object to a query that has > 1 copy of that object!\"\n );\n\n return true;\n }\n\n // get this object's alias from the query\n alias = query.objectAlias(this._Object.id);\n\n // make sure all my columns in rowData are prefixed by \"alias\".columnName\n newRowData = {};\n\n Object.keys(rowData).forEach((key) => {\n newRowData[`${alias}.${key}`] = rowData[key];\n });\n\n // then pass this on to the _logic.queryValid();\n return this.inQueryValid(newRowData, rule, compareValue);\n\n // if in_datacollection condition\n case \"in_data_collection\":\n case \"not_in_data_collection\":\n // send rowData, null to datacollectionValid()\n return this.dataCollectionValid(rowData, rule, compareValue);\n }\n }\n\n processFieldsLoad(processFields = []) {\n if (processFields && !Array.isArray(processFields)) {\n processFields = [processFields];\n }\n this._ProcessFields = processFields;\n\n this.uiInit();\n }\n\n /**\n * @method fieldsLoad\n * set fields\n *\n * @param array {ABField}\n * @param object {ABObject} [optional]\n */\n fieldsLoad(fields = [], object = null) {\n this._Fields = fields.filter(\n (f) => f && f.fieldIsFilterable && f.fieldIsFilterable()\n );\n this._QueryFields = this._Fields\n ? this._Fields.filter((f) => f && f.isConnection && f.key != \"user\")\n : [];\n\n // insert our 'this object' entry if an Object was given.\n if (object) {\n this._Object = object;\n\n // insert our uuid in addition to the rest of our fields\n let thisObjOption = {\n id: \"this_object\",\n label: object.label,\n key: \"uuid\",\n };\n\n // If object is query ,then should define default alias: \"BASE_OBJECT\"\n // NOTE: Could not reference ABObjectQuery because recursive looping reference\n // if (object instanceof ABObjectQuery) {\n if (object.viewName) {\n thisObjOption.alias = \"BASE_OBJECT\";\n }\n\n this._Fields.unshift(thisObjOption);\n } else {\n delete this._Object;\n }\n }\n\n fieldsToQB() {\n /*\n let mapTypes = {\n LongText: \"string\",\n email: \"string\",\n datetime: \"date\",\n connectField: \"connectObject\"\n };\n\n const fields = this._Fields.map((f) => {\n // Label\n let label = f.label;\n if (this._settings.showObjectName && f.object && f.object.label)\n label = `${f.object.label}.${f.label}`;\n\n // Type\n let type = f.key || f.type;\n if (mapTypes[type]) type = mapTypes[type];\n\n // the format for webix querybuilder:\n // { id value:\"label\" type }\n // type: {string} the type of value it is.\n // since we want to tailor value selectors per field,\n // we will make a unique type for each field. and then\n // add value selectors for that specific .type\n return { id: f.columnName, value: label, type: type };\n });\n return fields;\n */\n\n let fields = (this._Fields || []).map((f) => {\n let label = f.label;\n if (this._settings.showObjectName && f.object && f.object.label)\n label = `${f.object.label}.${f.label}`;\n\n let type = \"text\"; // \"text\", \"number\", \"date\"\n let conditions = [];\n let processFieldKeys = [];\n let hasQueryField = true;\n\n if (!this._settings.isProcessParticipant)\n switch (f.key) {\n case \"boolean\":\n conditions = conditions.concat(\n this.fieldsAddFiltersBoolean(f)\n );\n processFieldKeys = [\"boolean\"];\n\n break;\n\n case \"connectObject\":\n conditions = this.fieldsAddFiltersConnectObject(f);\n\n // Add filter options to Custom index\n if (\n // 1:M\n (f.settings.linkType == \"one\" &&\n f.settings.linkViaType == \"many\") ||\n // 1:1 isSource = true\n (f.settings.linkType == \"one\" &&\n f.settings.linkViaType == \"one\" &&\n f.settings.isSource)\n ) {\n const stringResults = this.fieldsAddFiltersString(\n f\n ).filter(\n (opt) =>\n f.settings.isCustomFK ||\n // If this connect field does not use custom FK, then allow just `is empty` and `is not empty` filter options\n opt.id == \"is_empty\" ||\n opt.id == \"is_not_empty\"\n );\n conditions = stringResults.concat(conditions);\n\n // By Query Field\n conditions = conditions.concat(\n this.fieldsAddFiltersQuery(f, true)\n );\n }\n\n hasQueryField = false;\n processFieldKeys = [\"connectObject\"];\n\n break;\n\n case \"date\":\n case \"datetime\":\n type = \"date\";\n conditions = conditions.concat(this.fieldsAddFiltersDate(f));\n processFieldKeys = [\"date\", \"datetime\"];\n\n break;\n\n case \"calculate\":\n case \"formula\":\n case \"number\":\n type = \"number\";\n conditions = conditions.concat(\n this.fieldsAddFiltersNumber(f)\n );\n processFieldKeys = [\"calculate\", \"formula\", \"number\"];\n\n break;\n case \"email\":\n conditions = conditions.concat(this.fieldsAddFiltersEmail(f));\n // eslint-disable-next-line no-fallthrough\n case \"string\":\n case \"LongText\":\n case \"AutoIndex\":\n conditions = conditions.concat(\n this.fieldsAddFiltersString(f)\n );\n processFieldKeys = [\n \"string\",\n \"LongText\",\n \"email\",\n \"AutoIndex\",\n ];\n\n break;\n\n case \"list\":\n conditions = conditions.concat(this.fieldsAddFiltersList(f));\n\n break;\n\n case \"user\":\n conditions = conditions.concat(this.fieldsAddFiltersUser(f));\n processFieldKeys = [\"user\"];\n\n break;\n\n case \"uuid\":\n conditions = conditions.concat(\n this.fieldsAddFiltersThisObject(f)\n );\n hasQueryField = false;\n\n break;\n default:\n break;\n }\n else\n switch (f.key) {\n case \"connectObject\":\n case \"uuid\":\n hasQueryField = false;\n\n break;\n }\n\n conditions = conditions.concat(\n this.fieldsAddFiltersQuery(f, hasQueryField)\n );\n\n if (this._settings.isRecordRule) {\n conditions = conditions.concat(this.fieldsAddFiltersRecordRule(f));\n }\n\n let isProcessField =\n (this._ProcessFields || []).filter((processField) => {\n if (!processField) return false;\n\n if (processField.field) {\n return processFieldKeys.includes(processField.field.key);\n } else if (processField.key) {\n // uuid\n let processFieldId = processField.key.split(\".\").pop();\n return processFieldId == f.id || processFieldId == f.key;\n }\n }).length > 0;\n\n if (isProcessField) {\n conditions = conditions.concat(this.fieldsAddFiltersContext(f));\n }\n\n conditions = conditions.concat(this.fieldsAddFiltersCustom(f));\n\n // let type = f.id; // the default unique identifier for our filter types\n // if (f.id == \"this_object\") {\n // // if this happens to be our special \"this_object\" field, then our\n // // type needs to be the \"uuid\" type in the definition:\n // type = f.type;\n // }\n\n // the format for webix querybuilder:\n // { id value:\"label\" type }\n // type: {string} the type of value it is.\n // since we want to tailor value selectors per field,\n // we will make a unique type for each field. and then\n // add value selectors for that specific .type\n return {\n id: f.id,\n value: label,\n type: type,\n conditions: conditions,\n // format: () => {},\n };\n });\n\n // !!! Process Fields of ABProcess\n // https://github.com/CruGlobal/appbuilder_class_core/blob/master/FilterComplexCore.js#L636\n // https://github.com/CruGlobal/appbuilder_class_core/blob/master/FilterComplexCore.js#L564\n // (this._ProcessFields || [])\n // // if there is no .field, it is probably an embedded special field\n // .filter((pField) => pField.field == null)\n // .forEach((pField) => {\n // // like: .uuid\n // let key = pField.key.split(\".\").pop();\n // if (key == \"uuid\" && this._Object) {\n // fields.unshift({\n // id: pField.key,\n // value: this._Object.label,\n // type: \"text\",\n // conditions: this.fieldsAddFiltersContext(),\n // });\n // }\n // });\n\n return fields;\n }\n\n fieldsAddFiltersDate(field) {\n let dateConditions = {\n less: this.labels.component.beforeCondition,\n greater: this.labels.component.afterCondition,\n less_or_equal: this.labels.component.onOrBeforeCondition,\n greater_or_equal: this.labels.component.onOrAfterCondition,\n is_current_date: this.labels.component.isCurrentDateCondition,\n less_current: this.labels.component.beforeCurrentCondition,\n greater_current: this.labels.component.afterCurrentCondition,\n less_or_equal_current:\n this.labels.component.onOrBeforeCurrentCondition,\n greater_or_equal_current:\n this.labels.component.onOrAfterCurrentCondition,\n last_days: this.labels.component.onLastDaysCondition,\n next_days: this.labels.component.onNextDaysCondition,\n is_empty: this.labels.component.isEmpty,\n is_not_empty: this.labels.component.isNotEmpty,\n };\n\n let result = [];\n\n for (let condKey in dateConditions)\n switch (condKey) {\n case \"is_current_date\":\n case \"less_current\":\n case \"greater_current\":\n case \"less_or_equal_current\":\n case \"greater_or_equal_current\":\n case \"is_empty\":\n case \"is_not_empty\":\n result.push({\n id: condKey,\n value: dateConditions[condKey],\n batch: \"none\",\n handler: (a, b) => this.dateValid(a, condKey, b),\n });\n break;\n case \"last_days\":\n result.push({\n id: condKey,\n value: dateConditions[condKey],\n batch: \"text\",\n handler: (a, b) => this.dateValid(a, condKey, b),\n });\n break;\n default:\n result.push({\n id: condKey,\n value: dateConditions[condKey],\n batch: \"datepicker\",\n handler: (a, b) => this.dateValid(a, condKey, b),\n });\n break;\n }\n return result;\n }\n\n fieldsAddFiltersString(field) {\n let stringConditions = {\n contains: {\n batch: \"text\",\n label: this.labels.component.containsCondition,\n },\n not_contains: {\n batch: \"text\",\n label: this.labels.component.notContainsCondition,\n },\n equals: {\n batch: \"text\",\n label: this.labels.component.isCondition,\n },\n not_equal: {\n batch: \"text\",\n label: this.labels.component.isNotCondition,\n },\n is_empty: {\n batch: \"none\",\n label: this.labels.component.isEmpty,\n },\n is_not_empty: {\n batch: \"none\",\n label: this.labels.component.isNotEmpty,\n },\n };\n\n let result = [];\n\n for (let condKey in stringConditions) {\n result.push({\n id: condKey,\n value: stringConditions[condKey].label,\n batch: stringConditions[condKey].batch,\n handler: (a, b) => this.textValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersNumber(field) {\n let numberConditions = {\n equals: this.labels.component.equalCondition,\n not_equal: this.labels.component.notEqualCondition,\n less: this.labels.component.lessThanCondition,\n greater: this.labels.component.moreThanCondition,\n less_or_equal: this.labels.component.lessThanOrEqualCondition,\n greater_or_equal: this.labels.component.moreThanOrEqualCondition,\n };\n\n let result = [];\n\n for (let condKey in numberConditions) {\n result.push({\n id: condKey,\n value: numberConditions[condKey],\n batch: \"text\",\n handler: (a, b) => this.numberValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersList(field) {\n let listConditions = {\n equals: this.labels.component.equalListCondition,\n not_equal: this.labels.component.notEqualListCondition,\n };\n\n let result = [];\n\n for (let condKey in listConditions) {\n result.push({\n id: condKey,\n value: listConditions[condKey],\n batch: \"list\",\n handler: (a, b) => this.listValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersBoolean(field) {\n let booleanConditions = {\n checked: this.labels.component.checkedCondition,\n unchecked: this.labels.component.notCheckedCondition,\n };\n\n let result = [];\n\n for (let condKey in booleanConditions) {\n result.push({\n id: condKey,\n value: booleanConditions[condKey],\n batch: \"none\",\n handler: (a, b) => this.booleanValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersEmail(field) {\n let userConditions = {\n is_current_email: {\n batch: \"none\",\n label: this.labels.component.isCurrentUserEmailCondition,\n },\n is_not_current_email: {\n batch: \"none\",\n label: this.labels.component.isNotCurrentUserEmailCondition,\n },\n };\n\n let result = [];\n\n for (let condKey in userConditions) {\n result.push({\n id: condKey,\n value: userConditions[condKey].label,\n batch: userConditions[condKey].batch,\n handler: (a, b) => this.emailValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersUser(field) {\n let userConditions = {\n is_current_user: {\n batch: \"none\",\n label: this.labels.component.isCurrentUserCondition,\n },\n is_not_current_user: {\n batch: \"none\",\n label: this.labels.component.isNotCurrentUserCondition,\n },\n contain_current_user: {\n batch: \"none\",\n label: this.labels.component.containsCurrentUserCondition,\n },\n not_contain_current_user: {\n batch: \"none\",\n label: this.labels.component.notContainsCurrentUserCondition,\n },\n equals: {\n batch: \"user\",\n label: this.labels.component.equalListCondition,\n },\n not_equal: {\n batch: \"user\",\n label: this.labels.component.notEqualListCondition,\n },\n };\n\n let result = [];\n\n for (let condKey in userConditions) {\n result.push({\n id: condKey,\n value: userConditions[condKey].label,\n batch: userConditions[condKey].batch,\n handler: (a, b) => this.userValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersConnectObject(field) {\n const connectConditions = {\n same_as_user: {\n batch: \"user\",\n label: this.labels.component.sameAsUser,\n handler: (a, b) => this.userValid(a, \"same_as_user\", b),\n },\n not_same_as_user: {\n batch: \"user\",\n label: this.labels.component.notSameAsUser,\n handler: (a, b) => this.userValid(a, \"not_same_as_user\", b),\n },\n in_data_collection: {\n batch: \"datacollection\",\n label: this.labels.component.inDataCollection,\n handler: (a, b) =>\n this.dataCollectionValid(a, \"in_data_collection\", b),\n },\n not_in_data_collection: {\n batch: \"datacollection\",\n label: this.labels.component.notInDataCollection,\n handler: (a, b) =>\n this.dataCollectionValid(a, \"not_in_data_collection\", b),\n },\n // TODO\n // contains: this.labels.component.containsCondition,\n // not_contains: this.labels.component.notContainCondition,\n // equals: this.labels.component.isCondition,\n // not_equal: this.labels.component.isNotCondition\n };\n\n const result = [];\n\n for (let condKey in connectConditions) {\n result.push({\n id: condKey,\n value: connectConditions[condKey].label,\n batch: connectConditions[condKey].batch,\n handler: connectConditions[condKey].handler,\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersQuery(field, hasQueryField = false) {\n const queryConditions = hasQueryField\n ? {\n in_query_field: {\n label: this.labels.component.inQueryField,\n batch: \"queryField\",\n },\n not_in_query_field: {\n label: this.labels.component.notInQueryField,\n batch: \"queryField\",\n },\n }\n : {\n in_query: {\n label: this.labels.component.inQuery,\n batch: \"query\",\n },\n not_in_query: {\n label: this.labels.component.notInQuery,\n batch: \"query\",\n },\n };\n\n const result = [];\n\n for (const condKey in queryConditions) {\n result.push({\n id: condKey,\n value: queryConditions[condKey].label,\n batch: queryConditions[condKey].batch,\n handler: (a, b) => this.queryFieldValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersThisObject(field) {\n let thisObjectConditions = {\n in_data_collection: {\n batch: \"datacollection\",\n label: this.labels.component.inDataCollection,\n },\n not_in_data_collection: {\n batch: \"datacollection\",\n label: this.labels.component.notInDataCollection,\n },\n };\n\n let result = [];\n\n for (let condKey in thisObjectConditions) {\n result.push({\n id: condKey,\n value: thisObjectConditions[condKey].label,\n batch: thisObjectConditions[condKey].batch,\n handler: (a, b) => this.thisObjectValid(a, condKey, b),\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersRecordRule(field) {\n let recordRuleConditions = {\n same_as_field: this.labels.component.sameAsField,\n not_same_as_field: this.labels.component.notSameAsField,\n };\n\n let result = [];\n\n for (let condKey in recordRuleConditions) {\n result.push({\n id: condKey,\n value: recordRuleConditions[condKey],\n batch: \"recordRule\",\n handler: (a, b) => true, // TODO: record rule validation\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersContext(field) {\n let contextConditions = {\n context_equals: {\n batch: \"context\",\n label: this.labels.component.equalsProcessValue,\n handler: (a, b) => a == b,\n },\n context_not_equal: {\n batch: \"context\",\n label: this.labels.component.notEqualsProcessValueCondition,\n handler: (a, b) => a != b,\n },\n context_in: {\n batch: \"context\",\n label: this.labels.component.inProcessValueCondition,\n handler: (a, b) => a.indexOf(b) > -1,\n },\n context_not_in: {\n batch: \"context\",\n label: this.labels.component.notInProcessValueCondition,\n handler: (a, b) => a.indexOf(b) == -1,\n },\n };\n\n let result = [];\n\n for (let condKey in contextConditions) {\n result.push({\n id: condKey,\n value: contextConditions[condKey].label,\n batch: contextConditions[condKey].batch,\n handler: contextConditions[condKey].handler,\n });\n }\n\n return result;\n }\n\n fieldsAddFiltersCustom(field) {\n const customOptions = this._customOptions ?? {};\n const options = customOptions[field.id || field] ?? {};\n return options.conditions ?? [];\n }\n\n queriesLoad(queries = []) {\n this._Queries = queries;\n }\n\n /**\n * @method queries()\n *\n * return an array of all the ABObjectQuery.\n *\n * @param filter {Object}\n *\n * @return {array}\n */\n queries(filter = () => true) {\n const queryList = this._Queries ?? this.AB?.queries?.() ?? [];\n\n return queryList.filter((q) => filter(q));\n }\n\n setValue(settings) {\n this.condition = settings || {};\n\n this.condition.rules = this.condition.rules || [];\n }\n\n /**\n * @method getValue\n * return the current condition of the filter.\n * @return {JSON} -\n * {\n * \tglue: '', // 'and', 'or'\n *\t\trules: [\n *\t\t\t{\n *\t\t\t\tkey:\t'uuid',\n *\t\t\t\trule:\t'rule',\n *\t\t\t\tvalue:\t'value'\n *\t\t\t}\n *\t\t]\n * }\n */\n getValue() {\n // When asked for a value before a condition is set, default the\n // unset glue to \"and\";\n if (typeof this.condition.glue == \"undefined\") {\n this.condition.glue = \"and\";\n }\n return this.condition;\n }\n\n isComplete() {\n let result = true;\n\n const noValueRules = [\n \"is_current_user\",\n \"is_not_current_user\",\n \"contain_current_user\",\n \"not_contain_current_user\",\n \"same_as_user\",\n \"not_same_as_user\",\n \"is_empty\",\n \"is_not_empty\",\n \"checked\",\n \"unchecked\",\n \"is_current_date\",\n ];\n\n const isCompleteRules = (rules = []) => {\n if (result == false) return;\n\n rules.forEach((r) => {\n if (r?.rules && Array.isArray(r?.rules)) {\n isCompleteRules(r?.rules);\n } else {\n result =\n result &&\n r?.key != null &&\n r?.key != \"\" &&\n r?.rule != null &&\n r?.rule != \"\" &&\n ((r?.value != null && r?.value != \"\") ||\n noValueRules.indexOf(r?.rule) > -1);\n }\n });\n };\n\n isCompleteRules(this.condition?.rules);\n\n return result;\n }\n};\n","const ABComponent = require(\"../platform/ABComponent\");\n\n/**\n * support get data from objects and queries\n */\nfunction getFieldVal(rowData, field, returnSingular = true) {\n if (!field) return null;\n if (!field.columnName) return null;\n // if rowData is an array, then pull the first element to get value\n if (rowData && rowData[0]) rowData = rowData[0];\n\n let columnId = field.id;\n let columnName = field.columnName;\n\n let value = null;\n if (columnName.indexOf(\".\") > -1) {\n let colName = columnName.split(\".\")[1];\n value = rowData[columnName] || rowData[colName] || rowData[columnId];\n } else {\n value = rowData[columnName] || rowData[columnId];\n }\n\n if (value) {\n return value;\n }\n\n // otherwise, this might be a process check where the rowData keys have\n // '[diagramID].[field.id]'\n for (var k in rowData) {\n var key = k.split(\".\")[1];\n if (key && (key == columnId || key == columnName)) {\n value = rowData[k];\n }\n }\n\n // if value is an array, filter empty item\n if (value && Array.isArray(value)) {\n value = value.filter((v) => v != null);\n if (returnSingular) value = value[0];\n }\n\n return value;\n}\n\nmodule.exports = class RowFilterCore extends ABComponent {\n constructor(App, idBase, AB) {\n idBase = idBase || \"ab_row_filter\";\n\n super(App, idBase, AB);\n\n this.Account = { username: \"??\" };\n this._settings = {};\n this.config_settings = {};\n // var batchName; // we need to revert to this default when switching away from a in/by query field\n\n this._QueryFields = [];\n this._Fields;\n\n // internal business logic\n var _logic = (this._logic = {\n callbacks: {\n onChange: () => {},\n },\n\n /**\n * @method getValue\n *\n * @return {JSON} -\n * {\n * \t\tglue: '', // 'and', 'or'\n *\t\trules: [\n *\t\t\t{\n *\t\t\t\tkey:\t'column name',\n *\t\t\t\trule:\t'rule',\n *\t\t\t\tvalue:\t'value'\n *\t\t\t}\n *\t\t]\n * }\n */\n getValue: () => {\n return this.config_settings;\n },\n\n removeHtmlTags: function (text) {\n let result = \"\";\n try {\n let div = document.createElement(\"div\");\n div.innerHTML = text;\n\n result = div.textContent || div.innerText || \"\";\n } catch (err) {\n result = (text || \"\").replace(/(<([^>]+)>)/gi, \"\");\n }\n\n return result;\n },\n\n textValid: function (rowData, field, rule, compareValue) {\n var result = false;\n\n var value = getFieldVal(rowData, field);\n if (value == null) value = \"\";\n\n value = value.toString().trim().toLowerCase();\n value = _logic.removeHtmlTags(value); // remove html tags - rich text editor\n\n compareValue = compareValue\n .toString()\n .trim()\n .toLowerCase()\n .replace(/ +/g, \" \");\n\n // support \"john smith\" => \"john\" OR/AND \"smith\"\n var compareArray = compareValue.split(\" \");\n\n switch (rule) {\n case \"contains\":\n compareArray.forEach((val) => {\n if (result == false)\n // OR\n result = value.indexOf(val) > -1;\n });\n break;\n case \"not_contains\":\n result = true;\n compareArray.forEach((val) => {\n if (result == true)\n // AND\n result = value.indexOf(val) < 0;\n });\n break;\n case \"equals\":\n compareArray.forEach((val) => {\n if (result == false)\n // OR\n result = value == val;\n });\n break;\n case \"not_equal\":\n result = true;\n compareArray.forEach((val) => {\n if (result == true)\n // AND\n result = value != val;\n });\n break;\n case \"is_empty\":\n result = value == null || value == \"\";\n break;\n case \"is_not_empty\":\n result = value != null && value != \"\";\n break;\n default:\n result = _logic.queryValid(rowData, rule, compareValue);\n break;\n }\n\n return result;\n },\n\n dateValid: function (rowData, field, rule, compareValue) {\n var result = false;\n\n var value = getFieldVal(rowData, field);\n if (!(value instanceof Date)) value = new Date(value);\n\n if (!(compareValue instanceof Date))\n compareValue = new Date(compareValue);\n\n switch (rule) {\n case \"equals\":\n result = value == compareValue;\n break;\n case \"not_equal\":\n result = value != compareValue;\n break;\n case \"less\":\n result = value < compareValue;\n break;\n case \"greater\":\n result = value > compareValue;\n break;\n case \"less_or_equal\":\n result = value <= compareValue;\n break;\n case \"greater_or_equal\":\n result = value >= compareValue;\n break;\n default:\n result = _logic.queryValid(rowData, rule, compareValue);\n break;\n }\n\n return result;\n },\n\n numberValid: function (rowData, field, rule, compareValue) {\n var result = false;\n\n var value = getFieldVal(rowData, field);\n value = Number(value);\n compareValue = Number(compareValue);\n\n switch (rule) {\n case \"equals\":\n result = value == compareValue;\n break;\n case \"not_equal\":\n result = value != compareValue;\n break;\n case \"less\":\n result = value < compareValue;\n break;\n case \"greater\":\n result = value > compareValue;\n break;\n case \"less_or_equal\":\n result = value <= compareValue;\n break;\n case \"greater_or_equal\":\n result = value >= compareValue;\n break;\n default:\n result = _logic.queryValid(rowData, rule, compareValue);\n break;\n }\n\n return result;\n },\n\n listValid: function (rowData, field, rule, compareValue) {\n var result = false;\n\n var value = getFieldVal(rowData, field);\n if (value && value.toLowerCase) value = value.toLowerCase();\n\n compareValue = compareValue.toLowerCase();\n\n if (!Array.isArray(compareValue)) compareValue = [compareValue];\n\n switch (rule) {\n case \"equals\":\n if (value) result = compareValue.indexOf(value) > -1;\n break;\n case \"not_equal\":\n if (value) result = compareValue.indexOf(value) < 0;\n else result = true;\n break;\n default:\n result = _logic.queryValid(rowData, rule, compareValue);\n break;\n }\n\n return result;\n },\n\n booleanValid: function (rowData, field, rule, compareValue) {\n var result = false;\n\n var value = getFieldVal(rowData, field);\n\n // default value should be false\n if (value == null) value = false;\n\n switch (rule) {\n case \"equals\":\n result = value == compareValue;\n break;\n case \"not_equal\":\n result = value != compareValue;\n break;\n default:\n result = _logic.queryValid(rowData, rule, compareValue);\n break;\n }\n\n return result;\n },\n\n userValid: (rowData, field, rule, compareValue) => {\n var result = false;\n\n var value = getFieldVal(rowData, field);\n\n // if (Array.isArray(value)) value = [value];\n\n switch (rule) {\n case \"is_current_user\":\n result = value == this.Account.username;\n break;\n case \"is_not_current_user\":\n result = value != this.Account.username;\n break;\n case \"contain_current_user\":\n if (!value) {\n result = false;\n break;\n }\n if (!Array.isArray(value)) value = [value];\n\n result =\n (value || []).filter((v) => {\n if (v) {\n return (\n (v.username || v.id || v.text || v) ==\n this.Account.username\n );\n } else {\n return false;\n }\n }).length > 0;\n break;\n case \"not_contain_current_user\":\n if (!value) {\n result = false;\n break;\n }\n if (!Array.isArray(value)) value = [value];\n\n result =\n (value || []).filter((v) => {\n if (v) {\n return (\n (v.username || v.id || v.text || v) ==\n this.Account.username\n );\n } else {\n return false;\n }\n }).length == 0;\n break;\n case \"equals\":\n result = value.indexOf(compareValue) > -1;\n break;\n case \"not_equal\":\n result = value.indexOf(compareValue) < 0;\n break;\n default:\n result = _logic.queryValid(rowData, rule, compareValue);\n break;\n }\n\n return result;\n },\n\n queryValid: (rowData, rule, compareValue) => {\n var result = false;\n\n if (!this.AB || !compareValue) return result;\n\n // queryId:fieldId\n var queryId = compareValue.split(\":\")[0],\n fieldId = compareValue.split(\":\")[1];\n\n // if no query\n var query = this.queries((q) => q.id == queryId)[0];\n if (!query) return result;\n\n // if no field\n var field = query.fields((f) => f.id == fieldId)[0];\n if (!field) return result;\n\n let qIdBase = \"{idBase}-query-field-{id}\"\n .replace(\"{idBase}\", idBase)\n .replace(\"{id}\", query.id),\n inQueryFieldFilter = new this.constructor(this.App, qIdBase);\n inQueryFieldFilter.Account = this.Account;\n // inQueryFieldFilter.applicationLoad(this._Application);\n inQueryFieldFilter.fieldsLoad(query.fields());\n inQueryFieldFilter.setValue(query.workspaceFilterConditions);\n\n switch (rule) {\n case \"in_query_field\":\n result = inQueryFieldFilter.isValid(rowData);\n break;\n case \"not_in_query_field\":\n result = !inQueryFieldFilter.isValid(rowData);\n break;\n }\n\n return result;\n },\n\n inQueryValid: (rowData, columnName, rule, compareValue) => {\n let result = false;\n\n if (columnName) {\n rowData = rowData[columnName] || {};\n }\n\n if (!compareValue || !this.AB) return result;\n\n // if no query\n let query = this.queries((q) => q.id == compareValue)[0];\n if (!query) return result;\n\n let qIdBase = \"{idBase}-query-{id}\"\n .replace(\"{idBase}\", idBase)\n .replace(\"{id}\", query.id),\n inQueryFilter = new this.constructor(this.App, qIdBase);\n inQueryFilter.Account = this.Account;\n // inQueryFilter.applicationLoad(this._Application);\n inQueryFilter.fieldsLoad(query.fields());\n inQueryFilter.setValue(query.workspaceFilterConditions);\n\n switch (rule) {\n case \"in_query\":\n result = inQueryFilter.isValid(rowData);\n break;\n case \"not_in_query\":\n result = !inQueryFilter.isValid(rowData);\n break;\n }\n\n return result;\n },\n\n dataCollectionValid: (rowData, columnName, rule, compareValue) => {\n var result = false;\n\n if (!compareValue || !this.AB) return result;\n\n if (columnName) {\n rowData = rowData[columnName] || {};\n }\n\n let dc = this.AB.datacollectionByID(compareValue);\n\n switch (rule) {\n case \"in_data_collection\":\n if (!dc) return false;\n\n result =\n dc.getData(\n (d) => (d.id || d.uuid) == (rowData.id || rowData.uuid)\n ).length > 0;\n break;\n case \"not_in_data_collection\":\n if (!dc) return true;\n\n result =\n dc.getData(\n (d) => (d.id || d.uuid) == (rowData.id || rowData.uuid)\n ).length < 1;\n break;\n }\n\n return result;\n },\n\n connectFieldValid: function (rowData, field, rule, compareValue) {\n let relationName = field.relationName();\n\n let connectedVal = \"\";\n\n if (rowData) {\n if (rowData[relationName]) {\n connectedVal = (\n (field.indexField\n ? rowData[relationName][field.indexField.columnName]\n : false) || // custom index\n (field.indexField2\n ? rowData[relationName][field.indexField2.columnName]\n : false) || // custom index 2\n rowData[relationName].id ||\n rowData[relationName]\n )\n .toString()\n .toLowerCase();\n } else {\n let fieldVal = getFieldVal(rowData, field);\n if (fieldVal != null) {\n connectedVal = fieldVal;\n\n // an Object to a String\n if (typeof connectedVal == \"object\") {\n connectedVal =\n field.datasourceLink.displayData(connectedVal);\n }\n }\n }\n }\n\n let compareValueLowercase = (compareValue || \"\").toLowerCase();\n\n switch (rule) {\n case \"contains\":\n return (\n connectedVal.toString().indexOf(compareValueLowercase) > -1\n );\n case \"not_contains\":\n return (\n connectedVal.toString().indexOf(compareValueLowercase) ==\n -1\n );\n case \"equals\":\n return connectedVal == compareValueLowercase;\n case \"not_equal\":\n return connectedVal != compareValueLowercase;\n case \"in_query\":\n case \"not_in_query\":\n return _logic.inQueryValid(\n rowData,\n relationName,\n rule,\n compareValue\n );\n case \"is_current_user\":\n case \"is_not_current_user\":\n case \"contain_current_user\":\n case \"not_contain_current_user\":\n return _logic.userValid(rowData, field, rule, compareValue);\n case \"is_empty\":\n return (\n rowData[relationName] == null ||\n rowData[relationName].length < 1 ||\n rowData[relationName] == \"\"\n );\n case \"is_not_empty\":\n return (\n rowData[relationName] != null &&\n ((Array.isArray(rowData[relationName]) &&\n rowData[relationName].length > 0) ||\n rowData[relationName] != \"\")\n );\n case \"in_data_collection\":\n case \"not_in_data_collection\":\n return _logic.dataCollectionValid(\n rowData,\n relationName,\n rule,\n compareValue\n );\n }\n },\n\n thisObjectValid: (rowData, rule, compareValue) => {\n let result = false;\n\n switch (rule) {\n // if in_query condition\n case \"in_query\":\n case \"not_in_query\":\n if (!this.AB || !this._Object) return result;\n\n // if > 1 copy of this object in query ==> Error!\n var query = this.queries((q) => q.id == compareValue)[0];\n if (!query) return result;\n\n var listThisObjects = query.objects((o) => {\n return o.id == this._Object.id;\n });\n if (listThisObjects.length > 1) {\n // Alternative: choose the 1st instance of this object in the query, and make the compare on that.\n // Be sure to warn the developer of the limitiations of an \"this_object\" \"in_query\" when query has > 1 copy of\n // this object as part of the query.\n\n console.error(\n \"HEY! Can't compare this_object to a query that has > 1 copy of that object!\"\n );\n return true;\n }\n\n // get this object's alias from the query\n var alias = query.objectAlias(this._Object.id);\n\n // make sure all my columns in rowData are prefixed by \"alias\".columnName\n var newRowData = {};\n Object.keys(rowData).forEach((key) => {\n newRowData[`${alias}.${key}`] = rowData[key];\n });\n\n // then pass this on to the _logic.queryValid();\n return _logic.inQueryValid(\n newRowData,\n null,\n rule,\n compareValue\n );\n // break; /* eslint no-unreachable */\n\n // if in_datacollection condition\n case \"in_data_collection\":\n case \"not_in_data_collection\":\n // send rowData, null to datacollectionValid()\n return _logic.dataCollectionValid(\n rowData,\n null,\n rule,\n compareValue\n );\n // break; /* eslint no-unreachable */\n }\n },\n });\n\n // Interface methods for parent component:\n // this.objectLoad = _logic.objectLoad;\n // this.viewLoad = _logic.viewLoad;\n this.getValue = _logic.getValue;\n // this.setValue = _logic.setValue;\n // this.isValid = _logic.isValid;\n }\n\n init(options) {\n if (options.showObjectName) {\n this._settings.showObjectName = options.showObjectName;\n }\n }\n\n /**\n * @method isValid\n * validate the row data is valid filter condition\n *\n * @param rowData {Object} - data row\n */\n isValid(rowData) {\n var config_settings = this.config_settings;\n var _logic = this._logic;\n\n // If no conditions, then return true\n if (\n config_settings == null ||\n config_settings.rules == null ||\n config_settings.rules.length == 0\n )\n return true;\n\n if (rowData == null) return false;\n\n var result = config_settings.glue === \"and\" ? true : false;\n\n config_settings.rules.forEach((filter) => {\n if (!filter?.key || !filter?.rule) return;\n\n var fieldInfo = this._Fields.filter((f) => f.id == filter.key)[0];\n if (!fieldInfo) return;\n\n var condResult;\n\n // Filters that have \"this_object\" don't have a fieldInfo.key, so in that case,\n // define a special .key == \"this_object\"\n var ruleFieldType = fieldInfo.key;\n if (typeof fieldInfo.key == \"undefined\") {\n if (fieldInfo.id != \"this_object\") {\n fieldInfo.key = \"connectField\"; // if you are looking at the parent object it won't have a key to analyze\n ruleFieldType = fieldInfo.key;\n } else ruleFieldType = \"this_object\";\n }\n\n switch (ruleFieldType) {\n case \"string\":\n case \"LongText\":\n case \"email\":\n condResult = _logic.textValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"date\":\n case \"datetime\":\n condResult = _logic.dateValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"number\":\n case \"formula\":\n condResult = _logic.numberValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"list\":\n condResult = _logic.listValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"boolean\":\n condResult = _logic.booleanValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"user\":\n condResult = _logic.userValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"connectField\":\n case \"connectObject\":\n condResult = _logic.connectFieldValid(\n rowData,\n fieldInfo,\n filter.rule,\n filter.value\n );\n break;\n case \"this_object\":\n condResult = _logic.thisObjectValid(\n rowData,\n filter.rule,\n filter.value\n );\n break;\n }\n\n if (config_settings.glue === \"and\") {\n result = result && condResult;\n } else {\n result = result || condResult;\n }\n });\n\n return result;\n }\n\n /**\n * @method applicationLoad\n * set application\n *\n * @param application {ABApplication}\n */\n // applicationLoad(application) {\n // this._Application = application;\n // }\n\n /**\n * @method fieldsLoad\n * set fields\n *\n * @param {array} fields\n * an array of fields used in this Query\n * @param {ABObject} object [optional]\n * (optional) ABObject reference if this Filter should support\n * the \"this object\" conditions.\n */\n fieldsLoad(fields = [], object = null) {\n this._Fields = fields.filter((f) => f?.fieldIsFilterable?.());\n // NOTE: User fields are now Connections, but we want to treat them\n // differently.\n this._QueryFields = this._Fields\n ? this._Fields.filter((f) => f && f.isConnection && f.key != \"user\")\n : [];\n\n // insert our 'this object' entry if an Object was given.\n if (object) {\n this._Object = object;\n\n let thisObjOption = {\n id: \"this_object\",\n label: object.label,\n };\n\n // If object is query ,then should define default alias: \"BASE_OBJECT\"\n if (object.viewName) {\n thisObjOption.alias = \"BASE_OBJECT\";\n }\n\n this._Fields.unshift(thisObjOption);\n } else {\n delete this._Object;\n }\n }\n\n queriesLoad(queries = []) {\n this._Queries = queries;\n }\n\n /**\n * @method queries()\n * return an array of all the ABObjectQuery.\n * @param {fn} filter\n * @return {array}\n */\n queries(filter = () => true) {\n let result = [];\n\n if (this.AB) {\n result = result.concat(this.AB.queries(filter));\n }\n\n if (this._Queries) {\n result = result.concat(\n (this._Queries || []).filter(\n (q) => filter(q) && result.filter((r) => r.id == q.id).length < 1\n )\n );\n }\n\n return result;\n }\n\n setValue(settings) {\n this.config_settings = settings || {};\n this.config_settings.rules = this.config_settings.rules || [];\n }\n};\n","/*\n * ABFieldAutoIndex\n *\n * An ABFieldAutoIndex defines a AutoIndex field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldAutoIndexDefaults = {\n key: \"AutoIndex\",\n // unique key to reference this specific DataField\n\n description: \"Auto Increment Value\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"key\",\n // font-awesome icon reference. (without the 'fa-'). so 'key' to\n // reference 'fa-key'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Auto Index\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"number\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"tinyint\", \"smallint\", \"mediumint\", \"int\", \"integer\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\n// defaultValues: the keys must match a .name of your elements to set it's default value.\nconst defaultValues = {\n prefix: \"\",\n delimiter: \"none\",\n displayLength: 4,\n previewText: \"0000\",\n};\n\nmodule.exports = class ABFieldAutoIndexCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldAutoIndexDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldAutoIndexDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n static getDelimiterSign(text) {\n const delimiterItem = this.delimiterList().filter((item) => {\n return item.id == text;\n })[0];\n\n return delimiterItem ? delimiterItem.sign : \"\";\n }\n\n static delimiterList() {\n return [\n { id: \"none\", value: L(\"None\"), sign: \"\" },\n { id: \"comma\", value: L(\"Comma\"), sign: \", \" },\n { id: \"slash\", value: L(\"Slash\"), sign: \"/\" },\n { id: \"space\", value: L(\"Space\"), sign: \" \" },\n { id: \"dash\", value: L(\"Dash\"), sign: \"-\" },\n { id: \"colon\", value: L(\"Colon\"), sign: \":\" },\n ];\n }\n\n static setValueToIndex(prefix, delimiter, displayLength, displayNumber) {\n const resultIndex =\n prefix +\n this.getDelimiterSign(delimiter) +\n (\"0000000000\" + displayNumber).slice(-parseInt(displayLength));\n\n return resultIndex;\n }\n\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n this.settings.displayLength = parseInt(this.settings.displayLength);\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // Remove every values, then we will use AUTO_INCREMENT of MySQL\n delete values[this.columnName];\n }\n\n format(rowData) {\n if (!rowData?.[this.columnName]) return \"\";\n\n try {\n const resultAutoIndex = this.constructor.setValueToIndex(\n this.settings.prefix,\n this.settings.delimiter,\n this.settings.displayLength,\n rowData[this.columnName]\n );\n\n return resultAutoIndex;\n } catch (err) {\n return \"\";\n }\n }\n};\n","/*\n * ABFieldBoolean\n *\n * An ABFieldBoolean defines a boolean field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldBooleanDefaults = {\n key: \"boolean\",\n // unique key to reference this specific DataField\n\n description: \"A single checkbox that can be checked or unchecked.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"check-square-o\",\n // font-awesome icon reference. (without the 'fa-'). so 'check-square-o' to\n // reference 'fa-check-square-o'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Checkbox\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"boolean\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"bool\", \"boolean\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n default: 0,\n};\n\nmodule.exports = class ABFieldBooleanCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldBooleanDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldBooleanDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n if (this.settings.default != null)\n this.settings.default = parseInt(this.settings.default);\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n if (values[this.columnName] == null && this.settings.default != null) {\n values[this.columnName] = this.settings.default;\n }\n }\n};\n","/*\n * ABFieldCalculate\n *\n * An ABFieldCalculate defines a calculate field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\n/** Private methods */\nfunction AGE(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n const today = new Date();\n const oneYear = 31536000000; // (24 * 60 * 60 * 1000) * 365;\n const diffYears = (today - dataDate) / oneYear;\n\n if (diffYears < 1) return Math.round(diffYears * 10) / 10;\n // float 2 digits\n else return Math.floor(diffYears); // no float digit\n\n // const today = new Date();\n // const age = today.getFullYear() - dataDate.getFullYear();\n // if (age < 1) {\n // \tconst m = today.getMonth() - dataDate.getMonth();\n\n // \tage = parseFloat(\"0.\" + m);\n\n // \t// if (m < 0 || (m === 0 && today.getDate() < dataDate.getDate())) {\n // \t// \tage--;\n // \t// }\n // }\n // return age;\n}\n\nfunction YEAR(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n return dataDate.getFullYear();\n}\n\nfunction MONTH(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n // Start at 0\n return dataDate.getMonth();\n}\n\nfunction DAY(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n return dataDate.getDate();\n}\n\nfunction DATE(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n // number of miliseconds in one day\n const oneDay = 86400000; // 1000 * 60 * 60 * 24\n\n // Convert back to days and return\n return Math.round(dataDate.getTime() / oneDay);\n}\n\nfunction HOUR(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n // number of miliseconds in one hour\n const oneHour = 3600000; // 1000 * 60 * 60\n\n // Convert back to days and return\n return Math.round(dataDate.getTime() / oneHour);\n}\n\nfunction MINUTE(dateString) {\n // validate\n if (!dateString) return 0;\n const dataDate = new Date(dateString);\n if (!dataDate) return 0;\n\n // number of miliseconds in one hour\n const oneMinute = 60000; // 1000 * 60\n\n // Convert back to days and return\n return Math.round(dataDate.getTime() / oneMinute);\n}\n\nfunction MINUTE_TO_HOUR(mins) {\n const hours = mins / 60;\n const rhours = Math.floor(hours);\n const minutes = (hours - rhours) * 60;\n const rminutes = Math.round(minutes);\n\n return parseFloat(`${rhours}.${rminutes}`);\n}\n\nconst ABFieldCalculateDefaults = {\n key: \"calculate\",\n // unique key to reference this specific DataField\n\n description: \"Perform a calculation based upon existing values\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"calculator\",\n // font-awesome icon reference. (without the 'fa-'). so 'calculator' to\n // reference 'fa-calculator'\n\n isFilterable: (field) => {\n const unsupportedInFilter = [\"MINUTE_TO_HOUR\", \"DATE\", \"HOUR\", \"MINUTE\"];\n const unsupported = unsupportedInFilter.filter((item) =>\n field.settings.formula.includes(item)\n );\n return unsupported.length == 0;\n },\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Calculate\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"number\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\n \"tinyint\",\n \"smallint\",\n \"mediumint\",\n \"int\",\n \"integer\",\n \"bigint\",\n \"decimal\",\n \"dec\",\n \"numeric\",\n \"fixed\",\n \"float\",\n \"real\",\n ],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n formula: \"\",\n decimalSign: \"none\", // \"none\", \"comma\", \"period\", \"space\"\n decimalPlaces: 0, // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\n};\n\nmodule.exports = class ABFieldCalculateCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldCalculateDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldCalculateDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n /**\n * @method convertToJs\n *\n * @param {ABOBject} object\n * @param {string} formula\n * @param {object} rowData\n * @param {integer} place\n * @param {string} alias [Optional]\n */\n static convertToJs(\n object,\n formula,\n rowData,\n place,\n alias = null,\n recalculate = false\n ) {\n if (!formula) return \"\";\n\n // replace with current date\n formula = formula.replace(/\\(CURRENT\\)/g, \"(new Date())\");\n\n object.fields().forEach((f) => {\n let colName = f.columnName;\n if (colName.indexOf(\".\") > -1)\n // QUERY: get only column name\n colName = colName.split(\".\")[1];\n\n // if template does not contain, then should skip\n if (formula.indexOf(\"{\" + colName + \"}\") < 0) return;\n\n const data =\n rowData[`${object.alias ?? alias}.${f.columnName}`] ??\n rowData[f.columnName];\n\n // number fields\n if (f.key == \"number\") {\n const numberVal = `(${data || 0})`; // (number) - NOTE : (-5) to support negative number\n formula = formula.replace(\n new RegExp(\"{\" + colName + \"}\", \"g\"),\n numberVal\n );\n }\n // calculate and formula fields\n else if (f.key == \"calculate\" || f.key == \"formula\") {\n let calVal = f.format(rowData, recalculate) || 0;\n\n // pull number only\n if (typeof calVal == \"string\")\n calVal = calVal.replace(/[^-0-9.]/g, \"\");\n\n calVal = `(${calVal})`;\n\n formula = formula.replace(\n new RegExp(\"{\" + colName + \"}\", \"g\"),\n calVal\n );\n }\n // date fields\n else if (f.key == \"date\" || f.key == \"datetime\") {\n const dateVal = `\"${data || \"\"}\"`; // \"date\"\n formula = formula.replace(\n new RegExp(\"{\" + colName + \"}\", \"g\"),\n dateVal\n );\n }\n // boolean fields\n else if (f.key == \"boolean\") {\n const booleanVal = `(${data || 0})`; // show 1 or 0 for boolean\n formula = formula.replace(\n new RegExp(\"{\" + colName + \"}\", \"g\"),\n booleanVal\n );\n }\n });\n\n // decimal places - toFixed()\n // FIX: floating number calculation\n // https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/\n return eval(formula).toFixed(place || 0);\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // this field is read only\n delete values[this.columnName];\n }\n\n format(rowData, recalculate = false) {\n let place = 0;\n if (this.settings.decimalSign != \"none\") {\n place = this.settings.decimalPlaces;\n }\n\n try {\n let result = this.constructor.convertToJs(\n this.object,\n this.settings.formula,\n rowData,\n place,\n this.alias,\n recalculate\n );\n\n if (typeof result == \"string\")\n result = result.replace(/[^-0-9.]/g, \"\");\n\n switch (this.settings.decimalSign) {\n case \"comma\":\n result = result.replace(\".\", \",\");\n break;\n case \"space\":\n result = result.replace(\".\", \" \");\n break;\n }\n\n return result;\n } catch (err) {\n return \"\";\n }\n }\n};\n","/*\n * ABFieldCombine\n *\n * An ABFieldCombine defines a combined field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\n// function L(key, altText) {\n// // TODO:\n// return altText; // AD.lang.label.getLabel(key) || altText;\n// }\n\nconst ABFieldCombinedDefaults = {\n key: \"combined\",\n // unique key to reference this specific DataField\n\n description: \"Combined Value\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"key\",\n // font-awesome icon reference. (without the 'fa-'). so 'key' to\n // reference 'fa-key'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Combined Field\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"text\", \"mediumtext\", \"longtext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\n// defaultValues: the keys must match a .name of your elements to set it's default value.\nconst defaultValues = {\n combinedFields: \"\",\n // {string} \"field's uuid1, field's uuid2, field's uuid3, ...\"\n // This tells us what fields will be combined.\n // if we don't have this, the old value which we filled out won't be cleared when we do \"Add field\" this type again.\n\n delimiter: \"plus\", // plus, space, dash, period\n};\n\nmodule.exports = class ABFieldCombineCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldCombinedDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldCombinedDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.delimiter =\n values.settings.delimiter || defaultValues.delimiter;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // Remove every values, then we will use AUTO_INCREMENT of MySQL\n delete values[this.columnName];\n }\n\n /**\n * @method getCombinedFields\n * Retrieve the fields used to combine and generate a specific value\n *\n * @return {Array}\n */\n getCombinedFields() {\n const result = [];\n\n (this.settings?.combinedFields ?? \"\").split(\",\").forEach((fieldId) => {\n const fld = this.object.fields((f) => f.id == fieldId)[0];\n if (!fld) return;\n\n result.push(fld);\n });\n\n return result;\n }\n\n /**\n * @method format\n * Convert the value of a connected field (without a custom index) to display the label of the linked object\n *\n * @param {Object} rowData\n * @returns {String}\n */\n format(rowData) {\n let val = rowData[this.columnName] ?? \"\";\n\n this.getCombinedFields().forEach((f, index) => {\n if (\n f.key != \"connectObject\" ||\n f.settings.indexField ||\n f.settings.indexField2\n )\n return;\n\n let connectVal = rowData[f.relationName()];\n if (!connectVal) return;\n\n if (!Array.isArray(connectVal)) connectVal = [connectVal];\n\n const connectLabel = connectVal\n .map((item) => item.text ?? f.datasourceLink.displayData(item))\n .join(\"|\");\n\n val = val.replace(rowData[f.columnName], connectLabel);\n });\n\n return val;\n }\n};\n","/*\n * ABFieldConnect\n *\n * An ABFieldConnect defines a connect to other object field type.\n *\n */\n\nvar ABField = require(\"../../platform/dataFields/ABField\");\n\n// function L(key, altText) {\n// // TODO:\n// return altText; // AD.lang.label.getLabel(key) || altText;\n// }\n\nconst ABFieldConnectDefaults = {\n key: \"connectObject\",\n // unique key to reference this specific DataField\n\n description: \"Connect two data objects together\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"external-link\",\n // font-awesome icon reference. (without the 'fa-'). so 'external-link' to\n // reference 'fa-external-link'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: (field) => {\n const linkType = `${field?.settings?.linkType}:${field?.settings?.linkViaType}`;\n return [\"one:many\", \"one:one\"].indexOf(linkType) > -1;\n },\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Connect to another record\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: false,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"char\", \"varchar\", \"tinytext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n linkObject: \"\", // ABObject.id\n // the .id of the ABObject we are connected to\n\n linkType: \"one\", // [one, many]\n // 'one' : this object can have only 1 of our linkObject\n // 'many': this object can have MANY of our linkObject\n\n linkViaType: \"many\", // [one, many]\n // 'one' : the linkedObject can only have 1 of me\n // 'many' : the linkedObject can have many of me\n\n linkColumn: \"\", // ABField.id\n // the .id of the field in the linkedObject that is our\n // connected field.\n\n isSource: null, // bit : 1,0\n // isSource indicates that this object is the source of the connection:\n // if linkType==one, and isSource=1, then the value in this object's field\n // \t\tis the connected object's id\n // if linkType == one, and isSource = 0, then the linkObject has this obj.id\n // \tin it's connected field (linkColumn)\n\n // the next 3 Fields are concerning how we connect to other ABObjects when\n // we are NOT using the .uuid as the connecting Value. Instead, there is an\n // ABIndex setting we are connecting with.\n isCustomFK: 0,\n // {bool} truthy [0,1, etc...]\n // indicates that this connection is using 1 or more custom foreign keys\n // for the data it is storing in it's relationship.\n\n indexField: \"\", // ABField.id\n // {string} {ABField.id}\n // In a Connection defined between A --> B, this field represents the ABField\n // that is used for the data being stored.\n // In 1:1, 1:M or M:1 relationships, .indexField always refers to the\n // field we are pulling the Data FROM.\n // In M:N relationships: this will refer to the A.Field.id that is a custom\n // key (if any).\n\n indexField2: \"\", // ABField.id\n // {string} {ABField.id}\n // In the M:N relationship: this field refers to the B.Field.id that is a\n // custom Key for the data we are storing.\n};\n\nmodule.exports = class ABFieldConnectCore extends ABField {\n constructor(values, object, fieldDefaults = ABFieldConnectDefaults) {\n super(values, object, fieldDefaults);\n\n this.isConnection = true;\n // {bool}\n // is this an ABFieldConnect type of field.\n // this is a simplified helper to identify if an ABField is a type\n // of connect field. Since this is the only place it is defined,\n // all other field types will be falsy\n\n // // text to Int:\n // this.settings.isSource = parseInt(this.settings.isSource || 0);\n // this.settings.isCustomFK = parseInt(this.settings.isCustomFK || 0);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldConnectDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n this.settings.isSource = parseInt(this.settings.isSource || 0);\n this.settings.isCustomFK = parseInt(this.settings.isCustomFK || 0);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(/* values */) {}\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n }\n\n relationName() {\n // there is object name - {objectName}.{columnName}\n if (this.columnName.indexOf(\".\") > -1) {\n const names = this.columnName.split(\".\");\n return `${names[0]}.${this.AB.rules.toFieldRelationFormat(names[1])}`;\n } else {\n return this.AB.rules.toFieldRelationFormat(this.columnName);\n }\n }\n\n /**\n * @method datasourceLink\n * return the ABObject that this field connection links to\n * @return {ABObject}\n */\n get datasourceLink() {\n const linkObj = this.AB.objectByID(this.settings.linkObject);\n if (!linkObj) {\n const configError = new Error(\n `ConnectField[${this.label}][${this.id}] unable to find linkObject[${this.settings.linkObject}]`\n );\n this.AB.notify.builder(configError, {\n field: this,\n linkObject: this.settings.linkObject,\n });\n }\n return linkObj;\n }\n\n /**\n * @method fieldLink\n * return the ABField that we are linked to.\n * @return {ABDataField} or undefined if not found.\n */\n get fieldLink() {\n const objectLink = this.datasourceLink;\n if (!objectLink) return null; // note: already Notified\n\n const linkColumn = objectLink.fieldByID(this.settings.linkColumn);\n if (!linkColumn) {\n const configError = new Error(\n `ConnectField[${this.label}][${this.id}] unable to find linkColumn[${this.settings.linkColumn}]`\n );\n this.AB.notify.builder(configError, {\n field: this,\n linkColumn: this.settings.linkColumn,\n });\n }\n return linkColumn;\n }\n\n /**\n * @method pullRelationValues\n * Return the data values for this field entry in the provided data row.\n * @param {*} row\n * @return {array}\n */\n pullRelationValues(row) {\n let selectedData;\n\n // Get linked object\n const linkedObject = this.datasourceLink;\n\n let data = this.dataValue(row);\n if (data && linkedObject) {\n // convert to JSON\n if (typeof data == \"string\") {\n try {\n data = JSON.parse(data);\n } catch (e) {\n // must be a UUID\n // so just set that to selectedData:\n selectedData = data;\n }\n }\n\n selectedData = data;\n }\n\n return selectedData;\n }\n\n dataValue(rowData) {\n if (rowData == null) return \"\";\n\n const propName = `${this.object.name}.${this.relationName()}`;\n\n return (\n rowData[this.relationName()] ||\n rowData[propName] ||\n rowData[this.columnName] ||\n \"\"\n );\n }\n\n format(rowData) {\n const val = this.pullRelationValues(rowData);\n const linkedObject = this.datasourceLink;\n\n // array\n if (Array.isArray(val))\n return val\n .map((v) => {\n if (v.text == null) return linkedObject.displayData(v) || \"\";\n else return v.text || \"\";\n })\n .join(\", \");\n // string\n else if (val) {\n if (val.text == null) return linkedObject.displayData(val) || \"\";\n else if (val.text) return val.text || \"\";\n }\n // empty string\n else return \"\";\n }\n\n /**\n * @method linkType\n * return the type of connection we have to our connected object\n * @return {string}\n */\n linkType() {\n return this.settings.linkType;\n }\n\n /**\n * @method linkType\n * return the type of connection we have to our connected object\n * @return {string}\n */\n linkViaType() {\n return this.settings.linkViaType;\n }\n\n /**\n * @method isSource\n * does this object contain the .id of the remote object (in case of linkType : one )\n * @return {bool}\n */\n isSource() {\n return this.settings.isSource;\n }\n\n /**\n * @property indexField\n * @return {ABField}\n */\n get indexField() {\n if (!this.settings.isCustomFK || !this.settings.indexField) {\n return null;\n }\n const linkType = `${this.settings.linkType}:${this.settings.linkViaType}`;\n // 1:M\n if (linkType === \"one:many\") {\n return this.datasourceLink.fieldByID(this.settings.indexField);\n }\n // 1:1\n else if (linkType === \"one:one\") {\n if (this.settings.isSource) {\n return this.datasourceLink.fieldByID(this.settings.indexField);\n } else {\n return this.object.fieldByID(this.settings.indexField);\n }\n }\n // M:1\n else if (linkType === \"many:one\") {\n return this.object.fieldByID(this.settings.indexField);\n }\n // M:N\n else if (linkType === \"many:many\") {\n let indexField = this.object.fieldByID(this.settings.indexField);\n\n if (indexField == null)\n indexField = this.datasourceLink.fieldByID(\n this.settings.indexField\n );\n\n return indexField;\n }\n\n return null;\n }\n\n /**\n * @property indexField2\n * @return {ABField}\n */\n get indexField2() {\n if (!this.settings.isCustomFK || !this.settings.indexField2) {\n return null;\n }\n\n let indexField;\n\n // M:N only\n if (\n this.settings.linkType == \"many\" &&\n this.settings.linkViaType == \"many\"\n ) {\n indexField = this.object.fieldByID(this.settings.indexField2);\n\n if (indexField == null)\n indexField = this.datasourceLink.fieldByID(\n this.settings.indexField2\n );\n }\n\n return indexField;\n }\n\n /**\n * @method getRelationValue\n * pull values for update connect data\n * @param {Object} rowData\n * @param {Object} options - {\n * forUpdate: boolean\n * }\n * @return {Object}\n */\n getRelationValue(rowData, options = {}) {\n if (rowData == null) return;\n let colName;\n const indexField = this.indexField;\n const datasourceLink = this.datasourceLink;\n\n const linkType = `${this.settings.linkType}:${this.settings.linkViaType}`;\n\n // custom index\n // M:N\n if (linkType === \"many:many\") {\n const indexField2 = this.indexField2;\n\n if (indexField && indexField.object.id == datasourceLink.id) {\n colName = indexField.columnName;\n } else if (indexField2 && indexField2.object.id == datasourceLink.id) {\n colName = indexField2.columnName;\n }\n }\n // 1:M, 1:1 isSource = true\n else if (\n indexField &&\n (linkType === \"one:many\" ||\n (linkType === \"one:one\" && this.settings.isSource))\n ) {\n colName = indexField.columnName;\n }\n // M:1\n else if (linkType === \"many:one\") {\n // NOTE: M:1 has special case\n // it uses different value for search and update.\n // UPDATE uses row id\n // SEARCH uses custom index value\n if (options.forUpdate) {\n colName = datasourceLink.PK();\n } else {\n colName = indexField ? indexField.columnName : datasourceLink.PK();\n }\n }\n // NO CUSTOM INDEX\n else if (datasourceLink) {\n colName = datasourceLink.PK();\n }\n\n let result =\n rowData[colName] ||\n rowData[this.object?.PK()] ||\n rowData.id ||\n rowData;\n\n if (colName == \"id\") {\n result = parseInt(result);\n }\n\n return result;\n }\n};\n","/*\n * ABFieldCore\n *\n * ABFieldBase defines the common ABField structure that is shared between\n * the client and the server. Mostly how it manages it's internal data, and\n * how it is related to the ABObject classes.\n *\n */\n// const ABEmitter = require(\"../../platform/ABEmitter\");\nconst ABMLClass = require(\"../../platform/ABMLClass\");\n\nmodule.exports = class ABFieldCore extends ABMLClass {\n constructor(values, object, fieldDefaults) {\n super([\"label\"], object.AB);\n\n // NOTE: setup this first so later we can use .fieldType(), .fieldIcon()\n this.defaults = fieldDefaults || {};\n\n /*\n \t\t{\n \t\t\tid:'uuid',\t\t\t\t\t// uuid value for this obj\n \t\t\tkey:'fieldKey',\t\t\t\t// unique key for this Field\n \t\t\ticon:'font',\t\t\t\t// fa-[icon] reference for an icon for this Field Type\n \t\t\tlabel:'',\t\t\t\t\t// pulled from translation\n\t\t\tcolumnName:'column_name',\t// a valid mysql table.column name\n\t\t\tisImported: 1/0,\t\t\t// flag to mark is import from other object\n\t\t\tsettings: {\t\t\t\t\t// unique settings for the type of field\n\t\t\t\tshowIcon:true/false,\t// only useful in Object Workspace DataTable\n\t\t\t\tisImported: 1/0,\t\t// flag to mark is import from other object\n\t\t\t\trequired: 1/0,\t\t\t// field allows does not allow NULL or it does allow NULL\n\t\t\t\twidth: {int}\t\t\t// width of display column\n\n\t\t\t\t// specific for dataField\n\t\t\t},\n\t\t\ttranslations:[]\n \t\t}\n \t\t*/\n\n this.object = object;\n\n this.fromValues(values);\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n static get reservedNames() {\n return [\n \"id\",\n \"created_at\",\n \"updated_at\",\n \"properties\",\n \"createdAt\",\n \"updatedAt\",\n ];\n }\n\n static defaultValues() {\n return {};\n }\n\n // unique key to reference this specific DataField\n fieldKey() {\n return this.defaults.key;\n }\n\n /**\n * Sails ORM data types that can be imported to this DataField\n * @return {Array}\n */\n fieldOrmTypes() {\n if (this.defaults.compatibleOrmTypes) {\n if (Array.isArray(this.defaults.compatibleOrmTypes)) {\n return this.defaults.compatibleOrmTypes;\n } else {\n return [this.defaults.compatibleOrmTypes];\n }\n } else {\n return [];\n }\n }\n\n /**\n * Mysql data types that can be imported to this DataField\n * @return {Array}\n */\n fieldMysqlTypes() {\n if (this.defaults.compatibleMysqlTypes) {\n if (Array.isArray(this.defaults.compatibleMysqlTypes)) {\n return this.defaults.compatibleMysqlTypes;\n } else {\n return [this.defaults.compatibleMysqlTypes];\n }\n } else {\n return [];\n }\n }\n\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n fieldIcon() {\n return this.defaults.icon;\n }\n\n // the multilingual text for the name of this data field.\n fieldMenuName() {\n return this.defaults.menuName;\n }\n\n // the multilingual text for the name of this data field.\n fieldDescription() {\n return this.defaults.description;\n }\n\n // the flag to set when checking if field should be filterable\n fieldIsFilterable() {\n if (this.defaults.isFilterable != null) {\n if (typeof this.defaults.isFilterable === \"function\") {\n return this.defaults.isFilterable(this);\n } else {\n return this.defaults.isFilterable;\n }\n }\n\n return 1;\n }\n\n // the flag to set when checking if field should be sortable\n fieldIsSortable() {\n if (this.defaults.isSortable != null) {\n if (typeof this.defaults.isSortable === \"function\") {\n return this.defaults.isSortable(this);\n } else {\n return this.defaults.isSortable;\n }\n }\n\n return 1;\n }\n\n // the flag to set when checking if the field should be used as a label\n fieldUseAsLabel() {\n if (this.defaults.useAsLabel != null) {\n if (typeof this.defaults.useAsLabel === \"function\") {\n return this.defaults.useAsLabel(this);\n } else {\n return this.defaults.useAsLabel;\n }\n }\n\n return 1;\n }\n\n fieldSupportRequire() {\n if (this.defaults.supportRequire) return this.defaults.supportRequire;\n // default\n else return true;\n }\n\n fieldSupportQuery() {\n if (this.defaults.supportQuery != null) {\n if (typeof this.defaults.supportQuery === \"function\") {\n return this.defaults.supportQuery(this);\n } else {\n return this.defaults.supportQuery;\n }\n }\n\n return true;\n }\n\n ///\n /// Instance Methods\n ///\n\n /// ABApplication data methods\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABField instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n const obj = super.toObj();\n\n return {\n id: this.id,\n type: this.type || \"field\",\n key: this.key,\n icon: this.icon,\n isImported: this.isImported,\n columnName: this.columnName,\n settings: this.settings,\n translations: obj.translations,\n };\n }\n\n defaultCheck(val, defaultVal) {\n let returnVal = defaultVal;\n if (typeof val != \"undefined\") {\n returnVal = val;\n }\n return returnVal;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n if (!this.id) this.id = values.id; // NOTE: only exists after .save()\n this.type == values.type || \"field\";\n this.key = values.key || this.fieldKey();\n this.icon = values.icon || this.fieldIcon();\n\n values.settings = values.settings || {};\n\n // if this is being instantiated on a read from the Property UI,\n // .label is coming in under .settings.label\n this.label = values.label || values.settings.label || \"?label?\";\n\n this.columnName = values.columnName || \"\";\n\n this.isImported = values.isImported || 0;\n\n this.settings = values.settings;\n this.settings.showIcon = this.defaultCheck(values.settings.showIcon, \"1\");\n this.settings.required = this.defaultCheck(values.settings.required, \"0\");\n this.settings.width = this.defaultCheck(values.settings.width, \"0\");\n\n // convert from \"0\" => 0\n this.isImported = parseInt(this.isImported);\n this.settings.showIcon = parseInt(this.settings.showIcon);\n this.settings.required = parseInt(this.settings.required);\n this.settings.unique = parseInt(this.settings.unique || 0);\n this.settings.width = parseInt(this.settings.width);\n\n // we're responsible for setting up our specific settings:\n const defaultValues = this.constructor.defaultValues() || {};\n for (const dv in defaultValues) {\n this.settings[dv] = this.defaultCheck(\n values.settings[dv],\n defaultValues[dv]\n );\n }\n\n // const the MLClass now process the Translations\n super.fromValues(values);\n\n // final validity check: columnName really should have a value:\n this.columnName = this.columnName || this.label;\n\n // knex does not like .(dot) in table and column names\n // https://github.com/knex/knex/issues/2762\n this.columnName = this.columnName.replace(/[^a-zA-Z0-9_ ]/gi, \"\");\n }\n\n /**\n * @method urlPointer()\n * return a string pointer to decode this object from the root application\n * object.\n * @return {string} pointer reference\n */\n urlPointer() {\n return this.object.urlField() + this.id;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n values[this.columnName] = \"\";\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n */\n isValidData(data, validator) {\n // console.error('!!! Field ['+this.fieldKey()+'] has not implemented .isValidData()!!!');\n if (\n this.settings.required &&\n (data[this.columnName] == null || data[this.columnName] == \"\") &&\n data[this.columnName] != 0\n ) {\n validator.addError(this.columnName, \"This is a required field.\");\n }\n }\n\n /*\n * @property isMultilingual\n * does this field represent multilingual data?\n * @return {bool}\n */\n get isMultilingual() {\n return false;\n }\n\n dataValue(rowData) {\n const propName = `${this.alias || this.object.name}.${this.columnName}`;\n\n let result = \"\";\n if (rowData?.[this.columnName] != null) {\n result = rowData[this.columnName];\n } else if (rowData?.[propName] != null) {\n result = rowData[propName];\n }\n\n return result;\n }\n\n /**\n * @method format\n * return display text to detail comonent and define label of object\n *\n * @param {Object} rowData - data\n */\n format(rowData) {\n if (rowData) {\n return this.dataValue(rowData);\n } else return \"\";\n }\n\n /**\n * @method toDefinition()\n *\n * convert this instance into an ABDefinition object.\n *\n * @return {ABDefinition}\n */\n toDefinition() {\n const myDef = super.toDefinition();\n\n // attempt to provide a more descriptive name:\n // [obj]->[fieldName]\n if (myDef.name == \"\") {\n myDef.name =\n myDef.json.name || myDef.json.label || myDef.json.columnName;\n }\n if (this.object && this.object.name) {\n myDef.name = `${this.object.name}->${myDef.name}`;\n }\n return myDef;\n }\n};\n","/*\n * ABFieldDate\n *\n * An ABFieldDate defines a date field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\n/*function L(key, altText) {\n // TODO:git \n // return altText; // AD.lang.label.getLabel(key) || altText;\n}*/\n\nconst ABFieldDateDefaults = {\n key: \"date\",\n // unique key to reference this specific DataField\n\n description: \"Pick one from a calendar.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"calendar\",\n // font-awesome icon reference. (without the 'fa-'). so 'calendar' to\n // reference 'fa-calendar'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Date\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"date\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"date\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n dateFormat: 2, // 1 (Ignore date), 2, 3, 4, 5\n defaultDate: 1, // 1 (None), 2 (Current Date), 3 (Specific Date)\n defaultDateValue: null, // {Date}\n validateCondition: \"none\",\n validateRangeUnit: \"days\",\n validateRangeBefore: 0,\n validateRangeAfter: 0,\n validateStartDate: null,\n validateEndDate: null,\n};\n\nmodule.exports = class ABFieldDateCore extends ABField {\n constructor(values, object, defaultValues = ABFieldDateDefaults) {\n super(values, object, defaultValues);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldDateDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n // TODO: current webpack install fails here without babel-loader,\n // so swtich this to old JS method of Static Values (see bottom)\n // static RegEx = \"^[0-9]{4}-[0-9]{2}-[0-9]{2}$\";\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n this.settings.dateFormat = parseInt(this.settings.dateFormat);\n this.settings.defaultDate = parseInt(this.settings.defaultDate);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n if (values[this.columnName] != null) return;\n\n let dateResult;\n\n // Set current date as default\n if (this.settings.defaultDate == 2) {\n dateResult = new Date();\n }\n // Set specific date as default\n else if (\n this.settings.defaultDate == 3 &&\n this.settings.defaultDateValue\n ) {\n dateResult = new Date(this.settings.defaultDateValue);\n }\n\n // if no default value is set, then don't insert a value.\n if (dateResult != null) {\n values[this.columnName] = this.AB.rules.toDateFormat(dateResult, {\n format: \"YYYY-MM-DD\",\n });\n // values[this.columnName] = moment(dateResult).format(\"YYYY-MM-DD\");\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n var L = this.AB.Label();\n\n const currentDate = new Date();\n currentDate.setHours(0, 0, 0, 0);\n\n if (data[this.columnName]) {\n let value = data[this.columnName];\n\n if (!(value instanceof Date)) {\n value = this.AB.rules.toDate(value);\n // value = new Date(this.convertToMoment(value));\n }\n\n // verify we didn't end up with an InValid Date result.\n if (\n Object.prototype.toString.call(value) === \"[object Date]\" &&\n isFinite(value)\n ) {\n let isValid = true;\n\n // Custom vaildate is here\n if (this.settings && this.settings.validateCondition) {\n const startDate = this.settings.validateStartDate\n ? new Date(this.settings.validateStartDate)\n : null,\n endDate = this.settings.validateEndDate\n ? new Date(this.settings.validateEndDate)\n : null,\n startDateDisplay = this.getDateDisplay(startDate),\n endDateDisplay = this.getDateDisplay(endDate);\n const minDate = this.AB.rules.subtractDate(\n new Date(),\n this.settings.validateRangeBefore,\n this.settings.validateRangeUnit\n );\n const maxDate = this.AB.rules.addDate(\n new Date(),\n this.settings.validateRangeAfter,\n this.settings.validateRangeUnit\n );\n switch (this.settings.validateCondition) {\n case \"dateRange\":\n if (minDate < value && value < maxDate) isValid = true;\n else {\n isValid = false;\n validator.addError(\n this.columnName,\n L(\"Should be in between {0} and {1}\", [\n this.getDateDisplay(minDate),\n this.getDateDisplay(maxDate),\n ])\n );\n }\n\n break;\n case \"between\":\n if (startDate < value && value < endDate) isValid = true;\n else {\n isValid = false;\n validator.addError(\n this.columnName,\n L(\"Should be in between {0} and {1}\", [\n startDateDisplay,\n endDateDisplay,\n ])\n );\n }\n break;\n case \"notBetween\":\n if (value < startDate && endDate < value) isValid = true;\n else {\n isValid = false;\n validator.addError(\n this.columnName,\n L(\"Should not be in between {0} and {1}\", [\n startDateDisplay,\n endDateDisplay,\n ])\n );\n }\n break;\n case \"=\":\n isValid =\n value.getTime &&\n startDate.getTime &&\n value.getTime() == startDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should equal {0}\", [startDateDisplay])\n );\n break;\n case \"<>\":\n isValid =\n value.getTime &&\n startDate.getTime &&\n value.getTime() != startDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should not equal {0}\", [startDateDisplay])\n );\n break;\n case \">\":\n isValid =\n value.getTime &&\n startDate.getTime &&\n value.getTime() > startDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should after {0}\", [startDateDisplay])\n );\n break;\n case \"<\":\n isValid =\n value.getTime &&\n startDate.getTime &&\n value.getTime() < startDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should before {0}\", [startDateDisplay])\n );\n break;\n case \">=\":\n isValid =\n value.getTime &&\n startDate.getTime &&\n value.getTime() >= startDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should after or equal {0}\", [startDateDisplay])\n );\n break;\n case \"<=\":\n isValid =\n value.getTime &&\n startDate.getTime &&\n value.getTime() <= startDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should before or equal {0}\", [startDateDisplay])\n );\n break;\n case \"lessCurrentDate\":\n isValid =\n value.getTime &&\n value.getTime() < currentDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should before {0}\", [\n this.getDateDisplay(currentDate),\n ])\n );\n break;\n case \"lessEqualCurrentDate\":\n isValid =\n value.getTime &&\n value.getTime() <= currentDate.getTime();\n if (!isValid)\n validator.addError(\n this.columnName,\n L(\"Should before or equal {0}\", [\n this.getDateDisplay(currentDate),\n ])\n );\n break;\n }\n }\n\n if (isValid) {\n // Reformat value to DB\n // NOTE: should we update here?\n data[this.columnName] = this.exportValue(value);\n }\n } else {\n // return a validation error\n validator.addError(this.columnName, \"Should be a Date!\");\n }\n }\n }\n\n format(rowData) {\n const d = this.dataValue(rowData);\n\n if (d == \"\" || d == null) {\n return \"\";\n }\n\n // pull format from settings.\n const dateObj = this.AB.rules.toDate(d);\n return this.getDateDisplay(dateObj);\n\n // const momentObj = this.convertToMoment(d);\n // return this.getDateDisplay(new Date(momentObj));\n }\n\n getFormat() {\n let dateFormatString = \"\";\n\n const dateFormat =\n this.settings && this.settings.dateFormat\n ? this.settings.dateFormat\n : \"\";\n\n switch (dateFormat) {\n //Ignore Date\n case (1, 2):\n {\n dateFormatString = \"%d/%m/%Y\";\n }\n break;\n //mm/dd/yyyy\n case 3:\n {\n dateFormatString = \"%m/%d/%Y\";\n }\n break;\n //M D, yyyy\n case 4:\n {\n dateFormatString = \"%M %d, %Y\";\n }\n break;\n //D M, yyyy\n case 5:\n {\n dateFormatString = \"%d %M, %Y\";\n }\n break;\n default:\n {\n dateFormatString = \"%d/%m/%Y\";\n }\n break;\n }\n\n return dateFormatString;\n }\n\n getDateDisplay(dateData) {\n const dateFormat = this.getFormat();\n\n return this.dateToString(dateFormat, dateData);\n }\n\n // convertToMoment(string) {\n // const result = moment(string);\n\n // const supportFormats = [\n // \"DD/MM/YYYY\",\n // \"MM/DD/YYYY\",\n // \"DD-MM-YYYY\",\n // \"MM-DD-YYYY\"\n // ];\n\n // supportFormats.forEach((format) => {\n // if (!result || !result.isValid()) result = moment(string, format);\n // });\n\n // return result;\n // }\n\n exportValue(value) {\n return value\n ? this.AB.rules.toDateFormat(value, {\n format: \"YYYY-MM-DD\",\n })\n : \"\";\n // return this.convertToMoment(value).format(\"YYYY-MM-DD\");\n }\n\n dateToString(dateFormat, dateData) {\n if (dateData && dateData.toString) return dateData.toString();\n else return \"\";\n }\n};\n\n// Transition Code:\n// revert to static RegEx once babel-loader is working locally.\nmodule.exports.RegEx = \"^[0-9]{4}-[0-9]{2}-[0-9]{2}$\";\n","/*\n * ABFieldDateTime\n *\n * An ABFieldDateTime defines a datetime field type.\n *\n */\n\nconst ABFieldDateCore = require(\"./ABFieldDateCore\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldDateDefaults = {\n key: \"datetime\",\n // unique key to reference this specific DataField\n\n description: \"Pick one from date & time.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"clock-o\",\n // font-awesome icon reference. (without the 'fa-'). so 'clock-o' to\n // reference 'clock-o'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Date & Time\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"datetime\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"datetime\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n timeFormat: 2, // 1 (Ignore time), 2, 3\n defaultTime: 1, // 1 (None), 2 (Current Time), 3 (Specific Time)\n defaultTimeValue: null, // {Date}\n};\n\nmodule.exports = class ABFieldDateTimeCore extends ABFieldDateCore {\n constructor(values, object) {\n super(values, object, ABFieldDateDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldDateDefaults;\n }\n\n static defaultValues() {\n const baseDefault = super.defaultValues();\n return Object.assign(baseDefault, defaultValues);\n }\n\n // TODO: current webpack install fails here without babel-loader,\n // so swtich this to old JS method of Static Values (see bottom)\n // static RegEx = \"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$\";\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n this.settings.timeFormat = parseInt(this.settings.timeFormat);\n this.settings.defaultTime = parseInt(this.settings.defaultTime);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n if (values[this.columnName] != null) return;\n\n super.defaultValue(values);\n\n let dateResult;\n\n // From default value of ABFieldDateCore\n if (values[this.columnName]) {\n dateResult = this.AB.rules.toDate(values[this.columnName]);\n // const momentVal = this.convertToMoment(values[this.columnName]);\n // if (momentVal.isValid()) {\n // dateResult = new Date(momentVal);\n // }\n }\n\n // Set current time as default\n if (this.settings.defaultTime == 2) {\n const currDate = new Date();\n\n if (dateResult == null) dateResult = new Date();\n\n dateResult.setHours(currDate.getHours());\n dateResult.setMinutes(currDate.getMinutes());\n dateResult.setSeconds(currDate.getSeconds());\n dateResult.setMilliseconds(currDate.getMilliseconds());\n }\n // Set specific time as default\n else if (\n this.settings.defaultTime == 3 &&\n this.settings.defaultTimeValue\n ) {\n const defaultTime = new Date(this.settings.defaultTimeValue);\n\n if (dateResult == null) dateResult = new Date();\n\n dateResult.setHours(defaultTime.getHours());\n dateResult.setMinutes(defaultTime.getMinutes());\n dateResult.setSeconds(defaultTime.getSeconds());\n dateResult.setMilliseconds(defaultTime.getMilliseconds());\n }\n\n // if no default value is set, then don't insert a value.\n if (dateResult != null)\n values[this.columnName] = dateResult.toISOString();\n }\n\n getFormat() {\n const timeFormat = this.getTimeFormat();\n\n this.settings = this.settings || {};\n\n if (this.settings.dateFormat == 1) {\n return timeFormat;\n }\n\n const dateFormat = super.getFormat();\n\n return `${dateFormat} ${timeFormat}`;\n }\n\n format(rowData) {\n const datetimeFormat = this.getFormat();\n const d = this.dataValue(rowData);\n const dateObj = this.AB.rules.toDate(d);\n\n if (d == \"\" || d == null) {\n return \"\";\n }\n\n if (this.AB.Webix)\n return this.AB.Webix.Date.dateToStr(datetimeFormat)(dateObj);\n else\n return dateObj?.toISOString() ?? \"\";\n }\n\n getTimeFormat() {\n this.settings = this.settings || {};\n switch (this.settings.timeFormat) {\n case 2:\n return \" %h:%i %A\";\n case 3:\n return \" %H:%i\";\n default:\n return \"\";\n }\n }\n\n /**\n * @method exportValue\n * @param {Date} date\n * @return {string}\n */\n exportValue(date) {\n return date?.toISOString?.() ?? \"\";\n }\n};\n\n// Transition Code:\n// revert to static RegEx once babel-loader is working locally.\nmodule.exports.RegEx =\n \"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$\";\n","/*\n * ABFieldEmail\n *\n * An ABFieldEmail defines a boolean field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldEmailDefaults = {\n key: \"email\",\n // unique key to reference this specific DataField\n\n description: \"Email fields are used to store email addresses.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"envelope\",\n // font-awesome icon reference. (without the 'fa-'). so 'envelope' to\n // reference 'fa-envelope'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Email\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: true,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"char\", \"varchar\", \"tinytext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n default: \"\",\n defaultCheckbox: 0,\n};\n\nmodule.exports = class ABFieldEmailCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldEmailDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldEmailDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.default = values.settings.default || \"\";\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // if no default value is set, then don't insert a value.\n if (!values[this.columnName]) {\n // Set default string\n if (this.settings.default) {\n values[this.columnName] = this.settings.default;\n }\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n if (data[this.columnName]) {\n const Reg =\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\n let value = data[this.columnName];\n value = String(value).toLowerCase();\n if (!Reg.test(value)) {\n validator.addError(this.columnName, \"Invalid email\");\n }\n }\n }\n};\n","/*\n * ABFieldFile\n *\n * An ABFieldFile defines a File field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldFileDefaults = {\n key: \"file\",\n // unique key to reference this specific DataField\n\n description: \"Attach a File to this object.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"file\",\n // font-awesome icon reference. (without the 'fa-'). so 'file' to\n // reference 'fa-file'\n\n isFilterable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"File Attachment\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: false,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"char\", \"varchar\", \"tinytext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n removeExistingData: 0,\n fileSize: 0,\n fileType: \"\",\n};\n\nmodule.exports = class ABFieldFileCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldFileDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldFileDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n this.settings.fileSize = parseInt(this.settings.fileSize);\n this.settings.limitFileSize = parseInt(this.settings.limitFileSize);\n this.settings.limitFileType = parseInt(this.settings.limitFileType);\n this.settings.removeExistingData = parseInt(\n this.settings.removeExistingData\n );\n }\n\n /**\n * @method dataValue\n * return the file data stored as part of this field.\n *\n * An ABFieldFile column contains a json structure that contains\n * .uuid : {string} a file uuid reference\n * .filename : {string} the name of the file that was uploaded.\n *\n * This will return the json object.\n * @param {obj} values a key=>value hash of the current values.\n * @return {obj} { uuid, filename }, or {} if empty.\n */\n dataValue(rowData) {\n const propName = `${this.alias || this.object.name}.${this.columnName}`;\n\n let result = rowData[this.columnName] || rowData[propName] || {};\n if (typeof result == \"string\") {\n try {\n result = JSON.parse(result);\n } catch (err) {\n // ignore error\n }\n }\n\n return result;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n *\n * An ABFieldFile expects a json structure that contains\n * .uuid : {string} a file uuid reference\n * .filename : {string} the name of the file that was uploaded.\n *\n * For a default value, we return an empty json object: \"{}\"\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n values[this.columnName] = \"{}\";\n }\n\n format(rowData) {\n let result = this.dataValue(rowData);\n if (result) {\n if (typeof result == \"string\") {\n try {\n result = JSON.parse(result);\n } catch (err) {\n // ignore error.\n }\n }\n\n // return file name\n return result ? result.filename || \"\" : \"\";\n } else {\n return \"\";\n }\n }\n\n /**\n * @method requestParam\n * return the entry in the given input that relates to this field.\n * @param {obj} allParameters a key=>value hash of the inputs to parse.\n * @return {obj} or undefined\n */\n requestParam(allParameters) {\n const myParameter = super.requestParam(allParameters);\n\n // if we have our default empty object, then remove the entry\n // and let the DB insert a null value.\n let val = myParameter?.[this.columnName];\n if (val == \"{}\" || val == \"\") {\n delete myParameter[this.columnName];\n }\n if (\"string\" === typeof val) {\n try {\n myParameter[this.columnName] = JSON.parse(val);\n } catch (e) {\n /* ignore */\n }\n }\n\n return myParameter;\n }\n};\n","/*\n * ABFieldFormula\n *\n * An ABFieldFormula are used to run calculations on connected (child) records\n * and store the total of that calculation in the parent.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nconst ABFieldFormulaDefaults = {\n key: \"formula\",\n // unique key to reference this specific DataField\n\n description:\n \"Perform a calculation by a formula type based upon existing values\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"circle-o-notch\",\n // font-awesome icon reference. (without the 'fa-'). so 'circle-o-notch' to\n // reference 'fa-circle-o-notch'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Formula\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportQuery: (field) => {\n const fieldLink = field.fieldLink;\n if (fieldLink == null) return false;\n\n // Not support calculate field in query\n return fieldLink.key !== \"calculate\";\n },\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: false,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"number\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\n \"tinyint\",\n \"smallint\",\n \"mediumint\",\n \"int\",\n \"integer\",\n \"bigint\",\n \"decimal\",\n \"dec\",\n \"numeric\",\n \"fixed\",\n \"float\",\n \"real\",\n ],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n field: \"\", // id of ABField : NOTE - store our connect field to support when there are multi - linked columns\n objectLink: \"\", // id of ABObject\n fieldLink: \"\", // id of ABField\n type: \"sum\", // \"sum\", \"average\", \"max\", \"min\", \"count\"\n where: \"\",\n};\n\nmodule.exports = class ABFieldFormulaCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldFormulaDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldFormulaDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // this field is read only\n delete values[this.columnName];\n }\n\n /**\n * @method format\n * both calculate and format the data input based of user settings\n * for this field.\n * @param {obj} rowData\n * a key=>value hash of the current values.\n * @param {boolean} reCalculate\n * a boolean that signals if we should force recalculation of values\n */\n format(rowData, reCalculate = false, isGrouped = false) {\n const fieldLink = this.fieldLink;\n\n const reformat = (numData) => {\n // ABFieldCalculate does not need to .format again\n if (!fieldLink || fieldLink.key == \"calculate\") {\n return numData;\n } else {\n const rowDataFormat = {};\n rowDataFormat[fieldLink.columnName] = numData;\n return fieldLink.format(rowDataFormat);\n }\n };\n\n // if data exists, then will not calculate on client side\n // unless we pass reCalculate=true to force the recalculation\n if (rowData[this.columnName] != null && !reCalculate && !isGrouped) {\n // reformat data\n return reformat(rowData[this.columnName]);\n } else if (\n rowData[this.columnName] != null &&\n !reCalculate &&\n isGrouped\n ) {\n return rowData[this.columnName];\n }\n\n if (!fieldLink) return 0;\n\n const fieldBase = this.fieldBase();\n if (!fieldBase) return 0;\n\n let data =\n rowData[fieldBase.relationName()] ||\n rowData[fieldBase.columnName] ||\n [];\n if (!Array.isArray(data)) data = [data];\n\n // Filter\n if (\n data &&\n data.length &&\n this.settings &&\n this.settings.where &&\n this.settings.where.rules &&\n this.settings.where.rules.length\n ) {\n this.filterHelper.setValue(this.settings.where);\n data = data.filter((item) => this.filterHelper.isValid(item));\n }\n\n let numberList = [];\n\n // pull number from data\n switch (fieldLink.key) {\n case \"calculate\":\n data.forEach((d) => {\n numberList.push(parseFloat(fieldLink.format(d) || 0));\n });\n break;\n case \"number\":\n numberList = data.map((d) => d[fieldLink.columnName] || 0);\n break;\n }\n\n let result = 0;\n\n // get the decimal size of the numbers being calculated\n const decimalSize = fieldLink.getDecimalSize();\n\n // calculate\n switch (this.settings.type) {\n case \"sum\":\n if (numberList.length > 0) {\n // get power of 10 to the number of decimal places this number\n // is formated to require\n const multiplier = Math.pow(10, decimalSize);\n // multiply values by muliplyier and add them to pervious value\n // because in javascript adding number with decimals can cause issues\n // ex: 9.11 + 222.11 = 231.22000000000003\n let sum = 0;\n numberList.forEach((val) => {\n sum += val * multiplier || 0;\n });\n // divide result by multiplier to get actual value\n result = sum / multiplier;\n }\n break;\n\n case \"average\":\n if (numberList.length > 0) {\n // get power of 10 to the number of decimal places this number\n // is formated to require\n const multiplier = Math.pow(10, decimalSize);\n // multiply values by muliplyier and add them to pervious value\n // because in javascript adding number with decimals can cause issues\n // ex: 9.11 + 222.11 = 231.22000000000003\n let sum = 0;\n numberList.forEach((val) => {\n sum += val * multiplier || 0;\n });\n // divide result by multiplier to get actual value\n // and divide by length to get the average\n result = sum / multiplier / numberList.length;\n }\n break;\n\n case \"max\":\n result = Math.max(...numberList) || 0;\n break;\n case \"min\":\n result = Math.min(...numberList) || 0;\n break;\n case \"count\":\n result = numberList.length;\n break;\n }\n\n rowData[this.columnName] = result;\n\n // ABFieldCalculate does not need to .format again\n if (fieldLink.key == \"calculate\") {\n return result;\n } else {\n return reformat(result);\n }\n }\n\n fieldBase() {\n return this.object.fieldByID(this.settings.field);\n }\n\n get fieldLink() {\n const obj = this.AB.objectByID(this.settings.object);\n if (!obj) return null;\n\n const field = obj.fieldByID(this.settings.fieldLink);\n if (!field) return null;\n\n return field;\n }\n\n get filterHelper() {\n if (this._rowFilter == null) {\n this._rowFilter = this.AB.filterComplexNew(`${this.id}_filterComplex`);\n\n if (this.fieldLink && this.fieldLink.object) {\n this._rowFilter.fieldsLoad(this.fieldLink.object.fields());\n this._rowFilter.setValue(this.settings.where);\n }\n }\n\n return this._rowFilter;\n }\n};\n","/*\n * ABFieldImageCore\n *\n * An ABFieldImage defines a Image field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nconst ABFieldImageDefaults = {\n key: \"image\",\n // unique key to reference this specific DataField\n\n description: \"Attach an image to this object.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"file-image-o\",\n // font-awesome icon reference. (without the 'fa-'). so 'file-image-o' to\n // reference 'fa-file-image-o'\n\n isFilterable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Image Attachment\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: false,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"char\", \"varchar\", \"tinytext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n useWidth: 0,\n imageWidth: \"\",\n useHeight: 0,\n imageHeight: \"\",\n removeExistingData: 0,\n useDefaultImage: false,\n defaultImageUrl: \"\",\n};\n\nmodule.exports = class ABFieldImageCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldImageDefaults);\n\n // NOTE: our Labels are ready here:\n // if (\n // ABFieldImageDefaults.menuName == \"*Image Attachment\" &&\n // this.AB.Label\n // ) {\n // const L = this.AB.Label();\n // ABFieldImageDefaults.menuName = L(\"Image Attachment\");\n // ABFieldImageDefaults.description = L(\"Attach an image to this object.\");\n // }\n\n /*\n \t{\n\t\t\tsettings: {\n\t\t\t\t'useWidth':0,\n\t\t\t\t'imageWidth':'',\n\t\t\t\t'useHeight': 0,\n\t\t\t\t'imageHeight': '',\n\t\t\t\t'removeExistingData': 0\n\t\t\t}\n \t}\n \t*/\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldImageDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n this.settings.useWidth = parseInt(this.settings.useWidth);\n this.settings.useHeight = parseInt(this.settings.useHeight);\n this.settings.imageWidth = parseInt(this.settings.imageWidth);\n this.settings.imageHeight = parseInt(this.settings.imageHeight);\n this.settings.useDefaultImage = parseInt(this.settings.useDefaultImage);\n this.settings.removeExistingData = parseInt(\n this.settings.removeExistingData\n );\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n }\n};\n","/*\n * ABFieldJson\n *\n * An ABFieldJson defines a JSON field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nconst ABFieldJsonDefaults = {\n key: \"json\",\n // unique key to reference this specific DataField\n\n description: \"JSON value\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"font\",\n // font-awesome icon reference. (without the 'fa-'). so 'font' to\n // reference 'fa-font'\n\n isFilterable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"JSON\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"json\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"json\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {};\n\nmodule.exports = class ABFieldJsonCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldJsonDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldJsonDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // in the case of a JSON data type, we should NOT insert a \"\"\n //\n // values[this.columnName] = \"\";\n }\n};\n","/*\n * ABFieldListCore\n *\n * An ABFieldList defines a select list field type.\n *\n */\n\n// const ABFieldSelectivity = require(\"../../platform/dataFields/ABFieldSelectivity\");\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldListDefaults = {\n key: \"list\",\n // unique key to reference this specific DataField\n\n description:\n \"Select list allows you to select predefined options below from a dropdown.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"th-list\",\n // font-awesome icon reference. (without the 'fa-'). so 'th-list' to\n // reference 'fa-th-list'\n\n isFilterable: (field) => {\n if (field.settings.isMultiple) {\n return false;\n } else {\n return true;\n }\n },\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: (field) => {\n if (field.settings.isMultiple) {\n return false;\n } else {\n return true;\n }\n },\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Select list\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\n \"char\",\n \"varchar\",\n \"tinytext\" /* \"text\", \"mediumtext\" */,\n ],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n\n hasColors: (field) => {\n if (field.settings.hasColors) {\n return true;\n } else {\n return false;\n }\n },\n};\n\nconst defaultValues = {\n isMultiple: 0,\n // {bool}\n // can multiple values be selected?\n\n hasColors: 0,\n // {bool}\n // are we to display our values in colors?\n\n options: [],\n // {array}\n // The options defined for this list:\n // [ { id, text, hex, translations },...]\n // .id {string} a unique id for this value\n // .text {string} the displayed text of this value\n // .hex {string} a color hex definition for this value\n // .translations {obj} the multilingual definitions for this value.\n\n default: \"none\",\n multipleDefault: [],\n};\n\nmodule.exports = class ABFieldListCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldListDefaults);\n\n this.pendingDeletions = [];\n // {array}\n // a list of pending option deletions that need to be processed\n // when this is saved.\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldListDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // translate options list\n if (this.settings.options && this.settings.options.length > 0) {\n this.settings.options.forEach((opt) => {\n this.translate(opt, opt, [\"text\"]);\n });\n }\n\n this.settings.isMultiple = parseInt(this.settings.isMultiple);\n this.settings.hasColors = parseInt(this.settings.hasColors);\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n const obj = super.toObj();\n\n // Un-translate options list\n obj.settings.options.forEach((opt) => {\n this.unTranslate(opt, opt, [\"text\"]);\n });\n\n return obj;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // Multiple select list\n if (this.settings.isMultiple == true) {\n let defaultVals = [];\n this.settings.multipleDefault.forEach((def) => {\n this.settings.options.forEach((opt) => {\n if (opt.id == def.text) {\n defaultVals.push(opt);\n }\n });\n });\n values[this.columnName] = defaultVals || [];\n }\n // Single select list\n else if (this.settings.default && this.settings.default != \"\") {\n values[this.columnName] = this.settings.default;\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n }\n\n /**\n * @method options\n * Return an array of [{ id, text }] options defined by this field.\n * @return {array}\n */\n options() {\n return this.settings.options.map((opt) => {\n return {\n id: opt.id,\n text: opt.text,\n hex: opt.hex ? opt.hex : \"\",\n translations: opt.translations ? opt.translations : \"\",\n };\n });\n }\n\n format(rowData, options = {}) {\n let val = this.dataValue(rowData) || [];\n\n if (typeof val == \"string\") {\n try {\n val = JSON.parse(val);\n } catch (e) {\n // continue regardless of error\n }\n }\n\n // Convert to array\n if (!Array.isArray(val)) val = [val];\n\n const displayOpts = this.settings.options\n .filter((opt) => val.filter((v) => (v.id || v) == opt.id).length > 0)\n .map((opt) => {\n let text = opt.text;\n const languageCode = options.languageCode || \"en\";\n\n // Pull text of option with specify language code\n const optTran = (opt.translations || []).filter(\n (o) => o.language_code == languageCode\n )[0];\n if (optTran) text = optTran.text;\n\n return text;\n });\n\n return displayOpts.join(\", \");\n }\n};\n","/*\n * ABFieldLongText\n *\n * An ABFieldLongText defines a LongText field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nconst MAX_CHAR_LENGTH = 5000;\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldLongTextDefaults = {\n key: \"LongText\", // unique key to reference this specific DataField\n\n description: \"Multiple lines of text\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"align-right\",\n // font-awesome icon reference. (without the 'fa-'). so 'align-right' to\n // reference 'fa-align-right'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Long text\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"longtext\", \"mediumtext\", \"text\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"text\", \"mediumtext\", \"longtext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n\n MAX_CHAR_LENGTH,\n // {integer}\n // The maximum length our ABFieldLongText can be.\n};\n\n// defaultValues: the keys must match a .name of your elements to set it's default value.\nconst defaultValues = {\n default: \"\",\n supportMultilingual: 0,\n};\n\nmodule.exports = class ABFieldLongText extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldLongTextDefaults);\n\n /*\n \t{\n\t\t\tsettings: {\n\t\t\t\tdefault: 'string',\n\t\t\t\tsupportMultilingual: 1/0\n\t\t\t}\n \t}\n \t*/\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldLongTextDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.default = values.settings.default || \"\";\n\n // we're responsible for setting up our specific settings:\n this.settings.supportMultilingual =\n values.settings.supportMultilingual + \"\" ||\n defaultValues.supportMultilingual;\n\n // text to Int:\n this.settings.supportMultilingual = parseInt(\n this.settings.supportMultilingual\n );\n\n if (this.settings.supportMultilingual) {\n if (this.object)\n this.object.translate(this.settings, this.settings, [\"default\"]);\n } else this.settings.default = values.settings.default || \"\";\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n const obj = super.toObj();\n\n if (this.settings.supportMultilingual)\n if (this.object)\n this.object.unTranslate(obj.settings, obj.settings, [\"default\"]);\n else obj.settings.default = this.settings.default;\n\n return obj;\n }\n\n /*\n * @property isMultilingual\n * does this field represent multilingual data?\n * @return {bool}\n */\n get isMultilingual() {\n return this.settings.supportMultilingual == 1;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n if (values[this.columnName] == null) {\n if (typeof this.settings.default == \"string\") {\n values[this.columnName] = this.settings.default;\n } else {\n values[this.columnName] = \"\";\n }\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n\n if (\n data &&\n data[this.columnName] &&\n data[this.columnName].length > MAX_CHAR_LENGTH\n ) {\n validator.addError(\n this.columnName,\n `should NOT be longer than ${MAX_CHAR_LENGTH} characters`\n );\n }\n }\n};\n","/*\n * ABFieldNumber\n *\n * An ABFieldNumber defines a Number field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nconst ABFieldNumberDefaults = {\n key: \"number\",\n // unique key to reference this specific DataField\n\n description: \"A Float or Integer Value\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"hashtag\",\n // font-awesome icon reference. (without the 'fa-'). so 'hashtag' to\n // reference 'fa-hashtag'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Number\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: true,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"number\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\n \"tinyint\",\n \"smallint\",\n \"mediumint\",\n \"int\",\n \"integer\",\n \"bigint\",\n \"decimal\",\n \"dec\",\n \"numeric\",\n \"fixed\",\n \"float\",\n \"real\",\n ],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n // 'allowRequired': 0,\n default: \"\",\n typeFormat: \"none\",\n typeDecimals: \"none\",\n typeDecimalPlaces: 0,\n typeRounding: \"none\",\n typeThousands: \"none\",\n validation: 0,\n validateMinimum: \"\",\n validateMaximum: \"\",\n};\n\nlet L = null; //AB.Label();\n\nmodule.exports = class ABFieldNumberCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldNumberDefaults);\n\n /*\n \t{\n\t\t\tsettings: {\n\t\t\t\t'allowRequired':0,\n\t\t\t\t'default':null,\n\t\t\t\t'typeFormat': 'none',\n\t\t\t\t'typeDecimals': 'none',\n\t\t\t\t'typeDecimalPlaces': 'none',\n\t\t\t\t'typeRounding' : 'none',\n\t\t\t\t'typeThousands': 'none',\n\t\t\t\t'validation':0,\n\t\t\t\t'validateMinimum':null,\n\t\t\t\t'validateMaximum':null\n\t\t\t}\n \t}\n \t*/\n if (!L) {\n L = this.AB.Label();\n }\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldNumberDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n static formatList(iL) {\n if (iL && !L) L = iL;\n return [\n { id: \"none\", value: L(\"None\") },\n {\n id: \"dollar\",\n value: L(\"$\"),\n sign: \"$\",\n position: \"prefix\",\n },\n {\n id: \"yen\",\n value: L(\"¥\"),\n sign: \"¥\",\n position: \"prefix\",\n },\n {\n id: \"pound\",\n value: L(\"£\"),\n sign: \"£\",\n position: \"prefix\",\n },\n {\n id: \"euroBefore\",\n value: L(\"€ (before)\"),\n sign: \"€\",\n position: \"prefix\",\n },\n {\n id: \"euroAfter\",\n value: L(\"€ (after)\"),\n sign: \"€\",\n position: \"postfix\",\n },\n {\n id: \"percent\",\n value: L(\"%\"),\n sign: \"%\",\n position: \"postfix\",\n },\n ];\n }\n\n static delimiterList() {\n return [\n { id: \"none\", value: L(\"None\") },\n {\n id: \"comma\",\n value: L(\"Comma\"),\n sign: \",\",\n },\n {\n id: \"period\",\n value: L(\"Period\"),\n sign: \".\",\n },\n {\n id: \"space\",\n value: L(\"Space\"),\n sign: \" \",\n },\n ];\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(values) {\n super.fromValues(values);\n\n // text to Int:\n // this.settings.allowRequired = parseInt(this.settings.allowRequired);\n this.settings.validation = parseInt(this.settings.validation);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // if no default value is set, then don't insert a value.\n if (this.settings.default != \"\") {\n values[this.columnName] = this.settings.default;\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n\n // const L = this.AB.Label();\n\n if (data[this.columnName] != null && data[this.columnName] != \"\") {\n let value = data[this.columnName];\n\n // if this is an integer:\n if (this.settings.typeDecimals == \"none\") {\n value = parseInt(value);\n } else {\n const places = parseInt(this.settings.typeDecimalPlaces) || 2;\n value = parseFloat(parseFloat(value).toFixed(places));\n }\n\n const isNumeric = (n) => {\n return !Number.isNaN(parseFloat(n)) && Number.isFinite(n);\n };\n if (!isNumeric(value)) {\n validator.addError(this.columnName, L(\"invalid number\"));\n }\n\n // validate Minimum\n if (\n this.settings.validation == true &&\n this.settings.validateMinimum != null &&\n this.settings.validateMinimum > value\n ) {\n const errMessage = L(\"should be greater than {0}\", [\n this.settings.validateMinimum,\n ]);\n\n validator.addError(this.columnName, errMessage);\n }\n\n // validate Maximum\n if (\n this.settings.validation == true &&\n this.settings.validateMaximum != null &&\n this.settings.validateMaximum < value\n ) {\n const errMessage = L(\"should be less than {0}\", [\n this.settings.validateMaximum,\n ]);\n\n validator.addError(this.columnName, errMessage);\n }\n }\n }\n\n format(rowData) {\n if (\n rowData?.[this.columnName] == null ||\n (rowData[this.columnName] !== 0 && rowData[this.columnName] == \"\")\n )\n return \"\";\n\n let data = rowData[this.columnName] || 0;\n\n if (typeof data == \"string\") {\n data = data.replace(/,/g, \"\");\n }\n\n // Validate number\n if (isNaN(parseFloat(data))) data = 0;\n\n const formatSign = this.constructor\n .formatList()\n .filter((item) => item.id == this.settings.typeFormat)[0];\n const decimalPlaces =\n this.settings.typeDecimalPlaces != \"none\"\n ? parseInt(this.settings.typeDecimalPlaces)\n : 0;\n\n let thousandsSign = this.constructor\n .delimiterList()\n .filter((item) => item.id == this.settings.typeThousands)[0];\n let decimalSign = this.constructor\n .delimiterList()\n .filter((item) => item.id == this.settings.typeDecimals)[0];\n let prefix = \"\";\n let postfix = \"\";\n\n if (formatSign && formatSign.sign) {\n switch (formatSign.position) {\n case \"prefix\":\n prefix = formatSign.sign;\n break;\n case \"postfix\":\n postfix = formatSign.sign;\n break;\n }\n }\n\n decimalSign = decimalSign.sign || \"\";\n thousandsSign = thousandsSign.sign || \"\";\n\n // round number\n if (this.settings.typeRounding == \"roundDown\") {\n const digit = Math.pow(10, decimalPlaces);\n data = Math.floor(data * digit) / digit;\n }\n\n const number = this.formatNumber(data, {\n groupDelimiter: thousandsSign,\n groupSize: 3,\n decimalDelimiter: decimalSign,\n decimalSize: decimalPlaces,\n });\n\n return `${prefix} ${number} ${postfix}`;\n }\n\n formatNumber(data, options = {}) {\n if (data === \"\" || data == null) return data;\n\n data = parseFloat(data);\n const negativeSign = data < 0 ? \"-\" : \"\";\n data = Math.abs(data);\n\n const dataStr = data.toString();\n const integerStr = dataStr.split(\".\")[0];\n const decimalStr = dataStr.split(\".\")[1];\n\n let integerValue = \"\";\n\n // Thousands digit sign\n if (options.groupDelimiter) {\n const step = 3;\n let i = integerStr.length;\n\n do {\n i -= step;\n const chunk =\n i > 0\n ? integerStr.substr(i, step)\n : integerStr.substr(0, step + i);\n integerValue = `${chunk}${\n integerValue ? options.groupDelimiter + integerValue : \"\"\n }`;\n } while (i > 0);\n } else {\n integerValue = integerStr;\n }\n\n // Integer\n let result = `${negativeSign}${integerValue}`;\n\n // Decimal\n if (decimalStr && options.decimalDelimiter && options.decimalSize) {\n const decimalVal = data.toFixed(options.decimalSize).split(\".\")[1];\n result += `${options.decimalDelimiter}${decimalVal}`;\n }\n\n return result;\n }\n\n getDecimalSize() {\n if (this.settings.typeDecimalPlaces != \"none\") {\n return parseInt(this.settings.typeDecimalPlaces);\n } else {\n return 0;\n }\n }\n};\n","/*\n * ABFieldString\n *\n * An ABFieldString defines a string field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nconst MAX_CHAR_LENGTH = 255;\n\nconst ABFieldStringDefaults = {\n key: \"string\",\n // unique key to reference this specific DataField\n\n description: \"short string value\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"font\",\n // font-awesome icon reference. (without the 'fa-'). so 'font' to\n // reference 'fa-font'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Single line text\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: true,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"char\", \"varchar\", \"tinytext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n\n MAX_CHAR_LENGTH,\n // {integer}\n // The maximum length our ABFieldString can be.\n};\n\nconst defaultValues = {\n default: \"\",\n supportMultilingual: 0,\n};\n\nmodule.exports = class ABFieldStringCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldStringDefaults);\n\n /*\n \t{\n\t\t\tsettings: {\n\t\t\t\tdefault: 'string',\n\t\t\t\tsupportMultilingual: 1/0\n\t\t\t}\n \t}\n */\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldStringDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // we're responsible for setting up our specific settings:\n this.settings.default = values.settings.default || defaultValues.default;\n this.settings.supportMultilingual =\n values.settings.supportMultilingual + \"\" ||\n defaultValues.supportMultilingual;\n\n // text to Int:\n this.settings.supportMultilingual = parseInt(\n this.settings.supportMultilingual\n );\n\n if (this.settings.supportMultilingual) {\n this.translate(this.settings, this.settings, [\"default\"]);\n } else this.settings.default = values.settings.default || \"\";\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n const obj = super.toObj();\n\n if (this.settings.supportMultilingual) {\n this.unTranslate(obj.settings, obj.settings, [\"default\"]);\n } else obj.settings.default = this.settings.default;\n\n return obj;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // if no default value is set, then don't insert a value.\n if (!values[this.columnName]) {\n // Set default string\n if (this.settings.default) {\n if (this.settings.default.indexOf(\"{uuid}\") >= 0) {\n values[this.columnName] = this.AB.uuid();\n } else {\n values[this.columnName] = this.settings.default;\n }\n }\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n\n if (data?.[this.columnName]?.length > MAX_CHAR_LENGTH) {\n const L = this.AB.Label();\n validator.addError(\n this.columnName,\n L(\"should NOT be longer than {0} characters\", [MAX_CHAR_LENGTH])\n );\n }\n }\n\n /*\n * @property isMultilingual\n * does this field represent multilingual data?\n * @return {bool}\n */\n get isMultilingual() {\n return this.settings.supportMultilingual == 1;\n }\n};\n","/*\n * ABFieldTextFormula\n *\n * An ABFieldTextFormula defines a TextFormula field type.\n *\n */\n\nconst ABField = require(\"../../platform/dataFields/ABField\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldTextFormulaDefaults = {\n key: \"TextFormula\",\n // unique key to reference this specific DataField\n\n description: \"Text Formula\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"question\",\n // font-awesome icon reference. (without the 'fa-'). so 'question' to\n // reference 'fa-question'\n\n isFilterable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Text Formula\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"text\", \"mediumtext\", \"longtext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\n// defaultValues: the keys must match a .name of your elements to set it's default value.\nconst defaultValues = {\n textFormula: \"\",\n // {string} \"some text or text with formula ...\"\n // This tells us what the formula we need to do with text included text string.\n // if we don't have this, the old value which we filled out won't be cleared when we do \"Add field\" this type again.\n\n // 'imageWidth':'',\n // 'useHeight': 0,\n // 'imageHeight': ''\n};\n\n/** Private methods */\n\n/**\n * @method setValueToFormula\n *\n * @param {ABOBject} object\n * @param {string} formulaString\n * @param {object} rowData\n */\n\nfunction setValueToFormula(object, formulaString, rowData) {\n if (!formulaString) return;\n\n const fieldRegExp = /{[^{}]+}/gm;\n const matches_field_array = formulaString.match(fieldRegExp);\n matches_field_array.forEach((element) => {\n const columnName = element.replace(/{|}|\"/g, \"\");\n object.fields().forEach((field) => {\n if (field.columnName == columnName) {\n if (field.key == \"AutoIndex\") {\n //Check AutoIndex Field\n const autoIndexVal = field.format(rowData) || 0;\n formulaString = formulaString.replace(element, autoIndexVal);\n } else if (field.key == \"calculate\") {\n //Calculate Field\n const calVal = `(${field.format(rowData) || 0})`;\n formulaString = formulaString.replace(element, eval(calVal));\n } else if (field.key == \"date\") {\n formulaString = formulaString.replace(\n element,\n rowData[columnName]\n ? field.exportValue(rowData[columnName])\n : \"\"\n );\n } else {\n \n formulaString = formulaString.replace(\n element,\n // support normal field and connect field\n (rowData[columnName] || rowData[field.relationName?.()])\n ? field.format(rowData)\n : \"\"\n );\n }\n }\n });\n });\n\n return formulaString;\n}\n\n/**\n * @method setBuildinValueToFormula\n *\n * @param {ABFactory} AB\n * @param {string} formulaString\n */\n\nfunction setBuildinValueToFormula(AB, formulaString) {\n const buildInRegExp = /\\w+\\(.*?\\)/gm;\n const matches_buildin_array = formulaString.match(buildInRegExp);\n if (matches_buildin_array) {\n const buildinList = getBuildInFunction();\n matches_buildin_array.forEach((element) => {\n const formula_array = element.split(/\\(|\\)/);\n const isBracketInBracket =\n formula_array.length > 2 && formula_array[2] != \"\";\n const functionName = formula_array[0];\n const parameters_array = formula_array[1].split(\",\");\n let isMatch = false;\n for (let i = 0; i < buildinList.length; i++) {\n let resultParameters = element;\n if (functionName == buildinList[i].id) {\n if (parameters_array.length == buildinList[i].parameter_size) {\n switch (functionName) {\n case \"left\":\n resultParameters = getLeft(\n parameters_array[0],\n parameters_array[1]\n );\n break;\n case \"right\":\n resultParameters = getRight(\n parameters_array[0],\n parameters_array[1]\n );\n break;\n case \"mid\":\n resultParameters = getMid(\n parameters_array[0],\n parameters_array[1],\n parameters_array[2]\n );\n break;\n case \"trim\":\n resultParameters = getTrim(parameters_array[0]);\n break;\n case \"trimLeft\":\n resultParameters = getTrimLeft(parameters_array[0]);\n break;\n case \"trimRight\":\n resultParameters = getTrimRight(parameters_array[0]);\n break;\n case \"length\":\n resultParameters = getLength(parameters_array[0]);\n break;\n case \"regexReplace\":\n resultParameters = getRegExpReplace(\n parameters_array[0],\n parameters_array[1].trimLeft(),\n parameters_array[2].trimLeft()\n );\n break;\n case \"extractRegex\":\n resultParameters = getExtractRegex(\n parameters_array[0],\n parameters_array[1].trimLeft()\n );\n break;\n case \"replace\":\n resultParameters = getReplace(\n parameters_array[0],\n parameters_array[1].trimLeft(),\n parameters_array[2].trimLeft()\n );\n break;\n case \"lower\":\n resultParameters = getLower(parameters_array[0]);\n break;\n case \"upper\":\n resultParameters = getUpper(parameters_array[0]);\n break;\n case \"capitalize\":\n resultParameters = getCapitalize(parameters_array[0]);\n break;\n case \"random\":\n resultParameters = getRandom(parameters_array[0]);\n break;\n case \"numberToWords\":\n resultParameters = getNumberToWords(\n parameters_array[0]\n );\n break;\n case \"getDateDayOfWeekName\":\n if (isBracketInBracket) {\n element = element + \")\";\n }\n resultParameters = getDateDayOfWeekName(\n AB,\n parameters_array[0]\n );\n break;\n case \"getDateMonthOfYearName\":\n if (isBracketInBracket) {\n element = element + \")\";\n }\n resultParameters = getDateMonthOfYearName(\n AB,\n parameters_array[0]\n );\n break;\n case \"formatDate\":\n resultParameters = getFormatDate(\n parameters_array[0],\n parameters_array[1].trimLeft()\n );\n break;\n default:\n break;\n }\n isMatch = true;\n formulaString = formulaString.replace(\n element,\n resultParameters\n );\n return;\n } else {\n resultParameters = functionName + \"(Bad Parameter)\";\n formulaString = formulaString.replace(\n element,\n resultParameters\n );\n }\n }\n }\n });\n }\n return formulaString;\n}\n\nfunction getBuildInFunction() {\n const functionList = [\n {\n id: \"left\",\n value: \"left({COLUMN_NAME}, 1)\",\n type: \"build-in\",\n parameter_size: 2,\n },\n {\n id: \"right\",\n value: \"right({COLUMN_NAME}, 1)\",\n type: \"build-in\",\n parameter_size: 2,\n },\n {\n id: \"mid\",\n value: \"mid({COLUMN_NAME}, 1, 1)\",\n type: \"build-in\",\n parameter_size: 3,\n },\n {\n id: \"trim\",\n value: \"trim({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"trimLeft\",\n value: \"trimLeft({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"trimRight\",\n value: \"trimRight({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"length\",\n value: \"length({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"regexReplace\",\n value: \"regexReplace({COLUMN_NAME}, [*], REPLACE_VALUE)\",\n type: \"build-in\",\n parameter_size: 3,\n },\n {\n id: \"extractRegex\",\n value: \"extractRegex({COLUMN_NAME}, [*])\",\n type: \"build-in\",\n parameter_size: 2,\n },\n {\n id: \"replace\",\n value: \"replace({COLUMN_NAME}, SEARCH_VALUE, REPLACE_VALUE)\",\n type: \"build-in\",\n parameter_size: 3,\n },\n {\n id: \"lower\",\n value: \"lower({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"upper\",\n value: \"upper({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"capitalize\",\n value: \"capitalize({COLUMN_NAME})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n { id: \"random\", value: \"random(1)\", type: \"build-in\", parameter_size: 1 },\n {\n id: \"numberToWords\",\n value: \"numberToWords({NUMBER_COLUMN} or 012...)\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"getDateDayOfWeekName\",\n value: \"getDateDayOfWeekName({DATE_COLUMN})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"getDateMonthOfYearName\",\n value: \"getDateMonthOfYearName({DATE_COLUMN})\",\n type: \"build-in\",\n parameter_size: 1,\n },\n {\n id: \"formatDate\",\n value: \"formatDate({DATE_COLUMN}, OUTPUT_FORMAT)\",\n type: \"build-in\",\n parameter_size: 2,\n },\n ];\n return functionList;\n}\n\nfunction getLeft(string, endPosition) {\n return string.substring(0, parseInt(endPosition));\n}\n\nfunction getRight(string, endposition) {\n const reverseStr = reverseString(string).substring(0, parseInt(endposition));\n return reverseString(reverseStr);\n}\n\nfunction reverseString(string) {\n return string.split(\" \").reverse().join(\" \");\n}\n\nfunction getMid(string, startPosition, length) {\n if (string.length < startPosition) return \"mid(Bad Parameter)\";\n return string.substring(\n parseInt(startPosition),\n parseInt(startPosition) + parseInt(length)\n );\n}\n\nfunction getTrim(string) {\n return string.trim();\n}\n\nfunction getTrimLeft(string) {\n return string.trimLeft();\n}\n\nfunction getTrimRight(string) {\n return string.trimRight();\n}\n\nfunction getLength(string) {\n return string.length;\n}\n\nfunction getRegExpReplace(string, regexp, replaceString) {\n return string.replace(regexp, replaceString);\n}\n\nfunction getExtractRegex(string, regexp) {\n const extractResult = string.match(regexp);\n if (Array.isArray(extractResult)) {\n return extractResult[0];\n }\n return extractResult;\n}\n\nfunction getReplace(string, searchValue, replaceValue) {\n return string.replace(searchValue, replaceValue);\n}\n\nfunction getLower(string) {\n return string.toLowerCase();\n}\n\nfunction getUpper(string) {\n return string.toUpperCase();\n}\n\nfunction getCapitalize(string) {\n return string\n .toLowerCase()\n .split(\" \")\n .map((s) => s.charAt(0).toUpperCase() + s.substring(1))\n .join(\" \");\n}\n\nfunction getRandom(max) {\n return Math.floor(Math.random() * (max + 1));\n}\n\nfunction getNumberToWords(number) {\n const string = number.trim(\",\").toString();\n\n let units,\n tens,\n scales,\n start,\n end,\n chunks,\n chunksLen,\n chunk,\n ints,\n i,\n word,\n words;\n\n const and = \"\";\n\n /* Is number zero? */\n if (parseInt(string) === 0) {\n return \"zero\";\n }\n\n /* Array of units as words */\n units = [\n \"\",\n \"one\",\n \"two\",\n \"three\",\n \"four\",\n \"five\",\n \"six\",\n \"seven\",\n \"eight\",\n \"nine\",\n \"ten\",\n \"eleven\",\n \"twelve\",\n \"thirteen\",\n \"fourteen\",\n \"fifteen\",\n \"sixteen\",\n \"seventeen\",\n \"eighteen\",\n \"nineteen\",\n ];\n\n /* Array of tens as words */\n tens = [\n \"\",\n \"\",\n \"twenty\",\n \"thirty\",\n \"forty\",\n \"fifty\",\n \"sixty\",\n \"seventy\",\n \"eighty\",\n \"ninety\",\n ];\n\n /* Array of scales as words */\n scales = [\n \"\",\n \"thousand\",\n \"million\",\n \"billion\",\n \"trillion\",\n \"quadrillion\",\n \"quintillion\",\n \"sextillion\",\n \"septillion\",\n \"octillion\",\n \"nonillion\",\n \"decillion\",\n \"undecillion\",\n \"duodecillion\",\n \"tredecillion\",\n \"quatttuor-decillion\",\n \"quindecillion\",\n \"sexdecillion\",\n \"septen-decillion\",\n \"octodecillion\",\n \"novemdecillion\",\n \"vigintillion\",\n \"centillion\",\n ];\n\n /* Split user arguemnt into 3 digit chunks from right to left */\n start = string.length;\n chunks = [];\n while (start > 0) {\n end = start;\n chunks.push(string.slice((start = Math.max(0, start - 3)), end));\n }\n\n /* Check if function has enough scale words to be able to stringify the user argument */\n chunksLen = chunks.length;\n if (chunksLen > scales.length) {\n return \"\";\n }\n\n /* Stringify each integer in each chunk */\n words = [];\n for (i = 0; i < chunksLen; i++) {\n chunk = parseInt(chunks[i]);\n\n if (chunk) {\n /* Split chunk into array of individual integers */\n ints = chunks[i].split(\"\").reverse().map(parseFloat);\n\n /* If tens integer is 1, i.e. 10, then add 10 to units integer */\n if (ints[1] === 1) {\n ints[0] += 10;\n }\n\n /* Add scale word if chunk is not zero and array item exists */\n if ((word = scales[i])) {\n words.push(word);\n }\n\n /* Add unit word if array item exists */\n if ((word = units[ints[0]])) {\n words.push(word);\n }\n\n /* Add tens word if array item exists */\n if ((word = tens[ints[1]])) {\n words.push(word);\n }\n\n /* Add 'and' string after units or tens integer if: */\n if (ints[0] || ints[1]) {\n /* Chunk has a hundreds integer or chunk is the first of multiple chunks */\n if (ints[2] || (!i && chunksLen)) {\n words.push(and);\n }\n }\n\n /* Add hundreds word if array item exists */\n if ((word = units[ints[2]])) {\n words.push(word + \" hundred\");\n }\n }\n }\n\n return words.reverse().join(\" \");\n}\n\nfunction getDateDayOfWeekName(AB, date) {\n // const localizeDT = moment(date);\n // localizeDT.locale(AD.lang.currentLanguage);\n // return localizeDT.format(\"dddd\");\n\n return AB.rules.toDateFormat(date, {\n format: \"dddd\",\n localeCode: AB.Account.language(),\n });\n}\n\nfunction getDateMonthOfYearName(AB, date) {\n // const localizeDT = moment(date);\n // localizeDT.locale(AD.lang.currentLanguage);\n // return localizeDT.format(\"MMMM\");\n\n return AB.rules.toDateFormat(date, {\n format: \"MMMM\",\n localeCode: AB.Account.language(),\n });\n}\n\nfunction getFormatDate(date, format) {\n const dt = new Date(date);\n return dt.toString(format);\n}\n\nmodule.exports = class ABFieldTextFormulaCore extends ABField {\n constructor(values, object) {\n super(values, object, ABFieldTextFormulaDefaults);\n\n /*\n \t{\n\t\t\tsettings: {\n\t\t\t\ttextDefault: 'string',\n\t\t\t\tsupportMultilingual: true/false\n\t\t\t}\n \t}\n \t*/\n\n // // text to Int:\n // this.settings.supportMultilingual = parseInt(this.settings.supportMultilingual);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldTextFormulaDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n static getBuildInFunction() {\n return getBuildInFunction();\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // if no default value is set, then don't insert a value.\n if (!values[this.columnName]) {\n // Set default value\n // values[this.columnName] = this.settings.DEFAULT_VALUE;\n }\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n validator = super.isValid();\n\n // validator.addError(this.columnName, L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n /*\n * @property isMultilingual\n * does this field represent multilingual data?\n * @return {bool}\n */\n get isMultilingual() {\n // return this.settings.supportMultilingual == 1;\n return false;\n }\n\n format(rowData) {\n try {\n if (!this.settings.textFormula) return \"\";\n\n let resultFormula = this.settings.textFormula;\n\n //Set Field value first\n resultFormula = setValueToFormula(this.object, resultFormula, rowData);\n\n //then Check Build-in Function\n resultFormula = setBuildinValueToFormula(this.AB, resultFormula);\n\n return resultFormula;\n } catch (err) {\n return \"\";\n }\n }\n};\n\n//// NOTE: if you need a unique [edit_type] by your returned config.editor above:\n// webix.editors = {\n// \"[edit_type]\": {\n// focus: function () {...}\n// getValue: function () {...},\n// setValue: function (value) {...},\n// render: function () {...}\n// }\n// };\n\n//// NOTE: if you need a unique [sort_type] by your returned config.sort above:\n// webix.DataStore.prototype.sorting.as.[sort_type] = function(a,b){\n// return a > b ? 1 : -1;\n// }\n","/*\n * ABFieldTreeCore\n *\n * An ABFieldTree defines a select list field type.\n *\n */\n\nconst ABFieldSelectivity = require(\"../../platform/dataFields/ABFieldSelectivity\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldTreeDefaults = {\n key: \"tree\",\n // unique key to reference this specific DataField\n\n description:\n \"Data tree allows you to build a hierarchical set of selectable data. (ex: Categories and sub-categories)\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"sitemap\",\n // font-awesome icon reference. (without the 'fa-'). so 'sitemap' to\n // reference 'fa-sitemap'\n\n isFilterable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: false,\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"Data Tree\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: false,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"text\", \"mediumtext\", \"longtext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n};\n\nconst defaultValues = {\n options: [],\n};\n\nmodule.exports = class ABFieldTreeCore extends ABFieldSelectivity {\n constructor(values, object) {\n super(values, object, ABFieldTreeDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldTreeDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // translate options list\n if (this.settings.options && this.settings.options.length > 0) {\n this.settings.options.forEach((opt) => {\n this.translate(opt, opt, [\"text\"]);\n });\n }\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n const obj = super.toObj();\n\n // Un-translate options list\n if (obj.settings.options && obj.settings.options.length > 0) {\n obj.settings.options.forEach((opt) => {\n this.unTranslate(opt, opt, [\"text\"]);\n });\n }\n\n return obj;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {}\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n }\n};\n","/*\n * ABFieldUser\n *\n * An ABFieldUser defines a user field type.\n *\n */\n\nconst ABFieldConnect = require(\"../../platform/dataFields/ABFieldConnect\");\n\nfunction L(key, altText) {\n // TODO:\n return altText; // AD.lang.label.getLabel(key) || altText;\n}\n\nconst ABFieldUserDefaults = {\n key: \"user\",\n // unique key to reference this specific DataField\n\n description: \"Add users to a record.\",\n // description: what gets displayed in the Editor description.\n // NOTE: this will be displayed using a Label: L(description)\n\n icon: \"user-o\",\n // font-awesome icon reference. (without the 'fa-'). so 'user-o' to\n // reference 'fa-user-o'\n\n isFilterable: true,\n // {bool} / {fn}\n // determines if the current ABField can be used to filter (FilterComplex\n // or Query) data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => field.setting.something == true\n\n isSortable: (field) => {\n if (field.settings.isMultiple) {\n return false;\n } else {\n return true;\n }\n },\n // {bool} / {fn}\n // determines if the current ABField can be used to Sort data.\n // if a {fn} is provided, it will be called with the ABField as a parameter:\n // (field) => true/false\n\n menuName: \"User\",\n // menuName: what gets displayed in the Editor drop list\n // NOTE: this will be displayed using a Label: L(menuName)\n\n supportRequire: false,\n // {bool}\n // does this ABField support the Required setting?\n\n supportUnique: false,\n // {bool}\n // does this ABField support the Unique setting?\n\n useAsLabel: true,\n // {bool} / {fn}\n // determines if this ABField can be used in the display of an ABObject's\n // label.\n\n compatibleOrmTypes: [\"string\"],\n // {array}\n // what types of Sails ORM attributes can be imported into this data type?\n // http://sailsjs.org/documentation/concepts/models-and-orm/attributes#?attribute-options\n\n compatibleMysqlTypes: [\"char\", \"varchar\", \"tinytext\"],\n // {array}\n // what types of MySql column types can be imported into this data type?\n // https://www.techonthenet.com/mysql/datatypes.php\n\n USERNAME_FIELD_ID: \"5760560b-c078-47ca-98bf-e18ac492a561\",\n // {string} .uuid\n // the ABField.id of the SiteUser.username field. This is what other\n // objects will link to in their ABFieldUser connections.\n};\n\nconst defaultValues = {\n editable: 1,\n isMultiple: 0,\n isCurrentUser: 0,\n isShowProfileImage: 0,\n isShowUsername: 1,\n};\n\nmodule.exports = class ABFieldUserCore extends ABFieldConnect {\n constructor(values, object) {\n super(values, object, ABFieldUserDefaults);\n\n this.isUser = true;\n // {bool}\n // is this an ABFieldUser type of field.\n // this is a simplified helper to identify if an ABField is a type\n // of User field. Since this is the only place it is defined,\n // all other field types will be falsy\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABFieldUserDefaults;\n }\n\n static defaultValues() {\n return defaultValues;\n }\n\n ///\n /// Instance Methods\n ///\n\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.editable = parseInt(this.settings.editable);\n this.settings.isMultiple = parseInt(this.settings.isMultiple);\n this.settings.isCurrentUser = parseInt(this.settings.isCurrentUser);\n this.settings.isShowProfileImage = parseInt(\n this.settings.isShowProfileImage\n );\n this.settings.isShowUsername = parseInt(this.settings.isShowUsername);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n format(rowData) {\n let val = this.dataValue(rowData) || [];\n\n if (val && !Array.isArray(val)) val = [val];\n if (!val) val = [];\n\n return val.map((v) => v.username || v).join(\", \");\n }\n};\n","/*\n * ABMobilePageCore\n *\n * An view that represents a \"Page\" on the Mobile Device.\n *\n * Pages are\n *\t- allowed to be displayed in the interface list\n *\t- return a full list of components that can be added to the view editor\n *\n *\n */\n\nconst ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n// var ABViewManager = require(\"../ABViewManager\");\n\n// function L(key, altText) {\n// return AD.lang.label.getLabel(key) || altText;\n// }\n\nconst ABMobilePageDefaults = {\n key: \"mobile-page\", // unique key identifier for this ABView\n icon: \"file\", // icon reference: (without 'fa-' )\n};\n\nconst ABPropertyComponentDefaults = {\n type: \"page\",\n // {string}\n // What type of \"Page\" this is: ['page', 'popup', 'reportPage']\n\n defaultPage: 0,\n // {bool} 1|0\n // is this the default page for the Mobile App? If so, this is the initial\n // Page that is displayed when the App is loaded.\n // NOTE: there can be only 1 page defined in the app as .defaultPage\n\n hideTitle: 0,\n // {bool} 1|0\n // By default we will display this.label as our Title. Set this to 1 to not\n // show the tile on the page.\n\n hideTabs: 0,\n // {bool} 1|0\n // By default, pages will show any Tab options on their display. Set this\n // to 1 to not show the tab options for this Page. (good for pages that\n // are linkedPages with forms )\n};\n\nmodule.exports = class ABMobilePageCore extends ABMobileView {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABMobilePageDefaults);\n\n // \t{\n // \t\tid:'uuid',\t\t\t\t\t// uuid value for this obj\n // \t\tkey:'viewKey',\t\t\t\t// unique key for this View Type\n // \t\ticon:'font',\t\t\t\t// fa-[icon] reference for an icon for this View Type\n\n //\t\tname: '',\t\t\t\t\t// unique page name\n\n // \t\tlabel:'',\t\t\t\t\t// pulled from translation\n\n //\t\tsettings: {\t\t\t\t\t// unique settings for the type of field\n //\t\t},\n\n //\t\ttranslations:[]\n // \t}\n\n this.parent = null; // will be set by the pageNew() that creates this obj.\n // {obj} .parent\n // this points to the ABView object that manages this object as a child.\n // this param is shared across ABViews as well as ABMobilePage, but has\n // different implications ... so we default an ABMobilePage.parent = null\n // and the place that Creates the Page must assign the .parent externally.\n }\n\n static common() {\n return ABMobilePageDefaults;\n }\n\n static defaultValues() {\n return ABPropertyComponentDefaults;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABMobilePage instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n var obj = super.toObj();\n\n obj.name = this.name;\n obj.route = this.route;\n\n obj.myAppID = this.myAppID;\n\n obj.menuType = this.menuType;\n\n obj.defaultPage = this.defaultPage;\n\n // icon of popup page\n if (this.settings.type == \"popup\") obj.icon = \"clone\";\n\n // set label of the page\n if (!this.label || this.label == \"?label?\") obj.label = obj.name;\n\n // compile our pages\n obj.pageIDs = (this._pages || []).map((p) => p.id);\n\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n const DV = ABPropertyComponentDefaults;\n\n this.route =\n values.route || (this.name || this.label).replaceAll(\" \", \"_\");\n\n // icon of popup page\n if (values.settings.type == \"popup\") this.icon = \"clone\";\n\n // set label of the page\n if (!this.label || this.label == \"?label?\") this.label = this.name;\n\n // track which application this Page belongs to:\n this.myAppID = values.myAppID;\n if (!this.myAppID && this.application) {\n this.myAppID = this.application.id;\n }\n\n this.menuType = values.menuType || \"menu\";\n // {string} [\"menu\", \"tab\"]\n // indicates if this Page was added as a Mobile App's \"menu\" or \"Tab\"\n\n this.defaultPage = values.defaultPage || 0;\n // {bool} 1|0\n // indicates if this is the default page that is loaded when the mobile app\n // is started.\n // NOTE: only 1 Page in a Mobile App can have this setting = 1.\n\n this.settings.hideTitle = parseInt(\n values.settings.hideTitle ?? DV.hideTitle\n );\n // {bool} 1|0\n // By default an ABMobilePage will display it's this.label for a title\n // on the page. Setting this to TRUE (1) will hide the title.\n\n this.settings.hideTabs = parseInt(\n values.settings.hideTabs ?? DV.hideTabs\n );\n // {bool} 1|0\n // By default, pages will show any Tab options on their display. Set this\n // to 1 to not show the tab options for this Page. (good for pages that\n // are linkedPages with forms )\n\n // now properly handle our sub pages.\n var pages = [];\n (values.pageIDs || []).forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (def) {\n pages.push(this.pageNew(def));\n } else {\n this.emit(\n \"warning\",\n `App[${this.application.name}][${this.application.id}]->Page[${this.name}][${this.id}] referenced an unknown Page[${id}]`,\n {\n appID: this.application.id,\n pageID: this.id,\n missingPageID: id,\n }\n );\n }\n });\n this._pages = pages;\n\n // the default columns of ABView is 1\n // this.settings.columns = this.settings.columns || 1;\n // this.settings.gravity = this.settings.gravity || [1];\n\n // convert from \"0\" => 0\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABApplication\n *\n * also remove it from our _AllApplications\n *\n * @return {Promise}\n */\n destroy() {\n return Promise.resolve()\n .then(() => {\n // When deleting an ABMobilePage\n // be sure to remove any of it's ABMobilePage as well\n // This cleans out any dangling ABDefinitions\n\n var allPageDeletes = [];\n var allPages = this.pages();\n this._pages = [];\n // doing ._pages = [] prevents any of my updates when\n // a sub-page is .destroy()ed\n\n allPages.forEach((p) => {\n allPageDeletes.push(p.destroy());\n });\n return Promise.all(allPageDeletes);\n })\n .then(() => {\n var parent = this.parent || this.application;\n\n return parent.pageRemove(this);\n })\n .then(() => {\n return super.destroy();\n });\n }\n\n /**\n * @method save()\n * persist this instance of ABMobilePage\n * @return {Promise}\n * .resolve( {this} )\n */\n save() {\n return Promise.resolve()\n .then(() => {\n // this creates our .id\n return super.save();\n })\n .then(() => {\n // now we can persist ourself in our parent\n var parent = this.parent || this.application;\n\n return parent.pageInsert(this);\n })\n .then(() => {\n // make sure .defaultPage is properly set\n if (this.defaultPage) {\n return this.application.setPageDefault(this);\n }\n })\n .then(() => {\n return this;\n });\n }\n\n /**\n * @method refreshInstance()\n * This returns a NEW instance of a ABMobilePage based upon the latest\n * version of it's Definition. It also resolves any current listeners\n * this copy currently has and prepare this to discard itself.\n */\n refreshInstance() {\n console.warn(\n \"This version of ABMobilePage hasn't updated it's refreshInstance()\",\n this\n );\n return this;\n }\n\n ///\n /// Pages\n ///\n\n /**\n * @method pages()\n *\n * return an array of all the ABMobilePages for this ABMobilePage.\n *\n * @param {fn} filter\t\ta filter fn to return a set of ABMobilePages that this fn\n *\t\t\t\t\t\t\treturns true for.\n * @param {boolean} deep\tflag to find in sub pages\n *\n * @return {array}\t\t\tarray of ABMobilePages\n */\n pages(filter = () => true, deep = false) {\n var result = [];\n\n // find into sub-pages recursively\n if (filter && deep) {\n // if (this._pages && this._pages.length > 0) {\n // result = this._pages.filter(filter);\n\n // if (result.length < 1) {\n // this._pages.forEach((p) => {\n // var subPages = p.pages(filter, deep);\n // if (subPages && subPages.length > 0) {\n // result = subPages;\n // }\n // });\n // }\n // }\n result = this.application._searchDeep(this, \"_pages\", filter);\n }\n // find root pages\n else {\n result = this._pages.filter(filter);\n }\n\n return result;\n }\n\n /**\n * @method pageInsert()\n *\n * save the given ABMobilePage in our ._pages array and persist the current\n * values if they changed.\n *\n * @param {ABMobilePage} page The instance of the page to save.\n * @return {Promise}\n */\n pageInsert(page) {\n var isIncluded = this.pages((o) => o.id === page.id).length > 0;\n if (!isIncluded) {\n // if not already included, then add and save the Obj definition:\n this._pages.push(page);\n return this.save();\n }\n\n // Nothing was required so return\n return Promise.resolve();\n }\n\n /**\n * @method pageNew()\n *\n * return an instance of a new (unsaved) ABMobilePage that is tied to this\n * ABMobilePage.\n *\n * NOTE: this new page is not included in our this.pages until a .save()\n * is performed on the page.\n *\n * @return {ABMobilePage}\n */\n pageNew(values) {\n // make sure this is an ABMobilePage description\n values.key = ABMobilePageDefaults.key;\n\n // NOTE: this returns a new ABView component.\n // when creating a new page, the 3rd param should be null, to signify\n // the top level component.\n var page = this.application.viewNew(values, this.application, null);\n page.parent = this;\n return page;\n }\n\n /**\n * @method pageRemove()\n *\n * remove the given ABMobilePage from our ._pages array and persist the current\n * values.\n *\n * @param {ABMobilePage} page The instance of the page to remove.\n * @return {Promise}\n */\n pageRemove(page) {\n var origLen = this._pages.length;\n this._pages = this.pages((p) => p.id != page.id);\n\n if (this._pages.length < origLen) {\n return this.save();\n }\n\n // if we get here, then nothing changed so nothing to do.\n return Promise.resolve();\n }\n\n updateIcon(obj) {\n // icon of page\n if (obj.settings.type == \"popup\") {\n obj.icon = \"clone\";\n } else {\n obj.icon = ABMobilePageDefaults.icon;\n }\n return obj;\n }\n\n /**\n * @method clone()\n * clone the defintions of this ABMobilePage object.\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @return {obj}\n * defs of the copied ABView\n */\n clone(lookUpIds, parent) {\n // initial new ids of pages and components\n if (lookUpIds == null) {\n // create a hash of { oldID : newID } of any sub Pages and Views.\n lookUpIds = {};\n\n let mapNewIdFn = (currView) => {\n if (!lookUpIds[currView.id])\n lookUpIds[currView.id] = this.AB.uuid();\n\n if (currView.pages) {\n currView.pages().forEach((p) => mapNewIdFn(p));\n }\n\n if (currView.views) {\n currView.views().forEach((v) => mapNewIdFn(v));\n }\n };\n\n // start map new ids\n mapNewIdFn(this);\n }\n\n // copy\n let result = super.clone(lookUpIds, parent);\n\n // page's name should not be duplicate\n result.name = null;\n\n return result;\n }\n\n /**\n * @method copy()\n * create a new copy of this ABMobilePage object. The resulting ABView should\n * be identical in settings and all sub pages/views, but each new object\n * is a unique view (different ids).\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @return {Promise}\n * .resolved with the instance of the copied ABView\n */\n copy(lookUpIds, parent, options) {\n // initial new ids of pages and components\n if (lookUpIds == null) {\n // create a hash of { oldID : newID } of any sub Pages and Views.\n lookUpIds = {};\n\n let mapNewIdFn = (currView) => {\n if (!lookUpIds[currView.id])\n lookUpIds[currView.id] = this.AB.uuid();\n\n if (currView.pages) {\n currView.pages().forEach((p) => mapNewIdFn(p));\n }\n\n if (currView.views) {\n currView.views().forEach((v) => mapNewIdFn(v));\n }\n };\n\n // start map new ids\n mapNewIdFn(this);\n }\n\n // now continue with the default .copy()\n return super.copy(lookUpIds, parent, options);\n }\n};\n","/*\n * ABViewCore\n *\n * ABViewCore defines the common ABView structure that is shared between\n * the client and the server. Mostly how it manages it's internal data, and\n * how it is related to the ABView classes.\n *\n */\n\nvar ABMLClass = require(\"../../platform/ABMLClass\");\n\nconst ABMobileViewDefaults = {\n key: \"mobile-view\", // {string} unique key for this view\n icon: \"window-maximize\", // {string} fa-[icon] reference for this view\n labelKey: \"view\", // {string} the multilingual label key for the class label\n tabicon: \"\", // no default tab icons\n};\n\nconst ABViewPropertyComponentDefaults = {\n label: \"\",\n};\n\nmodule.exports = class ABMobileViewCore extends ABMLClass {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super([\"label\"], application.AB);\n\n this.__events = [];\n // keep track of any event listeners attached to this ABView object\n\n this.defaults = defaultValues || ABMobileViewDefaults;\n\n this.application = application;\n\n this.parent = parent || null;\n\n this.warningsSilent = false;\n // {bool}\n // Should we suppress our configuration warnings?\n\n this.__missingViews = [];\n // {array}\n // Any ABView.id we have stored that we can't find.\n\n this.fromValues(values);\n }\n\n static common() {\n return ABMobileViewDefaults;\n }\n\n static defaultValues() {\n return ABViewPropertyComponentDefaults;\n }\n\n /**\n * @method newInstance()\n * return a new instance of this ABView. Most likely called from interfaces\n * that create new UI elements like the ABDesigner.\n * @param {ABApplication} application \t: the root ABApplication this view is under\n * @param {ABView/ABApplication} parent\t: the parent object of this ABView.\n * @return {ABView}\n */\n static newInstance(application, parent) {\n // return a new instance from ABViewManager:\n return application.viewNew(\n { key: this.common().key },\n application,\n parent\n );\n }\n\n viewKey() {\n return this.defaults.key;\n }\n\n viewIcon() {\n return this.defaults.icon;\n }\n\n tabIcon() {\n return this.defaults.tabicon;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABView instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n // MLClass translation\n var obj = super.toObj();\n\n var result = {\n id: this.id,\n type: this.type || this.viewKey(),\n key: this.key,\n icon: this.icon,\n tabicon: this.tabicon,\n name: this.name,\n settings: this.AB.cloneDeep(this.settings || {}),\n // accessLevels: this.accessLevels,\n translations: obj.translations,\n };\n\n // encode our child view references\n result.viewIDs = (this._views || []).map((v) => v.id).filter((id) => id);\n result.viewIDs = result.viewIDs.concat(this.__missingViews);\n\n if (this.position) result.position = this.position;\n\n // encode our .isRoot() reference.\n // (NOTE: this is set so our server side code can distinguish) between a .view\n // and a root page:\n // NOTE: we intentionally do NOT pull this out in .fromValues()\n result.isRoot = this.isRoot();\n\n return result;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n this.id = values.id; // NOTE: only exists after .save()\n // {string} .id\n // the uuid of this ABObject Definition.\n\n this.type = values.type || this.viewKey();\n // {string} .type\n // the type of ABDefinition this is.\n\n this.key = values.key || this.viewKey();\n // {string} .key\n // the unique lookup key for our ABViewManager to create new\n // instances of this object.\n\n this.icon = values.icon || this.viewIcon();\n // {string} .icon\n // the font awesome icon reference for showing an icon for this\n // view in the AppBuilder interface builder.\n\n this.tabicon = values.tabicon || this.tabIcon();\n\n this.name = values.name;\n // {string} .name\n // A name reference for this ABView. This is a reference that isn't\n // translateable and will be used for lookups across languages.\n\n // if this is being instantiated on a read from the Property UI,\n // .label is coming in under .settings.label\n values.settings = values.settings || {};\n this.label = values.label || values.settings.label || \"?label?\";\n\n this.settings = values.settings || {};\n // {obj} .settings\n // the property settings for this ABView\n\n // make sure .settings.height is an int and not a string\n this.settings.height = parseInt(this.settings.height || 0);\n\n // this.accessLevels = values.accessLevels || {};\n // {obj} .accessLevels\n // Hash: { ABRole.id : accessLevel }\n // tracks the Role -> AccessLevel settings of this particular\n // view.\n // accessLevel: 0 : no access, 1 : view only, 2: full access\n\n // let the MLClass now process the translations:\n super.fromValues(values);\n\n // If the View / DataCollection does not have a .name already,\n // use the English label translation as the .name instead.\n if (!this.name && Array.isArray(this.translations)) {\n for (var i = 0; i < this.translations.length; i++) {\n if (i == 0) {\n // Use the first label found, in case there is no 'en'\n this.name = this.translations[i].label;\n }\n if (this.translations[i].language_code == \"en\") {\n // But the 'en' label will have final priority\n this.name = this.translations[i].label;\n break;\n }\n }\n }\n\n // default value for our label\n if (this.label == \"?label?\") {\n if (this.parent) {\n this.label =\n this.parent.label +\n \".\" +\n (this.field?.()?.columnName ?? this.defaults.key);\n }\n }\n\n var views = [];\n this.__missingViews = this.__missingViews || [];\n (values.viewIDs || []).forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (def) {\n views.push(this.application.viewNew(def, this.application, this));\n } else {\n this.__missingViews.push(id);\n }\n });\n this._views = views;\n\n this.position = values.position || {};\n\n if (this.position.x != null) this.position.x = parseInt(this.position.x);\n if (this.position.y != null) this.position.y = parseInt(this.position.y);\n\n this.position.dx = parseInt(this.position.dx || 1);\n this.position.dy = parseInt(this.position.dy || 1);\n }\n\n isRoot() {\n return this.parent == null || this.parent == this.application;\n }\n\n /**\n * @method allParents()\n * return a flattened array of all the ABViews parents\n * @return {array} array of ABViews\n */\n allParents() {\n var parents = [];\n var curView = this;\n\n // add current view to array\n parents.unshift(curView);\n\n while (!curView.isRoot() && curView.parent) {\n parents.unshift(curView.parent);\n\n curView = curView.parent;\n }\n\n return parents;\n }\n\n /**\n * @method isAccessibleForRoles()\n * return true/false if this ABViewPage is accessible for one of the\n * passed in ABRoles.\n * @param {array[ABRole]} roles\n * an array of {ABRole} instances.\n * @return {bool}\n */\n // isAccessibleForRoles(roles) {\n // var foundRole = false;\n\n // var accessibleRoles = Object.keys(this.accessLevels) || [];\n // (roles || []).forEach((r) => {\n // if (accessibleRoles.indexOf(r.uuid || r) > -1) {\n // foundRole = true;\n // }\n // });\n\n // return foundRole;\n // }\n\n /**\n * @method getUserAccess()\n *\n * return the access level of the current user on the current view\n *\n * @return {integer} // 0 = No Access // 1 = Read Only // 2 = Full Access\n */\n // getUserAccess() {\n // // by default everyone has no access\n // var accessLevel = 0;\n\n // if (this.application.isAccessManaged) {\n // // check to see if the current users is the access manager\n // var isAccessManager = false;\n // // first check if manager is defined by their role\n // if (parseInt(this.application.accessManagers.useRole) == 1) {\n // // if so check if any of the user's role match the managers\n // this.AB.Account.roles().forEach((role) => {\n // if (\n // this.application.accessManagers.role.indexOf(\n // role.id || role.uuid\n // ) > -1\n // ) {\n // // if so set the access level to full access\n // isAccessManager = true;\n // accessLevel = 2;\n // }\n // });\n // }\n // // if the user isn't already set as the manager and the manager is defined by their account\n // if (\n // !isAccessManager &&\n // parseInt(this.application.accessManagers.useAccount) == 1\n // ) {\n // // check if the user's account matches the managers\n // if (\n // this.application.accessManagers.account.indexOf(\n // this.AB.Account.uuid() + \"\"\n // ) > -1\n // ) {\n // // if so set the access level to full access\n // isAccessManager = true;\n // accessLevel = 2;\n // }\n // }\n\n // // if the user is not the manager check if the page has access levels defined for roles\n // if (\n // this.accessLevels &&\n // Object.keys(this.accessLevels).length > 0 &&\n // !isAccessManager\n // ) {\n // // check to see if the user's roles matches one of the roles defined\n // this.AB.Account.roles().forEach((role) => {\n // var currentRole = this.accessLevels[role.id || role.uuid];\n // if (currentRole && parseInt(currentRole) > accessLevel)\n // // if the access level is higher than a previous role set to the new level\n // accessLevel = parseInt(currentRole);\n // });\n // }\n // } else {\n // accessLevel = 2;\n // }\n\n // return accessLevel;\n // }\n\n /**\n * @method parentFormComponent\n * return the closest form object this component is on.\n */\n parentFormComponent() {\n var form = null;\n\n var curr = this;\n while (curr.key != \"mobile-form\" && !curr.isRoot() && curr.parent) {\n curr = curr.parent;\n }\n\n if (curr.key == \"mobile-form\") {\n form = curr;\n }\n\n return form;\n }\n\n /**\n * @method parentDetailComponent\n * return the closest detail object that this component is on.\n * @returns {ABViewDetail} detail component\n */\n parentDetailComponent() {\n var detail = null;\n\n var curr = this;\n while (curr.key != \"mobile-detail\" && !curr.isRoot() && curr.parent) {\n curr = curr.parent;\n }\n\n if (curr.key == \"mobile-detail\") {\n detail = curr;\n }\n\n return detail;\n }\n\n pageParent(filterFn) {\n if (filterFn == null) filterFn = () => true;\n\n // if current page is the root page, then return itself.\n if (this.isRoot()) {\n return this;\n }\n\n var parentPage = this.parent;\n while (\n parentPage &&\n (parentPage.key != \"mobile-page\" || !filterFn(parentPage))\n ) {\n parentPage = parentPage.parent;\n }\n\n return parentPage;\n }\n\n pageRoot() {\n var rootPage = this.pageParent();\n\n while (!rootPage.isRoot()) {\n rootPage = rootPage.pageParent();\n }\n\n return rootPage;\n }\n\n /**\n * @property datacollection\n * return data source\n *\n * @return {ABDataCollection}\n */\n get datacollection() {\n let dataviewID = (this.settings || {}).dataviewID;\n if (!dataviewID) {\n if (\n [\n \"mobile-form\",\n \"grid\",\n \"line\",\n \"area\",\n \"bar\",\n \"gantt\",\n \"kanban\",\n ].indexOf(this.key) > -1\n ) {\n // NOTE: ignore kanban side forms where this is the case:\n if (this.key == \"mobile-form\" && this._currentObject) return null;\n\n if (this.warningsSilent) return null;\n\n var errNoDCID = new Error(\n `ABViewCore:get datacollection(): View[${this.key}] didn't define a dataviewID.`\n );\n this.AB.notify.builder(errNoDCID, {\n view: this,\n settings: this.settings,\n });\n } else {\n // These views shouldn't matter if they don't have a datacollection.\n if (\n [\n \"button\",\n \"label\",\n \"mobile-page\",\n \"tab\",\n \"viewcontainer\",\n ].indexOf(this.key) == -1\n ) {\n console.warn(\n `TODO: figure out which ABView* require a .dataviewID: ${this.key}?`\n );\n }\n }\n return null;\n }\n\n var dc = this.AB.datacollectionByID(dataviewID);\n if (!dc) {\n var errNoDC = new Error(\n `MobileView[${this.label}][${this.id}] is unable to find associated DataCollection`\n );\n this.AB.notify.builder(errNoDC, {\n view: this,\n dataviewID,\n });\n }\n return dc;\n }\n\n ///\n /// Update Access accessLevels\n ///\n\n /**\n * @method updateAccessLevels()\n *\n *\n * @param {string} roleId\n *\n * @param {string} accessLevel\n *\n * @return {Promise}\n *\n */\n // updateAccessLevels(roleId, accessLevel) {\n // if (parseInt(accessLevel) == 0) {\n // if (this.accessLevels[roleId]) delete this.accessLevels[roleId];\n // } else {\n // this.accessLevels[roleId] = accessLevel;\n // }\n\n // return this.save(false, false);\n // }\n\n ///\n /// Views\n ///\n\n /**\n * @method views()\n *\n * return an array of all the ABViews children\n *\n * @param {fn} filter \ta filter fn to return a set of ABViews that this fn\n *\t\t\t\t\t\treturns true for.\n * @param {boolean} deep\n *\n * @return {array} \tarray of ABViews\n */\n views(filter = () => true, deep = false) {\n var result = [];\n\n if (!this._views || this._views.length < 1) return result;\n\n // find into recursively\n if (filter && deep) {\n // result = result.concat(this._views.filter(filter));\n\n // this._views.forEach((v) => {\n // var subViews = v.views(filter, deep);\n // if (subViews && subViews.length > 0) {\n // result = result.concat(subViews);\n // }\n // });\n result = this.application._searchDeep(this, \"_views\", filter);\n } else {\n result = this._views.filter(filter);\n }\n\n return result;\n }\n\n /**\n * @method viewByID()\n *\n * return the specific View referenced by the given ID.\n *\n * @param {uuid} ID\n * the {ABMobileView}.id of the child view we are requesting\n *\n * @return {ABMobileView || undefined}\n */\n viewByID(ID) {\n return this.views((v) => v.id == ID, true)[0];\n }\n\n /**\n * @method viewNew()\n * @return {ABView}\n */\n viewNew(values, application, parent) {\n return this.application.viewNew(\n values,\n application || this.application,\n parent || this\n );\n }\n\n /**\n * @method viewDestroy()\n *\n * remove the current ABView from our list of ._views.\n *\n * @param {ABView} view\n * @return {Promise}\n */\n // viewDestroy(view) {\n // console.error(\"DEPRECIATED: where is this called?\");\n // return this.viewRemove(view);\n // }\n\n /**\n * @method viewRemove()\n *\n * remove the current ABView from our list of ._views.\n *\n * @param {ABView} view\n * @return {Promise}\n */\n viewRemove(view) {\n var origLen = this._views.length;\n this._views = this.views(function (v) {\n return v.id != view.id;\n });\n\n if (this._views.length < origLen) {\n return this.save();\n }\n\n return Promise.resolve();\n }\n\n /**\n * @method viewInsert()\n *\n * persist the current ABView in our list of ._views.\n *\n * @param {ABView} object\n * @return {Promise}\n */\n viewInsert(view) {\n var isIncluded =\n this.views(function (v) {\n return v.id == view.id;\n }).length > 0;\n if (!isIncluded) {\n this._views.push(view);\n return this.save();\n }\n\n return Promise.resolve();\n }\n\n /**\n * @method viewReorder()\n *\n * reorder the current ABView in our list of ._views.\n *\n * @param {string} viewId - id of the active view\n * @param {string} toPosition - 'to' postion\n * @return {Promise}\n */\n viewReorder(viewId, toPosition) {\n var from = this._views.findIndex((v) => v.id == viewId);\n if (from < 0) return;\n\n // move drag item to 'to' position\n this._views.splice(toPosition, 0, this._views.splice(from, 1)[0]);\n\n // save to database\n return this.save(true);\n }\n\n /// ABApplication data methods\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABApplication\n *\n * also remove it from our _AllApplications\n *\n * @return {Promise}\n */\n destroy() {\n // unsubscribe events\n this.eventClear(true);\n\n return Promise.resolve()\n .then(() => {\n // When deleting an ABView\n // be sure to remove any of it's ABViews as well\n // This cleans out any dangling ABDefinitions\n\n var allViewDeletes = [];\n var allViews = this.views();\n this._views = [];\n // doing ._views = [] prevents any of my updates when\n // a sub-view is .destroy()ed\n\n allViews.forEach((v) => {\n allViewDeletes.push(v.destroy());\n });\n return Promise.all(allViewDeletes);\n })\n .then(() => {\n // NOTE: this should not happen on ABViewPage objects\n if (this.parent && !this.pages) {\n return this.parent.viewRemove(this);\n }\n })\n .then(() => {\n return super.destroy();\n })\n .then(() => {\n this.emit(\"destroyed\");\n });\n }\n\n /**\n * @method save()\n * persist this instance of ABView\n * @return {Promise}\n *\t\t.resolve( {this} )\n */\n save() {\n return Promise.resolve()\n .then(() => {\n // this creates our .id\n return super.save();\n })\n .then(() => {\n // NOTE: this should not happen on ABViewPage objects:\n if (this.parent && !this.pages) {\n // if we have a .parent, make sure we are included in our .parent's\n // viewIDs\n return this.parent.viewInsert(this);\n }\n })\n .then(() => {\n return this;\n });\n }\n\n /**\n * @method wantsAdd()\n * Some widgets can indicate to their containing ABMobilePage that\n * it wants to provide an [Add] feature.\n * @return {bool}\n */\n get wantsAdd() {\n // the default widget doesn't.\n // only those that actually do, should override this.\n return false;\n }\n\n ///\n /// Events\n ///\n\n /**\n * @method eventAdd()\n *\n *\n *\n * @param {object} evt - {\n * \t\t\t\t\t\t\temitter: object,\n * \t\t\t\t\t\t\teventName: string,\n * \t\t\t\t\t\t\tlistener: function\n * \t\t\t\t\t\t}\n */\n eventAdd(evt) {\n if (!evt || !evt.emitter || !evt.listener) return;\n\n var exists = this.__events.find((e) => {\n return e.emitter == evt.emitter && e.eventName == evt.eventName;\n // && e.listener == evt.listener;\n });\n\n if (!exists || exists.length < 1) {\n // add to array\n this.__events.push({\n emitter: evt.emitter,\n eventName: evt.eventName,\n listener: evt.listener,\n });\n\n // listening this event\n evt.emitter.on(evt.eventName, evt.listener);\n }\n }\n\n /**\n * @method eventClear()\n * unsubscribe all events.\n * should do it before destroy a component\n *\n * @param {bool} deep - clear events of child views\n */\n eventClear(deep) {\n if (deep) {\n this.views().forEach((v) => {\n v.eventClear(deep);\n });\n }\n\n if (this.__events && this.__events.length > 0) {\n this.__events.forEach((e) => {\n e.emitter.removeListener(e.eventName, e.listener);\n });\n }\n }\n\n /**\n * @method clone()\n * clone the definitions of this ABView object.\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @param {obj} options\n * option settings for the copy command.\n * options.ignoreSubPages {bool}\n * set to true to skip copying any sub pages of this ABView.\n * @return {obj}\n * obj defs of this ABView\n */\n clone(lookUpIds, parent, options = {}) {\n lookUpIds = lookUpIds || {};\n\n // get settings of the target\n let config = this.toObj();\n\n // remove sub-elements property\n [\"pages\", \"views\"].forEach((prop) => {\n delete config[prop];\n });\n\n // update id of linked components\n if (this.copyUpdateProperyList) {\n (this.copyUpdateProperyList() || []).forEach((prop) => {\n if (config && config.settings)\n config.settings[prop] = lookUpIds[config.settings[prop]];\n });\n }\n\n // copy from settings\n let result = this.viewNew(config, this.application, parent);\n\n // change id\n if (parent == null) {\n // the page is getting cloned to root: there is no parent, as parent is the application\n result.id = null;\n } else {\n result.id = lookUpIds[result.id] || this.AB.uuid();\n }\n\n // copy sub pages\n if (this.pages && !options.ignoreSubPages) {\n result._pages = [];\n this.pages().forEach((p) => {\n let copiedSubPage = p.clone(lookUpIds, result, options);\n copiedSubPage.parent = result;\n\n result._pages.push(copiedSubPage);\n });\n }\n\n // copy sub views\n if (this.views && !options.ignoreSubViews) {\n result._views = [];\n this.views().forEach((v) => {\n let copiedView = v.clone(lookUpIds, result, options);\n\n result._views.push(copiedView);\n });\n }\n\n return result;\n }\n\n /**\n * @method copy()\n * create a new copy of this ABView object. The resulting ABView should\n * be identical in settings and all sub pages/views, but each new object\n * is a unique view (different ids).\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @param {obj} options\n * option settings for the copy command.\n * options.ignoreSubPages {bool}\n * set to true to skip copying any sub pages of this ABView.\n * options.newName {string}\n * new user determined name for page\n * @return {Promise}\n * .resolved with the instance of the copied ABView\n */\n copy(lookUpIds, parent, options = {}) {\n lookUpIds = lookUpIds || {};\n\n // get settings of the target\n let config = this.toObj();\n\n // remove sub-elements property\n [\"pageIDs\", \"viewIDs\"].forEach((prop) => {\n delete config[prop];\n });\n\n // update id of linked components\n if (this.copyUpdateProperyList) {\n (this.copyUpdateProperyList() || []).forEach((prop) => {\n if (config && config.settings)\n config.settings[prop] = lookUpIds[config.settings[prop]];\n });\n }\n\n // copy from settings\n let result = this.application.viewNew(config, this.application, parent);\n\n // keep the parent\n result.parent = parent || this.parent;\n\n // change id\n if (parent == null) {\n // the page is getting cloned to root: there is no parent, as parent is the application.\n // pages with null parent ids default to getting put on root\n result.id = null;\n } else {\n result.id = lookUpIds[result.id] || this.AB.uuid();\n }\n\n // page's name should not be duplicate\n if (this.key == \"mobile-page\") {\n result.name =\n options?.newName ||\n `${result.name}_copied_${this.AB.uuid().slice(0, 3)}`;\n\n result.label = options?.newName || `${result.label} (copied)`;\n }\n\n return Promise.resolve()\n .then(() => {\n // copy sub pages\n var allSaves = [];\n\n if (this._pages && !options.ignoreSubPages) {\n result._pages = [];\n this.pages().forEach((p) => {\n // this prevents result.save() from happening on each of these\n // p.copy():\n if (p.isRoot())\n this.application._pages.push({ id: lookUpIds[p.id] });\n\n allSaves.push(\n p\n .copy(lookUpIds, result, options)\n .then((copiedSubPage) => {\n copiedSubPage.parent = result;\n // remove the temp {id:} entry above:\n this.application._pages =\n this.application._pages.filter(\n (p2) => p2.id != lookUpIds[p.id]\n );\n\n // now add the full copiedSubPage:\n result._pages.push(copiedSubPage);\n })\n );\n });\n }\n\n return Promise.all(allSaves);\n })\n .then(() => {\n // copy sub views\n var allSaves = [];\n\n if (this._views && !options.ignoreSubViews) {\n result._views = [];\n this.views().forEach((v) => {\n allSaves.push(\n // send a null for parent, so that the .save() wont trigger\n // a save of the parent.\n v.copy(lookUpIds, result, options).then((copiedView) => {\n // now patch up the parent connection:\n // copiedView.parent = result;\n if (\n result._views.filter((vi) => vi.id == copiedView.id)\n .length < 1\n ) {\n result._views.push(copiedView);\n }\n })\n );\n });\n }\n\n return Promise.all(allSaves);\n })\n .then(() => {\n // now we do 1 save for all the views\n return result.save();\n })\n .then(() => {\n return result;\n });\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABViewCustomPropertyComponentDefaults = {\n dataviewID: null,\n field: null,\n height: 0,\n hideTitle: 0,\n hideTabs: 0,\n};\n\nconst ABViewDefaults = {\n key: \"mobile-custom\", // {string} unique key for this view\n icon: \"palette\", // {string} fa-[icon] reference for this view\n labelKey: \"Custom\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewCustomCore extends ABMobileView {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewCustomPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n // field() {\n // var dv = this.datacollection;\n // if (!dv) return null;\n\n // var object = dv.datasource;\n // if (!object) return null;\n\n // return object.fieldByID(this.settings.field);\n // }\n\n /**\n * @method wantsAdd()\n * Some widgets can indicate to their containing ABMobilePage that\n * it wants to provide an [Add] feature.\n * @return {bool}\n */\n get wantsAdd() {\n // we do if we have a setting for linkPageAdd\n return this.settings.wantsAdd ?? false;\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABViewFormButtonPropertyComponentDefaults = {\n includeSave: true,\n saveLabel: \"\",\n includeCancel: false,\n cancelLabel: \"\",\n includeReset: false,\n resetLabel: \"\",\n afterCancel: null,\n alignment: \"right\",\n isDefault: false, // mark default button of form widget\n};\n\nconst ABViewFormButtonDefaults = {\n key: \"mobile-button\",\n // {string} unique key for this view\n\n icon: \"square\",\n // {string} fa-[icon] reference for this view\n\n labelKey: \"button\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormButtonCore extends ABMobileView {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormButtonDefaults\n );\n }\n\n static common() {\n return ABViewFormButtonDefaults;\n }\n\n static defaultValues() {\n return ABViewFormButtonPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n toObj() {\n // labels are multilingual values:\n let labels = [];\n\n if (this.settings.saveLabel) labels.push(\"saveLabel\");\n\n if (this.settings.cancelLabel) labels.push(\"cancelLabel\");\n\n if (this.settings.resetLabel) labels.push(\"resetLabel\");\n\n this.unTranslate(this.settings, this.settings, labels);\n\n let result = super.toObj();\n\n return result;\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n return null;\n }\n\n fromValues(values) {\n super.fromValues(values);\n\n // labels are multilingual values:\n let labels = [];\n\n if (this.settings.saveLabel) labels.push(\"saveLabel\");\n\n if (this.settings.cancelLabel) labels.push(\"cancelLabel\");\n\n if (this.settings.resetLabel) labels.push(\"resetLabel\");\n\n this.unTranslate(this.settings, this.settings, labels);\n\n Object.keys(ABViewFormButtonPropertyComponentDefaults).forEach((k) => {\n let val =\n this.settings[k] ?? ABViewFormButtonPropertyComponentDefaults[k];\n try {\n val = JSON.parse(val);\n } catch (e) {\n // just ignore the error and save val\n }\n this.settings[k] = val;\n });\n\n // this.settings.includeSave = JSON.parse(\n // this.settings.includeSave ||\n // ABViewFormButtonPropertyComponentDefaults.includeSave\n // );\n // this.settings.includeCancel = JSON.parse(\n // this.settings.includeCancel ||\n // ABViewFormButtonPropertyComponentDefaults.includeCancel\n // );\n // this.settings.includeReset = JSON.parse(\n // this.settings.includeReset ||\n // ABViewFormButtonPropertyComponentDefaults.includeReset\n // );\n\n // this.settings.isDefault = JSON.parse(\n // this.settings.isDefault ||\n // ABViewFormButtonPropertyComponentDefaults.isDefault\n // );\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormCheckboxPropertyComponentDefaults = {};\n\nconst ABMobileViewFormCheckboxDefaults = {\n key: \"mobile-checkbox\", // {string} unique key for this view\n icon: \"check-square-o\", // {string} fa-[icon] reference for this view\n labelKey: \"checkbox\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormCheckboxCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormCheckboxDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormCheckboxDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormCheckboxPropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormConnectPropertyComponentDefaults = {\n formView: \"\", // id of form to add new data\n filterConditions: {\n glue: \"and\",\n rules: [],\n },\n sortFields: [],\n popupWidth: 700,\n popupHeight: 450,\n};\n\nconst ABMobileViewFormConnectDefaults = {\n key: \"mobile-connect\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"Connect\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormConnectCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormConnectDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormConnectDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormConnectPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.filterConditions =\n this.settings.filterConditions ||\n ABMobileViewFormConnectPropertyComponentDefaults.filterConditions;\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABRecordRule = require(\"../../rules/ABViewRuleListFormRecordRules\");\nconst ABSubmitRule = require(\"../../rules/ABViewRuleListFormSubmitRules\");\n\nconst ABViewFormDefaults = {\n key: \"mobile-form\", // unique key identifier for this ABMobileViewForm\n icon: \"list-alt\", // icon reference: (without 'fa-' )\n labelKey: \"Form\", // {string} the multilingual label key for the class label\n};\n\nconst ABViewFormPropertyComponentDefaults = {\n dataviewID: null,\n showLabel: true,\n labelPosition: \"left\",\n labelWidth: 120,\n height: 200,\n clearOnLoad: false,\n clearOnSave: false,\n displayRules: [],\n editForm: \"none\", // The url pointer of ABViewForm\n\n //\t[{\n //\t\taction: {string},\n //\t\twhen: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tcomparer: {string},\n //\t\t\t\tvalue: {string}\n //\t\t\t}\n //\t\t],\n //\t\tvalues: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tvalue: {object}\n //\t\t\t}\n //\t\t]\n //\t}]\n recordRules: [],\n\n //\t[{\n //\t\taction: {string},\n //\t\twhen: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tcomparer: {string},\n //\t\t\t\tvalue: {string}\n //\t\t\t}\n //\t\t],\n //\t\tvalue: {string}\n //\t}]\n submitRules: [],\n};\n\nmodule.exports = class ABMobileViewFormCore extends ABMobileView {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewFormDefaults);\n }\n\n static common() {\n return ABViewFormDefaults;\n }\n\n static defaultValues() {\n return ABViewFormPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.labelPosition =\n this.settings.labelPosition ||\n ABViewFormPropertyComponentDefaults.labelPosition;\n\n // convert from \"0\" => true/false\n this.settings.showLabel = JSON.parse(\n this.settings.showLabel != null\n ? this.settings.showLabel\n : ABViewFormPropertyComponentDefaults.showLabel\n );\n this.settings.clearOnLoad = JSON.parse(\n this.settings.clearOnLoad != null\n ? this.settings.clearOnLoad\n : ABViewFormPropertyComponentDefaults.clearOnLoad\n );\n this.settings.clearOnSave = JSON.parse(\n this.settings.clearOnSave != null\n ? this.settings.clearOnSave\n : ABViewFormPropertyComponentDefaults.clearOnSave\n );\n\n // convert from \"0\" => 0\n this.settings.labelWidth = parseInt(\n this.settings.labelWidth == null\n ? ABViewFormPropertyComponentDefaults.labelWidth\n : this.settings.labelWidth\n );\n this.settings.height = parseInt(\n this.settings.height == null\n ? ABViewFormPropertyComponentDefaults.height\n : this.settings.height\n );\n }\n\n // Use this function in kanban\n objectLoad(object) {\n this._currentObject = object;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n var viewsToAllow = [\"mobile-label\", \"mobile-button\", \"mobile-text\"],\n allComponents = this.application.viewAll();\n\n return allComponents.filter((c) => {\n return viewsToAllow.indexOf(c.common().key) > -1;\n });\n }\n\n /**\n * @method fieldComponents()\n * return an array of all the ABViewFormField children\n * @param {fn} filter\n * a filter fn to return a set of ABViewFormField that this fn\n *\t returns true for.\n * @return {array} \tarray of ABViewFormField\n */\n fieldComponents(filter) {\n const flattenComponents = (views) => {\n let components = [];\n\n views.forEach((v) => {\n if (v == null) return;\n\n components.push(v);\n\n if (v._views?.length) {\n components = components.concat(flattenComponents(v._views));\n }\n });\n\n return components;\n };\n\n if (this._views?.length) {\n const allComponents = flattenComponents(this._views);\n\n if (filter == null) {\n filter = (comp) =>\n comp instanceof this.AB.Class.ABMobileViewFormItem;\n }\n\n return allComponents.filter(filter);\n } else {\n return [];\n }\n }\n\n /**\n * @method addFieldToForm()\n * Create a New Form Item on this Form from a given ABFieldXXX object.\n * @param {ABFieldXXX} field\n * @param {int} yPosition\n * @return {ABMobileViewFormXXX}\n */\n addFieldToForm(field, yPosition) {\n if (field == null) return;\n\n // TODO: figure out how to decode the Data Field and return a form\n // element.\n\n var fieldComponent = field.formComponentMobile();\n if (fieldComponent == null) return;\n\n var newView = fieldComponent.newInstance(this.application, this);\n if (newView == null) return;\n\n // set settings to component\n newView.settings = newView.settings || {};\n newView.settings.fieldId = field.id;\n // TODO : Default settings\n\n if (yPosition != null) newView.position.y = yPosition;\n\n // add a new component\n this._views.push(newView);\n\n return newView;\n }\n\n get RecordRule() {\n let object = this.datacollection.datasource;\n\n if (this._recordRule == null) {\n this._recordRule = new ABRecordRule();\n }\n\n this._recordRule.formLoad(this);\n this._recordRule.fromSettings(this.settings.recordRules);\n this._recordRule.objectLoad(object);\n\n return this._recordRule;\n }\n\n /**\n * @method recordRulesReady()\n * This returns a Promise that gets resolved when all record rules report\n * that they are ready.\n * @return {Promise}\n */\n async recordRulesReady() {\n return this.RecordRule.rulesReady();\n }\n\n doRecordRulesPre(rowData) {\n return this.RecordRule.processPre({ data: rowData, form: this });\n }\n\n doRecordRules(rowData) {\n // validate for record rules\n if (rowData) {\n let object = this.datacollection.datasource;\n let ruleValidator = object.isValidData(rowData);\n let isUpdatedDataValid = ruleValidator.pass();\n if (!isUpdatedDataValid) {\n console.error(\"Updated data is invalid.\", { rowData: rowData });\n return Promise.reject(new Error(\"Updated data is invalid.\"));\n }\n }\n\n return this.RecordRule.process({ data: rowData, form: this });\n }\n\n doSubmitRules(rowData) {\n var object = this.datacollection.datasource;\n\n var SubmitRules = new ABSubmitRule();\n SubmitRules.formLoad(this);\n SubmitRules.fromSettings(this.settings.submitRules);\n SubmitRules.objectLoad(object);\n\n return SubmitRules.process({ data: rowData, form: this });\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABViewFormCustomPropertyComponentDefaults = {};\n\nconst ABViewFormCustomDefaults = {\n key: \"mobile-fieldcustom\",\n // {string} unique key for this view\n icon: \"object-group\",\n // {string} fa-[icon] reference for this view\n labelKey: \"custom\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormCustomCore extends ABMobileViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormCustomDefaults\n );\n }\n\n static common() {\n return ABViewFormCustomDefaults;\n }\n\n static defaultValues() {\n return ABViewFormCustomPropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormDatepickerPropertyComponentDefaults = {\n timepicker: false,\n};\n\nconst ABMobileViewFormDatepickerDefaults = {\n key: \"mobile-date\", // {string} unique key for this view\n icon: \"calendar\", // {string} fa-[icon] reference for this view\n labelKey: \"datepicker\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormDatepickerCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormDatepickerDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormDatepickerDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormDatepickerPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormDatetimePropertyComponentDefaults = {\n timepicker: false,\n};\n\nconst ABMobileViewFormDatetimeDefaults = {\n key: \"mobile-datetime\", // {string} unique key for this view\n icon: \"calendar\", // {string} fa-[icon] reference for this view\n labelKey: \"Date and Time\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormDatetimeCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormDatetimeDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormDatetimeDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormDatetimePropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormEmailPropertyComponentDefaults = {\n timepicker: false,\n};\n\nconst ABMobileViewFormEmailDefaults = {\n key: \"mobile-email\", // {string} unique key for this view\n icon: \"envelope\", // {string} fa-[icon] reference for this view\n labelKey: \"Email\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormEmailCore extends ABMobileViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormEmailDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormEmailDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormEmailPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABViewFormFilePropertyComponentDefaults = {};\n\nconst ABViewFormFileDefaults = {\n key: \"mobile-file\",\n // {string} unique key for this view\n icon: \"file\",\n // {string} fa-[icon] reference for this view\n labelKey: \"file\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormFileCore extends ABMobileViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormFileDefaults\n );\n }\n\n static common() {\n return ABViewFormFileDefaults;\n }\n\n static defaultValues() {\n return ABViewFormFilePropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABViewFormFormulaPropertyComponentDefaults = {};\n\nconst ABViewFormFormulaDefaults = {\n key: \"mobile-formula\",\n // {string} unique key for this view\n icon: \"circle-o-notch\",\n // {string} fa-[icon] reference for this view\n labelKey: \"Formula\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormFormulaCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormFormulaDefaults\n );\n }\n\n static common() {\n return ABViewFormFormulaDefaults;\n }\n\n static defaultValues() {\n return ABViewFormFormulaPropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormFile = require(\"../../platform/mobile/ABMobileViewFormFile\");\n\nconst ABViewFormImagePropertyComponentDefaults = {};\n\nconst ABViewImageFileDefaults = {\n key: \"mobile-image\",\n // {string} unique key for this view\n icon: \"file-image-o\",\n // {string} fa-[icon] reference for this view\n labelKey: \"Image\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormImageCore extends ABMobileViewFormFile {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewImageFileDefaults\n );\n }\n\n static common() {\n return ABViewImageFileDefaults;\n }\n\n static defaultValues() {\n return ABViewFormImagePropertyComponentDefaults;\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABViewFormFieldPropertyComponentDefaults = {\n required: 0,\n disable: 0,\n};\n\nmodule.exports = class ABMobileViewFormItemCore extends ABMobileView {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n static defaultValues() {\n return ABViewFormFieldPropertyComponentDefaults;\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n let form = this.parentFormComponent();\n if (form == null) return null;\n\n let datacollection = form.datacollection;\n if (datacollection == null) return null;\n\n return datacollection;\n }\n\n field() {\n if (this.settings.objectId) {\n let object = this.AB.objectByID(this.settings.objectId);\n if (!object) return null;\n\n return object.fieldByID(this.settings.fieldId);\n } else {\n let form = this.parentFormComponent();\n if (form == null) return null;\n\n let object;\n if (form._currentObject) {\n object = form._currentObject;\n } else {\n let datacollection = form.datacollection;\n if (datacollection == null) return null;\n\n object = datacollection.datasource;\n }\n\n if (object == null) return null;\n\n let field = object.fieldByID(this.settings.fieldId);\n return field;\n }\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormNumberPropertyComponentDefaults = {\n isStepper: 0,\n};\n\nconst ABMobileViewFormNumberDefaults = {\n key: \"mobile-numberbox\", // {string} unique key for this view\n icon: \"hashtag\", // {string} fa-[icon] reference for this view\n labelKey: \"number\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormNumberCore extends ABMobileViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormNumberDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormNumberDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormNumberPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewFormText instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n this.unTranslate(this, this, [\"label\", \"formLabel\"]);\n\n var obj = super.toObj();\n obj.views = []; // no subviews\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // if this is being instantiated on a read from the Property UI,\n this.settings.isStepper =\n this.settings.isStepper ||\n ABMobileViewFormNumberPropertyComponentDefaults.isStepper;\n\n // convert from \"0\" => 0\n this.settings.isStepper = parseInt(this.settings.isStepper);\n }\n};\n","const ABMobileViewFormCustom = require(\"../../platform/mobile/ABMobileViewFormCustom\");\n\nconst ABMobileViewFormReadonlyPropertyComponentDefaults = {};\n\nconst ABMobileViewFormReadonlyDefaults = {\n key: \"mobile-fieldreadonly\", // {string} unique key for this view\n icon: \"calculator\", // {string} fa-[icon] reference for this view\n labelKey: \"readonly\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormReadonly extends ABMobileViewFormCustom {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormReadonlyDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormReadonlyDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormReadonlyPropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormSelectSingle = require(\"../../platform/mobile/ABMobileViewFormSelectSingle\");\n\nconst ABMobileViewFormSelectMultiplePropertyComponentDefaults = {\n type: \"richselect\", // 'richselect' or 'radio'\n};\n\nconst ABMobileViewFormSelectMultipleDefaults = {\n key: \"mobile-selectmultiple\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"selectmultiple\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormSelectMultipleCore extends (\n ABMobileViewFormSelectSingle\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormSelectMultipleDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormSelectMultipleDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormSelectMultiplePropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABMobileViewFormSelectSinglePropertyComponentDefaults = {\n type: \"richselect\", // 'richselect' or 'radio'\n};\n\nconst ABMobileViewFormSelectSingleDefaults = {\n key: \"mobile-selectsingle\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"selectsingle\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormSelectSingleCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABMobileViewFormSelectSingleDefaults\n );\n }\n\n static common() {\n return ABMobileViewFormSelectSingleDefaults;\n }\n\n static defaultValues() {\n return ABMobileViewFormSelectSinglePropertyComponentDefaults;\n }\n};\n","const ABMobileViewFormItem = require(\"../../platform/mobile/ABMobileViewFormItem\");\n\nconst ABViewFormTextboxPropertyComponentDefaults = {\n type: \"single\", // 'single', 'multiple' or 'rich'\n placeholder: \"\", // default placeholder text\n};\n\nconst ABViewFormTextboxDefaults = {\n key: \"mobile-textbox\", // {string} unique key for this view\n icon: \"i-cursor\", // {string} fa-[icon] reference for this view\n labelKey: \"textbox\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewFormTextboxCore extends (\n ABMobileViewFormItem\n) {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormTextboxDefaults\n );\n }\n\n static common() {\n return ABViewFormTextboxDefaults;\n }\n\n static defaultValues() {\n return ABViewFormTextboxPropertyComponentDefaults;\n }\n\n toObj() {\n // placeholder is a multilingual value:\n this.unTranslate(this.settings, this.settings, [\"placeholder\"]);\n\n return super.toObj();\n }\n\n fromValues(values) {\n super.fromValues(values);\n\n // placeholder is a multilingual value:\n this.unTranslate(this.settings, this.settings, [\"placeholder\"]);\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABViewLabelPropertyComponentDefaults = {\n text: \"\",\n format: 0, // 0 - normal, 1 - title, 2 - description\n alignment: \"left\",\n};\n\nconst ABViewDefaults = {\n key: \"mobile-label\", // {string} unique key for this view\n icon: \"font\", // {string} fa-[icon] reference for this view\n labelKey: \"Label\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABMobileViewLabelCore extends ABMobileView {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewLabelPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n this.unTranslate(this, this, [\"label\", \"text\"]);\n\n var obj = super.toObj();\n obj.viewIDs = [];\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values); // <-- this performs the translations\n\n // if this is being instantiated on a read from the Property UI,\n // .text is coming in under .settings.label\n this.text = values.text || values.settings.text || \"*text\";\n\n this.settings.format =\n this.settings.format || ABViewLabelPropertyComponentDefaults.format;\n this.settings.alignment =\n this.settings.alignment ||\n ABViewLabelPropertyComponentDefaults.alignment;\n\n // we are not allowed to have sub views:\n this._views = [];\n\n // convert from \"0\" => 0\n this.settings.format = parseInt(this.settings.format);\n\n this.translate(this, this, [\"label\", \"text\"]);\n }\n\n //// Allow external interface to manipulate our settings:\n\n /**\n * @method formatNormal\n * display text in the normal format.\n */\n formatNormal() {\n this.settings.format = 0;\n }\n\n /**\n * @method formatTitle\n * display text as a Title.\n */\n formatTitle() {\n this.settings.format = 1;\n }\n\n /**\n * @method formatDescription\n * display text as a description.\n */\n formatDescription() {\n this.settings.format = 2;\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABViewListPropertyComponentDefaults = {\n dataviewID: null,\n field: null,\n height: 0,\n hideTitle: 0,\n hideTabs: 0,\n};\n\nconst ABViewDefaults = {\n key: \"mobile-list\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"List\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewLabelCore extends ABMobileView {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewListPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n field() {\n var dv = this.datacollection;\n if (!dv) return null;\n\n var object = dv.datasource;\n if (!object) return null;\n\n return object.fieldByID(this.settings.field);\n }\n\n /**\n * @method wantsAdd()\n * Some widgets can indicate to their containing ABMobilePage that\n * it wants to provide an [Add] feature.\n * @return {bool}\n */\n get wantsAdd() {\n // we do if we have a setting for linkPageAdd\n return this.settings.linkPageAdd != \"\";\n }\n};\n","const ABMobileView = require(\"../../platform/mobile/ABMobileView\");\n\nconst ABViewTimelinePropertyComponentDefaults = {\n dataviewID: null,\n field: null,\n height: 0,\n hideTitle: 0,\n hideTabs: 0,\n};\n\nconst ABViewDefaults = {\n key: \"mobile-timeline\", // {string} unique key for this view\n icon: \"timeline\", // {string} fa-[icon] reference for this view\n labelKey: \"Timeline\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewTimelineCore extends ABMobileView {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewTimelinePropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n field() {\n var dv = this.datacollection;\n if (!dv) return null;\n\n var object = dv.datasource;\n if (!object) return null;\n\n return object.fieldByID(this.settings.field);\n }\n\n /**\n * @method wantsAdd()\n * Some widgets can indicate to their containing ABMobilePage that\n * it wants to provide an [Add] feature.\n * @return {bool}\n */\n get wantsAdd() {\n // we do if we have a setting for linkPageAdd\n return this.settings.linkPageAdd != \"\";\n }\n};\n","/**\n * ABProcessLane\n * manages the lanes in a Process Diagram.\n *\n * Lanes manage users in the system, and provide a way to lookup a SiteUser.\n */\nconst ABProcessParticipant = require(\"../../platform/process/ABProcessParticipant\");\n\nconst ABProcessLaneDefaults = {\n type: \"process.lane\",\n // {string} .type\n // unique key to reference this specific object\n\n // icon: \"key\"\n // {string} .icon\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n};\n\nmodule.exports = class ABProcessLaneCore extends ABProcessParticipant {\n constructor(attributes, process, AB) {\n super(attributes, process, AB);\n\n //// Runtime Values\n //// these are not stored in the Definition, but rather\n //// loaded and used from a running process instance.\n }\n\n static defaults() {\n return ABProcessLaneDefaults;\n }\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n super.fromValues(attributes);\n\n this.type = attributes.type || ABProcessLaneDefaults.type;\n }\n\n /**\n * @method toObj()\n * properly compile the current state of this object instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n // toObj() {\n // // default label value\n // if (!this.label && this.name && this.name != \"\") {\n // this.label = this.name;\n // }\n\n // // untranslate this object:\n // var data = super.toObj();\n\n // var fieldsToSave = [\n // \"id\",\n // \"name\",\n // \"type\",\n // \"processID\",\n // \"diagramID\",\n // \"where\"\n // ];\n // fieldsToSave.forEach((f) => {\n // data[f] = this[f];\n // });\n\n // return data;\n // }\n};\n","/**\n * ABProcessParticipant\n * manages the participant lanes in a Process Diagram.\n *\n * Participants manage users in the system, and provide a way to lookup a SiteUser.\n */\nconst ABMLClass = require(\"../../platform/ABMLClass\");\n\nconst ABProcessParticipantDefaults = {\n type: \"process.participant\",\n // {string} .type\n // unique key to reference this specific object\n\n // icon: \"key\" // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n};\n\nmodule.exports = class ABProcessParticipantCore extends ABMLClass {\n constructor(attributes, process, AB) {\n super([\"label\"], AB);\n\n this.process = process;\n if (!this.processID) {\n this.processID = process.id;\n }\n\n this.fromValues(attributes);\n\n //// Runtime Values\n //// these are not stored in the Definition, but rather\n //// loaded and used from a running process instance.\n }\n\n static defaults() {\n return ABProcessParticipantDefaults;\n }\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n // These Values are needed By ABDefinition:\n this.id = attributes.id;\n this.name = attributes.name || \"\";\n this.type = attributes.type || ABProcessParticipantDefaults.type;\n this.key = attributes.key || ABProcessParticipantDefaults.type;\n\n // Process Values:\n this.processID = attributes.processID || null;\n this.diagramID = attributes.diagramID || \"?diagramID?\";\n this.laneIDs = attributes.laneIDs || [];\n this.stashed = false;\n if (attributes.stashed && attributes.stashed != \"\") {\n this.stashed = attributes.stashed;\n }\n\n function validChecker(attribute) {\n return typeof attribute != \"undefined\" && attribute != null;\n }\n\n this.useRole = 0;\n if (validChecker(attributes.useRole)) {\n this.useRole = parseInt(attributes.useRole);\n }\n\n this.role = 0;\n if (validChecker(attributes.role)) {\n this.role = attributes.role;\n }\n\n this.useAccount = 0;\n if (validChecker(attributes.useAccount)) {\n this.useAccount = parseInt(attributes.useAccount);\n }\n\n this.account = 0;\n if (validChecker(attributes.account)) {\n this.account = attributes.account;\n }\n\n this.useField = 0;\n if (validChecker(attributes.useField)) {\n this.useField = parseInt(attributes.useField);\n }\n\n this.userField = [];\n if (validChecker(attributes.userField)) {\n this.userField = attributes.userField;\n }\n\n // depreciated\n this.fields = [];\n if (validChecker(attributes.fields)) {\n this.fields = attributes.fields;\n }\n\n super.fromValues(attributes); // perform translation on this object.\n // NOTE: keep this at the end of .fromValues();\n\n if (!this.label) {\n this.label = this.name;\n }\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n // default label value\n if (!this.label && this.name && this.name != \"\") {\n this.label = this.name;\n }\n\n // untranslate this object:\n var data = super.toObj();\n\n var fieldsToSave = [\n \"id\",\n \"name\",\n \"type\",\n \"processID\",\n \"diagramID\",\n \"laneIDs\",\n \"where\",\n \"useRole\",\n \"role\",\n \"useAccount\",\n \"account\",\n \"useField\",\n \"userField\",\n \"fields\",\n \"stashed\",\n ];\n fieldsToSave.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n\n /**\n * @method onProcessReady()\n * perform any tasks/checks necessary after the parent Process is\n * setup and ready.\n */\n onProcessReady() {}\n};\n","/*\n * ABProcessTaskManager\n *\n * An interface for managing the different ABProcessTasks in AppBuilder.\n *\n */\n\n/*\n * Tasks\n * A name => ABProcessElement hash of the different ABProcessElements available.\n */\nvar Tasks = {};\n\n/*\n * DEFINITIONTYPES\n * a hash of BPMN:Element.type to Default values\n * for each of our Process Objects.\n *\n * NOTE: For Tasks, the key should be target.type,\n * for Triggers or End elements, the key should be\n * the target.eventDefinitionType\n */\nvar DEFINITIONTYPES = {};\n\nvar AllProcessElements = [\n require(\"../../platform/process/tasks/ABProcessEnd\"),\n require(\"../../platform/process/tasks/ABProcessGatewayExclusive\"),\n require(\"../../platform/process/tasks/ABProcessTaskEmail\"),\n require(\"../../platform/process/tasks/ABProcessTaskService\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceAccountingBatchProcessing\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceAccountingFPClose\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceAccountingFPYearClose\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceAccountingJEArchive\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceApi\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceCalculate\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceInsertRecord\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceQuery\"),\n require(\"../../platform/process/tasks/ABProcessTaskServiceGetResetPasswordUrl\"),\n require(\"../../platform/process/tasks/ABProcessTaskSubProcess\"),\n require(\"../../platform/process/tasks/ABProcessTaskUser\"),\n require(\"../../platform/process/tasks/ABProcessTaskUserApproval\"),\n require(\"../../platform/process/tasks/ABProcessTaskUserExternal\"),\n require(\"../../platform/process/tasks/ABProcessTaskUserForm\"),\n require(\"../../platform/process/tasks/ABProcessTrigger\"),\n require(\"../../platform/process/tasks/ABProcessTriggerLifecycle\"),\n require(\"../../platform/process/tasks/ABProcessTriggerTimer\"),\n];\n\nAllProcessElements.forEach((ELEMENT) => {\n Tasks[ELEMENT.defaults().key] = ELEMENT;\n\n switch (ELEMENT.defaults().category) {\n case \"start\":\n case \"end\":\n DEFINITIONTYPES[ELEMENT.DiagramReplace().target.eventDefinitionType] =\n ELEMENT.defaults();\n break;\n\n case \"gateway\":\n case \"task\":\n DEFINITIONTYPES[ELEMENT.DiagramReplace().target.type] =\n ELEMENT.defaults();\n break;\n }\n});\n\nmodule.exports = {\n /*\n * @function allTasks\n * return all the currently defined ABProcessTasks in an array.\n * @return [{ABProcessTask},...]\n */\n allTasks: function () {\n var tasks = [];\n for (var t in Tasks) {\n tasks.push(Tasks[t]);\n }\n return tasks;\n },\n\n /*\n * @function newTask\n * return an instance of an ABProcessTask based upon the values.type value.\n * @return {ABProcessTask}\n */\n newTask: function (values, process, AB) {\n if (values.key) {\n return new Tasks[values.key](values, process, AB);\n } else {\n //// TODO: what to do here?\n }\n },\n\n DiagramReplaceDefinitionsForType: function (type) {\n var definitions = AllProcessElements.filter((e) => {\n return e.defaults().category == type;\n }).map((e) => {\n return e.DiagramReplace();\n });\n return definitions;\n },\n\n StartEvents: function () {\n return this.DiagramReplaceDefinitionsForType(\"start\");\n },\n\n Gateways: function () {\n return this.DiagramReplaceDefinitionsForType(\"gateway\");\n },\n\n Tasks: function () {\n return this.DiagramReplaceDefinitionsForType(\"task\");\n },\n\n EndEvents: function () {\n return this.DiagramReplaceDefinitionsForType(\"end\");\n },\n\n definitionForElement: function (element) {\n // pull the key from the embedded .eventDefinition\n // if there is one\n var key = null;\n if (element.businessObject.eventDefinitions) {\n var def = element.businessObject.eventDefinitions[0];\n if (def) {\n key = def.$type;\n }\n }\n\n // if not, then just use the base .type\n if (!key) {\n key = element.type;\n }\n\n return DEFINITIONTYPES[key];\n },\n};\n","var ABMLClass = require(\"../../../platform/ABMLClass\");\n\nmodule.exports = class ABProcessTaskCore extends ABMLClass {\n constructor(attributes, process, AB, defaultValues) {\n super([\"label\"], AB);\n\n this.defaults = defaultValues || { key: \"core\", icon: \"core\" };\n // {obj} .defaults\n // a value hash of default values for an ABProcessTask\n // NOTE: needs to be set before .fromValues()\n\n this.fromValues(attributes);\n\n this.process = process;\n if (!this.processID) {\n this.processID = process.id;\n }\n // {ABProcess} .process\n // The parent ABProcess this process element is a part of.\n\n //// Runtime Values\n //// these are not stored in the Definition, but rather\n //// loaded and used from a running process instance.\n this.state = null;\n }\n\n ///\n /// Static Methods\n ///\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n // ABDefinition Related fields:\n this.id = attributes.id;\n this.name = attributes.name || \"\";\n this.type = attributes.type || \"process.task.unknown\";\n\n // ABProcess related fields:\n this.key = attributes.key || this.defaults.key || \"?key?\";\n this.processID = attributes.processID || null;\n this.diagramID = attributes.diagramID || \"?diagramID?\";\n this.laneDiagramID = attributes.laneDiagramID || \"?laneID?\";\n // laneDiagramID : connects to the parent object that defines any\n // default User information for the Task. In our case, it\n // might be a {ABProcessParticipant} object, or a {ABProcessLane}\n // object. by default, a diagram's Participant obj doesn't define\n // any lanes, and therefore can provide that info. Once a lane\n // is added, however, an object is assigned to it, and the\n // Lane will provide that info.\n\n // initialize any defined settings\n if (this.defaults && this.defaults.settings) {\n this.defaults.settings.forEach((s) => {\n if (typeof attributes[s] == \"undefined\") this[s] = null;\n else this[s] = attributes[s];\n });\n }\n\n super.fromValues(attributes); // perform translation on this object.\n // NOTE: keep this at the end of .fromValues();\n\n if (!this.label) {\n this.label = this.name;\n }\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n // default label value\n if (!this.label && this.name && this.name != \"\") {\n this.label = this.name;\n }\n\n // untranslate this object:\n var data = super.toObj();\n\n var fieldsToSave = [\n \"id\",\n \"name\",\n \"type\",\n \"processID\",\n \"diagramID\",\n \"laneDiagramID\",\n \"key\",\n ];\n fieldsToSave.forEach((f) => {\n data[f] = this[f];\n });\n\n // save any defined settings\n if (this.defaults && this.defaults.settings) {\n this.defaults.settings.forEach((s) => {\n data[s] = this[s];\n });\n }\n\n return data;\n }\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * errorConfig()\n * Respond with an error when expected configuration parameters do not\n * pull data.\n * @param {obj} instance\n * the instance data of this task\n * @param {string} msg\n * the display message for this error.\n * @param {array[string]} fields\n * an array of parameter keys that should be included in the error\n * for additional information.\n * @return {Promise.reject(error)}\n */\n errorConfig(instance, msg, fields = []) {\n this.log(instance, msg);\n var error = new Error(`${this.type}: ${msg}`);\n var info = { task: this };\n if (!Array.isArray(fields)) fields = [fields];\n fields.forEach((field) => {\n info[field] = this[field];\n });\n this.AB.notify.builder(error, info);\n return Promise.reject(error);\n }\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context\n * the context data of the process instance\n * @param {obj} defaults\n * any values to include from our child classes\n * @param {obj} val\n * any values to override the default state\n */\n initState(context, defaults, val) {\n defaults = defaults || {};\n if (!val) {\n val = defaults;\n defaults = {};\n\n // in this case, then auto initi blank instanceValues:\n if (this.defaults && this.defaults.instanceValues) {\n this.defaults.instanceValues.forEach((v) => {\n defaults[v] = null;\n });\n }\n }\n\n context.taskState = context.taskState || {};\n\n // don't overwrite your settings if they already exist:\n if (!context.taskState[this.diagramID]) {\n context.taskState[this.diagramID] = {\n initialized: true,\n status: \"initialized\",\n };\n for (var d in defaults) {\n context.taskState[this.diagramID][d] = defaults[d];\n }\n for (var v in val) {\n context.taskState[this.diagramID][v] = val[v];\n }\n }\n }\n\n /*\n * @function isEndTask\n * return true if the current type of task is an End task. False otherwise.\n * @return {bool}\n */\n isEndTask() {\n return false;\n }\n\n /**\n * log()\n * enter a log in the current process instance\n * @param {obj} instance the current ABProcessInstance\n * @param {...} ...allArgs the remaining parameters sent to the log\n */\n log(instance, ...allArgs) {\n var text = `${this.diagramID} : ${\n this.name ? this.name : this.key\n } : ${allArgs.join(\" \")}`;\n instance.log.push(text);\n }\n\n /**\n * myLane()\n * return the ABProcessParticipant | ABProcessLane element we are\n * in.\n * @return {ABProcessParticipant|ABProcessLane}\n */\n myLane() {\n return this.process.elementForDiagramID(this.laneDiagramID);\n }\n\n /**\n * myState()\n * return the current state values for this ABProcessTask\n * @param {obj} instance the current ABProcessInstance\n * @return {obj}\n */\n myState(instance) {\n return instance.context.taskState[this.diagramID];\n }\n\n /**\n * nextTasks()\n * follow the current instance diagram and return the next task(s)\n * after this task.\n * @param {obj} instance the current ABProcessInstance\n * @return {array} [ABProcessTask, ...] or {null} if an error\n */\n nextTasks(instance) {\n var nextTasks = [];\n\n var myDiagramObj = instance.hashDiagramObjects[this.diagramID];\n if (!myDiagramObj) {\n let error = new Error(\n `Configuration Error: Did not find my definition for dID[${this.diagramID}]`\n );\n this.onError(instance, error);\n return null;\n }\n\n // myDiagramObj :\n // {\n // \"bpmn2:outgoing\": [{\"_text\": \"SequenceFlow_00fbxm3\"} ...],\n // \"_attributes\": {id: \"StartEvent_1\"},\n // \"_type\": \"start\"\n // }\n\n // find my possible exits:\n var exitFlows = myDiagramObj[\"bpmn2:outgoing\"];\n if (!exitFlows) {\n let error = new Error(\n `Configuration Error: Did not find any outgoing flows for dID[${this.diagramID}]`\n );\n this.AB.notify.builder(error, { task: this });\n this.onError(instance, error);\n return null;\n }\n\n if (!Array.isArray(exitFlows)) {\n exitFlows = [exitFlows];\n }\n\n var tasksFromFlow = (flow) => {\n // follow a flow and grab each of it's exit tasks\n // place them into nextTasks[];\n\n var flowObj = instance.hashDiagramObjects[flow[\"_text\"]];\n if (!flowObj) return;\n\n var targetIDs = flowObj[\"_attributes\"][\"targetRef\"];\n if (!targetIDs) return;\n\n if (!Array.isArray(targetIDs)) {\n targetIDs = [targetIDs];\n }\n\n targetIDs.forEach((tid) => {\n var targetTask = this.process.elementForDiagramID(tid);\n if (targetTask) {\n if (nextTasks) {\n nextTasks.push(targetTask);\n }\n } else {\n let error = new Error(\n `Configuration Error: No ProcessTask instance for diagramID[${tid}]`\n );\n this.AB.notify.builder(error, { task: this });\n this.onError(instance, error);\n nextTasks = null;\n }\n });\n };\n\n exitFlows.forEach((f) => {\n tasksFromFlow(f);\n });\n\n return nextTasks;\n }\n\n /**\n * onError()\n * perform the following actions (log it) on an error.\n * @param {obj} instance the current ABProcessInstance\n * @param {Error} error\n */\n onError(instance, error) {\n if (error) {\n var text = `${error.toString()}`;\n this.log(instance, text);\n }\n var myState = this.myState(instance);\n myState.status = \"error\";\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can request from other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n return null;\n }\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n processData(instance, key) {\n return null;\n }\n\n /**\n * processDataObjects()\n * return an array of avaiable ABObjects that this element\n * can provide to other ProcessElements.\n * @return {array} | null\n */\n processDataObjects() {\n return null;\n }\n\n /**\n * hashProcessDataValues()\n * return a hash of live Process Data Values\n * @param {obj} instance\n * @return {array} | null\n */\n hashProcessDataValues(instance) {\n var listDataFields = this.process.processDataFields(this);\n var currentProcessValues = {};\n listDataFields.forEach((f) => {\n currentProcessValues[f.key] = this.process.processData(this, [\n instance,\n f.key,\n ]);\n });\n return currentProcessValues;\n }\n\n /**\n * reset()\n * prepare this task to run again if it was already completed.\n *\n * This might happen in a process where a loop is formed and tasks\n * are repeated until a certain outcome.\n *\n * @param {obj} instance the current ABProcessInstance\n */\n reset(instance) {\n // a task wants to run me. Possibly again.\n var myState = this.myState(instance);\n\n // if I haven't setup my state (why?) then just\n // do that again:\n if (!myState) {\n this.initState(instance.context);\n } else {\n // if I have already \"completed\" and we are being\n // asked to run again (it's possible)\n if (myState.status == \"completed\" || myState.status == \"error\") {\n // remove my current state\n delete instance.context.taskState[this.diagramID];\n\n // store a new state in the context\n this.initState(instance.context);\n\n // remember our previous state\n var newState = this.myState(instance);\n newState._prevState = myState;\n this.log(instance, \" Reset() called. Running again. \");\n }\n }\n }\n\n /**\n * stateCompleted()\n * mark this task has having completed.\n * @param {obj} instance the current ABProcessInstance\n */\n stateCompleted(instance) {\n var myState = this.myState(instance);\n myState.status = \"completed\";\n }\n\n /**\n * stateUpdate()\n * update my state values with the given values data\n * @param {obj} instance the current ABProcessInstance\n * @param {obj} values the new state values\n */\n stateUpdate(instance, values) {\n values = values || {};\n var myState = this.myState(instance);\n for (var v in values) {\n myState[v] = values[v];\n }\n }\n\n /**\n * wantToDoSomething()\n * determine if this task still has something to do.\n * @param {obj} instance the instance data of the process we are working on\n * @return {bool} true if there is still pending actions\n */\n wantToDoSomething(instance) {\n var state = this.myState(instance);\n if (state) {\n return state.status != \"completed\" && state.status != \"error\";\n } else {\n // my state wasn't defined?\n console.warn(\n \"ABProcessTaskCore:wantToDoSomething(): called without having initialized our state first.\",\n instance\n );\n // initialize our state and try again\n this.initState(instance.context);\n return this.wantToDoSomething(instance);\n }\n }\n\n /**\n * @method onProcessReady()\n * Perform any setup actions after the parent process has indicated it is \"ready\"\n */\n onProcessReady() {}\n\n get startElements() {\n let startElems =\n this.process.elements(\n (elem) =>\n elem && elem.defaults && elem.defaults.category === \"start\"\n ) || [];\n return startElems;\n }\n\n get previousElements() {\n return this.process.connectionPreviousTask(this);\n }\n\n get objectOfStartElement() {\n const startElem = this.startElements[0];\n if (!startElem) return null;\n\n return this.AB.objectByID(startElem.objectID);\n }\n\n get objectOfPrevElement() {\n let prevElem = this.previousElements[0];\n if (!prevElem) return null;\n\n let objectID;\n switch (prevElem.type) {\n case \"process.task.service.query\":\n objectID = prevElem.qlObj ? prevElem.qlObj.objectID : null;\n break;\n case \"process.task.service.insertRecord\":\n default:\n objectID = prevElem.objectID;\n break;\n }\n\n return this.AB.objectByID(objectID);\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar ABProcessTaskEndDefaults = {\n category: \"end\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n fields: [],\n // fields: {array}\n // a list of internal setting values this Element tracks\n\n icon: \"stop\",\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to\n // reference 'fa-user'\n\n key: \"End\",\n // key: {string}\n // unique key to reference this specific Task\n};\n\nmodule.exports = class ABProcessTaskEndCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.end\";\n super(attributes, process, AB, ABProcessTaskEndDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskEndDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Terminate End Event\",\n actionName: \"replace-with-terminate-end\",\n className: \"bpmn-icon-end-event-terminate\",\n target: {\n type: \"bpmn:EndEvent\",\n eventDefinitionType: \"bpmn:TerminateEventDefinition\",\n },\n };\n }\n\n /**\n * do()\n * this method actually performs the action for this task.\n * @param {obj} instance the instance data of the running process\n * @return {Promise}\n * resolve(true/false) : true if the task is completed.\n * false if task is still waiting\n */\n // do(instance) {\n // return new Promise((resolve, reject) => {\n // // An End Event doesn't perform any other actions\n // // than to signal it has successfully completed.\n // // But it provides no Additional Tasks to work on.\n // // for testing:\n // this.stateCompleted(instance);\n // this.log(instance, \"End Event Reached\");\n // resolve(true);\n // });\n // }\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n initState(context, val) {\n var myDefaults = {\n triggered: false,\n };\n\n super.initState(context, myDefaults, val);\n }\n\n /*\n * @function isEndTask\n * return true if the current type of task is an End task. False otherwise.\n * @return {bool}\n */\n isEndTask() {\n return true;\n }\n\n /**\n * nextTasks()\n * return the next tasks to be run after this task is complete.\n * @param {obj} instance the instance data of the running process\n * @return {Promise}\n * resolve([])\n */\n nextTasks(instance) {\n // I'm an End Event. There are no nextTasks()\n return [];\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar ABProcessGatewayExclusiveDefaults = {\n category: \"gateway\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\",\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to\n // reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"GatewayExclusive\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"conditions\"],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class ABProcessGatewayExclusiveCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.gateway.exclusive\";\n super(attributes, process, AB, ABProcessGatewayExclusiveDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessGatewayExclusiveDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Exclusive Gateway\",\n actionName: \"replace-with-exclusive-gateway\",\n className: \"bpmn-icon-gateway-xor\",\n target: {\n type: \"bpmn:ExclusiveGateway\",\n },\n };\n }\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n super.fromValues(attributes);\n\n this.conditions = this.conditions || {};\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n\n ABProcessGatewayExclusiveDefaults.fields.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {\n userFormID: null,\n userFormResponse: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n /*\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n return [\n {\n key: `${this.id}.userFormResponse`,\n label: `${this.label}->Response`\n }\n ];\n }\n */\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n /*\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.id) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n return null;\n }\n */\n};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar ABProcessTaskEmailDefaults = {\n category: \"task\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n fields: [\n \"to\",\n \"from\",\n \"subject\",\n \"message\",\n \"toCustom\",\n \"fromCustom\",\n \"toUsers\",\n \"fromUsers\",\n \"toCustomFields\",\n \"fromCustomFields\",\n ],\n // fields: {array}\n // a list of internal setting values this Element tracks\n\n icon: \"email\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n key: \"Email\",\n // key: {string}\n // unique key to reference this specific Task\n};\n\nmodule.exports = class ABProcessTaskEmailCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.email\";\n super(attributes, process, AB, ABProcessTaskEmailDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskEmailDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Send Task\",\n actionName: \"replace-with-send-task\",\n className: \"bpmn-icon-send\",\n target: {\n type: \"bpmn:SendTask\",\n },\n };\n }\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n super.fromValues(attributes);\n\n ABProcessTaskEmailDefaults.fields.forEach((f) => {\n this[f] = attributes[f];\n });\n }\n\n /**\n * onProcessReady()\n * Perform our warnings checks once the parent Process is ready\n */\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var data = super.toObj();\n\n ABProcessTaskEmailDefaults.fields.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * do()\n * this method actually performs the action for this task.\n * @param {obj} instance the instance data of the running process\n * @return {Promise}\n * resolve(true/false) : true if the task is completed.\n * false if task is still waiting\n */\n // do(instance) {\n // return new Promise((resolve, reject) => {\n // // for testing:\n // var myState = this.myState(instance);\n // myState.status = \"completed\";\n // this.log(instance, \"Email Sent successfully\");\n // resolve(true);\n // });\n // }\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n initState(context, val) {\n var myDefaults = {\n to: [],\n from: [],\n subject: this.subject,\n message: this.message,\n };\n\n super.initState(context, myDefaults, val);\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar AccountingBatchProcessingDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"AccountingBatchProcessing\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"objectBatch\",\n \"processBatchValue\",\n \"fieldBatchEntries\",\n \"fieldBatchFinancialPeriod\",\n \"objectJE\",\n \"fieldJEAccount\",\n \"fieldJERC\",\n \"fieldJEStatus\",\n \"fieldJEStatusComplete\",\n \"objectBR\",\n \"fieldBRFinancialPeriod\",\n \"fieldBRAccount\",\n \"fieldBRRC\",\n \"fieldBREntries\",\n ],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class AccountingBatchProcessingCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type =\n attributes.type || \"process.task.service.accounting.batchProcessing\";\n super(attributes, process, AB, AccountingBatchProcessingDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return AccountingBatchProcessingDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /*\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n * /\n super.fromValues(attributes);\n\n AccountingBatchProcessingDefaults.settings.forEach((f) => {\n this[f] = attributes[f];\n });\n }\n */\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n\n AccountingBatchProcessingDefaults.settings.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {\n instanceVariable1: null,\n instanceVariable2: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n /*\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n return [\n {\n key: `${this.id}.[someInstanceVariableHere]`,\n label: `${this.label}->Response`\n }\n ];\n }\n */\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n /*\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.id) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n return null;\n }\n */\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar AccountingFPCloseDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"AccountingFPClose\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"processFPValue\",\n \"objectFP\",\n \"objectGL\",\n \"objectAcc\",\n \"fieldFPStart\",\n \"fieldFPOpen\",\n \"fieldFPStatus\",\n \"fieldFPActive\",\n \"fieldGLStarting\",\n \"fieldGLRunning\",\n \"fieldGLAccount\",\n \"fieldGLRc\",\n \"fieldGLDebit\",\n \"fieldGLCredit\",\n \"fieldAccType\",\n \"fieldAccAsset\",\n \"fieldAccExpense\",\n \"fieldAccLiabilities\",\n \"fieldAccEquity\",\n \"fieldAccIncome\",\n ],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class AccountingFPCloseCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type =\n attributes.type || \"process.task.service.accounting.fpClose\";\n super(attributes, process, AB, AccountingFPCloseDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return AccountingFPCloseDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /*\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n * /\n super.fromValues(attributes);\n\n AccountingFPCloseDefaults.settings.forEach((f) => {\n this[f] = attributes[f];\n });\n }\n */\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n\n AccountingFPCloseDefaults.settings.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {\n instanceVariable1: null,\n instanceVariable2: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n /*\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n return [\n {\n key: `${this.id}.[someInstanceVariableHere]`,\n label: `${this.label}->Response`\n }\n ];\n }\n */\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n /*\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.id) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n return null;\n }\n */\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar AccountingFPYearCloseDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"AccountingFPYearClose\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"processFPYearValue\",\n \"objectFPYear\",\n \"objectFPMonth\",\n \"objectGL\",\n \"objectAccount\",\n \"valueFundBalances\",\n \"valueNetIncome\",\n \"fieldFPYearStart\",\n \"fieldFPYearEnd\",\n \"fieldFPYearStatus\",\n \"fieldFPYearActive\",\n \"fieldFPMonthStart\",\n \"fieldFPMonthEnd\",\n \"fieldGLStartBalance\",\n \"fieldGLRunningBalance\",\n \"fieldGLrc\",\n \"fieldAccNumber\",\n \"fieldAccType\",\n \"fieldAccTypeIncome\",\n \"fieldAccTypeExpense\",\n \"fieldAccTypeEquity\",\n ],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class AccountingFPYearCloseCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type =\n attributes.type || \"process.task.service.accounting.fpYearClose\";\n super(attributes, process, AB, AccountingFPYearCloseDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return AccountingFPYearCloseDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /*\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n * /\n super.fromValues(attributes);\n\n AccountingFPCloseDefaults.settings.forEach((f) => {\n this[f] = attributes[f];\n });\n }\n */\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n\n AccountingFPCloseDefaults.settings.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {\n instanceVariable1: null,\n instanceVariable2: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n /*\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n return [\n {\n key: `${this.id}.[someInstanceVariableHere]`,\n label: `${this.label}->Response`\n }\n ];\n }\n */\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n /*\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.id) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n return null;\n }\n */\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nlet AccountingJEArchiveDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"archive\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"AccountingJEArchive\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"processBatchValue\",\n \"objectBatch\",\n \"objectBalance\",\n \"objectJE\",\n \"objectJEArchive\",\n\n \"fieldBatchFiscalMonth\",\n \"fieldJeAccount\",\n \"fieldJeRC\",\n \"fieldJeArchiveBalance\",\n \"fieldBrFiscalMonth\",\n \"fieldBrAccount\",\n \"fieldBrRC\",\n \"fieldsMatch\",\n ],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class AccountingJEArchiveCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type =\n attributes.type || \"process.task.service.accounting.jeArchive\";\n super(attributes, process, AB, AccountingJEArchiveDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return AccountingJEArchiveDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /*\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n * /\n super.fromValues(attributes);\n\n AccountingBatchProcessingDefaults.settings.forEach((f) => {\n this[f] = attributes[f];\n });\n }\n */\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n\n AccountingBatchProcessingDefaults.settings.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {\n instanceVariable1: null,\n instanceVariable2: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n /*\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n return [\n {\n key: `${this.id}.[someInstanceVariableHere]`,\n label: `${this.label}->Response`\n }\n ];\n }\n */\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n /*\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.id) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n return null;\n }\n */\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nlet ApiDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"exchange\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"Api\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"url\",\n \"method\",\n \"headers\",\n \"body\",\n \"responseJson\",\n \"storedSecrets\",\n ],\n responseJson: 1,\n headers: [],\n};\n\nmodule.exports = class ApiTaskCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.service.api\";\n super(attributes, process, AB, ApiDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return ApiDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n const label = `${this.label}->rawResponse`;\n if (!this._fakeField) {\n this._fakeObj = this.AB.objectNew({});\n this._fakeField = this.AB.fieldNew(\n { key: \"string\", name: label, label },\n this._fakeObj,\n );\n }\n return [\n {\n key: `${this.id}.rawResponse`,\n label,\n field: this._fakeField,\n },\n ];\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nlet CalculateDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"calculator\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"Calculate\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"formulaText\"],\n};\n\nmodule.exports = class CalculateTaskCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.service.calculate\";\n super(attributes, process, AB, CalculateDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return CalculateDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n const label = `${this.label}->Value`;\n // this is a calculate task, so let's include a fake ABFieldNumber\n // for the .field value, so other tasks that limit their operations\n // to fields can use this as a number\n if (!this._fakeNum) {\n this._fakeObj = this.AB.objectNew({});\n this._fakeNum = this.AB.fieldNew(\n { key: \"number\", name: label, label },\n this._fakeObj\n );\n }\n return {\n key: `${this.id}.value`,\n label,\n field: this._fakeNum,\n };\n }\n};\n","/**\n * ABProcessTaskServiceCore\n *\n * This defines the base Service Task element that can be placed on a BPMN\n * diagram. In our system, we will let the designer choose a sub class\n * to make active for this element.\n *\n * Currently a ServiceTask performs a dedicated operation on the server.\n * - performing a query, looking up data, etc...\n *\n */\nconst ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar ABProcessTaskServiceDefaults = {\n category: \"task\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"TaskService\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class ABProcessTaskServiceCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.service\";\n super(attributes, process, AB, ABProcessTaskServiceDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskServiceDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Service Task\",\n actionName: \"replace-with-service-task\",\n className: \"bpmn-icon-service\",\n target: {\n type: \"bpmn:ServiceTask\",\n },\n };\n }\n\n /*\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n * /\n super.fromValues(attributes);\n\n ABProcessTaskServiceDefaults.fields.forEach((f) => {\n this[f] = attributes[f];\n });\n }\n */\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n\n ABProcessTaskServiceDefaults.fields.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {\n userFormID: null,\n userFormResponse: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n /*\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n return [\n {\n key: `${this.id}.userFormResponse`,\n label: `${this.label}->Response`\n }\n ];\n }\n */\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n /*\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.id) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n return null;\n }\n */\n};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nconst ABProcessTaskGetResetPasswordUrlDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"plus-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"GetResetPasswordUrl\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"email\"],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class ABProcessTaskGetResetPasswordUrlCore extends (\n ABProcessElement\n) {\n constructor(attributes, process, AB) {\n attributes.type =\n attributes.type || \"process.task.service.getResetPasswordUrl\";\n super(attributes, process, AB, ABProcessTaskGetResetPasswordUrlDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskGetResetPasswordUrlDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n return {\n key: `${this.id}.url`,\n label: `${this.label}->URL`,\n };\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nlet InsertRecordDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"plus-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"InsertRecord\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"objectID\",\n \"fieldValues\",\n \"isRepeat\",\n \"repeatMode\",\n \"repeatColumn\",\n ],\n};\n\nmodule.exports = class InsertRecordCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.service.insertRecord\";\n super(attributes, process, AB, InsertRecordDefaults);\n\n this.results = [];\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return InsertRecordDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.isRepeat = JSON.parse(attributes.isRepeat || false);\n }\n\n get startElement() {\n let startElem = null;\n let currProcess = this.process;\n\n // Find the start (trigger) task\n while (!startElem && currProcess) {\n startElem = currProcess.elements(\n (elem) => elem?.defaults?.category == \"start\"\n )[0];\n\n // If .currProcess is a sub task, then go to the parent process for get the start task\n currProcess = currProcess.process;\n }\n\n return startElem;\n }\n\n get previousElement() {\n return this.process.connectionPreviousTask(this)[0];\n }\n\n get objectOfStartElement() {\n let startElem = this.startElement;\n if (!startElem) return null;\n\n let startElemObj = this.AB.objectByID(startElem.objectID);\n return startElemObj;\n }\n\n get objectOfPrevElement() {\n let prevElem = this.previousElement;\n if (!prevElem) return null;\n\n let objectID;\n switch (prevElem.type) {\n case \"process.task.service.query\":\n objectID = prevElem.qlObj ? prevElem.qlObj.objectID : null;\n break;\n case \"process.task.service.insertRecord\":\n default:\n objectID = prevElem.objectID;\n break;\n }\n\n return this.AB.objectByID(objectID);\n }\n\n get fieldRepeat() {\n let obj = this.objectOfStartElement;\n if (!obj) return null;\n\n return obj.fields((f) => f.id == this.repeatColumn)[0];\n }\n\n /**\n * processDataFields()\n * return a single available data field from this element\n * this will be the record inserted by this task\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n return [\n {\n key: `${this.id}.[PK]`,\n label: `${this.label}-> Inserted record [PK]`,\n field: {\n id: this.id,\n object: { id: this.objectID },\n key: \"InsertedRecord\",\n columnName: \"uuid\",\n },\n object: this.objectID,\n set: true,\n },\n ];\n }\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n /*\n toObj() {\n var data = super.toObj();\n \n AccountingBatchProcessingDefaults.settings.forEach((f) => {\n data[f] = this[f];\n });\n \n return data;\n }\n */\n\n ////\n //// Process Instance Methods\n ////\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nconst ABQLManager = require(\"../../../platform/ql/ABQLManager.js\");\n\nconst ABProcessTaskServiceQueryDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"TaskServiceQuery\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"qlObj\"],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class ABProcessTaskServiceQueryCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.service.query\";\n super(attributes, process, AB, ABProcessTaskServiceQueryDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskServiceQueryDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n // Before we make instances of qlObj:\n this._datasources = [];\n\n // comvert our qlObj into an ABQLxxx instance.\n if (this.qlObj) {\n this.qlObj = ABQLManager.fromAttributes(this.qlObj, this, this.AB);\n }\n }\n\n /**\n * @method toObj()\n * properly compile the current state of this object instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n toObj() {\n const data = super.toObj();\n\n // convert qlObj into obj format:\n if (this.qlObj) data.qlObj = this.qlObj.toObj();\n\n return data;\n }\n\n registerDatasource(obj) {\n this._datasources.push(obj);\n }\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n const myDefaults = {\n instanceVariable1: null,\n instanceVariable2: null\n };\n\n super.initState(context, myDefaults, val);\n }\n */\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n // in this Task, we can return the Response to the UserForm\n let fields = null;\n\n if (this._datasources.length > 0) {\n fields = [];\n\n this._datasources.forEach((s) => {\n const param = s.processDataField(this.id, this.label);\n\n if (param) {\n fields.push(param);\n }\n });\n }\n\n return fields;\n }\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n processData(instance, key) {\n const parts = key.split(\".\");\n\n if (parts[0] === this.id) {\n const myState = this.myState(instance);\n\n return myState[parts[1]];\n }\n\n return null;\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nlet SubProcessDefaults = {\n category: \"task\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"object-group\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"SubProcess\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\n \"isEnable\",\n \"parameterId\",\n \"connectionAttrs\",\n \"elementIDs\",\n \"loopType\",\n ],\n};\n\nconst NOSPAM = {\n /*message : bool */\n};\n// prevent sending the same message over and over.\n\nmodule.exports = class SubProcessCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.service.subProcess\";\n super(attributes, process, AB, SubProcessDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return SubProcessDefaults;\n }\n\n static DiagramReplace() {\n // taken from \"bpmn-js/lib/features/replace/ReplaceOptions\"\n return {\n label: \"Sub Process\",\n actionName: \"replace-with-subprocess\",\n className: \"bpmn-icon-subprocess-expanded\",\n target: {\n type: \"bpmn:SubProcess\",\n isExpanded: true,\n },\n };\n }\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n // Convert string to boolean\n this.isEnable = this.isEnable == null ? true : JSON.parse(this.isEnable);\n\n let currElements = this._elements || {};\n this._unknownElementIDs = [];\n this._elements = {};\n (attributes.elementIDs || []).forEach((eID) => {\n let ele = this.AB.processElementNew(eID, this);\n if (ele) {\n this._elements[eID] = ele;\n } else {\n // current eID isn't one of our definitions yet, so might be\n // a temporary .diagramID from an unsaved task:\n if (currElements[eID]) {\n this._elements[eID] = currElements[eID];\n } else {\n this._unknownElementIDs.push(eID);\n }\n }\n });\n\n this._unknownElementIDs.forEach((eID) => {\n let key = `Process[${this.processID}] Task[${this.label}] is referencing an unknown element id:[${eID}]`;\n if (!NOSPAM[key]) {\n let err = new Error(key);\n this.AB.notify.builder(err, { processTask: this.id, eID });\n NOSPAM[key] = true;\n }\n });\n\n this._connections = attributes.connectionAttrs || {};\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n let data = super.toObj();\n\n data.elementIDs = [];\n for (let e in this._elements) {\n data.elementIDs.push(this._elements[e].id);\n }\n\n data.connectionAttrs = this._connections;\n\n return data;\n }\n\n /**\n * @method processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @param {ABProcessElement} currElement\n * the ABProcessElement that is requesting the data.\n * @return {array} | null\n */\n processDataFields(currElement) {\n if (this.parameterId == null) return [];\n\n // only call processDataFields once, filter it to get the different queries\n let dataFieldsAll = this.process.processDataFields(this) || [];\n\n // get the subtask data\n let dataFieldOpt = dataFieldsAll.filter(\n (opt) => opt.key === this.parameterId\n )[0];\n\n // get data from insert tasks\n let dataFieldsAllInserted = dataFieldsAll.filter(\n (opt) => (opt?.field?.key ?? opt?.field) === \"InsertedRecord\"\n );\n\n if (dataFieldOpt == null) return [];\n\n let result = [];\n\n // Connect field type\n if (\n dataFieldOpt.field &&\n dataFieldOpt.field.key == \"connectObject\" &&\n dataFieldOpt.field.datasourceLink &&\n dataFieldOpt.field.datasourceLink.fields\n ) {\n result.push({\n key: `${this.id}.uuid`,\n label: `${this.label}->Repeat Data.ID`,\n object: dataFieldOpt.field.datasourceLink,\n });\n\n dataFieldOpt.field.datasourceLink.fields().forEach((f) => {\n result.push({\n key: `${this.id}.${f.id}`,\n label: `${this.label}->Repeat Data.${f.label}`,\n field: f,\n object: f.object,\n });\n });\n }\n // Other field types\n else {\n result.push({\n key: dataFieldOpt.field\n ? `${this.id}.${dataFieldOpt.field.id}`\n : `${this.id}.subProcess`,\n label: `${this.label}->Repeat Data`,\n field: dataFieldOpt.field,\n object: dataFieldOpt.object,\n });\n }\n\n dataFieldsAllInserted.forEach((opt) => {\n result.push({\n key: `${opt.key || opt.id}`,\n label: `Parent Process Data->${opt.label}`,\n field: opt.field,\n object: opt.object,\n });\n });\n\n // Get any tasks that exist inside the subprocess\n let previousFields = this.process.processDataFields.call(\n this,\n currElement\n );\n if (previousFields && previousFields.length > 0) {\n result = result.concat(previousFields);\n }\n\n return result;\n }\n\n /**\n * @method processData()\n * return an array of avaiable ABObjects that are represented\n * by the data previous ProcessElements are working with.\n * @param {ABProcessElement} currElement\n * the ABProcessElement that is requesting the data.\n * @return {array} | null\n */\n processData(currElement, params) {\n let instance = params[0];\n let key = params[1];\n let data;\n\n if (instance && key?.startsWith?.(this.id)) {\n let fieldId = key.split(\".\")[1];\n let myState = this.myState(instance);\n let stateData = myState ? myState.data : null;\n data = stateData;\n\n if (stateData && fieldId) {\n let dataFieldOpt = (\n this.process.processDataFields(this) || []\n ).filter((opt) => opt.key == this.parameterId)[0];\n\n if (dataFieldOpt?.field?.key == \"connectObject\") {\n if (!Array.isArray(stateData)) stateData = [stateData];\n\n // Extract data\n data = stateData.map((item) => {\n if (fieldId == \"uuid\" || fieldId == \"id\") {\n return item.uuid || item.id || item;\n } else if (dataFieldOpt.field.datasourceLink) {\n let returnField = dataFieldOpt.field.datasourceLink.fields(\n (f) => f.id == fieldId\n )[0];\n if (returnField) return item[returnField.columnName];\n else return item;\n }\n });\n }\n }\n }\n\n // Filter none data items\n if (Array.isArray(data)) data = data.filter((d) => d != null);\n\n if (data == null || data.length == 0)\n data = this.process.processData.call(this, currElement, params);\n\n if (data == null || data.length == 0)\n data = this.process.processData(this, params);\n\n return data;\n }\n\n allPreviousTasks(...params) {\n return this.process.allPreviousTasks.call(this, ...params);\n }\n\n allPreviousConnectionsForElement(...params) {\n return this.process.allPreviousConnectionsForElement.call(\n this,\n ...params\n );\n }\n\n allPreviousConnectionsForConnection(...params) {\n return this.process.allPreviousConnectionsForConnection.call(\n this,\n ...params\n );\n }\n\n //\n // Diagram Elements\n //\n\n /**\n * @method connections()\n * return an array of connections that describe the relationships between\n * our process elements.\n * @param {fn} fn an iterator that returns true if the provided element\n * should be returned.\n * @return [{SimpleConnectionObj}]\n */\n connections(fn) {\n return this.process.connections.call(this, fn);\n }\n\n /**\n * @method connectionForDiagramID()\n * return the connection for the given diagram id\n * @param {string} dID\n * the bpmn:Element diagram id\n */\n connectionForDiagramID(dID) {\n if (!dID) return;\n\n return this.process.connectionForDiagramID.call(this, dID);\n }\n\n /**\n * @method connectionsIncoming()\n * return the connections that are entering this Element\n * @param {string} dID\n * the bpmn:Element diagram id\n */\n connectionsIncoming(dID) {\n if (!dID) return;\n\n return this.process.connectionsIncoming.call(this, dID);\n }\n\n /**\n * @method connectionsOutgoing()\n * return the connections that are leaving this Element\n * @param {string} dID\n * the bpmn:Element diagram id\n */\n connectionsOutgoing(dID) {\n if (!dID) return;\n\n return this.process.connectionsOutgoing.call(this, dID);\n }\n\n /**\n * @method connectionRemove()\n * remove the connection info for the given bpmn:element\n * @param {BMPNDiagramOBJ} element\n * the {element} returned from the BPMN.io modeling library event.\n */\n connectionRemove(element) {\n if (!element) return;\n\n this.process.connectionRemove.call(this, element);\n }\n\n /**\n * @method connectionSimplyElement()\n * given a BPMN diagram element, return a simplified object that describes\n * the connection between two elements.\n * @param {BMPNDiagramOBJ} element\n * the {element} returned from the BPMN.io modeling library event.\n * @return {SimpleConnectionObj}\n * .id : {string} diagram id of the connection element\n * .type : {string} the type of connection\n * .from : {string} the diagram id of the source element\n * .to : {string} the diagram id of the dest element\n */\n connectionSimplyElement(element) {\n if (!element) return;\n\n return this.process.connectionSimplyElement.call(this, element);\n }\n\n /**\n * @method connectionUpsert()\n * add or update the connection information for the given bpmn:element\n * @param {BMPNDiagramOBJ} element\n * the {element} returned from the BPMN.io modeling library event.\n */\n connectionUpsert(element) {\n if (!element) return;\n\n this.process.connectionUpsert.call(this, element);\n }\n\n /**\n * @method connectionPreviousTask()\n * return the ABProcessElement(s) that was a previous Element\n * (eg connects to) this element.\n * @param {ABProcessElement} currElement\n * @return {array}\n */\n connectionPreviousTask(currElement) {\n if (!currElement) return;\n\n return this.process.connectionPreviousTask.call(this, currElement);\n }\n\n /**\n * @method elements()\n * return an array of elements that match the given filter (or all elements\n * if no filter is provided).\n * @param {fn} fn an iterator that returns true if the provided element\n * should be returned.\n * @return {[ABProcessTask, ABProcessParticipant, etc...]}\n */\n elements(fn = () => true) {\n return this.process.elements.call(this, fn);\n }\n\n /**\n * @method elementAdd()\n * insert an element to be tracked by this process.\n * @param {ABProcessElement} element\n * the full instance of an ABProcessElement to track.\n */\n elementAdd(element) {\n if (!element) return;\n\n this.process.elementAdd.call(this, element);\n }\n\n /**\n * @method elementForDiagramID()\n * return the object that is tied to the given xml diagram ID.\n * @param {string} dID the diagram ID\n * @return {ABProcess[OBJ]}\n */\n elementForDiagramID(dID) {\n if (!dID) return null;\n\n return this.process.elementForDiagramID.call(this, dID);\n }\n\n /**\n * @method elementRemove()\n * remove an element from being tracked by this process.\n * @param {obj|ABProcessElement} def\n * a definition of, or full Object instance of the ABProcessElement\n * to remove.\n */\n elementRemove(def) {\n if (!def) return;\n\n this.process.elementRemove.call(this, def);\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nconst ABFieldList = require(\"../../../platform/dataFields/ABFieldList.js\");\n\nvar ABProcessTaskApprovalDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"check-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [\"userFormID\", \"userFormResponse\"],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"Approval\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"who\", \"toUsers\", \"formBuilder\"],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class ABProcessTaskUserApprovalCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.user.approval\";\n super(attributes, process, AB, ABProcessTaskApprovalDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskApprovalDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n fromValues(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n super.fromValues(attributes);\n\n function fixBoolean(obj) {\n if (obj) {\n Object.keys(obj).forEach((k) => {\n if (obj[k] == \"false\") {\n obj[k] = false;\n } else if (obj[k] == \"true\") {\n obj[k] = true;\n } else if (typeof obj[k] == \"object\") {\n fixBoolean(obj[k]);\n }\n });\n }\n }\n fixBoolean(this.formBuilder);\n }\n\n /**\n * @method toObj()\n * properly compile the current state of this object instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n /* \n toObj() {\n var data = super.toObj();\n\n ABProcessTaskApprovalDefaults.fields.forEach((f) => {\n data[f] = this[f];\n });\n\n return data;\n }\n*/\n ////\n //// Process Instance Methods\n ////\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n /*\n initState(context, val) {\n var myDefaults = {};\n ABProcessTaskApprovalDefaults.instanceValues.forEach((v) => {\n myDefaults[v] = null;\n });\n\n super.initState(context, myDefaults, val);\n }\n*/\n\n /*\n * preProcessFormIOComponents()\n * we need to parse the form.io components to ensure the proper columnName\n * and labels are being used. We also will translate the columnNames at this\n * point in the code\n */\n preProcessFormIOComponents() {\n var fields = this.process.processDataFields(this);\n if (fields && this.formBuilder && this.formBuilder.components) {\n this.formBuilder.components.forEach((c) => {\n if (c.abFieldID) {\n fields.filter((entry) => {\n if (entry.field?.id == c.abFieldID) {\n c.label = entry.field.label;\n c.key = entry.key;\n if (c.data?.values && entry.field.settings.options) {\n var vals = [];\n entry.field.settings.options.forEach((opt) => {\n vals.push({\n label: opt.text,\n value: opt.id,\n });\n });\n c.data.values = vals;\n }\n }\n });\n } else if (c.components && c.components.length) {\n c.key = c.path;\n c.components.forEach((o) => {\n if (o.abFieldID) {\n // these are plucked conneted values\n // gather up all their fields to be used\n var pluck = fields.filter((f) => {\n return f.key == c.path;\n })[0];\n if (!pluck) return;\n pluck.object.fields().filter((entry) => {\n if (entry?.id == o.abFieldID) {\n o.label = entry.label;\n o.key = entry.columnName;\n if (o.data?.values && entry.settings.options) {\n var vals = [];\n entry.settings.options.forEach((opt) => {\n vals.push({\n label: opt.text,\n value: opt.id,\n });\n });\n o.data.values = vals;\n }\n }\n });\n }\n });\n }\n });\n }\n return this.formBuilder;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n // we need to get the button events defined by the form.io formBuilder\n var options = [];\n this.formBuilder.components.forEach((comp) => {\n if (comp.type == \"button\" && comp.action == \"event\" && comp.event) {\n options.push({\n id: comp.event,\n text: comp.label,\n });\n }\n });\n // in this Task, we can return the Response to the UserForm\n // The Response can be in the form of a List Field, with one or more\n // return options.\n\n var myID = this.diagramID;\n\n // create an ABFieldList object:\n // make sure the options follow what is currently defined for our\n // responses:\n var myObj = this.AB.objectNew({});\n var listField = new ABFieldList(\n {\n id: `${myID}.userFormResponse`,\n label: `${this.label}->Response`,\n columnName: `${myID}.userFormResponse`,\n settings: {\n options: options,\n },\n },\n myObj\n );\n\n // NOTE: We are pretending our response is a type of ABFieldList. But our\n // ABField objects no longer allow \".\" in our columnNames:\n // ( https://github.com/CruGlobal/appbuilder_class_core/blob/212cf5fa1c1d5c959aa246c730582ed50809ee0f/dataFields/ABFieldCore.js#L262 )\n // But our Process tasks really will be expecting it there so lets put\n // it back:\n listField.columnName = `${myID}.userFormResponse`;\n\n return [\n {\n key: `${myID}.userFormResponse`,\n label: `${this.label}->Response`,\n field: listField,\n object: null,\n },\n ];\n }\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n processData(instance, key) {\n if (key) {\n var parts = key.split(\".\");\n if (parts[0] == this.diagramID) {\n var myState = this.myState(instance);\n return myState[parts[1]];\n }\n }\n return null;\n }\n};\n","/**\n * ABProcessTaskUserCore\n *\n * This defines the base User Task element that can be placed on a BPMN\n * diagram. In our system, we will let the designer choose a sub class\n * to make active for this element.\n *\n * Currently a UserTask expects a human user to perform an action. These\n * actions are in the possible forms:\n * - confirm offline action\n * - approve data\n * - fill out a form\n *\n */\n\nconst ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar ABProcessTaskUserDefaults = {\n category: \"task\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"user\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"TaskUser\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nmodule.exports = class ABProcessTaskUserCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"process.task.user\";\n super(attributes, process, AB, ABProcessTaskUserDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskUserDefaults;\n }\n\n static DiagramReplace() {\n // taken from \"bpmn-js/lib/features/replace/ReplaceOptions\"\n return {\n label: \"User Task\",\n actionName: \"replace-with-user-task\",\n className: \"bpmn-icon-user\",\n target: {\n type: \"bpmn:UserTask\",\n },\n };\n }\n\n ////\n //// Process Instance Methods\n ////\n\n /**\n * do()\n * this method actually performs the action for this task.\n * @param {obj} instance the instance data of the running process\n * @return {Promise}\n * resolve(true/false) : true if the task is completed.\n * false if task is still waiting\n */\n // do(instance) {\n // return new Promise((resolve, reject) => {\n // // for testing:\n // var myState = this.myState(instance);\n // myState.status = \"completed\";\n // this.log(instance, \"Email Sent successfully\");\n // resolve(true);\n // });\n // }\n\n /**\n * initState()\n * setup this task's initial state variables\n * @param {obj} context the context data of the process instance\n * @param {obj} val any values to override the default state\n */\n initState(context, val) {\n var myDefaults = {\n roles: [],\n ui: null,\n };\n\n super.initState(context, myDefaults, val);\n }\n};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nconst ABProcessTaskUserExternalDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"plus-circle\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [\"userFormID\", \"userFormResponse\"],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"External\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"who\", \"toUsers\", \"url\"],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nconst settings = {\n who: 0,\n toUsers: null,\n url: \"\",\n};\n\nmodule.exports = class ABProcessTaskUserExternalCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n for (const key in settings)\n attributes[key] = attributes[key] ?? settings[key];\n super(\n Object.assign(\n {\n type: \"process.task.service.external\",\n },\n attributes\n ),\n process,\n AB,\n ABProcessTaskUserExternalDefaults\n );\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskUserExternalDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n return [\n {\n key: `${this.id}.userFormResponse`,\n label: `${this.label}->Response`,\n },\n ];\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nconst ABProcessTaskUserFormDefaults = {\n category: null,\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n icon: \"form\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n instanceValues: [\"\"],\n // instanceValues: {array}\n // a list of values this element tracks as it is operating in a process.\n\n key: \"Form\",\n // key: {string}\n // unique key to reference this specific Task\n\n settings: [\"formBuilder\"],\n // settings: {array}\n // a list of internal setting values this Element tracks. These are the\n // values set by the platform .propertiesStash()\n};\n\nconst settings = {};\n\nmodule.exports = class ABProcessTaskUserFormCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n for (const key in settings)\n attributes[key] = attributes[key] ?? settings[key];\n super(\n Object.assign(\n {\n type: \"process.task.service.form\",\n },\n attributes\n ),\n process,\n AB,\n ABProcessTaskUserFormDefaults\n );\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskUserFormDefaults;\n }\n\n static DiagramReplace() {\n return null;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n return (this.formBuilder?.components ?? [])\n .filter((comp) => comp.type != \"button\")\n .map((comp) => {\n return {\n key: comp.key,\n label: `${this.label}->${comp.label}`,\n };\n });\n }\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n processData(instance, key) {\n if (!key) return null;\n\n const myState = this.myState(instance);\n\n return myState[key];\n }\n};\n","const ABProcessElement = require(\"../../../platform/process/tasks/ABProcessElement.js\");\n\nvar ABProcessTriggerDefaults = {\n category: \"start\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n fields: [],\n // fields: {array}\n // a list of internal setting values this Element tracks\n\n icon: \"key\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n key: \"Trigger\",\n // key: {string}\n // unique key to reference this specific Task\n};\n\nmodule.exports = class ABProcessTriggerCore extends ABProcessElement {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"trigger\";\n super(attributes, process, AB, ABProcessTriggerDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTriggerDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Signal Start Event\",\n actionName: \"replace-with-signal-start\",\n className: \"bpmn-icon-start-event-signal\",\n target: {\n type: \"bpmn:StartEvent\",\n // type: {string} the general bpmn category\n // \"StartEvent\", \"Task\", \"EndEvent\", \"ExclusiveGateway\"\n eventDefinitionType: \"bpmn:SignalEventDefinition\",\n },\n };\n }\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.triggerKey = attributes.triggerKey || \"triggerKey.??\";\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var data = super.toObj();\n\n data.triggerKey = this.triggerKey;\n\n return data;\n }\n};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessTrigger = require(\"../../../platform/process/tasks/ABProcessTrigger.js\");\n\nvar ABProcessTaskTriggerLifecycleDefaults = {\n category: \"start\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n fields: [\n \"objectID\",\n \"lifecycleKey\" /* , \"triggerKey\" is tracked in ABProcessTrigger */,\n ],\n // fields: {array}\n // a list of internal setting values this Element tracks\n\n icon: \"key\",\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n key: \"TriggerLifecycle\",\n // key: {string}\n // unique key to reference this specific Task\n};\n\nmodule.exports = class ABProcessTriggerLifecycle extends ABProcessTrigger {\n constructor(attributes, process, AB) {\n attributes.type = attributes.type || \"trigger\";\n super(attributes, process, AB, ABProcessTaskTriggerLifecycleDefaults);\n\n // listen\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskTriggerLifecycleDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Object Lifecycle Trigger\",\n actionName: \"replace-with-signal-lifecycle-start\",\n // type: {string} a unique key to reference this element\n className: \"bpmn-icon-start-event-signal\",\n target: {\n type: \"bpmn:StartEvent\",\n // type: {string} the general bpmn category\n // \"StartEvent\", \"Task\", \"EndEvent\", \"ExclusiveGateway\"\n eventDefinitionType: \"ab:SignalLifecycle\",\n },\n };\n }\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.objectID = attributes.objectID || \"objID.??\";\n this.lifecycleKey = attributes.lifecycleKey || \"lifecycle.key??\";\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var data = super.toObj();\n\n data.objectID = this.objectID;\n data.lifecycleKey = this.lifecycleKey;\n return data;\n }\n\n /**\n * processDataFields()\n * return an array of avaiable data fields that this element\n * can provide to other ProcessElements.\n * Different Process Elements can make data available to other\n * process Elements.\n * @return {array} | null\n */\n processDataFields() {\n var fields = null;\n if (this.objectID) {\n fields = [];\n var object = this.AB.objectByID(this.objectID);\n if (object) {\n var myID = this.diagramID;\n object.fields().forEach((field) => {\n fields.push({\n key: `${myID}.${field.id}`,\n label: `${this.label}->${object.label}->${field.label}`,\n field,\n object,\n });\n });\n fields.push({\n key: `${myID}.uuid`,\n label: `${this.label}->${object.label}`,\n field: null,\n object,\n });\n } else {\n // OK, so we have an this.objectID defined, but we can't find it.\n // that's something we need to alert:\n var error = new Error(\n `ABProcessTriggerLifecycleCore.processDataFields():TaskID[${this.id}]: could not find referenced object by ID [${this.objectID}]`\n );\n this.AB.notify.builder(error, {\n task: this.id,\n objID: this.objectID,\n });\n }\n }\n return fields;\n }\n\n /**\n * processData()\n * return the current value requested for the given data key.\n * @param {obj} instance\n * @return {mixed} | null\n */\n processData(instance, key) {\n var parts = key.split(\".\");\n if (parts[0] == this.diagramID) {\n var myState = this.myState(instance);\n if (myState[\"data\"]) {\n var object = this.AB.objectByID(this.objectID);\n var field = object.fields((f) => {\n return f.id == parts[1];\n })[0];\n if (field) {\n if (parts[2]) {\n return field[parts[2]].call(field, myState[\"data\"]);\n } else {\n // instance.context.data[field.column_name];\n // if field is \"calculate\" or \"TextFormula\" data is not stored\n // in data base and we need to run format method\n if ([\"calculate\", \"TextFormula\"].indexOf(field.key) != -1) {\n return field.format(myState[\"data\"]);\n } else if (\n field.key == \"connectObject\" ||\n field.key == \"user\"\n ) {\n return (\n myState[\"data\"][field.relationName()] ||\n myState[\"data\"][field.columnName]\n );\n } else {\n return myState[\"data\"][field.columnName];\n }\n }\n } else if (parts[1] == \"uuid\") {\n return myState[\"data\"][\"uuid\"];\n } else {\n ///\n /// Questioning the validity of this section of code.\n /// In order to get here, we tried to find field, and it\n /// didn't exist.\n /// then we turn around and REPEAT the same attempt\n /// and check for field again.\n /*\n // parts[1] should be a field.id\n object = this.AB.objectByID(this.objectID);\n field = object.fields((f) => {\n return f.id == parts[1];\n })[0];\n if (field) {\n if (parts[2]) {\n return field[parts[2]].call(field, myState[\"data\"]);\n } else {\n // instance.context.data[field.column_name];\n return myState[\"data\"][field.columnName];\n }\n }\n */\n }\n }\n }\n return null;\n }\n\n /**\n * processDataObjects()\n * return an array of avaiable ABObjects that this element\n * can provide to other ProcessElements.\n * @return {array} | null\n */\n processDataObjects() {\n var objects = null;\n if (this.objectID) {\n objects = [this.AB.objectByID(this.objectID)];\n }\n return objects;\n }\n};\n","const ABProcessTrigger = require(\"../../../platform/process/tasks/ABProcessTrigger.js\");\n\nvar ABProcessTaskTriggerLifecycleDefaults = {\n category: \"start\",\n // category: {string} | null\n // if this Element should show up on one of the popup replace menus, then\n // specify one of the categories of elements it should be an option for.\n // Available choices: [ \"start\", \"gateway\", \"task\", \"end\" ].\n //\n // if it shouldn't show up under the popup menu, then leave this null\n\n fields: [\n \"repeatEvery\",\n \"repeatTime\",\n \"repeatDaily\",\n \"repeatWeekly\",\n \"repeatMonthly\",\n \"isEnabled\",\n ],\n // fields: {array}\n // a list of internal setting values this Element tracks\n\n icon: \"clock-o\", // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n // icon: {string}\n // font-awesome icon reference. (without the 'fa-'). so 'user' to reference 'fa-user'\n\n key: \"TimerStartEvent\",\n // key: {string}\n // unique key to reference this specific Task\n\n repeatEvery: \"daily\",\n repeatTime: \"01:00\",\n repeatDaily: \"day\",\n repeatWeekly: \"FRI\",\n repeatMonthly: \"last\",\n isEnabled: true,\n};\n\nmodule.exports = class ABProcessTriggerTimer extends ABProcessTrigger {\n constructor(attributes, process, application) {\n attributes.type = attributes.type || \"trigger\";\n super(\n attributes,\n process,\n application,\n ABProcessTaskTriggerLifecycleDefaults\n );\n }\n\n // return the default values for this DataField\n static defaults() {\n return ABProcessTaskTriggerLifecycleDefaults;\n }\n\n static DiagramReplace() {\n return {\n label: \"Timer Start Event\",\n actionName: \"replace-with-signal-timer-start\",\n // type: {string} a unique key to reference this element\n className: \"bpmn-icon-start-event-timer\",\n target: {\n type: \"bpmn:StartEvent\",\n // type: {string} the general bpmn category\n // \"StartEvent\", \"Task\", \"EndEvent\", \"ExclusiveGateway\"\n eventDefinitionType: \"ab:SignalTriggerTimer\",\n },\n };\n }\n\n fromValues(attributes) {\n super.fromValues(attributes);\n\n this.repeatEvery =\n attributes.repeatEvery ||\n ABProcessTaskTriggerLifecycleDefaults.repeatEvery;\n\n this.repeatDaily =\n attributes.repeatDaily ||\n ABProcessTaskTriggerLifecycleDefaults.repeatDaily;\n\n this.repeatWeekly =\n attributes.repeatWeekly ||\n ABProcessTaskTriggerLifecycleDefaults.repeatWeekly;\n\n this.repeatMonthly =\n attributes.repeatMonthly ||\n ABProcessTaskTriggerLifecycleDefaults.repeatMonthly;\n\n // Convert UTC to local time\n if (attributes.repeatTime) {\n let timeVals = attributes.repeatTime.split(\":\");\n let currDate = new Date();\n currDate.setUTCHours(timeVals[0]);\n currDate.setUTCMinutes(timeVals[1]);\n this.repeatTime = `${currDate.getHours()}:${currDate.getMinutes()}`;\n } else {\n this.repeatTime = ABProcessTaskTriggerLifecycleDefaults.repeatTime;\n }\n\n if (typeof attributes.isEnabled != \"undefined\") {\n this.isEnabled = JSON.parse(attributes.isEnabled);\n } else {\n this.isEnabled = ABProcessTaskTriggerLifecycleDefaults.isEnabled;\n }\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var data = super.toObj();\n\n data.repeatEvery = this.repeatEvery;\n data.repeatDaily = this.repeatDaily;\n data.repeatWeekly = this.repeatWeekly;\n data.repeatMonthly = this.repeatMonthly;\n\n // Convert local time to UTC\n data.repeatTime = this.repeatTime;\n if (data.repeatTime && data.repeatTime instanceof Date) {\n data.repeatTime = `${data.repeatTime.getUTCHours()}:${data.repeatTime.getMinutes()}`;\n }\n\n data.isEnabled = this.isEnabled;\n\n return data;\n }\n\n getCronExpression() {\n let timeVals = this.repeatTime.split(\":\");\n let second = \"*\";\n let minute = timeVals[1];\n let hour = timeVals[0];\n let day;\n let month;\n let dayWeek;\n let year = \"*\";\n\n switch (this.repeatEvery) {\n case \"daily\":\n day = \"*\";\n month = \"*\";\n dayWeek = this.repeatDaily == \"weekday\" ? \"1-5\" : \"*\";\n break;\n case \"weekly\":\n day = \"*\";\n month = \"*\";\n dayWeek = this.repeatWeekly;\n break;\n case \"monthly\":\n day = this.repeatMonthly;\n month = \"*\";\n dayWeek = \"*\";\n break;\n }\n\n return `${second} ${minute} ${hour} ${day} ${month} ${dayWeek} ${year}`;\n }\n};\n","/*\n * ABQL\n *\n * An ABQL defines the base class for our AB Query Language Objects.\n * These classes share a common way to\n * - parse input strings for commands\n *\n *\n */\nvar ABEmitter = require(\"../../platform/ABEmitter\");\nclass ABQLCore extends ABEmitter {\n constructor(attributes, parameterDefinitions, prevOP, task, AB) {\n super();\n\n // manage the incoming Parameter Definitions\n if (!Array.isArray(parameterDefinitions)) {\n parameterDefinitions = [parameterDefinitions];\n }\n\n this.parameterDefinitions = parameterDefinitions;\n\n this.object = prevOP ? prevOP.object : null;\n // {ABObject}\n // The current {ABObject} the current Query Language Operation is associated\n // with.\n\n // if the previous Operation defined an .objectOut then our .object is THAT\n // one.\n if (prevOP && prevOP.objectOut) this.object = prevOP.objectOut;\n\n this.prevOP = prevOP;\n this.task = task;\n // {ABProcessTaskxxx}\n // This is running under a specific ABProcessTaskServiceQuery. When\n // searching for data from the Process, we must go through this.task\n // to do so.\n\n this.AB = AB;\n this.next = null;\n\n this.fromAttributes(attributes);\n }\n\n ///\n /// Instance Methods\n ///\n initObject(attributes) {}\n\n fromAttributes(attributes) {\n /*\n {\n id: uuid(),\n name: 'name',\n type: 'xxxxx',\n json: \"{json}\"\n }\n */\n\n // super.fromValues(attributes);\n this.key = this.constructor.key ?? null;\n\n // this.entryComplete = attributes.entryComplete || false;\n this.params = attributes.params ?? {};\n // {hash}\n // The configuration values entered by the AppBuilder UI for this\n // operation.\n\n this.objectID = attributes.objectID || null;\n\n // be sure to do a hard lookup if an objectID was saved:\n if (this.objectID) this.object = this.objectLookup(this.objectID);\n\n this.initObject(attributes);\n\n // at least dump a warning here:\n if (this.objectID && !this.object)\n this.AB.notify.developer(\n new Error(\n `ABQLCore.fromAttributes(): unable to initialize ABObject [${this.objectID}]`\n ),\n {\n attributes,\n objectID: this.objectID,\n }\n );\n\n if (attributes.next) {\n let nextOP = null;\n\n (this.NextQLOps ?? this.constructor.NextQLOps).forEach((OP) => {\n if (OP.key === attributes.next.key) nextOP = OP;\n });\n\n if (nextOP) {\n // exact match, so add next:\n const qlOP = new nextOP(attributes.next, this, this.task, this.AB);\n\n this.next = qlOP;\n }\n }\n }\n\n /**\n * @method objectLookup()\n * return a matching {ABObject} that is represented by the given id.\n * NOTE: we will try to match on: our initial .objectID first, then\n * the given objID.\n * NOTE: this will match an object.id as well as object.label\n * @param {string} objID\n */\n objectLookup(objID) {\n return this.AB.objects((o) => {\n const quotedLabel = `\"${o.label}\"`;\n\n return (\n // o.id === this.objectID ||\n o.id === objID || quotedLabel.indexOf(objID) === 0\n );\n })[0];\n }\n\n /**\n * @method availableProcessDataFieldsHash()\n * return a { \"field.key\" => {processFieldDef} } hash of the currently\n * available fields in the process.\n * @return {obj}\n */\n availableProcessDataFieldsHash() {\n const availableProcessDataFields =\n this.task.process.processDataFields(this.task) ?? [];\n const hashFieldIDs = {};\n\n availableProcessDataFields.forEach((f) => {\n if (f.field) {\n hashFieldIDs[f.field.id] = f;\n } else {\n hashFieldIDs[f.key] = f;\n }\n });\n\n return hashFieldIDs;\n }\n\n /*\n * @method paramChanged()\n * respond to an update to the given parameter.\n * NOTE: the value will ALREADY be saved in this.params[pDef.name].\n * @param {obj} pDef\n * the this.parameterDefinition entry of the parameter that was\n * changed.\n */\n paramChanged(pDef) {}\n\n /**\n * @method toObj()\n * properly compile the current state of this ABQL instance\n * into the values needed for saving to the DB.\n * @return {json}\n */\n toObj() {\n const obj = {\n key: this.constructor.key,\n // entryComplete: this.entryComplete,\n params: this.params,\n // currQuery: this.currQuery,\n // queryValid: this.queryValid,\n objectID: this.object?.id ?? null,\n };\n\n if (this.next) {\n obj.next = this.next.toObj();\n }\n\n return obj;\n }\n}\n\nmodule.exports = ABQLCore;\n","/*\n * ABQLFindCore\n *\n * An ABQLFind depends on a BASE QL object (Object, Datacollection, Query)\n * and can perform a DB query based upon that BASE object.\n *\n */\n\nconst ABQL = require(\"../../platform/ql/ABQL.js\");\nconst NextQLOps = require(\"./ABQLSet.js\");\n// {array} of {ABQLxxx} options\n// this is an array of what possible next Operations can come after an\n// ABQLFind task is complete. In this case the {ABQLSet} operations come\n// next. {ABQLSet} operations work on a Set|{Array} or data results.\n\nconst ParameterDefinitions = [\n {\n type: \"objectConditions\",\n name: \"cond\",\n },\n];\n\nclass ABQLFindCore extends ABQL {\n constructor(attributes, prevOP, task, AB) {\n super(attributes, ParameterDefinitions, prevOP, task, AB);\n }\n\n ///\n /// Instance Methods\n ///\n}\n\nABQLFindCore.key = \"find\";\nABQLFindCore.label = \"find\";\nABQLFindCore.NextQLOps = NextQLOps;\n\nmodule.exports = ABQLFindCore;\n","/*\n * ABQLManagerCore\n *\n * An interface for managing the different ABQL Operations available in our\n * AppBuilder.\n *\n */\n\nconst QLObject = require(\"../../platform/ql/ABQLRootObject.js\");\nconst QLOps = [QLObject];\n\nconst ABQLManagerCore = {\n /**\n * @method fromAttributes()\n * return an {ABQL} object that represents the given attributes that\n * were saved from the previous .toObj()\n * @param {object} attributes\n *\t\t the values returned from the previous .toObj() call\n * @param {ABProcessTask***} task\n *\t\t the current ABProcessTaskServiceQuery that contains this QL\n * @param {ABFactory} AB\n *\t\t the current ABFactory we are operating under.\n * @return {ABQL} | null\n */\n fromAttributes: function (attributes, task, AB) {\n if (!attributes) return null;\n\n const matchingOPs = [];\n\n ABQLManagerCore.QLOps.forEach((Op) => {\n if (Op.key === attributes.key) matchingOPs.push(Op);\n });\n\n if (matchingOPs.length === 1) {\n // let this Operation initialize and return the last OP\n // in the chain\n const qlOP = new matchingOPs[0](attributes, task, AB);\n\n return qlOP;\n } else return null;\n },\n\n /**\n * @array QLOps\n * An array of the root QL Operations.\n */\n QLOps: QLOps,\n};\nmodule.exports = ABQLManagerCore;\n","/*\n * ABQLRootObjectCore\n *\n * An ABQL defines a Query Language Operation. A QL Operation\n * is intended to be evaluated at run time and return a value that can be\n * assigned to form value or an object.\n *\n *\n */\n\nconst ABQL = require(\"../../platform/ql/ABQL.js\");\n\n// Define the Operations that can be performed off of a RootObject.\n// Each Root Object might have a different set of Operations, so we\n// define them here.\nconst QLFind = require(\"../../platform/ql/ABQLFind.js\");\nconst NextQLOps = [QLFind];\n\nconst ParameterDefinitions = [\n {\n type: \"objectName\",\n name: \"name\",\n },\n];\n\nclass ABQLObjectCore extends ABQL {\n constructor(attributes, task, AB) {\n // NOTE: keep this so we can insert the prevOp == null\n super(attributes, ParameterDefinitions, null, task, AB);\n }\n\n ///\n /// Instance Methods\n ///\n initObject(/* attributes */) {\n if (!this.object && this.params) {\n const objNameDef = this.parameterDefinitions.find((pDef) => {\n return pDef.type === \"objectName\";\n });\n\n if (objNameDef) {\n this.objectID = this.params[objNameDef.name];\n this.object = this.objectLookup(this.objectID);\n }\n\n if (!this.object) {\n // This function exists on platform_web but not platform_service\n this.warningMessage?.(\"has no object set.\", {\n objectID: this.objectID,\n });\n }\n }\n }\n\n toObj() {\n const obj = super.toObj();\n\n // if we don't have an objectID, but we have an objectName parameter\n // definition then save that as our objectID\n if (!obj.objectID && this.params) {\n const objNameDef = this.parameterDefinitions.find((pDef) => {\n return pDef.type === \"objectName\";\n });\n\n if (objNameDef) obj.objectID = this.params[objNameDef.name];\n }\n\n return obj;\n }\n}\n\nABQLObjectCore.key = \"object\";\nABQLObjectCore.label = \"object\";\nABQLObjectCore.NextQLOps = NextQLOps;\n\nmodule.exports = ABQLObjectCore;\n","/*\n * ABQLRow\n *\n * Defines all the QL operations that can be performed on a Row of data. This is a\n * Single row/instance of an object.\n *\n */\n\nconst QLUpdate = require(\"../../platform/ql/ABQLRowUpdate.js\");\nconst QLSave = require(\"../../platform/ql/ABQLRowSave\");\nconst QLPluck = require(\"../../platform/ql/ABQLRowPluck\");\n\nmodule.exports = [QLUpdate, QLSave, QLPluck];\n","/*\n/*\n * ABQLRowPluckCore\n *\n * An ABQLRowPluckCore can process a value of data and puck out a specified\n * field to then make an object of values that only contain that field.\n *\n */\n\n// const ABQLValue = require(\"./ABQLValue.js\");\n// const ABQLSet = require(\"./ABQLSet.js\");\nconst ABQLSetPluck = require(\"../../platform/ql/ABQLSetPluck.js\");\nconst ABQLRowUpdate = require(\"../../platform/ql/ABQLRowUpdate.js\");\nconst ABQLRowSave = require(\"../../platform/ql/ABQLRowSave.js\");\n\nclass ABQLRowPluckCore extends ABQLSetPluck {\n // Dynamic NextQLOps\n get NextQLOps() {\n let nextQLOps = [];\n\n const field = this.field ?? this.object.fieldByID(this.fieldID) ?? null;\n\n // Update .NextQLOps WARN: update to static it affects to every ABQLRowPluck instances.\n switch (field?.key) {\n // M:1 M:N connect field, then set ABQLSet to next steps\n case \"connectObject\":\n if (field.settings.linkType === \"many\") {\n // NOTE: Could not require(\"./ABQLSet.js\") on the top. It returns an empty object. Why ><\n const ABQLSet = require(\"./ABQLSet.js\");\n\n nextQLOps = ABQLSet;\n\n break;\n }\n\n // return ABQLRow.js\n nextQLOps = this.prevOP.constructor.NextQLOps.filter(\n (NextQLOp) =>\n NextQLOp.key === this.constructor.key ||\n NextQLOp.key === ABQLRowUpdate.key\n );\n\n break;\n\n case \"user\":\n // TODO set this up corectlys\n if (\n field.settings.linkType === \"many\" ||\n field.settings.isMultiple // may be unnessicary\n ) {\n // NOTE: Could not require(\"./ABQLSet.js\") on the top. It returns an empty object. Why ><\n const ABQLSet = require(\"./ABQLSet.js\");\n\n nextQLOps = ABQLSet;\n\n break;\n }\n\n // default\n nextQLOps = this.prevOP.constructor.NextQLOps.filter(\n (NextQLOp) =>\n NextQLOp.key === this.constructor.key ||\n NextQLOp.key === ABQLRowUpdate.key ||\n NextQLOp.key === ABQLRowSave.key\n );\n\n break;\n\n default:\n // Normal field and _PK\n nextQLOps = this.prevOP.constructor.NextQLOps.filter(\n (NextQLOp) => NextQLOp.key === ABQLRowSave.key\n );\n\n break;\n }\n\n return nextQLOps;\n }\n}\n\nABQLRowPluckCore.key = \"row_pluck\";\nABQLRowPluckCore.label = \"Read the value from the field\";\nABQLRowPluckCore.NextQLOps = []; // Static NextQLOps\n\nmodule.exports = ABQLRowPluckCore;\n","/*\n/*\n * ABQLRowSaveCore\n *\n * An ABQLRowSave can store the current Data set into the Process Task it is\n * in, so that this data can be made available to other Process Tasks.\n *\n */\n\nconst ABQLSetSave = require(\"../../platform/ql/ABQLSetSave.js\");\n\nclass ABQLRowSaveCore extends ABQLSetSave {}\n\nABQLRowSaveCore.key = \"row_save\";\nABQLRowSaveCore.label = \"Save the value as\";\nABQLRowSaveCore.NextQLOps = [];\n// NOTE: currently, this is an ending step. but it doesn't have to be...\n\nmodule.exports = ABQLRowSaveCore;\n","/*\n * ABQLRowUpdateCore\n *\n * An ABQLRow Update allows you to update the values on the current\n * Row of data.\n *\n */\n\nconst ABQL = require(\"../../platform/ql/ABQL.js\");\n// const ABQLRow = require(\"./ABQLRow.js\");\n\nconst ParameterDefinitions = [\n {\n type: \"objectValues\",\n name: \"values\",\n },\n];\n\nclass ABQLRowUpdateCore extends ABQL {\n constructor(attributes, prevOP, task, AB) {\n super(attributes, ParameterDefinitions, prevOP, task, AB);\n\n // #Hack! : when an Operation provides the same .NextQlOps that it\n // was defined in, we can't require it again ==> circular dependency.\n // so we manually set it here from the operation that created us:\n this.constructor.NextQLOps = prevOP.constructor.NextQLOps;\n }\n\n ///\n /// Instance Methods\n ///\n}\n\nABQLRowUpdateCore.key = \"update\";\nABQLRowUpdateCore.label = \"Update this record\";\nABQLRowUpdateCore.NextQLOps = [];\n// NOTE: .NextQLOps => see the #Hack in the constructor\n\nmodule.exports = ABQLRowUpdateCore;\n","/*\n * ABQLSet\n *\n * Here we define the group of operations that can be performed on a SET of data.\n * A SET is an array of objects/row data.\n *\n */\n\nmodule.exports = [\n require(\"../../platform/ql/ABQLSetFirst.js\"),\n require(\"../../platform/ql/ABQLSetPluck.js\"),\n require(\"../../platform/ql/ABQLSetSave.js\"),\n];\n","/*\n/*\n * ABQLSetFirstCore\n *\n * An ABQLFind depends on a BASE QL object (Object, Datacollection, Query)\n * and can perform a DB query based upon that BASE object.\n *\n */\n\nconst ABQL = require(\"../../platform/ql/ABQL.js\");\nconst ABQLRow = require(\"./ABQLRow.js\");\n// {array} of {ABQLxxx} options\n// this is an array of what possible next Operations can come after an\n// ABQLSetFirst task is complete. In this case the {ABQLRow} operations come\n// next. {ABQLRow} operations work on a single row of data.\n\nclass ABQLSetFirstCore extends ABQL {\n constructor(attributes, prevOP, task, AB) {\n super(attributes, [], prevOP, task, AB);\n }\n\n ///\n /// Instance Methods\n ///\n}\n\nABQLSetFirstCore.key = \"first\";\nABQLSetFirstCore.label = \"Select the first record\";\nABQLSetFirstCore.NextQLOps = ABQLRow;\n\nmodule.exports = ABQLSetFirstCore;\n","/*\n/*\n * ABQLSetPluckCore\n *\n * An ABQLSetPluck can process a set (array) of data and puck out a specified\n * field to then make an array of values that only contain that field.\n *\n */\n\nconst ABQL = require(\"../../platform/ql/ABQL.js\");\n// const ABQLSet = require(\"./ABQLSet.js\");\n\nconst ParameterDefinitions = [\n {\n type: \"objectFields\",\n name: \"fieldID\",\n },\n];\n\nclass ABQLSetPluckCore extends ABQL {\n constructor(attributes, prevOP, task, AB) {\n super(attributes, ParameterDefinitions, prevOP, task, AB);\n }\n\n ///\n /// Instance Methods\n ///\n\n fromAttributes(attributes) {\n // #Hack! : when an Operation provides the same .NextQlOps that it\n // was defined in, we can't require it again ==> circular dependency.\n // so we manually set it here from the operation that created us:\n this.constructor.NextQLOps = this.prevOP.constructor.NextQLOps;\n\n // we need to gather our .field and .objectOut before we\n // allow our base class to continue forward:\n\n this.fieldID = attributes.fieldID;\n this.field = this.object?.fieldByID(this.fieldID);\n\n //// TODO: figure out how to dynamically update the next row of options\n //// based upon the current choice of field.\n // // based upon the type of field, we now configure what next steps\n // // are available.\n // if (this.field) {\n // // if connected, then we can stay with same .NextQLOps\n // // so we can just leave what we did above.\n\n // // if a discreet value, then we need to remove SetPluck\n // if (!this.field.isConnection) {\n // this.constructor.NextQLOps = [\n // ...this.prevOP.constructor.NextQLOps,\n // ].filter((o) => o.key != this.constructor.key);\n // }\n // }\n\n if (attributes.objectOutID)\n this.objectOut = this.objectLookup(attributes.objectOutID);\n\n super.fromAttributes(attributes);\n }\n\n toObj() {\n const obj = super.toObj();\n\n if (this.fieldID) {\n obj.fieldID = this.fieldID;\n\n if (this.objectOut) obj.objectOutID = this.objectOut.id;\n } else {\n obj.fieldID = this.params.field || null;\n\n const field = this.object.fieldByID(obj.fieldID);\n\n if (field?.isConnection) obj.objectOutID = field.datasourceLink.id;\n }\n\n return obj;\n }\n}\n\nABQLSetPluckCore.key = \"set_pluck\";\nABQLSetPluckCore.label = \"Read the value from the field\";\nABQLSetPluckCore.NextQLOps = [];\n\nmodule.exports = ABQLSetPluckCore;\n","/*\n/*\n * ABQLSetSaveCore\n *\n * An ABQLSetSave can store the current Data set into the Process Task it is\n * in, so that this data can be made available to other Process Tasks.\n *\n */\n\nconst ABQL = require(\"../../platform/ql/ABQL.js\");\n\nconst ParameterDefinitions = [\n {\n type: \"taskParam\",\n name: \"task_param\",\n },\n];\n\nclass ABQLSetSaveCore extends ABQL {\n constructor(attributes, prevOP, task, AB) {\n super(attributes, ParameterDefinitions, prevOP, task, AB);\n\n // TODO: register with the task that we can provide data.\n if (this.taskParam) {\n task.registerDatasource(this);\n this.registered = true;\n }\n }\n\n ///\n /// Instance Methods\n ///\n\n fromAttributes(attributes) {\n // #Hack! : when an Operation provides the same .NextQlOps that it\n // was defined in, we can't require it again ==> circular dependency.\n // so we manually set it here from the operation that created us:\n this.constructor.NextQLOps = this.prevOP.constructor.NextQLOps;\n\n super.fromAttributes(attributes);\n\n this.taskParam = attributes.taskParam || this.params.task_param;\n }\n\n toObj() {\n const obj = super.toObj();\n\n obj.taskParam = this.taskParam || this.params.task_param;\n\n return obj;\n }\n\n processDataField(id, label) {\n // we have to report back on:\n // key: id.taskParam\n // label: label->taskParam\n // object: ABObject\n // field: ABField\n // set : {bool}\n\n let field = null;\n // {ABField}\n // if the value being stored is NOT a connectObject, then it is\n // a particular field in the previous object.\n\n // if we are saving a specific field of an Object, pass that\n // ABField along:\n if (this.prevOP?.field?.key !== \"connectObject\")\n field = this?.prevOP?.field;\n\n return {\n key: `${id}.${this.taskParam || this.params.task_param}`,\n label: `${label}->${this.taskParam || this.params.task_param}`,\n field: field,\n object: this.object,\n set: true,\n };\n }\n}\n\nABQLSetSaveCore.key = \"set_save\";\nABQLSetSaveCore.label = \"Save the value as\";\nABQLSetSaveCore.NextQLOps = [];\n// NOTE: currently, this is an ending step. but it doesn't have to be...\n\nmodule.exports = ABQLSetSaveCore;\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewCSVExporterDefaults = {\n key: \"csvExporter\", // unique key identifier for this ABViewForm\n icon: \"download\", // icon reference: (without 'fa-' )\n labelKey: \"CSV Exporter\", // {string} the multilingual label key for the class label\n};\n\nconst ABViewCSVExporterPropertyComponentDefaults = {\n dataviewID: null,\n where: null,\n buttonLabel: \"Export CSV\",\n filename: \"exportCSV\",\n hasHeader: true,\n width: 150,\n hiddenFieldIds: [],\n};\n\nmodule.exports = class ABViewCSVExporterCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewCSVExporterDefaults\n );\n }\n\n static common() {\n return ABViewCSVExporterDefaults;\n }\n\n static defaultValues() {\n return ABViewCSVExporterPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert to boolean\n if (typeof values.settings.hasHeader == \"string\")\n this.settings.hasHeader = JSON.parse(values.settings.hasHeader);\n\n if (this.settings.hasHeader == null)\n this.settings.hasHeader =\n ABViewCSVExporterPropertyComponentDefaults.hasHeader;\n\n // convert from \"0\" => 0\n this.settings.width = parseInt(\n values.settings.width ||\n ABViewCSVExporterPropertyComponentDefaults.width\n );\n\n this.settings.hiddenFieldIds =\n values.settings.hiddenFieldIds ||\n ABViewCSVExporterPropertyComponentDefaults.hiddenFieldIds;\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABRecordRule = require(\"../../rules/ABViewRuleListFormRecordRules\");\n\nconst ABViewCSVImporterDefaults = {\n key: \"csvImporter\",\n // {string}\n // unique key identifier for this ABViewForm\n\n icon: \"upload\",\n // {string}\n // font-awesome icon reference: (without 'fa-' )\n\n labelKey: \"CSV Importer\",\n // {string}\n // the multilingual label key for the class label\n // NOTE: will be used as L(labelKey)\n};\n\nconst ABViewCSVImporterPropertyComponentDefaults = {\n dataviewID: null,\n // {uuid}\n // The ABDataCollection.uuid that we are using to store the data.\n // NOTE: we actually use the DC to get the ABObject it is connected to.\n\n availableFieldIds: [],\n //{array}\n // A list of ABField.ids that are allowed to be imported using this widget.\n\n buttonLabel: \"Upload CSV\",\n // {string}\n // The Label(key) to display on the initial button\n\n width: 0,\n // {integer}\n // Width of the Popup.\n\n recordRules: [],\n // {array} [ {RecordRule}, ... ]\n // A list of ABViewRuleListFormRecordRules that should be performed upon\n // each row of data imported.\n // The Array should look like:\n // [{\n // action: {string},\n // when: [\n // {\n // fieldId: {UUID},\n // comparer: {string},\n // value: {string}\n // }\n // ],\n // values: [\n // {\n // fieldId: {UUID},\n // value: {object}\n // }\n // ]\n // }]\n};\n\nmodule.exports = class ABViewCSVImporterCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewCSVImporterDefaults\n );\n }\n\n /**\n * @method common()\n * Provides the default settings for an instance of an ABViewCSVImporter\n * @return {json}\n */\n static common() {\n return ABViewCSVImporterDefaults;\n }\n\n /**\n * @method defaultValues()\n * Provides the default settings for an instance of an ABViewCSVImporter\n * Component that is displayed on the UI.\n * @return {json}\n */\n static defaultValues() {\n return ABViewCSVImporterPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.width = parseInt(\n this.settings.width || ABViewCSVImporterPropertyComponentDefaults.width\n );\n }\n\n get RecordRule() {\n let object = this.datacollection?.datasource;\n if (!object) return null;\n\n if (this._recordRule == null) {\n this._recordRule = new ABRecordRule();\n }\n\n this._recordRule.formLoad(this);\n this._recordRule.fromSettings(this.settings.recordRules);\n this._recordRule.objectLoad(object);\n\n return this._recordRule;\n }\n\n doRecordRulesPre(rowDatas) {\n if (rowDatas && !Array.isArray(rowDatas)) {\n rowDatas = [rowDatas];\n }\n\n rowDatas.forEach((row) => {\n this.RecordRule?.processPre({ data: row.data || row, form: this });\n });\n }\n\n doRecordRules(rowDatas) {\n if (rowDatas && !Array.isArray(rowDatas)) {\n rowDatas = [rowDatas];\n }\n\n if (!this.RecordRule) return Promise.resolve();\n\n let tasks = [];\n\n rowDatas.forEach((row) => {\n tasks.push(\n this.RecordRule.process({ data: row.data || row, form: this })\n );\n });\n\n return Promise.all(tasks);\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewCarouselPropertyComponentDefaults = {\n dataviewID: null, // uuid of ABDatacollection\n field: null, // uuid\n\n width: 460,\n height: 275,\n showLabel: true,\n hideItem: false,\n hideButton: false,\n navigationType: \"corner\", // \"corner\" || \"side\"\n filterByCursor: false,\n\n detailsPage: null, // uuid\n detailsTab: null, // uuid\n editPage: null, // uuid\n editTab: null, // uuid\n};\n\nconst ABViewDefaults = {\n key: \"carousel\", // {string} unique key for this view\n icon: \"clone\", // {string} fa-[icon] reference for this view\n labelKey: \"Carousel\", // {string} the multilingual label key for the class label\n};\n\nfunction parseIntOrDefault(_this, key) {\n if (typeof _this.settings[key] != \"undefined\") {\n _this.settings[key] = parseInt(_this.settings[key]);\n } else {\n _this.settings[key] = ABViewCarouselPropertyComponentDefaults[key];\n }\n}\n\nfunction parseOrDefault(_this, key) {\n try {\n _this.settings[key] = JSON.parse(_this.settings[key]);\n } catch (e) {\n _this.settings[key] = ABViewCarouselPropertyComponentDefaults[key];\n }\n}\n\nmodule.exports = class ABViewCarouselCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewCarouselPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n parseIntOrDefault(this, \"width\");\n parseIntOrDefault(this, \"height\");\n\n // json\n parseOrDefault(this, \"showLabel\");\n parseOrDefault(this, \"hideItem\");\n parseOrDefault(this, \"hideButton\");\n\n this.settings.navigationType =\n this.settings.navigationType ||\n ABViewCarouselPropertyComponentDefaults.navigationType;\n\n parseOrDefault(this, \"filterByCursor\");\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n get imageField() {\n let dc = this.datacollection;\n if (!dc) return null;\n\n let obj = dc.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.field);\n }\n};\n","const ABViewChartContainer = require(\"../../platform/views/ABViewChartContainer\");\n\nconst ABViewChartAreaPropertyComponentDefaults = {\n areaType: \"area\",\n isLegend: 1,\n // chartWidth: 600,\n chartHeight: 200,\n labelFontSize: 12,\n stepValue: 20,\n maxValue: 100,\n};\n\nconst ABViewDefaults = {\n key: \"area\", // {string} unique key for this view\n icon: \"area-chart\", // {string} fa-[icon] reference for this view\n labelKey: \"Area\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewChartAreaCore extends ABViewChartContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewChartAreaPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.areaType =\n this.settings.areaType ||\n ABViewChartAreaPropertyComponentDefaults.areaType;\n\n this.settings.isLegend = parseInt(\n this.settings.isLegend ??\n ABViewChartAreaPropertyComponentDefaults.isLegend\n );\n\n // this.settings.chartWidth = parseInt(this.settings.chartWidth || ABViewChartAreaPropertyComponentDefaults.chartWidth);\n this.settings.chartHeight = parseInt(\n this.settings.chartHeight ??\n ABViewChartAreaPropertyComponentDefaults.chartHeight\n );\n\n this.settings.labelFontSize = parseInt(\n this.settings.labelFontSize ??\n ABViewChartAreaPropertyComponentDefaults.labelFontSize\n );\n this.settings.stepValue = parseInt(\n this.settings.stepValue ??\n ABViewChartAreaPropertyComponentDefaults.stepValue\n );\n this.settings.maxValue = parseInt(\n this.settings.maxValue ??\n ABViewChartAreaPropertyComponentDefaults.maxValue\n );\n\n this.translate(this, this, [\"areaLabel\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewChartContainer = require(\"../../platform/views/ABViewChartContainer\");\n\nconst ABViewChartBarPropertyComponentDefaults = {\n barType: \"bar\",\n barPreset: \"column\",\n isLegend: 1,\n // chartWidth: 600,\n height: 200,\n labelFontSize: 12,\n stepValue: 20,\n maxValue: 100,\n};\n\nconst ABViewDefaults = {\n key: \"bar\", // {string} unique key for this view\n icon: \"bar-chart\", // {string} fa-[icon] reference for this view\n labelKey: \"Bar\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewChartBarCore extends ABViewChartContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewChartBarPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.barType =\n this.settings.barType ||\n ABViewChartBarPropertyComponentDefaults.barType;\n\n this.settings.barPreset =\n this.settings.barPreset ||\n ABViewChartBarPropertyComponentDefaults.barPreset;\n\n this.settings.isLegend = parseInt(\n this.settings.isLegend ??\n ABViewChartBarPropertyComponentDefaults.isLegend\n );\n\n // this.settings.chartWidth = parseInt(this.settings.chartWidth || ABViewChartBarPropertyComponentDefaults.chartWidth);\n this.settings.height = parseInt(\n this.settings.height ?? ABViewChartBarPropertyComponentDefaults.height\n );\n\n this.settings.labelFontSize = parseInt(\n this.settings.labelFontSize ??\n ABViewChartBarPropertyComponentDefaults.labelFontSize\n );\n this.settings.stepValue = parseInt(\n this.settings.stepValue ??\n ABViewChartBarPropertyComponentDefaults.stepValue\n );\n this.settings.maxValue = parseInt(\n this.settings.maxValue ??\n ABViewChartBarPropertyComponentDefaults.maxValue\n );\n\n this.translate(this, this, [\"barLabel\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewContainer = require(\"../../platform/views/ABViewContainer\");\n\nconst ABViewChartPropertyComponentDefaults = {\n dataviewID: \"\",\n columnValue: \"\",\n columnLabel: \"\",\n columnValue2: \"\",\n isPercentage: 1,\n showLabel: 1,\n labelPosition: \"left\",\n labelWidth: 120,\n height: 200,\n multipleSeries: 0,\n};\n\nconst ABViewChartDefaults = {\n key: \"chart\", // {string} unique key for this view\n icon: \"bar-chart\", // {string} fa-[icon] reference for this view\n labelKey: \"Chart\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewChartCore extends ABViewContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewChartDefaults);\n }\n\n static common() {\n return ABViewChartDefaults;\n }\n\n static defaultValues() {\n return ABViewChartPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.dataviewID =\n this.settings.dataviewID ??\n ABViewChartPropertyComponentDefaults.dataviewID;\n\n this.settings.columnValue =\n this.settings.columnValue ??\n ABViewChartPropertyComponentDefaults.columnValue;\n\n this.settings.columnLabel =\n this.settings.columnLabel ??\n ABViewChartPropertyComponentDefaults.columnLabel;\n\n this.settings.columnValue2 =\n this.settings.columnValue2 ??\n ABViewChartPropertyComponentDefaults.columnValue2;\n\n this.settings.isPercentage = parseInt(\n this.settings.isPercentage ??\n ABViewChartPropertyComponentDefaults.isPercentage\n );\n\n this.settings.showLabel = parseInt(\n this.settings.showLabel ??\n ABViewChartPropertyComponentDefaults.showLabel\n );\n\n this.settings.labelPosition =\n this.settings.labelPosition ||\n ABViewChartPropertyComponentDefaults.labelPosition;\n\n this.settings.labelWidth = parseInt(\n this.settings.labelWidth ??\n ABViewChartPropertyComponentDefaults.labelWidth\n );\n\n this.settings.height = parseInt(\n this.settings.height ?? ABViewChartPropertyComponentDefaults.height\n );\n\n this.settings.multipleSeries = parseInt(\n this.settings.multipleSeries ??\n ABViewChartPropertyComponentDefaults.multipleSeries\n );\n\n this.translate(this, this, [\"chartLabel\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n const viewsToAllow = [\"label\", \"pie\", \"bar\", \"line\", \"area\"];\n return this.application.viewAll((c) => {\n return viewsToAllow.indexOf(c.common().key) > -1;\n });\n }\n\n labelField() {\n const dc = this.datacollection;\n if (!dc) return null;\n\n const obj = dc.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.columnLabel);\n }\n\n valueField() {\n const dc = this.datacollection;\n if (!dc) return null;\n\n const obj = dc.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.columnValue);\n }\n\n valueField2() {\n const dc = this.datacollection;\n if (!dc) return null;\n\n const obj = dc.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.columnValue2);\n }\n};\n","const ABViewChartContainer = require(\"../../platform/views/ABViewChartContainer\");\n\nconst ABViewChartLinePropertyComponentDefaults = {\n lineType: \"line\",\n linePreset: \"plot\",\n isLegend: 1,\n // chartWidth: 600,\n chartHeight: 200,\n labelFontSize: 12,\n stepValue: 20,\n maxValue: 100,\n};\n\nconst ABViewDefaults = {\n key: \"line\", // {string} unique key for this view\n icon: \"line-chart\", // {string} fa-[icon] reference for this view\n labelKey: \"Line\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewChartLineCore extends ABViewChartContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewChartLinePropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.lineType =\n this.settings.lineType ||\n ABViewChartLinePropertyComponentDefaults.lineType;\n\n this.settings.linePreset =\n this.settings.linePreset ||\n ABViewChartLinePropertyComponentDefaults.linePreset;\n\n this.settings.isLegend = parseInt(\n this.settings.isLegend ??\n ABViewChartLinePropertyComponentDefaults.isLegend\n );\n\n // this.settings.chartWidth = parseInt(this.settings.chartWidth || ABViewChartLinePropertyComponentDefaults.chartWidth);\n this.settings.chartHeight = parseInt(\n this.settings.chartHeight ??\n ABViewChartLinePropertyComponentDefaults.chartHeight\n );\n\n this.settings.labelFontSize = parseInt(\n this.settings.labelFontSize ??\n ABViewChartLinePropertyComponentDefaults.labelFontSize\n );\n this.settings.stepValue = parseInt(\n this.settings.stepValue ??\n ABViewChartLinePropertyComponentDefaults.stepValue\n );\n this.settings.maxValue = parseInt(\n this.settings.maxValue ??\n ABViewChartLinePropertyComponentDefaults.maxValue\n );\n\n this.translate(this, this, [\"lineLabel\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewChartContainer = require(\"../../platform/views/ABViewChartContainer\");\n\nconst ABViewChartPiePropertyComponentDefaults = {\n pieType: \"pie\",\n isLegend: 1,\n // chartWidth: 600,\n height: 200,\n innerFontSize: 12,\n labelFontSize: 12,\n};\n\nconst ABViewDefaults = {\n key: \"pie\", // {string} unique key for this view\n icon: \"pie-chart\", // {string} fa-[icon] reference for this view\n labelKey: \"Pie\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewChartPieCore extends ABViewChartContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewChartPiePropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.pieType =\n this.settings.pieType ||\n ABViewChartPiePropertyComponentDefaults.pieType;\n\n this.settings.isLegend = parseInt(\n this.settings.isLegend ??\n ABViewChartPiePropertyComponentDefaults.isLegend\n );\n\n // this.settings.chartWidth = parseInt(this.settings.chartWidth || ABViewChartPiePropertyComponentDefaults.chartWidth);\n this.settings.height = parseInt(\n this.settings.height ?? ABViewChartPiePropertyComponentDefaults.height\n );\n\n this.settings.innerFontSize = parseInt(\n this.settings.innerFontSize ??\n ABViewChartPiePropertyComponentDefaults.innerFontSize\n );\n this.settings.labelFontSize = parseInt(\n this.settings.labelFontSize ??\n ABViewChartPiePropertyComponentDefaults.labelFontSize\n );\n\n this.translate(this, this, [\"pieLabel\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewCommentPropertyComponentDefaults = {\n dataviewID: null,\n columnUser: null,\n columnComment: null,\n columnDate: null,\n height: 300,\n label: \"\", // label is required and you can add more if the component needs them\n // format:0 \t// 0 - normal, 1 - title, 2 - description\n};\n\nconst ABViewDefaults = {\n key: \"comment\", // {string} unique key for this view\n icon: \"comments\", // {string} fa-[icon] reference for this view\n labelKey: \"Comment\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewCommentCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewCommentPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n // this.settings.format = parseInt(this.settings.format);\n // if this is being instantiated on a read from the Property UI,\n this.settings.height = parseInt(this.settings.height || 0);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n getCurrentUserId() {\n const userObject = this.getUsers();\n const currentUser = this.AB.Account.username();\n //Anonymous User = 0\n\n if (!userObject) return;\n\n return userObject.findIndex((e) => e.value === currentUser) + 1;\n }\n\n getUsers() {\n return this.AB.Account.userList().map((e) => {\n return {\n id: e.username,\n value: e.username,\n image: e.image_id,\n };\n });\n }\n\n getUserField() {\n var dv = this.datacollection;\n if (!dv) return null;\n\n var obj = dv.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.columnUser);\n }\n\n getCommentField() {\n var dv = this.datacollection;\n if (!dv) return null;\n\n var obj = dv.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.columnComment);\n }\n\n getDateField() {\n var dv = this.datacollection;\n if (!dv) return null;\n\n var obj = dv.datasource;\n if (!obj) return null;\n\n return obj.fieldByID(this.settings.columnDate);\n }\n\n getUserData() {\n let UserImageField = this.AB.objectUser().fieldByID(\n \"6383ce19-b344-44ee-87e6-decced7361f8\"\n );\n\n var userObject = this.getUsers();\n var userList = [];\n\n if (!userObject) return;\n\n userObject.forEach((item, index) => {\n var imageURL = \"\";\n if (item.image) {\n imageURL = UserImageField.urlImage(item.image);\n }\n var user = { id: index + 1, value: item.value, image: imageURL };\n userList.push(user);\n });\n return userList;\n }\n\n model() {\n let dv = this.datacollection;\n if (!dv) return null; // TODO: refactor in v2\n\n // get ABModel\n let model = dv.model; // already notified\n if (!model) return null;\n\n return model;\n }\n};\n","const ABViewContainer = require(\"../../platform/views/ABViewContainer\");\n\nconst ABViewPropertyDefaults = {\n dataviewID: null,\n filterConditions: {},\n};\n\nconst ABViewDefaults = {\n key: \"conditionalcontainer\", // unique key identifier for this ABView\n icon: \"shield\", // icon reference: (without 'fa-' )\n labelKey: \"Conditional Container\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewConditionalContainerCore extends ABViewContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n\n const L = (...params) => this.AB.Multilingual.label(...params);\n\n // the conditional container always has 'If' and 'Else' panels\n if (this.views((v) => v instanceof ABViewContainer).length < 2) {\n this._views = [];\n\n // 'If' panel\n const ifPanel = application.viewNew(\n {\n key: ABViewContainer.common().key,\n label: L(\"If\"),\n name: \"If\",\n settings: {\n removable: false,\n },\n },\n application,\n this\n );\n\n this._views.push(ifPanel);\n\n // 'Else' panel\n const elsePanel = application.viewNew(\n {\n key: ABViewContainer.common().key,\n label: L(\"Else\"),\n name: \"Else\",\n settings: {\n removable: false,\n },\n },\n application,\n this\n );\n\n this._views.push(elsePanel);\n }\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewPropertyDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n * For a Conditional Container, we don't allow any other items to be placed on it.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewConnectDataFilterPropertyComponentDefaults = {\n dataviewID: null, // uuid of ABDatacollection\n field: null, // uuid\n};\n\nconst ABViewDefaults = {\n key: \"connect-data-filter\", // {string} unique key for this view\n icon: \"filter\", // {string} fa-[icon] reference for this view\n labelKey: \"Connected Data Filter\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewConnectDataFilterCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues ?? ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewConnectDataFilterPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","/*\n * ABViewContainerCore\n *\n * An ABViewContainerCore defines a UI display component.\n *\n * A container might have multiple columns of display info.\n *\n */\n\nconst ABView = require(\"../../platform/views/ABView\");\n\n// function L(key, altText) {\n// \treturn AD.lang.label.getLabel(key) || altText;\n// }\n\nconst ABViewDefaults = {\n key: \"viewcontainer\", // {string} unique key for this view\n icon: \"braille\", // {string} fa-[icon] reference for this view\n labelKey: \"Container\", // {string} the multilingual label key for the class label\n};\n\nconst ABPropertyComponentDefaults = {\n columns: 1,\n gravity: 1,\n movable: true,\n removable: true,\n};\n\nmodule.exports = class ABViewContainerCore extends ABView {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n * @param {obj} defaultValues special sub class defined default values.\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABPropertyComponentDefaults;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.columns = parseInt(\n this.settings.columns || ABPropertyComponentDefaults.columns\n );\n\n if (typeof this.settings.gravity != \"undefined\") {\n this.settings.gravity.map(function (gravity) {\n return parseInt(gravity);\n });\n }\n\n if (this.settings.removable != null) {\n this.settings.removable = JSON.parse(this.settings.removable); // convert to boolean\n } else {\n this.settings.removable = ABPropertyComponentDefaults.removable;\n }\n\n if (this.settings.movable != null) {\n this.settings.movable = JSON.parse(this.settings.movable); // convert to boolean\n } else {\n this.settings.movable = ABPropertyComponentDefaults.movable;\n }\n }\n\n viewsSortByPosition() {\n // Sort views from y, x positions\n return this.views().sort((a, b) => {\n if (a.position.y == b.position.y) return a.position.x - b.position.x;\n else return a.position.y - b.position.y;\n });\n }\n\n // saveReorder() {\n // return this.application.viewReorder(this);\n // }\n};\n","/*\n * ABViewCore\n *\n * ABViewCore defines the common ABView structure that is shared between\n * the client and the server. Mostly how it manages it's internal data, and\n * how it is related to the ABView classes.\n *\n */\n\nvar ABMLClass = require(\"../../platform/ABMLClass\");\n\nconst ABViewDefaults = {\n key: \"view\", // {string} unique key for this view\n icon: \"window-maximize\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.view\", // {string} the multilingual label key for the class label\n tabicon: \"\", // no default tab icons\n};\n\nconst ABViewPropertyComponentDefaults = {\n label: \"\",\n};\n\nmodule.exports = class ABViewCore extends ABMLClass {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super([\"label\"], application.AB);\n\n this.__events = [];\n // keep track of any event listeners attached to this ABView object\n\n this.defaults = defaultValues || ABViewDefaults;\n\n this.application = application;\n\n this.parent = parent || null;\n\n this.warningsSilent = false;\n // {bool}\n // Should we suppress our configuration warnings?\n\n this.__missingViews = [];\n // {array}\n // Any ABView.id we have stored that we can't find.\n\n this.fromValues(values);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewPropertyComponentDefaults;\n }\n\n /**\n * @method newInstance()\n * return a new instance of this ABView. Most likely called from interfaces\n * that create new UI elements like the ABDesigner.\n * @param {ABApplication} application \t: the root ABApplication this view is under\n * @param {ABView/ABApplication} parent\t: the parent object of this ABView.\n * @return {ABView}\n */\n static newInstance(application, parent) {\n // return a new instance from ABViewManager:\n return application.viewNew(\n { key: this.common().key },\n application,\n parent\n );\n }\n\n viewKey() {\n return this.defaults.key;\n }\n\n viewIcon() {\n return this.defaults.icon;\n }\n\n tabIcon() {\n return this.defaults.tabicon;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABView instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n // // NOTE: ensure we have a uuid() set:\n // if (!this.id) {\n // this.id = this.application.uuid();\n // }\n\n // this.application.unTranslate(this, this, [\"label\"]);\n\n // MLClass translation\n var obj = super.toObj();\n\n var result = {\n id: this.id,\n type: this.type || \"view\",\n key: this.key,\n icon: this.icon,\n tabicon: this.tabicon,\n name: this.name,\n settings: this.AB.cloneDeep(this.settings || {}),\n accessLevels: this.accessLevels,\n translations: obj.translations,\n };\n\n // encode our child view references\n result.viewIDs = (this._views || []).map((v) => v.id).filter((id) => id);\n result.viewIDs = result.viewIDs.concat(this.__missingViews);\n\n if (this.position) result.position = this.position;\n\n // encode our .isRoot() reference.\n // (NOTE: this is set so our server side code can distinguish) between a .view\n // and a root page:\n // NOTE: we intentionally do NOT pull this out in .fromValues()\n result.isRoot = this.isRoot();\n\n return result;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n this.id = values.id; // NOTE: only exists after .save()\n // {string} .id\n // the uuid of this ABObject Definition.\n\n this.type = values.type || \"view\";\n // {string} .type\n // the type of ABDefinition this is.\n\n this.key = values.key || this.viewKey();\n // {string} .key\n // the unique lookup key for our ABViewManager to create new\n // instances of this object.\n\n this.icon = values.icon || this.viewIcon();\n // {string} .icon\n // the font awesome icon reference for showing an icon for this\n // view in the AppBuilder interface builder.\n\n this.tabicon = values.tabicon || this.tabIcon();\n\n this.name = values.name;\n // {string} .name\n // A name reference for this ABView. This is a reference that isn't\n // translateable and will be used for lookups across languages.\n\n // if this is being instantiated on a read from the Property UI,\n // .label is coming in under .settings.label\n values.settings = values.settings || {};\n this.label = values.label || values.settings.label || \"?label?\";\n\n this.settings = values.settings || {};\n // {obj} .settings\n // the property settings for this ABView\n\n // make sure .settings.height is an int and not a string\n this.settings.height = parseInt(this.settings.height || 0);\n\n this.accessLevels = values.accessLevels || {};\n // {obj} .accessLevels\n // Hash: { ABRole.id : accessLevel }\n // tracks the Role -> AccessLevel settings of this particular\n // view.\n // accessLevel: 0 : no access, 1 : view only, 2: full access\n\n // let the MLClass now process the translations:\n super.fromValues(values);\n\n // If the View / DataCollection does not have a .name already,\n // use the English label translation as the .name instead.\n if (!this.name && Array.isArray(this.translations)) {\n for (var i = 0; i < this.translations.length; i++) {\n if (i == 0) {\n // Use the first label found, in case there is no 'en'\n this.name = this.translations[i].label;\n }\n if (this.translations[i].language_code == \"en\") {\n // But the 'en' label will have final priority\n this.name = this.translations[i].label;\n break;\n }\n }\n }\n\n // default value for our label\n if (this.label == \"?label?\") {\n if (this.parent) {\n this.label = this.parent.label + \".\" + this.defaults.key;\n }\n }\n\n var views = [];\n this.__missingViews = this.__missingViews || [];\n (values.viewIDs || []).forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (def) {\n views.push(this.application.viewNew(def, this.application, this));\n } else {\n this.__missingViews.push(id);\n }\n });\n this._views = views;\n\n // convert from \"0\" => 0\n this.position = values.position || {};\n\n if (this.position.x != null) this.position.x = parseInt(this.position.x);\n if (this.position.y != null) this.position.y = parseInt(this.position.y);\n\n this.position.dx = parseInt(this.position.dx || 1);\n this.position.dy = parseInt(this.position.dy || 1);\n }\n\n isRoot() {\n return this.parent == null || this.parent == this.application;\n }\n\n /**\n * @method allParents()\n * return a flattened array of all the ABViews parents\n * @return {array} array of ABViews\n */\n allParents() {\n var parents = [];\n var curView = this;\n\n // add current view to array\n parents.unshift(curView);\n\n while (!curView.isRoot() && curView.parent) {\n parents.unshift(curView.parent);\n\n curView = curView.parent;\n }\n\n return parents;\n }\n\n /**\n * @method isAccessibleForRoles()\n * return true/false if this ABViewPage is accessible for one of the\n * passed in ABRoles.\n * @param {array[ABRole]} roles\n * an array of {ABRole} instances.\n * @return {bool}\n */\n isAccessibleForRoles(roles) {\n var foundRole = false;\n\n var accessibleRoles = Object.keys(this.accessLevels) || [];\n (roles || []).forEach((r) => {\n if (accessibleRoles.indexOf(r.uuid || r) > -1) {\n foundRole = true;\n }\n });\n\n return foundRole;\n }\n\n /**\n * @method getUserAccess()\n *\n * return the access level of the current user on the current view\n *\n * @return {integer} // 0 = No Access // 1 = Read Only // 2 = Full Access\n */\n getUserAccess() {\n // by default everyone has no access\n var accessLevel = 0;\n\n if (this.application.isAccessManaged) {\n // check to see if the current users is the access manager\n var isAccessManager = false;\n // first check if manager is defined by their role\n if (parseInt(this.application.accessManagers.useRole) == 1) {\n // if so check if any of the user's role match the managers\n this.AB.Account.roles().forEach((role) => {\n if (\n this.application.accessManagers.role.indexOf(\n role.id || role.uuid\n ) > -1\n ) {\n // if so set the access level to full access\n isAccessManager = true;\n accessLevel = 2;\n }\n });\n }\n // if the user isn't already set as the manager and the manager is defined by their account\n if (\n !isAccessManager &&\n parseInt(this.application.accessManagers.useAccount) == 1\n ) {\n // check if the user's account matches the managers\n if (\n this.application.accessManagers.account.indexOf(\n this.AB.Account.uuid() + \"\"\n ) > -1\n ) {\n // if so set the access level to full access\n isAccessManager = true;\n accessLevel = 2;\n }\n }\n\n // if the user is not the manager check if the page has access levels defined for roles\n if (\n this.accessLevels &&\n Object.keys(this.accessLevels).length > 0 &&\n !isAccessManager\n ) {\n // check to see if the user's roles matches one of the roles defined\n this.AB.Account.roles().forEach((role) => {\n var currentRole = this.accessLevels[role.id || role.uuid];\n if (currentRole && parseInt(currentRole) > accessLevel)\n // if the access level is higher than a previous role set to the new level\n accessLevel = parseInt(currentRole);\n });\n }\n } else {\n accessLevel = 2;\n }\n\n return accessLevel;\n }\n\n /**\n * @method parentFormComponent\n * return the closest form object this component is on.\n */\n parentFormComponent() {\n var form = null;\n\n var curr = this;\n while (!curr.isForm && !curr.isRoot() && curr.parent) {\n curr = curr.parent;\n }\n\n if (curr.isForm) {\n form = curr;\n }\n\n return form;\n }\n\n /**\n * @method parentDetailComponent\n * return the closest detail object that this component is on.\n * @returns {ABViewDetail} detail component\n */\n parentDetailComponent() {\n var detail = null;\n\n var curr = this;\n while (curr.key != \"detail\" && !curr.isRoot() && curr.parent) {\n curr = curr.parent;\n }\n\n if (curr.key == \"detail\") {\n detail = curr;\n }\n\n return detail;\n }\n\n pageParent(filterFn) {\n if (filterFn == null) filterFn = () => true;\n\n // if current page is the root page, then return itself.\n if (this.isRoot()) {\n return this;\n }\n\n var parentPage = this.parent;\n while (\n parentPage &&\n (parentPage.key != \"page\" || !filterFn(parentPage))\n ) {\n parentPage = parentPage.parent;\n }\n\n return parentPage;\n }\n\n pageRoot() {\n var rootPage = this.pageParent();\n\n while (!rootPage.isRoot()) {\n rootPage = rootPage.pageParent();\n }\n\n return rootPage;\n }\n\n /**\n * @method urlPointer()\n * return the url pointer that references this view. This url pointer\n * should be able to be used by this.application.urlResolve() to return\n * this view object.\n * @return {string}\n */\n urlPointer() {\n if (this.parent) {\n return this.parent.urlView() + this.id;\n } else {\n return this.application.urlPage() + this.id;\n }\n }\n\n /**\n * @method urlView\n * return a string pointer to this object's views.\n * @return {string}\n */\n urlView() {\n return this.urlPointer() + \"/_views/\";\n }\n\n /**\n * @property datacollection\n * return data source\n *\n * @return {ABDataCollection}\n */\n get datacollection() {\n let dataviewID = (this.settings || {}).dataviewID;\n if (!dataviewID) {\n if (\n [\"form\", \"grid\", \"line\", \"area\", \"bar\", \"gantt\", \"kanban\"].indexOf(\n this.key\n ) > -1\n ) {\n // NOTE: ignore kanban side forms where this is the case:\n if (this.key == \"form\" && this._currentObject) return null;\n\n if (this.warningsSilent) return null;\n\n var errNoDCID = new Error(\n `ABViewCore:get datacollection(): View[${this.key}] didn't define a dataviewID.`\n );\n this.AB.notify.builder(errNoDCID, {\n view: this,\n settings: this.settings,\n });\n } else {\n // These views shouldn't matter if they don't have a datacollection.\n if (\n [\"button\", \"label\", \"page\", \"tab\", \"viewcontainer\"].indexOf(\n this.key\n ) == -1\n ) {\n console.warn(\n `TODO: figure out which ABView* require a .dataviewID: ${this.key}?`\n );\n }\n }\n return null;\n }\n\n var dc = this.AB.datacollectionByID(dataviewID);\n if (!dc) {\n var errNoDC = new Error(\n `View[${this.label}][${this.id}] is unable to find associated DataCollection`\n );\n this.AB.notify.builder(errNoDC, {\n view: this,\n dataviewID,\n });\n }\n return dc;\n }\n\n ///\n /// Update Access accessLevels\n ///\n\n /**\n * @method updateAccessLevels()\n *\n *\n * @param {string} roleId\n *\n * @param {string} accessLevel\n *\n * @return {Promise}\n *\n */\n updateAccessLevels(roleId, accessLevel) {\n if (parseInt(accessLevel) == 0) {\n if (this.accessLevels[roleId]) delete this.accessLevels[roleId];\n } else {\n this.accessLevels[roleId] = accessLevel;\n }\n\n return this.save(false, false);\n }\n\n ///\n /// Views\n ///\n\n /**\n * @method views()\n *\n * return an array of all the ABViews children\n *\n * @param {fn} filter \ta filter fn to return a set of ABViews that this fn\n *\t\t\t\t\t\treturns true for.\n * @param {boolean} deep\n *\n * @return {array} \tarray of ABViews\n */\n views(filter = () => true, deep = false) {\n var result = [];\n\n if (!this._views || this._views.length < 1) return result;\n\n // find into recursively\n if (filter && deep) {\n result = result.concat(this._views.filter(filter));\n\n this._views.forEach((v) => {\n var subViews = v.views(filter, deep);\n if (subViews && subViews.length > 0) {\n result = result.concat(subViews);\n }\n });\n } else {\n result = this._views.filter(filter);\n }\n\n return result;\n }\n\n /**\n * @method viewNew()\n *\n *\n * @return {ABView}\n */\n viewNew(values, application, parent) {\n return this.application.viewNew(\n values,\n application || this.application,\n parent || this\n );\n }\n\n /**\n * @method viewDestroy()\n *\n * remove the current ABView from our list of ._views.\n *\n * @param {ABView} view\n * @return {Promise}\n */\n viewDestroy(view) {\n console.error(\"DEPRECIATED: where is this called?\");\n return this.viewRemove(view);\n }\n\n /**\n * @method viewRemove()\n *\n * remove the current ABView from our list of ._views.\n *\n * @param {ABView} view\n * @return {Promise}\n */\n viewRemove(view) {\n var origLen = this._views.length;\n this._views = this.views(function (v) {\n return v.id != view.id;\n });\n\n if (this._views.length < origLen) {\n return this.save();\n }\n\n return Promise.resolve();\n }\n\n /**\n * @method viewInsert()\n *\n * persist the current ABView in our list of ._views.\n *\n * @param {ABView} object\n * @return {Promise}\n */\n viewInsert(view) {\n var isIncluded =\n this.views(function (v) {\n return v.id == view.id;\n }).length > 0;\n if (!isIncluded) {\n this._views.push(view);\n return this.save();\n }\n\n return Promise.resolve();\n }\n\n /**\n * @method viewReorder()\n *\n * reorder the current ABView in our list of ._views.\n *\n * @param {string} viewId - id of the active view\n * @param {string} toPosition - 'to' postion\n * @return {Promise}\n */\n viewReorder(viewId, toPosition) {\n var from = this._views.findIndex((v) => v.id == viewId);\n if (from < 0) return;\n\n // move drag item to 'to' position\n this._views.splice(toPosition, 0, this._views.splice(from, 1)[0]);\n\n // save to database\n return this.save(true);\n }\n\n /// ABApplication data methods\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABApplication\n *\n * also remove it from our _AllApplications\n *\n * @return {Promise}\n */\n destroy() {\n // unsubscribe events\n this.eventClear(true);\n\n return Promise.resolve()\n .then(() => {\n // When deleting an ABView\n // be sure to remove any of it's ABViews as well\n // This cleans out any dangling ABDefinitions\n\n var allViewDeletes = [];\n var allViews = this.views();\n this._views = [];\n // doing ._views = [] prevents any of my updates when\n // a sub-view is .destroy()ed\n\n allViews.forEach((v) => {\n allViewDeletes.push(v.destroy());\n });\n return Promise.all(allViewDeletes);\n })\n .then(() => {\n // NOTE: this should not happen on ABViewPage objects\n if (this.parent && !this.pages) {\n return this.parent.viewRemove(this);\n }\n })\n .then(() => {\n return super.destroy();\n })\n .then(() => {\n this.emit(\"destroyed\");\n });\n }\n\n /**\n * @method save()\n * persist this instance of ABView\n * @return {Promise}\n *\t\t.resolve( {this} )\n */\n save() {\n return Promise.resolve()\n .then(() => {\n // this creates our .id\n return super.save();\n })\n .then(() => {\n // NOTE: this should not happen on ABViewPage objects:\n if (this.parent && !this.pages) {\n // if we have a .parent, make sure we are included in our .parent's\n // viewIDs\n return this.parent.viewInsert(this);\n }\n })\n .then(() => {\n return this;\n });\n }\n\n ///\n /// Events\n ///\n\n /**\n * @method eventAdd()\n *\n *\n *\n * @param {object} evt - {\n * \t\t\t\t\t\t\temitter: object,\n * \t\t\t\t\t\t\teventName: string,\n * \t\t\t\t\t\t\tlistener: function\n * \t\t\t\t\t\t}\n */\n eventAdd(evt) {\n if (!evt || !evt.emitter || !evt.listener) return;\n\n var exists = this.__events.find((e) => {\n return e.emitter == evt.emitter && e.eventName == evt.eventName;\n // && e.listener == evt.listener;\n });\n\n if (!exists || exists.length < 1) {\n // add to array\n this.__events.push({\n emitter: evt.emitter,\n eventName: evt.eventName,\n listener: evt.listener,\n });\n\n // listening this event\n evt.emitter.on(evt.eventName, evt.listener);\n }\n }\n\n /**\n * @method eventClear()\n * unsubscribe all events.\n * should do it before destroy a component\n *\n * @param {bool} deep - clear events of child views\n */\n eventClear(deep) {\n if (deep) {\n this.views().forEach((v) => {\n v.eventClear(deep);\n });\n }\n\n if (this.__events && this.__events.length > 0) {\n this.__events.forEach((e) => {\n e.emitter.removeListener(e.eventName, e.listener);\n });\n }\n }\n\n /**\n * @method clone()\n * clone the definitions of this ABView object.\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @param {obj} options\n * option settings for the copy command.\n * options.ignoreSubPages {bool}\n * set to true to skip copying any sub pages of this ABView.\n * @return {obj}\n * obj defs of this ABView\n */\n clone(lookUpIds, parent, options = {}) {\n lookUpIds = lookUpIds || {};\n\n // get settings of the target\n let config = this.toObj();\n\n // remove sub-elements property\n [\"pages\", \"views\"].forEach((prop) => {\n delete config[prop];\n });\n\n // update id of linked components\n if (this.copyUpdateProperyList) {\n (this.copyUpdateProperyList() || []).forEach((prop) => {\n if (config && config.settings)\n config.settings[prop] = lookUpIds[config.settings[prop]];\n });\n }\n\n // copy from settings\n let result = this.viewNew(config, this.application, parent);\n\n // change id\n if (parent == null) {\n // the page is getting cloned to root: there is no parent, as parent is the application\n result.id = null;\n } else {\n result.id = lookUpIds[result.id] || this.AB.uuid();\n }\n\n // copy sub pages\n if (this.pages && !options.ignoreSubPages) {\n result._pages = [];\n this.pages().forEach((p) => {\n let copiedSubPage = p.clone(lookUpIds, result, options);\n copiedSubPage.parent = result;\n\n result._pages.push(copiedSubPage);\n });\n }\n\n // copy sub views\n if (this.views && !options.ignoreSubViews) {\n result._views = [];\n this.views().forEach((v) => {\n let copiedView = v.clone(lookUpIds, result, options);\n\n result._views.push(copiedView);\n });\n }\n\n return result;\n }\n\n /**\n * @method copy()\n * create a new copy of this ABView object. The resulting ABView should\n * be identical in settings and all sub pages/views, but each new object\n * is a unique view (different ids).\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @param {obj} options\n * option settings for the copy command.\n * options.ignoreSubPages {bool}\n * set to true to skip copying any sub pages of this ABView.\n * options.newName {string}\n * new user determined name for page\n * @return {Promise}\n * .resolved with the instance of the copied ABView\n */\n copy(lookUpIds, parent, options = {}) {\n lookUpIds = lookUpIds || {};\n\n // get settings of the target\n let config = this.toObj();\n\n // remove sub-elements property\n [\"pageIDs\", \"viewIDs\"].forEach((prop) => {\n delete config[prop];\n });\n\n // update id of linked components\n if (this.copyUpdateProperyList) {\n (this.copyUpdateProperyList() || []).forEach((prop) => {\n if (config && config.settings)\n config.settings[prop] = lookUpIds[config.settings[prop]];\n });\n }\n\n // copy from settings\n let result = this.application.viewNew(config, this.application, parent);\n\n // keep the parent\n result.parent = parent || this.parent;\n\n // change id\n if (parent == null) {\n // the page is getting cloned to root: there is no parent, as parent is the application.\n // pages with null parent ids default to getting put on root\n result.id = null;\n } else {\n result.id = lookUpIds[result.id] || this.AB.uuid();\n }\n\n // page's name should not be duplicate\n if (this.key == \"page\") {\n result.name =\n options?.newName ||\n `${result.name}_copied_${this.AB.uuid().slice(0, 3)}`;\n\n result.label = options?.newName || `${result.label} (copied)`;\n }\n\n return Promise.resolve()\n .then(() => {\n // copy sub pages\n var allSaves = [];\n\n if (this._pages && !options.ignoreSubPages) {\n result._pages = [];\n this.pages().forEach((p) => {\n // this prevents result.save() from happening on each of these\n // p.copy():\n if (p.isRoot())\n this.application._pages.push({ id: lookUpIds[p.id] });\n\n allSaves.push(\n p\n .copy(lookUpIds, result, options)\n .then((copiedSubPage) => {\n copiedSubPage.parent = result;\n // remove the temp {id:} entry above:\n this.application._pages =\n this.application._pages.filter(\n (p2) => p2.id != lookUpIds[p.id]\n );\n\n // now add the full copiedSubPage:\n result._pages.push(copiedSubPage);\n })\n );\n });\n }\n\n return Promise.all(allSaves);\n })\n .then(() => {\n // copy sub views\n var allSaves = [];\n\n if (this._views && !options.ignoreSubViews) {\n result._views = [];\n this.views().forEach((v) => {\n allSaves.push(\n // send a null for parent, so that the .save() wont trigger\n // a save of the parent.\n v.copy(lookUpIds, result, options).then((copiedView) => {\n // now patch up the parent connection:\n // copiedView.parent = result;\n if (\n result._views.filter((vi) => vi.id == copiedView.id)\n .length < 1\n ) {\n result._views.push(copiedView);\n }\n })\n );\n });\n }\n\n return Promise.all(allSaves);\n })\n .then(() => {\n // now we do 1 save for all the views\n return result.save();\n })\n .then(() => {\n return result;\n });\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewDataFilterPropertyComponentDefaults = {\n dataviewID: null, // uuid of ABDatacollection\n field: null, // uuid,\n viewType: \"advanced\",\n showFilter: 1,\n showSort: 1,\n};\n\nconst ABViewDefaults = {\n key: \"data-filter\", // {string} unique key for this view\n icon: \"filter\", // {string} fa-[icon] reference for this view\n labelKey: \"Data Filter\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDataFilterCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues ?? ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewDataFilterPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewDataSelectPropertyComponentDefaults = {\n dataviewID: null, // uuid of ABDatacollection\n};\n\nconst ABViewDefaults = {\n key: \"data-select\", // {string} unique key for this view\n icon: \"chevron-circle-down\", // {string} fa-[icon] reference for this view\n labelKey: \"Data Select\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDataSelectCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues ?? ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewDataSelectPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewDetail = require(\"../../platform/views/ABViewDetail\");\n\nconst ABViewDataviewPropertyComponentDefaults = {\n xCount: 1, // {int} the number of columns per row (need at least one)\n detailsPage: \"\",\n detailsTab: \"\",\n editPage: \"\",\n editTab: \"\",\n};\n\nconst ABViewDataviewDefaults = {\n key: \"dataview\", // {string} unique key for this view\n icon: \"th\", // {string} fa-[icon] reference for this view\n labelKey: \"Data view\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDataviewCore extends ABViewDetail {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewDataviewDefaults\n );\n }\n\n static common() {\n return ABViewDataviewDefaults;\n }\n\n static defaultValues() {\n return ABViewDataviewPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.xCount = parseInt(\n this.settings.xCount || ABViewDataviewPropertyComponentDefaults.xCount\n );\n this.settings.detailsPage =\n this.settings.detailsPage ||\n ABViewDataviewPropertyComponentDefaults.detailsPage;\n this.settings.editPage =\n this.settings.editPage ||\n ABViewDataviewPropertyComponentDefaults.editPage;\n this.settings.detailsTab =\n this.settings.detailsTab ||\n ABViewDataviewPropertyComponentDefaults.detailsTab;\n this.settings.editTab =\n this.settings.editTab ||\n ABViewDataviewPropertyComponentDefaults.editTab;\n }\n\n parentDetailComponent() {\n let dataview = null;\n\n let curr = this;\n while (curr.key != \"dataview\" && !curr.isRoot() && curr.parent) {\n curr = curr.parent;\n }\n\n if (curr.key == \"dataview\") {\n dataview = curr;\n }\n\n return dataview;\n }\n};\n","const ABViewDetailItem = require(\"../../platform/views/ABViewDetailItem\");\n\nconst ABViewDetailCheckboxPropertyComponentDefaults = {};\n\nconst ABViewDetailCheckboxDefaults = {\n key: \"detailcheckbox\", // {string} unique key for this view\n icon: \"check-square-o\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.detail.checkbox\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDetailCheckboxCore extends ABViewDetailItem {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues ?? ABViewDetailCheckboxDefaults\n );\n }\n\n static common() {\n return ABViewDetailCheckboxDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailCheckboxPropertyComponentDefaults;\n }\n};\n","// const ABViewDetailSelectivity = require(\"../../platform/views/ABViewDetailSelectivity\");\nconst ABViewDetailItem = require(\"../../platform/views/ABViewDetailItem\");\n\nconst ABViewDetailPropertyComponentDefaults = {\n formView: \"\", // id of form to add new data\n};\n\nconst ABViewDefaults = {\n key: \"detailconnect\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.detail.connect\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDetailConnectCore extends ABViewDetailItem {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues ?? ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailPropertyComponentDefaults;\n }\n};\n","const ABViewContainer = require(\"../../platform/views/ABViewContainer\");\n\nconst ABViewDetailDefaults = {\n key: \"detail\", // {string} unique key for this view\n icon: \"file-text-o\", // {string} fa-[icon] reference for this view\n labelKey: \"Detail\", // {string} the multilingual label key for the class label\n};\n\nconst ABViewDetailPropertyComponentDefaults = {\n dataviewID: null,\n showLabel: true,\n labelPosition: \"left\",\n labelWidth: 120,\n height: 0,\n};\n\nmodule.exports = class ABViewDetailCore extends ABViewContainer {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues ?? ABViewDetailDefaults);\n }\n\n static common() {\n return ABViewDetailDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailPropertyComponentDefaults;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.labelPosition =\n this.settings.labelPosition ||\n ABViewDetailPropertyComponentDefaults.labelPosition;\n\n // convert from \"0\" => true/false\n this.settings.showLabel = JSON.parse(\n this.settings.showLabel != null\n ? this.settings.showLabel\n : ABViewDetailPropertyComponentDefaults.showLabel\n );\n\n // convert from \"0\" => 0\n this.settings.labelWidth = parseInt(\n this.settings.labelWidth ||\n ABViewDetailPropertyComponentDefaults.labelWidth\n );\n this.settings.height = parseInt(\n this.settings.height ?? ABViewDetailPropertyComponentDefaults.height\n );\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n let viewsToAllow = [\"label\", \"text\"],\n allComponents = this.application.viewAll();\n\n return allComponents.filter((c) => {\n return viewsToAllow.indexOf(c.common().key) > -1;\n });\n }\n\n addFieldToDetail(field, yPosition) {\n if (field == null) return;\n\n let newView = field.detailComponent().newInstance(this.application, this);\n if (newView == null) return;\n\n // set settings to component\n newView.settings = newView.settings ?? {};\n newView.settings.fieldId = field.id;\n newView.settings.labelWidth =\n this.settings.labelWidth ||\n ABViewDetailPropertyComponentDefaults.labelWidth;\n\n // keep alias to support Query that contains alias name\n // [alias].[columnName]\n newView.settings.alias = field.alias;\n\n // TODO : Default settings\n\n newView.position.y = yPosition;\n\n // add a new component\n this._views.push(newView);\n\n return newView;\n }\n};\n","const ABViewDetailItem = require(\"../../platform/views/ABViewDetailItem\");\n\nconst ABViewDetailCustomPropertyComponentDefaults = {};\n\nconst ABViewDetailCustomDefaults = {\n key: \"detailcustom\", // {string} unique key for this view\n icon: \"dot-circle-o\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.detail.custom\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDetailCustomCore extends ABViewDetailItem {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues ?? ABViewDetailCustomDefaults\n );\n }\n\n static common() {\n return ABViewDetailCustomDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailCustomPropertyComponentDefaults;\n }\n};\n","const ABViewDetailItem = require(\"../../platform/views/ABViewDetailItem\");\n\nconst ABViewDetailImagePropertyComponentDefaults = {\n height: 80,\n width: 120,\n};\n\nconst ABViewDetailImageDefaults = {\n key: \"detailimage\", // {string} unique key for this view\n icon: \"image\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.detail.image\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDetailImageCore extends ABViewDetailItem {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues ?? ABViewDetailImageDefaults\n );\n }\n\n static common() {\n return ABViewDetailImageDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailImagePropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.height = parseInt(\n this.settings.height ||\n ABViewDetailImagePropertyComponentDefaults.height\n );\n this.settings.width = parseInt(\n this.settings.width ?? ABViewDetailImagePropertyComponentDefaults.width\n );\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nmodule.exports = class ABViewDetailItemCore extends ABViewWidget {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n detailComponent() {\n let detailView = null;\n\n let curr = this;\n while (\n !curr.isRoot() &&\n curr.parent &&\n curr.key != \"detail\" &&\n curr.key != \"dataview\"\n ) {\n curr = curr.parent;\n }\n\n if (curr.key == \"detail\" || curr.key == \"dataview\") {\n detailView = curr;\n }\n\n return detailView;\n }\n\n field() {\n let detailComponent = this.detailComponent();\n if (detailComponent == null) return null;\n\n let datacollection = detailComponent.datacollection;\n if (datacollection == null) return null;\n\n let object = datacollection.datasource;\n if (object == null) return null;\n\n let field = object.fields((v) => v.id == this.settings.fieldId)[0];\n\n // set .alias to support queries that contains alias name\n // [aliasName].[columnName]\n if (field && this.settings.alias) {\n field.alias = this.settings.alias;\n }\n\n return field;\n }\n\n getCurrentData() {\n let detailCom = this.detailComponent();\n if (!detailCom) return null;\n\n let dv = detailCom.datacollection;\n if (!dv) return null;\n\n let field = this.field();\n if (!field) return null;\n\n let currData = dv.getCursor();\n if (currData) return currData[field.columnName];\n else return null;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n return null;\n }\n};\n","const ABViewDetailItem = require(\"../../platform/views/ABViewDetailItem\");\n\nconst ABViewDetailTextPropertyComponentDefaults = {\n height: 0,\n};\n\nconst ABViewDetailTextDefaults = {\n key: \"detailtext\", // {string} unique key for this view\n icon: \"etsy\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.detail.text\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDetailTextCore extends ABViewDetailItem {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues ?? ABViewDetailTextDefaults\n );\n }\n\n static common() {\n return ABViewDetailTextDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailTextPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.height = parseInt(\n this.settings.height ||\n ABViewDetailTextPropertyComponentDefaults.height\n );\n }\n};\n","const ABViewDetailItem = require(\"../../platform/views/ABViewDetailItem\");\n\nconst ABViewDetailPropertyComponentDefaults = {};\n\nconst ABViewDetailTreeDefaults = {\n key: \"detailtree\", // {string} unique key for this view\n icon: \"sitemap\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.detail.tree\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDetailTextCore extends ABViewDetailItem {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues ?? ABViewDetailTreeDefaults\n );\n }\n\n static common() {\n return ABViewDetailTreeDefaults;\n }\n\n static defaultValues() {\n return ABViewDetailPropertyComponentDefaults;\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewDocxBuilderPropertyComponentDefaults = {\n buttonlabel: \"Download DOCX\",\n dataviewID: null,\n width: 0,\n filename: \"\", // uuid\n filelabel: \"output.docx\",\n language: \"en\", // en\n toolbarBackground: \"ab-background-default\",\n buttonPosition: \"left\",\n};\n\nconst ABViewDefaults = {\n key: \"docxBuilder\", // {string} unique key for this view\n icon: \"file-word-o\", // {string} fa-[icon] reference for this view\n labelKey: \"DOCX Builder\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewDocxBuilderCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewDocxBuilderPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n this.unTranslate(this, this, [\"filelabel\", \"buttonlabel\"]);\n\n let obj = super.toObj();\n obj.viewIDs = [];\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.width = parseInt(\n this.settings.width || ABViewDocxBuilderPropertyComponentDefaults.width\n );\n\n this.translate(this, this, [\"filelabel\", \"buttonlabel\"]);\n }\n\n uploadUrl() {\n // TODO: Convert this to use ABFactory.urlFileUpload() or a ABFieldFile\n // to get the URL:\n\n // support uploading template when more than one data source is selected\n const object = this.datacollections[0].datasource;\n\n // NOTE: file-upload API needs to have the id of ANY field.\n const field = object ? object.fields()[0] : null;\n\n return `/file/upload/${object?.id}/${field?.id}/1`;\n }\n\n downloadUrl() {\n return `/file/${this.settings.filename}`;\n }\n\n get languageCode() {\n return (\n this.settings.language ||\n ABViewDocxBuilderPropertyComponentDefaults.language\n );\n }\n\n get datacollections() {\n let dataviewID = (this.settings || {}).dataviewID;\n if (!dataviewID) return [];\n\n let dvList = dataviewID.split(\",\") || [];\n\n return this.AB.datacollections((dv) => dvList.indexOf(dv.id) > -1) || [];\n }\n};\n","const ABView = require(\"../../platform/views/ABView\");\n\nconst ABViewFormButtonPropertyComponentDefaults = {\n includeSave: true,\n saveLabel: \"\",\n includeCancel: false,\n cancelLabel: \"\",\n includeReset: false,\n resetLabel: \"\",\n includeDelete: false,\n deleteLabel: \"\",\n afterCancel: null,\n alignment: \"right\",\n isDefault: false, // mark default button of form widget\n};\n\nconst ABViewFormButtonDefaults = {\n key: \"button\",\n // {string} unique key for this view\n\n icon: \"square\",\n // {string} fa-[icon] reference for this view\n\n labelKey: \"ab.components.button\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormButtonCore extends ABView {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormButtonDefaults\n );\n }\n\n static common() {\n return ABViewFormButtonDefaults;\n }\n\n static defaultValues() {\n return ABViewFormButtonPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n toObj() {\n // labels are multilingual values:\n let labels = [];\n\n if (this.settings.saveLabel) labels.push(\"saveLabel\");\n\n if (this.settings.cancelLabel) labels.push(\"cancelLabel\");\n\n if (this.settings.resetLabel) labels.push(\"resetLabel\");\n\n if (this.settings.deleteLabel) labels.push(\"deleteLabel\");\n\n this.unTranslate(this.settings, this.settings, labels);\n\n let result = super.toObj();\n\n return result;\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n return null;\n }\n\n fromValues(values) {\n super.fromValues(values);\n\n // labels are multilingual values:\n let labels = [];\n\n if (this.settings.saveLabel) labels.push(\"saveLabel\");\n\n if (this.settings.cancelLabel) labels.push(\"cancelLabel\");\n\n if (this.settings.resetLabel) labels.push(\"resetLabel\");\n\n if (this.settings.deleteLabel) labels.push(\"deleteLabel\");\n\n this.unTranslate(this.settings, this.settings, labels);\n\n this.settings.includeSave = JSON.parse(\n (this.settings?.includeSave ?? true) &&\n ABViewFormButtonPropertyComponentDefaults.includeSave\n );\n this.settings.includeCancel = JSON.parse(\n this.settings.includeCancel ||\n ABViewFormButtonPropertyComponentDefaults.includeCancel\n );\n this.settings.includeReset = JSON.parse(\n this.settings.includeReset ||\n ABViewFormButtonPropertyComponentDefaults.includeReset\n );\n this.settings.includeDelete = JSON.parse(\n this.settings.includeDelete ||\n ABViewFormButtonPropertyComponentDefaults.includeDelete\n );\n\n this.settings.isDefault = JSON.parse(\n this.settings.isDefault ||\n ABViewFormButtonPropertyComponentDefaults.isDefault\n );\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormCheckboxPropertyComponentDefaults = {};\n\nconst ABViewFormCheckboxDefaults = {\n key: \"checkbox\", // {string} unique key for this view\n icon: \"check-square-o\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.checkbox\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormCheckboxCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormCheckboxDefaults\n );\n }\n\n static common() {\n return ABViewFormCheckboxDefaults;\n }\n\n static defaultValues() {\n return ABViewFormCheckboxPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormConnectPropertyComponentDefaults = {\n formView: \"\", // id of form to add new data\n filterConditions: {\n // array of filters to apply to the data table\n glue: \"and\",\n rules: [],\n },\n sortFields: [],\n // objectWorkspace: {\n // filterConditions: {\n // // array of filters to apply to the data table\n // glue: \"and\",\n // rules: [],\n // },\n // },\n popupWidth: 700,\n popupHeight: 450,\n};\n\nconst ABViewFormConnectDefaults = {\n key: \"connect\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"Connect\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormConnectCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormConnectDefaults\n );\n }\n\n static common() {\n return ABViewFormConnectDefaults;\n }\n\n static defaultValues() {\n return ABViewFormConnectPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.filterConditions =\n this.settings.filterConditions ||\n ABViewFormConnectPropertyComponentDefaults.filterConditions;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewContainer = require(\"../../platform/views/ABViewContainer\");\nconst ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABRecordRule = require(\"../../rules/ABViewRuleListFormRecordRules\");\nconst ABSubmitRule = require(\"../../rules/ABViewRuleListFormSubmitRules\");\n\nconst ABViewFormDefaults = {\n key: \"form\", // unique key identifier for this ABViewForm\n icon: \"list-alt\", // icon reference: (without 'fa-' )\n labelKey: \"Form\", // {string} the multilingual label key for the class label\n};\n\nconst ABViewFormPropertyComponentDefaults = {\n dataviewID: null,\n showLabel: true,\n labelPosition: \"left\",\n labelWidth: 120,\n height: 200,\n clearOnLoad: false,\n clearOnSave: false,\n displayRules: [],\n editForm: \"none\", // The url pointer of ABViewForm\n\n //\t[{\n //\t\taction: {string},\n //\t\twhen: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tcomparer: {string},\n //\t\t\t\tvalue: {string}\n //\t\t\t}\n //\t\t],\n //\t\tvalues: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tvalue: {object}\n //\t\t\t}\n //\t\t]\n //\t}]\n recordRules: [],\n\n //\t[{\n //\t\taction: {string},\n //\t\twhen: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tcomparer: {string},\n //\t\t\t\tvalue: {string}\n //\t\t\t}\n //\t\t],\n //\t\tvalue: {string}\n //\t}]\n submitRules: [],\n};\n\nmodule.exports = class ABViewFormCore extends ABViewContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewFormDefaults);\n this.isForm = true;\n }\n\n static common() {\n return ABViewFormDefaults;\n }\n\n static defaultValues() {\n return ABViewFormPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.labelPosition =\n this.settings.labelPosition ||\n ABViewFormPropertyComponentDefaults.labelPosition;\n\n // convert from \"0\" => true/false\n this.settings.showLabel = JSON.parse(\n this.settings.showLabel != null\n ? this.settings.showLabel\n : ABViewFormPropertyComponentDefaults.showLabel\n );\n this.settings.clearOnLoad = JSON.parse(\n this.settings.clearOnLoad != null\n ? this.settings.clearOnLoad\n : ABViewFormPropertyComponentDefaults.clearOnLoad\n );\n this.settings.clearOnSave = JSON.parse(\n this.settings.clearOnSave != null\n ? this.settings.clearOnSave\n : ABViewFormPropertyComponentDefaults.clearOnSave\n );\n\n // convert from \"0\" => 0\n this.settings.labelWidth = parseInt(\n this.settings.labelWidth == null\n ? ABViewFormPropertyComponentDefaults.labelWidth\n : this.settings.labelWidth\n );\n this.settings.height = parseInt(\n this.settings.height == null\n ? ABViewFormPropertyComponentDefaults.height\n : this.settings.height\n );\n }\n\n // Use this function in kanban\n objectLoad(object) {\n this._currentObject = object;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n var viewsToAllow = [\"label\", \"layout\", \"button\", \"text\"],\n allComponents = this.application.viewAll();\n\n return allComponents.filter((c) => {\n return viewsToAllow.indexOf(c.common().key) > -1;\n });\n }\n\n /**\n * @method fieldComponents()\n *\n * return an array of all the ABViewFormField children\n *\n * @param {fn} filter \ta filter fn to return a set of ABViewFormField that this fn\n *\t\t\t\t\t\treturns true for.\n * @return {array} \tarray of ABViewFormField\n */\n fieldComponents(filter) {\n const flattenComponents = (views) => {\n let components = [];\n\n views.forEach((v) => {\n if (v == null) return;\n\n components.push(v);\n\n if (v._views?.length) {\n components = components.concat(flattenComponents(v._views));\n }\n });\n\n return components;\n };\n\n if (this._views?.length) {\n const allComponents = flattenComponents(this._views);\n\n if (filter == null) {\n filter = (comp) => comp instanceof ABViewFormItem;\n }\n\n return allComponents.filter(filter);\n } else {\n return [];\n }\n }\n\n addFieldToForm(field, yPosition) {\n if (field == null) return;\n\n var fieldComponent = field.formComponent();\n if (fieldComponent == null) return;\n\n var newView = fieldComponent.newInstance(this.application, this);\n if (newView == null) return;\n\n // set settings to component\n newView.settings = newView.settings || {};\n newView.settings.fieldId = field.id;\n // TODO : Default settings\n\n if (yPosition != null) newView.position.y = yPosition;\n\n // add a new component\n this._views.push(newView);\n\n return newView;\n }\n\n get RecordRule() {\n let object = this.datacollection.datasource;\n\n if (this._recordRule == null) {\n this._recordRule = new ABRecordRule();\n }\n\n this._recordRule.formLoad(this);\n this._recordRule.fromSettings(this.settings.recordRules);\n this._recordRule.objectLoad(object);\n\n return this._recordRule;\n }\n\n doRecordRulesPre(rowData) {\n return this.RecordRule.processPre({ data: rowData, form: this });\n }\n\n doRecordRules(rowData) {\n // validate for record rules\n if (rowData) {\n let object = this.datacollection.datasource;\n let ruleValidator = object.isValidData(rowData);\n let isUpdatedDataValid = ruleValidator.pass();\n if (!isUpdatedDataValid) {\n console.error(\"Updated data is invalid.\", { rowData: rowData });\n return Promise.reject(new Error(\"Updated data is invalid.\"));\n }\n }\n\n return this.RecordRule.process({ data: rowData, form: this });\n }\n\n doSubmitRules(rowData) {\n var object = this.datacollection.datasource;\n\n var SubmitRules = new ABSubmitRule();\n SubmitRules.formLoad(this);\n SubmitRules.fromSettings(this.settings.submitRules);\n SubmitRules.objectLoad(object);\n\n return SubmitRules.process({ data: rowData, form: this });\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormCustomPropertyComponentDefaults = {};\n\nconst ABViewFormCustomDefaults = {\n key: \"fieldcustom\",\n // {string} unique key for this view\n icon: \"object-group\",\n // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.custom\",\n // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormCustom extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormCustomDefaults\n );\n }\n\n static common() {\n return ABViewFormCustomDefaults;\n }\n\n static defaultValues() {\n return ABViewFormCustomPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormDatepickerPropertyComponentDefaults = {\n timepicker: false,\n};\n\nconst ABViewFormDatepickerDefaults = {\n key: \"datepicker\", // {string} unique key for this view\n icon: \"calendar\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.datepicker\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormDatepickerCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormDatepickerDefaults\n );\n }\n\n static common() {\n return ABViewFormDatepickerDefaults;\n }\n\n static defaultValues() {\n return ABViewFormDatepickerPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABView = require(\"../../platform/views/ABView\");\n\nconst ABViewFormFieldPropertyComponentDefaults = {\n required: 0,\n disable: 0,\n};\n\nmodule.exports = class ABViewFormComponentCore extends ABView {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n static defaultValues() {\n return ABViewFormFieldPropertyComponentDefaults;\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n let form = this.parentFormComponent();\n if (form == null) return null;\n\n let datacollection = form.datacollection;\n if (datacollection == null) return null;\n\n return datacollection;\n }\n\n field() {\n if (this.settings.objectId) {\n let object = this.AB.objectByID(this.settings.objectId);\n if (!object) return null;\n\n return object.fieldByID(this.settings.fieldId);\n } else {\n let form = this.parentFormComponent();\n if (form == null) return null;\n\n let object;\n if (form._currentObject) {\n object = form._currentObject;\n } else {\n let datacollection = form.datacollection;\n if (datacollection == null) return null;\n\n object = datacollection.datasource;\n }\n\n if (object == null) return null;\n\n let field = object.fieldByID(this.settings.fieldId);\n return field;\n }\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormJsonPropertyComponentDefaults = {\n type: \"string\", // 'string', 'systemObject' or 'filter'\n};\n\nconst ABViewFormJsonDefaults = {\n key: \"json\", // {string} unique key for this view\n icon: \"brackets-curly\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.json\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormJsonCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormJsonDefaults\n );\n }\n\n static common() {\n return ABViewFormJsonDefaults;\n }\n\n static defaultValues() {\n return ABViewFormJsonPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormNumberPropertyComponentDefaults = {\n isStepper: 0,\n};\n\nconst ABViewFormNumberDefaults = {\n key: \"numberbox\", // {string} unique key for this view\n icon: \"hashtag\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.number\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormNumberCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormNumberDefaults\n );\n }\n\n static common() {\n return ABViewFormNumberDefaults;\n }\n\n static defaultValues() {\n return ABViewFormNumberPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewFormText instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n this.unTranslate(this, this, [\"label\", \"formLabel\"]);\n\n var obj = super.toObj();\n obj.views = []; // no subviews\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // if this is being instantiated on a read from the Property UI,\n this.settings.isStepper =\n this.settings.isStepper ||\n ABViewFormNumberPropertyComponentDefaults.isStepper;\n\n // convert from \"0\" => 0\n this.settings.isStepper = parseInt(this.settings.isStepper);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormCustom = require(\"../../platform/views/ABViewFormCustom\");\n\nconst ABViewFormReadonlyPropertyComponentDefaults = {};\n\nconst ABViewFormReadonlyDefaults = {\n key: \"fieldreadonly\", // {string} unique key for this view\n icon: \"calculator\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.readonly\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormReadonly extends ABViewFormCustom {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormReadonlyDefaults\n );\n }\n\n static common() {\n return ABViewFormReadonlyDefaults;\n }\n\n static defaultValues() {\n return ABViewFormReadonlyPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormSelectMultiplePropertyComponentDefaults = {\n type: \"multicombo\", // 'richselect' or 'radio'\n};\n\nconst ABSelectMultipleDefaults = {\n key: \"selectmultiple\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.selectmultiple\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormSelectMultipleCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABSelectMultipleDefaults\n );\n }\n\n static common() {\n return ABSelectMultipleDefaults;\n }\n\n static defaultValues() {\n return ABViewFormSelectMultiplePropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormSelectSinglePropertyComponentDefaults = {\n type: \"richselect\", // 'richselect' or 'radio'\n};\n\nconst ABSelectSingleDefaults = {\n key: \"selectsingle\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.selectsingle\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormSelectSingleCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABSelectSingleDefaults\n );\n }\n\n static common() {\n return ABSelectSingleDefaults;\n }\n\n static defaultValues() {\n return ABViewFormSelectSinglePropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormItem = require(\"../../platform/views/ABViewFormItem\");\n\nconst ABViewFormTextboxPropertyComponentDefaults = {\n type: \"single\", // 'single', 'multiple' or 'rich'\n};\n\nconst ABViewFormTextboxDefaults = {\n key: \"textbox\", // {string} unique key for this view\n icon: \"i-cursor\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.textbox\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormTextboxCore extends ABViewFormItem {\n constructor(values, application, parent, defaultValues) {\n super(\n values,\n application,\n parent,\n defaultValues || ABViewFormTextboxDefaults\n );\n }\n\n static common() {\n return ABViewFormTextboxDefaults;\n }\n\n static defaultValues() {\n return ABViewFormTextboxPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewFormCustom = require(\"../../platform/views/ABViewFormCustom\");\n\nconst ABViewFormTreePropertyComponentDefaults = {};\n\nconst ABTreeDefaults = {\n key: \"formtree\", // {string} unique key for this view\n icon: \"sitemap\", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.tree\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormTreeCore extends ABViewFormCustom {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABTreeDefaults);\n }\n\n static common() {\n return ABTreeDefaults;\n }\n\n static defaultValues() {\n return ABViewFormTreePropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewGanttPropertyComponentDefaults = {\n dataviewID: \"\",\n // {string}\n // {ABDatacollection.id} of the datacollection that contains the data for\n // the Gantt chart.\n\n titleFieldID: \"\",\n // {string}\n // {ABFieldXXX.id} of the field that contains the value of the title\n // ABFieldString, ABFieldLongText\n\n startDateFieldID: \"\",\n // {string}\n // {ABFieldDate.id} of the field that contains the start date\n\n endDateFieldID: \"\",\n // {string}\n // {ABFieldDate.id} of the field that contains the end date\n\n durationFieldID: \"\",\n // {string}\n // {ABFieldNumber.id} of the field that contains the duration\n\n progressFieldID: \"\",\n // {string}\n // {ABFieldNumber.id} of the field that marks the progress\n\n notesFieldID: \"\",\n // {string}\n // {ABFieldXXX.id} of the field that contains the value of the title\n // ABFieldString, ABFieldLongText\n};\n\nconst ABViewDefaults = {\n key: \"gantt\", // {string} unique key for this view\n icon: \"tasks\", // {string} fa-[icon] reference for this view\n labelKey: \"Gantt\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewGanttCore extends ABViewWidget {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewGanttPropertyComponentDefaults;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n Object.keys(ABViewGanttPropertyComponentDefaults).forEach((k) => {\n this.settings[k] =\n this.settings[k] || ABViewGanttPropertyComponentDefaults[k];\n });\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewGridPropertyComponentDefaults = {\n label: \"\",\n // {string}\n // label is required and you can add more if the component needs them\n\n // format:0 \t// 0 - normal, 1 - title, 2 - description\n dataviewID: \"\",\n // {uuid}\n // uuid of ABDataCollection that drives the data for our Grid\n\n padding: 17,\n // {int}\n // the default padding surrounding the component\n\n showToolbar: 1,\n // {bool}\n // do we show our toolbar?\n\n isEditable: 0,\n // {bool}\n // do we allow editing in the grid?\n\n massUpdate: 0,\n // {bool}\n // do we allow the Mass Update capability? (row checkboxes and the\n // MassUpdate popup)\n\n allowDelete: 0,\n // {bool}\n // do we allow deleting multiple rows at a time? Mass Delete.\n\n // isFilterable:0,\n\n isSortable: 1,\n // {bool}\n // do we allow the sort options.\n\n isExportable: 0,\n // {bool}\n // do we enable the webix export from grid capabilities?\n\n // linkedObject:'',\n // linkedField:'',\n // linkedPage:'',\n // linkedPageView:'',\n // linkedEditPage:'',\n // linkedEditPageForm:'',\n\n detailsPage: \"\",\n // {ABViewPage.id}\n // the ABViewPage that has the details component.\n\n detailsTab: \"\",\n // {ABViewTab.id}\n // the ABViewTab component, that has the details component.\n // NOTE: if your details is embedded on a TAB, we need both the\n // .detailsPage & .detailsTab to successfully show the item.\n\n editPage: \"\",\n // {ABViewPage.id}\n // the ABViewPage that has the edit component.\n\n editTab: \"\",\n // {ABViewTab.id}\n // the ABViewTab component, that has the edit component.\n // NOTE: if your editor is embedded on a TAB, we need both the\n // .editPage & .editTab to successfully show the form.\n\n trackView: 0,\n // {bool}\n // Do we offer the ability to track changes to this object/row?\n\n frozenColumnID: \"\",\n // {ABField.id}\n // id of column you want to stop freezing the left hand side at.\n\n hiddenFields: [],\n // {array} [ ABField.id, ABField.id, ... ]\n // array of [ids] to add hidden:true to\n\n summaryColumns: [],\n // {array} [ ABField.id, ABField.id, ... ]\n // array of [ids] to add the SUM footer to\n\n countColumns: [],\n // {array} [ ABField.id, ABField.id, ... ]\n // array of [ids] to add the Count footer to\n\n // TODO: get rid of objectWorkspace!\n objectWorkspace: {\n // sortFields:[], // array of columns with their sort configurations\n // filterConditions:[], // array of filters to apply to the data table\n frozenColumnID: \"\", // id of column you want to stop freezing\n hiddenFields: [], // array of [ids] to add hidden:true to\n summaryColumns: [],\n countColumns: [],\n },\n gridFilter: {\n filterOption: 1,\n userFilterPosition: \"toolbar\",\n isGlobalToolbar: 1,\n },\n // summaryFields: [], // array of [field ids] to add the summary column in footer\n // countFields: [], // array of [field ids] to add the summary column in footer\n\n height: 0,\n // {int}\n // The Height of our Grid.\n // See ../views/ABViewDataview.js\n\n hideHeader: 0,\n labelAsField: 0,\n hideButtons: 0,\n groupBy: \"\", // id of field\n\n // TODO: add to ABDesigner.interface design:\n columnConfig: [],\n // {array} [ {columnHeader}, {columnHeader} ... ]\n // An array of column headers for the grid to display. These should\n // be generated at Design time, and can allow the designer to ORDER the\n // columns, assign column widths, fillspace, etc...\n // {columnHeader}\n // The minimum amount of information a Grid needs for it's customization\n // .id {string} ABField.columnName\n // .fieldId {string} ABField.id\n // .width {int}\n // .fillspace {bool}\n // .minwidth\n //\n // When displaying column headers, we will ask the\n // CurrentObject.columnHeaders(), and then modify them with our settings\n // here.\n\n saveLocal: 1,\n // {bool}\n // Allow saving of local changes to our grid display. This will enable\n // a user to modify the Grid display locally.\n};\n\nconst ABViewDefaults = {\n key: \"grid\", // {string} unique key for this view\n icon: \"table\", // {string} fa-[icon] reference for this view\n labelKey: \"Grid\", // {string} the multilingual label key for the class label\n};\n\n/**\n * @function settingsDefault()\n * Verifies a given field is set and if not, defaults to what we havein our\n * ABViewGridPropertyComponentDefaults.\n * NOTE: use this fn() for values that are NOT TRUTHY ... so not for numeric\n * 1 or 0.\n * @param {hash} base\n * The current settings value hash.\n * @param {string} field\n * The parameter we are checking.\n */\nfunction settingsDefault(base, field) {\n if (typeof base[field] == \"undefined\") {\n base[field] = ABViewGridPropertyComponentDefaults[field];\n return;\n }\n base[field] = base[field] || ABViewGridPropertyComponentDefaults[field];\n}\n\n/**\n * @function settingsDefaultJSON()\n * Verifies a given field is set and if not, defaults to what we havein our\n * ABViewGridPropertyComponentDefaults.\n * NOTE: use this fn() for values that ARE TRUTHY ... so for numeric 1 or 0\n * @param {hash} base\n * The current settings value hash.\n * @param {string} field\n * The parameter we are checking.\n */\nfunction settingsDefaultJSON(base, field) {\n try {\n if (typeof base[field] == \"string\") {\n base[field] = JSON.parse(base[field]);\n }\n } catch (e) {\n base[field] = ABViewGridPropertyComponentDefaults[field];\n }\n}\n\nmodule.exports = class ABViewGridCore extends ABViewWidget {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewGridPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // if this is being instantiated on a read from the Property UI,\n settingsDefault(this.settings, \"dataviewID\");\n\n // Convert to boolean\n // these values are sometimes 0 (number) at this point so the JSON.parse\n // with the || (or) statement was always falling to the default so I am\n // trying to parse the value...if it fails we use the default value\n settingsDefaultJSON(this.settings, \"padding\");\n settingsDefaultJSON(this.settings, \"showToolbar\");\n settingsDefaultJSON(this.settings, \"isEditable\");\n settingsDefaultJSON(this.settings, \"massUpdate\");\n settingsDefaultJSON(this.settings, \"allowDelete\");\n // this.settings.isFilterable = JSON.parse(this.settings.isFilterable || ABViewGridPropertyComponentDefaults.isFilterable);\n settingsDefaultJSON(this.settings, \"isSortable\");\n settingsDefaultJSON(this.settings, \"isExportable\");\n settingsDefaultJSON(this.settings, \"hideHeader\");\n settingsDefaultJSON(this.settings, \"labelAsField\");\n settingsDefaultJSON(this.settings, \"hideButtons\");\n settingsDefaultJSON(this.settings, \"columnConfig\");\n settingsDefaultJSON(this.settings, \"saveLocal\");\n\n this.settings.gridFilter =\n this.settings.gridFilter ||\n ABViewGridPropertyComponentDefaults.gridFilter;\n\n try {\n this.settings.gridFilter.filterOption = JSON.parse(\n this.settings.gridFilter.filterOption\n );\n } catch (e) {\n this.settings.gridFilter.filterOption =\n ABViewGridPropertyComponentDefaults.gridFilter.filterOption;\n }\n\n try {\n this.settings.gridFilter.isGlobalToolbar = JSON.parse(\n this.settings.gridFilter.isGlobalToolbar\n );\n } catch (e) {\n this.settings.gridFilter.isGlobalToolbar =\n ABViewGridPropertyComponentDefaults.gridFilter.isGlobalToolbar;\n }\n\n // this.settings.linkedObject = this.settings.linkedObject || ABViewGridPropertyComponentDefaults.linkedObject;\n // this.settings.linkedField = this.settings.linkedField || ABViewGridPropertyComponentDefaults.linkedField;\n // this.settings.linkedPage = this.settings.linkedPage || ABViewGridPropertyComponentDefaults.linkedPage;\n // this.settings.linkedPageView = this.settings.linkedPageView || ABViewGridPropertyComponentDefaults.linkedPageView;\n // this.settings.linkedEditPage = this.settings.linkedEditPage || ABViewGridPropertyComponentDefaults.linkedEditPage;\n // this.settings.linkedEditPageForm = this.settings.linkedEditPageForm || ABViewGridPropertyComponentDefaults.linkedEditPageForm;\n\n settingsDefault(this.settings, \"detailsPage\");\n settingsDefault(this.settings, \"editPage\");\n settingsDefault(this.settings, \"detailsTab\");\n settingsDefault(this.settings, \"editTab\");\n settingsDefaultJSON(this.settings, \"trackView\");\n\n // TODO: remove objectworkspace!\n // this.settings.objectWorkspace =\n // this.settings.objectWorkspace ||\n // ABViewGridPropertyComponentDefaults.objectWorkspace;\n\n // if (typeof this.settings.objectWorkspace != \"undefined\") {\n // if (typeof this.settings.objectWorkspace.sortFields == \"undefined\")\n // this.settings.objectWorkspace.sortFields = [];\n // if (\n // typeof this.settings.objectWorkspace.filterConditions == \"undefined\"\n // )\n // this.settings.objectWorkspace.filterConditions = [];\n // if (typeof this.settings.objectWorkspace.frozenColumnID == \"undefined\")\n // this.settings.objectWorkspace.frozenColumnID = \"\";\n // if (typeof this.settings.objectWorkspace.hiddenFields == \"undefined\")\n // this.settings.objectWorkspace.hiddenFields = [];\n // if (typeof this.settings.objectWorkspace.summaryColumns == \"undefined\")\n // this.settings.objectWorkspace.summaryColumns = [];\n // if (typeof this.settings.objectWorkspace.countColumns == \"undefined\")\n // this.settings.objectWorkspace.countColumns = [];\n // }\n\n var owFields = [\n \"sortFields\",\n \"filterConditions\",\n \"frozenColumnID\",\n \"hiddenFields\",\n \"summaryColumns\",\n \"countColumns\",\n ];\n // Transition: if we have an .objectWorkspace, copy those values in here:\n if (this.settings.objectWorkspace) {\n owFields.forEach((f) => {\n if (this.settings[f] == null)\n this.settings[f] = this.settings.objectWorkspace[f];\n });\n }\n\n // make sure they have actual default values now.\n owFields.forEach((f) => {\n settingsDefault(this.settings, f);\n });\n\n // we are not allowed to have sub views:\n this._views = [];\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n removeField(field, cb) {\n let shouldSave = false;\n\n // check to see if there is a frozenColumnID and if it matches the\n // deleted field\n if (this.settings?.frozenColumnID == field.columnName) {\n // remove the column name from the frozen column id\n this.settings.frozenColumnID = \"\";\n // flag the object to be saved later\n shouldSave = true;\n }\n\n // check to see if there are hidden fields\n if (this.settings.hiddenFields?.length) {\n // find if the deleted field is in the array\n let index = this.settings.hiddenFields.indexOf(field.columnName);\n // if so splice it out of the array\n if (index > -1) {\n this.settings.hiddenFields.splice(index, 1);\n // flag the object to be saved later\n shouldSave = true;\n }\n }\n\n // check to see if there are Summary fields\n if (this.settings.summaryColumns?.length) {\n // find if the deleted field is in the array\n let index = this.settings.summaryColumns.indexOf(field.id);\n // if so splice it out of the array\n if (index > -1) {\n this.settings.summaryColumns.splice(index, 1);\n // flag the object to be saved later\n shouldSave = true;\n }\n }\n\n // check to see if there are hidden fields\n if (this.settings.countColumns?.length) {\n // find if the deleted field is in the array\n let index = this.settings.countColumns.indexOf(field.id);\n // if so splice it out of the array\n if (index > -1) {\n this.settings.countColumns.splice(index, 1);\n // flag the object to be saved later\n shouldSave = true;\n }\n }\n // if settings were changed call the callback\n\n cb(null, shouldSave);\n }\n\n copyUpdateProperyList() {\n return [\"detailsPage\", \"detailsTab\", \"editPage\", \"editTab\"];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewImagePropertyComponentDefaults = {\n filename: \"\",\n width: 200,\n height: 100,\n};\n\nconst ABViewDefaults = {\n key: \"image\", // {string} unique key for this view\n icon: \"picture-o\", // {string} fa-[icon] reference for this view\n labelKey: \"Image\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewImageCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewImagePropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n return null;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.width = parseInt(\n this.settings.width || ABViewImagePropertyComponentDefaults.width\n );\n this.settings.height = parseInt(\n this.settings.height || ABViewImagePropertyComponentDefaults.height\n );\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewKanbanPropertyComponentDefaults = {\n dataviewID: null,\n // {uuid}\n // The ABDataCollection.uuid that we are using to store the data.\n // NOTE: we actually use the DC to get the ABObject it is connected to.\n\n editFields: [],\n // {array}\n // An array of {ABField.id} that determines which fields should show up\n // in the editor.\n\n verticalGroupingField: \"\",\n // {ABField.id}\n // the .id of the ABField instance that determines the Vertical Grouping\n // of the Kanban.\n\n horizontalGroupingField: \"\",\n // {ABField.id}\n // the .id of the ABField instance that determines the horizontal Grouping\n // of the Kanban.\n\n ownerField: \"\",\n // {ABFieldUser.id}\n // the .id of the ABFieldUser instance that determines the owner of the\n // entries.\n\n template: \"\",\n // {json}\n // The {ABViewText} definition used to display the template for this KanBan.\n //\n // A display template used for displaying the information in each Card. The\n // template is a basic string with special placeholders: {field.id}\n // Given a row of data, the current object will scan the template for any\n // placeholders matching one of it's fields, and then update it with the\n // current value.\n};\n\nconst ABViewDefaults = {\n key: \"kanban\",\n // {string}\n // unique key identifier for this ABView object\n\n icon: \"columns\",\n // {string}\n // font-awesome icon reference: (without 'fa-' )\n\n labelKey: \"Kanban\",\n // {string}\n // the multilingual label key\n // NOTE: will be used as L(labelKey)\n};\n\nmodule.exports = class ABViewKanbanCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n fromValues(values) {\n super.fromValues(values);\n\n // set a default .template value\n if (!this.settings.template) {\n this.settings.template = { id: `${this.id}_template`, key: \"text\" };\n this.settings.template.text = this.settings.textTemplate;\n }\n\n this.TextTemplate = this.AB.viewNewDetatched(this.settings.template);\n }\n\n toObj() {\n var obj = super.toObj();\n obj.settings.template = this.TextTemplate.toObj();\n // NOTE: this corrects the initial save where this.id == undefined\n // all the rest will set the .id correctly.\n obj.settings.template.id = `${this.id}_template`;\n return obj;\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewKanbanPropertyComponentDefaults;\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewLabelPropertyComponentDefaults = {\n text: \"\",\n format: 0, // 0 - normal, 1 - title, 2 - description\n alignment: \"left\",\n};\n\nconst ABViewDefaults = {\n key: \"label\", // {string} unique key for this view\n icon: \"font\", // {string} fa-[icon] reference for this view\n labelKey: \"Label\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewLabelCore extends ABViewWidget {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewLabelPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n this.unTranslate(this, this, [\"label\", \"text\"]);\n\n var obj = super.toObj();\n obj.viewIDs = [];\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values); // <-- this performs the translations\n\n // if this is being instantiated on a read from the Property UI,\n // .text is coming in under .settings.label\n this.text = values.text || values.settings.text || \"*text\";\n\n this.settings.format =\n this.settings.format || ABViewLabelPropertyComponentDefaults.format;\n this.settings.alignment =\n this.settings.alignment ||\n ABViewLabelPropertyComponentDefaults.alignment;\n\n // we are not allowed to have sub views:\n this._views = [];\n\n // convert from \"0\" => 0\n this.settings.format = parseInt(this.settings.format);\n\n this.translate(this, this, [\"label\", \"text\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n //// Allow external interface to manipulate our settings:\n\n /**\n * @method formatNormal\n * display text in the normal format.\n */\n formatNormal() {\n this.settings.format = 0;\n }\n\n /**\n * @method formatTitle\n * display text as a Title.\n */\n formatTitle() {\n this.settings.format = 1;\n }\n\n /**\n * @method formatDescription\n * display text as a description.\n */\n formatDescription() {\n this.settings.format = 2;\n }\n};\n","const ABViewContainer = require(\"../../platform/views/ABViewContainer\");\nconst ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst PropertyComponentDefaults = {\n label: \"\",\n numColumns: 1, // The number of columns for this layout\n};\n\nconst ABViewDefaults = {\n key: \"layout\", // {string} unique key for this view\n icon: \"columns\", // {string} fa-[icon] reference for this view\n labelKey: \"Layout\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewLayoutCore extends ABViewWidget {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return PropertyComponentDefaults;\n }\n\n /**\n * @method addColumn\n * method to actually add a new ABView as one of our columns.\n * This is called by the static .addView() method.\n */\n addColumn() {\n this._views.push(\n this.application.viewNew(\n {\n key: ABViewContainer.common().key,\n },\n this.application,\n this\n )\n );\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n * @param {bool} isEdited is this component currently in the Interface Editor\n * @return {array} of ABView objects.\n */\n componentList(isEdited) {\n if (isEdited) {\n // if the layout component is being edited in the editor (isEdited == true)\n // then we return [];\n return [];\n } else {\n // the layout view doesn't care what components are offered, it get's\n // the list from it's parent view.\n // ## NOTE: layout views should not be root views.\n if (this.parent) {\n return this.parent.componentList(false);\n } else {\n return [];\n }\n }\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n return null;\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewListPropertyComponentDefaults = {\n dataviewID: null,\n field: null,\n height: 0,\n};\n\nconst ABViewDefaults = {\n key: \"list\", // {string} unique key for this view\n icon: \"list-ul\", // {string} fa-[icon] reference for this view\n labelKey: \"List\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewLabelCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewListPropertyComponentDefaults;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n field() {\n var dv = this.datacollection;\n if (!dv) return null;\n\n var object = dv.datasource;\n if (!object) return null;\n\n return object.fieldByID(this.settings.field);\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewMenuPropertyComponentDefaults = {\n orientation: \"x\",\n buttonStyle: \"ab-menu-default\",\n menuAlignment: \"ab-menu-left\",\n menuInToolbar: 1,\n menuPadding: 10,\n menuTheme: \"bg_gray\",\n menuPosition: \"left\",\n menuTextLeft: \"\",\n menuTextRight: \"\",\n menuTextCenter: \"\",\n // [\n // \t\t{\n //\t\t\tpageId: uuid,\n //\t\t\ttabId: uuid,\n //\t\t\ttype: string, // \"page\", \"tab\"\n //\t\t\tisChecked: bool,\n //\t\t\taliasname: string,\n //\t\t\ttranslations: []\n //\t\t}\n // ]\n pages: [],\n order: [],\n};\n\nconst ABMenuDefaults = {\n key: \"menu\", // {string} unique key for this view\n icon: \"th-large\", // {string} fa-[icon] reference for this view\n labelKey: \"Menu\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewMenuCore extends ABViewWidget {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABMenuDefaults);\n }\n\n static common() {\n return ABMenuDefaults;\n }\n\n static defaultValues() {\n return ABViewMenuPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewMenu instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n this.unTranslate(this, this, [\n \"menuTextLeft\",\n \"menuTextCenter\",\n \"menuTextRight\",\n ]);\n if (this.settings.pages) {\n this.settings.pages.forEach((page) => {\n this.unTranslate(page, page, [\"aliasname\"]);\n });\n }\n\n var obj = super.toObj();\n obj.viewIDs = [];\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.translate(this, this, [\n \"menuTextLeft\",\n \"menuTextCenter\",\n \"menuTextRight\",\n ]);\n\n this.settings.pages =\n this.settings.pages || ABViewMenuPropertyComponentDefaults.pages;\n\n for (var i = 0; i < this.settings.pages.length; i++) {\n var page = this.settings.pages[i];\n if (page instanceof Object) {\n page.isChecked = JSON.parse(page.isChecked || false);\n\n this.translate(page, page, [\"aliasname\"]);\n }\n // Compatible with old data\n else if (typeof page == \"string\") {\n this.settings.pages[i] = {\n pageId: page,\n isChecked: true,\n };\n }\n }\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n ClearPagesInView(view) {\n // clear menu items\n if (view && view.count() > 1) {\n view.find({}).forEach((item) => {\n view.remove(item.id);\n });\n }\n }\n\n /**\n * @property datacollection\n * return data source\n * NOTE: this view doesn't track a DataCollection.\n * @return {ABDataCollection}\n */\n get datacollection() {\n return null;\n }\n\n AddPagesToView(view, pages) {\n if (!view || !pages) return;\n\n (pages || []).forEach((displayPage) => {\n if (displayPage.isChecked) {\n let existsPage = this.application.pages(\n (p) => p.id == displayPage.pageId,\n true\n )[0];\n if (!existsPage) return;\n\n var pageAccessLevel = existsPage.getUserAccess();\n if (pageAccessLevel == 0) return;\n\n if (displayPage.tabId) {\n let existsTab = this.application.views(\n (v) => v.id == displayPage.tabId,\n true\n )[0];\n if (!existsTab) return;\n\n var tabAccessLevel = existsTab.getUserAccess();\n if (tabAccessLevel == 0) return;\n }\n\n let label = this.getAliasname(displayPage);\n // create a temporaty store for the menu item\n var menuItem;\n // check if page has a parent or not\n if (displayPage.parent && displayPage.parent != \"0\") {\n // if page has a parent attempt to grab its submenu\n menuItem = view.getSubMenu(displayPage.parent);\n } else {\n // if the page doesn't have parent use the current menu\n menuItem = view;\n }\n // if the menu item doesn't have a menu selected find it\n if (menuItem == null) {\n // get the menu item\n var curMenu = view.getMenuItem(displayPage.parent);\n // create a submenu placeholder\n curMenu.submenu = [];\n // update the menu with the new submenu included\n view.refresh(displayPage.parent);\n // get the submenu we just created\n menuItem = view.getSubMenu(displayPage.parent);\n }\n if (menuItem.exists(displayPage.tabId || displayPage.pageId))\n return;\n // add a new item to the menu/submenu\n menuItem.add(\n {\n id: displayPage.tabId || displayPage.pageId,\n value: label,\n type: displayPage.type,\n pageId: displayPage.pageId,\n icon: displayPage.icon\n ? \"fa fa-fw fa-\" + displayPage.icon\n : \"\",\n },\n displayPage.position ? parseInt(displayPage.position) : 0\n );\n }\n });\n }\n\n /**\n * @method getAliasname\n * @param pageInfo - an object in settings\n * {\n * \tpageId: uuid,\n * \ttabId: uuid,\n * \ttype: string, - \"page\" or \"tab\"\n * \tisChecked: bool,\n * \taliasname: string,\n *\ttranslations: []\n *}\n *\n * @return {string}\n */\n getAliasname(pageInfo) {\n var lang = this.AB.Multilingual.currentLanguage();\n var translation = pageInfo.translations.filter((t) => {\n return t.language_code == lang;\n });\n\n var label = \"\";\n\n if (translation.length) {\n if (translation[0].aliasname) {\n label = translation[0].aliasname;\n } else if (translation[0].label) {\n label = translation[0].label;\n }\n }\n\n // Just in case there isn't one stored in the translations yet\n if (!label && pageInfo.aliasname) {\n label = pageInfo.aliasname;\n }\n\n // if alias is empty, then find label of page or tab\n if (\n !label ||\n // remove [en] or [th] etc.\n !label.replace(/\\[.{2,}\\]/g, \"\")\n ) {\n // first check to see if we are actually on a page\n // if not recursivly look up for the nearest parent page\n var pageId;\n if (pageInfo.pageId) {\n pageId = pageInfo.pageId;\n } else {\n pageId = this.getParentPageId(pageInfo);\n }\n // find label of the actual page\n var page = this.application.pages((p) => p.id == pageId, true)[0];\n if (page) {\n // find label of the tab view\n if (pageInfo.type == \"tab\" || pageInfo.key == \"viewcontainer\") {\n var tabView = page.views(\n (v) => v.id == pageInfo.tabId || v.id == pageInfo.id,\n true\n )[0];\n if (tabView) {\n label = tabView.label;\n }\n } else {\n label = page.label;\n }\n }\n }\n\n return label;\n }\n\n getParentPageId(currentView) {\n if (currentView.key != \"page\") {\n return this.getParentPageId(currentView.parent);\n } else {\n return currentView.id;\n }\n }\n\n copy(lookUpIds, parent) {\n return super.copy(lookUpIds, parent).then((result) => {\n // update ids of page's settings\n (result.settings.pages || []).forEach((p, i) => {\n let page = result.settings.pages[i];\n\n // Compatible with old data\n if (typeof page == \"string\") {\n result.settings.pages[i] = lookUpIds[page];\n } else {\n page.pageId = lookUpIds[page.pageId];\n page.tabId = lookUpIds[page.tabId];\n }\n });\n\n return result.save().then(() => {\n return result;\n });\n });\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABSubmitRule = require(\"../../rules/ABViewRuleListFormSubmitRules\");\n\nconst ABViewPDFImporterPropertyComponentDefaults = {\n dataviewID: null,\n fieldID: null,\n\n //\t[{\n //\t\taction: {string},\n //\t\twhen: [\n //\t\t\t{\n //\t\t\t\tfieldId: {UUID},\n //\t\t\t\tcomparer: {string},\n //\t\t\t\tvalue: {string}\n //\t\t\t}\n //\t\t],\n //\t\tvalue: {string}\n //\t}]\n submitRules: [],\n};\n\nconst ABViewDefaults = {\n key: \"pdfImporter\", // {string} unique key for this view\n icon: \"file-pdf-o\", // {string} fa-[icon] reference for this view\n labelKey: \"PDF Importer\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewPDFImporterCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewPDFImporterPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.dataviewID =\n this.settings.dataviewID ??\n ABViewPDFImporterPropertyComponentDefaults.dataviewID;\n\n this.settings.fieldID =\n this.settings.fieldID ??\n ABViewPDFImporterPropertyComponentDefaults.fieldID;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n var obj = super.toObj();\n\n obj.settings = obj.settings ?? {};\n\n return obj;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n doSubmitRules(rowDatas) {\n const object = this.datacollection.datasource;\n\n const SubmitRules = new ABSubmitRule();\n SubmitRules.formLoad(this);\n SubmitRules.fromSettings(this.settings.submitRules);\n SubmitRules.objectLoad(object);\n\n if (rowDatas && !Array.isArray(rowDatas)) rowDatas = [rowDatas];\n\n rowDatas?.forEach((rowData) => {\n SubmitRules.process({ data: rowData, form: this });\n });\n }\n};\n","/*\n * ABViewPage\n *\n * An ABView that represents a \"Page\" in the system.\n *\n * Pages are\n *\t- allowed to be displayed in the interface list\n *\t- return a full list of components that can be added to the view editor\n *\n *\n */\n\nconst ABViewContainer = require(\"../../platform/views/ABViewContainer\");\n// var ABViewManager = require(\"../ABViewManager\");\n\n// function L(key, altText) {\n// return AD.lang.label.getLabel(key) || altText;\n// }\n\nconst ABViewDefaults = {\n key: \"page\", // unique key identifier for this ABView\n icon: \"file\", // icon reference: (without 'fa-' )\n};\n\nconst ABPropertyComponentDefaults = {\n type: \"page\", // 'page', 'popup' or 'reportPage'\n popupWidth: 700,\n popupHeight: 450,\n pageWidth: null,\n fixedPageWidth: 0,\n pageBackground: \"ab-background-default\",\n};\n\nmodule.exports = class ABViewPageCore extends ABViewContainer {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n\n // \t{\n // \t\tid:'uuid',\t\t\t\t\t// uuid value for this obj\n // \t\tkey:'viewKey',\t\t\t\t// unique key for this View Type\n // \t\ticon:'font',\t\t\t\t// fa-[icon] reference for an icon for this View Type\n\n //\t\tname: '',\t\t\t\t\t// unique page name\n\n // \t\tlabel:'',\t\t\t\t\t// pulled from translation\n\n //\t\tsettings: {\t\t\t\t\t// unique settings for the type of field\n //\t\t},\n\n //\t\ttranslations:[]\n // \t}\n\n this.parent = null; // will be set by the pageNew() that creates this obj.\n // {obj} .parent\n // this points to the ABView object that manages this object as a child.\n // this param is shared across ABViews as well as ABViewPage, but has\n // different implications ... so we default an ABViewPage.parent = null\n // and the place that Creates the Page must assign the .parent externally.\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABPropertyComponentDefaults;\n }\n\n static getPageActionKey(view) {\n return [\n \"opstools\",\n \"AB_\" + String(view.application.name).replace(/[^a-z0-9]/gi, \"\"),\n String(view.name)\n .replace(/[^a-z0-9]/gi, \"\")\n .toLowerCase(),\n \"view\",\n ].join(\".\");\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewPage instance\n * into the values needed for saving to the DB.\n *\n * @return {json}\n */\n toObj() {\n var obj = super.toObj();\n\n obj.name = this.name;\n\n obj.myAppID = this.myAppID;\n\n // icon of popup page\n if (this.settings.type == \"popup\") obj.icon = \"clone\";\n\n // set label of the page\n if (!this.label || this.label == \"?label?\") obj.label = obj.name;\n\n // compile our pages\n obj.pageIDs = (this._pages || []).map((p) => p.id);\n\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // icon of popup page\n if (values.settings.type == \"popup\") this.icon = \"clone\";\n\n // set label of the page\n if (!this.label || this.label == \"?label?\") this.label = this.name;\n\n // track which application this Page belongs to:\n this.myAppID = values.myAppID;\n if (!this.myAppID && this.application) {\n this.myAppID = this.application.id;\n }\n\n // now properly handle our sub pages.\n var pages = [];\n (values.pageIDs || []).forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (def) {\n pages.push(this.pageNew(def));\n } else {\n this.AB.error(\n `App[${this.application.name}][${this.application.id}]->Page[${this.name}][${this.id}] referenced an unknown Page[${id}]`\n );\n }\n });\n this._pages = pages;\n\n // the default columns of ABView is 1\n this.settings.columns = this.settings.columns || 1;\n this.settings.gravity = this.settings.gravity || [1];\n\n // convert from \"0\" => 0\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABApplication\n *\n * also remove it from our _AllApplications\n *\n * @return {Promise}\n */\n destroy() {\n return Promise.resolve()\n .then(() => {\n // When deleting an ABViewPage\n // be sure to remove any of it's ABViewPages as well\n // This cleans out any dangling ABDefinitions and cleans up the\n // OpsPortal Permissions:\n\n var allPageDeletes = [];\n var allPages = this.pages();\n this._pages = [];\n // doing ._pages = [] prevents any of my updates when\n // a sub-page is .destroy()ed\n\n allPages.forEach((p) => {\n allPageDeletes.push(p.destroy());\n });\n return Promise.all(allPageDeletes);\n })\n .then(() => {\n var parent = this.parent || this.application;\n\n return parent.pageRemove(this);\n })\n .then(() => {\n return super.destroy();\n });\n\n // return new Promise((resolve, reject) => {\n // // verify we have been .save() before:\n // if (this.id) {\n // this.application\n // .viewDestroy(this)\n // .then(() => {\n // // remove the page in list\n // var parent = this.parent || this.application;\n // var remainingPages = parent.pages((p) => {\n // return p.id != this.id;\n // });\n // parent._pages = remainingPages;\n\n // resolve();\n // })\n // .catch(reject);\n // } else {\n // resolve(); // nothing to do really\n // }\n // });\n }\n\n /**\n * @method save()\n * persist this instance of ABViewPage\n * @return {Promise}\n * .resolve( {this} )\n */\n save() {\n return Promise.resolve()\n .then(() => {\n // this creates our .id\n return super.save();\n })\n .then(() => {\n // now we can persist ourself in our parent\n var parent = this.parent || this.application;\n\n return parent.pageInsert(this);\n })\n .then(() => {\n return this;\n });\n }\n\n /**\n * @method refreshInstance()\n * This returns a NEW instance of a ABViewPage based upon the latest\n * version of it's Definition. It also resolves any current listeners\n * this copy currently has and prepare this to discard itself.\n */\n refreshInstance() {\n console.warn(\n \"This version of ABViewPage hasn't updated it's refreshInstance()\",\n this\n );\n return this;\n }\n\n ///\n /// Pages\n ///\n\n /**\n * @method pages()\n *\n * return an array of all the ABViewPages for this ABViewPage.\n *\n * @param {fn} filter\t\ta filter fn to return a set of ABViewPages that this fn\n *\t\t\t\t\t\t\treturns true for.\n * @param {boolean} deep\tflag to find in sub pages\n *\n * @return {array}\t\t\tarray of ABViewPages\n */\n pages(filter = () => true, deep = false) {\n var result = [];\n\n // find into sub-pages recursively\n if (filter && deep) {\n if (this._pages && this._pages.length > 0) {\n result = this._pages.filter(filter);\n\n if (result.length < 1) {\n this._pages.forEach((p) => {\n var subPages = p.pages(filter, deep);\n if (subPages && subPages.length > 0) {\n result = subPages;\n }\n });\n }\n }\n }\n // find root pages\n else {\n result = this._pages.filter(filter);\n }\n\n return result;\n }\n\n /**\n * @method pageInsert()\n *\n * save the given ABViewPage in our ._pages array and persist the current\n * values if they changed.\n *\n * @param {ABViewPage} page The instance of the page to save.\n * @return {Promise}\n */\n pageInsert(page) {\n var isIncluded = this.pages((o) => o.id === page.id).length > 0;\n if (!isIncluded) {\n // if not already included, then add and save the Obj definition:\n this._pages.push(page);\n return this.save();\n }\n\n // Nothing was required so return\n return Promise.resolve();\n }\n\n /**\n * @method pageNew()\n *\n * return an instance of a new (unsaved) ABViewPage that is tied to this\n * ABViewPage.\n *\n * NOTE: this new page is not included in our this.pages until a .save()\n * is performed on the page.\n *\n * @return {ABViewPage}\n */\n pageNew(values) {\n // make sure this is an ABViewPage description\n values.key = ABViewDefaults.key;\n\n // NOTE: this returns a new ABView component.\n // when creating a new page, the 3rd param should be null, to signify\n // the top level component.\n var page = this.application.viewNew(values, this.application, null);\n page.parent = this;\n return page;\n }\n\n /**\n * @method pageRemove()\n *\n * remove the given ABViewPage from our ._pages array and persist the current\n * values.\n *\n * @param {ABViewPage} page The instance of the page to remove.\n * @return {Promise}\n */\n pageRemove(page) {\n var origLen = this._pages.length;\n this._pages = this.pages(function (p) {\n return p.id != page.id;\n });\n\n if (this._pages.length < origLen) {\n return this.save();\n }\n\n // if we get here, then nothing changed so nothing to do.\n return Promise.resolve();\n }\n\n /**\n * @method urlView()\n * return the url pointer for views in this application.\n * @return {string}\n */\n urlPage() {\n return this.urlPointer() + \"/_pages/\";\n }\n\n /**\n * @method urlPointer()\n * return the url pointer that references this view. This url pointer\n * should be able to be used by this.application.urlResolve() to return\n * this view object.\n * @return {string}\n */\n urlPointer() {\n if (this.parent) {\n return this.parent.urlPage() + this.id;\n } else {\n return this.application.urlPage() + this.id;\n }\n }\n\n updateIcon(obj) {\n // icon of page\n if (obj.settings.type == \"popup\") {\n obj.icon = \"clone\";\n } else {\n obj.icon = ABViewDefaults.icon;\n }\n return obj;\n }\n\n /**\n * @method clone()\n * clone the defintions of this ABViewPage object.\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @return {obj}\n * defs of the copied ABView\n */\n clone(lookUpIds, parent) {\n // initial new ids of pages and components\n if (lookUpIds == null) {\n // create a hash of { oldID : newID } of any sub Pages and Views.\n lookUpIds = {};\n\n let mapNewIdFn = (currView) => {\n if (!lookUpIds[currView.id])\n lookUpIds[currView.id] = this.AB.uuid();\n\n if (currView.pages) {\n currView.pages().forEach((p) => mapNewIdFn(p));\n }\n\n if (currView.views) {\n currView.views().forEach((v) => mapNewIdFn(v));\n }\n };\n\n // start map new ids\n mapNewIdFn(this);\n }\n\n // copy\n let result = super.clone(lookUpIds, parent);\n\n // page's name should not be duplicate\n result.name = null;\n\n return result;\n }\n\n /**\n * @method copy()\n * create a new copy of this ABViewPage object. The resulting ABView should\n * be identical in settings and all sub pages/views, but each new object\n * is a unique view (different ids).\n * @param {obj} lookUpIds\n * an { oldID : newID } lookup hash for converting ABView objects\n * and their setting pointers.\n * @param {ABView*} parent\n * Which ABView should be connected as the parent object of this\n * copy.\n * @return {Promise}\n * .resolved with the instance of the copied ABView\n */\n copy(lookUpIds, parent, options) {\n // initial new ids of pages and components\n if (lookUpIds == null) {\n // create a hash of { oldID : newID } of any sub Pages and Views.\n lookUpIds = {};\n\n let mapNewIdFn = (currView) => {\n if (!lookUpIds[currView.id])\n lookUpIds[currView.id] = this.AB.uuid();\n\n if (currView.pages) {\n currView.pages().forEach((p) => mapNewIdFn(p));\n }\n\n if (currView.views) {\n currView.views().forEach((v) => mapNewIdFn(v));\n }\n };\n\n // start map new ids\n mapNewIdFn(this);\n }\n\n // now continue with the default .copy()\n return super.copy(lookUpIds, parent, options);\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewPivotPropertyComponentDefaults = {\n dataviewID: null,\n removeMissed: 0,\n totalColumn: 0,\n separateLabel: 0,\n min: 0,\n max: 0,\n height: 0,\n};\n\nconst ABViewDefaults = {\n key: \"pivot\", // {string} unique key for this view\n icon: \"cube\", // {string} fa-[icon] reference for this view\n labelKey: \"Pivot\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewPivotCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewPivotPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // Convert to boolean\n this.settings.removeMissed = JSON.parse(\n this.settings.removeMissed ||\n ABViewPivotPropertyComponentDefaults.removeMissed\n );\n this.settings.totalColumn = JSON.parse(\n this.settings.totalColumn ||\n ABViewPivotPropertyComponentDefaults.totalColumn\n );\n this.settings.separateLabel = JSON.parse(\n this.settings.separateLabel ||\n ABViewPivotPropertyComponentDefaults.separateLabel\n );\n this.settings.min = JSON.parse(\n this.settings.min || ABViewPivotPropertyComponentDefaults.min\n );\n this.settings.max = JSON.parse(\n this.settings.max || ABViewPivotPropertyComponentDefaults.max\n );\n\n if (this.settings.structure && typeof this.settings.structure == \"string\")\n this.settings.structure = JSON.parse(this.settings.structure);\n\n // \"0\" -> 0\n this.settings.height = parseInt(\n this.settings.height || ABViewPivotPropertyComponentDefaults.height\n );\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n var obj = super.toObj();\n\n obj.views = [];\n obj.settings = obj.settings || {};\n\n if (this.settings.structure)\n obj.settings.structure = JSON.stringify(this.settings.structure);\n\n return obj;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewReportManagerPropertyComponentDefaults = {\n dataviewID: \"\",\n dataviewFields: {\n name: \"\", // id of a String field\n text: \"\", // id of a LongText field\n queries: \"\", // id of a json field\n },\n datacollectionIDs: [],\n editMode: 0,\n hideCommonTab: 0,\n hideDataTab: 0,\n hideViewTab: 0,\n};\n\nconst ABViewDefaults = {\n key: \"reportsManager\", // {string} unique key for this view\n icon: \"wpforms\", // {string} fa-[icon] reference for this view\n labelKey: \"Reports Manager\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewReportsManagerCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewReportManagerPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n const parsedSettings = {};\n\n Object.keys(ABViewReportManagerPropertyComponentDefaults).forEach(\n (key1) => {\n if (\n typeof ABViewReportManagerPropertyComponentDefaults[key1] ===\n \"object\" &&\n !Array.isArray(\n ABViewReportManagerPropertyComponentDefaults[key1]\n )\n ) {\n parsedSettings[key1] = {};\n\n Object.keys(\n ABViewReportManagerPropertyComponentDefaults[key1]\n ).forEach((key2) => {\n parsedSettings[key1][key2] =\n this.settings[key1]?.[key2] ??\n ABViewReportManagerPropertyComponentDefaults[key1][key2];\n });\n\n return;\n }\n\n parsedSettings[key1] =\n this.settings[key1] ??\n ABViewReportManagerPropertyComponentDefaults[key1];\n }\n );\n\n this.settings = parsedSettings;\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n var obj = super.toObj();\n\n obj.settings = obj.settings || {};\n\n return obj;\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewSchedulerPropertyComponentDefaults = {\n readonly: 0,\n dataviewID: \"\",\n dataviewFields: {\n name: \"\", // id of a String field\n start: \"\", // id of a DateTime field\n end: \"\", // id of a DateTime field\n allDay: \"\", // id of a Checkbox field\n repeat: \"\", // id of a String field\n calendar: \"\", // id of a String field\n color: \"\", // id of a String field\n sectionID: \"\", // id of a String field\n unitID: \"\", // id of a String field\n notes: \"\", // id of a LongText field\n originID: \"\", // id of a LongText field\n },\n calendarDataviewID: \"\",\n calendarDataviewFields: {\n title: \"\", // id of a String field\n color: \"\", // id of a String field\n active: \"\", // id of a Checkbox field\n },\n timeline: {\n day: 1,\n week: 1,\n month: 1,\n year: 1,\n agenda: 1,\n timeline: 1,\n units: 1,\n },\n timelineSectionList: \"\",\n unitList: \"\",\n export: {\n excel: 0,\n csv: 0,\n pdf: 0,\n },\n};\n\nconst ABViewDefaults = {\n key: \"scheduler\",\n // {string}\n // unique key for this view\n\n icon: \"calendar\",\n // {string}\n // fa-[icon] reference for this view\n\n labelKey: \"Scheduler\",\n // {string}\n // the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewSchedulerCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n\n this._object = null;\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewSchedulerPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n // NOTE: ABView auto translates/untranslates \"label\"\n // add in any additional fields here:\n this.unTranslate(this, this, [\"scheduler\"]);\n\n const obj = super.toObj();\n\n obj.views = [];\n\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings = this.settings || {};\n this.settings.dataviewFields = this.settings.dataviewFields || {};\n this.settings.calendarDataviewFields =\n this.settings.calendarDataviewFields || {};\n this.settings.timeline = this.settings.timeline || {};\n this.settings.export = this.settings.export || {};\n\n const parsedSettings = {};\n\n Object.keys(ABViewSchedulerPropertyComponentDefaults).forEach((key1) => {\n if (\n typeof ABViewSchedulerPropertyComponentDefaults[key1] === \"object\"\n ) {\n parsedSettings[key1] = {};\n\n Object.keys(ABViewSchedulerPropertyComponentDefaults[key1]).forEach(\n (key2) => {\n parsedSettings[key1][key2] =\n this.settings[key1][key2] ??\n ABViewSchedulerPropertyComponentDefaults[key1][key2];\n }\n );\n\n return;\n }\n\n parsedSettings[key1] =\n this.settings[key1] ??\n ABViewSchedulerPropertyComponentDefaults[key1];\n });\n\n this.settings = parsedSettings;\n\n // if this is being instantiated on a read from the Property UI,\n this.scheduler =\n values.scheduler || ABViewSchedulerPropertyComponentDefaults.scheduler;\n\n // NOTE: ABView auto translates/untranslates \"label\"\n // add in any additional fields here:\n this.translate(this, this, [\"scheduler\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\nconst ABViewContainer = require(\"../../platform/views/ABViewContainer\");\n\nconst ABViewTabPropertyComponentDefaults = {\n height: 0,\n minWidth: 0,\n stackTabs: 0, // use sidebar view instead of tabview\n darkTheme: 0, // set dark theme css or not\n sidebarWidth: 200, // width of sidebar menu when stacking tabs\n sidebarPos: \"left\", // the default position of sidebar\n iconOnTop: 0, // do you want to put the icon above the text label?\n hintID: null, // store the ID of a webix hint tutorial for this view\n};\n\nconst ABViewTabDefaults = {\n key: \"tab\", // {string} unique key for this view\n icon: \"window-maximize\", // {string} fa-[icon] reference for this view\n labelKey: \"Tab\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewTabCore extends ABViewWidget {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewTabDefaults);\n }\n\n static common() {\n return ABViewTabDefaults;\n }\n\n static defaultValues() {\n return ABViewTabPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.height = parseInt(this.settings.height);\n this.settings.minWidth = parseInt(this.settings.minWidth || 0);\n this.settings.stackTabs = parseInt(this.settings.stackTabs);\n this.settings.darkTheme = parseInt(this.settings.darkTheme);\n this.settings.sidebarWidth = parseInt(this.settings.sidebarWidth);\n // this.settings.sidebarPos = this.settings.sidebarPos;\n this.settings.iconOnTop = parseInt(this.settings.iconOnTop);\n }\n\n addTab(tabName, tabIcon) {\n return this.application\n .viewNew(\n {\n key: ABViewContainer.common().key,\n label: tabName,\n tabicon: tabIcon,\n },\n this.application,\n this\n )\n .save();\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n};\n","const ABViewWidget = require(\"../../platform/views/ABViewWidget\");\n\nconst ABViewTextPropertyComponentDefaults = {\n text: \"\",\n // {string}\n // A multilingual text template that is used to display a given set of\n // values.\n\n height: 0,\n // {integer}\n // The default height of this widget.\n\n dataviewID: null,\n // {uuid}\n // The {ABDataCollection.id} of the datacollection this ABViewText is\n // pulling data from.\n // In most usage situations this ABView is tied to the data in an\n // ABDataCollection. However, it is possible for an ABObject to be\n // directly assigned to the ABView, and that will be used instead.\n};\n\nconst ABViewDefaults = {\n key: \"text\",\n // {string}\n // unique key for this view\n\n icon: \"font\",\n // {string}\n // fa-[icon] reference for this view\n\n labelKey: \"Text\",\n // {string}\n // the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewTextCore extends ABViewWidget {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n\n this._object = null;\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABViewTextPropertyComponentDefaults;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABViewLabel instance\n * into the values needed for saving.\n *\n * @return {json}\n */\n toObj() {\n // NOTE: ABView auto translates/untranslates \"label\"\n // add in any additional fields here:\n this.unTranslate(this, this, [\"text\"]);\n\n var obj = super.toObj();\n obj.views = [];\n return obj;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings = this.settings || {};\n\n // convert from \"0\" => 0\n this.settings.height = parseInt(\n this.settings.height || ABViewTextPropertyComponentDefaults.height\n );\n\n // if this is being instantiated on a read from the Property UI,\n this.text = values.text || ABViewTextPropertyComponentDefaults.text;\n\n // NOTE: ABView auto translates/untranslates \"label\"\n // add in any additional fields here:\n this.translate(this, this, [\"text\"]);\n }\n\n /**\n * @method componentList\n * return the list of components available on this view to display in the editor.\n */\n componentList() {\n return [];\n }\n\n /**\n * @property datacollection\n * return ABDatacollection of this form\n *\n * @return {ABDatacollection}\n */\n get datacollection() {\n if (this.parent?.key == \"dataview\") {\n return this.AB.datacollectionByID(this.parent.settings.dataviewID);\n } else {\n return this.AB.datacollectionByID(this.settings.dataviewID);\n }\n }\n\n fieldKey(field) {\n let label = field.label || \"\";\n label = label.replace(/\\(/g, \"\\\\(\");\n label = label.replace(/\\)/g, \"\\\\)\");\n return label;\n }\n\n displayText(val, componentID) {\n var result = this.text;\n\n let clearTemplateValue = (result) => {\n return result.replace(/{(.*?)}/g, \"\");\n };\n\n var dv = this.datacollection;\n // if (!dv) return clearTemplateValue(result);\n\n var object = dv?.datasource ?? this._object;\n if (!object) return clearTemplateValue(result);\n\n const rowData = val || dv.getCursor() || {};\n\n object.fields().forEach((f) => {\n // add \\\\ in front of the regular expression special charactors\n // let label = f.label || \"\";\n // label = label.replace(/\\(/g, \"\\\\(\");\n // label = label.replace(/\\)/g, \"\\\\)\");\n let label = this.fieldKey(f);\n\n var template = new RegExp(\"{\" + label + \"}\", \"g\");\n\n // IDEA: I'd like to keep all the image url logic INSIDE the ABFieldImage\n // object. Is there some way we can simply call: f.imageTemplate(rowData)\n // and parse the results for the url to display here?\n\n var data = f.format(rowData);\n if (f.key == \"image\") {\n var fData = data;\n data = f.urlImage(fData);\n\n // Question: should we change f.urlImage() to return the defaultImageUrl\n // if fData is \"\" and .useDefaultImage = true?\n\n if (\n !fData &&\n f.settings.defaultImageUrl &&\n f.settings.useDefaultImage\n ) {\n data = f.urlImage(f.settings.defaultImageUrl);\n\n ////\n //// James: Revisit this and make sure we are handling things ok now.\n // result = result.replace(\n // \"img\",\n // 'img onload=\\'AD.comm.hub.publish(\"component.adjust\", {\"containerID\": \"' +\n // componentID +\n // \"\\\"});' \"\n // );\n // } else if (\n // fData != \"\" &&\n // result.indexOf(\"onload\") == -1 &&\n // componentID\n // ) {\n // result = result.replace(\n // \"img\",\n // 'img onload=\\'AD.comm.hub.publish(\"component.adjust\", {\"containerID\": \"' +\n // componentID +\n // \"\\\"});' \"\n // );\n } else {\n ////\n //// James: It looks like this routine assumes the this.text template will\n //// only have 1 tag in it. Is that necessarilly true?\n ////\n //// If NOT, then we need to rethink this next line:\n\n result = result.replace(\n \"img\",\n \"img onerror='this.parentNode.removeChild(this);' \"\n );\n }\n }\n\n result = result.replace(template, data);\n });\n\n // Support {uuid} tag in tempalte\n result = result.replace(/{PK}/g, rowData[object.PK()]);\n\n return result;\n }\n\n objectLoad(object) {\n this._object = object;\n }\n};\n","const ABView = require(\"../../platform/views/ABView\");\n\nconst ABViewDefaults = {\n key: \"viewwidget\", // {string} unique key for this view\n icon: \"circle-o-notch \", // {string} fa-[icon] reference for this view\n labelKey: \"ab.components.widget\", // {string} the multilingual label key for the class label\n};\n\nconst ABPropertyComponentDefaults = {\n columnSpan: 1,\n rowSpan: 1,\n};\n\nmodule.exports = class ABViewWidgetCore extends ABView {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n * @param {obj} defaultValues special sub class defined default values.\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues || ABViewDefaults);\n }\n\n static common() {\n return ABViewDefaults;\n }\n\n static defaultValues() {\n return ABPropertyComponentDefaults;\n }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // convert from \"0\" => 0\n this.settings.columnSpan = parseInt(\n this.settings.columnSpan || ABPropertyComponentDefaults.columnSpan\n );\n this.settings.rowSpan = parseInt(\n this.settings.rowSpan || ABPropertyComponentDefaults.rowSpan\n );\n }\n};\n","const _ = require(\"lodash\");\n\n// prettier-ignore\nconst ABApplicationCore = require(\"../core/ABApplicationCore.js\");\n\nconst ABViewPage = require(\"./views/ABViewPage\");\nconst ABViewManager = require(\"./ABViewManager\");\n\nmodule.exports = class ABClassApplication extends ABApplicationCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n // now listen for any updates to our managed objects\n this._handler_page_updated = (definition) => {\n // we want to keep the same pageID order:\n var newPages = [];\n this.pages().forEach((pg) => {\n if (pg.id === definition.id) {\n newPages.push(pg.refreshInstance(this));\n return;\n }\n newPages.push(pg);\n });\n\n this._pages = newPages;\n\n // var currPage = this._pages.find((p) => p.id === definition.id);\n // if (currPage) {\n // this._pages = this._pages.filter((p) => p.id != currPage.id);\n // this._pages.push(currPage.refreshInstance());\n // }\n };\n this._pages.forEach((p) => {\n p.on(\"definition.updated\", this._handler_page_updated);\n });\n }\n\n static applications(/*fn = () => true*/) {\n console.error(\n \"ABApplication.applicationForID(): Depreciated. Who is doing this?\"\n );\n return null;\n }\n static applicationForID(/*id*/) {\n var errDepreciated = new Error(\n \"ABApplication.applicationForID(): Depreciated. Who is doing this?\"\n );\n console.error(errDepreciated);\n return null;\n }\n\n static definitionForID(/*id*/) {\n var errDepreciated = new Error(\n \"ABApplication.definitionForID(): Depreciated. Who is doing this?\"\n );\n console.error(errDepreciated);\n return null;\n }\n\n areaKey() {\n return this.AB.kebabCase(`ab-${this.name}`);\n }\n\n /**\n * @method refreshInstance()\n * Used when a definition.updated message is detected on this ABApplication.\n * This method will return a new instance based upon the current definition\n * and properly resolve any handlers and pending network Requests.\n * @return {ABObject}\n */\n refreshInstance() {\n var newObj = this.AB.applicationByID(this.id);\n\n // remove my listeners\n this._pages.forEach((p) => {\n p.removeListener(\"definition.updated\", this._handler_page_updated);\n });\n\n return newObj;\n }\n\n ///\n /// Definition\n ///\n\n /**\n * @method _listInsert()\n * save the given entity into our desired list:\n * @param {varid} entity\n * @param {string} key\n * the key of the list we are managing\n * @return {Promise}\n */\n async _listInsert(entity, key) {\n var isIncluded = this[key].indexOf(entity.id) != -1;\n if (!isIncluded) {\n this[key].push(entity.id);\n await this.save();\n }\n }\n\n async _listRemove(entity, key) {\n var begLen = this[key].length;\n this[key] = this[key].filter((id) => {\n return id != entity.id;\n });\n // if there was a change then save this.\n if (begLen != this[key].length) {\n await this.save();\n }\n }\n\n /**\n * @method datacollectionInsert()\n * persist the current ABDataCollection in our list of .datacollectionIDs.\n * @param {ABDataCollection} dc\n * @return {Promise}\n */\n datacollectionInsert(dc) {\n return this._listInsert(dc, \"datacollectionIDs\");\n }\n\n /**\n * @method datacollectionRemove()\n * remove the given ABDataCollection from our list of .datacollectionIDs.\n * @param {ABDataCollection} dc\n * @return {Promise}\n */\n datacollectionRemove(dc) {\n return this._listRemove(dc, \"datacollectionIDs\");\n }\n\n /**\n * @method objectInsert()\n * persist the current ABObject in our list of .objectIDs.\n * @param {ABObject} object\n * @return {Promise}\n */\n objectInsert(object) {\n return this._listInsert(object, \"objectIDs\");\n }\n\n /**\n * @method objectRemove()\n * remove the current ABObject from our list of .objectIDs.\n * NOTE: this method persists the changes to the server.\n * @param {ABObject} object\n * @return {Promise}\n */\n objectRemove(object) {\n return this._listRemove(object, \"objectIDs\");\n }\n\n /**\n * @method processInsert()\n * persist the current ABProcess in our list of .processIDs.\n * @param {ABProcess} process\n * @return {Promise}\n */\n processInsert(process) {\n return this._listInsert(process, \"processIDs\");\n }\n\n /**\n * @method processRemove()\n * remove the current ABProcess from our list of .processIDs.\n * NOTE: this method persists the changes to the server.\n * @param {ABProcess} process\n * @return {Promise}\n */\n processRemove(process) {\n return this._listRemove(process, \"processIDs\");\n }\n\n /**\n * @method queryInsert()\n * persist the current ABObjectQuery in our list of .queryIDs.\n * @param {ABObjectQuery} query\n * @return {Promise}\n */\n queryInsert(query) {\n return this._listInsert(query, \"queryIDs\");\n }\n\n /**\n * @method queryRemove()\n * remove the current ABObjectQuery from our list of .queryIDs.\n * NOTE: this method persists the changes to the server.\n * @param {ABObjectQuery} query\n * @return {Promise}\n */\n queryRemove(query) {\n return this._listRemove(query, \"queryIDs\");\n }\n\n /**\n * @method exportIDs()\n * export any relevant .ids for the necessary operation of this application.\n * @param {array} ids\n * the array of ids to insert any relevant .ids into\n */\n exportIDs(ids) {\n // make sure we don't get into an infinite loop:\n if (ids.indexOf(this.id) > -1) return;\n\n ids.push(this.id);\n\n // start with Objects:\n this.objectsIncluded().forEach((o) => {\n o.exportIDs(ids);\n });\n\n // get all Hints\n this.hintsIncluded().forEach((h) => {\n h.exportIDs(ids);\n });\n\n // Queries\n this.queriesIncluded().forEach((q) => {\n q.exportIDs(ids);\n });\n\n // Datacollections\n // NOTE: currently the server doesn't make instances of DataCollections\n // so we manually parse the related info here:\n this.datacollectionIDs.forEach((dID) => {\n if (ids.indexOf(dID) > -1) return;\n\n var def = this.AB.definitionByID(dID);\n if (def) {\n ids.push(dID);\n if (def.settings.datasourceID) {\n var object = this.AB.objectByID(def.settings.datasourceID);\n if (object) {\n object.exportIDs(ids);\n }\n }\n }\n });\n\n // Processes\n this.processes().forEach((p) => {\n p.exportIDs(ids);\n });\n\n // Pages\n // NOTE: currently the server doesn't make instances of ABViews\n // so we manually parse the object data here:\n var parseView = (view) => {\n if (ids.indexOf(view.id) > -1) return;\n ids.push(view.id);\n (view.pageIDs || []).forEach((pid) => {\n var pdef = this.AB.definitionByID(pid);\n if (pdef) {\n parseView(pdef);\n }\n });\n\n (view.viewIDs || []).forEach((vid) => {\n var vdef = this.AB.definitionByID(vid);\n if (vdef) {\n parseView(vdef);\n }\n });\n };\n\n var pageIDs = this._pages.map((p) => p.id);\n (pageIDs || []).forEach((pid) => {\n var pdef = this.AB.definitionByID(pid);\n if (pdef) {\n parseView(pdef);\n }\n });\n\n // return only unique entries:\n ids = this.AB.uniq(ids);\n }\n\n /**\n * @method pageNew()\n * return a new instance of an ABViewPage\n * @param values\n * The initial settings for the page.\n * @return {ABViewPage}\n */\n pageNew(values) {\n return new ABViewPage(values, this);\n }\n\n /**\n * @method pageInsert()\n * Insert a new ABViewPage into this Application.\n * @param {ABViewPage} page\n * The instance of the page to save.\n * @return {Promise}\n */\n async pageInsert(page) {\n // var isIncluded = this.pageByID(page.id);\n var isIncluded = this._pages.filter((p) => p.id == page.id)[0];\n if (!isIncluded) {\n this._pages.push(page);\n // Save our own Info:\n return this.save();\n }\n }\n\n /**\n * @method pageRemove()\n * remove the current ABViewPage from our list of pages.\n * @param {ABViewPage} page\n * @return {Promise}\n */\n async pageRemove(page) {\n var origLen = this._pages.length;\n this._pages = this.pages(function (p) {\n return p.id != page.id;\n });\n\n if (this._pages.length < origLen) {\n return this.save();\n }\n\n // if we get here, then nothing changed so nothing to do.\n }\n\n save() {\n // if someone just changed the name of our ABApplication, reflect that\n // in our Def.Name\n if (this.name != this.label) {\n this.name = this.label;\n }\n return super.save();\n }\n\n viewAll(fn = () => true) {\n let vmViews = super.viewAll(fn);\n let pluginViews = this.AB.ClassManager.viewAll(fn);\n let allViews = [...vmViews, ...pluginViews];\n let L = this.AB.Label();\n\n // Sort by label from common() if available, otherwise by key\n return allViews.sort((a, b) => {\n const aCommon = a.common ? a.common() : {};\n const bCommon = b.common ? b.common() : {};\n const aLabel =\n aCommon.label || L(aCommon.labelKey || aCommon.key) || \"\";\n const bLabel =\n bCommon.label || L(bCommon.labelKey || bCommon.key) || \"\";\n return aLabel.localeCompare(bLabel);\n });\n }\n\n warningsEval() {\n super.warningsEval();\n\n //\n // check for valid object references:\n //\n var checks = {\n objectIDs: \"object\",\n queryIDs: \"query\",\n datacollectionIDs: \"datacollection\",\n };\n\n Object.keys(checks).forEach((k) => {\n this[k].forEach((id) => {\n var def = this.AB.definitionByID(id);\n if (!def) {\n this.warningsMessage(` is referencing a missing ${checks[k]}`, {\n appID: this.id,\n id,\n });\n }\n });\n });\n\n //\n // Make sure there is some way to access this Application:\n //\n if (this.roleAccess.length == 0 && !this.isAccessManaged) {\n this.warningsMessage(\" has no Role assigned, and is unaccessible.\");\n }\n\n // do our Role references exist?\n var allRoles = this.AB.Account.rolesAll().map((r) => r.id);\n this.roleAccess.forEach((r) => {\n if (allRoles.indexOf(r) == -1) {\n this.warningsMessage(\n `Specified Role Access [${r}] does not exist in this system`,\n { role: r }\n );\n }\n });\n\n // Make sure all our Pages perform a new warningsEval();\n this.pages().forEach((p) => {\n p.warningsEval();\n });\n }\n\n warningsAll() {\n var warnings = [].concat(this._warnings);\n [\n \"objectsIncluded\",\n \"queriesIncluded\",\n \"datacollectionsIncluded\",\n \"processes\",\n \"pages\",\n // \"views\", // <-- these are gathered in \"pages\"\n ].forEach((k) => {\n this[k]().forEach((o) => {\n warnings = warnings.concat(o.warningsAll());\n });\n });\n\n return warnings;\n }\n\n warningsMessage(msg, data = {}) {\n let message = `Application[${this.label}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n\n /**\n * @method mobileAppNew()\n *\n * return an instance of a new (unsaved) ABMobileApp that is tied to this\n * ABApplication.\n *\n * @return {ABMobileApp}\n */\n // mobileAppNew(values) {\n // return new ABMobileApp(values, this);\n // }\n};\n","const _ = require(\"lodash\");\n\n// prettier-ignore\nconst ABApplicationMobileCore = require(\"../core/ABApplicationMobileCore.js\");\n\nconst ABViewPageMobile = require(\"./mobile/ABMobilePage\");\nconst ABViewManager = require(\"./ABViewManager\");\n\nmodule.exports = class ABClassApplicationMobile extends (\n ABApplicationMobileCore\n) {\n constructor(attributes, AB) {\n super(attributes, AB);\n }\n\n ///\n /// Definition\n ///\n\n /**\n * @method pageNew()\n * return a new instance of an ABViewPageMobile\n * @param values\n * The initial settings for the page.\n * @return {ABViewPageMobile}\n */\n pageNew(values) {\n const newPage = new ABViewPageMobile(values, this);\n newPage.parent = this;\n return newPage;\n }\n\n async setPageDefault(page) {\n if (this.pageDefault != page.id) {\n let oldPage = this.pageByID(this.pageDefault, true);\n if (oldPage) {\n oldPage.defaultPage = 0;\n await oldPage.save();\n }\n\n this.pageDefault = page.id;\n await this.save();\n }\n }\n};\n","import ABUIPlugin from \"./plugins/ABUIPlugin.js\";\nimport ABPropertiesObjectPlugin from \"./plugins/ABPropertiesObjectPlugin\";\nimport ABObjectPlugin from \"./plugins/ABObjectPlugin.js\";\nimport ABModelPlugin from \"./plugins/ABModelPlugin.js\";\nimport ABViewPlugin from \"./plugins/ABViewPlugin.js\";\nimport ABViewComponentPlugin from \"./plugins/ABViewComponentPlugin.js\";\nimport ABViewPropertiesPlugin from \"./plugins/ABViewPropertiesPlugin.js\";\nimport ABViewEditorPlugin from \"./plugins/ABViewEditorPlugin.js\";\n\nconst classRegistry = {\n ObjectTypes: new Map(),\n ObjectPropertiesTypes: new Map(),\n FieldTypes: new Map(),\n ViewTypes: new Map(),\n ViewPropertiesTypes: new Map(),\n ViewEditorTypes: new Map(),\n};\n\nfunction registerViewPropertiesTypes(name, ctor) {\n classRegistry.ViewPropertiesTypes.set(name, ctor);\n}\n\nfunction registerViewEditorTypes(name, ctor) {\n classRegistry.ViewEditorTypes.set(name, ctor);\n}\n\nfunction registerObjectPropertiesTypes(name, ctor) {\n classRegistry.ObjectPropertiesTypes.set(name, ctor);\n}\n\nfunction registerObjectTypes(name, ctor) {\n classRegistry.ObjectTypes.set(name, ctor);\n}\n\nfunction registerViewTypes(name, ctor) {\n classRegistry.ViewTypes.set(name, ctor);\n}\n\n/**\n * @method getPluginAPI()\n * This is the data structure we provide to each of our plugins so they\n * can register their custom classes.\n * We provide base objects from which they can extend.\n * @returns {Object}\n */\nexport function getPluginAPI() {\n return {\n ABUIPlugin,\n ABPropertiesObjectPlugin,\n ABObjectPlugin,\n ABModelPlugin,\n ABViewPlugin,\n ABViewComponentPlugin,\n ABViewPropertiesPlugin,\n ABViewEditorPlugin,\n // ABFieldPlugin,\n // ABViewPlugin,\n };\n}\n\n// export function createField(type, config) {\n// const FieldClass = classRegistry.FieldTypes.get(type);\n// if (!FieldClass) throw new Error(`Unknown object type: ${type}`);\n// return new FieldClass(config);\n// }\nexport function createObject(key, config, AB) {\n const ObjectClass = classRegistry.ObjectTypes.get(key);\n if (!ObjectClass) throw new Error(`Unknown object type: ${key}`);\n return new ObjectClass(config, AB);\n}\n\nexport function createPropertiesObject(key, config, AB) {\n const ObjectClass = classRegistry.ObjectPropertiesTypes.get(key);\n if (!ObjectClass) throw new Error(`Unknown object type: ${key}`);\n return new ObjectClass(config, AB);\n}\n\nexport function allObjectProperties() {\n return Array.from(classRegistry.ObjectPropertiesTypes.values());\n}\n\n// export function createObjectProperty(key, config) {\n// const ObjectClass = classRegistry.ObjectPropertiesTypes.get(key);\n// if (!ObjectClass) throw new Error(`Unknown object type: ${key}`);\n// return new ObjectClass(config);\n// }\n\nexport function viewCreate(type, config, application, parent) {\n const ViewClass = classRegistry.ViewTypes.get(type);\n if (!ViewClass) throw new Error(`Unknown View type: ${type}`);\n return new ViewClass(config, application, parent);\n}\n\nexport function viewAll(fn = () => true) {\n return Array.from(classRegistry.ViewTypes.values()).filter(fn);\n}\n\nexport function viewPropertiesAll(fn = () => true) {\n return Array.from(classRegistry.ViewPropertiesTypes.values()).filter(fn);\n}\n\nexport function viewEditorCreate(key, view, base, ids) {\n const EditorClass = classRegistry.ViewEditorTypes.get(key);\n if (!EditorClass) throw new Error(`Unknown View Editor type: ${key}`);\n return new EditorClass(view, base, ids);\n}\n\nexport function viewEditorAll(fn = () => true) {\n return Array.from(classRegistry.ViewEditorTypes.values()).filter(fn);\n}\n\nexport function pluginRegister(pluginClass) {\n let type = pluginClass.getPluginType();\n switch (type) {\n case \"object\":\n registerObjectTypes(pluginClass.getPluginKey(), pluginClass);\n break;\n case \"properties-object\":\n registerObjectPropertiesTypes(pluginClass.getPluginKey(), pluginClass);\n break;\n // case \"field\":\n // break;\n case \"view\":\n registerViewTypes(pluginClass.getPluginKey(), pluginClass);\n break;\n case \"properties-view\":\n registerViewPropertiesTypes(pluginClass.getPluginKey(), pluginClass);\n break;\n case \"editor-view\":\n registerViewEditorTypes(pluginClass.getPluginKey(), pluginClass);\n break;\n default:\n throw new Error(\n `ABClassManager.pluginRegister():: Unknown plugin type: ${type}`\n );\n }\n}\n\n///\n/// For development\n///\n// import propertyNSAPI from \"../../../plugins/ab_plugin_object_netsuite_api/properties/ABPropertiesObjectNetsuiteAPI.js\";\n// import objectNSAPI from \"./plugins/developer/ABObjectNetsuiteAPI.js\";\n\nexport function registerLocalPlugins(API) {\n // let { registerObjectTypes, registerObjectPropertiesTypes } = API;\n // let cPropertyNSAPI = propertyNSAPI(API);\n // registerObjectPropertiesTypes(cPropertyNSAPI.getPluginKey(), cPropertyNSAPI);\n // let cObjectNSAPI = objectNSAPI(API);\n // registerObjectTypes(cObjectNSAPI.getPluginKey(), cObjectNSAPI);\n}\n\n// module.exports = {\n// getPluginAPI,\n// createPropertiesObject,\n// // createField,\n// // createObjectProperty,\n// // createView,\n// // classRegistry, // Expose the registry for testing or introspection\n// registerLocalPlugins,\n// };\n","const ABEmitter = require(\"./ABEmitter\");\n\nconst CustomComponentManager = require(\"../../webix_custom_components/customComponentManager\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABComponent extends ABEmitter {\n /**\n * @param {object} App ?what is this?\n * @param {string} idBase Identifier for this component\n * @param {import(\"../ABFactory\").default} AB ABFactory instance\n */\n constructor(App, idBase, AB) {\n super();\n\n this.AB = AB;\n // Transition Code:\n // make sure we have an this.AB\n if (!AB && App?.AB) {\n this.AB = App.AB;\n }\n\n if (!App) {\n if (this.AB._App) {\n App = this.AB._App;\n } else {\n App = {\n uuid: this.AB.Webix.uid(),\n\n /*\n * AB\n * the {ABFactory} for our interface.\n */\n AB: this.AB,\n\n /*\n * actions:\n * a hash of exposed application methods that are shared among our\n * components, so one component can invoke an action that updates\n * another component.\n */\n actions: {},\n\n /*\n * config\n * webix configuration settings for our current browser\n */\n config: this.AB.UISettings.config(),\n\n /*\n * custom\n * a collection of custom components for this App Instance.\n */\n custom: null,\n\n /*\n * Icons\n * this will provide you with the list of avaialbe font awesome 4.7.0 icons to use in interface building\n */\n icons: this.AB.UISettings.icons,\n\n Label: L,\n\n /*\n * labels\n * a collection of labels that are common for the Application.\n */\n labels: {\n add: L(\"Add\"),\n create: L(\"Create\"),\n delete: L(\"Delete\"),\n edit: L(\"Edit\"),\n export: L(\"Export\"),\n formName: L(\"Name\"),\n import: L(\"Import\"),\n rename: L(\"Rename\"),\n ok: L(\"Ok\"),\n\n cancel: L(\"Cancel\"),\n save: L(\"Save\"),\n\n yes: L(\"Yes\"),\n no: L(\"No\"),\n\n none: L(\"None\"),\n close: L(\"Close\"),\n\n default: L(\"Default\"),\n defaultPlaceholder: L(\"Enter default value\"),\n\n disable: L(\"Disable\"),\n\n required: L(\"Required\"),\n unique: L(\"Unique\"),\n\n invalidMessage: {\n required: L(\"This field is required\"),\n },\n\n createErrorMessage: L(\"System could not create {0}.\"),\n createSuccessMessage: L(\"{0} is created.\"),\n\n updateErrorMessage: L(\"System could not update {0}.\"),\n updateSucessMessage: L(\"{0} is updated.\"),\n\n deleteErrorMessage: L(\"System could not delete {0}.\"),\n deleteSuccessMessage: L(\"{0} is deleted.\"),\n\n renameErrorMessage: L(\"System could not rename {0}.\"),\n renameSuccessMessage: L(\"{0} is renamed.\"),\n\n // Data Field common Property labels:\n dataFieldHeaderLabel: L(\"Section Title\"),\n dataFieldHeaderLabelPlaceholder: L(\"Section Name\"),\n\n dataFieldLabel: L(\"Label\"),\n dataFieldLabelPlaceholder: L(\"Label\"),\n\n dataFieldColumnName: L(\"Field Name\"),\n dataFieldColumnNamePlaceholder: L(\"Database field name\"),\n\n dataFieldShowIcon: L(\"show icon?\"),\n\n componentDropZone: L(\"add widgets here\"),\n },\n\n /*\n * unique()\n * A function that returns a globally unique Key.\n * @param {string} key The key to modify and return.\n * @return {string}\n */\n unique: function (key) {\n return `${key}${this.uuid}`;\n },\n };\n this.AB._App = App;\n }\n }\n\n if (!App.custom) {\n if (!this.AB.custom) {\n var componentManager = new CustomComponentManager();\n componentManager.initComponents(App);\n } else {\n App.custom = this.AB.custom;\n }\n }\n\n this.App = App;\n\n this.idBase = idBase || \"?idbase?\";\n }\n\n actions(_actions) {\n console.error(\"!!! REFACTOR out .actions()\");\n if (_actions) {\n for (var a in _actions) {\n this.App.actions[a] = _actions[a];\n }\n }\n }\n\n Label() {\n return (...params) => {\n // console.error(\"!! App.label() depreciated.\");\n return this.AB.Multilingual.label(...params);\n };\n }\n\n unique(key) {\n return this.App.unique(`${this.idBase}_${key}`);\n }\n};\n","const ABObjectQuery = require(\"./ABObjectQuery\");\nconst ABDataCollectionCore = require(\"../core/ABDataCollectionCore\");\n\nmodule.exports = class ABDataCollection extends ABDataCollectionCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n this.setMaxListeners(0);\n this.blacklistLoadData = {};\n // { key : ?? }\n // keep track of previous loadData() calls that might not\n // have fully completed yet. We don't want to get in a\n // race condition where we keep trying to load the same frame\n // over and over again.\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABDataCollection with it's parent\n *\n *\n * @return {Promise}\n * .resolve( {this} )\n */\n async save() {\n if (!this.id) {\n this.label = this.label || this.name;\n }\n await super.save();\n this.AB.emit(\"ab.datacollection.update\", {\n datacollectionId: this.id,\n });\n return this;\n }\n\n isValid() {\n var validator = this.AB.Validation.validator();\n var L = this.AB.Label();\n\n // label/name must be unique:\n var isNameUnique =\n this.AB.datacollections((o) => {\n return (\n o.id != this.id &&\n o.name.toLowerCase() == this.name.toLowerCase()\n );\n }).length == 0;\n if (!isNameUnique) {\n validator.addError(\n \"name\",\n L('Name must be unique (\"{0}\" already in use)', [this.name])\n );\n }\n\n return validator;\n }\n\n ///\n /// Cursor\n ///\n\n /**\n * currentUserUsername\n * must return the proper value for the current user that would match a \"user\" field\n * in an object.\n * This is platform dependent, so must be implemented by a child object.\n * @return {string}\n */\n currentUserUsername() {\n return this.AB.Account.username();\n }\n\n ///\n /// Data\n ///\n\n init() {\n // prevent initialize many times\n if (this.initialized) return;\n // this.initialized = true; // <<---- DO NOT SET THIS HERE\n\n super.init();\n\n //// Now connect our platform hub to our Object Triggers:\n\n // events\n [\n \"ab.datacollection.create\",\n \"ab.datacollection.update\",\n \"ab.datacollection.stale\",\n \"ab.datacollection.delete\",\n ].forEach((key) => {\n this.AB.on(key, (data) => {\n this.emit(key, data);\n });\n });\n\n this.bindParentDc();\n }\n\n bindParentDc() {\n // if we pass the master datacollection and the field it is linked to\n // we want to bind it with that field as second param so dataFeed is\n // used on the slave datacollection\n let dataCollectionLink = this.datacollectionLink;\n let fieldLink = this.fieldLink;\n if (!this.settings.loadAll && dataCollectionLink && fieldLink) {\n let dc = this.__dataCollection;\n // the second param is the field id we bind the data to the master with\n dc.bind(dataCollectionLink.__dataCollection, fieldLink.id);\n // defining dataFeed allows us to query the database when the table is scrolled\n dc.define(\"dataFeed\", (value, params) => {\n let cursorUpdated = false;\n // check if the current cursor was updated\n if (dc.__prevLinkDcCursor != value) {\n cursorUpdated = true;\n }\n\n dc.__prevLinkDcCursor = this?.datacollectionLink?.getCursor()?.id;\n\n // NOTE: If no cursor of the parent DC, then show empty list\n if (\n this.datacollectionLink &&\n value == null &&\n dc.__prevLinkDcCursor == null\n ) {\n this.clearAll();\n }\n // this is the same item that was already bound...don't reload data\n else if (cursorUpdated) {\n // now that we have the modified wheres the dataCollections wheres\n // need to be modified for subsequent loads on scroll so lets set them\n // this.reloadWheres(wheres);\n\n // reload data\n this.reloadData(0, 20);\n }\n });\n }\n }\n\n loadData(start, limit = 20) {\n console.log(`loadData: ${start}, ${limit}`);\n return super.loadData(start, limit).catch((err) => {\n // hideProgressOfComponents() is a platform specific action.\n this.hideProgressOfComponents();\n this.emit(\"loadData\", {});\n\n // propagate the error here:\n if (err) {\n throw err;\n }\n });\n }\n\n /**\n * processIncomingData()\n * is called from loadData() once the data is returned. This method\n * allows the platform to make adjustments to the data based upon any\n * platform defined criteria.\n * @param {obj} data the data as it was returned from the Server\n * which should be in following format:\n * {\n * status: \"success\", // or \"error\"\n * data:[ {ABObjectData}, {ABObjectData}, ...]\n * }\n */\n processIncomingData(data) {\n // Web Platform:\n\n // data check:\n if (data.data && !Array.isArray(data.data)) {\n data.data = [data.data];\n }\n\n // standardize the heights\n\n /*\n // In v2: we move the row height calculation into the Interface designer.\n //\n\n // calculate default value of $height of rows\n let obj = this.datasource;\n let defaultHeight = 0;\n let minHeight = 0;\n let imageFields = obj.fields((f) => f.key == \"image\");\n let hiddenFields = obj.objectWorkspace.hiddenFields;\n imageFields.forEach(function (f) {\n if (hiddenFields.indexOf(f.columnName) == -1) {\n if (\n parseInt(f.settings.useHeight) == 1 &&\n parseInt(f.settings.imageHeight) > minHeight\n ) {\n minHeight = parseInt(f.settings.imageHeight) + 20;\n } else {\n minHeight = 100;\n }\n }\n });\n if (minHeight > 0) {\n defaultHeight = minHeight;\n }\n\n (data.data || []).forEach((d) => {\n // define $height of rows to render in webix elements\n if (\n d.properties != null &&\n d.properties.height != \"undefined\" &&\n parseInt(d.properties.height) > 0\n ) {\n d.$height = parseInt(d.properties.height);\n } else if (defaultHeight > 0) {\n d.$height = defaultHeight;\n }\n });\n */\n\n return super.processIncomingData(data).then(() => {\n // Web Platform:\n // when that is done:\n this.hideProgressOfComponents();\n });\n }\n\n ///\n /// Components\n ///\n\n /**\n * @method attachFlexlayout\n *\n *\n * @param {Object} component - a webix flexlayout element instance\n */\n attachFlexlayout(component) {\n var dc = this.__dataCollection;\n\n // prevent attach many times\n if (this.__flexComponentIds.indexOf(component.config.id) > -1) {\n return;\n } else {\n // keep component id to an array\n this.__flexComponentIds.push(component.config.id);\n }\n }\n\n /**\n * @method bind\n *\n *\n * @param {Object} component - a webix element instance\n */\n bind(component) {\n var dc = this.__dataCollection;\n\n // prevent bind many times\n // keep component id to an array\n if (this.__bindComponentIds.indexOf(component.config.id) === -1)\n this.__bindComponentIds.push(component.config.id);\n\n if ($$(component.config.id).data?.find?.({}).length > 0) return;\n\n if (\n component.config.view == \"datatable\" ||\n component.config.view == \"dataview\" ||\n component.config.view == \"treetable\" ||\n component.config.view == \"kanban\"\n ) {\n if (dc) {\n var items = dc.count();\n if (\n items == 0 &&\n (this._dataStatus == this.dataStatusFlag.notInitial ||\n this._dataStatus == this.dataStatusFlag.initializing) &&\n component.showProgress\n ) {\n component.showProgress({ type: \"icon\" });\n }\n\n component.define(\"datafetch\", 20);\n component.define(\"datathrottle\", 500);\n\n // initial data of treetable\n if (component.config.view == \"treetable\") {\n if (\n this.datasource &&\n this.datasource.isGroup &&\n this.__treeCollection\n ) {\n component.define(\"data\", this.__treeCollection);\n component.refresh();\n } else {\n // NOTE: tree data does not support dynamic loading when scrolling\n // https://forum.webix.com/discussion/3078/dynamic-loading-in-treetable\n component.define(\"data\", []);\n component.parse(dc.find({}));\n }\n } else {\n component.data.sync(dc);\n }\n\n // Implement .onDataRequest for paging loading\n if (!this.settings.loadAll) {\n component.___AD = component.___AD || {};\n // if (component.___AD.onDataRequestEvent) component.detachEvent(component.___AD.onDataRequestEvent);\n if (!component.___AD.onDataRequestEvent) {\n component.___AD.onDataRequestEvent = component.attachEvent(\n \"onDataRequest\",\n (start, count) => {\n if (component.showProgress)\n component.showProgress({ type: \"icon\" });\n\n // load more data to the data collection\n dc.loadNext(count, start);\n\n return false; // <-- prevent the default \"onDataRequest\"\n }\n );\n }\n\n // // NOTE : treetable should use .parse or TreeCollection\n // // https://forum.webix.com/discussion/1694/tree-and-treetable-using-data-from-datacollection\n // if (\n // component.config.view == \"treetable\" &&\n // !this.datasource.isGroup\n // ) {\n // component.___AD = component.___AD || {};\n // if (!component.___AD.onDcLoadData) {\n // component.___AD.onDcLoadData = () => {\n // component.parse(dc.find({}));\n // };\n\n // this.on(\"loadData\", component.___AD.onDcLoadData);\n // }\n // }\n }\n } else {\n component.data.unsync();\n }\n } else if (component.bind) {\n if (dc) {\n // Do I need to check if there is any data in the collection before binding?\n component.bind(dc);\n } else {\n component.unbind();\n }\n\n if (component.refresh) component.refresh();\n }\n }\n\n unbind(component) {\n if (!component) return;\n\n component.detachEvent(\"onDataRequest\");\n if (component.___AD) {\n if (component.___AD.onDataRequestEvent)\n delete component.___AD.onDataRequestEvent;\n\n if (component.___AD.onDcLoadData) {\n if (this.off) this.off(\"loadData\", component.___AD.onDcLoadData);\n delete component.___AD.onDcLoadData;\n }\n }\n\n if (component.data && component.data.unsync) {\n component.data.unsync();\n component.define(\"data\", []);\n }\n\n if (component.unbind) component.unbind();\n\n if (component.refresh) component.refresh();\n\n // remove from array\n this.__bindComponentIds = (this.__bindComponentIds || []).filter(\n (id) => id != component.config.id\n );\n }\n\n hideProgressOfComponents() {\n this.__bindComponentIds.forEach((comId) => {\n if ($$(comId) && $$(comId).hideProgress) $$(comId).hideProgress();\n });\n }\n\n /** Private methods */\n\n /**\n * @method _dataCollectionNew\n * Get webix.DataCollection\n *\n * @return {webix.DataCollection}\n *\n * @param {Array} data - initial data\n */\n _dataCollectionNew(data) {\n // get a webix data collection\n let dc = new webix.DataCollection({\n data: data || [],\n });\n\n this._extendCollection(dc);\n\n return dc;\n }\n\n /**\n * @method _treeCollectionNew\n * Get webix.TreeCollection\n *\n * @return {webix.TreeCollection}\n *\n */\n _treeCollectionNew() {\n // get a webix data collection\n let treeStore = new webix.TreeCollection();\n\n this._extendCollection(treeStore);\n\n return treeStore;\n }\n\n _extendCollection(dataStore) {\n // Apply this data collection to support multi-selection\n // https://docs.webix.com/api__refs__selectionmodel.html\n webix.extend(dataStore, webix.SelectionModel);\n\n dataStore.___AD = dataStore.___AD || {};\n\n // Implement .onDataRequest for paging loading\n if (!this.settings.loadAll) {\n if (!dataStore.___AD.onDataRequestEvent) {\n dataStore.___AD.onDataRequestEvent = dataStore.attachEvent(\n \"onDataRequest\",\n (start, count) => {\n if (start < 0) start = 0;\n\n // since the where clause can change if we are following\n // another cursor, include the where as part of the key:\n let [where] = this.getWhereClause(start, 0);\n let key = `${JSON.stringify(where)}-${start}-${count}`;\n if (this.blacklistLoadData[key]) {\n return false;\n }\n this.blacklistLoadData[key] = true;\n // load more data to the data collection\n this.loadData(start, count).finally(() => {\n // remove from blacklist\n delete this.blacklistLoadData[key];\n });\n\n return false; // <-- prevent the default \"onDataRequest\"\n }\n );\n }\n\n if (!dataStore.___AD.onAfterLoadEvent) {\n dataStore.___AD.onAfterLoadEvent = dataStore.attachEvent(\n \"onAfterLoad\",\n () => {\n this.emit(\"loadData\", {});\n }\n );\n }\n }\n\n // override unused functions of selection model\n dataStore.addCss = function () {};\n dataStore.removeCss = function () {};\n dataStore.render = function () {};\n\n if (!dataStore.___AD.onAfterLoad) {\n dataStore.___AD.onAfterLoad = dataStore.attachEvent(\n \"onAfterLoad\",\n () => {\n this.hideProgressOfComponents();\n }\n );\n }\n }\n\n parseTreeCollection(data = {}) {\n if (\n !(this.__datasource instanceof ABObjectQuery) ||\n !this.__datasource.isGroup ||\n !this.__treeCollection\n )\n return;\n\n let addRowToTree = (join = {}, parentAlias = null) => {\n let alias = join.alias;\n\n (data.data || []).forEach((row) => {\n let dataId = row[`${alias}.uuid`] || row[`${alias}.id`];\n if (!dataId) return;\n\n // find parent nodes\n let parentItemIds = [];\n let parentId =\n row[`${parentAlias}.uuid`] || row[`${parentAlias}.id`];\n if (parentId) {\n parentItemIds = this.__treeCollection\n .find(\n (item) =>\n item._alias == parentAlias && item._dataId == parentId\n )\n .map((item) => item.id);\n }\n\n // check exists\n let exists = this.__treeCollection.find((item) => {\n return (\n item._alias == alias &&\n item._dataId == dataId &&\n (parentItemIds.length == 0 ||\n parentItemIds.indexOf(item.$parent) > -1)\n );\n }, true);\n if (exists) return;\n\n let treeNode = {};\n treeNode._alias = alias;\n treeNode._dataId = dataId;\n treeNode._itemId = row.id; // Keep row id for set cursor to data collection\n\n Object.keys(row).forEach((propName) => {\n // Pull value from alias\n if (propName.indexOf(`${alias}.`) == 0) {\n treeNode[propName] = row[propName];\n }\n });\n\n if (row.translations) treeNode.translations = row.translations;\n\n // child nodes\n if (parentItemIds.length > 0)\n parentItemIds.forEach((parentItemId) => {\n this.__treeCollection.add(treeNode, null, parentItemId);\n });\n // root node\n else this.__treeCollection.add(treeNode, null);\n });\n\n // Sub-joins\n (join.links || []).forEach((link) => {\n addRowToTree(link, alias);\n });\n };\n\n // Show loading cursor\n (this.__bindComponentIds || []).forEach((comId) => {\n //// Webix Command here:\n let boundComp = $$(comId);\n if (boundComp && boundComp.showProgress)\n boundComp.showProgress({ type: \"icon\" });\n\n if (boundComp.data && boundComp.data.unsync) boundComp.data.unsync();\n });\n\n addRowToTree(this.__datasource.joins());\n\n // Hide loading cursor\n (this.__bindComponentIds || []).forEach((comId) => {\n let boundComp = $$(comId);\n if (boundComp && boundComp.hideProgress) boundComp.hideProgress();\n boundComp.define(\"data\", this.__treeCollection);\n });\n }\n\n warningsEval() {\n super.warningsEval();\n\n if (!this.datasource) {\n this.warningsMessage(`doesn't have a datasource.`);\n } else if (this.linkDatacollectionID) {\n const linkDC = this.AB.datacollectionById(this.linkDatacollectionID);\n\n if (!linkDC)\n this.warningsMessage(\n `can't resolve linkDatacollectionID[${this.linkDatacollectionID}]`\n );\n }\n }\n\n warningsMessage(msg, data = {}) {\n let message = `Datacollection[${this.label}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n\n get userScopes() {\n return this.AB.Account.scopes();\n }\n};\n","var ABDefinitionCore = require(\"../core/ABDefinitionCore\");\n\nmodule.exports = class ABDefinition extends ABDefinitionCore {\n // constructor(attributes, AB) {\n // super(attributes, AB);\n // }\n};\n","/**\n * ABEmitter\n *\n * This is the platform dependent implementation of an Emitter object.\n *\n */\n\nvar EventEmitter = require(\"events\").EventEmitter;\n\nmodule.exports = class ABEmitter extends EventEmitter {\n constructor() {\n super(/*{ maxListeners: 0 }*/);\n }\n};\n","const ABHintCore = require(\"../core/ABHintCore\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABHint extends ABHintCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n // listen\n // this.AB.on(\"ab.abprocess.update\", (data) => {\n // if (this.id == data.objectId) this.fromValues(data.data);\n // });\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABObject\n *\n * also remove it from our parent application\n *\n * @return {Promise}\n */\n destroy(App) {\n // debugger;\n // remove all my Elements\n var allSteps = this.steps();\n var allDestroy = [];\n allSteps.forEach((e) => {\n allDestroy.push(e.destroy());\n });\n // remove reference on App and View\n let hintIndex = App.hintIDs.indexOf(this.id);\n if (hintIndex > -1) {\n App.hintIDs.splice(hintIndex, 1);\n App.save();\n }\n\n let view = App.views((v) => {\n return v.id == this.settings.view;\n })[0];\n\n if (view) {\n delete view.settings.hintID;\n view.save();\n }\n\n return Promise.all(allDestroy).then(() => {\n // now remove myself\n return new Promise((resolve, reject) => {\n this.toDefinition()\n .destroy()\n .then(() => {\n webix.message({\n text: L(\"Tutorial Deleted\"),\n type: \"success\",\n expire: 3000,\n });\n resolve();\n })\n .catch((err) => {\n reject(err);\n });\n });\n });\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABObject with it's parent ABApplication\n *\n *\n * @return {Promise}\n * .resolve( {this} )\n */\n save() {\n return this.toDefinition()\n .save()\n .then((data) => {\n // if I didn't have an .id then this was a create()\n // and I need to update my data with the generated .id\n\n if (!this.id) {\n this.id = data.id;\n }\n return this;\n });\n }\n\n isValid() {\n // debugger;\n return true;\n // var validator = this.AB.Validation.validator();\n\n // // label/name must be unique:\n // var isNameUnique =\n // this.AB.processes((o) => {\n // return o.name.toLowerCase() == this.name.toLowerCase();\n // }).length == 0;\n // if (!isNameUnique) {\n // validator.addError(\n // \"name\",\n // L(`Process name must be unique (\"{0}\" already in use)`, [this.name])\n // );\n // }\n\n // return validator;\n }\n\n /**\n * @method warningsAll()\n * Return an array of mis configuration warnings for our object or any\n * of our sub elements.\n * @return {array} [ { message: \"warning message\", data:{} } ]\n */\n warningsAll() {\n // debugger;\n // report both OUR warnings, and any warnings from any of our fields\n // var allWarnings = [].concat(this._warnings);\n // this.elements().forEach((e) => {\n // e.warningsEval();\n // allWarnings = allWarnings.concat(e.warnings());\n // });\n // if (this.elements().length == 0) {\n // allWarnings.push({ message: \"No process Tasks defined.\", data: {} });\n // }\n // // perform a check of our xml document to see if we have any unknown\n // // shapes\n // if (!this._DOMParser) {\n // if (window.DOMParser) {\n // // Handy snippet from https://stackoverflow.com/questions/17604071/parse-xml-using-javascript\n // this._DOMParser = function (xmlStr) {\n // return new window.DOMParser().parseFromString(\n // xmlStr,\n // \"text/xml\"\n // );\n // };\n // } else if (\n // typeof window.ActiveXObject != \"undefined\" &&\n // new window.ActiveXObject(\"Microsoft.XMLDOM\")\n // ) {\n // this._DOMParser = function (xmlStr) {\n // var xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n // xmlDoc.async = \"false\";\n // xmlDoc.loadXML(xmlStr);\n // return xmlDoc;\n // };\n // } else {\n // throw new Error(\"No XML parser found\");\n // }\n // }\n // // find any references to our generic shapes\n // let xml = this._DOMParser(this.xmlDefinition);\n // const genericShapes = [\n // \"bpmn2:startEvent\",\n // \"bpmn2:task\",\n // \"bpmn2:endEvent\",\n // ];\n // genericShapes.forEach((s) => {\n // let allElements = xml.getElementsByTagName(s);\n // for (let x = 0; x < allElements.length; x++) {\n // // if we don't know about this shape\n // let ele = allElements[x];\n // let myEle = this.elementForDiagramID(allElements[x].id);\n // if (!myEle) {\n // this.unknownShape(allElements[x]);\n // }\n // }\n // });\n // // if any unknown shapes have been reported:\n // if (this._unknownShapes.length) {\n // allWarnings.push({\n // message: \"Generic Tasks still undefined.\",\n // data: {},\n // });\n // }\n //\n // return allWarnings;\n }\n\n createHintUI() {\n // if already loaded skip\n if ($$(this.id)) return;\n\n let steps = [];\n let next = 0;\n let display = webix.storage.cookie.get(this.id);\n if (display?.hide) return;\n let dontShow = ``;\n this.stepIDs.forEach((step) => {\n next++;\n let newStep = {};\n newStep.id = this._steps[step].id;\n newStep.el = this._steps[step].settings.el;\n newStep.event = this._steps[step].settings.event;\n newStep.title = this._steps[step].name;\n newStep.text = this._steps[step].text + dontShow;\n if (this.stepIDs[next]) {\n newStep.nextEl = this._steps[this.stepIDs[next]].settings.el;\n if (newStep.nextEl) {\n newStep.hintId = this.id;\n newStep.eventEl = \"button\"; // added this so we do not trigger a second advance on the hint when triggering the click below\n newStep.next = function (event) {\n let nextEl = this.nextEl;\n let theNextEl = document.querySelector(nextEl);\n if (theNextEl && theNextEl.checkVisibility()) {\n return false;\n } else {\n document.querySelector(this.el).click();\n return false;\n }\n };\n }\n }\n if (newStep.el) steps.push(newStep);\n });\n\n let ui = {\n view: \"hint\",\n id: this.id,\n steps: steps,\n on: {\n onNext: (step) => {\n setTimeout(() => {\n const boxes = document.querySelectorAll(\n \"input[data-hint-id='\" + this.id + \"']\"\n );\n let display = webix.storage.cookie.get(this.id);\n boxes.forEach((b) => {\n b.checked = display?.hide || false;\n });\n }, 100);\n },\n onPrevious: (step) => {\n setTimeout(() => {\n const boxes = document.querySelectorAll(\n \"input[data-hint-id='\" + this.id + \"']\"\n );\n let display = webix.storage.cookie.get(this.id);\n boxes.forEach((b) => {\n b.checked = display?.hide || false;\n });\n }, 100);\n },\n },\n };\n\n webix.delay(\n () => {\n try {\n webix.ui(ui).start();\n } catch (err) {\n this.AB.notify.developer(err, {\n context:\n \"ABHint.createUIHint() error calling webix.ui(ui).start()\",\n ui,\n });\n }\n },\n null,\n null,\n 2000\n );\n\n // $$(this.id);\n }\n};\n","const ABIndexCore = require(\"../core/ABIndexCore\");\n\nmodule.exports = class ABIndex extends ABIndexCore {\n // constructor(attributes, object) {\n // super(attributes, object);\n // }\n\n /**\n * @method save()\n * persist this instance of ABIndex with it's parent ABObject\n * @return {Promise}\n */\n save() {\n return super\n .save()\n .then(() => this.object.indexSave(this))\n .then(() => this.migrateCreate());\n }\n\n /**\n * @method destroy()\n * destroy the current instance of ABIndex\n * also remove it from our parent ABObject\n * @return {Promise}\n */\n destroy() {\n return new Promise((resolve, reject) => {\n if (this.id) {\n this.migrateDrop()\n .then(() => {\n return super.destroy();\n })\n .then(() => this.object.indexRemove(this))\n .then(resolve)\n .catch(reject);\n } else {\n resolve();\n }\n });\n }\n\n warningsEval() {\n super.warningsEval();\n\n (this._unknownFieldIDs || []).forEach((id) => {\n this.warningsMessage(`is referencing an unknown field id[${id}]`);\n });\n\n if (this.fields.length == 0) {\n this.warningsMessage(`is not referencing any fields`);\n }\n }\n\n /**\n * @method warningsMessage()\n * generate a commonly formatted warning message for this ABField.\n * This is expected to be called from within a .warningsEval()\n * method when generating warnings.\n * @param {string} msg\n * the warning string to display\n * @param {json} data\n * any relevant additional information for a developer to refer to.\n */\n warningsMessage(msg, data = {}) {\n let message = `Index[${this.label}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n\n ///\n /// DB Migrations\n ///\n\n migrateCreate() {\n return this.AB.Network.post({\n url: `/definition/migrate/object/${this.object.id}/index/${this.id}`,\n // data: this.toObj(),\n });\n }\n\n migrateDrop() {\n return this.AB.Network[\"delete\"]({\n url: `/definition/migrate/object/${this.object.id}/index/${this.id}`,\n });\n }\n};\n","/**\n * ABMLClass\n * manage the multilingual information of an instance of a AB Defined Class.\n *\n * these classes have certain fields (\"label\", \"description\"), that can be\n * represented in different language options as defined by our platform.\n *\n * This platform ABMLClass will define 2 methods that allow for the translation\n * untranslation of this data.\n */\nvar ABMLClassCore = require(\"../core/ABMLClassCore\");\n\nmodule.exports = class ABMLClass extends ABMLClassCore {\n constructor(fieldList, AB) {\n super(fieldList, AB);\n\n this._warnings = [];\n // {array}\n // an array of warning messages for this object.\n // each warning entry should be in the format:\n // WarningMessage: {\n // message: {string} \"message to display\"\n // data: {json} additional debugging information\n // }\n }\n\n // fromValues(attributes) {\n // super.fromValues(attributes);\n // }\n\n /**\n * @method warnings()\n * returns the stored warnings for this ONE object.\n * @return {array} WarningMessage\n */\n warnings() {\n return this._warnings;\n }\n\n /**\n * @method warningsEval()\n * This method causes an object to re-evaluate it's settings to see if there\n * are any potential errors.\n */\n warningsEval() {\n this._warnings = [];\n }\n\n /**\n * @method warningsAll()\n * returns all relevant warnings for the current Object. This includes any\n * sub fields, links, views, etc...\n * @return {array} warning structures\n * [ {WarningMessage}, ... ]\n */\n warningsAll() {\n return this.warnings();\n }\n\n /**\n * @method languageDefault\n * return a default language code.\n * @return {string}\n */\n languageDefault() {\n return this.AB.Account.language() || \"en\";\n }\n\n /**\n * @method destroy()\n * remove this definition.\n * @return {Promise}\n */\n async destroy() {\n var def = this.toDefinition();\n if (def.id) {\n return def.destroy().catch((err) => {\n if (err.toString().indexOf(\"No record found\") > -1) {\n // this is weird, but not breaking:\n console.log(\n `ABMLClass.destroy(): could not find record for id[${def.id}]`\n );\n console.log(def);\n return;\n }\n throw err;\n });\n }\n return Promise.resolve();\n }\n\n /**\n * @method save()\n * persist this definition of our {ABxxx} Object\n * @return {Promise}\n */\n async save() {\n var def = this.toDefinition();\n // if not name, try to use our label as the name\n def.name = def.name || this.name || this.label || \"name\";\n var data = await def.save();\n if (!this.id) {\n this.id = data.id;\n }\n }\n};\n","const ABModelCore = require(\"../core/ABModelCore\");\n\n//\n// ABModel\n//\n// Represents the Data interface for an ABObject data.\n//\n// 2 ways to use an ABModel to load a DataTable:\n// \tMethod 1:\n// \tgather all the data externally and send to the DataTable\n//\t\tModel.findAll()\n//\t\t.then((data)=>{\n//\t\t\tDataTable.parse(data);\n//\t\t})\n//\n// \tMethod 2:\n// \tSet the Model object with a condition / skip / limit, then\n// \tuse it to load the DataTable:\n//\t\tModel.where({})\n//\t\t.skip(XX)\n//\t\t.limit(XX)\n//\t\t.loadInto(DataTable);\n\nfunction errorPopup(error) {\n // Show the pop up\n if (error && error.data && error.data.error == \"READONLY\") {\n webix.alert({\n title: \"Your action is blocked\",\n ok: \"Ok\",\n text: error.data.message || \"\",\n type: \"alert-warning\",\n });\n }\n}\n\n/*\n * @function no_socket_trigger()\n * a common routine to trigger an update.\n * In the case where our AB.Network.type() isn't a socket implementation\n * we need to manually trigger the expected socket events ourselves.\n * This fn() attempts to simulate the socket responses in such a case.\n * @param {ABModel} model\n * The ABModel currently processing the network transaction.\n * @param {string} key\n * The socket update trigger we are simulating.\n * @param {json} data\n * The relevant response from our network transaction.\n */\nfunction no_socket_trigger(model, key, data) {\n // If we do not have socket updates available, then trigger an\n // update event with this data.\n if (model.AB.Network.type() != \"socket\") {\n model.AB.emit(key, {\n objectId: model.object.id,\n data,\n });\n }\n}\n\nmodule.exports = class ABModel extends ABModelCore {\n constructor(object) {\n super(object);\n\n this.handler_create = (...params) => {\n this.handler_common(\"ab.datacollection.create\", ...params);\n };\n\n this.handler_delete = (...params) => {\n this.handler_common(\"ab.datacollection.delete\", ...params);\n };\n\n this.handler_findAll = (...params) => {\n this.handler_common(null, ...params);\n };\n\n this.handler_logs = (context, err, data) => {\n if (err) {\n context.reject?.(err);\n return;\n }\n context.resolve?.(data);\n };\n\n this.handler_update = (...params) => {\n this.handler_common(\"ab.datacollection.update\", ...params);\n };\n\n this.handler_common = (key, context, err, data) => {\n // key: {string} the relevant socket event key\n // can be null if not relevant.\n // context : {obj} any provided context data provided on the\n // this.AB.Network.get() call.\n // err: {Error} any returned error message from api\n // data: {obj} returned data from the model-get api in format:\n // {data: [], total_count: 1, pos: 0, offset: 0, limit: 0}\n if (err) {\n context.reject?.(err);\n return;\n }\n\n if (this.isCsvPacked(data)) {\n let lengthPacked = JSON.stringify(data).length;\n data = this.csvUnpack(data);\n\n // JOHNNY: getting \"RangeError: Invalid string length\"\n // when data.data is too large. So we are just going\n // to .stringify() the rows individually and count the\n // length of each one.\n\n let lengthUnpacked = 0;\n if (Array.isArray(data.data)) {\n for (var d = 0; d < data.data.length; d++) {\n lengthUnpacked += JSON.stringify(data.data[d]).length;\n }\n } else {\n lengthUnpacked += JSON.stringify(data.data).length;\n }\n\n Object.keys(data)\n .filter((k) => k != \"data\")\n .map((k) => {\n lengthUnpacked += `${k}:${data[k]},`.length;\n });\n\n lengthUnpacked += 5; // for the brackets\n\n console.log(\n `CSV Pack: ${lengthUnpacked} -> ${lengthPacked} (${(\n (lengthPacked / lengthUnpacked) *\n 100\n ).toFixed(2)}%)`\n );\n }\n\n // let jobID = this.AB.jobID();\n // console.log(`${jobID} : normalization begin`);\n // let timeFrom = performance.now();\n if (key) {\n // on \"update\" & \"create\" we want to normalizeData()\n if (key.indexOf(\"delete\") == -1) {\n // on anything with a key, we shouldn't have data.data\n data = data.data || data;\n\n this.normalizeData(data);\n } else {\n // triggers to ab.datacollection.delete need to send the .id\n // of the item deleted:\n data = data.data || context.id;\n }\n } else {\n // on a findAll we normalize data.data\n this.normalizeData(data.data);\n }\n // let timeTo = performance.now();\n // console.log(`${jobID} : normalization end: ${timeTo - timeFrom}ms`);\n\n context.resolve?.(data);\n\n // if (key) {\n // no_socket_trigger(this, key, data);\n // }\n };\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n ///\n /// Instance Methods\n ///\n\n request(method, params) {\n return this.AB.Network[method](params);\n }\n\n /**\n * @method batchCreate\n * update model values on the server.\n */\n batchCreate(values) {\n values.batch.map((vals) => {\n return this.prepareMultilingualData(vals.data);\n });\n\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, (context, err, data) => {\n if (err) {\n reject(err);\n return;\n }\n this.normalizeData(data);\n resolve(data);\n // FIX: now with sockets, the triggers are fired from socket updates.\n // trigger a create event\n // triggerEvent('create', this.object, data);\n });\n\n this.AB.Network.post(\n {\n url: this.object.urlRestBatch(),\n params: values,\n },\n {\n key: jobID,\n context: {},\n }\n )\n // .then((data) => {\n // this.normalizeData(data);\n\n // resolve(data);\n\n // // FIX: now with sockets, the triggers are fired from socket updates.\n // // trigger a create event\n // // triggerEvent('create', this.object, data);\n // })\n .catch(reject);\n });\n }\n\n /**\n * @method create\n * update model values on the server.\n */\n create(values) {\n this.prepareMultilingualData(values);\n\n // add default values record if no value is passed for column\n this.object.fields().forEach((f) => {\n if (values[f.columnName] === undefined) {\n f.defaultValue(values);\n }\n });\n\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, this.handler_create);\n this.AB.Network.post(\n {\n url: this.object.urlRest(),\n params: values,\n },\n {\n key: jobID,\n context: { resolve, reject },\n }\n )\n .then((newVal) => {})\n .catch((err) => {\n errorPopup(err);\n reject(err);\n });\n }).then((newVal) => {\n no_socket_trigger(this, \"ab.datacollection.create\", newVal);\n return newVal;\n });\n }\n\n /**\n * @method delete\n * remove this model instance from the server\n * @param {integer|UUID} id the .id of the instance to remove.\n * @return {Promise}\n */\n delete(id) {\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, this.handler_delete);\n this.AB.Network[\"delete\"](\n {\n url: this.object.urlRestItem(id),\n },\n {\n key: jobID,\n id,\n context: { resolve, reject },\n }\n ).catch((err) => {\n errorPopup(err);\n reject(err);\n });\n }).then((res) => {\n // properly issue the delete\n no_socket_trigger(this, \"ab.datacollection.delete\", id);\n return res;\n });\n }\n\n /**\n * @method findAll\n * performs a data find with the provided condition.\n */\n async findAll(cond) {\n cond = cond || {};\n\n // scan the rules and convert any is_current_date rules to UTC daytime range.\n let rules = cond.where?.rules;\n while (rules?.length) {\n let nestedRules = [];\n rules.forEach((rule) => {\n if (rule.rule === \"is_current_date\")\n rule.value = this.AB.rules.getUTCDayTimeRange();\n else if (rule.rules?.length)\n nestedRules = nestedRules.concat(rule.rules);\n });\n\n rules = nestedRules;\n }\n\n // \t\t// prepare our condition:\n // \t\tvar newCond = {};\n\n // \t\t// if the provided cond looks like our { where:{}, skip:xx, limit:xx } format,\n // \t\t// just use this one.\n // \t\tif (cond.where) {\n // \t\t\tnewCond = cond;\n // \t\t} else {\n\n // \t\t\t// else, assume the provided condition is the .where clause.\n // \t\t\tnewCond.where = cond;\n // \t\t}\n\n // /// if this is our depreciated format:\n // if (newCond.where.where) {\n // \tOP.Error.log('Depreciated Embedded .where condition.');\n // }\n\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, this.handler_findAll);\n this.AB.Network.get(\n {\n url: this.object.urlRest(),\n params: cond,\n // params: newCond\n },\n {\n key: jobID,\n context: { resolve, reject },\n }\n )\n // .then((data) => {\n // this.normalizeData(data.data);\n\n // resolve(data);\n // })\n .catch((err) => {\n if (err && err.code) {\n switch (err.code) {\n case \"ER_PARSE_ERROR\":\n this.AB.notify.developer(err, {\n message:\n \"AppBuilder:ABModel:findAll(): Parse Error with provided condition\",\n condition: cond,\n });\n break;\n\n default:\n this.AB.notify.developer(err, {\n message:\n \"AppBuilder:ABModel:findAll(): Unknown Error with provided condition\",\n condition: cond,\n });\n break;\n }\n }\n reject(err);\n });\n });\n }\n\n /**\n * @method loadInto\n * loads the current values into the provided Webix DataTable\n * @param {DataTable} DT A Webix component that can dynamically load data.\n */\n loadInto(DT) {\n // if a limit was applied, then this component should be loading dynamically\n if (this._limit) {\n DT.define(\"datafetch\", this._limit);\n DT.define(\"datathrottle\", 250); // 250ms???\n\n // catch the event where data is requested:\n // here we will do our own findAll() so we can persist\n // the provided .where condition.\n\n // oh yeah, and make sure to remove any existing event handler when we\n // perform a new .loadInto()\n DT.___AD = DT.___AD || {};\n if (DT.___AD.onDataRequestEvent) {\n DT.detachEvent(DT.___AD.onDataRequestEvent);\n }\n DT.___AD.onDataRequestEvent = DT.attachEvent(\n \"onDataRequest\",\n (start, count) => {\n var cond = {\n where: this._where,\n sort: this._sort,\n limit: count,\n skip: start,\n };\n\n if (DT.showProgress) DT.showProgress({ type: \"icon\" });\n\n this.findAll(cond).then((data) => {\n /*\n // In V2: we move the row height processing into \n // the interface designer \n\n data.data.forEach((item) => {\n if (\n item.properties != null &&\n item.properties.height != \"undefined\" &&\n parseInt(item.properties.height) > 0\n ) {\n item.$height = parseInt(item.properties.height);\n } else if (parseInt(this._where.height) > 0) {\n item.$height = parseInt(this._where.height);\n }\n });\n */\n DT.parse(data);\n\n if (DT.hideProgress) DT.hideProgress();\n });\n\n return false; // <-- prevent the default \"onDataRequest\"\n }\n );\n\n DT.refresh();\n }\n\n // else just load it all at once:\n var cond = {};\n if (this._where) cond.where = this._where;\n if (this._sort) cond.sort = this._sort;\n if (this._limit != null) cond.limit = this._limit;\n if (this._skip != null) cond.skip = this._skip;\n\n if (DT.showProgress) DT.showProgress({ type: \"icon\" });\n\n this.findAll(cond)\n .then((data) => {\n // v2: we no longer process item $height\n /*\n data.data.forEach((item) => {\n if (\n item.properties != null &&\n item.properties.height != \"undefined\" &&\n parseInt(item.properties.height) > 0\n ) {\n item.$height = parseInt(item.properties.height);\n } else if (parseInt(this._where.height) > 0) {\n item.$height = parseInt(this._where.height);\n }\n });\n */\n\n DT.parse(data);\n\n if (DT.hideProgress) DT.hideProgress();\n })\n .catch((err) => {\n console.error(\"!!!!!\", err);\n });\n }\n\n /**\n * @method logs()\n * return the log history related to this model's ABObject.\n * @param {hash} options\n * a key=>value hash of optional search criteria\n * .rowId {string} the uuid of the individual entry we are querying\n * .levelName {string} the type of entry [\"insert\", \"update\", \"delete\"]\n * .username {string} the entries associated with the given user\n * .startDate {date} entries that happened ON or AFTER this date\n * .endDate {date} entries that happened ON or BEFORE this date\n * .start {integer} paging control: how many entries to skip\n * .limit {integer} paging control: only return this # entries\n * @return {Promise}\n */\n logs(options) {\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, this.handler_logs);\n this.AB.Network.get(\n {\n url: this.object.urlRestLog(),\n params: options,\n // params: newCond\n },\n {\n key: jobID,\n context: { resolve, reject },\n }\n ).catch((err) => {\n if (err && err.code) {\n this.AB.notify.developer(err, {\n context: \"AppBuilder:ABModel:logs(): Error\",\n options,\n });\n }\n reject(err);\n });\n });\n }\n\n /**\n * @method limit\n * set the limit value for this set of data\n * @param {integer} limit the number or elements to return in this call\n * @return {ABModel} this object that is chainable.\n */\n limit(limit) {\n this._limit = limit;\n return this;\n }\n\n /**\n * @method skip\n * set the skip value for this set of data\n * @param {integer} skip the number or elements to skip\n * @return {ABModel} this object that is chainable.\n */\n skip(skip) {\n this._skip = skip;\n return this;\n }\n\n /**\n * @method update\n * update model values on the server.\n */\n update(id, values) {\n this.prepareMultilingualData(values);\n\n // remove empty properties\n for (var key in values) {\n if (values[key] == null) delete values[key];\n }\n\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, this.handler_update);\n this.AB.Network.put(\n {\n url: this.object.urlRestItem(id),\n params: values,\n },\n { key: jobID, context: { resolve, reject } }\n )\n // .then((data) => {\n // this.normalizeData(data);\n\n // resolve(data);\n\n // // If we do not have socket updates available, then trigger an\n // // update event with this data.\n // if (this.AB.Network.type() != \"socket\") {\n // this.AB.emit(\"ab.datacollection.update\", {\n // objectId: this.object.id,\n // data,\n // });\n // }\n // })\n .catch((err) => {\n errorPopup(err);\n reject(err);\n });\n }).then((newVal) => {\n // properly issue the update\n no_socket_trigger(this, \"ab.datacollection.update\", newVal);\n return newVal;\n });\n }\n\n /**\n * @method batchUpdate\n * update value to many rows on the server.\n */\n batchUpdate({ rowIds, values }) {\n return new Promise((resolve, reject) => {\n var jobID = this.AB.jobID();\n this.AB.Network.once(jobID, (context, err /*, data */) => {\n if (err) {\n reject(err);\n return;\n }\n // this.normalizeData(data);\n resolve(true);\n // what about checking for socket updates?\n });\n this.AB.Network.put(\n {\n url: this.object.urlRestBatch(),\n params: {\n rowIds,\n values,\n },\n },\n { key: jobID, context: {} }\n )\n // .then(() => {\n // resolve(true);\n // })\n .catch(reject);\n });\n }\n};\n","//\n// ABModelAPI\n//\n// Represents the Data interface for an ABObjectQuery data.\n\nconst ABModel = require(\"./ABModel\");\n\nmodule.exports = class ABModelAPI extends ABModel {\n ///\n /// Instance Methods\n ///\n\n /**\n * @method findAll\n * performs a data find with the provided condition.\n */\n async findAll(cond = {}) {\n cond.isAPI = true;\n cond.url = this.object?.request?.url;\n\n return super.findAll(cond);\n }\n\n /**\n * @method batchCreate\n * update model values on the server.\n */\n batchCreate(values) {\n const error = new Error(\n \"ABObjectApi.ABModelAPI.batchCreate() does not be implemented.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method create\n * update model values on the server.\n */\n async create(values) {\n const error = new Error(\n \"ABObjectApi.ABModelAPI.create() does not be implemented.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method delete\n * remove this model instance from the server\n * @param {integer|UUID} id the .id of the instance to remove.\n * @return {Promise}\n */\n delete(id) {\n const error = new Error(\n \"ABObjectApi.ABModelAPI.delete() does not be implemented.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method update\n * update model values on the server.\n */\n update(id, values) {\n const error = new Error(\n \"ABObjectApi.ABModelAPI.update() does not be implemented.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method batchUpdate\n * update value to many rows on the server.\n */\n batchUpdate({ rowIds, values }) {\n const error = new Error(\n \"ABObjectApi.ABModelAPI.batchUpdate() does not be implemented.\"\n );\n return Promise.reject(error);\n }\n};\n","//\n// ABModelAPINetsuite\n//\n// Represents the Data interface for a connection to Netsuite.\n\nconst ABModel = require(\"./ABModel\");\n\nmodule.exports = class ABModelAPINetsuite extends ABModel {\n ///\n /// Instance Methods\n ///\n\n /**\n * @method normalizeData()\n * For a Netsuite object, there are additional steps we need to handle\n * to normalize our data.\n */\n normalizeData(data) {\n super.normalizeData(data);\n\n if (!Array.isArray(data)) {\n data = [data];\n }\n\n var boolFields = this.object.fields((f) => f.key == \"boolean\");\n let allFields = this.object.fields();\n\n data.forEach((d) => {\n // Netsuite sometimes keeps keys all lowercase\n // which might not match up with what it told us in the meta-catalog\n // which we need:\n for (var i = 0; i < allFields.length; i++) {\n let actualColumn = allFields[i].columnName;\n let lcColumn = actualColumn.toLowerCase();\n\n if (\n typeof d[actualColumn] == \"undefined\" &&\n typeof d[lcColumn] != \"undefined\"\n ) {\n d[actualColumn] = d[lcColumn];\n delete d[lcColumn];\n }\n }\n\n // Netsuite Booleans are \"T\" or \"F\"\n boolFields.forEach((bField) => {\n let val = d[bField.columnName];\n // just how many ways can a DB indicate True/False?\n if (typeof val == \"string\") {\n val = val.toLowerCase();\n\n if (val === \"t\") val = true;\n else val = false;\n\n d[bField.columnName] = val;\n }\n });\n });\n }\n};\n","//\n// ABModelQuery\n//\n// Represents the Data interface for an ABObjectQuery data.\n\nconst ABModel = require(\"./ABModel\");\n\nmodule.exports = class ABModelQuery extends ABModel {\n ///\n /// Instance Methods\n ///\n\n /**\n * @method batchCreate\n * update model values on the server.\n */\n batchCreate(values) {\n var error = new Error(\n \"ABObjectQuery.ABModelQuery.batchCreate() should not be called.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method create\n * update model values on the server.\n */\n create(values) {\n var error = new Error(\n \"ABObjectQuery.ABModelQuery.create() should not be called.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method delete\n * remove this model instance from the server\n * @param {integer|UUID} id the .id of the instance to remove.\n * @return {Promise}\n */\n delete(id) {\n var error = new Error(\n \"ABObjectQuery.ABModelQuery.delete() should not be called.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method update\n * update model values on the server.\n */\n update(id, values) {\n var error = new Error(\n \"ABObjectQuery.ABModelQuery.update() should not be called.\"\n );\n return Promise.reject(error);\n }\n\n /**\n * @method batchUpdate\n * update value to many rows on the server.\n */\n batchUpdate({ rowIds, values }) {\n var error = new Error(\n \"ABObjectQuery.ABModelQuery.batchUpdate() should not be called.\"\n );\n return Promise.reject(error);\n }\n};\n","const ABObjectCore = require(\"../core/ABObjectCore\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\n// NOTE: this has been moved to NetworkRestSocket:\n//\n// // Start listening for server events for object updates and call triggerEvent as the callback\n// if (typeof io != \"undefined\") {\n// io.socket.on(\"ab.object.update\", function (msg) {\n// AB.emit(\"ab.object.update\", {\n// objectId: msg.objectId,\n// data: msg.data,\n// });\n// });\n// } else {\n// console.error(\"TODO: ABObject: configure Socket.io\");\n// }\n\n// io.socket.on(\"ab.object.delete\", function (msg) {\n// });\n\nmodule.exports = class ABObject extends ABObjectCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n // listen for our ABFields.\"definition.updated\"\n this.fields().forEach((f) => {\n f.on(\"definition.updated\", (field) => {\n // create a new Field with the updated def\n var def = this.AB.definitionByID(field.id);\n if (!def) return;\n\n var newField = this.AB.fieldNew(def, this);\n\n // we want to keep the same fieldID order:\n var newFields = [];\n this.fields().forEach((f) => {\n if (f.id === field.id) {\n newFields.push(newField);\n return;\n }\n newFields.push(f);\n });\n\n this._fields = newFields;\n });\n });\n\n // listen\n // this.AB.on(\"ab.object.update\", (data) => {\n // if (this.id == data.objectId) this.fromValues(data.data);\n // });\n\n this._pendingNetworkRequests = {};\n // {hash} uuid : {Promise}\n // convert our migrateXXXX() operations to be Relay/offline compatible.\n // if a queued operation is sent after a web browser refresh, then\n // we will NOT have a pending promise to .resolve()/.reject()\n\n this._handler_object_migrate = (context, err, response) => {\n // NOTE:\n var pending = this._pendingNetworkRequests?.[context.uuid];\n if (err) {\n pending?.reject(err);\n return;\n }\n pending?.resolve(response);\n };\n this.AB.Network.on(\"object.migrate\", this._handler_object_migrate);\n }\n\n /**\n * @method refreshInstance()\n * Used when a definition.updated message is detected on this ABObject.\n * This method will return a new instance based upon the current definition\n * and properly resolve any handlers and pending network Requests.\n * @return {ABObject}\n */\n refreshInstance() {\n var newObj = this.AB.objectByID(this.id);\n\n // prevent doing this multiple times:\n if (this._pendingNetworkRequests) {\n // remove object.migrate listener\n this.AB.Network.removeListener(\n \"object.migrate\",\n this._handler_object_migrate\n );\n\n // transfer the pending network requests\n newObj._pendingNetworkRequests = this._pendingNetworkRequests;\n this._pendingNetworkRequests = null;\n }\n\n return newObj;\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n fromValues(attributes) {\n /*\n\t\t{\n\t\t\tid: uuid(),\n\t\t\tname: 'name',\n\t\t\tlabelFormat: 'xxxxx',\n\t\t\tisImported: 1/0,\n\t\t\tisExternal: 1/0,\n\t\t\turlPath:'string',\n\t\t\timportFromObject: 'string', // JSON Schema style reference: '#[ABApplication.id]/objects/[ABObject.id]'\n\t\t\t\t\t\t\t\t\t\t// to get other object: ABApplication.objectFromRef(obj.importFromObject);\n\t\t\ttranslations:[\n\t\t\t\t{}\n\t\t\t],\n\t\t\tfields:[\n\t\t\t\t{ABDataField}\n\t\t\t]\n\t\t}\n\t\t*/\n\n super.fromValues(attributes);\n\n if (this.workspaceViews) this.workspaceViews.fromObj(attributes);\n }\n\n //// TODO: Refactor isValid() to ignore op and not error if duplicateName is own .id\n\n isValid() {\n var validator = this.AB.Validation.validator();\n\n // label/name must be unique:\n var isNameUnique =\n this.AB.objects((o) => {\n return (\n o.id != this.id &&\n o.name.toLowerCase() == this.name.toLowerCase()\n );\n }).length == 0;\n if (!isNameUnique) {\n validator.addError(\n \"name\",\n L('Object name must be unique (\"{0}\" already in use)', [this.name])\n );\n }\n\n // Check the common validations:\n // TODO:\n // if (!inputValidator.validate(values.label)) {\n // \t_logic.buttonSaveEnable();\n // \treturn false;\n // }\n\n return validator;\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an array of any invalid\n * value errors.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @return {array}\n */\n isValidData(data) {\n var validator = this.AB.Validation.validator();\n this.fields().forEach((f) => {\n // check if value was passed, if so validate it\n if (Object.prototype.hasOwnProperty.call(data, f.columnName))\n f.isValidData(data, validator);\n });\n\n return validator;\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fieldNew()\n *\n * return an instance of a new (unsaved) ABField that is tied to this\n * ABObject.\n *\n * NOTE: this new field is not included in our this.fields until a .save()\n * is performed on the field.\n *\n * @param {obj} values the initial values for this field.\n *\t\t\t\t\t\t{ key:'{string}'} is required\n * @return {ABField}\n */\n // fieldNew ( values ) {\n // \t// NOTE: ABFieldManager returns the proper ABFieldXXXX instance.\n // \treturn ABFieldManager.newField( values, this );\n // }\n\n /// ABApplication data methods\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABObject\n *\n * also remove it from our parent application\n *\n * @return {Promise}\n */\n async destroy() {\n /*\n return new Promise((resolve, reject) => {\n // Remove the import object, then its model will not be destroyed\n if (this.isImported) {\n this.application\n .objectDestroy(this)\n .catch(reject)\n .then(() => {\n resolve();\n });\n\n return;\n }\n\n // OK, some of our Fields have special follow up actions that need to be\n // considered when they no longer exist, so before we simply drop this\n // object/table, drop each of our fields and give them a chance to clean up\n // what needs cleaning up.\n\n // ==> More work, but safer.\n var fieldDrops = [];\n this.fields().forEach((f) => {\n fieldDrops.push(f.destroy());\n });\n\n Promise.all(fieldDrops)\n .then(() => {\n return new Promise((next, err) => {\n // now drop our table\n // NOTE: our .migrateXXX() routines expect the object to currently exist\n // in the DB before we perform the DB operations. So we need to\n // .migrateDrop() before we actually .objectDestroy() this.\n this.migrateDrop()\n .then(() => {\n // finally remove us from the application storage\n return this.application.objectDestroy(this);\n })\n .then(next)\n .catch(err);\n });\n })\n\n // flag .disable to queries who contains this removed object\n .then(() => {\n return new Promise((next, err) => {\n this.application\n .queries(\n (q) =>\n q.objects((o) => o.id == this.id).length > 0\n )\n .forEach((q) => {\n q._objects = q.objects((o) => o.id != this.id);\n\n q.disabled = true;\n });\n\n next();\n });\n })\n .then(resolve)\n .catch(reject);\n });\n */\n\n var removeFromApplications = () => {\n var allRemoves = [];\n this.AB.applications().forEach((app) => {\n allRemoves.push(app.objectRemove(this));\n });\n return Promise.all(allRemoves);\n };\n\n var disableRelatedQueries = () => {\n return new Promise((next /*, err */) => {\n this.AB.queries(\n (q) => q.objects((o) => o.id == this.id).length > 0\n ).forEach((q) => {\n // q._objects = q.objects((o) => o.id != this.id);\n\n q.disabled = true;\n });\n\n next();\n });\n };\n\n try {\n // 1) remove us from all Application:\n await removeFromApplications();\n\n // 2) disable any connected Queries\n await disableRelatedQueries();\n\n // if an imported Object (FederatedTable, Existing Table, etc...)\n // then skip this step\n if (this.isImported) {\n return Promise.resolve();\n }\n\n // time to remove my table:\n // NOTE: our .migrateXXX() routines expect the object to currently exist\n // in the DB before we perform the DB operations. So we need to\n // .migrateDrop() before we actually .destroy() this.\n await this.migrateDrop();\n\n // now remove my definition\n\n // start with my fields:\n var fieldDrops = [];\n\n // Only ABObjects should attempt any fieldDrops.\n // ABObjectQueries can safely skip this step:\n if (this.type == \"object\") {\n var allFields = this.fields();\n this._fields = []; // clear our field counter so we don't retrigger\n // this.save() on each field.destroy();\n\n allFields.forEach((f) => {\n fieldDrops.push(f.destroy());\n });\n }\n await Promise.all(fieldDrops);\n\n await super.destroy();\n this.emit(\"destroyed\");\n } catch (err) {\n this.AB.notify.developer(err, {\n context: \"ABObject.destroy(): error destroying object.\",\n });\n }\n\n // return Promise.resolve()\n // .then(() => {\n // // 1) remove us from all Application:\n // return removeFromApplications();\n // })\n // .then(() => {\n // // 2) disable any connected Queries\n // return disableRelatedQueries();\n // })\n // .then(() => {\n // // if an imported Object (FederatedTable, Existing Table, etc...)\n // // then skip this step\n // if (this.isImported) {\n // return Promise.resolve();\n // }\n\n // // time to remove my table:\n // // NOTE: our .migrateXXX() routines expect the object to currently exist\n // // in the DB before we perform the DB operations. So we need to\n // // .migrateDrop() before we actually .destroy() this.\n // return this.migrateDrop();\n // })\n // .then(() => {\n // // now remove my definition\n\n // // start with my fields:\n // var fieldDrops = [];\n\n // // Only ABObjects should attempt any fieldDrops.\n // // ABObjectQueries can safely skip this step:\n // if (this.type == \"object\") {\n // var allFields = this.fields();\n // this._fields = []; // clear our field counter so we don't retrigger\n // // this.save() on each field.destroy();\n\n // allFields.forEach((f) => {\n // fieldDrops.push(f.destroy());\n // });\n // }\n\n // return Promise.all(fieldDrops)\n // .then(() => {\n // // now me.\n // return super.destroy();\n // })\n // .then(() => {\n // this.emit(\"destroyed\");\n // });\n // });\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABObject with it's parent ABApplication\n *\n *\n * @return {Promise}\n *\t\t\t\t\t\t.resolve( {this} )\n */\n async save(skipMigrate = false) {\n var isAdd = false;\n\n // if this is our initial save()\n if (!this.id) {\n this.label = this.label || this.name;\n isAdd = true;\n }\n\n try {\n await super.save();\n if (isAdd && !skipMigrate) {\n await this.migrateCreate();\n }\n return this;\n } catch (err) {\n this.AB.notify.developer(err, {\n context: \"ABObject.save()\",\n obj: this.toObj(),\n });\n throw err;\n }\n }\n\n /**\n * @method toObj()\n *\n * properly compile the current state of this ABApplication instance\n * into the values needed for saving to the DB.\n *\n * Most of the instance data is stored in .json field, so be sure to\n * update that from all the current values of our child fields.\n *\n * @return {json}\n */\n toObj() {\n var result = super.toObj();\n\n result.objectWorkspaceViews = this.workspaceViews?.toObj();\n\n return result;\n }\n\n ///\n /// DB Migrations\n ///\n\n migrateCreate() {\n return new Promise((resolve, reject) => {\n var uuid = this.AB.uuid();\n this._pendingNetworkRequests[uuid] = { resolve, reject };\n var jobResponse = {\n key: \"object.migrate\",\n context: { uuid, id: this.id },\n };\n this.AB.Network.post(\n {\n url: `/definition/migrate/object/${this.id}`,\n },\n jobResponse\n );\n });\n }\n\n migrateDrop() {\n return new Promise((resolve, reject) => {\n var uuid = this.AB.uuid();\n this._pendingNetworkRequests[uuid] = { resolve, reject };\n var jobResponse = {\n key: \"object.migrate\",\n context: { uuid, id: this.id },\n };\n this.AB.Network[\"delete\"](\n {\n url: `/definition/migrate/object/${this.id}`,\n },\n jobResponse\n );\n });\n }\n\n ///\n /// Working with Client Components:\n ///\n\n /**\n * @method columnResize()\n *\n * save the new width of a column\n *\n * @param {} id The instance of the field to save.\n * @param {int} newWidth the new width of the field\n * @param {int} oldWidth the old width of the field\n * @return {Promise}\n */\n columnResize(columnName, newWidth /*, oldWidth */) {\n var fieldID = null;\n for (var i = 0; i < this._fields.length; i++) {\n if (this._fields[i].columnName == columnName) {\n fieldID = this._fields[i].id;\n break;\n // this._fields[i].settings.width = newWidth;\n }\n }\n\n // Johnny: This is better but still not right. the ABObject should not be\n // storing sizes for field widths. That is a function of the UI and which\n // Grid is being displayed. THAT GRID should be storing a column width\n // locally.\n // TODO: once we have v2 in place.\n\n var fieldSettings = this.AB.localSettings(fieldID);\n fieldSettings = fieldSettings || {};\n fieldSettings.width = newWidth;\n\n return this.AB.localSettings(fieldID, fieldSettings);\n // return this.save();\n }\n\n // return the column headers for this object\n // @param {bool} isObjectWorkspace return the settings saved for the object workspace\n columnHeaders(\n isObjectWorkspace,\n isEditable,\n summaryColumns,\n countColumns,\n hiddenFieldNames\n ) {\n summaryColumns = summaryColumns || [];\n countColumns = countColumns || [];\n\n var headers = [];\n // var columnNameLookup = {};\n\n // get the header for each of our fields:\n this.fields().forEach((f) => {\n var header = f.columnHeader({\n isObjectWorkspace: isObjectWorkspace,\n editable: isEditable,\n });\n\n if (isEditable) {\n header.validationRules = f.settings.validationRules;\n }\n\n header.alias = f.alias || undefined; // query type\n header.fieldID = f.id;\n // header.fieldURL = f.urlPointer();\n\n // if the field specifies a width\n if (f.settings.width != 0) {\n header.width = f.settings.width;\n }\n\n // if the User has already updated a local width for this\n var fieldSettings = this.AB.localSettings(f.id);\n if (fieldSettings && fieldSettings.width) {\n if (!header.width || fieldSettings.width > header.width) {\n // set column width to the customized width\n header.width = fieldSettings.width;\n }\n }\n\n if (!header.width) {\n // set column width to adjust:true by default;\n header.adjust = true;\n }\n\n // add the summary footer\n if (summaryColumns.indexOf(f.id) > -1) {\n if (f.key == \"calculate\" || f.key == \"formula\") {\n header.footer = { content: \"totalColumn\", field: f };\n } else {\n header.footer = { content: \"summColumn\" };\n }\n }\n // add the count footer\n else if (countColumns.indexOf(f.id) > -1)\n header.footer = { content: \"countColumn\" };\n\n headers.push(header);\n // columnNameLookup[header.id] = f.columnName; // name => id\n });\n\n // update our headers with any settings applied in the Object Workspace\n /*\n // In v2: this is handled by the ABDesigner\n //\n if (isObjectWorkspace) {\n let hiddenFieldList = [];\n\n if (hiddenFieldNames && hiddenFieldNames.length > 0)\n hiddenFieldList = hiddenFieldNames;\n // else if (this.workspaceHiddenFields)\n // hiddenFieldList = this.workspaceHiddenFields;\n\n if (hiddenFieldList.length > 0) {\n hiddenFieldList.forEach((hfID) => {\n headers.forEach((h) => {\n if (columnNameLookup[h.id] == hfID) {\n h.hidden = true;\n }\n });\n });\n }\n }\n */\n\n return headers;\n }\n\n // after a component has rendered, tell each of our fields to perform\n // any custom display operations\n // @param {Webix.DataStore} data a webix datastore of all the rows effected\n // by the render.\n customDisplays(data, App, DataTable, rowIds, isEditable) {\n if (!data || !data.getFirstId) return;\n\n // var fields = this.fields(f => this.workspaceHiddenFields.indexOf(f.columnName) < 0);\n let fields = [];\n DataTable.eachColumn((columnName) => {\n let field = this.fields((f) => f.columnName == columnName)[0];\n if (field) fields.push(field);\n });\n\n if (rowIds != null) {\n rowIds.forEach((id) => {\n let row = data.getItem(id);\n if (row) {\n fields.forEach((f) => {\n let node = DataTable.getItemNode({\n row: row.id,\n column: f.columnName,\n });\n f.customDisplay(row, App, node, {\n editable: isEditable,\n });\n });\n }\n });\n } else {\n let id = data.getFirstId();\n while (id) {\n var row = data.getItem(id);\n if (row) {\n fields.forEach((f) => {\n var node = DataTable.getItemNode({\n row: row.id,\n column: f.columnName,\n });\n f.customDisplay(row, App, node, {\n editable: isEditable,\n });\n });\n }\n id = data.getNextId(id);\n }\n }\n }\n\n // Display data with label format of object\n displayData(rowData) {\n if (rowData == null) return \"\";\n\n // translate multilingual\n //// TODO: isn't this a MLObject?? use this.translate()\n var mlFields = this.multilingualFields();\n this.translate(rowData, rowData, mlFields);\n\n var labelData = this.labelFormat || \"\";\n\n // default label\n if (!labelData && this.fields().length > 0) {\n var defaultField = this.fields((f) => f.fieldUseAsLabel())[0];\n if (defaultField) labelData = `{${defaultField.id}}`;\n else\n labelData = `${this.AB.isUUID(rowData.id) ? \"ID: \" : \"\"}${\n rowData.id\n }`; // show id of row\n }\n\n // get column ids in {colId} template\n // ['{colId1}', ..., '{colIdN}']\n var colIds = labelData.match(/\\{[^}]+\\}/g);\n\n if (colIds && colIds.forEach) {\n colIds.forEach((colId) => {\n var colIdNoBracket = colId.replace(\"{\", \"\").replace(\"}\", \"\");\n\n var field = this.fieldByID(colIdNoBracket);\n if (field == null) return;\n\n labelData = labelData.replace(colId, field.format(rowData) || \"\");\n });\n }\n\n // if label is empty, then show .id\n if (!labelData.trim()) {\n let labelSettings = this.labelSettings || {};\n if (labelSettings && labelSettings.isNoLabelDisplay) {\n labelData = L(labelSettings.noLabelText || \"[No Label]\");\n } else {\n // show id of row\n labelData = `${this.AB.isUUID(rowData.id) ? \"ID: \" : \"\"}${\n rowData.id\n }`;\n }\n }\n\n return labelData;\n }\n\n currentView() {\n return this.workspaceViews.getCurrentView();\n }\n\n warningsAll() {\n // report both OUR warnings, and any warnings from any of our fields\n var allWarnings = super.warningsAll();\n this.fields().forEach((f) => {\n if (!f) return;\n allWarnings = allWarnings.concat(f?.warnings());\n });\n\n this.indexes().forEach((i) => {\n if (!i) return;\n allWarnings = allWarnings.concat(i?.warnings());\n });\n\n return allWarnings.filter((w) => w);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let allFields = this.fields();\n\n if (allFields.length == 0) {\n this.warningsMessage(\"has no fields\");\n }\n\n (this._unknownFieldIDs || []).forEach((id) => {\n this.warningsMessage(`is referencing an unknown field id[${id}]`);\n });\n\n (this._unknownIndex || []).forEach((id) => {\n this.warningsMessage(`is referencing an unknown index id[${id}]`);\n });\n\n allFields.forEach((f) => {\n f?.warningsEval();\n });\n\n this.indexes().forEach((i) => {\n i?.warningsEval();\n });\n }\n\n warningsMessage(msg, data = {}) {\n let message = `Object[${this.label}]: ${msg}`;\n this._warnings.push({ message, data });\n // this.emit(\"warning\", warnMsg, data);\n }\n\n isUuid(text) {\n console.error(\n \"ABObject.isUuid(): is depreciated. directly reference AB.Rules.isUUID() instead.\"\n );\n return this.AB.isUUID(text);\n }\n\n async getDbInfo() {\n return this.AB.Network.get({\n url: `/definition/info/object/${this.id}`,\n });\n }\n\n /**\n * @method formCleanValues()\n * perform a final review of the data a form will try to submit for\n * this object. The lets individual fields have a chance to update or\n * remove values before they are sent.\n * @param {obj} rowData\n * The {data} a form has collected and is about to save.\n * @return {undefined}\n */\n formCleanValues(rowData) {\n this.fields().forEach((f) => {\n f.formCleanData(rowData);\n });\n }\n};\n","const atomicjs = require(\"atomicjs\");\nconst ABObjectApiCore = require(\"../core/ABObjectApiCore\");\n\nmodule.exports = class ABObjectApi extends ABObjectApiCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n }\n\n async fetchData(insertDataMax = 20) {\n if (this.isFetched) return;\n\n const headers = this.headers;\n\n const response = await atomicjs(this.request.url, {\n method: this.request.verb,\n headers,\n data: {},\n timeout: null,\n withCredentials: false,\n });\n\n let parsedResponse = this.dataFromKey(response);\n\n const model = this.model();\n\n if (parsedResponse.length == null || parsedResponse.length === 0) {\n const data = {};\n\n this.response.fields.forEach((f) => {\n data[f.columnName] = parsedResponse[f.columnName];\n });\n\n await model.create(data);\n\n return;\n }\n\n let pendingModelCreate = [];\n\n for (let i = 0; i < parsedResponse.length; i++) {\n const data = {};\n\n this.response.fields.forEach((f) => {\n data[f.columnName] = parsedResponse[i][f.columnName];\n });\n\n pendingModelCreate.push(model.create(data));\n\n if (pendingModelCreate.length % insertDataMax === 0)\n await Promise.all(pendingModelCreate);\n }\n\n if (pendingModelCreate.length > 0) await Promise.all(pendingModelCreate);\n\n this.isFetched = true;\n\n await this.save();\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABObject with it's parent ABApplication\n *\n *\n * @return {Promise}\n *\t\t\t\t\t\t.resolve( {this} )\n */\n async save() {\n return await super.save(true);\n }\n\n migrateCreate() {\n return Promise.resolve();\n }\n\n migrateDrop() {\n return Promise.resolve();\n }\n};\n","const ABObjectApiNetsuiteCore = require(\"../core/ABObjectApiNetsuiteCore\");\n\nmodule.exports = class ABObjectApiNetsuite extends ABObjectApiNetsuiteCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n }\n\n async getDbInfo() {\n /*\n // Data format:\n {\n \"definitionId\": \"f2416a1a-d75c-40f2-8180-bad9b5f8b9cc\",\n \"tableName\": \"AB_MockupHR_TeamTargetLocation\",\n \"fields\": [\n {\n \"Field\": \"uuid\",\n \"Type\": \"varchar(255)\",\n \"Null\": \"NO\",\n \"Key\": \"PRI\",\n \"Default\": null,\n \"Extra\": \"\"\n },\n {\n \"Field\": \"created_at\",\n \"Type\": \"datetime\",\n \"Null\": \"YES\",\n \"Key\": \"\",\n \"Default\": null,\n \"Extra\": \"\"\n },\n {\n \"Field\": \"updated_at\",\n \"Type\": \"datetime\",\n \"Null\": \"YES\",\n \"Key\": \"\",\n \"Default\": null,\n \"Extra\": \"\"\n },\n {\n \"Field\": \"properties\",\n \"Type\": \"text\",\n \"Null\": \"YES\",\n \"Key\": \"\",\n \"Default\": null,\n \"Extra\": \"\"\n }\n ]\n }\n */\n let PK = this.PK();\n let fieldInfo = [];\n this.fields().forEach((f) => {\n let field = {\n Field: f.columnName,\n Type: f.key,\n Null: f.settings.required ? \"NO\" : \"YES\",\n Key: PK == f.columnName ? \"PRI\" : \"\",\n Default: \"\",\n Extra: \"\",\n };\n fieldInfo.push(field);\n });\n\n let TableInfo = {\n definitionId: this.id,\n tableName: this.tableName,\n fields: fieldInfo,\n };\n\n return TableInfo;\n }\n};\n","const ABObject = require(\"./ABObject\");\n\n/**\n * ABObjectExternal\n * These are ABObjects that ... (might need to be refactored out?)\n * NOTE: on the web client, these should function just like ABObjects\n */\nmodule.exports = class ABObjectExternal extends ABObject {};\n","const ABObject = require(\"./ABObject\");\n\n/**\n * ABObjectImport\n * These are ABObjects that were Imported from existing Tables in the\n * system.\n *\n * NOTE: on the web client, these should function just like ABObjects\n */\nmodule.exports = class ABObjectImport extends ABObject {};\n","//\n// ABObjectQuery\n//\n// A type of Object in our system that is based upon a complex relationship of multiple\n// existing Objects.\n//\n// In the QueryBuilder section of App Builder, a new Query Object can be created.\n// An initial Object can be chosen from our current list of Objects. After that, additional Objects\n// and a specified join type can be specified.\n//\n// A list of fields from each specified Object can also be included as the data to be returned.\n//\n// A where statement is also part of the definition.\n//\n\nconst ABObjectQueryCore = require(\"../core/ABObjectQueryCore\");\n\nvar ABFactory = null;\nif (typeof io != \"undefined\") {\n io.socket.on(\"ab.query.update\", function (msg) {\n if (ABFactory) {\n ABFactory.emit(\"ab.query.update\", {\n queryId: msg.queryId,\n data: msg.data,\n });\n } else {\n console.error(\n \"ABObjectQuery:: received io.socket msg before ABFactory is defined\"\n );\n console.error(\"TODO: move this to ABFactory!\");\n }\n });\n} else {\n console.error(\"TODO: install socket.io client for sails updates.\");\n}\n\n// io.socket.on(\"ab.query.delete\", function (msg) {\n// });\n\nmodule.exports = class ABObjectQuery extends ABObjectQueryCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n if (!ABFactory) {\n ABFactory = AB;\n }\n // listen\n this.AB.on(\"ab.query.update\", (data) => {\n if (this.id == data.queryId) this.fromValues(data.data);\n });\n\n // .fromValues() should already have been called in super()\n // so now add in our conditionScan()\n // NOTE: this can be folded into the Core once filterComplex\n // is fully implemented and not on Platform only.\n\n // now scan our conditions to make sure they are\n // 1) reference fields that exist in our Query\n // 2) completely filled out conditions.\n this.conditionScan(this.where);\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n ///\n /// Instance Methods\n ///\n\n /// ABApplication data methods\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABObjectQuery\n *\n * also remove it from our parent application\n *\n * @return {Promise}\n */\n // destroy() {\n // return super.destroy().then(() => {\n // console.error(\"Move .queryRemove() to Appbuilder Designer.\");\n // // return this.AB.queryRemove(this);\n // });\n // }\n\n /**\n * @method save()\n *\n * persist this instance of ABObjectQuery with it's parent ABApplication\n *\n * @return {Promise}\n *\t\t\t\t\t\t.resolve( {this} )\n */\n // async save() {\n // try {\n // await super.save();\n // return this;\n // } catch (err) {\n // this.AB.notify.developer(err, {\n // context: \"ABObjectQuery.save()\",\n // query: this.toObj(),\n // });\n // throw err;\n // }\n // }\n\n ///\n /// Fields\n ///\n\n /**\n * @method importFields\n * instantiate a set of fields from the given attributes.\n * Our attributes are a set of field URLs That should already be created in their respective\n * ABObjects.\n * @param {array} fieldSettings The different field urls for each field\n * { }\n * @param {bool} shouldAliasColumn\n * should we add the object alias to the columnNames?\n * this is primarily used on the web client\n */\n importFields(fieldSettings) {\n super.importFields(fieldSettings);\n\n this._fields.forEach((fieldEntry) => {\n // include object name {aliasName}.{columnName}\n // to use it in grid headers & hidden fields\n fieldEntry.field.columnName = `${fieldEntry.alias}.${fieldEntry.field.columnName}`;\n });\n }\n\n /**\n * @method columnResize()\n *\n * save the new width of a column\n *\n * @param {} id The instance of the field to save.\n * @param {int} newWidth the new width of the field\n * @param {int} oldWidth the old width of the field\n * @return {Promise}\n */\n columnResize(columnName, newWidth, oldWidth) {\n let field = this.fields((f) => f.columnName == columnName)[0];\n if (field) {\n field.settings.width = newWidth;\n\n return this.save();\n } else {\n return Promise.resolve();\n }\n }\n\n ///\n /// Working with Client Components:\n ///\n\n // return the column headers for this object\n // @param {bool} isObjectWorkspace return the settings saved for the object workspace\n columnHeaders(\n isObjectWorkspace,\n isEditable,\n summaryColumns,\n countColumns,\n hiddenFieldNames\n ) {\n var headers = super.columnHeaders(\n isObjectWorkspace,\n isEditable,\n summaryColumns,\n countColumns,\n hiddenFieldNames\n );\n\n headers.forEach((h) => {\n // pull object by alias\n let object = this.objectByAlias(h.alias);\n if (!object) return;\n\n let field = object.fieldByID(h.fieldID);\n if (!field) return;\n\n // NOTE: query v1\n let alias = \"\";\n if (Array.isArray(this.joins())) {\n alias = field.object.name;\n } else {\n alias = h.alias;\n }\n\n // include object name {aliasName}.{columnName}\n // to use it in grid headers & hidden fields\n h.id = `${alias}.${field.columnName}`;\n\n // label\n if (this.settings && this.settings.hidePrefix) {\n h.header = `${field.label || \"\"}`;\n } else {\n h.header = `${field.object.label || \"\"}.${field.label || \"\"}`;\n }\n\n // icon\n if (field.settings && field.settings.showIcon) {\n h.header = `${\n h.header\n }`;\n }\n\n // If this query supports grouping, then add folder icon to display in grid\n if (this.isGroup) {\n let originTemplate = h.template;\n\n h.template = (item, common) => {\n if (item[h.id])\n return (\n common.icon(item, common) +\n (originTemplate\n ? originTemplate(item, common, item[h.id])\n : item[h.id])\n );\n else return \"\";\n };\n }\n\n h.adjust = true;\n h.minWidth = 220;\n });\n\n return headers;\n }\n\n /**\n * @method conditionScan()\n * Scan the provided condition object and determine if there are any\n * configuration issues.\n * @param {obj} rule\n * the QueryBuilder rule that we are scanning.\n * @param {array} listWarnings\n * An array of warnings that we should add our notices to.\n */\n conditionScan(rule) {\n if (!rule) {\n return;\n }\n\n if (rule.glue) {\n (rule.rules || []).forEach((r) => {\n this.conditionScan(r);\n });\n return;\n }\n\n // 1) we need to have any key as one of our fields.\n let field = this.fieldByID(rule.key);\n if (!field && rule.key != \"this_object\") {\n this.warningsMessage(\n \"condition does not reference one of our fields\",\n {\n rule,\n }\n );\n }\n\n // 2) completely filled out conditions.\n if (!this._conditionCheck) {\n this._conditionCheck = this.AB.filterComplexNew(\n `${this.id}_conditionCheck`\n );\n // {FilterComplex} ._conditionCheck\n // has our .isConditionComplete() method.\n }\n if (!this._conditionCheck.isConditionComplete(rule)) {\n this.warningsMessage(\"incomplete condition definition\", {\n rule,\n });\n }\n }\n\n warningsEval() {\n super.warningsEval();\n\n this.conditionScan(this.where);\n\n /// include importFields() warnings:\n this.__missingObject.forEach((f) => {\n this.warningsMessage(\n `IMPORT FIELDS: could not resolve object[${\n f.objectID\n }] for fieldSetting ${JSON.stringify(f)}`,\n {\n fieldInfo: f,\n }\n );\n });\n\n this.__missingFields.forEach((f) => {\n this.warningsMessage(\n `IMPORT FIELDS: Object[${f.objID}] could not find field[${\n f.fieldID\n }] for fieldSetting ${JSON.stringify(f.fieldInfo)}`,\n {\n object: f.objID,\n fieldInfo: f.fieldInfo,\n }\n );\n });\n\n this.__cantFilter.forEach((f) => {\n this.warningsMessage(\n `Field[${f.field.id}] referenced in fieldSetting[${JSON.stringify(\n f.fieldInfo\n )}] did not pass .canFilterField`,\n {\n field: f.field.toObj(),\n fieldInfo: f.fieldInfo,\n }\n );\n });\n\n this.__duplicateFields.forEach((f) => {\n this.warningsMessage(\n `Field[${\n f.fieldInfo.fieldID\n }] referenced in fieldSetting[${JSON.stringify(\n f.fieldInfo\n )}] is a duplicate`,\n {\n fieldInfo: f.fieldInfo,\n }\n );\n });\n\n this.__linkProblems.forEach((f) => {\n this.warningsMessage(f.message, f.data);\n });\n }\n\n warningsMessage(msg, data = {}) {\n let message = `Query[${this.label}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n\n isUuid(text) {\n console.error(\n \"ABObject.isUuid(): is depreciated. directly reference AB.Rules.isUUID() instead.\"\n );\n return this.AB.isUUID(text);\n }\n};\n","const ABProcessCore = require(\"../core/ABProcessCore\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABProcess extends ABProcessCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n this._unknownShapes = [];\n // {array} [ BPMN:Shape, ... ]\n // Generic Shapes that are added to the Process are registered here.\n // We will list these as warnings to the ABDesigner.\n\n // listen\n this.AB.on(\"ab.abprocess.update\", (data) => {\n if (this.id == data.objectId) this.fromValues(data.data);\n });\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABObject\n *\n * also remove it from our parent application\n *\n * @return {Promise}\n */\n destroy() {\n // remove all my Elements\n var allElements = this.elements();\n var allDestroy = [];\n allElements.forEach((e) => {\n allDestroy.push(e.destroy());\n });\n\n return Promise.all(allDestroy).then(() => {\n // now remove myself\n return new Promise((resolve, reject) => {\n this.toDefinition()\n .destroy()\n .then(() => {\n // allow normal processing to contine now:\n resolve();\n })\n .then(() => {\n // in the background\n // remove this reference from ALL Applications that link\n // to me:\n console.error(\n \"TODO: ABProcess.destroy(): refactor to .emit('destroyed') and let containing Apps self remove.\"\n );\n var appsWithProcess = this.AB.applications().find((a) => {\n return a.hasProcess(this);\n });\n if (appsWithProcess.length > 0) {\n appsWithProcess.forEach((a) => {\n a.processRemove(this);\n });\n }\n })\n .catch((err) => {\n reject(err);\n });\n });\n });\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABObject with it's parent ABApplication\n *\n *\n * @return {Promise}\n *\t\t\t\t\t\t.resolve( {this} )\n */\n save(skipElements = false) {\n // if this is an update:\n // if (this.id) {\n // \treturn ABDefinition.update(this.id, this.toDefinition());\n // } else {\n\n // \treturn ABDefinition.create(this.toDefinition());\n // }\n\n // make sure all our tasks have save()ed.\n var allSaves = [];\n if (!skipElements) {\n var allTasks = this.elements();\n allTasks.forEach((t) => {\n allSaves.push(t.save());\n });\n }\n return Promise.all(allSaves).then(() => {\n // now we can save our Process definition\n return this.toDefinition()\n .save()\n .then((data) => {\n // if I didn't have an .id then this was a create()\n // and I need to update my data with the generated .id\n\n if (!this.id) {\n this.id = data.id;\n }\n\n // Also, our embedded elements now all have .ids\n // where they might not have before. So now\n // rebuild our this._elements hash with all id\n var _new = {};\n let _old = this._elements;\n Object.keys(this._elements).forEach((k) => {\n _new[this._elements[k].id] = this._elements[k];\n });\n this._elements = _new;\n\n // check to see if an update happened and then make\n // sure we have that saved.\n let needSave = false;\n Object.keys(_new).forEach((k) => {\n if (!_old[k]) {\n needSave = true;\n }\n });\n\n if (needSave) {\n return this.save(true);\n }\n });\n });\n }\n\n isValid() {\n var validator = this.AB.Validation.validator();\n\n // label/name must be unique:\n var isNameUnique =\n this.AB.processes((o) => {\n return o.name.toLowerCase() == this.name.toLowerCase();\n }).length == 0;\n if (!isNameUnique) {\n validator.addError(\n \"name\",\n L(`Process name must be unique (\"{0}\" already in use)`, [this.name])\n );\n }\n\n return validator;\n }\n\n /**\n * @method elementNewForModelDefinition()\n * create a new process element defined by the given BPMN:Element\n *\n * the BPMN:Element definition comes from the BPMN Modeler when a new\n * diagram element is created.\n *\n * @param {BPMN:Element} element\n * the BPMN modeler diagram element definition\n * @return {ABProcess[OBJ]}\n */\n elementNewForModelDefinition(element) {\n var task = this.AB.processElementNewForModelDefinition(element, this);\n if (task) {\n this.elementAdd(task);\n }\n return task;\n }\n\n /**\n * @method unknownShape()\n * store a reference to a BPMN Shape that is in our XML diagram,\n * but we don't have an element for.\n * @param {BPMN:Shape} shape\n */\n unknownShape(shape) {\n this.unknownShapeRemove(shape);\n this._unknownShapes.push(shape);\n }\n\n /**\n * @method unknownShapeRemove()\n * make sure we no longer track the provided BPMN Shape as an unknown shape.\n * @param {BPMN:Shape} shape\n */\n unknownShapeRemove(shape) {\n this._unknownShapes = this._unknownShapes.filter((s) => s.id != shape.id);\n }\n\n /**\n * @method warningsAll()\n * Return an array of mis configuration warnings for our object or any\n * of our sub elements.\n * @return {array} [ { message: \"warning message\", data:{} } ]\n */\n warningsAll() {\n // report both OUR warnings, and any warnings from any of our fields\n var allWarnings = [].concat(this._warnings);\n this.elements().forEach((e) => {\n e.warningsEval();\n allWarnings = allWarnings.concat(e.warnings());\n });\n\n if (this.elements().length == 0) {\n allWarnings.push({ message: \"No process Tasks defined.\", data: {} });\n }\n\n // perform a check of our xml document to see if we have any unknown\n // shapes\n if (!this._DOMParser) {\n if (window.DOMParser) {\n // Handy snippet from https://stackoverflow.com/questions/17604071/parse-xml-using-javascript\n this._DOMParser = function (xmlStr) {\n return new window.DOMParser().parseFromString(\n xmlStr,\n \"text/xml\"\n );\n };\n } else if (\n typeof window.ActiveXObject != \"undefined\" &&\n new window.ActiveXObject(\"Microsoft.XMLDOM\")\n ) {\n this._DOMParser = function (xmlStr) {\n var xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n xmlDoc.async = \"false\";\n xmlDoc.loadXML(xmlStr);\n return xmlDoc;\n };\n } else {\n throw new Error(\"No XML parser found\");\n }\n }\n\n // find any references to our generic shapes\n let xml = this._DOMParser(this.xmlDefinition);\n const genericShapes = [\n \"bpmn2:startEvent\",\n \"bpmn2:task\",\n \"bpmn2:endEvent\",\n ];\n genericShapes.forEach((s) => {\n let allElements = xml.getElementsByTagName(s);\n for (let x = 0; x < allElements.length; x++) {\n // if we don't know about this shape\n let ele = allElements[x];\n let myEle = this.elementForDiagramID(allElements[x].id);\n if (!myEle) {\n this.unknownShape(allElements[x]);\n }\n }\n });\n\n // if any unknown shapes have been reported:\n if (this._unknownShapes.length) {\n allWarnings.push({\n message: \"Generic Tasks still undefined.\",\n data: {},\n });\n }\n\n return allWarnings;\n }\n};\n","const ABStepCore = require(\"../core/ABStepCore\");\n\n// let L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABStep extends ABStepCore {\n constructor(attributes, AB) {\n super(attributes, AB);\n\n // listen\n // this.AB.on(\"ab.abprocess.update\", (data) => {\n // if (this.id == data.objectId) this.fromValues(data.data);\n // });\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABObject\n *\n * also remove it from our parent application\n *\n * @return {Promise}\n */\n destroy() {\n // debugger;\n\n return new Promise((resolve, reject) => {\n this.toDefinition()\n .destroy()\n .then(() => {\n resolve();\n })\n .catch((err) => {\n reject(err);\n });\n });\n\n // remove all my Elements\n // var allElements = this.elements();\n // var allDestroy = [];\n // allElements.forEach((e) => {\n // allDestroy.push(e.destroy());\n // });\n\n // return Promise.all(allDestroy).then(() => {\n // // now remove myself\n // return new Promise((resolve, reject) => {\n // this.toDefinition()\n // .destroy()\n // .then(() => {\n // // allow normal processing to contine now:\n // resolve();\n // })\n // .then(() => {\n // // in the background\n // // remove this reference from ALL Applications that link\n // // to me:\n // console.error(\n // \"TODO: ABProcess.destroy(): refactor to .emit('destroyed') and let containing Apps self remove.\"\n // );\n // var appsWithProcess = this.AB.applications().find((a) => {\n // return a.hasProcess(this);\n // });\n // if (appsWithProcess.length > 0) {\n // appsWithProcess.forEach((a) => {\n // a.processRemove(this);\n // });\n // }\n // })\n // .catch((err) => {\n // reject(err);\n // });\n // });\n // });\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABObject with it's parent ABApplication\n *\n *\n * @return {Promise}\n * .resolve( {this} )\n */\n save() {\n // debugger;\n return this.toDefinition()\n .save()\n .then((data) => {\n // if I didn't have an .id then this was a create()\n // and I need to update my data with the generated .id\n\n if (!this.id) {\n this.id = data.id;\n }\n return this;\n });\n }\n\n isValid() {\n // debugger;\n return true;\n // var validator = this.AB.Validation.validator();\n\n // // label/name must be unique:\n // var isNameUnique =\n // this.AB.processes((o) => {\n // return o.name.toLowerCase() == this.name.toLowerCase();\n // }).length == 0;\n // if (!isNameUnique) {\n // validator.addError(\n // \"name\",\n // L(`Process name must be unique (\"{0}\" already in use)`, [this.name])\n // );\n // }\n\n // return validator;\n }\n\n /**\n * @method warningsAll()\n * Return an array of mis configuration warnings for our object or any\n * of our sub elements.\n * @return {array} [ { message: \"warning message\", data:{} } ]\n */\n warningsAll() {\n // debugger;\n // report both OUR warnings, and any warnings from any of our fields\n // var allWarnings = [].concat(this._warnings);\n // this.elements().forEach((e) => {\n // e.warningsEval();\n // allWarnings = allWarnings.concat(e.warnings());\n // });\n // if (this.elements().length == 0) {\n // allWarnings.push({ message: \"No process Tasks defined.\", data: {} });\n // }\n // // perform a check of our xml document to see if we have any unknown\n // // shapes\n // if (!this._DOMParser) {\n // if (window.DOMParser) {\n // // Handy snippet from https://stackoverflow.com/questions/17604071/parse-xml-using-javascript\n // this._DOMParser = function (xmlStr) {\n // return new window.DOMParser().parseFromString(\n // xmlStr,\n // \"text/xml\"\n // );\n // };\n // } else if (\n // typeof window.ActiveXObject != \"undefined\" &&\n // new window.ActiveXObject(\"Microsoft.XMLDOM\")\n // ) {\n // this._DOMParser = function (xmlStr) {\n // var xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n // xmlDoc.async = \"false\";\n // xmlDoc.loadXML(xmlStr);\n // return xmlDoc;\n // };\n // } else {\n // throw new Error(\"No XML parser found\");\n // }\n // }\n // // find any references to our generic shapes\n // let xml = this._DOMParser(this.xmlDefinition);\n // const genericShapes = [\n // \"bpmn2:startEvent\",\n // \"bpmn2:task\",\n // \"bpmn2:endEvent\",\n // ];\n // genericShapes.forEach((s) => {\n // let allElements = xml.getElementsByTagName(s);\n // for (let x = 0; x < allElements.length; x++) {\n // // if we don't know about this shape\n // let ele = allElements[x];\n // let myEle = this.elementForDiagramID(allElements[x].id);\n // if (!myEle) {\n // this.unknownShape(allElements[x]);\n // }\n // }\n // });\n // // if any unknown shapes have been reported:\n // if (this._unknownShapes.length) {\n // allWarnings.push({\n // message: \"Generic Tasks still undefined.\",\n // data: {},\n // });\n // }\n //\n // return allWarnings;\n }\n};\n","const ABViewManagerCore = require(\"../core/ABViewManagerCore\");\nconst ClassManager = require(\"./ABClassManager\");\n\nmodule.exports = class ABViewManager extends ABViewManagerCore {\n /**\n * @function newView\n * return an instance of an ABView based upon the values.key value.\n * @return {ABView}\n */\n static newView(values, application, parent) {\n parent = parent || null;\n\n // check to see if this is a plugin view\n if (values.plugin_key) {\n // If this is from a plugin, create it from ClassManager\n return ClassManager.viewCreate(\n values.plugin_key,\n values,\n application,\n parent\n );\n }\n\n return super.newView(values, application, parent);\n }\n};\n","const ABViewManagerMobileCore = require(\"../core/ABViewManagerMobileCore\");\n\nmodule.exports = class ABViewManagerMobile extends ABViewManagerMobileCore {};\n","var L = null;\n// multilingual Label fn()\n\nmodule.exports = class CSVImporter {\n constructor(Label) {\n // {ABMultilingual.label()} function.\n //\n if (!L) {\n L = Label;\n\n // if this was a v1: App param:\n if (Label.Label) {\n L = Label.Label;\n }\n }\n }\n\n /**\n * @method getSeparateItems()\n * Return the options of how the CSV values are separated.\n * @return {array} [ {id, value} ... ]\n */\n getSeparateItems() {\n return [\n { id: \",\", value: L(\"Comma (,)\") },\n { id: \"\\t\", value: L(\"Tab (      )\") },\n { id: \";\", value: L(\"Semicolon (;)\") },\n { id: \"s\", value: L(\"Space ( )\") },\n ];\n }\n\n /**\n * @method validateFile\n * Validate file extension\n * @param {*} fileInfo\n * https://docs.webix.com/api__ui.uploader_onbeforefileadd_event.html\n * @return {boolean}\n */\n validateFile(fileInfo) {\n if (!fileInfo || !fileInfo.file || !fileInfo.file.type) return false;\n\n // validate file type\n let extensionType = fileInfo.file.type.toLowerCase();\n if (\n extensionType == \"text/csv\" ||\n extensionType == \"application/vnd.ms-excel\"\n ) {\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @method getDataRows\n * Pull data rows from the CSV file\n *\n * @param {Object} fileInfo - https://docs.webix.com/api__ui.uploader_onbeforefileadd_event.html\n * @param {string} separatedBy\n *\n * @return {Promise} -[\n * \t\t\t\t\t\t[\"Value 1.1\", \"Value 1.2\", \"Value 1.3\"],\n * \t\t\t\t\t\t[\"Value 2.1\", \"Value 2.2\", \"Value 2.3\"],\n * \t\t\t\t\t]\n */\n getDataRows(fileInfo, separatedBy) {\n if (!this.validateFile(fileInfo)) return Promise.reject();\n\n return new Promise((resolve, reject) => {\n // read CSV file\n let reader = new window.FileReader();\n reader.onload = (e) => {\n let result = [];\n\n // split lines\n let dataRows = reader.result\n .split(/\\r\\n|\\n|\\r/) // CRLF = \\r\\n; LF = \\n; CR = \\r;\n .filter((row) => row && row.length > 0);\n\n // split columns\n (dataRows || []).forEach((row) => {\n let dataCols = [];\n if (separatedBy == \",\") {\n // NOTE: if the file contains ,, .match() can not reconize this empty string\n row = row.replace(/,,/g, \", ,\");\n\n // https://stackoverflow.com/questions/11456850/split-a-string-by-commas-but-ignore-commas-within-double-quotes-using-javascript#answer-11457952\n dataCols = row.match(/(\".*?\"|[^\",]+)(?=\\s*,|\\s*$)/g);\n } else {\n dataCols = row.split(separatedBy);\n }\n\n result.push(dataCols.map((dCol) => this.reformat(dCol)));\n });\n\n resolve(result);\n };\n reader.readAsText(fileInfo.file);\n });\n }\n\n /**\n * @method getGuessDataType\n * return our best guess of what type of data for the requested column.\n * @param {array} dataRows\n * The data we are evaluating:\n * [\n * [\"Value 1.1\", \"Value 1.2\", \"Value 1.3\"],\n * [\"Value 2.1\", \"Value 2.2\", \"Value 2.3\"],\n * \t\t ]\n * @param colIndex {Number}\n * @return {string}\n */\n getGuessDataType(dataRows, colIndex) {\n var data,\n // {various} the data pulled from the requested row/column\n repeatNum = 10;\n // {integer} how many rows do we want to scan trying to find a value\n\n // Loop to find a value\n for (var i = 1; i <= repeatNum; i++) {\n var line = dataRows[i];\n if (!line) break;\n\n data = line[colIndex];\n\n if (data != null && data.length > 0) break;\n }\n\n if (data == null || data == \"\") {\n return \"string\";\n } else if (\n data == 0 ||\n data == 1 ||\n data == true ||\n data == false ||\n data == \"checked\" ||\n data == \"unchecked\"\n ) {\n return \"boolean\";\n } else if (!isNaN(data)) {\n return \"number\";\n } else if (Date.parse(data)) {\n return \"date\";\n } else {\n // determine which type of string this might be:\n if (data.length > 100) return \"LongText\";\n else return \"string\";\n }\n }\n\n /**\n * @method reformat\n * @param {string} str\n */\n reformat(str) {\n if (!str) return \"\";\n\n return str.trim().replace(/\"/g, \"\").replace(/'/g, \"\");\n }\n};\n","const FilterComplexCore = require(\"../core/FilterComplexCore\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\n/**\n * @function _toInternal()\n * translate our external QB conditions into our internal format that\n * makes the cond.rule unique by adding the field.id to the rule.\n * @param {obj} cond - {\n * rules: [\n * {\n * alias: string || undefined,\n * key: uuid,\n * rule: string,\n * value: object,\n * }\n * ]\n * }\n * the QB condition format we use exernally in our AB system.\n */\nfunction _toInternal(cond, fields = []) {\n if (!cond) return;\n if (cond.key) {\n // Convert to format\n // {\n // glue: \"and\",\n // rules: [\n // {\n // field: \"test_col\",\n // condition: { type: \"greater\", filter: 100 },\n // },\n // ],\n // }\n const field = fields.filter((f) => f.id == cond.key)[0];\n cond.field = field?.id;\n\n cond.condition = {\n type: cond.rule,\n filter: cond.value,\n };\n\n if (Array.isArray(cond.value)) cond.includes = cond.value;\n if (\n cond.rule === \"in_query_field\" ||\n cond.rule === \"not_in_query_field\"\n ) {\n cond.includes = cond.value.split(\":\");\n }\n\n // else cond.includes = cond.value?.split?.(/,|:/) ?? [];\n\n // if (field?.key == \"date\" || field?.key == \"datetime\") {\n // cond.condition.filter = cond.condition.filter\n // ? AB.rules.toDate(cond.condition.filter)\n // : null;\n //\n // cond.includes = cond.includes.map((v) => AB.rules.toDate(v));\n // }\n\n delete cond.key;\n delete cond.rule;\n delete cond.value;\n }\n\n if (cond.rules && cond.rules.length) {\n (cond.rules ?? []).forEach((r) => {\n _toInternal(r, fields);\n });\n }\n}\n\n/**\n * @function _toExternal()\n * translate our internal QB conditions into our external format that\n * where the cond.rule no longer has the field.id.\n * @param {obj} cond - {\n * glue: \"and\",\n * rules: [\n * {\n * field: \"test_col\",\n * condition: { type: \"greater\", filter: 100 },\n * },\n * ],\n * }\n * the QB condition format we use internally\n */\nfunction _toExternal(cond, fields = []) {\n if (!cond) return;\n if (cond.field) {\n let field = fields.filter((f) => f.id == cond.field)[0];\n // cond.alias = alias || undefined;\n cond.key = field?.id ?? cond.field;\n cond.condition = cond.condition ?? {};\n cond.rule = cond.condition.type;\n\n let values =\n cond.includes?.map((v) => (v instanceof Date ? v.toISOString() : v)) ??\n [];\n\n // Convert multi-values to a string\n if (cond.condition.filter) {\n if (cond.condition.filter instanceof Date) {\n if (values.indexOf(cond.condition.filter.toISOString()) < 0) {\n values.push(cond.condition.filter);\n }\n } else if (values.indexOf(cond.condition.filter) < 0)\n values.push(cond.condition.filter);\n }\n\n if (cond.rule === \"is_current_date\") {\n cond.value = AB.rules.getUTCDayTimeRange();\n } else if (\n cond.rule === \"in_query_field\" ||\n cond.rule === \"not_in_query_field\"\n ) {\n cond.value =\n cond.includes?.length == 2 ? cond.includes.join(\":\") : null;\n } else {\n cond.value = values\n .map((v) => {\n // Convert date format\n if (\n field &&\n (field.key === \"date\" || field.key === \"datetime\") &&\n cond.rule != \"last_days\"\n ) {\n return field.exportValue(new Date(v));\n }\n return v;\n })\n .join(\",\");\n }\n\n delete cond.field;\n delete cond.type;\n delete cond.includes;\n delete cond.condition;\n }\n\n if (cond.rules && cond.rules.length) {\n (cond.rules ?? []).forEach((r) => {\n _toExternal(r, fields);\n });\n }\n}\n\nfunction _uiQueryOptionId(fieldId) {\n return `byQueryField-query-option-${fieldId}`;\n}\n\nfunction _uiFieldOptionId(fieldId) {\n return `byQueryField-field-option-${fieldId}`;\n}\n\nmodule.exports = class FilterComplex extends FilterComplexCore {\n constructor(idBase, AB, options = {}) {\n idBase = idBase ?? \"ab_filterComplex\";\n\n super(idBase, AB);\n\n this._options = options ?? {};\n\n this._initComplete = false;\n // {bool}\n // trying to prevent multiple .init() from being called due to\n // various ways of initializing the component.\n\n this.observing = false;\n // {bool}\n // try to prevent multiple observers generating >1 \"changed\"\n // event.\n\n let labels = (this.labels = {\n common: (AB._App ?? {}).labels,\n component: {\n and: L(\"And\"),\n or: L(\"Or\"),\n\n thisObject: L(\"This Object\"),\n inQuery: L(\"In Query\"),\n notInQuery: L(\"Not In Query\"),\n inQueryField: L(\"By Query Field\"),\n notInQueryField: L(\"Not By Query Field\"),\n\n inQueryFieldQueryPlaceholder: L(\"Choose a Query\"),\n inQueryFieldFieldPlaceholder: L(\"Choose a Field\"),\n\n sameAsUser: L(\"Same As User\"),\n notSameAsUser: L(\"Not Same As User\"),\n\n sameAsField: L(\"Same As Field\"),\n notSameAsField: L(\"Not Field\"),\n\n inDataCollection: L(\"In Data Collection\"),\n notInDataCollection: L(\"Not In Data Collection\"),\n\n containsCondition: L(\"contains\"),\n notContainsCondition: L(\"doesn't contain\"),\n isCondition: L(\"is\"),\n isNotCondition: L(\"is not\"),\n isEmpty: L(\"is empty\"),\n isNotEmpty: L(\"is not empty\"),\n isCurrentDateCondition: L(\"is current date\"),\n beforeCondition: L(\"is before\"),\n afterCondition: L(\"is after\"),\n onOrBeforeCondition: L(\"is on or before\"),\n onOrAfterCondition: L(\"is on or after\"),\n beforeCurrentCondition: L(\"is before current date\"),\n afterCurrentCondition: L(\"is after current date\"),\n onOrBeforeCurrentCondition: L(\"is on or before current date\"),\n onOrAfterCurrentCondition: L(\"is on or after current date\"),\n onLastDaysCondition: L(\"last ... days\"),\n onNextDaysCondition: L(\"next ... days\"),\n\n equalCondition: L(\":\"),\n notEqualCondition: L(\"≠\"),\n lessThanCondition: L(\"<\"),\n moreThanCondition: L(\">\"),\n lessThanOrEqualCondition: L(\"≤\"),\n moreThanOrEqualCondition: L(\"≥\"),\n\n equalListCondition: L(\"equals\"),\n notEqualListCondition: L(\"does not equal\"),\n\n checkedCondition: L(\"is checked\"),\n notCheckedCondition: L(\"is unchecked\"),\n\n isCurrentUserCondition: L(\"is current user\"),\n isNotCurrentUserCondition: L(\"is not current user\"),\n containsCurrentUserCondition: L(\"contains current user\"),\n notContainsCurrentUserCondition: L(\"does not contain current user\"),\n\n isCurrentUserEmailCondition: L(\"is current user's email\"),\n isNotCurrentUserEmailCondition: L(\"is not current user's email\"),\n\n contextDefaultOption: L(\"choose option\"),\n equalsProcessValue: L(\"equals process value\"),\n notEqualsProcessValueCondition: L(\"not equals process value\"),\n inProcessValueCondition: L(\"in process value\"),\n notInProcessValueCondition: L(\"not in process value\"),\n },\n });\n\n // internal list of Webix IDs to reference our UI components.\n let ids = (this.ids = {\n popup: this.unique(`${idBase}_popup`),\n querybuilder: this.unique(`${idBase}_querybuilder`),\n save: this.unique(`${idBase}_save`),\n });\n\n // Set current username\n this.Account.username = this.AB.Account.username();\n\n this._settings.recordRuleFieldOptions = [];\n\n // webix UI definition:\n this.ui = {\n rows: [\n {\n view: \"layout\",\n type: \"clean\",\n borderless: this._options.borderless ?? true,\n rows: [\n {\n id: ids.querybuilder,\n view: \"query\",\n data: () => [],\n // data: async (field) => await this.pullOptions(field),\n fields: [],\n disabled: true,\n height: this._options.height,\n },\n ],\n },\n {\n id: ids.save,\n view: \"button\",\n css: \"webix_primary\",\n value: L(\"Save\"),\n hidden: this._options.isSaveHidden ?? false,\n click: () => {\n if (this.myPopup) this.myPopup.hide();\n this.emit(\"save\", this.getValue());\n },\n },\n ],\n };\n }\n\n // setting up UI\n init(options) {\n if (this._initComplete) return;\n\n super.init(options);\n\n const el = $$(this.ids.querybuilder);\n\n if (el) {\n if (!this.observing) {\n this.__blockOnChange = true;\n el.getState().$observe(\"value\", (v) => {\n if (this.__blockOnChange) return false;\n\n this.emit(\"changed\", this.getValue());\n });\n this.__blockOnChange = false;\n\n // HACK!! The process of setting the $observe() is actually\n // calling the cb() when set. This is clearing our .condition\n // if we call init() after we have setValues(). which can happen\n // when using the popUp() method.\n let _cond = this.condition;\n this.condition = _cond;\n this.observing = true;\n }\n this._initComplete = true;\n }\n }\n\n /**\n * @method isValid\n * validate the row data is valid filter condition\n *\n * @param rowData {Object} - data row\n * @param condition {Object} - [Optional] {\n * glue: \"and\" | \"or\",\n * rules: []\n * }\n */\n isValid(rowData, condition = this.condition) {\n let helper = () => true;\n\n let $query = $$(this.ids.querybuilder);\n if ($query) {\n helper = $query.getFilterFunction();\n return helper(rowData);\n } else {\n return super.isValid(rowData, condition);\n }\n }\n\n /**\n * @method isConditionComplete()\n * Check a given condition entry and indicate if it is fully\n * filled out.\n * @param {obj} cond\n * The Condition object we are checking. If a Macro\n * condition if provided: { glue:\"and\", rules:[] } then\n * this method will return True/False if All rules are\n * complete.\n * If an individual rule is provided, then it evaluates\n * the completness of that rule. { key, rule, value }\n * @return {bool}\n */\n isConditionComplete(cond) {\n if (!cond) return false;\n\n let isComplete = true;\n // start optimistically.\n\n if (cond?.glue) {\n (cond.rules ?? []).forEach((r) => {\n isComplete = isComplete && this.isConditionComplete(r);\n });\n } else {\n // every condition needs a .key & .rule\n if (!cond.key || cond.key == \"\") {\n isComplete = false;\n }\n\n if (!cond.rule || cond.rule == \"\") {\n isComplete = false;\n }\n\n if (isComplete) {\n switch (cond.rule) {\n case \"is_current_user\":\n case \"is_not_current_user\":\n case \"contain_current_user\":\n case \"not_contain_current_user\":\n case \"is_current_email\":\n case \"is_not_current_email\":\n case \"same_as_user\":\n case \"not_same_as_user\":\n case \"less_current\":\n case \"greater_current\":\n case \"less_or_equal_current\":\n case \"greater_or_equal_current\":\n case \"is_empty\":\n case \"is_not_empty\":\n case \"checked\":\n case \"unchecked\":\n case \"is_current_date\":\n // There are only a few rules that don't need a\n // value\n break;\n\n case \"in_data_collection\":\n case \"not_in_data_collection\":\n // a value needs to exist\n if (!cond.value || cond.value == \"\") {\n isComplete = false;\n }\n // and it needs to reference a valid DC\n if (isComplete) {\n let dc = this.AB.datacollectionByID(cond.value);\n if (!dc) {\n isComplete = false;\n }\n }\n break;\n\n case \"in_query\":\n case \"not_in_query\":\n // a value needs to exist\n if (!cond.value || cond.value == \"\") {\n isComplete = false;\n }\n // and it needs to reference a valid query\n if (isComplete) {\n let query = this.AB.queryByID(cond.value);\n if (!query) {\n isComplete = false;\n }\n }\n break;\n\n case \"in_query_field\":\n case \"not_in_query_field\":\n // a value needs to exist\n if (!cond.value || cond.value == \"\") {\n isComplete = false;\n }\n // and it needs to reference a valid query\n if (isComplete) {\n let queryId = cond.value.split(\":\")[0],\n fieldId = cond.value.split(\":\")[1];\n let query = this.AB.queryByID(queryId);\n if (!query) {\n isComplete = false;\n } else {\n // and a valid field\n let field = query.fieldByID(fieldId);\n if (!field) {\n isComplete = false;\n }\n }\n }\n break;\n\n default:\n // The rest do need a .value\n if (!cond.value || cond.value == \"\") {\n isComplete = false;\n }\n break;\n }\n }\n }\n\n return isComplete;\n }\n\n setValue(settings) {\n super.setValue(settings);\n this.condition = settings;\n\n const el = $$(this.ids.querybuilder);\n if (el) {\n if (!settings) {\n // Clear settings value of webix.query\n el.define(\"value\", {\n glue: \"and\",\n rules: [],\n });\n return;\n }\n\n let qbSettings = this.AB.cloneDeep(settings);\n\n // Settings should match a condition built upon our QB format:\n // {\n // glue:\"and\",\n // rules:[\n // {\n // key:\"uuid\",\n // rule:\"\",\n // value:\"\"\n // }\n // ]\n // }\n // externally our key should be the field.id and the rules should be\n // the \"contains\", \"not_contains\", \"equal\" ... keywords.\n // However, internally, we convert these rules into .ids that are\n // unique for each field (see uiInit()). So when we bring in settings\n // we need to translate them into our internal format:\n\n _toInternal(qbSettings, this._Fields);\n\n this.__blockOnChange = true;\n el.define(\"value\", qbSettings);\n this.__blockOnChange = false;\n }\n }\n\n getValue() {\n if ($$(this.ids.querybuilder)) {\n let settings = this.AB.cloneDeep(\n $$(this.ids.querybuilder).getState().value ?? {}\n );\n\n // what we pull out of the QB will have .rules in our internal format:\n // {field.id}_{rule} (see uiInit() )\n // But we need to store them in our generic QB format for use outside\n // our FilterComplex widget.\n _toExternal(settings, this._Fields);\n this.condition = settings;\n }\n\n return super.getValue();\n }\n\n fieldsLoad(fields = [], object = null) {\n super.fieldsLoad(fields, object);\n // Format date types\n fields.forEach((f) => {\n if (f.type === \"date\")\n f.format = (v) => this.AB.Webix.il8n.dateFormatStr(v);\n });\n this.uiInit();\n }\n\n toShortHand() {\n return \"Add Filters\";\n }\n\n uiInit() {\n this.uiQueryCustomValue();\n\n let el = $$(this.ids.querybuilder);\n if (el) {\n // Clear fields\n while (el.config.fields.length > 0) {\n el.config.fields.pop();\n }\n // Set fields\n (this.fieldsToQB() ?? []).forEach((f) => {\n el.config.fields.push(f);\n });\n if (el.config.fields.length) {\n el.enable();\n } else {\n this.setValue(\"\");\n el.disable();\n }\n }\n }\n\n // HACK: have to overwrite Webix Query's function to support our custom input requirement.\n // HooWoo\n uiQueryCustomValue() {\n const $el = $$(this.ids.querybuilder);\n if (!$el) return;\n\n const _this = this;\n const $filterView = $el.$app.require(\"jet-views\", \"filter\");\n\n if (!this._fnBaseGetValue)\n this._fnBaseGetValue = $filterView.prototype.GetValue;\n $filterView.prototype.GetValue = function () {\n const rule = _this._fnBaseGetValue.call(this);\n if (!rule) {\n // Not sure if its a problem, so report in case it is.\n _this.AB.notify.developer(new Error(\"No rule found\"), {\n context: \"No rule from $filterView.GetValue()\",\n });\n return;\n }\n\n if (\n rule.condition.type == \"in_query_field\" ||\n rule.condition.type == \"not_in_query_field\"\n ) {\n const queryOptId = _uiQueryOptionId(rule.field);\n const fieldOptId = _uiFieldOptionId(rule.field);\n const selectedQueryId = $$(queryOptId)?.getValue();\n const selectedFieldId = $$(fieldOptId)?.getValue();\n\n if (selectedQueryId && selectedFieldId) {\n rule.includes = [selectedQueryId, selectedFieldId];\n }\n }\n\n return rule;\n };\n\n // window.query.views.filter.prototype.CreateFilter = (\n $filterView.prototype.CreateFilter = async function (\n fieldId,\n type,\n format,\n conditions,\n place\n ) {\n let inputs = _this.uiValue(fieldId);\n\n let ui = {\n id: place.config.id,\n view: \"filter\",\n localId: \"filter\",\n conditions: conditions,\n field: fieldId,\n mode: type,\n template: function (o) {\n let str = o[fieldId];\n let parser =\n format ?? (type == \"date\" ? webix.i18n.dateFormatStr : null);\n if (parser) str = parser(str);\n return str;\n },\n inputs: inputs,\n margin: 6,\n };\n\n let filter = webix.ui(ui, place);\n\n // NOTE: Need this to have filter.config.value?.includes value\n // let data = [];\n if ($el) {\n await $el.$app.getService(\"backend\").data(fieldId);\n // data = await $query.getService(\"backend\").data(fieldId);\n }\n // filter.parse(data);\n\n // Populate options of \"in_query_field\" and \"not_in_query_field\"\n if (\n conditions.filter(\n (cond) =>\n cond.id == \"in_query_field\" || cond.id == \"not_in_query_field\"\n ).length &&\n filter.config.value?.includes?.length == 2\n ) {\n // inputs = _this.uiValue(fieldId, filter.config.value.includes);\n // filter.define(\"inputs\", inputs);\n const queryOptId = _uiQueryOptionId(fieldId);\n const fieldOptId = _uiFieldOptionId(fieldId);\n const $queryOpt = $$(queryOptId);\n const $fieldOpt = $$(fieldOptId);\n const vals = filter.config.value?.includes ?? [];\n if (vals?.length > 1 && $queryOpt && $fieldOpt) {\n $queryOpt.setValue(vals[0]);\n $fieldOpt.setValue(vals[1]);\n $queryOpt.refresh();\n $fieldOpt.refresh();\n }\n }\n\n return filter;\n };\n }\n\n uiValue(fieldColumnName, defaultValue = null) {\n let result;\n\n // Special case: this_object\n if (fieldColumnName == \"this_object\") {\n return []\n .concat(this.uiQueryValue(\"this_object\"))\n .concat(this.uiDataCollectionValue(\"this_object\"))\n .concat(this.uiCustomValue(\"this_object\"))\n .concat(this.uiContextValue(\"this_object\", \"uuid\"));\n }\n\n let field = (this._Fields ?? []).filter(\n (f) => f.id == fieldColumnName\n )[0];\n\n switch (field?.key) {\n case \"boolean\":\n result = this.uiNoneValue(field);\n break;\n case \"connectObject\":\n result = []\n .concat(this.uiQueryValue(field))\n .concat(this.uiUserValue(field))\n .concat(this.uiDataCollectionValue(field))\n .concat(this.uiContextValue(field))\n .concat(this.uiNoneValue());\n break;\n case \"date\":\n case \"datetime\":\n result = [\"datepicker\", \"daterangepicker\"]\n .concat(this.uiNoneValue())\n .concat(this.uiContextValue(field));\n break;\n case \"list\":\n result = this.uiListValue(field);\n break;\n case \"user\":\n result = []\n .concat(this.uiNoneValue())\n .concat(this.uiUserValue(field));\n break;\n // case \"number\":\n // result = [\"text\"];\n // break;\n case \"string\":\n case \"LongText\":\n case \"email\":\n result = this.uiNoneValue();\n break;\n }\n\n // Add filter options to Custom index\n const LinkType = `${field?.settings?.linkType}:${field?.settings?.linkViaType}`;\n if (\n // 1:M\n LinkType == \"one:many\" ||\n // 1:1 isSource = true\n (LinkType == \"one:one\" && field?.settings?.isSource)\n ) {\n result = result ?? [];\n\n if (field?.settings?.isCustomFK)\n result = result.concat(this.uiTextValue(field));\n\n result = result.concat(this.uiQueryFieldValue(field, defaultValue));\n } else if (field?.key != \"connectObject\") {\n result = (result ?? [])\n .concat(this.uiTextValue(field))\n .concat(this.uiQueryFieldValue(field, defaultValue))\n .concat(this.uiContextValue(field));\n }\n // Special case: from Process builder\n // .processFieldsLoad()\n else if (fieldColumnName.indexOf(\"uuid\") > -1) {\n result = this.uiContextValue(null, fieldColumnName);\n }\n\n if (this._settings.isRecordRule) {\n result = (result ?? []).concat(this.uiRecordRuleValue(field));\n }\n\n result = (result ?? []).concat(this.uiCustomValue(field));\n\n return result;\n }\n\n uiNoneValue() {\n return [\n {\n batch: \"none\",\n borderless: true,\n view: \"template\",\n template: \"\",\n },\n ];\n }\n\n uiBooleanValue(field) {\n return [\n {\n batch: \"boolean\",\n view: \"checkbox\",\n },\n ];\n }\n\n uiTextValue(field) {\n return [\n {\n batch: \"text\",\n view: \"text\",\n on: {\n onAfterRender: function () {\n // HACK: focus on webix.text and webix.textarea\n // Why!! If the parent layout has zIndex lower than 101,\n // then is not able to focus to webix.text and webix.textarea\n let $layout =\n this.queryView(function (a) {\n return !a.getParentView();\n }, \"parent\") ?? this;\n $layout.$view.style.zIndex = 202;\n },\n },\n },\n ];\n }\n\n uiQueryValue(field) {\n let options = [];\n\n let isQueryField =\n this._QueryFields?.filter((f) => f.id == field.id).length > 0;\n\n // populate the list of Queries for this_object:\n if (field == \"this_object\" && this._Object) {\n options = this.queries((q) => q.canFilterObject(this._Object));\n }\n // populate the list of Queries for a query field\n else if (isQueryField) {\n options = this.queries(\n (q) =>\n (this._Object ? this._Object.id : \"\") != q.id && // Prevent filter looping\n q.canFilterObject(field.datasourceLink)\n );\n }\n\n options?.forEach((q) => {\n options.push({\n id: q.id,\n value: q.label,\n });\n });\n\n return [\n {\n batch: \"query\",\n view: \"combo\",\n options: options ?? [],\n },\n ];\n }\n\n uiListValue(field) {\n return [\n {\n batch: \"list\",\n view: \"combo\",\n options: field?.settings?.options?.map(function (x) {\n return {\n id: x.id,\n value: x.text,\n };\n }),\n },\n ];\n }\n\n uiUserValue(field) {\n return [\n {\n batch: \"user\",\n view: \"combo\",\n options: this.AB.Account.userList().map((u) => {\n return {\n id: u.username,\n value: u.username,\n };\n }),\n },\n ];\n }\n\n uiDataCollectionValue(field) {\n let linkObjectId;\n if (field == \"this_object\" && this._Object) {\n linkObjectId = this._Object.id;\n } else {\n linkObjectId = field?.settings?.linkObject;\n }\n\n return [\n {\n batch: \"datacollection\",\n view: \"combo\",\n options: linkObjectId\n ? this.AB.datacollections(\n (dc) => dc?.datasource?.id == linkObjectId\n ).map((dc) => {\n return {\n id: dc.id,\n value: dc.label,\n };\n })\n : [],\n },\n ];\n }\n\n uiQueryFieldValue(field, defaultValue) {\n // ABQuery Options\n const qOpts = this.queries(\n (q) => this._Object == null || q.id != this._Object.id\n ).map((q) => {\n return {\n id: q.id,\n value: q.label,\n };\n });\n\n const pullFieldOption = (queryId) => {\n const options = [];\n\n // Get fields of the query\n const Query = this.AB.queryByID(queryId);\n if (Query) {\n Query.fields((f) => !f.isConnection).forEach((q) => {\n options.push({\n id: q.id,\n value: `${q.object.label}.${q.label}`,\n });\n });\n }\n\n return options;\n };\n\n const refreshFieldOption = ($queryOpt, queryId) => {\n const options = pullFieldOption(queryId);\n\n // Update UI\n if ($queryOpt) {\n const $queryContainer = $queryOpt.getParentView();\n const $fieldOption = $queryContainer.getChildViews()[1];\n $fieldOption?.define(\"options\", options);\n $fieldOption?.refresh();\n }\n };\n\n let queryId;\n let fieldId;\n let fieldOptions = [];\n if (defaultValue?.length == 2) {\n queryId = defaultValue[0];\n fieldId = defaultValue[1];\n\n fieldOptions = pullFieldOption(queryId);\n }\n\n return [\n {\n batch: \"queryField\",\n view: \"form\",\n borderless: true,\n padding: 0,\n elements: [\n {\n id: _uiQueryOptionId(field?.id),\n name: \"query\",\n view: \"combo\",\n placeholder:\n this.labels.component.inQueryFieldQueryPlaceholder,\n options: qOpts,\n value: queryId,\n on: {\n onChange: function (qVal) {\n refreshFieldOption(this, qVal);\n },\n },\n },\n {\n id: _uiFieldOptionId(field?.id),\n name: \"field\",\n view: \"combo\",\n placeholder: L(\"Choose a Field\"),\n options: fieldOptions,\n value: fieldId,\n },\n ],\n },\n ];\n }\n\n uiRecordRuleValue(field) {\n return [\n {\n batch: \"recordRule\",\n view: \"select\",\n options: this._settings.recordRuleFieldOptions ?? [],\n },\n ];\n }\n\n uiContextValue(field, processFieldKey = null) {\n const processFields = (this._ProcessFields ?? [])\n .filter((pField) => {\n if (!pField) return false;\n\n let result = false;\n switch (field) {\n case \"this_object\":\n result =\n this._Object.id === pField.object?.id && !pField.field;\n\n break;\n\n default:\n switch (field.key) {\n case \"boolean\":\n result = [\"boolean\"].includes(pField.field?.key);\n\n break;\n\n case \"connectObject\":\n result =\n field.settings.linkObject ===\n (pField.field?.object.id ?? pField.object.id);\n\n if (!field.settings.isCustomFK) {\n result = result && !pField.field;\n\n break;\n }\n\n result =\n result &&\n (field.settings.indexField ||\n field.settings.indexField2) === pField.field?.id;\n\n break;\n\n case \"date\":\n case \"datetime\":\n result = [\"date\", \"datetime\"].includes(\n pField.field?.key\n );\n\n break;\n\n case \"calculate\":\n case \"formula\":\n case \"number\":\n result = [\"calculate\", \"formula\", \"number\"].includes(\n pField.field?.key\n );\n\n break;\n\n case \"string\":\n case \"LongText\":\n case \"email\":\n case \"AutoIndex\":\n case \"list\":\n result = [\n \"string\",\n \"LongText\",\n \"email\",\n \"AutoIndex\",\n \"list\",\n ].includes(pField.field?.key);\n\n break;\n\n case \"user\":\n result = [\"user\"].includes(pField.field?.key);\n\n break;\n\n default:\n if (pField.key) {\n // uuid\n const processFieldId = pField.key.split(\".\").pop();\n\n result =\n processFieldId === field.id ||\n processFieldId === field.key ||\n processFieldId === processFieldKey ||\n pField.key === processFieldKey;\n }\n\n break;\n }\n\n break;\n }\n\n return result;\n })\n .map((e) => {\n return {\n id: e.key,\n value: L(\"context({0})\", [e.label]),\n };\n });\n\n if (!processFields) return [];\n\n return [\n {\n batch: \"context\",\n view: \"select\",\n options: [\n {\n id: \"empty\",\n value: this.labels.component.contextDefaultOption,\n },\n ...processFields,\n ],\n },\n ];\n }\n\n uiCustomValue(field) {\n if (!field) return [];\n\n const customOptions = this._customOptions ?? {};\n const options = customOptions[field.id ?? field] ?? {};\n return options.values ?? [];\n }\n\n popUp(...options) {\n const condition = Object.assign({}, this.condition);\n\n if (!this.myPopup) {\n let ui = {\n id: this.ids.popup,\n view: \"popup\",\n height: 400,\n width: 800,\n body: this.ui,\n };\n\n if (!$$(this.ids.popup)) {\n this.myPopup = webix.ui(ui);\n this.init(this._settings);\n if (this._Fields) {\n this.fieldsLoad(this._Fields, this._Object);\n }\n\n // NOTE: do this, before the .setValue() operation, as we need to have\n // our fields and filters defined BEFORE a setValue() is performed.\n // this.uiInit();\n\n if (condition) {\n this.setValue(condition);\n }\n\n this.myPopup.show(...options);\n } else {\n $$(this.ids.popup).show(...options);\n }\n } else {\n this.myPopup.show(...options);\n }\n }\n\n /**\n * @method addCustomOption\n *\n * @param {string|uuid} fieldId\n * @param {Object} options - {\n * conditions: [],\n * values: []\n * }\n */\n addCustomOption(fieldId, options = {}) {\n this._customOptions = this._customOptions ?? {};\n this._customOptions[fieldId] = options;\n }\n};\n","const RowFilterCore = require(\"../core/RowFilterCore\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class RowFilter extends RowFilterCore {\n constructor(App, idBase, AB) {\n super(App, idBase, AB);\n\n console.error(\"TODO: Switch RowFilter => FilterComplex\");\n\n // internal list of Webix IDs to reference our UI components.\n let ids = (this.ids = {\n component: this.unique(`${idBase}_rowFilter`),\n filterForm: this.unique(`${idBase}_rowFilter_form`),\n addNewFilter: this.unique(`${idBase}_rowFilter_addNewFilter`),\n\n glue: this.unique(`${idBase}_rowFilter_glue`),\n field: this.unique(`${idBase}_rowFilter_field`),\n rule: this.unique(`${idBase}_rowFilter_rule`),\n inputValue: this.unique(`${idBase}_rowFilter_inputValue`),\n\n queryCombo: this.unique(`${idBase}_rowFilter_queryCombo`),\n queryFieldCombo: this.unique(`${idBase}_rowFilter_queryFieldCombo`),\n queryFieldComboQuery: this.unique(\n `${idBase}_rowFilter_queryFieldComboQuery`\n ),\n queryFieldComboField: this.unique(\n `${idBase}_rowFilter_queryFieldComboField`\n ),\n fieldMatch: this.unique(`${idBase}_rowFilter_fieldMatchCombo`),\n\n dataCollection: this.unique(`${idBase}_rowFilter_dataCollection`),\n\n listOptions: this.unique(`${idBase}_rowFilter_listOptions`),\n\n datePicker: this.unique(`${idBase}_rowFilter_datePicker`),\n });\n\n // Set current username\n // this.Account.username = this.AB.Account.username();\n\n var batchName; // we need to revert to this default when switching away from a in/by query field\n\n // Default options list to push to all fields\n this.queryFieldOptions = [\n {\n value: L(\"By Query Field\"),\n id: \"in_query_field\",\n },\n {\n value: L(\"Not In Query\"),\n id: \"not_in_query_field\",\n },\n ];\n\n this.recordRuleOptions = [];\n this.recordRuleFieldOptions = [];\n\n let _logic = this._logic || {};\n\n /**\n * @method getFieldList\n * return field list to render options\n */\n _logic.getFieldList = () => {\n return (this._Fields || []).map((f) => {\n let label = f.label;\n\n // include object's name to options\n if (this._settings.showObjectName && f.object) {\n label = f.object.label + \".\" + f.label;\n }\n\n return {\n id: f.id,\n value: label,\n alias: f.alias || undefined, // ABObjectQuery\n };\n });\n };\n\n _logic.getFilterUI = () => {\n let instance = this;\n let config_settings = this.config_settings || {};\n\n return {\n id: \"f\" + webix.uid(),\n isolate: true,\n cols: [\n {\n // Add / Or\n view: \"combo\",\n id: ids.glue,\n width: 80,\n value: config_settings.glue || \"and\",\n options: [\n {\n value: L(\"And\"),\n id: \"and\",\n },\n {\n value: L(\"Or\"),\n id: \"or\",\n },\n ],\n on: {\n onChange: function (newVal, oldVal) {\n _logic.selectCombineCondition(newVal);\n },\n },\n },\n {\n // Field list\n view: \"combo\",\n id: ids.field,\n suggest: {\n on: {\n onBeforeShow: function () {\n this.define(\"width\", 400);\n this.resize();\n },\n },\n data: _logic.getFieldList(),\n },\n on: {\n onChange: function (columnId) {\n var $viewCond = this.getParentView();\n _logic.selectField(columnId, $viewCond);\n },\n },\n },\n // Comparer\n {\n id: ids.rule,\n width: 220,\n cells: [\n {},\n // Query\n {\n batch: \"query\",\n view: \"combo\",\n value: \"in_query\",\n options: [\n {\n value: L(\"In Query\"),\n id: \"in_query\",\n },\n {\n value: L(\"Not In Query\"),\n id: \"not_in_query\",\n },\n {\n value: L(\"contains\"),\n id: \"contains\",\n },\n {\n value: L(\"doesn't contain\"),\n id: \"not_contains\",\n },\n {\n value: L(\"is\"),\n id: \"equals\",\n },\n {\n value: L(\"is not\"),\n id: \"not_equal\",\n },\n {\n value: L(\"is empty\"),\n id: \"is_empty\",\n },\n {\n value: L(\"is not empty\"),\n id: \"is_not_empty\",\n },\n {\n value: L(\"Same As User\"),\n id: \"same_as_user\",\n },\n {\n value: L(\"Not Same As User\"),\n id: \"not_same_as_user\",\n },\n {\n value: L(\"In Data Collection\"),\n id: \"in_data_collection\",\n },\n {\n value: L(\"Not In Data Collection\"),\n id: \"not_in_data_collection\",\n },\n ].concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition, oldValue) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n\n // Date\n {\n batch: \"date\",\n view: \"combo\",\n value: \"less\",\n options: [\n {\n value: L(\"equals\"),\n id: \"equals\",\n },\n {\n value: L(\"does not equal\"),\n id: \"not_equal\",\n },\n {\n value: L(\"is before\"),\n id: \"less\",\n },\n {\n value: L(\"is after\"),\n id: \"greater\",\n },\n {\n value: L(\"is on or before\"),\n id: \"less_or_equal\",\n },\n {\n value: L(\"is on or after\"),\n id: \"greater_or_equal\",\n },\n {\n value: L(\"is before current date\"),\n id: \"less_current\",\n },\n {\n value: L(\"is after current date\"),\n id: \"greater_current\",\n },\n {\n value: L(\"is on or before current date\"),\n id: \"less_or_equal_current\",\n },\n {\n value: L(\"is on or after current date\"),\n id: \"greater_or_equal_current\",\n },\n {\n value: L(\"last ... days\"),\n id: \"last_days\",\n },\n {\n value: L(\"next ... days\"),\n id: \"next_days\",\n },\n {\n value: L(\"is current date\"),\n id: \"is_current_date\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n // Number\n {\n batch: \"number\",\n view: \"combo\",\n value: \"equals\",\n options: [\n {\n value: L(\":\"),\n id: \"equals\",\n },\n {\n value: L(\"≠\"),\n id: \"not_equal\",\n },\n {\n value: L(\"<\"),\n id: \"less\",\n },\n {\n value: L(\">\"),\n id: \"greater\",\n },\n {\n value: L(\"≤\"),\n id: \"less_or_equal\",\n },\n {\n value: L(\"≥\"),\n id: \"greater_or_equal\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n // List\n {\n batch: \"list\",\n view: \"combo\",\n value: \"equals\",\n options: [\n {\n value: L(\"equals\"),\n id: \"equals\",\n },\n {\n value: L(\"does not equal\"),\n id: \"not_equal\",\n },\n {\n value: L(\"Same As User\"),\n id: \"same_as_user\",\n },\n {\n value: L(\"Not Same As User\"),\n id: \"not_same_as_user\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition, oldValue) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n // Boolean\n {\n batch: \"boolean\",\n view: \"combo\",\n value: \"equals\",\n options: [\n {\n value: L(\"equals\"),\n id: \"equals\",\n },\n {\n value: L(\"does not equal\"),\n id: \"not_equal\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n // User\n {\n batch: \"user\",\n view: \"combo\",\n value: \"is_current_user\",\n options: [\n {\n value: L(\"is current user\"),\n id: \"is_current_user\",\n },\n {\n value: L(\"is not current user\"),\n id: \"is_not_current_user\",\n },\n {\n value: L(\"contains current user\"),\n id: \"contain_current_user\",\n },\n {\n value: L(\"does not contain current user\"),\n id: \"not_contain_current_user\",\n },\n {\n value: L(\"equals\"),\n id: \"equals\",\n },\n {\n value: L(\"does not equal\"),\n id: \"not_equal\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n // String\n {\n batch: \"string\",\n view: \"combo\",\n value: \"contains\",\n options: [\n {\n value: L(\"contains\"),\n id: \"contains\",\n },\n {\n value: L(\"doesn't contain\"),\n id: \"not_contains\",\n },\n {\n value: L(\"is\"),\n id: \"equals\",\n },\n {\n value: L(\"is not\"),\n id: \"not_equal\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n // Email\n {\n batch: \"email\",\n view: \"combo\",\n value: \"contains\",\n options: [\n {\n value: L(\"contains\"),\n id: \"contains\",\n },\n {\n value: L(\"doesn't contain\"),\n id: \"not_contains\",\n },\n {\n value: L(\"is\"),\n id: \"equals\",\n },\n {\n value: L(\"is not\"),\n id: \"not_equal\",\n },\n ]\n .concat(instance.queryFieldOptions)\n .concat(instance.recordRuleOptions),\n on: {\n onChange: function (condition) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer.getParentView();\n _logic.onChangeRule(condition, $viewCond);\n _logic.onChange();\n },\n },\n },\n ],\n },\n // Value\n {\n id: ids.inputValue,\n isolate: true,\n cells: [\n {\n batch: \"empty\",\n },\n\n // Query\n {\n id: ids.queryCombo,\n\n batch: \"query\",\n view: \"combo\",\n options: [],\n on: {\n onChange: _logic.onChange,\n },\n },\n\n // Query Field\n {\n id: ids.queryFieldCombo,\n batch: \"queryField\",\n rows: [\n {\n id: ids.queryFieldComboQuery,\n view: \"combo\",\n options: [],\n placeholder: L(\"Choose a Query\"),\n on: {\n onChange: function (value) {\n var $viewComparer = this.getParentView();\n var $viewCond = $viewComparer\n .getParentView()\n .getParentView();\n _logic.onChangeQueryFieldCombo(\n value,\n $viewCond\n );\n\n _logic.onChange();\n },\n },\n },\n {\n id: ids.queryFieldComboField,\n view: \"combo\",\n options: [],\n placeholder: L(\"Choose a Field\"),\n on: {\n onChange: _logic.onChange,\n },\n },\n ],\n },\n\n // Field match\n {\n id: ids.fieldMatch,\n batch: \"fieldMatch\",\n view: \"combo\",\n options: [],\n on: {\n onChange: _logic.onChange,\n },\n },\n\n // Data collection\n {\n id: ids.dataCollection,\n batch: \"dataCollection\",\n view: \"richselect\",\n options: [],\n on: {\n onChange: _logic.onChange,\n },\n },\n\n // Date\n {\n // inputView.format = field.getDateFormat();\n batch: \"date\",\n id: ids.datePicker,\n view: \"datepicker\",\n on: {\n onChange: function () {\n _logic.onChange();\n },\n },\n },\n // Number\n {\n batch: \"number\",\n view: \"text\",\n validate: webix.rules.isNumber,\n on: {\n onTimedKeyPress: function () {\n if (this.validate()) _logic.onChange();\n },\n },\n },\n // List\n {\n batch: \"list\",\n id: ids.listOptions,\n view: \"combo\",\n options: [],\n on: {\n onChange: function () {\n _logic.onChange();\n },\n },\n },\n // Boolean\n {\n batch: \"boolean\",\n view: \"checkbox\",\n on: {\n onChange: function () {\n _logic.onChange();\n },\n },\n },\n // User\n {\n batch: \"user\",\n view: \"combo\",\n options: this.AB.Account.userList().map((u) => {\n return {\n id: u.username,\n value: u.username,\n };\n }),\n on: {\n onChange: function () {\n _logic.onChange();\n },\n },\n },\n // String\n {\n batch: \"string\",\n view: \"text\",\n on: {\n onTimedKeyPress: function () {\n _logic.onChange();\n },\n },\n },\n // Email\n {\n batch: \"email\",\n view: \"text\",\n on: {\n onTimedKeyPress: function () {\n _logic.onChange();\n },\n },\n },\n ],\n },\n {\n view: \"button\",\n css: \"webix_primary\",\n icon: \"fa fa-plus\",\n type: \"icon\",\n autowidth: true,\n click: function () {\n var $viewForm = this.getFormView();\n\n var indexView = $viewForm.index(this.getParentView());\n\n _logic.addNewFilter(indexView + 1);\n },\n },\n {\n view: \"button\",\n css: \"webix_danger\",\n icon: \"fa fa-trash\",\n type: \"icon\",\n autowidth: true,\n click: function () {\n var $viewCond = this.getParentView();\n\n _logic.removeNewFilter($viewCond);\n },\n },\n ],\n };\n };\n\n _logic.getAddButtonUI = () => {\n return {\n view: \"button\",\n id: ids.addNewFilter,\n css: \"webix_primary\",\n type: \"form\",\n label: L(\"Add a filter\"),\n click: () => {\n _logic.addNewFilter();\n },\n };\n };\n\n _logic.addNewFilter = (index, fieldId) => {\n var viewId;\n var ui = _logic.getFilterUI();\n\n var $viewForm = $$(ids.filterForm);\n if ($viewForm) {\n viewId = $viewForm.addView(ui, index);\n\n _logic.toggleAddNewButton();\n\n // select a option of field\n if (fieldId) _logic.selectField(fieldId, $$(viewId), true);\n }\n\n return viewId;\n };\n\n _logic.removeNewFilter = function ($viewCond) {\n var $viewForm = $$(ids.filterForm);\n\n $viewForm.removeView($viewCond);\n\n _logic.toggleAddNewButton();\n\n _logic.onChange();\n };\n\n _logic.toggleAddNewButton = function () {\n if (!$$(ids.filterForm)) return;\n\n // Show \"Add new filter\" button\n if ($$(ids.filterForm).getChildViews().length < 1) {\n $$(ids.filterForm).hide();\n $$(ids.addNewFilter).show();\n }\n // Hide \"Add new filter\" button\n else {\n $$(ids.filterForm).show();\n $$(ids.addNewFilter).hide();\n }\n };\n\n _logic.selectCombineCondition = (val, ignoreNotify) => {\n // define combine value to configuration\n this.config_settings.glue = val;\n\n // update value of every combine conditions\n var $viewConds = $$(ids.filterForm).getChildViews();\n $viewConds.forEach((v) => {\n if (v.$$ && v.$$(ids.glue)) v.$$(ids.glue).setValue(val);\n });\n\n if (!ignoreNotify) _logic.onChange();\n };\n\n _logic.selectField = (columnId, $viewCond, ignoreNotify) => {\n if (!this._Fields) return;\n\n var field = this._Fields.filter((f) => f.id == columnId)[0];\n if (!field) return;\n\n // switch view\n batchName = field.key;\n if (field.id == \"this_object\") batchName = \"query\";\n // Special this object query\n else if (batchName == \"LongText\" || batchName == \"combined\")\n batchName = \"string\";\n else if (field.key == \"formula\") batchName = \"number\";\n var isQueryField =\n this._QueryFields.filter((f) => {\n return f.id == field.id;\n }).length > 0;\n if (isQueryField) {\n // we chose a connectField which is now a Query type\n batchName = \"query\";\n }\n $viewCond.$$(ids.rule).showBatch(batchName);\n $viewCond.$$(ids.inputValue).showBatch(batchName);\n\n let options = [];\n let Queries = [];\n\n // populate the list of Queries for this_object:\n if (field.id == \"this_object\" && this._Object) {\n Queries = this.queries((q) => q.canFilterObject(this._Object));\n }\n // populate the list of Queries for a query field\n else if (isQueryField) {\n Queries = this.queries((q) => {\n return (\n (this._Object ? this._Object.id : \"\") != q.id && // Prevent filter looping\n q.canFilterObject(field.datasourceLink)\n );\n });\n }\n\n Queries.forEach((q) => {\n options.push({\n id: q.id,\n value: q.label,\n });\n });\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.queryCombo)\n .define(\"options\", options);\n $viewCond.$$(ids.inputValue).$$(ids.queryCombo).refresh();\n\n // populate options of list\n if (field.key == \"list\") {\n let listOptions = field.settings.options.map(function (x) {\n return {\n id: x.id,\n value: x.text,\n };\n });\n\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.listOptions)\n .define(\"options\", listOptions);\n $viewCond.$$(ids.inputValue).$$(ids.listOptions).refresh();\n }\n // set format of datepicker\n else if (field.key == \"date\") {\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.datePicker)\n .define(\"format\", field.getFormat());\n $viewCond.$$(ids.inputValue).$$(ids.datePicker).refresh();\n }\n\n var rule = null,\n ruleViewId = $viewCond.$$(ids.rule).getActiveId(),\n $viewComparer = $viewCond\n .$$(ids.rule)\n .queryView({ id: ruleViewId });\n if ($viewComparer && $viewComparer.getList) {\n let defaultOpt = ($viewComparer.getList().config.data || [])[0];\n if (defaultOpt) {\n $viewComparer.setValue(defaultOpt.id);\n }\n\n // rule = $viewComparer.getValue();\n // if (rule == \"in_query_field\" || rule == \"not_in_query_field\") {\n // \t// Show the new value inputs\n // \t$viewCond.$$(ids.inputValue).showBatch(\"queryField\");\n // } else if (rule == \"same_as_field\" || rule == \"not_same_as_field\") {\n // \t// Show the new value inputs\n // \t$viewCond.$$(ids.inputValue).showBatch(\"fieldMatch\");\n // }\n }\n\n if (!ignoreNotify) _logic.onChange();\n };\n\n _logic.onChangeRule = (rule, $viewCond, notify = false) => {\n switch (rule) {\n case \"contains\":\n case \"not_contains\":\n case \"equals\":\n case \"not_equal\":\n // For \"connect_fields\" search by CUSTOM index value\n if (batchName == \"query\") {\n $viewCond.$$(ids.inputValue).showBatch(\"string\");\n }\n // If want to call notify or call .onChange(), then pass notify is true.\n // _logic.onChange();\n break;\n\n case \"is_current_user\":\n case \"is_not_current_user\":\n case \"contain_current_user\":\n case \"not_contain_current_user\":\n case \"same_as_user\":\n case \"not_same_as_user\":\n case \"less_current\":\n case \"greater_current\":\n case \"less_or_equal_current\":\n case \"greater_or_equal_current\":\n case \"is_empty\":\n case \"is_not_empty\":\n case \"is_current_date\":\n // clear and disable the value field\n $viewCond.$$(ids.inputValue).showBatch(\"empty\");\n _logic.onChange();\n break;\n\n case \"last_days\":\n case \"next_days\":\n // Show the number input\n $viewCond.$$(ids.inputValue).showBatch(\"number\");\n break;\n\n case \"in_query_field\":\n case \"not_in_query_field\":\n // populate the list of Queries for this_object:\n var options = [];\n\n // Get all application's queries\n this.queries(\n (q) => this._Object == null || q.id != this._Object.id\n ).forEach((q) => {\n options.push({\n id: q.id,\n value: q.label,\n });\n });\n\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.queryFieldComboQuery)\n .define(\"options\", options);\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.queryFieldComboQuery)\n .refresh();\n\n // Show the new value inputs\n $viewCond.$$(ids.inputValue).showBatch(\"queryField\");\n break;\n\n case \"same_as_field\":\n case \"not_same_as_field\":\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.fieldMatch)\n .define(\"options\", this.recordRuleFieldOptions);\n $viewCond.$$(ids.inputValue).$$(ids.fieldMatch).refresh();\n\n // Show the new value inputs\n $viewCond.$$(ids.inputValue).showBatch(\"fieldMatch\");\n break;\n\n case \"in_data_collection\":\n case \"not_in_data_collection\": {\n let dcOptions = [];\n\n // pull data collection list\n\n // get id of the link object\n let linkObjectId,\n columnId = $viewCond.$$(ids.field).getValue();\n if (columnId == \"this_object\" && this._Object) {\n linkObjectId = this._Object.id;\n } else {\n let field = this._Fields.filter((f) => f.id == columnId)[0];\n if (field) linkObjectId = field.settings.linkObject;\n }\n\n if (this._Application && linkObjectId) {\n this._Application\n .datacollections(\n (dc) =>\n dc.datasource && dc.datasource.id == linkObjectId\n )\n .forEach((dc) => {\n dcOptions.push({\n id: dc.id,\n value: dc.label,\n });\n });\n }\n\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.dataCollection)\n .define(\"options\", dcOptions);\n $viewCond.$$(ids.inputValue).$$(ids.dataCollection).refresh();\n\n // Show the new value inputs\n $viewCond.$$(ids.inputValue).showBatch(\"dataCollection\");\n break;\n }\n\n default:\n // Show the default value inputs\n $viewCond.$$(ids.inputValue).showBatch(batchName);\n\n if (notify) _logic.onChange();\n\n break;\n }\n };\n\n _logic.onChangeQueryFieldCombo = (value, $viewCond) => {\n // populate the list of Queries for this_object:\n let options = [];\n // Get all queries fields\n let Query = this.queries((q) => {\n return q.id == value;\n })[0];\n if (Query) {\n Query.fields((f) => {\n return !f.isConnection;\n }).forEach((q) => {\n options.push({\n id: q.id,\n value: q.object.label + \".\" + q.label,\n });\n });\n\n $viewCond\n .$$(ids.inputValue)\n .$$(ids.queryFieldComboField)\n .define(\"options\", options);\n $viewCond.$$(ids.inputValue).$$(ids.queryFieldComboField).refresh();\n }\n\n // _logic.onChange();\n };\n\n _logic.onChange = () => {\n if (!this.__blockOnChange) {\n // refresh config settings before notify\n _logic.getValue();\n\n console.warn(\"convert RowFilter.callback.onChange() to .emit()\");\n _logic.callbacks.onChange();\n this.emit(\"change\");\n }\n\n return false;\n };\n\n _logic.blockOnChange = () => {\n this.__blockOnChange = true;\n };\n\n _logic.unblockOnChange = () => {\n this.__blockOnChange = false;\n };\n\n /**\n * @method getValue\n *\n * @return {JSON} -\n * {\n * \t\tglue: '', // 'and', 'or'\n *\t\trules: [\n *\t\t\t{\n *\t\t\t\tkey:\t'column name',\n *\t\t\t\trule:\t'rule',\n *\t\t\t\tvalue:\t'value'\n *\t\t\t}\n *\t\t]\n * }\n */\n _logic.getValue = () => {\n let config_settings = {\n glue: \"and\",\n rules: [],\n };\n\n var $viewForm = $$(ids.filterForm);\n if ($viewForm) {\n $viewForm.getChildViews().forEach(($viewCond, index) => {\n if (index == 0) {\n config_settings.glue = $viewCond.$$(ids.glue).getValue();\n }\n\n var $fieldElem = $viewCond.$$(ids.field);\n if (!$fieldElem) return;\n\n /* field id */\n var fieldId = $fieldElem.getValue();\n if (!fieldId) return;\n\n /* alias */\n var alias;\n var selectedOpt = $viewCond\n .$$(ids.field)\n .getPopup()\n .config.body.data.filter((opt) => opt.id == fieldId)[0];\n if (selectedOpt) alias = selectedOpt.alias || undefined;\n\n /* rule */\n var rule = null,\n ruleViewId = $viewCond.$$(ids.rule).getActiveId(),\n $viewComparer = $viewCond\n .$$(ids.rule)\n .queryView({ id: ruleViewId });\n if ($viewComparer && $viewComparer.getValue)\n rule = $viewComparer.getValue();\n\n /* value */\n var value = null,\n valueViewId = $viewCond.$$(ids.inputValue).getActiveId(),\n $viewConditionValue = $viewCond\n .$$(ids.inputValue)\n .queryView({ id: valueViewId });\n if ($viewConditionValue && $viewConditionValue.getValue) {\n value = $viewConditionValue.getValue();\n } else if (\n $viewConditionValue &&\n $viewConditionValue.getChildViews()\n ) {\n var vals = [];\n $viewConditionValue.getChildViews().forEach((element) => {\n vals.push($$(element).getValue());\n });\n value = vals.join(\":\");\n }\n\n // Convert date format\n if (value instanceof Date) {\n let dateField = this._Fields.filter(\n (f) => f.id == fieldId\n )[0];\n if (dateField) {\n value = dateField.exportValue(value);\n } else {\n value = value.toISOString();\n }\n }\n\n config_settings.rules.push({\n alias: alias || undefined,\n key: fieldId,\n rule: rule,\n value: value,\n });\n });\n }\n\n this.config_settings = config_settings;\n\n return this.config_settings;\n };\n\n // webix UI definition:\n this.ui = {\n id: ids.component,\n rows: [\n {\n view: \"form\",\n id: ids.filterForm,\n hidden: true,\n elements: [],\n },\n _logic.getAddButtonUI(),\n ],\n };\n }\n\n // setting up UI\n init(options = {}) {\n super.init(options);\n\n // register our callbacks:\n for (var c in this._logic.callbacks) {\n this._logic.callbacks[c] = options[c] || this._logic.callbacks[c];\n }\n\n if (options.showObjectName)\n this._settings.showObjectName = options.showObjectName;\n\n if (options.isRecordRule) {\n this.recordRuleOptions = [\n {\n value: L(\"Same As Field\"),\n id: \"same_as_field\",\n },\n {\n value: L(\"Not Field\"),\n id: \"not_same_as_field\",\n },\n ];\n this.recordRuleFieldOptions = options.fieldOptions;\n }\n }\n\n setValue(settings) {\n settings = settings || {};\n\n super.setValue(settings);\n\n let ids = this.ids;\n let logic = this._logic;\n\n // block .onChange event\n logic.blockOnChange();\n\n let config_settings = this.AB.cloneDeep(settings);\n config_settings.rules = config_settings.rules || [];\n\n // Redraw form with no elements\n var $viewForm = $$(ids.filterForm);\n if ($viewForm) webix.ui([], $viewForm);\n\n // Add \"new filter\" button\n if (config_settings.rules.length == 0) {\n logic.toggleAddNewButton();\n }\n\n config_settings.rules.forEach((f) => {\n var viewId = logic.addNewFilter(),\n $viewCond = $$(viewId);\n\n if ($viewCond == null) return;\n\n var field = this._Fields.filter((col) => col.id == f.key)[0];\n\n // \"and\" \"or\"\n $viewCond.$$(ids.glue).define(\"value\", config_settings.glue);\n $viewCond.$$(ids.glue).refresh();\n\n // Select Field\n $viewCond.$$(ids.field).define(\"value\", f.key);\n $viewCond.$$(ids.field).refresh();\n logic.selectField(f.key, $viewCond, true);\n\n // Comparer\n var ruleViewId = $viewCond.$$(ids.rule).getActiveId(),\n $viewComparer = $viewCond\n .$$(ids.rule)\n .queryView({ id: ruleViewId });\n if ($viewComparer && $viewComparer.setValue) {\n $viewComparer.define(\"value\", f.rule);\n $viewComparer.refresh();\n }\n\n // if (f.rule == \"in_query_field\" || f.rule == \"not_in_query_field\" || f.rule == \"same_as_field\" || f.rule == \"not_same_as_field\") {\n $viewCond.blockEvent();\n logic.onChangeRule(f.rule, $viewCond);\n $viewCond.unblockEvent();\n // }\n\n // Input\n var valueViewId = $viewCond.$$(ids.inputValue).getActiveId(),\n $viewConditionValue = $viewCond\n .$$(ids.inputValue)\n .queryView({ id: valueViewId });\n if ($viewConditionValue && $viewConditionValue.setValue) {\n // convert to Date object\n if (\n field &&\n field.key == \"date\" &&\n f.value &&\n (f.rule == \"less\" ||\n f.rule == \"greater\" ||\n f.rule == \"less_or_equal\" ||\n f.rule == \"greater_or_equal\")\n ) {\n $viewConditionValue.define(\"value\", new Date(f.value));\n } else {\n $viewConditionValue.define(\"value\", f.value);\n }\n\n $viewConditionValue.refresh();\n } else if (\n $viewConditionValue &&\n $viewConditionValue.getChildViews()\n ) {\n let vals = (f.value || \"\").split(\":\");\n let index = 0;\n $viewConditionValue.getChildViews().forEach((element) => {\n $$(element).blockEvent();\n $$(element).setValue(vals[index]);\n if (index == 0) {\n logic.onChangeQueryFieldCombo(vals[index], $viewCond);\n }\n $$(element).unblockEvent();\n // $$(element).refresh();\n index++;\n });\n }\n\n if (field && field.key == \"user\") {\n $viewCond.blockEvent();\n logic.onChangeRule(f.rule, $viewCond);\n $viewCond.blockEvent();\n }\n });\n\n // unblock .onChange event\n logic.unblockOnChange();\n }\n\n /**\n * @method isComplete()\n * returns a truthy value representing whether or not our current condition\n * expression is fully completed. Then externally checks can be made to\n * verify if the data is complete.\n * @return {bool}\n */\n isComplete() {\n if (!this._completeConditions) {\n this._completeConditions = this.AB.filterComplexNew(\n `${this.ids.component}_iscomplete`\n );\n }\n\n return this._completeConditions.isConditionComplete(this.getValue());\n }\n};\n","// const ABComponent = require(\"./ABComponent\");\nimport ClassUI from \"../../ui/ClassUI\";\nconst ABViewForm = require(\"../platform/views/ABViewForm\");\n\nlet L = null;\n\nclass RowUpdater extends ClassUI {\n constructor(idBase, AB) {\n super(idBase, {\n form: `${idBase}_rowUpdaterForm`,\n addNew: `${idBase}_rowUpdaterAddNew`,\n field: `${idBase}_rowUpdaterField`,\n });\n\n this.idBase = idBase;\n\n this._Object = null;\n // {ABObject}\n // The ABObject we are building a form for.\n\n this._mockFormWidget = null;\n // {ABViewForm}\n // When building our form components to display, they need a\n // ABViewForm to be associated with.\n\n this.AB = AB;\n\n if (!L) {\n L = (...params) => {\n return this.AB.Multilingual.label(...params);\n };\n }\n }\n\n /**\n * @method uiItem()\n * Return the webix description of a new field/value row.\n * @return {json}\n */\n uiItem() {\n const self = this;\n\n return {\n rows: [\n {\n view: \"layout\",\n isolate: true,\n cols: [\n {\n // Label\n view: \"label\",\n width: 40,\n label: L(\"Set\"),\n },\n {\n // Field list\n view: \"combo\",\n id: this.ids.field,\n options: this.getFieldList(true),\n on: {\n onChange: async function (columnId) {\n const $viewItem = this.getParentView();\n\n await self.selectField(columnId, $viewItem);\n },\n },\n },\n {\n // Label\n view: \"label\",\n width: 40,\n label: L(\"To\"),\n },\n {\n view: \"segmented\",\n value: \"custom\",\n height: 40,\n maxWidth: 160,\n options: [\n { id: \"custom\", value: L(\"Custom\") },\n { id: \"process\", value: L(\"Process\") },\n ],\n hidden:\n this._extendedOptions == null ||\n !this._extendedOptions.length,\n on: {\n onChange: function (val) {\n const $viewItem = this.getParentView();\n\n self.toggleCustomProcessOption(\n $viewItem,\n val == \"process\"\n );\n },\n },\n },\n // Field value\n {},\n // Extended value\n {\n hidden: true,\n },\n {\n // \"Remove\" button\n view: \"button\",\n css: \"webix_danger\",\n icon: \"fa fa-trash\",\n type: \"icon\",\n autowidth: true,\n\n click: function () {\n const $viewCond = this.getParentView().getParentView();\n\n self.removeItem($viewCond);\n },\n },\n ],\n },\n ],\n };\n }\n\n /**\n * @method ui()\n * return the webix description of our Entry form.\n * @return {json}\n */\n ui() {\n // webix UI definition:\n return {\n rows: [\n {\n view: \"form\",\n id: this.ids.form,\n hidden: true,\n borderless: true,\n elements: [],\n },\n {\n view: \"button\",\n id: this.ids.addNew,\n icon: \"fa fa-plus\",\n type: \"iconButton\",\n label: L(\"Add field to edit\"),\n click: () => {\n this.addItem();\n },\n },\n ],\n };\n }\n\n init(AB) {\n const $form = $$(this.ids.form);\n if ($form) AB.Webix.extend($form, AB.Webix.ProgressBar);\n\n return Promise.resolve();\n }\n\n /**\n * @method addItem()\n * Add another field/value entry item to our form.\n * @param {integer} index\n * which position in the list of form elements do we want to\n * insert the new row.\n * @return {string} the webix .id of the new row we just added.\n */\n addItem(index) {\n const $form = $$(this.ids.form);\n const remainFields = this.getFieldList(true);\n\n if (remainFields.length < 1) return;\n\n const ui = this.uiItem();\n const viewId = $form.addView(ui, index);\n\n this.toggleForm();\n\n return viewId;\n }\n\n /**\n * @method getFieldList()\n * Return an array of options in a webix.list format that represents the\n * possible fields that can be selected on the current ABObject.\n * @param {bool} excludeSelected\n * should we exclude from the list the fields that are ALREADY\n * displayed on the form?\n * @return {array} [ { id, value }, ... ]\n * id: ABField.id\n * value: ABField.label\n */\n getFieldList(excludeSelected) {\n let options = (this._Object.fields() || []).map((f) => {\n return {\n id: f.id,\n value: f.label,\n };\n });\n\n if (excludeSelected) {\n const $form = $$(this.ids.form);\n\n $form.getChildViews().forEach(($viewCond) => {\n // Ignore \"Add new\" button\n if (!$viewCond || !$viewCond.$$) return;\n\n const $fieldElem = $viewCond.$$(this.ids.field);\n\n if (!$fieldElem) return;\n\n const fieldId = $fieldElem.getValue();\n\n if (!fieldId) return;\n\n options = options.filter((opt) => opt.id != fieldId);\n });\n }\n return options;\n }\n\n /**\n * @method getValue\n * Return an array of field:value results that have been entered on this\n * form.\n * @return {Array}\n * [\n * {\n * fieldId: {UUID}\n * isProcessValue: {Boolean} - If it is true, then value is from Process parameter\n * value: {Object}\n * },\n * ...\n * ]\n */\n getValue() {\n const result = [];\n const $form = $$(this.ids.form);\n\n if ($form) {\n $form.getChildViews().forEach(($viewContainer) => {\n const $viewItem = $viewContainer.getChildViews()[0];\n\n // Ignore \"Add new\" button\n if (!$viewItem || !$viewItem.$$) return;\n\n const $fieldElem = $viewItem.$$(this.ids.field);\n\n if (!$fieldElem) return;\n\n const fieldId = $fieldElem.getValue();\n\n if (!fieldId) return;\n\n let $customValueElem = $viewItem.getChildViews()[4];\n $customValueElem = this._pullInputElement($customValueElem);\n\n const $processValueElem = $viewItem.getChildViews()[5];\n\n if (!$customValueElem && !$processValueElem) return;\n\n const fieldInfo = this._Object.fieldByID(fieldId);\n const val = {\n fieldId: fieldId,\n };\n\n // Custom value\n if ($customValueElem && $customValueElem.isVisible()) {\n if (\n fieldInfo.key === \"connectObject\" ||\n fieldInfo.key === \"user\"\n )\n val.value = fieldInfo.getValue($customValueElem);\n else if (\n fieldInfo.key === \"date\" ||\n fieldInfo.key === \"datetime\"\n ) {\n const currDateCheckbox =\n $customValueElem.getChildViews()[0] ?? $customValueElem;\n\n if (currDateCheckbox.getValue() == true)\n val.value = \"ab-current-date\";\n else {\n const datePicker =\n $customValueElem.getChildViews()[1] ?? $customValueElem;\n\n val.value = fieldInfo.getValue(datePicker);\n }\n }\n // Get value from data field manager\n else val.value = fieldInfo.getValue($customValueElem);\n }\n // Process value\n else if ($processValueElem && $processValueElem.isVisible()) {\n val.isProcessValue = true;\n val.value = $processValueElem.getValue();\n }\n\n // Add to output\n result.push(val);\n });\n }\n\n return result;\n }\n\n /**\n * @method objectLoad\n * Load the Object we are currently working with.\n * @param {ABObject} object\n */\n objectLoad(object) {\n this._Object = object;\n\n this._mockApp = this.AB.applicationNew({});\n this._mockFormWidget = new ABViewForm(\n {\n settings: {\n showLabel: false,\n labelWidth: 0,\n },\n },\n this._mockApp // just need any ABApplication here\n );\n this._mockFormWidget.objectLoad(object);\n\n this.setValue(null); // clear\n }\n\n /**\n * @method removeItem\n * Remove the current form row.\n * @param {webix.view} $viewCond\n * This is the webix.view that contains the whole value row\n * we are removing.\n */\n removeItem($viewCond) {\n const $form = $$(this.ids.form);\n\n $form.removeView($viewCond);\n this.toggleForm();\n }\n\n /**\n * @method selectField\n * Update the value display when a field is selected. Changing to a\n * different field will change the types of values that can be entered.\n * @param {string} columnId\n * The field.uuid of the object that was selected.\n * @param {webix.view} $viewItem\n * The webix.view that contains the value expression of the field\n * that was selected.\n */\n async selectField(columnId, $viewItem) {\n const field = this._Object.fieldByID(columnId);\n\n if (!field) {\n this.AB.notify.builder(\n new Error(`could not find field for id[${columnId}]`),\n {\n context: \"RowUpdater.selectField() could not find a field\",\n fieldID: columnId,\n }\n );\n\n return;\n }\n\n const fieldComponent = field.formComponent(),\n formFieldWidget = fieldComponent.newInstance(\n this._mockApp,\n this._mockFormWidget\n ),\n formFieldComponent = formFieldWidget.component(\n this.AB._App,\n this.idBase\n );\n const childViews = $viewItem.getChildViews();\n\n let inputView =\n typeof formFieldComponent.ui == \"function\"\n ? formFieldComponent.ui()\n : formFieldComponent.ui;\n\n // Add extended value options\n $viewItem.removeView(childViews[5]);\n\n if (this._extendedOptions?.length)\n $viewItem.addView(\n {\n view: \"richselect\",\n options: this._extendedOptions,\n hidden: true,\n },\n 5\n );\n else\n $viewItem.addView(\n {\n hidden: true,\n },\n 5\n );\n\n await this.busy();\n\n // WORKAROUND: add '[Current User]' option to the user data field\n switch (field.key) {\n case \"connectObject\":\n case \"user\":\n inputView = inputView.rows[0].rows[0];\n inputView.suggest.body.data =\n (await field.getOptions()).map((e) => {\n return {\n id: field.getRelationValue(e),\n value: e.text,\n };\n }) ?? [];\n\n if (field.key === \"user\")\n inputView.suggest.body.data.unshift({\n id: \"ab-current-user\",\n value: \"ab-current-user\",\n // This one is saved with the \"value\" not \"id\".\n // value: L(\"Current User\"),\n });\n\n break;\n\n case \"date\":\n case \"datetime\":\n inputView = {\n view: \"layout\",\n rows: [\n {\n view: \"checkbox\",\n labelWidth: 0,\n labelRight: L(\"Current Date/Time\"),\n on: {\n onChange: function (newVal) {\n const layout = this.getParentView();\n\n if (!layout) return;\n\n const datePicker = layout.getChildViews()[1];\n\n if (!datePicker) return;\n\n newVal ? datePicker.hide() : datePicker.show();\n },\n },\n },\n inputView,\n ],\n };\n\n break;\n }\n\n // Change component to display value\n $viewItem.removeView(childViews[4]);\n $viewItem.addView(inputView, 4);\n\n formFieldComponent.init();\n\n // Show custom display of data field\n if (field.customDisplay)\n field.customDisplay({}, this.AB._App, childViews[4].$view);\n\n this.toggleCustomProcessOption(\n $viewItem,\n childViews[3].getValue() === \"process\"\n );\n $$($viewItem).adjust();\n $viewItem.getFormView().adjust();\n\n this.ready();\n }\n\n /**\n * @method setValue\n * Given the previous settings, redraw the form with the field/value\n * entries.\n * @param {array} settings\n * [\n * {\n * fieldId: {UUID}\n * value: {Object|String}\n * }, ...\n * ]\n */\n setValue(settings) {\n const $form = $$(this.ids.form);\n\n if (!$form) return;\n\n // Redraw form with no elements\n webix.ui([], $form);\n\n settings = settings || [];\n if (settings.length < 1) return;\n\n settings.forEach(async (item) => {\n const $viewContainer = $$(this.addItem());\n const $viewItem = $viewContainer.getChildViews()[0];\n const $valueTypeButton = $viewItem.queryView(\n { view: \"segmented\" },\n \"self\"\n );\n\n $valueTypeButton.setValue(item.isProcessValue ? \"process\" : \"custom\");\n\n const $field = $viewItem.$$(this.ids.field);\n\n $field.define(\"value\", item.fieldId);\n $field.refresh();\n\n await this.selectField(item.fieldId, $viewItem);\n\n const fieldInfo = this._Object.fieldByID(item.fieldId);\n\n if (!fieldInfo) return;\n\n // Set process value\n if (item.isProcessValue) {\n const $processValueElem = $viewItem.getChildViews()[5];\n\n $processValueElem.setValue?.(item.value);\n\n return;\n }\n\n // Set custom value\n let $customValueElem = $viewItem.getChildViews()[4];\n $customValueElem = this._pullInputElement($customValueElem);\n const rowData = {};\n\n rowData[fieldInfo.columnName] = item.value?.value ?? item.value;\n fieldInfo.setValue($customValueElem, rowData);\n\n // Set \"Current Date/Time\" check box\n if (\n (fieldInfo.key == \"date\" || fieldInfo.key == \"datetime\") &&\n rowData[fieldInfo.columnName] == \"ab-current-date\" &&\n $customValueElem.config.view == \"checkbox\"\n ) {\n $customValueElem.setValue(true);\n }\n });\n\n this.toggleForm();\n }\n\n /**\n * @method toggleForm\n * decide if the form with the field/value elements should be displayed.\n */\n toggleForm() {\n const $form = $$(this.ids.form);\n\n if ($form) {\n const childViews = $form.getChildViews();\n\n if (childViews && childViews.length) $form.show();\n else $form.hide();\n $form.adjust();\n }\n }\n\n setExtendedOptions(options) {\n this._extendedOptions = options;\n }\n\n toggleCustomProcessOption($viewItem, showProcessOption) {\n const $customOption = $viewItem.getChildViews()[4];\n const $processOption = $viewItem.getChildViews()[5];\n\n if (showProcessOption) {\n $customOption.hide();\n $processOption.show();\n } else {\n $customOption.show();\n $processOption.hide();\n }\n }\n\n async busy() {\n $$(this.ids.addNew).disable();\n\n const $form = $$(this.ids.form);\n\n if (!$form) return;\n\n if (!$form.showProgress) await this.init(this.AB);\n\n $form.showProgress({ type: \"icon\" });\n }\n\n ready() {\n $$(this.ids.addNew).enable();\n $$(this.ids.form).hideProgress();\n }\n\n _pullInputElement($elem) {\n if (!$elem?.getValue && $elem?.getChildViews) {\n return (\n $elem\n .getChildViews()\n .filter((childView) => childView.getValue)[0] ?? $elem\n );\n } else {\n return $elem;\n }\n }\n}\n\nexport default RowUpdater;\n","/*\n * ABField\n *\n * An ABField defines a single unique Field/Column in a ABObject.\n *\n */\n\nconst ABFieldCore = require(\"../../core/dataFields/ABFieldCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABField extends ABFieldCore {\n constructor(values, object, fieldDefaults) {\n super(values, object, fieldDefaults);\n\n this.AB.on(\"ab.abdefinition.update\", (def) => {\n if (def.id == this.id) {\n this.emit(\"definition.updated\", this);\n }\n });\n\n // \t// NOTE: setup this first so later we can use .fieldType(), .fieldIcon()\n // \tthis.defaults = fieldDefaults;\n\n // \t{\n // \t\tid:'uuid',\t\t\t\t\t// uuid value for this obj\n // \t\tkey:'fieldKey',\t\t\t\t// unique key for this Field\n // \t\ticon:'font',\t\t\t\t// fa-[icon] reference for an icon for this Field Type\n // \t\tlabel:'',\t\t\t\t\t// pulled from translation\n // \t\tcolumnName:'column_name',\t// a valid mysql table.column name\n //\t\tsettings: {\t\t\t\t\t// unique settings for the type of field\n // \t\t\tshowIcon:true/false,\t// only useful in Object Workspace DataTable\n // \t\t\tisImported: 1/0,\t\t// flag to mark is import from other object\n // \t\t\trequired: 1/0,\t\t\t// field allows does not allow NULL or it does allow NULL\n // \t\t\twidth: {int}\t\t\t// width of display column\n\n // \t\t// specific for dataField\n // \t\t},\n // \t\ttranslations:[]\n // \t}\n\n // \tthis.fromValues(values);\n\n // this.object = object;\n }\n\n ///\n /// Static Methods\n ///\n /// Available to the Class level object. These methods are not dependent\n /// on the instance values of the Application.\n ///\n\n static editorValues(settings) {\n const obj = {\n label: settings.label,\n columnName: settings.columnName,\n settings: settings,\n };\n\n delete settings.label;\n delete settings.columnName;\n\n return obj;\n }\n\n addValidation(ids, settings) {\n const App = this.object.application.App;\n const Filter = this.AB.filterComplexNew(\n `${this.id}_field_validation_rules`\n );\n $$(ids.filterComplex).addView({\n view: \"form\",\n css: \"abValidationForm\",\n cols: [\n {\n rows: [\n {\n view: \"text\",\n name: \"invalidMessage\",\n labelWidth: this.AB.UISettings.config().labelWidthLarge,\n value:\n settings && settings.invalidMessage\n ? settings.invalidMessage\n : \"\",\n label: L(\"Invalid Message\"),\n },\n Filter.ui,\n ],\n },\n {\n view: \"button\",\n css: \"webix_danger\",\n icon: \"fa fa-trash\",\n type: \"icon\",\n autowidth: true,\n click: function () {\n const $viewCond = this.getParentView();\n $$(ids.filterComplex).removeView($viewCond);\n },\n },\n ],\n });\n $$(Filter.ids.save).hide();\n // Filter.applicationLoad(this.object.application);\n Filter.fieldsLoad(this.object.fields());\n if (settings && settings.rules) Filter.setValue(settings.rules);\n }\n\n /*\n * @method isValid\n * check the current values to make sure they are valid.\n * Here we check the default values provided by ABField.\n *\n * @return null or [{OP.Validation.validator()}] objects.\n */\n isValid() {\n const validator = this.AB.Validation.validator();\n\n // .columnName must be unique among fileds on the same object\n const isNameUnique =\n this.object.fields((f) => {\n return (\n f.id != this.id &&\n f.columnName.toLowerCase() == this.columnName.toLowerCase()\n );\n }).length == 0;\n if (!isNameUnique) {\n validator.addError(\n \"columnName\",\n L(\n \"Field columnName must be unique ({0} already used in this Object)\",\n [this.columnName]\n )\n );\n }\n\n return validator;\n }\n\n ///\n /// Instance Methods\n ///\n\n /// ABApplication data methods\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABApplication\n *\n * also remove it from our _AllApplications\n *\n * @return {Promise}\n */\n async destroy() {\n // verify we have been .save() before:\n if (!this.id) return;\n\n // NOTE: our .migrateXXX() routines expect the object to currently exist\n // in the DB before we perform the DB operations. So we need to\n // .migrateDrop() before we actually .objectDestroy() this.\n if (!this.object.isAPI) {\n await this.migrateDrop();\n }\n\n // the server still references an ABField in relationship to it's\n // ABObject, so we need to destroy the Field 1st, then remove it\n // from it's object.\n await super.destroy();\n\n await this.object.fieldRemove(this);\n }\n\n /**\n * @method save()\n *\n * persist this instance of ABField with it's parent ABObject\n *\n *\n * @return {Promise}\n *\t\t\t\t\t\t.resolve( {this} )\n */\n async save(skipMigrate = false) {\n let isAdd = false;\n // if this is our initial save()\n if (!this.id) {\n isAdd = true;\n }\n\n // Whenever we update our settings, make sure any\n // existing rows that have NULL values for this field\n // are updated to have our current .default value.\n if (!isAdd && this.settings.required && this.settings.default) {\n const model = this.object.model();\n\n // pull rows that has null value\n const result = await model.findAll({\n where: {\n glue: \"and\",\n rules: [\n {\n key: this.id,\n rule: \"is_null\",\n },\n ],\n },\n });\n\n const tasks = [];\n\n // updating ...\n result.data.forEach((d) => {\n if (!d[this.columnName]) d[this.columnName] = this.settings.default;\n\n tasks.push(model.update(d.id, d));\n });\n\n await Promise.all(tasks);\n }\n\n // New ABDefinition method of saving:\n // when this is done, we now have an .id\n await super.save();\n\n // incase this was an ADD operation, make sure the\n // parent Obj now includes this object:\n // NOTE: must be done after the .save() so we have an .id\n await this.object.fieldAdd(this);\n\n // perform any server side migrations for this Field:\n\n // but not connectObject fields:\n // ABFieldConnect.migrateXXX() gets called from the UI popupNewDataField\n // in order to handle the timings of the 2 fields that need to be created\n if (!this.isConnection && !skipMigrate && !this.object.isAPI) {\n const fnMigrate = isAdd ? this.migrateCreate() : this.migrateUpdate();\n await fnMigrate;\n }\n\n return this;\n }\n\n ///\n /// DB Migrations\n ///\n\n migrateCreate() {\n return this.AB.Network.post({\n url: `/definition/migrate/object/${this.object.id}/field/${this.id}`,\n });\n }\n\n migrateUpdate() {\n return this.AB.Network.put({\n url: `/definition/migrate/object/${this.object.id}/field/${this.id}`,\n });\n }\n\n migrateDrop() {\n return this.AB.Network[\"delete\"]({\n url: `/definition/migrate/object/${this.object.id}/field/${this.id}`,\n });\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @function columnHeader\n * Return the column header for a webix grid component for this specific\n * data field.\n * @param {Object} options\n * {\n * isObjectWorkspace: {bool}, is this being used in the Object workspace.\n * width: {int},\n * height: {int},\n * editable: {bool}\n * }\n * @return {obj} configuration obj\n */\n columnHeader(options) {\n options = options || {};\n\n const config = {\n id: this.columnName, // this.id,\n header: this.label,\n };\n\n if (options.isObjectWorkspace && this.settings.showIcon) {\n config.header = `${\n config.header\n }`;\n }\n\n return config;\n }\n\n /*\n * @function customDisplay\n * perform any custom display modifications for this field. If this isn't\n * a standard value display (think image, Map, graph, etc...) then use this\n * method to create the display in the table/grid cell.\n * @param {object} row\n * is the {name=>value} hash of the current row of data.\n * @param {App} App\n * the shared ui App object useful more making globally\n *\t\t\t unique id references.\n * @param {HtmlDOM} node\n * the HTML Dom object for this field's display.\n * @param {object} options\n * option of additional settings\n */\n customDisplay(row, App, node, options) {}\n\n /*\n * @function customEdit\n *\n *\n *\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customEdit(row, App, node) {\n return true;\n }\n\n /**\n * @method getValue\n * this function uses for form component and mass update popup\n * to get value of fields that apply custom editor\n *\n * @param {Object} item - Webix element\n * @param {Object} rowData - data of row\n *\n * @return {Object}\n */\n getValue(item, rowData) {\n return item.getValue();\n }\n\n /**\n * @method setValue\n * this function uses for form component and mass update popup\n * to get value of fields that apply custom editor\n *\n * @param {Object} item - Webix element\n * @param {Object} rowData - data of row\n *\n */\n setValue(item, rowData, defaultValue) {\n if (!item) return;\n\n let val;\n\n if (\n (rowData == null || rowData[this.columnName] == null) &&\n defaultValue != null\n ) {\n val = defaultValue;\n } else if (rowData && rowData[this.columnName] != null) {\n val = rowData[this.columnName];\n } else {\n val = rowData;\n }\n\n try {\n item.setValue(val);\n } catch (err) {\n // this error is fine because we handled it already\n }\n }\n\n /**\n * @method formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent(formKey) {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n\n let FC = {\n // .common() is used to create the display in the list\n common: () => {\n return {\n key: formKey,\n\n // // but since this is a common place holder: use the\n // // multilingual label here:\n // labelKey: 'ab.abfield.labelPlaceholder',\n // icon: 'square'\n };\n },\n\n // .newInstance() is used to create the view instance when the component\n // \t\tis dropped onto the ABView list.\n newInstance: (application, parent) => {\n application = application ?? this.AB._mockApp;\n\n // NOTE: in case you were wondering, the base ABField\n // \t\t will just return a label with 'ABFieldPlaceholder'\n // \t\t as the text. Any sub class of ABField should overwrite\n // \t\t this and return an actual Form Component.\n\n // store object id and field id to field component\n const values = FC.common();\n values.settings = values.settings || {};\n values.settings.objectId = this.object.id;\n values.settings.fieldId = this.id;\n\n const ABFieldPlaceholder = application.viewNew(\n values,\n application,\n parent\n ); // ABViewManager.newView(values, application, parent);\n // ABFieldPlaceholder.formatTitle();\n // ABFieldPlaceholder.text = \"ABFieldPlaceholder\";\n\n return ABFieldPlaceholder;\n },\n };\n return FC;\n }\n\n /**\n * @method detailComponent\n */\n detailComponent() {\n return {\n common: () => {\n return {\n icon: \"square\",\n };\n },\n\n // .newInstance() is used to create the view instance when the component\n // \t\tis dropped onto the ABView list.\n newInstance: (application, parent) => {\n application = application ?? this.AB._mockApp;\n\n // store object id and field id to field component\n const values = this.detailComponent().common();\n values.settings = values.settings || {};\n values.settings.objectId = this.object.id;\n values.settings.fieldId = this.id;\n\n const ABFieldPlaceholder = application.viewNew(\n values,\n application,\n parent\n ); // ABViewManager.newView(values, application, parent);\n\n return ABFieldPlaceholder;\n },\n };\n }\n\n /**\n * @method getSettings()\n * return a copy of this.settings.\n * @return {object}\n */\n getSettings() {\n return Object.assign({}, this.settings);\n }\n\n /**\n * @method warningsMessage()\n * generate a commonly formatted warning message for this ABField.\n * This is expected to be called from within a .warningsEval()\n * method when generating warnings.\n * @param {string} msg\n * the warning string to display\n * @param {json} data\n * any relevant additional information for a developer to refer to.\n */\n warningsMessage(msg, data = {}) {\n let message = `${this.fieldKey()}[${this.label}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n\n async getDbInfo() {\n return this.AB.Network.get({\n url: `/definition/info/object/${this.object.id}/field/${this.id}`,\n });\n }\n\n /**\n * @method formCleanData()\n * Review the data a form is about to submit and change/remove it as\n * appropriate.\n * @param {obj} rowData\n * The {data} a form has collected and is about to save.\n * @return {undefined}\n */\n formCleanData(rowData) {\n // default is to just leave data as is.\n }\n};\n","const ABFieldAutoIndexCore = require(\"../../core/dataFields/ABFieldAutoIndexCore\");\n\nmodule.exports = class ABFieldAutoIndex extends ABFieldAutoIndexCore {\n // constructor(values, object) {\n // super(values, object);\n // }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldAutoIndex\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = null; // read only\n config.css = \"textCell\";\n config.template = (rowData) => {\n // if this isn't part of a group header display the default format\n if (!rowData.$group) {\n return this.format(rowData);\n } else {\n return \"\";\n }\n };\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"fieldreadonly\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-fieldreadonly\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","const ABFieldBooleanCore = require(\"../../core/dataFields/ABFieldBooleanCore\");\n\nmodule.exports = class ABFieldBoolean extends ABFieldBooleanCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldBoolean\n columnHeader(options) {\n options = options || {};\n\n const config = super.columnHeader(options);\n\n config.editor = \"template\";\n config.css = \"center\";\n config.template = (row, common, value, config) => {\n // Group header\n if (row.$group) return row[this.columnName];\n\n // editable\n if (options.editable) {\n return (\n '
    ' +\n common.checkbox(row, common, value, config) +\n \"
    \"\n );\n }\n\n // readonly\n else {\n if (value)\n return \"
    \";\n else return \"
    \";\n }\n };\n\n return config;\n }\n\n /**\n * @method formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"checkbox\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-checkbox\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailcheckbox\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","const ABFieldCalculateCore = require(\"../../core/dataFields/ABFieldCalculateCore\");\n\nmodule.exports = class ABFieldCalculate extends ABFieldCalculateCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldCalculate\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = null; // read only\n config.css = \"textCell\";\n config.template = (rowData) => {\n if (rowData.$group) return rowData[this.columnName];\n\n return this.format(rowData);\n };\n\n return config;\n }\n\n /**\n * @method formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"fieldreadonly\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-fieldreadonly\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","const ABFieldCombineCore = require(\"../../core/dataFields/ABFieldCombineCore\");\n\nmodule.exports = class ABFieldCombine extends ABFieldCombineCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldCombine\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = null; // read only\n config.css = \"textCell\";\n config.template = (rowData) => {\n // if this isn't part of a group header display the default format\n if (!rowData.$group) {\n return this.format(rowData);\n } else {\n return \"\";\n }\n };\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"fieldreadonly\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-fieldreadonly\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n warningsEval() {\n super.warningsEval();\n\n (this.settings.combinedFields.split(\",\") || []).forEach((id) => {\n var field = this.object.fieldByID(id);\n if (!field) {\n this.warningsMessage(`dependent field[${id}] not found.`, {\n fieldID: id,\n combinedFields: this.settings.combinedFields,\n });\n }\n });\n }\n};\n","const ABFieldConnectCore = require(\"../../core/dataFields/ABFieldConnectCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABFieldConnect extends ABFieldConnectCore {\n constructor(values, object, fieldDefaults) {\n super(values, object, fieldDefaults);\n }\n\n /**\n * @method destroy()\n *\n * destroy the current instance of ABApplication\n *\n * also remove it from our _AllApplications\n *\n * @return {Promise}\n */\n async destroy() {\n // verify we have been .save()d before:\n if (!this.id) return Promise.resolve();\n\n // NOTE: our .migrateXXX() routines expect the object to currently exist\n // in the DB before we perform the DB operations. So we need to\n // .migrateDrop() before we actually .objectDestroy() this.\n // this.migrateDrop()\n // // .then(() => {\n // // // NOTE : prevent recursive remove connected fields\n // // // - remove this field from JSON\n // // this.object._fields = this.object.fields((f) => {\n // // return f.id != this.id;\n // // });\n // // })\n // .then(() => {\n // // Save JSON of the object\n // return this.object.fieldRemove(this);\n // })\n await super.destroy();\n\n // Now we need to remove our linked Object->field\n\n const linkObject = this.datasourceLink;\n if (!linkObject) return Promise.resolve(); // already notified\n\n const linkField = this.fieldLink;\n if (!linkField) return Promise.resolve(); // already notified\n\n // destroy linked field\n return linkField.destroy();\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method pullRelationValues\n *\n * On the Web client, we want our returned relation values to be\n * ready for Webix objects that require a .text and .value field.\n *\n * @param {*} row\n * @return {array}\n */\n pullRelationValues(row) {\n let selectedData = [];\n\n const data = super.pullRelationValues(row);\n const linkedObject = this.datasourceLink;\n\n if (data && linkedObject) {\n // if this select value is array\n if (Array.isArray(data)) {\n selectedData = data.map(function (d) {\n // display label in format\n if (d) {\n d.text = d.text || linkedObject.displayData(d);\n d.value = d.text;\n }\n\n return d;\n });\n } else if (data.id || data.uuid) {\n selectedData = data;\n selectedData.text =\n selectedData.text || linkedObject.displayData(selectedData);\n selectedData.value = selectedData.text;\n } else if (typeof data == \"string\") {\n selectedData = { text: data };\n }\n }\n\n return selectedData;\n }\n\n columnHeader(options) {\n options = options || {};\n const config = super.columnHeader(options);\n const field = this;\n const App = field.AB._App;\n\n if (options.filters == null) {\n options.filters = {};\n }\n\n var multiselect = this.settings.linkType == \"many\";\n\n config.editor = multiselect ? \"multiselect\" : \"combo\";\n config.editFormat = (value) => {\n return this.editFormat(value);\n };\n config.editParse = (value) => {\n return this.editParse(value);\n };\n config.template = (row) => {\n var selectedData = field.pullRelationValues(row);\n var values = [];\n values.push('
    ');\n if (\n selectedData &&\n Array.isArray(selectedData) &&\n selectedData.length\n ) {\n selectedData.forEach((val) => {\n values.push(\n `
    ${val.value}
    `\n );\n });\n if (selectedData.length > 1) {\n values.push(\n `${selectedData.length}`\n );\n }\n } else if (selectedData.value) {\n let clear = \"\";\n if (options.editable) {\n clear = ``;\n }\n values.push(\n `
    ${clear}${selectedData.value}
    `\n );\n } else {\n return \"\";\n }\n values.push(\"
    \");\n return values.join(\"\");\n };\n\n config.suggest = {\n on: {\n onBeforeShow: function () {\n field.openOptions(this);\n },\n },\n\n // Support partial matches\n filter: ({ value }, search) =>\n (value ?? \"\").toLowerCase().includes((search ?? \"\").toLowerCase()),\n };\n\n if (multiselect) {\n config.suggest.view = \"checksuggest\";\n config.suggest.button = true;\n }\n\n return config;\n }\n\n openOptions($suggest) {\n // PREVENT repeatedly pull data:\n // If not a x->1 relation and the options list was populated, then skip\n const $list = $suggest.getList();\n if (this.settings.linkViaType != \"one\") {\n if (($list?.find({}) ?? []).length) return;\n }\n\n // Listen create/update events of the linked object, then clear data list to re-populate\n [\"create\", \"update\"].forEach((key) => {\n if (this[`_dc_${key}_event`]) return;\n\n this[`_dc_${key}_event`] = this.AB.on(\n `ab.datacollection.${key}`,\n (res) => {\n if (this.datasourceLink.id == res.objectId) $list.clearAll();\n }\n );\n });\n\n this.getAndPopulateOptions($suggest, null, this);\n }\n\n /*\n * @function customEdit\n *\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n * unique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n\n //// NOTE: why do we pass in row, App, and node? is this something we do in our external components?\n //// are these values present when this Object is instanciated? Can't we just pass these into the\n //// object constructor and have it internally track these things?\n customEdit(row, /*App,*/ node) {\n // var selectedData = this.pullRelationValues(row);\n // this._selectedData = selectedData;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"connect\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-connect\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailconnect\",\n };\n };\n\n return detailComponentSetting;\n }\n\n /**\n * @method getOptions\n * show options list in selectivity\n *\n * @return {Promise}\n */\n async getOptions(whereClause, term, sort, editor, populate = false) {\n const theEditor = editor;\n\n if (theEditor) {\n // PREVENT: repeatly refresh data too often\n if (theEditor._getOptionsThrottle) {\n clearTimeout(theEditor._getOptionsThrottle);\n // NOTE: remove variables that reference the Promise and Resolve to let GC cleans up.\n // https://dev.to/xnimorz/js-promises-3-garbage-collection-and-memory-leaks-2oi7?fbclid=IwAR1wqgNz2KqchaM7eRkclR6YWHT01eva4y5IWpnaY0in6BrxmTAtpNCnEXM\n delete theEditor._timeToPullData;\n delete theEditor._getOptionsResolve;\n }\n theEditor._timeToPullData = await new Promise((resolve) => {\n theEditor._getOptionsResolve = resolve;\n theEditor._getOptionsThrottle = setTimeout(() => {\n resolve(true);\n }, 100);\n });\n if (!theEditor._timeToPullData) return;\n }\n\n return new Promise((resolve, reject) => {\n let haveResolved = false;\n // {bool}\n // have we already passed back a result?\n\n const respond = (options) => {\n // filter the raw lookup with the provided search term\n options = options.filter((item) => {\n if (item.text.toLowerCase().includes(term.toLowerCase())) {\n return true;\n }\n });\n\n if (!haveResolved) {\n haveResolved = true;\n resolve(options);\n } else {\n // if we have already resolved() then .emit() that we have\n // updated \"option.data\".\n this.emit(\"option.data\", options);\n }\n };\n\n // Prepare Where clause\n\n const where = this.AB.cloneDeep(whereClause || {});\n sort = sort || [];\n\n if (!where.glue) where.glue = \"and\";\n\n if (!where.rules) where.rules = [];\n\n term = term || \"\";\n\n // check if linked object value is not define, should return a empty array\n if (!this.settings.linkObject) return [];\n\n // if options was cached\n // if (this._options != null) return resolve(this._options);\n\n const linkedObj = this.datasourceLink;\n\n // System could not found the linked object - It may be deleted ?\n if (linkedObj == null) throw new Error(\"No linked object\");\n\n const linkedCol = this.fieldLink;\n\n // System could not found the linked field - It may be deleted ?\n if (linkedCol == null) throw new Error(\"No linked column\");\n\n // Get linked object model\n const linkedModel = linkedObj.model();\n\n // M:1 - get data that's only empty relation value\n if (\n this.settings.linkType == \"many\" &&\n this.settings.linkViaType == \"one\" &&\n editor?.config?.showAllOptions != true\n ) {\n where.rules.push({\n key: linkedCol.id,\n rule: \"is_null\",\n });\n // where[linkedCol.columnName] = null;\n }\n // 1:1\n else if (\n this.settings.linkType == \"one\" &&\n this.settings.linkViaType == \"one\" &&\n editor?.config?.showAllOptions != true\n ) {\n // 1:1 - get data is not match link id that we have\n if (this.settings.isSource == true) {\n // NOTE: make sure \"haveNoRelation\" shows up as an operator\n // the value \":0\" doesn't matter, we just need 'haveNoRelation' as an operator.\n // newRule[linkedCol.id] = { 'haveNoRelation': 0 };\n where.rules.push({\n key: linkedCol.id,\n rule: \"have_no_relation\",\n });\n }\n // 1:1 - get data that's only empty relation value by query null value from link table\n else {\n where.rules.push({\n key: linkedCol.id,\n rule: \"is_null\",\n });\n // newRule[linkedCol.id] = 'null';\n // where[linkedCol.id] = null;\n }\n }\n\n const storageID = this.getStorageID(where);\n\n Promise.resolve()\n .then(async () => {\n // Mar 23, 2023 disabling local storage of options because users\n // were reporting not seeing the correct options list with either\n // new, updated or deleted records that should or should not appear\n return false;\n // Get Local Storage unless xxx->one connected field\n // if (this?.settings?.linkViaType != \"one\") {\n // // We store the .findAll() results locally and return that for a\n // // quick response:\n // return await this.AB.Storage.get(storageID);\n // }\n })\n .then(async (storedOptions) => {\n if (storedOptions) {\n // immediately respond with our stored options.\n this._options = storedOptions;\n return respond(this._options);\n }\n // Pull linked object data\n let options = function () {\n return linkedModel.findAll({\n where: where,\n sort: sort,\n populate,\n });\n };\n\n // placeholder for selected options\n let selected = function () {\n return new Promise((resolve, reject) => {\n // empty data array to pass to all()\n resolve({ data: [] });\n });\n };\n\n const selectedValue = theEditor?.config?.value;\n\n // we also need to get selected values of xxx->one connections\n // if we are looking at a field in a form we look at linkViaOneValues\n // if we are looking at a grid we are editing we look at theEditor?.config?.value\n if (\n // this?.settings?.linkViaType == \"one\" &&\n this?.linkViaOneValues ||\n (!Array.isArray(selectedValue) && selectedValue) ||\n (Array.isArray(selectedValue) && selectedValue.length)\n ) {\n let values = \"\";\n // determine if we are looking in a grid or at a form field\n if (\n (theEditor?.config?.view == \"multicombo\" ||\n theEditor?.config?.view == \"combo\") &&\n this?.linkViaOneValues\n ) {\n values = this?.linkViaOneValues;\n } else if (theEditor?.config?.value) {\n if (Array.isArray(theEditor.config.value)) {\n values = theEditor?.config?.value.join();\n } else {\n values = theEditor?.config?.value;\n }\n }\n let whereRels = {};\n let sortRels = [];\n\n whereRels.glue = \"or\";\n whereRels.rules = [];\n\n // make sure values are unique:\n let valHash = {};\n values.split(\",\").forEach((v) => {\n if (v) valHash[v] = v;\n });\n Object.keys(valHash).forEach((v) => {\n whereRels.rules.push({\n key: linkedObj.PK(),\n rule: \"equals\",\n value: v,\n });\n });\n selected = function () {\n return linkedModel.findAll({\n where: whereRels,\n sort: sortRels,\n populate: false,\n });\n };\n }\n try {\n const results = await Promise.all([options(), selected()]);\n\n // combine options and selected items and\n // put the selected options at the top of the list\n const result = results[1].data.concat(results[0].data);\n\n // store results in _options\n this._options = result.data || result || [];\n\n // populate display text\n (this._options || []).forEach((opt) => {\n opt.text = linkedObj.displayData(opt);\n opt.value = opt.text;\n });\n\n // 8/10/2023 - We are not actually using this (see line 338) - If we need to store\n // user data in local storage we should encrypt it.\n // cache options if not a xxx->one connection\n // if (this?.settings?.linkViaType != \"one\") {\n // this.AB.Storage.set(storageID, this._options);\n // }\n return respond(this._options);\n } catch (err) {\n this.AB.notify.developer(err, {\n context:\n \"ABFieldConnect:getOptions(): unable to retrieve options from server\",\n field: this.toObj(),\n where,\n });\n\n haveResolved = true;\n throw err;\n }\n });\n });\n }\n\n getStorageID(where) {\n return `${this.id}-${JSON.stringify(where)}`;\n }\n\n async clearStorage(where) {\n const storageID = this.getStorageID(where);\n await this.AB.Storage.set(storageID, null);\n }\n\n editFormat(value) {\n if (!value) return \"\";\n let vals = [];\n if (Array.isArray(value)) {\n value.forEach((val) => {\n if (typeof val == \"object\") {\n vals.push(val.id);\n } else {\n let itemObj = this.getItemFromVal(val);\n if (itemObj && itemObj.id) {\n vals.push(itemObj.id);\n } else {\n vals.push(val);\n }\n }\n });\n } else {\n if (typeof value == \"object\") {\n vals.push(value.id);\n } else {\n let itemObj = this.getItemFromVal(value);\n if (itemObj && itemObj.id) {\n vals.push(itemObj.id);\n } else {\n vals.push(value);\n }\n }\n }\n return vals.join();\n }\n\n editParse(value) {\n var multiselect = this.settings.linkType == \"many\";\n if (multiselect) {\n if (!value) {\n return [];\n } else {\n let returnVals = [];\n let vals = value;\n if (typeof value == \"string\") vals = value.split(\",\");\n vals.forEach((val) => {\n returnVals.push(this.getItemFromVal(val));\n });\n return returnVals;\n }\n } else {\n let item = this.getItemFromVal(value);\n return item;\n }\n }\n\n getAndPopulateOptions(editor, options, field, form) {\n if (!editor) return Promise.resolve([]);\n\n const theEditor = editor;\n // if editor has options and is xxx->one store the options on the field\n if (\n this?.settings?.linkViaType == \"one\" &&\n theEditor.getValue() &&\n !field.linkViaOneValues\n ) {\n field.linkViaOneValues = theEditor.getValue();\n }\n\n // if we are filtering based off another selectivity's value we\n // need to do it on fetch each time because the value can change\n // copy the filters so we don't add to them every time there is a change\n const combineFilters = options?.filters\n ? Object.assign({}, options.filters)\n : { glue: \"and\", rules: [] };\n\n if (options?.filterByConnectValues) {\n const parseFilterByConnectValues = (conditions, values, depth = 0) => {\n const valuesByDepth = values.filter((e) => e?.depth === depth);\n\n return [\n ...conditions.rules.map((e) => {\n if (e.glue)\n return {\n glue: e.glue,\n rules: parseFilterByConnectValues(e, values, depth + 1),\n };\n\n const value = valuesByDepth.filter(\n (ef) => ef.key === e.key && ef.value === e.value\n )[0];\n\n if (!value) return e;\n\n const $parentField = value?.filterValue?.config.id\n ? $$(value.filterValue.config.id)\n : null;\n\n if (!$parentField)\n throw Error(\n \"Some parent field's view components don't exist\"\n );\n\n const parentValue = value?.filterValue\n ? $parentField.getValue() ?? \"\"\n : \"\";\n\n let newVal = \"\";\n\n if (parentValue) {\n if (value.filterColumn) {\n const filterField = field.object.fieldByID(\n value.filterValue.config.dataFieldId\n );\n let valItem;\n\n // When options does not load yet, then pull select value from DC\n if (!filterField._options?.length) {\n const linkedField =\n (form.datacollection.datasource?.fields(\n (f) =>\n f.id == value.value ||\n f.columnName == value.value\n ) ?? [])[0];\n\n if (linkedField) {\n // Get values from DC\n const formVals = form.datacollection?.getCursor();\n\n valItem =\n formVals[linkedField.relationName()] ??\n formVals[value.value];\n }\n } else {\n valItem = filterField.getItemFromVal(parentValue);\n }\n\n if (valItem) {\n newVal = valItem[value.filterColumn];\n } else {\n newVal = parentValue;\n }\n } else {\n newVal = parentValue;\n }\n }\n\n return {\n key: e.key,\n rule: \"equals\",\n value: newVal,\n };\n }),\n ];\n };\n\n combineFilters.rules = parseFilterByConnectValues(\n combineFilters,\n options.filterByConnectValues\n );\n }\n\n if (!this.handlerOptionData) {\n this.handlerOptionData = (data) => {\n if (theEditor.$destructed) {\n this.removeListener(\"option.data\", this.handlerOptionData);\n return;\n }\n this.populateOptions(theEditor, data, field, form, true);\n };\n }\n\n // try to make sure we don't continually add up listeners.\n this.removeListener(\"option.data\", this.handlerOptionData).once(\n \"option.data\",\n this.handlerOptionData\n );\n\n return new Promise((resolve, reject) => {\n this.getOptions(\n combineFilters,\n \"\",\n options?.sort ?? \"\",\n theEditor\n ).then(async (data) => {\n await this.populateOptions(theEditor, data, field, form, true);\n resolve(data);\n });\n });\n }\n\n async populateOptions(theEditor, data, field, form, addCy) {\n if (theEditor == null || theEditor.$destructed) return;\n\n await this._sortByRecent(data);\n\n theEditor.blockEvent();\n theEditor.getList().clearAll();\n theEditor.getList().define(\"data\", data);\n if (addCy) {\n this.populateOptionsDataCy(theEditor, field, form);\n }\n if (theEditor.getValue?.() && data?.length) {\n let currVal = theEditor.getValue();\n // in a multiselect environment, the current val can be an encoded string:\n // \"id1,id2\". Break this into an array:\n if (field.linkType() == \"many\" && typeof currVal == \"string\") {\n currVal = currVal.split(\",\");\n }\n if (!Array.isArray(currVal)) {\n currVal = [currVal];\n }\n\n let selectedVals = [];\n currVal.forEach((cVal) => {\n // Check exists item\n const isExists = data.some((d) => d.id == cVal);\n\n if (isExists) {\n selectedVals.push(cVal);\n }\n\n // if we couldn't find it by it's .id, then check to see\n // if there is a custom index (.indexField .indexField2)\n // that does match.\n // Select option item from custom index value\n if (\n !isExists &&\n field.isConnection &&\n (field.indexField || field.indexField2)\n ) {\n const selectedItem = data.filter(\n (d) =>\n d[field.indexField?.columnName ?? \"\"] == cVal ||\n d[field.indexField2?.columnName ?? \"\"] == cVal\n )[0];\n\n if (selectedItem) selectedVals.push(selectedItem.id);\n }\n });\n\n theEditor.setValue(selectedVals);\n }\n theEditor.unblockEvent();\n }\n\n populateOptionsDataCy(theEditor, field, form) {\n if (theEditor?.$destructed) return;\n\n // Add data-cy attributes\n if (theEditor?.getList) {\n if (!theEditor.getPopup) return;\n var popup = theEditor.getPopup();\n if (!popup) return;\n theEditor.getList().data.each((option) => {\n if (!option) return;\n var node = popup.$view.querySelector(\n \"[webix_l_id='\" + option.id + \"']\"\n );\n if (!node) return;\n node.setAttribute(\n \"data-cy\",\n `${field.key} options ${option.id} ${field.id} ${form?.id}`\n );\n });\n }\n }\n\n getItemFromVal(val) {\n let item;\n let options = this._options || [];\n if (options.length > 0) {\n for (let i = 0; i < options.length; i++) {\n if (\n this.indexField &&\n options[i][this.indexField.object.PK()] == val\n ) {\n item = options[i];\n break;\n } else if (\n this.indexField2 &&\n options[i][this.indexField2.object.PK()] == val\n ) {\n item = options[i];\n break;\n } else {\n if (\n options[i].id == val ||\n options[i].value == val ||\n options[i][this.indexField?.columnName ?? \"\"] == val ||\n options[i][this.indexField2?.columnName ?? \"\"] == val\n ) {\n item = options[i];\n break;\n }\n }\n }\n return item;\n } else {\n return \"\";\n }\n }\n\n getValue(item) {\n let val = item.getValue();\n var multiselect = this.settings.linkType == \"many\";\n if (multiselect) {\n let vals = [];\n if (!Array.isArray(val)) {\n if (val) {\n val = val.split(\",\");\n val.forEach((record) => {\n // make sure we are returning the .uuid values and\n // not full {Record} values.\n vals.push(\n this.getRelationValue(item.getList().getItem(record), {\n forUpdate: true,\n })\n );\n });\n }\n } else {\n vals = val;\n }\n\n return vals;\n } else {\n if (val) {\n // return just the .uuid and not the full {Record}\n return this.getRelationValue(item.getList().getItem(val));\n } else {\n return \"\";\n }\n }\n }\n\n setValue(item, rowData) {\n if (!item) return;\n // if (AB.isEmpty(rowData)) return; removed because sometimes we will\n // want to set this to empty\n let val = this.pullRelationValues(rowData);\n // put in current values as options so we can display them before\n // the rest of the options are fetched when field is clicked\n if (item.getList && item.getList().count() == 0) {\n if (this.settings.linkType !== \"one\" && !Array.isArray(val)) {\n val = [val];\n }\n\n const $list = item.getList();\n\n $list.define(\"data\", val);\n $list.refresh();\n }\n\n // try to prevent form flicker:\n // Only reset the value if the value changes:\n let currVal = item.getValue();\n let newVal = Array.isArray(val)\n ? val\n .map(\n (e) =>\n this.getRelationValue(e, { forUpdate: true }) ??\n e.id ??\n e.uuid ??\n e\n )\n .join(\",\")\n : this.getRelationValue(val, { forUpdate: true }) ??\n val.id ??\n val.uuid ??\n val;\n if (currVal != newVal) {\n item.setValue(newVal);\n }\n }\n\n /**\n * @method pullRecordRelationValues\n *\n * On the Web client, we want our returned relation values to be\n * ready for Webix objects that require a .text and .value field.\n *\n * @param {*} row\n * @return {array}\n */\n pullRecordRelationValues(record) {\n var selectedData = [];\n\n var data = record;\n var linkedObject = this.datasourceLink;\n\n if (data && linkedObject) {\n // if this select value is array\n if (Array.isArray(data)) {\n selectedData = data.map(function (d) {\n // display label in format\n if (d) {\n d.text = d.text || linkedObject.displayData(d);\n d.value = d.text;\n }\n\n return d;\n });\n } else if (data.id || data.uuid) {\n selectedData = data;\n selectedData.text =\n selectedData.text || linkedObject.displayData(selectedData);\n selectedData.value = selectedData.text;\n }\n }\n\n return selectedData;\n }\n\n warningsEval() {\n super.warningsEval();\n\n var linkField = this.fieldLink;\n if (!linkField) {\n this.warningsMessage(\n `is unable to find linked field[${this.settings.linkColumn}]`,\n {\n linkColumn: this.settings.linkColumn,\n }\n );\n }\n\n let linkObj = this.datasourceLink;\n if (!linkObj) {\n this.warningsMessage(\n `is unable to find linked object[${this.settings.linkObject}]`,\n {\n linkObject: this.settings.linkObject,\n }\n );\n }\n }\n\n get _recentStorageId() {\n return `${this.id}_recent_selected`;\n }\n\n /**\n * @method saveSelect\n * This function stores the user's selected option in local storage.\n * It ensures that the user's recent selection is saved, allowing the system\n * to retrieve it and provide a more personalized experience during future visits.\n * @param {Array} selectedItems\n * @return {Promise}\n */\n async saveSelect(selectedItems) {\n if (!selectedItems) return;\n\n if (!Array.isArray(selectedItems)) selectedItems = [selectedItems];\n\n let recentSelected =\n (await this.AB.Storage.get(this._recentStorageId)) ?? [];\n\n selectedItems.forEach((item) => {\n if (item == null) return;\n\n const itemId = item.uuid ?? item.id ?? item;\n recentSelected = recentSelected.filter((id) => id != itemId);\n recentSelected.unshift(itemId);\n });\n\n return this.AB.Storage.set(this._recentStorageId, recentSelected);\n }\n\n /**\n * @method _sortByRecent\n * This function sorts the options based on the user's most recently selected item, which is retrieved from local storage.\n *\n * @param {Array} options\n */\n async _sortByRecent(options) {\n if (!options?.length) return options;\n\n const recentSelected = await this.AB.Storage.get(this._recentStorageId);\n if (!recentSelected?.length) return options;\n\n if (!Array.isArray(options)) options = [options];\n\n options.sort((a, b) => {\n const aId = a.uuid ?? a.id ?? a;\n const bId = b.uuid ?? b.id ?? b;\n\n return recentSelected.indexOf(bId) - recentSelected.indexOf(aId);\n });\n }\n};\n","const ABFieldDateCore = require(\"../../core/dataFields/ABFieldDateCore\");\n\nmodule.exports = class ABFieldDate extends ABFieldDateCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldDate\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n // if (this.settings.includeTime)\n // config.editor = \"datetime\";\n // else\n config.editor = this.AB.Account?.language() == \"th\" ? \"thaidate\" : \"date\";\n\n // allows entering characters in datepicker input, false by default\n config.editable = true;\n\n // NOTE: it seems that the default value is a string in ISO format.\n\n //// NOTE: webix seems unable to parse ISO string into => date here.\n // config.map = '(date)#'+this.columnName+'#'; // so don't use this.\n\n config.template = (row) => {\n if (row.$group) return row[this.columnName];\n\n return this.format(row);\n };\n\n config.format = (d) => {\n const rowData = {};\n rowData[this.columnName] = d;\n\n return this.format(rowData);\n };\n\n config.editFormat = (d) => {\n // this routine needs to return a Date() object for the editor to work with.\n\n if (d == \"\" || d == null) {\n return \"\";\n }\n\n // else retun the actual ISO string => Date() value\n return this.AB.rules.toDate(d);\n };\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent(\"datepicker\");\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"datepicker\",\n };\n };\n\n return formComponentSetting;\n }\n\n formComponentMobile() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent(\"mobile-date\");\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"mobile-date\",\n };\n };\n\n return formComponentSetting;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n dateToString(dateFormat, dateData) {\n return webix.Date.dateToStr(dateFormat)(dateData);\n }\n\n // Overwrite core.format to use webix locales.\n format(rowData) {\n if (!window.webixLocale) return super.format(rowData);\n const d = this.dataValue(rowData);\n\n if (d == \"\" || d == null) {\n return \"\";\n }\n const dateObj = this.AB.rules.toDate(d);\n\n const dateFormat = this.settings.dateFormat;\n // @const {int} dateFormat AB Date Format\n // 1 - ignore, 2 - dd/mm/yyyy, 3 - mm/dd/yyyy, 4 - M D, yyyy, 5 - D M, yyyy\n\n // Return longdate if option 4 or 5\n if (dateFormat >= 4) {\n return webix.i18n.longDateFormatStr(dateObj);\n } else {\n return webix.i18n.dateFormatStr(dateObj);\n }\n }\n};\n","const ABFieldDateTimeCore = require(\"../../core/dataFields/ABFieldDateTimeCore\");\n\nmodule.exports = class ABFieldDateTime extends ABFieldDateTimeCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n // isValid() {\n // const validator = super.isValid();\n\n // // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n // return validator;\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldDate\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n // Ignore date\n if (this.settings.dateFormat == 1) {\n config.editor = \"time\";\n } else {\n config.editor =\n this.AB.Account?._config?.languageCode == \"th\"\n ? \"thaidatetime\"\n : \"datetime\";\n }\n\n // allows entering characters in datepicker input, false by default\n config.editable = true;\n\n // NOTE: it seems that the default value is a string in ISO format.\n\n //// NOTE: webix seems unable to parse ISO string into => date here.\n // config.map = '(date)#'+this.columnName+'#'; // so don't use this.\n\n config.template = (row) => {\n if (row.$group) return row[this.columnName];\n\n return this.format(row);\n };\n\n config.format = (d) => {\n const rowData = {};\n rowData[this.columnName] = d;\n\n return this.format(rowData);\n };\n\n config.editFormat = (d) => {\n // this routine needs to return a Date() object for the editor to work with.\n\n if (d == \"\" || d == null) {\n return \"\";\n }\n\n // else retun the actual ISO string => Date() value\n return this.AB.rules.toDate(d);\n };\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent(\"datepicker\");\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"datepicker\",\n };\n };\n\n return formComponentSetting;\n }\n\n formComponentMobile() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent(\"mobile-datetime\");\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"mobile-datetime\",\n };\n };\n\n return formComponentSetting;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n // Overwrite core.format to use webix locales.\n format(rowData) {\n if (!window.webixLocale) return super.format(rowData);\n const d = this.dataValue(rowData);\n\n if (d == \"\" || d == null) {\n return \"\";\n }\n const dateObj = this.AB.rules.toDate(d);\n\n const dateFormat = this.settings.dateFormat;\n // @const {int} dateFormat AB Date Format\n // 1 - ignore, 2 - dd/mm/yyyy, 3 - mm/dd/yyyy, 4 - M D, yyyy, 5 - D M, yyyy\n const timeToStr = webix.Date.dateToStr(this.getTimeFormat());\n\n if (dateFormat >= 4) {\n return `${webix.i18n.longDateFormatStr(dateObj)} ${timeToStr(\n dateObj\n )}`;\n } else {\n return `${webix.i18n.dateFormatStr(dateObj)} ${timeToStr(dateObj)}`;\n }\n }\n};\n","const ABFieldEmailCore = require(\"../../core/dataFields/ABFieldEmailCore\");\n\nmodule.exports = class ABFieldEmail extends ABFieldEmailCore {\n // constructor(values, object) {\n // super(values, object);\n // }\n\n ///\n /// Instance Methods\n ///\n\n // isValid() {\n // const validator = super.isValid();\n\n // // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n // return validator;\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldBoolean\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = \"text\";\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"textbox\",\n settings: {\n type: \"single\",\n },\n };\n };\n\n return formComponentSetting;\n }\n\n formComponentMobile() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"mobile-email\",\n settings: {},\n };\n };\n\n return formComponentSetting;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","const ABFieldFileCore = require(\"../../core/dataFields/ABFieldFileCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABFieldFile extends ABFieldFileCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n /**\n * @function destroy\n * On a destroy operation, ask if the user wants to keep the related file.\n */\n async destroy() {\n return new Promise((resolve, reject) => {\n // verify we have been .save()d before:\n if (!this.id) {\n resolve();\n return;\n }\n\n // Ask the user what to do about the existing file:\n webix.confirm({\n title: L(\"Keep Files?\"),\n message: L(\"Do you want to keep the files referenced by {0}?\", [\n this.label,\n ]),\n callback: async (result) => {\n // update this setting so the server can respond correctly in\n // ABFieldFile.migrateDrop()\n this.settings.removeExistingData = result ? 0 : 1;\n\n try {\n await this.save();\n\n // TODO: a reminder that you still got alot on the server to do!\n webix.alert({\n title: \"!! TODO !!\",\n text: \"Tell a Developer to actually pay attention to this!\",\n });\n\n // now the default .destroy()\n await super.destroy();\n\n resolve();\n } catch (err) {\n reject(err);\n }\n },\n });\n });\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldFile\n columnHeader(options) {\n options = options || {};\n\n const config = super.columnHeader(options);\n\n config.editor = false;\n\n const editable = options.editable;\n\n // populate our default template:\n config.template = (obj) => {\n if (obj.$group) return this.dataValue(obj);\n\n const fileDiv = [\n '
    ',\n '
    ',\n '
    ',\n this.fileTemplate(obj, editable),\n \"
    \",\n \"
    \",\n \"
    \",\n ].join(\"\");\n\n return fileDiv;\n };\n\n return config;\n }\n\n /*\n * @function customDisplay\n * perform any custom display modifications for this field.\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customDisplay(row, App, node, options) {\n // sanity check.\n if (!node) {\n return;\n }\n options = options || {};\n\n let typesList = [];\n let maximumSize = 0;\n\n if (this.settings.limitFileType && this.settings.fileType) {\n typesList = this.settings.fileType.split(\",\");\n }\n\n if (this.settings.limitFileSize && this.settings.fileSize) {\n maximumSize = this.settings.fileSize;\n }\n\n // \t\t// safety check:\n // \t\t// webix seems to crash if you specify a .container that doesn't exists:\n // \t\t// Note: when the template is first created, we don't have App.unique()\n const parentContainer = node.querySelector(\".ab-file-holder\");\n if (parentContainer) {\n parentContainer.innerHTML = \"\";\n // parentContainer.id = idBase;\t// change it to the unique one.\n\n // \t\t\t// use a webix component for displaying the content.\n // \t\t\t// do this so I can use the progress spinner\n\n const webixContainer = webix.ui({\n view: \"template\",\n container: parentContainer,\n\n template: this.fileTemplate(row, options.editable),\n\n borderless: true,\n width: 160,\n height: 60,\n });\n webix.extend(webixContainer, webix.ProgressBar);\n\n // \t\t\t////\n // \t\t\t//// Prepare the Uploader\n // \t\t\t////\n\n if (!options.editable) {\n const domNode = parentContainer.querySelector(\".delete-image\");\n if (domNode) domNode.style.display = \"none\";\n\n return;\n }\n\n const url = this.urlUpload(true);\n\n const uploader = webix.ui({\n view: \"uploader\",\n apiOnly: true,\n upload: url,\n inputName: \"file\",\n multiple: false,\n on: {\n // when a file is added to the uploader\n onBeforeFileAdd: function (item) {\n node.classList.remove(\"webix_invalid\");\n node.classList.remove(\"webix_invalid_cell\");\n\n // verify file type\n const acceptableTypes = typesList;\n if (acceptableTypes && acceptableTypes != \"\") {\n const type = item.type.toLowerCase();\n if (acceptableTypes.indexOf(type) == -1) {\n webix.message(\n L(\"Only [{0}] files are supported\", [\n acceptableTypes.join(\", \"),\n ])\n );\n return false;\n }\n }\n\n //verify file size\n //Convert to MegaBytes\n if (maximumSize > 0) {\n const acceptableSizes = maximumSize * 1000000;\n if (item.size > acceptableSizes) {\n webix.message(\n L(\"Maximum file size is {0}MB\", [maximumSize])\n );\n return false;\n }\n }\n\n // start progress indicator\n webixContainer.showProgress({\n type: \"icon\",\n delay: 2000,\n });\n },\n\n // when upload is complete:\n onFileUpload: async (item, response) => {\n webixContainer.hideProgress();\n // this.showFile(idBase, response.data.uuid);\n\n const values = {};\n values[this.columnName] = {};\n values[this.columnName].uuid = response.data.uuid;\n values[this.columnName].filename = item.name;\n\n // update just this value on our current object.model\n if (row.id) {\n try {\n await this.object.model().update(row.id, values);\n\n // update the client side data object as well so other data changes won't cause this save to be reverted\n if ($$(node) && $$(node).updateItem)\n $$(node).updateItem(row.id, values);\n } catch (err) {\n node.classList.add(\"webix_invalid\");\n node.classList.add(\"webix_invalid_cell\");\n\n this.AB.notify.developer(err, {\n context:\n \"ABFieldFile.onFileUpload(): Error updating our entry.\",\n row: row,\n values: values,\n });\n }\n }\n\n // update value in the form component\n this.setValue($$(node), values);\n },\n\n // if an error was returned\n onFileUploadError: (item, response) => {\n this.AB.notify.developer(new Error(\"Error loading file\"), {\n message:\n \"ABFieldFile:onFileUploadError(): Error loading file\",\n response,\n });\n webixContainer.hideProgress();\n },\n },\n });\n uploader.addDropZone(webixContainer.$view);\n\n // store upload id into html element (it will be used in .customEdit)\n node.dataset[\"uploaderId\"] = uploader.config.id;\n\n // open file upload dialog when's click\n node.addEventListener(\"click\", (e) => {\n if (e.target.className.indexOf(\"delete-image\") > -1) {\n this.deleteFile = true;\n }\n });\n }\n }\n\n /*\n * @function customEdit\n *\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customEdit(row, App, node) {\n if (this.deleteFile == true) {\n // remove the property because it is only needed to prevent the file dialog from showing\n delete this.deleteFile;\n\n // Ask the user if they really want to delete the photo\n webix.confirm({\n title: \"\",\n text: L(\"Are you sure you want to remove this file?\"),\n callback: async (result) => {\n const confirmDelete = result ? 1 : 0;\n if (confirmDelete) {\n // update just this value on our current object.model\n const values = {};\n\n values[this.columnName] = {};\n\n if (row.id) {\n try {\n await this.object.model().update(row.id, values);\n\n // update the client side data object as well so other data changes won't cause this save to be reverted\n if ($$(node) && $$(node).updateItem)\n $$(node).updateItem(row.id, values);\n } catch (err) {\n node.classList.add(\"webix_invalid\");\n node.classList.add(\"webix_invalid_cell\");\n\n this.AB.notify.developer(err, {\n message:\n \"ABFieldFile:customEdit(): Error updating our entry.\",\n row: row,\n values: values,\n });\n }\n }\n // update value in the form component\n else {\n this.setValue($$(node), values);\n }\n }\n },\n });\n } else {\n const rowData = this.dataValue(row);\n if (!rowData || !rowData.uuid) {\n const uploaderId = node.dataset[\"uploaderId\"],\n uploader = $$(uploaderId);\n\n if (uploader && uploader.fileDialog)\n uploader.fileDialog({ rowid: row.id });\n }\n }\n\n return false;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"fieldcustom\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-file\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailcustom\",\n };\n };\n\n return detailComponentSetting;\n }\n\n //File Template\n\n fileTemplate(obj, editable) {\n let iconDisplay = \"\";\n let fileDisplay = \"display:none;\";\n let fileURL = \"\";\n\n let value = \"\";\n let name = \"\";\n\n const rowData = this.dataValue(obj);\n if (rowData) {\n value = rowData.uuid;\n name = rowData.filename;\n }\n\n if (value && name) {\n iconDisplay = \"display:none;\";\n fileDisplay = \"\";\n fileURL = \"/file/\" + value;\n }\n\n const html = [\n `
    ${\n editable ? `
    ${L(\"Drag and drop or click here\")}` : \"\"\n }
    `,\n `
    ${\n name || \"\"\n }${\n editable\n ? ``\n : \"\"\n }
    `,\n ].join(\"\");\n\n return html;\n }\n\n getValue(item, rowData) {\n const file = item.$view.querySelector(\".file-data-field-name\");\n const fileLink = file.querySelector(\"a\");\n\n return {\n uuid: file.getAttribute(\"file-uuid\"),\n filename: fileLink.innerHTML,\n };\n }\n\n setValue(item, rowData) {\n if (!item) return;\n\n const domNode = item.$view;\n if (!domNode) return;\n\n let val = null;\n if (rowData) {\n val = this.dataValue(rowData);\n\n // if (val == null) {\n // \t// assume they just sent us a single value\n // \tval = rowData;\n // }\n }\n\n const fileicon = domNode.querySelector(\".file-data-field-icon\");\n if (fileicon) fileicon.style.display = val && val.uuid ? \"none\" : \"block\";\n\n const file = domNode.querySelector(\".file-data-field-name\");\n if (file) {\n const fileDeleteIcon = file.querySelector(\".ab-delete-photo\");\n if (fileDeleteIcon)\n fileDeleteIcon.style.display = val && val.uuid ? \"block\" : \"none\";\n\n file.style.display = val && val.uuid ? \"block\" : \"none\";\n if (val && val.uuid) file.setAttribute(\"file-uuid\", val.uuid);\n else file.removeAttribute(\"file-uuid\");\n\n const fileLink = file.querySelector(\"a\");\n const fileURL = \"/file/\" + (val ? val.uuid : \"\");\n fileLink.href = fileURL;\n fileLink.innerHTML = val ? val.filename : \"\";\n }\n }\n\n /**\n * @method urlUpload()\n * return the url for uploading a file.\n * When used in a webix widget, the response is different than our normal\n * API, so we can pass in a param to indicate a response compatible with\n * webix.\n * @param {bool} isWebix\n * Is this url being used by a webix component?\n * @return {string}\n */\n urlUpload(isWebix = true) {\n return `/file/upload/${this.object.id}/${this.id}/${isWebix ? \"1\" : \"0\"}`;\n }\n\n /**\n * @method urlFile\n * return the url to use to reference the file by it's id.\n * @param {string} id uuid reference of this file.\n * @return {string}\n */\n urlFile(id) {\n return `/file/${id}`;\n }\n};\n","const ABFieldFormulaCore = require(\"../../core/dataFields/ABFieldFormulaCore\");\n\nmodule.exports = class ABFieldFormula extends ABFieldFormulaCore {\n // constructor(values, object) {\n // super(values, object);\n // }\n\n ///\n /// Instance Methods\n ///\n\n // isValid() {\n // const validator = super.isValid();\n\n // // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n // return validator;\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldFormula\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = null; // read only\n config.css = \"textCell\";\n config.template = (rowData) => {\n if (rowData.$group) return rowData[this.columnName];\n\n return this.format(rowData);\n };\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // not support in the form widget\n return super.formComponent(\"fieldreadonly\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-fieldreadonly\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","const ABFieldImageCore = require(\"../../core/dataFields/ABFieldImageCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABFieldImage extends ABFieldImageCore {\n constructor(values, object) {\n super(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @function destroy\n * On a destroy operation, ask if the user wants to keep the related images.\n */\n async destroy() {\n return new Promise((resolve, reject) => {\n // verify we have been .save()d before:\n if (this.id) {\n // Ask the user what to do about the existing images:\n webix.confirm({\n title: L(\"Keep Images?\"),\n message: L(\"Do you want to keep the images referenced by {0}?\", [\n this.label,\n ]),\n callback: async (result) => {\n // update this setting so the server can respond correctly in\n // ABFieldImage.migrateDrop()\n this.settings.removeExistingData = result ? 0 : 1;\n\n try {\n await this.save();\n\n // TODO: a reminder that you still got alot on the server to do!\n webix.alert({\n title: \"!! TODO !!\",\n text: \"ABFieldImage.destroy(): Tell a Developer to actually pay attention to this!\",\n });\n\n await super.destroy();\n\n resolve();\n } catch (err) {\n reject(err);\n }\n },\n });\n } else {\n resolve(); // nothing to do really\n }\n });\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n idCustomContainer(obj, formId) {\n // if formId is passed the field is in a form view not a grid and\n // we won't have the obj and each time this\n // field is in a form it will conflict with the last one rendered\n if (formId) {\n return `${this.columnName.replace(/ /g, \"_\")}-${formId}-image`;\n } else {\n return `${this.columnName.replace(/ /g, \"_\")}-${obj.id}-image`;\n }\n }\n\n // return the grid column header definition for this instance of ABFieldImage\n columnHeader(options) {\n options = options || {};\n\n const config = super.columnHeader(options);\n const field = this;\n\n config.editor = false; // 'text'; // '[edit_type]' for your unique situation\n // config.sort = 'string' // '[sort_type]' for your unique situation\n\n let containerHeight = \"100%\";\n let imageHeight = \"100%\";\n let width = \"100%\";\n let imageSrcHeight = \"100%\";\n if (field.settings.useWidth) {\n config.width = field.settings.imageWidth || 100;\n const heightVal =\n field.settings.useHeight && field.settings.imageHeight\n ? field.settings.imageHeight + 20\n : 80;\n containerHeight = `${heightVal}px`;\n width = `${field.settings.imageWidth || 100}px`;\n imageHeight =\n field.settings.useHeight && field.settings.imageHeight\n ? field.settings.imageHeight\n : 80;\n imageHeight = `${imageHeight}px`;\n imageSrcHeight =\n field.settings.useHeight && field.settings.imageHeight\n ? field.settings.imageHeight\n : 60;\n imageSrcHeight = `${imageSrcHeight}px`;\n } else if (options.width) {\n config.width = options.width || 100;\n width = `${options.width || 100}px`;\n imageHeight = options.width;\n imageHeight = `${imageHeight}px`;\n imageSrcHeight = options.width;\n imageSrcHeight = `${imageSrcHeight}px`;\n }\n if (\n field.settings.useHeight &&\n field.settings.imageHeight &&\n field.settings.imageHeight != \"NaN\"\n ) {\n config.height = field.settings.imageHeight || 0;\n containerHeight = parseInt(config.height) + 20;\n containerHeight = `${containerHeight}px`;\n imageHeight = parseInt(config.height);\n imageHeight = `${imageHeight}px`;\n imageSrcHeight = parseInt(config.height);\n imageSrcHeight = `${imageSrcHeight}px`;\n }\n\n const editable = options.editable;\n\n // populate our default template:\n // debugger;\n config.template = (obj) => {\n if (obj.$group) return obj[this.columnName];\n\n const widthStyle = `width: ${width}; height: ${containerHeight}`;\n\n const imageStyle = `width: ${width}; height: ${imageHeight}`;\n\n const imgDiv = [\n `
    `,\n `
    `,\n '
    ',\n this.imageTemplate(obj, {\n editable: editable,\n height: imageSrcHeight,\n width: width,\n }),\n \"
    \",\n \"
    \",\n \"
    \",\n ].join(\"\");\n\n return imgDiv;\n };\n\n return config;\n }\n\n /*\n * @function customDisplay\n * perform any custom display modifications for this field.\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n * @param {object} options - {\n * \t\teditable {Bool} where or not this field is currently editable\n * \t\tformId {string} the id of the presenting form if any\n * }\n */\n customDisplay(row, App, node, options) {\n // sanity check.\n if (!node) {\n return;\n }\n\n options = options || {};\n\n // safety check:\n // webix seems to crash if you specify a .container that doesn't exists:\n // Note: when the template is first created, we don't have App.unique()\n const parentContainer = node.querySelector(\".ab-image-holder\");\n if (parentContainer) {\n parentContainer.innerHTML = \"\";\n // parentContainer.id = idBase;\t// change it to the unique one.\n\n let imgHeight = 0;\n if (this.settings.useHeight) {\n imgHeight = parseInt(this.settings.imageHeight) || imgHeight;\n }\n\n let imgWidth = 0;\n if (this.settings.useWidth) {\n imgWidth = parseInt(this.settings.imageWidth) || imgWidth;\n }\n\n if (options.height) imgHeight = options.height;\n\n if (options.width) imgWidth = options.width;\n //// TODO: actually pay attention to the height and width when\n //// displaying the images.\n\n // use a webix component for displaying the content.\n // do this so I can use the progress spinner\n const webixContainer = webix.ui({\n view: \"template\",\n css: \"ab-image-holder\",\n // id: ids.container,\n container: parentContainer,\n\n template: this.imageTemplate(row, {\n editable: options.editable,\n height: imgHeight ? imgHeight + \"px\" : 0,\n width: imgWidth ? imgWidth + \"px\" : 0,\n }),\n\n borderless: true,\n height: imgHeight,\n width: imgWidth,\n });\n webix.extend(webixContainer, webix.ProgressBar);\n\n ////\n //// Prepare the Uploader\n ////\n\n if (!options.editable) {\n const domNode = parentContainer.querySelector(\".delete-image\");\n if (domNode) domNode.style.display = \"none\";\n return;\n }\n\n const url = this.urlUpload();\n\n const uploader = webix.ui({\n view: \"uploader\",\n // id:ids.uploader,\n apiOnly: true,\n upload: url,\n inputName: \"file\",\n multiple: false,\n status: (f) => {\n if (f.percent) {\n webixContainer.hideProgress();\n webixContainer.showProgress({\n type: \"top\",\n position: f.percent / 100,\n });\n }\n },\n // formData:{\n // \tappKey:application.name,\n // \tpermission:actionKey,\n // \tisWebix:true,\n // \timageParam:'upload'\n // },\n on: {\n // when a file is added to the uploader\n onBeforeFileAdd: (item) => {\n node.classList.remove(\"webix_invalid\");\n node.classList.remove(\"webix_invalid_cell\");\n\n // verify file type\n const acceptableTypes = [\n \"jpg\",\n \"jpeg\",\n \"bmp\",\n \"png\",\n \"gif\",\n \"webp\",\n ];\n const type = item.type.toLowerCase();\n if (acceptableTypes.indexOf(type) == -1) {\n webix.message(\n L(\"Only [{0}] images are supported\", [\n acceptableTypes.join(\", \"),\n ])\n );\n return false;\n }\n this.uploadInProgress = true;\n // Display the image from local file\n var reader = new FileReader();\n reader.onload = (e) => {\n this.showImage(null, node, e.target.result);\n webixContainer.showProgress({\n type: \"top\",\n delay: 2000,\n });\n };\n reader.readAsDataURL(item.file);\n },\n\n // when upload is complete:\n onFileUpload: async (item, response) => {\n webixContainer.hideProgress();\n this.showImage(response.data.uuid, node);\n this.uploadInProgress = false;\n\n const values = {};\n values[this.columnName] = response.data.uuid;\n\n // update just this value on our current object.model\n if (row.id) {\n try {\n await this.object.model().update(row.id, values);\n\n // update the client side data object as well so other data changes won't cause this save to be reverted\n if (\n $$(node) &&\n $$(node).getItem &&\n $$(node).getItem(row.id)\n ) {\n $$(node).updateItem(row.id, values);\n } else {\n // if you scroll the table the connection to the datatable is lost so we need to find it again\n const dataTable =\n document.querySelector(\".webix_dtable\");\n if ($$(dataTable) && $$(dataTable).getItem(row.id))\n $$(dataTable).updateItem(row.id, values);\n }\n } catch (err) {\n node.classList.add(\"webix_invalid\");\n node.classList.add(\"webix_invalid_cell\");\n\n this.AB.notify.developer(err, {\n context:\n \"ABFieldImage.onFileUpload(): model.update(): error updating our entry\",\n field: this.toObj(),\n row,\n values,\n });\n }\n }\n\n // update value in the form component\n this.setValue($$(node), values);\n },\n\n // if an error was returned\n onFileUploadError: (item, response) => {\n this.AB.notify.developer(new Error(\"Error uploading image\"), {\n context: \"ABFieldImage. uploader. onFileUploadError():\",\n field: this.toObj(),\n response,\n });\n webixContainer.hideProgress();\n },\n },\n });\n uploader.addDropZone(webixContainer.$view);\n\n // store upload id into html element (it will be used in .customEdit)\n node.dataset[\"uploaderId\"] = uploader.config.id;\n\n // if we are working in a datagrid we need to add a click event to\n // check if the user is clicking on the delete button\n if (node.className == \"webix_cell\") {\n node.addEventListener(\"click\", (e) => {\n if (e.target.className.indexOf(\"delete-image\") > -1) {\n this.deleteImage = true;\n }\n });\n }\n }\n }\n\n /*\n * @function customEdit\n *\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customEdit(row, App, node, id, evt) {\n if (\n (evt && evt.target.className.indexOf(\"delete-image\") > -1) ||\n this.deleteImage\n ) {\n delete this.deleteImage;\n if (!row.removeDefaultImage) {\n row.removeDefaultImage = [];\n }\n row.removeDefaultImage[this.columnName] = true;\n\n // Ask the user if they really want to delete the photo\n webix.confirm({\n title: L(\"Are you sure you want to remove this image?\"),\n callback: async (result) => {\n const confirmDelete = result ? 1 : 0;\n if (confirmDelete) {\n // update just this value on our current object.model\n const values = {};\n values[this.columnName] = \"\"; // removing the reference to the image here\n\n try {\n await this.object.model().update(row.id, values);\n\n // update the client side data object as well so other data changes won't cause this save to be reverted\n if ($$(node) && $$(node).updateItem)\n $$(node).updateItem(row.id, values);\n\n // update value in the form component\n this.setValue($$(node), values);\n } catch (err) {\n node.classList.add(\"webix_invalid\");\n node.classList.add(\"webix_invalid_cell\");\n\n this.AB.notify.developer(err, {\n context:\n \"ABFieldImage: customEdit(): Error updating our entry\",\n field: this.toObj(),\n row: row,\n values: values,\n });\n }\n }\n },\n });\n } else {\n const uploaderId = node.dataset[\"uploaderId\"],\n uploader = $$(uploaderId);\n\n if (uploader && uploader.fileDialog)\n uploader.fileDialog({ rowid: row.id });\n }\n\n return false;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"fieldcustom\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-image\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailimage\",\n };\n };\n\n return detailComponentSetting;\n }\n\n imageTemplate(obj, options) {\n options = options || {};\n options.height = options.height || \"100%\";\n options.width = options.width || \"100%\";\n\n // deault view is icon:\n let iconDisplay = \"\";\n let imageDisplay = \"display:none;\";\n let imageURL = \"\";\n\n let value = \"\";\n let isRemoveDefaultImage = false;\n if (obj[this.columnName]) {\n value = obj[this.columnName];\n }\n if (obj.removeDefaultImage) {\n if (obj.removeDefaultImage[this.columnName]) {\n isRemoveDefaultImage = obj.removeDefaultImage[this.columnName];\n }\n }\n\n if (value) {\n iconDisplay = \"display:none;\";\n imageDisplay = \"\";\n imageURL = `background-image:url('${this.urlImage(value)}');`;\n } else {\n if (this.settings.useDefaultImage && !isRemoveDefaultImage) {\n iconDisplay = \"display:none;\";\n imageDisplay = \"\";\n imageURL = `background-image:url('${this.urlImage(\n this.settings.defaultImageUrl\n )}');`;\n }\n }\n\n let html = [\n `
    #drag#
    ` +\n `
    #remove#
    `,\n ].join(\"\");\n\n html = html.replace(\n \"#drag#\",\n options.editable\n ? `
    ${L(\"Drag and drop or click here\")}
    `\n : \"\"\n );\n html = html.replace(\n \"#remove#\",\n options.editable\n ? ``\n : \"\"\n );\n\n return html;\n }\n\n showImage(uuid, node, url) {\n const parentContainer = node.querySelector(\".ab-image-holder\");\n if (parentContainer) {\n parentContainer.querySelector(\".image-data-field-icon\").style.display =\n \"none\";\n const image = parentContainer.querySelector(\".image-data-field-image\");\n image.style.display = \"\";\n image.style.backgroundImage = `url('${url ?? this.urlImage(uuid)}')`;\n image.setAttribute(\"image-uuid\", uuid);\n }\n }\n\n getValue(item, rowData) {\n const image = item.$view.querySelector(\".image-data-field-image\");\n return image.getAttribute(\"image-uuid\");\n }\n\n setValue(item, rowData) {\n if (!item) return;\n\n const domNode = item.$view;\n if (!domNode) return;\n\n let val = null;\n if (rowData) {\n val = this.dataValue(rowData);\n\n // if (val == null) {\n // \t// assume they just sent us a single value\n // \tval = rowData;\n // }\n }\n\n const imageIcon = domNode.querySelector(\".image-data-field-icon\");\n if (imageIcon) imageIcon.style.display = val ? \"none\" : \"\";\n\n const image = domNode.querySelector(\".image-data-field-image\");\n if (image) {\n const imageDeleteIcon = image.querySelector(\".ab-delete-photo\");\n if (imageDeleteIcon)\n imageDeleteIcon.style.display = val ? \"block\" : \"none\";\n\n image.style.display = val ? \"block\" : \"none\";\n\n if (val) {\n image.style.backgroundImage = `url('${this.urlImage(val)}')`;\n image.setAttribute(\"image-uuid\", val);\n } else {\n image.removeAttribute(\"image-uuid\");\n }\n }\n }\n\n /**\n * @method toBase64\n *\n * @param {Object} rowData\n *\n * @return {Promise} - {\n * \t\tdata: string,\n * \t\twidth: number,\n * \t\theight: number\n * }\n */\n toBase64(rowData) {\n return new Promise((resolve, reject) => {\n if (!rowData[this.columnName]) return resolve(null);\n\n const img = new Image();\n img.crossOrigin = \"Anonymous\";\n img.onerror = function (err) {\n reject(err);\n };\n img.onload = function () {\n const canvas = document.createElement(\"canvas\");\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext(\"2d\");\n ctx.drawImage(img, 0, 0);\n const dataURL = canvas.toDataURL();\n const imageData = {\n data: dataURL,\n width: img.width,\n height: img.height,\n };\n resolve(imageData);\n };\n\n img.src = this.urlImage(rowData[this.columnName]);\n });\n }\n\n /**\n * @method urlImage()\n * return the url to use to reference the image by it's id.\n * @param {string} id\n * the file.uuid reference of this image.\n * @return {string}\n */\n urlImage(id) {\n return `/file/${id}`;\n }\n\n /**\n * @method urlUpload()\n * return the url for uploading a file.\n * When used in a webix widget, the response is different than our normal\n * API, so we can pass in a param to indicate a response compatible with\n * webix.\n * @param {bool} isWebix\n * Is this url being used by a webix component?\n * @return {string}\n */\n urlUpload(isWebix = true) {\n return `/file/upload/${this.object.id}/${this.id}/${isWebix ? \"1\" : \"0\"}`;\n }\n\n /**\n * @method isValidData\n * Parse through the given data and return an error if this field's\n * data seems invalid.\n * @param {obj} data a key=>value hash of the inputs to parse.\n * @param {OPValidator} validator provided Validator fn\n * @return {array}\n */\n isValidData(data, validator) {\n super.isValidData(data, validator);\n if (this.uploadInProgress)\n validator.addError(this.columnName, L(\"Image still uploading\"));\n }\n\n rotateLeft(imgFile) {\n return this.AB.Network.put({\n url: `/image/rotate/${imgFile}?direction=left`,\n });\n }\n\n rotateRight(imgFile) {\n return this.AB.Network.put({\n url: `/image/rotate/${imgFile}?direction=right`,\n });\n }\n};\n","const ABFieldJsonCore = require(\"../../core/dataFields/ABFieldJsonCore\");\n\nmodule.exports = class ABFieldJson extends ABFieldJsonCore {\n // constructor(values, object) {\n // super(values, object);\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldJson\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n // config.editor = null; // read only for now\n config.editor = \"text\";\n config.css = \"textCell\";\n\n // when called by ABViewFormCustom, will need a .template() fn.\n // currently we don't need to return anything so ...\n config.template = () => \"\";\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // read-only for now\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"json\",\n settings: {\n type: \"string\",\n },\n };\n };\n\n return formComponentSetting;\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-fieldreadonly\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n setValue(item, rowData) {\n super.setValue(item, rowData, \"\");\n if (item) {\n item.config.value = rowData[this.columnName];\n }\n }\n\n /**\n * @method formCleanData()\n * Review the data a form is about to submit and change/remove it as\n * appropriate.\n * @param {obj} rowData\n * The {data} a form has collected and is about to save.\n * @return {undefined}\n */\n formCleanData(rowData) {\n let val = rowData[this.columnName];\n if (val === \"\") {\n // \"\" isn't a valid json value, so just remove the data and\n // let the DB handle the default value.\n delete rowData[this.columnName];\n }\n }\n};\n","const ABFieldListCore = require(\"../../core/dataFields/ABFieldListCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABFieldList extends ABFieldListCore {\n constructor(values, object) {\n super(values, object);\n\n // this._Selectivity = new ABFieldSelectivity(values, object);\n }\n\n ///\n /// Instance Methods\n ///\n\n save() {\n return super.save().then(() => {\n // Now we want to clear out any entries that had values == to item removed from our list:\n if (this.pendingDeletions.length) {\n const model = this.object.model();\n\n if (this.settings.isMultiple == true) {\n // find all the entries that have one of the deleted values:\n // use Promise to prevent issues with data being loaded before it is deleted on client side\n return new Promise((resolve, reject) => {\n let numDone = 0;\n let numToDo = 0;\n\n model\n .findAll({})\n .then((list) => {\n list = list.data || list;\n\n // for each list item\n list.forEach((item) => {\n if (Array.isArray(item[this.columnName])) {\n // get fields not in pendingDeletions\n let remainingFields = item[\n this.columnName\n ].filter((i) => {\n return (\n this.pendingDeletions.indexOf(i.id) == -1\n );\n });\n\n if (\n remainingFields.length !=\n item[this.columnName].length\n ) {\n numToDo++;\n\n // update value to new field list\n if (remainingFields.length == 0) {\n remainingFields = \"\";\n }\n const value = {};\n value[this.columnName] = remainingFields;\n model.update(item.id, value).then(() => {\n // if ($$(node) && $$(node).updateItem)\n // $$(node).updateItem(value.id, value);\n numDone++;\n if (numDone >= numToDo) {\n resolve();\n }\n });\n }\n }\n });\n if (numToDo == 0) {\n resolve();\n }\n })\n .catch(reject);\n });\n } else {\n // find all the entries that have one of the deleted values:\n const where = {};\n where[this.columnName] = this.pendingDeletions;\n return new Promise((resolve, reject) => {\n let numDone = 0;\n\n model\n .findAll(where)\n .then((list) => {\n // make sure we just work with the { data:[] } that was returned\n list = list.data || list;\n\n // for each one, set the value to ''\n // NOTE: jQuery ajax routines filter out null values, so we can't\n // set them to null. :(\n // const numDone = 0;\n const value = {};\n value[this.columnName] = \"\";\n\n list.forEach((item) => {\n model.update(item.id, value).then(() => {\n numDone++;\n if (numDone >= list.length) {\n resolve();\n }\n });\n });\n if (list.length == 0) {\n resolve();\n }\n })\n .catch(reject);\n });\n }\n }\n });\n }\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldList\n columnHeader(options) {\n options = options || {};\n\n const config = super.columnHeader(options);\n const field = this;\n const App = field.AB._App;\n\n var formClass = \"\";\n var placeHolder = \"\";\n if (options.editable) {\n formClass = \" form-entry\";\n placeHolder = `${L(\n \"Select item\"\n )}`;\n }\n var isRemovable = options.editable && !this.settings.required;\n\n config.editFormat = (value) => {\n return this.editFormat(value);\n };\n config.editParse = (value) => {\n return this.editParse(value);\n };\n\n config.template = (rowData) => {\n let selectedData = rowData[this.columnName];\n if (selectedData == null) return \"\";\n if (this.settings.isMultiple) {\n selectedData = _getSelectedOptions(this, rowData);\n }\n var values = [];\n values.push('
    ');\n let hasCustomColor = \"\";\n let optionHex = \"\";\n if (\n selectedData &&\n Array.isArray(selectedData) &&\n selectedData.length\n ) {\n selectedData.forEach((val) => {\n if (this.settings.hasColors && val.hex) {\n hasCustomColor = \"hascustomcolor\";\n optionHex = `background: ${val.hex};`;\n }\n if (val.text) {\n values.push(\n `
    ${val.text}
    `\n );\n }\n });\n if (selectedData.length > 1) {\n values.push(\n `${selectedData.length}`\n );\n }\n } else if (selectedData) {\n let selectedObj = selectedData;\n if (typeof selectedData == \"string\") {\n selectedObj = this.getItemFromVal(selectedData);\n }\n if (!selectedObj) return \"\";\n if (this.settings.hasColors && selectedObj.hex) {\n hasCustomColor = \"hascustomcolor\";\n optionHex = `background: ${selectedObj.hex};`;\n }\n if (selectedObj.text) {\n let clear = \"\";\n if (options.editable && !this.settings.required) {\n clear = ``;\n }\n values.push(\n `
    ${clear}${selectedObj.text}
    `\n );\n }\n } else {\n return \"\";\n }\n values.push(\"
    \");\n return values.join(\"\");\n };\n config.editor = this.settings.isMultiple ? \"multiselect\" : \"combo\";\n config.suggest = {\n button: true,\n data: this.settings.options.map(function (opt) {\n return {\n id: opt.id,\n value: opt.text,\n hex: opt.hex,\n };\n }),\n };\n if (this.settings.isMultiple) {\n config.suggest.view = \"checksuggest\";\n }\n\n return config;\n }\n\n /*\n * @function customDisplay\n * perform any custom display modifications for this field.\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n * unique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customDisplay(row, App, node, options) {\n // sanity check.\n if (!node) {\n return;\n }\n\n options = options || {};\n\n if (!node.querySelector) return;\n\n var clearButton = node.querySelector(\n \".selectivity-single-selected-item-remove\"\n );\n if (clearButton) {\n clearButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n var values = {};\n values[this.columnName] = \"\";\n this.object\n .model()\n .update(row.id, values)\n .then(() => {\n // update the client side data object as well so other data changes won't cause this save to be reverted\n $$(node)?.updateItem?.(row.id, values);\n })\n .catch((err) => {\n node.classList.add(\"webix_invalid\");\n node.classList.add(\"webix_invalid_cell\");\n\n this.AB.notify.developer(err, {\n message:\n \"ABFieldList:customDisplay(): Error updating our entry.\",\n row: row,\n values: \"\",\n field: this.toObj(),\n });\n });\n });\n }\n }\n\n /*\n * @function customEdit\n *\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n * unique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n // customEdit(row, App, node) {\n // return super.customEdit(row, App, node);\n // }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: this.settings.isMultiple ? \"selectmultiple\" : \"selectsingle\",\n settings: {\n options: this.settings.options.map(function (opt) {\n return {\n id: opt.id,\n value: opt.text,\n hex: opt.hex,\n };\n }),\n },\n };\n };\n\n return formComponentSetting;\n }\n\n formComponentMobile() {\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: this.settings.isMultiple\n ? \"mobile-selectmultiple\"\n : \"mobile-selectsingle\",\n settings: {\n options: this.settings.options.map(function (opt) {\n return {\n id: opt.id,\n value: opt.text,\n hex: opt.hex,\n };\n }),\n },\n };\n };\n\n return formComponentSetting;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: this.settings.isMultiple ? \"detailtext\" : \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n editFormat(value) {\n if (!value) return \"\";\n let vals = [];\n if (Array.isArray(value)) {\n value.forEach((val) => {\n if (typeof val == \"object\") {\n vals.push(val.id);\n } else {\n let itemObj = this.getItemFromVal(val);\n vals.push(itemObj.id);\n }\n });\n } else {\n if (typeof value == \"object\") {\n vals.push(value.id);\n } else {\n let itemObj = this.getItemFromVal(value);\n if (itemObj && itemObj.id) {\n vals.push(itemObj.id);\n }\n }\n }\n return vals.join();\n }\n\n editParse(value) {\n if (this.settings.isMultiple) {\n let returnVals = [];\n let vals = value.split(\",\");\n vals.forEach((val) => {\n returnVals.push(this.getItemFromVal(val));\n });\n return returnVals;\n } else {\n return value;\n }\n }\n\n getItemFromVal(val) {\n let item;\n let options = this.options();\n if (options.length > 1) {\n options.forEach((option) => {\n if (option.id == val) {\n item = option;\n return false;\n }\n });\n return item;\n } else {\n return \"\";\n }\n }\n\n getValue(item, rowData) {\n return this.editParse(item.getValue());\n }\n\n getSelectedOptions(field, rowData = {}) {\n let result = [];\n if (rowData[this.columnName] != null) {\n result = rowData[this.columnName];\n } else if (rowData) {\n if (Array.isArray(rowData)) {\n result = rowData;\n } else {\n result.push(rowData);\n }\n }\n if (result.length) {\n if (typeof result == \"string\") result = JSON.parse(result);\n\n // Pull text with current language\n if (this.settings) {\n result = (this.settings.options || []).filter((opt) => {\n return (\n (result || []).filter((v) => (opt.id || opt) == (v.id || v))\n .length > 0\n );\n });\n }\n }\n\n return result;\n }\n\n setValue(item, rowData) {\n if (!item) return;\n\n if (this.settings.isMultiple) {\n // do we need anything here?\n } else {\n super.setValue(item, rowData);\n }\n }\n};\n\n// == Private methods ==\nfunction _getSelectedOptions(field, rowData = {}) {\n let result = [];\n if (rowData[field.columnName] != null) {\n result = rowData[field.columnName];\n\n try {\n if (typeof result == \"string\") result = JSON.parse(result);\n } catch (e) {\n console.error(`Error JSON.pars()ing result [${result}]: `, e);\n // just go with what is there\n result = rowData[field.columnName];\n }\n\n // Pull text with current language\n if (field.settings) {\n result = (field.settings.options || []).filter((opt) => {\n return (\n (result || []).filter(\n (v) => opt && v && (opt.id || opt) == (v.id || v)\n ).length > 0\n );\n });\n }\n }\n\n return result;\n}\n","const ABFieldLongTextCore = require(\"../../core/dataFields/ABFieldLongTextCore\");\n\nmodule.exports = class ABFieldLongText extends ABFieldLongTextCore {\n constructor(values, object) {\n super(values, object);\n\n /*\n\t\t{\n\t\t\tsettings: {\n\t\t\t\tdefault: 'string',\n\t\t\t\tsupportMultilingual: 1/0\n\t\t\t}\n\t\t}\n\t\t*/\n }\n\n ///\n /// Instance Methods\n ///\n\n isValid() {\n const validator = super.isValid();\n\n // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n return validator;\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldLongText\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = \"text\"; // '[edit_type]' for your unique situation\n // config.sort = 'string' // '[sort_type]' for your unique situation\n config.template = (obj, common, value, col, ind) => {\n return (value || \"\").toString().replace(/[<]/g, \"<\");\n };\n\n return config;\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"textbox\",\n settings: {\n type: \"multiple\",\n },\n };\n };\n\n return formComponentSetting;\n }\n\n formComponentMobile() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"mobile-textbox\",\n settings: {\n type: \"multiple\",\n },\n };\n };\n\n return formComponentSetting;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n /**\n * @method setValue\n * this function uses for form component and mass update popup\n * to get value of fields that apply custom editor\n *\n * @param {Object} item - Webix element\n * @param {Object} rowData - data of row\n *\n * @return {Object}\n */\n setValue(item, rowData) {\n super.setValue(item, rowData, \"\");\n }\n};\n","const ABFieldNumberCore = require(\"../../core/dataFields/ABFieldNumberCore\");\n\nlet INIT_EDITOR = false;\n// {bool} INIT_EDITOR\n// Transition code between previous Framework and current.\n// we now need to wait until webix is declared or accessible globally.\n\nmodule.exports = class ABFieldNumber extends ABFieldNumberCore {\n constructor(values, object) {\n if (!INIT_EDITOR) {\n // NOTE: if you need a unique [edit_type] by your returned config.editor above:\n webix.editors.number = webix.extend(\n {\n // TODO : Validate number only\n },\n webix.editors.text\n );\n INIT_EDITOR = true;\n }\n super(values, object);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n /**\n * @method formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n // return the grid column header definition for this instance of ABFieldNumber\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = \"number\"; // [edit_type] simple inline editing.\n\n config.format = (d) => {\n const rowData = {};\n rowData[this.columnName] = d;\n\n return this.format(rowData);\n };\n\n return config;\n }\n\n /**\n * @method formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"numberbox\");\n }\n\n formComponentMobile() {\n return super.formComponent(\"mobile-numberbox\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","/*\n * ABFieldSelectivity\n *\n * An ABFieldSelectivity defines a single unique Field/Column in a ABObject.\n *\n */\n\nconst ABField = require(\"./ABField\");\n\nconst defaultSettings = {\n allowClear: true,\n removeOnly: false,\n readOnly: false,\n showDropdown: true,\n placeholder: \"\",\n multiple: false,\n};\n\nconst ABFieldSelectivityDefaults = {\n key: \"selectivity\",\n};\n\nmodule.exports = class ABFieldSelectivity extends ABField {\n constructor(values, object, fieldDefaults = ABFieldSelectivityDefaults) {\n super(values, object, fieldDefaults);\n }\n\n // return the default values for this DataField\n static defaults() {\n return {\n key: \"selectivity\",\n icon: \"bars\",\n menuName: \"\",\n description: \"\",\n };\n }\n\n selectivityRender(domNode, settings, App, row) {\n if (domNode == null) return;\n\n const cypress = settings.dataCy || \"\";\n domNode.setAttribute(\"data-cy\", cypress);\n\n // setting up our specific settings:\n settings = settings || {};\n for (const dv in defaultSettings) {\n if (settings[dv] === null) {\n settings[dv] = null;\n } else {\n settings[dv] = settings[dv] || defaultSettings[dv];\n }\n }\n\n if (\n settings.multiple &&\n settings.items &&\n settings.data &&\n settings.data.length\n ) {\n settings.data.forEach(function (d) {\n settings.items.map(function (i) {\n if (i.id == d.id) d.hex = i.hex;\n });\n });\n settings[\"data\"] = this.prepareData(\n settings[\"data\"],\n settings.multiple\n );\n } else if (settings[\"data\"] == null || settings[\"data\"] == \"\") {\n settings[\"data\"] = this.prepareData([], settings.multiple);\n } else {\n settings[\"data\"] = this.prepareData(\n settings[\"data\"],\n settings.multiple\n );\n }\n\n // store the field id so we can look it up on click events later\n settings[\"field\"] = this.id;\n\n // Prevent render selectivity duplicate\n if (domNode.selectivity != null) {\n // Refresh selectivity settings\n domNode.selectivity.setOptions(settings);\n\n return;\n }\n\n settings.element = domNode;\n\n // Render selectivity\n let selectivityInput;\n if (settings.multiple) {\n if (settings.isUsers) {\n settings.templates = {\n multipleSelectedItem: function (options) {\n return `\n\t\t\t\t\t\t\t\t \n ${\n settings.additionalText\n ? settings.additionalText(options)\n : \"\"\n }\n\t\t\t\t\t\t\t\t${!settings.isLabelHidden ? options.text : \"\"}\n\t\t\t\t\t\t\t\t${\n options.removable\n ? ` `\n : \"\"\n }\n\t\t\t\t\t\t\t`;\n },\n };\n } else {\n settings.templates = {\n multipleSelectedItem: function (options) {\n return `\n ${\n settings.editPage\n ? ` `\n : \"\"\n }\n ${\n settings.additionalText\n ? settings.additionalText(options)\n : \"\"\n }\n ${!settings.isLabelHidden ? options.text : \"\"}\n ${\n options.removable\n ? ` `\n : \"\"\n }\n\t\t\t\t\t\t\t`;\n },\n };\n }\n selectivityInput = new Selectivity.Inputs.Multiple(settings);\n\n domNode.selectivity = selectivityInput;\n this.selectivitySetBadge(domNode, App, row);\n } else {\n settings.templates = {\n singleSelectedItem: function (options) {\n return `\n\t\t\t\t\t\t\t${\n settings.editPage\n ? ''\n : \"\"\n }\n ${\n settings.additionalText\n ? settings.additionalText(options)\n : \"\"\n }\n ${!settings.isLabelHidden ? options.text : \"\"}\n ${\n options.removable\n ? ''\n : \"\"\n }\n\t\t\t\t\t\t`;\n },\n };\n\n selectivityInput = new Selectivity.Inputs.Single(settings);\n domNode.selectivity = selectivityInput;\n }\n\n if (settings.editPage) {\n const trigerEditPageEvent = () => {\n const instance = this;\n const editMenus = document.querySelectorAll(\n \".selectivity-single-selected-item-edit, .selectivity-multiple-selected-item-edit\"\n );\n for (let i = 0; i < editMenus.length; i++) {\n const eMenu = editMenus[i];\n if (eMenu && !eMenu.__hasClickEvent) {\n eMenu.addEventListener(\n \"click\",\n function (e) {\n e.stopPropagation();\n e.preventDefault();\n\n const parentElm = this.parentElement;\n if (!parentElm) return;\n\n const rowId = parentElm.getAttribute(\"data-item-id\");\n if (!rowId) return;\n\n const fieldId = parentElm.getAttribute(\"data-field-id\");\n if (!fieldId) return;\n\n const thisField = instance.object.fieldByID(fieldId);\n if (!thisField) return;\n\n thisField.emit(\"editPage\", rowId);\n },\n true\n );\n eMenu.__hasClickEvent = true;\n }\n }\n };\n\n setTimeout(() => {\n trigerEditPageEvent();\n\n domNode.addEventListener(\"change\", () => {\n trigerEditPageEvent();\n });\n }, 500);\n }\n\n // WORKAROUND : remove caret icon of selectivity\n if (settings.readOnly) {\n const caretElems = domNode.getElementsByClassName(\"selectivity-caret\");\n for (let i = 0; i < caretElems.length; i++) {\n const caretElm = caretElems[i];\n if (caretElm) {\n caretElm.parentNode.removeChild(caretElm);\n }\n }\n }\n\n // remember our settings values\n this.selectivitySettings = settings;\n }\n\n selectivityGet(domNode) {\n if (domNode && domNode.selectivity) {\n if (this.selectivitySettings && this.selectivitySettings.multiple) {\n // on a multiple select, return an array of results, or empty array\n return domNode.selectivity.getData() || [];\n } else {\n // if a single select, return the object or null\n return domNode.selectivity.getData() || null;\n }\n } else {\n if (this.selectivitySettings && this.selectivitySettings.multiple)\n return [];\n else return null;\n }\n }\n\n selectivitySet(domNode, data) {\n if (!domNode || !domNode.selectivity) return;\n\n data = this.prepareData(data, domNode.selectivity.options.multiple);\n\n if (\n (Array.isArray(data) && data[0]) || // Check Array\n (data && data.id)\n )\n // Check a object\n domNode.selectivity.setData(data);\n else domNode.selectivity.clear();\n }\n\n selectivityDestroy(domNode) {\n if (domNode && domNode.selectivity) {\n domNode.selectivity.destroy();\n\n delete domNode.selectivity;\n }\n }\n\n prepareData(data, multiple = true) {\n if (!data && multiple) {\n return [];\n } else if (multiple && data && Array.isArray(data) && data.length == 0) {\n return [];\n } else if (!multiple && data && Array.isArray(data) && data.length == 0) {\n return null;\n } else if (!data && !multiple) {\n return null;\n }\n\n if (typeof data == \"string\" && data.length > 0) {\n try {\n data = JSON.parse(data);\n } catch (e) {\n // not JSON parsable, so convert to\n data = { id: data, text: data };\n }\n }\n\n // if single select, then it should be object\n if (!multiple && Array.isArray(data)) {\n data = data[0];\n } else if (multiple && !Array.isArray(data)) {\n data = [data];\n }\n\n // check to see if id is present on each item\n if (multiple) {\n data.forEach((d) => {\n if (!d.id && d.uuid) {\n d.id = d.uuid;\n }\n });\n } else {\n if (!data.id && data.uuid) data.id = data.uuid;\n }\n\n if (data == null && multiple) {\n data = [];\n }\n\n return data;\n }\n\n selectivitySetBadge(domNode) {\n if (!domNode.clientHeight) return;\n const innerHeight = domNode.clientHeight;\n const outerHeight = domNode.parentElement.clientHeight;\n if (innerHeight - outerHeight > 5) {\n let count = 0;\n let values = [];\n if (domNode && domNode.selectivity)\n values = domNode.selectivity.getValue() || [];\n\n count = values.length;\n if (count > 1) {\n const badge = domNode.querySelector(\n \".webix_badge.selectivityBadge\"\n );\n if (badge != null) {\n badge.innerHTML = count;\n } else {\n const anchor = document.createElement(\"A\");\n anchor.href = \"javascript:void(0);\";\n // v2: this just updated the $height property for this row\n // we don't do that anymore:\n // anchor.addEventListener(\"click\", function () {\n // App.actions.onRowResizeAuto(row.id, innerHeight);\n // });\n const node = document.createElement(\"SPAN\");\n const textnode = document.createTextNode(count);\n node.classList.add(\"webix_badge\", \"selectivityBadge\");\n node.appendChild(textnode);\n anchor.appendChild(node);\n domNode.appendChild(anchor);\n }\n }\n }\n }\n};\n","const ABFieldStringCore = require(\"../../core/dataFields/ABFieldStringCore\");\n\nmodule.exports = class ABFieldString extends ABFieldStringCore {\n // constructor(values, object) {\n // super(values, object);\n\n // {\n // settings: {\n // \t default: 'string',\n // \t supportMultilingual: 1/0\n // }\n // }\n\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldString\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = \"text\";\n config.css = \"textCell\";\n // config.sort = 'string'\n config.template = (obj, common, value /* , col, ind */) => {\n // if this isn't part of a group header display the default format\n if (!obj.$group) {\n return (value || \"\").toString().replace(/[<]/g, \"<\");\n } else {\n return \"\";\n }\n };\n\n return config;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n // if no default value is set, then don't insert a value.\n if (!values[this.columnName]) {\n // Set default string\n if (this.settings.default) {\n if (this.settings.default.indexOf(\"{uuid}\") >= 0) {\n values[this.columnName] = this.AB.uuid();\n } else {\n values[this.columnName] = this.settings.default;\n }\n }\n }\n }\n\n /**\n * @method formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"textbox\",\n settings: {\n type: \"single\",\n },\n };\n };\n\n return formComponentSetting;\n }\n\n // formComponentMobile() {\n // // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // // primarily the .common() and .newInstance() methods.\n // const formComponentSetting = super.formComponent();\n\n // // .common() is used to create the display in the list\n // formComponentSetting.common = () => {\n // return {\n // key: \"mobile-textbox\",\n // settings: {\n // type: \"single\",\n // },\n // };\n // };\n\n // return formComponentSetting;\n // }\n\n /**\n * @method formComponentMobile\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponentMobile() {\n // NOTE: what is being returned here needs to mimic an ABView CLASS.\n // primarily the .common() and .newInstance() methods.\n const formComponentSetting = super.formComponent();\n\n // .common() is used to create the display in the list\n formComponentSetting.common = () => {\n return {\n key: \"mobile-textbox\",\n settings: {\n type: \"single\",\n },\n };\n };\n\n return formComponentSetting;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n\n /**\n * @method setValue\n * this function uses for form component and mass update popup\n * to get value of fields that apply custom editor\n *\n * @param {Object} item - Webix element\n * @param {Object} rowData - data of row\n *\n * @return {Object}\n */\n setValue(item, rowData) {\n super.setValue(item, rowData, \"\");\n }\n};\n","const ABFieldTextFormulaCore = require(\"../../core/dataFields/ABFieldTextFormulaCore\");\n\nmodule.exports = class ABFieldTextFormula extends ABFieldTextFormulaCore {\n // constructor(values, object) {\n // super(values, object);\n // }\n\n ///\n /// Instance Methods\n ///\n\n // isValid() {\n // const validator = super.isValid();\n\n // // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n // return validator;\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n // return the grid column header definition for this instance of ABFieldTextFormula\n columnHeader(options) {\n const config = super.columnHeader(options);\n\n config.editor = null; // read only\n config.css = \"textCell\";\n config.template = (rowData) => {\n // if this isn't part of a group header display the default format\n if (!rowData.$group) {\n return this.format(rowData);\n } else {\n return \"\";\n }\n };\n\n return config;\n }\n\n /*\n * @function customDisplay\n * perform any custom display modifications for this field.\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customDisplay(/* row, App, node, options */) {}\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n // not support in the form widget\n return null;\n }\n\n formComponentMobile() {\n return null;\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtext\",\n };\n };\n\n return detailComponentSetting;\n }\n};\n","const ABFieldTreeCore = require(\"../../core/dataFields/ABFieldTreeCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABFieldTree extends ABFieldTreeCore {\n // constructor(values, object) {\n // super(values, object);\n // }\n\n ///\n /// Instance Methods\n ///\n\n // isValid() {\n // const validator = super.isValid();\n\n // // validator.addError('columnName', L('ab.validation.object.name.unique', 'Field columnName must be unique (#name# already used in this Application)').replace('#name#', this.name) );\n\n // return validator;\n // }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n idCustomContainer(obj) {\n return `${this.columnName.replace(/ /g, \"_\")}-${obj.id}-tree`;\n }\n\n // return the grid column header definition for this instance of ABFieldTree\n columnHeader(options) {\n options = options || {};\n\n const config = super.columnHeader(options);\n const field = this;\n\n let formClass = \"\";\n let placeHolder = \"\";\n if (options.isForm) {\n formClass = \" form-entry\";\n placeHolder =\n \"\" +\n L(\"Select items\") +\n \"\";\n }\n\n const width = options.width;\n\n config.template = (obj) => {\n if (obj.$group) return obj[field.columnName];\n\n const branches = [];\n let selectOptions = this.AB.cloneDeep(field.settings.options);\n selectOptions = new webix.TreeCollection({\n data: selectOptions,\n });\n\n let values = obj;\n if (obj[field.columnName] != null) {\n values = obj[field.columnName];\n }\n\n selectOptions.data.each(function (obj) {\n if (\n typeof values.indexOf != \"undefined\" &&\n values.indexOf(obj.id) != -1\n ) {\n let html = \"\";\n\n let rootid = obj.id;\n while (this.getParentId(rootid)) {\n selectOptions.data.each(function (par) {\n if (selectOptions.data.getParentId(rootid) == par.id) {\n html = par.text + \": \" + html;\n }\n });\n rootid = this.getParentId(rootid);\n }\n\n html += obj.text;\n branches.push(html);\n }\n });\n\n const myHex = \"#4CAF50\";\n let nodeHTML = \"\";\n nodeHTML += \"
    \";\n if (branches.length == 0) {\n nodeHTML += placeHolder;\n } else {\n branches.forEach(function (item) {\n nodeHTML +=\n '' +\n item +\n \"\";\n });\n }\n nodeHTML += \"
    \";\n\n // field.setBadge(node, App, row);\n\n if (width) {\n return (\n '
    ' +\n nodeHTML +\n \"
    \"\n );\n } else {\n return (\n '
    ' +\n nodeHTML +\n \"
    \"\n );\n }\n };\n\n return config;\n }\n\n /*\n * @function customDisplay\n * perform any custom display modifications for this field.\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customDisplay(row, App, node, options) {\n // sanity check.\n if (!node) {\n return;\n }\n\n options = options || {};\n\n const field = this;\n\n if (options.isForm) {\n if (!row || row.length == 0) {\n node.innerHTML =\n \"
    \" +\n L(\"Select items\") +\n \"
    \";\n return;\n }\n\n const branches = [];\n options = this.AB.cloneDeep(field.settings.options);\n options = new webix.TreeCollection({\n data: options,\n });\n\n let values = row;\n if (row[field.columnName] != null) {\n values = row[field.columnName];\n }\n\n options.data.each(function (obj) {\n if (\n typeof values.indexOf != \"undefined\" &&\n values.indexOf(obj.id) != -1\n ) {\n let html = \"\";\n\n let rootid = obj.id;\n while (this.getParentId(rootid)) {\n options.data.each(function (par) {\n if (options.data.getParentId(rootid) == par.id) {\n html = par.text + \": \" + html;\n }\n });\n rootid = this.getParentId(rootid);\n }\n\n html += obj.text;\n branches.push(html);\n }\n });\n\n const myHex = \"#4CAF50\";\n let nodeHTML = \"\";\n nodeHTML += \"
    \";\n branches.forEach(function (item) {\n nodeHTML +=\n '' +\n item +\n \"\";\n });\n nodeHTML += \"
    \";\n\n node.innerHTML = nodeHTML;\n }\n\n field.setBadge(node, App, row);\n }\n\n /*\n * @function customEdit\n *\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n *\t\t\t\t\tunique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n customEdit(row, App, node, component) {\n const idBase = App.unique(this.idCustomContainer(row));\n const idPopup = `${idBase}-popup`;\n const idTree = `${idBase}-tree`;\n const view = $$(node);\n const field = this;\n const parentComponent = component;\n let values = {};\n let firstRender = true;\n\n function getValues(field, row) {\n let values = {};\n if (\n typeof field != \"undefined\" &&\n typeof field.columnName != \"undefined\" &&\n typeof row[field.columnName] != \"undefined\"\n ) {\n values = row[field.columnName];\n }\n return values;\n }\n\n function populateTree(field, vals) {\n values = getValues(field, vals);\n\n const $Tree = $$(idTree);\n $Tree.blockEvent(); // prevents endless loop\n\n const options = field.AB.cloneDeep(field.settings.options);\n $Tree.clearAll();\n $Tree.parse(options);\n $Tree.refresh();\n $Tree.uncheckAll();\n $Tree.openAll();\n\n if (values != null && values.length) {\n values.forEach(function (id) {\n if ($Tree.exists(id)) {\n $Tree.checkItem(id);\n const dom = $Tree.getItemNode(id);\n dom.classList.add(\"selected\");\n }\n });\n }\n $Tree.unblockEvent();\n }\n\n if ($$(idPopup)) {\n $$(idPopup).show();\n populateTree(this, row);\n } else {\n webix\n .ui({\n id: idPopup,\n view: \"popup\",\n width: 500,\n height: 400,\n on: {\n onShow: () => {\n if (firstRender == true) populateTree(this, row);\n\n firstRender = false;\n },\n },\n body: {\n id: idTree,\n view: \"tree\",\n css: \"ab-data-tree\",\n template: function (obj, common) {\n return (\n \"\"\n );\n },\n on: {\n onItemCheck: async function (id, value, event) {\n const dom = this.getItemNode(id);\n const tree = this;\n if (value == true) {\n dom.classList.add(\"selected\");\n } else {\n dom.classList.remove(\"selected\");\n }\n // works for the same-level children only\n // except root items\n if (this.getParentId(id)) {\n tree.blockEvent(); // prevents endless loop\n\n let rootid = id;\n while (this.getParentId(rootid)) {\n rootid = this.getParentId(rootid);\n if (rootid != id) tree.uncheckItem(rootid);\n }\n\n this.data.eachSubItem(rootid, function (item) {\n if (item.id != id) tree.uncheckItem(item.id);\n });\n\n tree.unblockEvent();\n } else {\n tree.blockEvent(); // prevents endless loop\n this.data.eachSubItem(id, function (obj) {\n if (obj.id != id) tree.uncheckItem(obj.id);\n });\n tree.unblockEvent();\n }\n const values = {};\n values[field.columnName] = $$(idTree).getChecked();\n\n if (row.id) {\n // pass null because it could not put empty array in REST api\n if (values[field.columnName].length == 0)\n values[field.columnName] = \"\";\n\n try {\n await field.object.model().update(row.id, values);\n\n // update the client side data object as well so other data changes won't cause this save to be reverted\n if (view && view.updateItem) {\n view.updateItem(row.id, values);\n }\n } catch (err) {\n node.classList.add(\"webix_invalid\");\n node.classList.add(\"webix_invalid_cell\");\n\n this.AB.notify.developer(err, {\n message:\n \"ABFieldTree:onItemClick(): Error updating our entry.\",\n row: row,\n values: values,\n });\n }\n } else {\n const rowData = {};\n rowData[field.columnName] = $$(idTree).getChecked();\n\n field.setValue($$(parentComponent.ui.id), rowData);\n }\n },\n },\n },\n })\n .show(node, {\n x: -7,\n });\n }\n return false;\n }\n\n setBadge(domNode, row) {\n const field = this;\n domNode = domNode.querySelector(\".list-data-values\");\n const innerHeight = domNode.scrollHeight;\n const outerHeight = domNode.parentElement.clientHeight;\n if (innerHeight - outerHeight > 5) {\n let count = 0;\n if (row[field.columnName] && row[field.columnName].length)\n count = row[field.columnName].length;\n else count = 0;\n\n if (count > 1) {\n const badge = domNode.querySelector(\n \".webix_badge.selectivityBadge\"\n );\n if (badge != null) {\n badge.innerHTML = count;\n } else {\n const anchor = document.createElement(\"A\");\n anchor.href = \"javascript:void(0);\";\n anchor.addEventListener(\"click\", function (event) {\n // v2: this was just saving the new height to the\n // field properties. We don't do that anymore:\n // App.actions.onRowResizeAuto(row.id, innerHeight);\n event.stopPropagation();\n });\n const node = document.createElement(\"SPAN\");\n const textnode = document.createTextNode(count);\n node.classList.add(\"webix_badge\", \"selectivityBadge\");\n node.appendChild(textnode);\n anchor.appendChild(node);\n domNode.appendChild(anchor);\n }\n }\n }\n }\n\n /*\n * @funciton formComponent\n * returns a drag and droppable component that is used on the UI\n * interface builder to place form components related to this ABField.\n *\n * an ABField defines which form component is used to edit it's contents.\n * However, what is returned here, needs to be able to create an instance of\n * the component that will be stored with the ABViewForm.\n */\n formComponent() {\n return super.formComponent(\"formtree\");\n }\n\n detailComponent() {\n const detailComponentSetting = super.detailComponent();\n\n detailComponentSetting.common = () => {\n return {\n key: \"detailtree\",\n };\n };\n\n return detailComponentSetting;\n }\n\n getValue(item, rowData) {\n let values = {};\n values = item.getValues();\n return values;\n }\n\n setValue(item, rowData) {\n if (!item) return false;\n\n const val = rowData[this.columnName] || [];\n\n item.setValues(val);\n // get dom\n const dom = item.$view.querySelector(\".list-data-values\");\n\n if (!dom) return false;\n\n // set value to selectivity\n this.customDisplay(val, this.App, dom, {\n editable: true,\n isForm: true,\n });\n\n setTimeout(function () {\n let height = 33;\n if (dom.scrollHeight > 33) {\n height = dom.scrollHeight;\n }\n item.config.height = height + 5;\n item.resize();\n }, 200);\n }\n};\n","const ABFieldConnectCore = require(\"../../core/dataFields/ABFieldConnectCore\");\nconst ABFieldUserCore = require(\"../../core/dataFields/ABFieldUserCore\");\n\nmodule.exports = class ABFieldUser extends ABFieldUserCore {\n constructor(values, object, fieldDefaults) {\n super(values, object, fieldDefaults);\n }\n\n ///\n /// Working with Actual Object Values:\n ///\n\n async save() {\n // Add new\n if (this.id == null) {\n const SiteUser = this.AB.objectUser();\n const Defaults = ABFieldUserCore.defaults();\n\n this.settings.linkObject = SiteUser.id;\n this.settings.isCustomFK = 1;\n\n if (this.settings.isMultiple) {\n this.settings.indexField2 = Defaults.USERNAME_FIELD_ID;\n this.settings.linkType = \"many\";\n this.settings.linkViaType = \"many\";\n this.settings.isSource = 1;\n } else {\n this.settings.indexField = Defaults.USERNAME_FIELD_ID;\n this.settings.linkType = \"one\";\n this.settings.linkViaType = \"many\";\n this.settings.isSource = 1;\n }\n\n // TODO: .fieldCustomNew() for saving \"local\" changes.\n // NOTE: The Object adding this Field sees it's data as a ABFieldUser\n // connection.\n // However, the SiteUser will see the data as a ABFieldConnect\n // connection\n const linkCol = SiteUser.fieldNew({\n key: ABFieldConnectCore.defaults().key,\n columnName: `${this.object.name}_${this.label}`,\n label: this.object.label,\n settings: {\n showIcon: this.settings.showIcon,\n linkObject: this.object.id,\n linkType: this.settings.linkViaType,\n linkViaType: this.settings.linkType,\n isCustomFK: this.settings.isCustomFK,\n indexField: this.settings.indexField,\n indexField2: this.settings.indexField2,\n isSource: 0,\n },\n });\n\n // // Create definitions of the connected fields\n // // NOTE: skip directly to the ABMLClass.save() to avoid the\n // // migrations caused during the ABField.save() operations.\n // await ABFieldUserCore.prototype.save.call(this);\n\n // linkCol.settings.linkColumn = this.id;\n // await ABFieldUserCore.prototype.save.call(linkCol);\n\n // // Update the id value of linked field to connect together\n // this.settings.linkColumn = linkCol.id;\n // await ABFieldUserCore.prototype.save.call(this);\n\n let newDef = await this.toDefinition().save();\n this.id = newDef.id;\n\n linkCol.settings.linkColumn = this.id;\n let newLinkDef = await linkCol.toDefinition().save();\n linkCol.id = newLinkDef.id;\n\n this.settings.linkColumn = linkCol.id;\n await this.toDefinition().save();\n\n // Add fields to Objects\n await this.object.fieldAdd(this);\n\n await SiteUser.fieldAdd(linkCol);\n\n // Create column to DB\n await this.migrateCreate();\n\n await linkCol.migrateCreate();\n\n return this;\n } else {\n return super.save();\n }\n }\n\n // return the grid column header definition for this instance of ABFieldUser\n\n columnHeader(options) {\n // debugger;\n options = this.setDisplayOptions(options);\n return super.columnHeader(options);\n }\n\n /**\n * @function customDisplay\n * perform any custom display modifications for this field.\n * @param {object} row is the {name=>value} hash of the current row of data.\n * @param {App} App the shared ui App object useful more making globally\n * unique id references.\n * @param {HtmlDOM} node the HTML Dom object for this field's display.\n */\n // customDisplay(row, App, node, options = {}) {\n // debugger;\n // options = this.setDisplayOptions(options);\n //\n // return super.customDisplay(row, App, node, options);\n // }\n\n setDisplayOptions(options) {\n options = options || {};\n options.editable =\n this.settings.editable != null ? this.settings.editable : true;\n\n options.isLabelHidden =\n this.settings.isShowUsername != null\n ? !this.settings.isShowUsername\n : false;\n\n options.additionalText = (opt) => {\n if (!this.settings.isShowProfileImage) return \"\";\n\n if (opt.image_id)\n return ``;\n else return ' ';\n };\n\n return options;\n }\n\n /**\n * @method defaultValue\n * insert a key=>value pair that represent the default value\n * for this field.\n * @param {obj} values a key=>value hash of the current values.\n */\n defaultValue(values) {\n if (this.settings.isCurrentUser) {\n if (this.settings.isMultiple) {\n values[this.columnName] = [\n {\n id: this.AB.Account.username(),\n text: this.AB.Account.username(),\n },\n ];\n } else {\n values[this.columnName] = this.AB.Account.username();\n }\n }\n }\n\n getValue(item) {\n let val = super.getValue(item);\n\n if (val) {\n if (typeof val == \"string\")\n val = val.replace(/ab-current-user/g, this.AB.Account.username());\n else if (Array.isArray(val))\n val = val.map((v) =>\n (v?.username ?? v?.uuid ?? v?.id ?? v)?.replace(\n /ab-current-user/g,\n this.AB.Account.username()\n )\n );\n }\n\n return val;\n }\n\n setValue(item, rowData) {\n let val = rowData[this.columnName];\n if (val === \"\") {\n // this means this value isn't set.\n // can we remove this from the data?\n delete rowData[this.columnName];\n super.setValue(item, rowData);\n return;\n }\n\n if (this.linkType() == \"many\") {\n // val should be an array.\n if (!Array.isArray(val)) {\n val = [val];\n }\n // if any of those contain \"ab-current-user\" replace it:\n val = val.map((v) =>\n v == \"ab-current-user\" ? this.AB.Account.username() : v\n );\n } else {\n // val is a single entry string\n // Select \"[Current user]\" to update\n if (val == \"ab-current-user\") val = this.AB.Account.username();\n }\n\n rowData[this.columnName] = val;\n\n super.setValue(item, rowData);\n }\n\n getUsers() {\n return this.AB.Account.userList().map((u) => {\n const result = {\n id: u.username,\n image: u.image_id,\n };\n\n if (this.settings.isMultiple) {\n result.text = u.username;\n } else {\n result.value = u.username;\n }\n\n return result;\n });\n }\n\n getOptions(...params) {\n return super.getOptions(...params).then((options) => {\n // in a ABFieldUser, our options.id elements need to have\n // the username, not the .uuid:\n (options || []).forEach((o) => {\n if (o.username) {\n o.id = o.username;\n }\n });\n\n return options;\n });\n }\n\n pullRelationValues(row) {\n let values = super.pullRelationValues(row);\n\n // remember, our .id == .username\n if (Array.isArray(values)) {\n // prevent any null or undefined:\n values = values.filter((v) => v);\n values = values.map((v) => {\n v.id = v.username || v.id;\n return v;\n });\n } else {\n if (values) {\n values.id = values.username || values.id;\n }\n }\n\n return values;\n }\n\n pullRecordRelationValues(record) {\n let data = super.pullRecordRelationValues(record);\n if (Array.isArray(data)) {\n data = data.map((d) => {\n d.id = d.username ?? d.id;\n return d;\n });\n } else {\n data.id = data.username || data.id;\n }\n\n return data;\n }\n};\n","const ABMobilePageCore = require(\"../../core/mobile/ABMobilePageCore\");\n\nmodule.exports = class ABMobilePage extends ABMobilePageCore {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n\n // check to see if I've been updated, if so, alert my parent:\n this.__Handler_ABDEF_UPDATED = (def) => {\n if (def.id == this.id) {\n this.emit(\"definition.updated\", this);\n this.AB.off(\"ab.abdefinition.update\", this.__Handler_ABDEF_UPDATED);\n }\n };\n this.AB.on(\"ab.abdefinition.update\", this.__Handler_ABDEF_UPDATED);\n\n // check to see if any of my child pages have been updated and\n // update my defintion of them:\n this.__Handler_DEF_UPDATED = (page) => {\n // create a new Field with the updated def\n var def = this.AB.definitionByID(page.id);\n if (!def) return;\n\n var newPage = this.pageNew(def);\n\n // we want to keep the same pageID order:\n var newPages = [];\n this.pages().forEach((pg) => {\n if (pg.id === page.id) {\n newPages.push(newPage);\n return;\n }\n newPages.push(pg);\n });\n\n this._pages = newPages;\n\n page.off(\"definition.updated\", this.__Handler_DEF_UPDATED);\n };\n this.pages().forEach((p) => {\n p.on(\"definition.updated\", this.__Handler_DEF_UPDATED);\n });\n }\n\n /**\n * @method refreshInstance()\n * This returns a NEW instance of a ABMobilePage based upon the latest\n * version of it's Definition. It also resolves any current listeners\n * this copy currently has and prepare this to discard itself.\n */\n refreshInstance(parent) {\n // create a new Field with the updated def\n var def = this.AB.definitionByID(this.id);\n if (!def) return;\n\n var newPage = (parent ?? this.parent)?.pageNew(def);\n\n try {\n // detatch ourself from other emitters:\n this.AB.off(\"ab.abdefinition.update\", this.__Handler_ABDEF_UPDATED);\n this.pages().forEach((pg) => {\n pg.removeAllListeners(\"definition.updated\");\n });\n } catch (e) {\n // debugger;\n console.error(e);\n }\n\n return newPage;\n }\n\n warningsEval() {\n super.warningsEval();\n let allViews = this.views();\n if (allViews.length == 0) {\n this.warningsMessage(\"has no widgets\");\n }\n (this.pages() || []).forEach((p) => {\n p.warningsEval();\n });\n }\n};\n","const ABMobileViewCore = require(\"../../core/mobile/ABMobileViewCore.js\");\n\nmodule.exports = class ABMobileView extends ABMobileViewCore {\n // constructor(attributes, application, parent) {\n // super(attributes, application, parent);\n // }\n\n /**\n\n\n /*\n * @method componentList\n * return the list of components available on this view to display in the editor.\n * @param {bool} isEdited is this component currently in the Interface Editor\n * @return {array} of ABView objects.\n */\n componentList(isEdited) {\n // views not allowed to drop onto this View:\n var viewsToIgnore = [\n \"mobile-view\",\n \"mobile-page\",\n // \"formpanel\",\n // \"viewcontainer\",\n // // not allowed Detail's widgets\n // \"detailcheckbox\",\n // \"detailcustom\",\n // \"detailconnect\",\n // \"detailimage\",\n // \"detailselectivity\",\n // \"detailtext\",\n // \"detailtree\",\n // // not allowed Form's widgets\n // \"button\",\n // \"checkbox\",\n // \"connect\",\n // \"datepicker\",\n // \"fieldcustom\",\n // \"textbox\",\n // \"numberbox\",\n // \"selectsingle\",\n // \"selectmultiple\",\n // \"formtree\",\n // \"fieldreadonly\",\n // // not allowed Chart's Widgets\n // \"pie\",\n // \"bar\",\n // \"line\",\n // \"area\",\n // // not allowed Report page\n // \"report\",\n // \"reportPage\",\n // \"reportPanel\",\n ];\n\n var allComponents = this.application.viewAll();\n var allowedComponents = allComponents.filter((c) => {\n return viewsToIgnore.indexOf(c.common().key) == -1;\n });\n\n return allowedComponents;\n }\n\n warningsAll() {\n // report both OUR warnings, and any warnings from any of our sub views\n var allWarnings = super.warningsAll();\n this.views().forEach((v) => {\n allWarnings = allWarnings.concat(v.warningsAll());\n });\n\n (this.pages?.() || []).forEach((p) => {\n allWarnings = allWarnings.concat(p.warningsAll());\n });\n\n return allWarnings.filter((w) => w);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let allViews = this.views();\n\n (this.__missingViews || []).forEach((id) => {\n this.warningsMessage(`references unknown View[${id}]`);\n });\n\n allViews.forEach((v) => {\n v.warningsEval();\n });\n\n // if a datacollection is specified, verify it can be accessed.\n if (this.settings.dataviewID) {\n let dc = this.datacollections || this.datacollection;\n if (!dc) {\n this.warningsMessage(\n `references unknown dataviewID[${this.settings.dataviewID}]`\n );\n }\n }\n }\n\n warningsMessage(msg, data = {}) {\n let message = `${this.key}[${this.name}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n};\n","const ABMobileViewCustomCore = require(\"../../core/mobile/ABMobileViewCustomCore\");\n\nmodule.exports = class ABMobileViewCustom extends ABMobileViewCustomCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n warningsEval() {\n super.warningsEval();\n\n // Add in here any missing or unfindable setting reference\n // like datacollection ...\n }\n};\n","const ABMobileViewFormCore = require(\"../../core/mobile/ABMobileViewFormCore\");\n\nconst ABMobileViewFormButton = require(\"./ABMobileViewFormButton\");\n\nmodule.exports = class ABMobileViewForm extends ABMobileViewFormCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method refreshDefaultButton()\n * On the ABDesigner once a Form Field is added/removed from a form, we want\n * to make sure the default Form Button is pushed down to the bottom of the\n * list of form Items.\n * @param {obj} ids\n * The id hash of the webix widgets that show the fields.\n * @return {ABMobileViewFormButton}\n */\n refreshDefaultButton(ids) {\n // If default button is not exists, then skip this\n let defaultButton = this.views(\n (v) => v instanceof ABMobileViewFormButton && v.settings.isDefault\n )[0];\n\n // Add a default button\n if (defaultButton == null) {\n defaultButton = ABMobileViewFormButton.newInstance(\n this.application,\n this\n );\n defaultButton.settings.isDefault = true;\n }\n // Remove default button from array, then we will add it to be the last item later (.push)\n else {\n this._views = this.views((v) => v.id != defaultButton.id);\n }\n\n // Calculate position Y of the default button\n let yList = this.views().map((v) => (v.position.y || 0) + 1);\n yList.push(this._views.length || 0);\n yList.push($$(ids.fields).length || 0);\n let posY = Math.max(...yList);\n\n // Update to be the last item\n defaultButton.position.y = posY;\n\n // Keep the default button is always the last item of array\n this._views.push(defaultButton);\n\n return defaultButton;\n }\n\n warningsEval() {\n super.warningsEval();\n\n if (!this.settings.dataviewID) {\n this.warningsMessage(`does not have a DataCollection assigned.`);\n } else {\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `references an unknown DataCollection [${this.settings.dataviewID}].`\n );\n }\n }\n }\n};\n","const ABMobileViewFormButtonCore = require(\"../../core/mobile/ABMobileViewFormButtonCore\");\n\nmodule.exports = class ABMobileViewFormButton extends (\n ABMobileViewFormButtonCore\n) {};\n","const ABMobileViewFormCheckboxCore = require(\"../../core/mobile/ABMobileViewFormCheckboxCore\");\n\nmodule.exports = class ABMobileViewFormCheckbox extends (\n ABMobileViewFormCheckboxCore\n) {};\n","const ABMobileViewFormConnectCore = require(\"../../core/mobile/ABMobileViewFormConnectCore\");\n\n// const ABViewPropertyAddPage =\n// require(\"./viewProperties/ABViewPropertyAddPage\").default;\n// const ABViewPropertyEditPage =\n// require(\"./viewProperties/ABViewPropertyEditPage\").default;\n\n// const ABViewFormConnectPropertyComponentDefaults =\n// ABMobileViewFormConnectCore.defaultValues();\n\n// const ABPopupSort = require(\"../../../ABDesigner/ab_work_object_workspace_popupSortFields\");\n\n// let FilterComponent = null;\n// let SortComponent = null;\n\nmodule.exports = class ABMobileViewFormConnect extends (\n ABMobileViewFormConnectCore\n) {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n\n // Set filter value\n this.__filterComponent = this.AB.filterComplexNew(\n `${this.id}__filterComponent`\n );\n // this.__filterComponent.applicationLoad(application);\n this.__filterComponent.fieldsLoad(\n this.datasource ? this.datasource.fields() : [],\n this.datasource ? this.datasource : null\n );\n\n this.__filterComponent.setValue(\n this.settings.filterConditions\n /* ??\n ABViewFormConnectPropertyComponentDefaults.filterConditions\n */\n );\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // Does this do anything here?\n // this.addPageTool.fromSettings(this.settings);\n // this.editPageTool.fromSettings(this.settings);\n }\n\n // static get addPageProperty() {\n // return ABViewPropertyAddPage.propertyComponent(this.App, this.idBase);\n // }\n\n // static get editPageProperty() {\n // return ABViewPropertyEditPage.propertyComponent(this.App, this.idBase);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n // component() {\n // return new ABViewFormConnectComponent(this);\n // }\n\n // get addPageTool() {\n // if (this.__addPageTool == null)\n // this.__addPageTool = new ABViewPropertyAddPage();\n\n // return this.__addPageTool;\n // }\n\n // get editPageTool() {\n // if (this.__editPageTool == null)\n // this.__editPageTool = new ABViewPropertyEditPage();\n\n // return this.__editPageTool;\n // }\n};\n","const ABMobileViewFormCustomCore = require(\"../../core/mobile/ABMobileViewFormCustomCore\");\n\nmodule.exports = class ABMobileViewFormCustom extends (\n ABMobileViewFormCustomCore\n) {};\n","const ABMobileViewFormDateCore = require(\"../../core/mobile/ABMobileViewFormDateCore\");\n\nmodule.exports = class ABMobileViewFormDate extends ABMobileViewFormDateCore {};\n","const ABMobileViewFormDatetimeCore = require(\"../../core/mobile/ABMobileViewFormDatetimeCore\");\n\nmodule.exports = class ABMobileViewFormDatetime extends (\n ABMobileViewFormDatetimeCore\n) {};\n","const ABMobileViewFormEmailCore = require(\"../../core/mobile/ABMobileViewFormEmailCore\");\n\nmodule.exports = class ABMobileViewFormEmail extends (\n ABMobileViewFormEmailCore\n) {};\n","const ABMobileViewFormFileCore = require(\"../../core/mobile/ABMobileViewFormFileCore\");\n\nmodule.exports = class ABMobileViewFormFile extends ABMobileViewFormFileCore {};\n","const ABMobileViewFormFormulaCore = require(\"../../core/mobile/ABMobileViewFormFormulaCore\");\n\nmodule.exports = class ABMobileViewFormFormula extends (\n ABMobileViewFormFormulaCore\n) {};\n","const ABMobileViewFormImageCore = require(\"../../core/mobile/ABMobileViewFormImageCore\");\n\nmodule.exports = class ABMobileViewFormImage extends (\n ABMobileViewFormImageCore\n) {};\n","const ABMobileViewFormItemCore = require(\"../../core/mobile/ABMobileViewFormItemCore\");\n\nmodule.exports = class ABMobileViewFormItem extends ABMobileViewFormItemCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n // warningsEval() {\n // super.warningsEval();\n // this.warningsMessage(`FormItem Test Warning.`);\n // }\n};\n","const ABMobileViewFormNumberCore = require(\"../../core/mobile/ABMobileViewFormNumberCore\");\n\nmodule.exports = class ABMobileViewFormNumber extends (\n ABMobileViewFormNumberCore\n) {};\n","const ABMobileViewFormReadonlyCore = require(\"../../core/mobile/ABMobileViewFormReadonlyCore\");\n\nmodule.exports = class ABMobileViewFormReadonly extends (\n ABMobileViewFormReadonlyCore\n) {};\n","const ABMobileViewFormSelectMultipleCore = require(\"../../core/mobile/ABMobileViewFormSelectMultipleCore\");\n\nmodule.exports = class ABMobileViewFormSelectMultiple extends (\n ABMobileViewFormSelectMultipleCore\n) {};\n","const ABMobileViewFormSelectSingleCore = require(\"../../core/mobile/ABMobileViewFormSelectSingleCore\");\n\nmodule.exports = class ABMobileViewFormSelectSingle extends (\n ABMobileViewFormSelectSingleCore\n) {};\n","const ABMobileViewFormTextboxCore = require(\"../../core/mobile/ABMobileViewFormTextboxCore\");\n\nmodule.exports = class ABMobileViewFormTextbox extends (\n ABMobileViewFormTextboxCore\n) {\n // warningsEval() {\n // super.warningsEval();\n // this.warningsMessage(`${k} references an unknown Page.`);\n // }\n};\n","const ABMobileViewLabelCore = require(\"../../core/mobile/ABMobileViewLabelCore\");\n// const ABViewLabelComponent = require(\"./viewComponent/ABViewLabelComponent\");\n\nmodule.exports = class ABMobileViewLabel extends ABMobileViewLabelCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n // component() {\n\n // // return new ABViewLabelComponent(this);\n // }\n\n warningsEval() {\n super.warningsEval();\n\n if (!this.text) {\n this.warningsMessage(\"has no text value set.\");\n }\n }\n};\n","const ABMobileViewListCore = require(\"../../core/mobile/ABMobileViewListCore\");\n\nmodule.exports = class ABMobileViewList extends ABMobileViewListCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n warningsEval() {\n super.warningsEval();\n\n [\"linkPageAdd\", \"linkPageDetail\"].forEach((k) => {\n if (this.settings[k]) {\n let page = this.application.pageByID(this.settings[k], true);\n if (!page) {\n this.warningsMessage(`${k} references an unknown Page.`);\n }\n }\n });\n }\n};\n","const ABMobileViewTimelineCore = require(\"../../core/mobile/ABMobileViewTimelineCore\");\n\nmodule.exports = class ABMobileViewTimeline extends ABMobileViewTimelineCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n warningsEval() {\n super.warningsEval();\n\n [\"linkPageAdd\", \"linkPageDetail\"].forEach((k) => {\n if (this.settings[k]) {\n let page = this.application.pageByID(this.settings[k], true);\n if (!page) {\n this.warningsMessage(`${k} references an unknown Page.`);\n }\n }\n });\n }\n};\n","import ClassUI from \"../../../ui/ClassUI.js\";\n\nexport default class ABClassUIPlugin extends ClassUI {\n constructor(base = \"class_ui\", ids = {}) {\n // base: {string} unique base id reference\n // ids: {hash} { key => '' }\n // this is provided by the Sub Class and has the keys\n // unique to the Sub Class' interface elements.\n\n super(base, ids);\n\n this.base = base;\n\n this.AB = null;\n // {ABFactory}\n // Our common ABFactory for our application.\n // Should be set via init(AB) method\n\n this.CurrentApplicationID = null;\n // {string} uuid\n // The current ABApplication.id we are working with.\n\n this.CurrentDatacollectionID = null;\n // {string}\n // the ABDataCollection.id of the datacollection we are working with.\n\n this.CurrentObjectID = null;\n // {string}\n // the ABObject.id of the object we are working with.\n\n this.CurrentProcessID = null;\n // {string}\n // the ABProcess.id of the process we are working with.\n\n this.CurrentQueryID = null;\n // {string}\n // the ABObjectQuery.id of the query we are working with.\n\n this.CurrentViewID = null;\n // {string}\n // the ABView.id of the view we are working with.\n\n this.CurrentVersionID = null;\n // {string}\n // the ABVersion.id of the version we are working with.\n }\n\n /**\n * @method static L()\n * A static method to return a multilingual label function.\n * NOTE: Sub classes should override this to provide their plugin name.\n * @return {function} A function that returns multilingual labels\n */\n // static L() {\n // return function (...params) {\n // // Default implementation - sub classes should override\n // return params[0] || \"\";\n // };\n // }\n\n /**\n * @function applicationLoad\n * save the ABApplication.id of the current application.\n * @param {ABApplication} app\n */\n applicationLoad(app) {\n this.CurrentApplicationID = app?.id;\n }\n\n /**\n * @function datacollectionLoad\n * save the ABDataCollection.id of the current datacollection.\n * @param {ABDataCollection} dc\n */\n datacollectionLoad(dc) {\n this.CurrentDatacollectionID = dc?.id;\n }\n\n /**\n * @function objectLoad\n * save the ABObject.id of the current object.\n * @param {ABObject} obj\n */\n objectLoad(obj) {\n this.CurrentObjectID = obj?.id;\n }\n\n /**\n * @function processLoad\n * save the ABProcess.id of the current process.\n * @param {ABProcess} process\n */\n processLoad(process) {\n this.CurrentProcessID = process?.id;\n }\n\n /**\n * @function queryLoad\n * save the ABObjectQuery.id of the current query.\n * @param {ABObjectQuery} query\n */\n queryLoad(query) {\n this.CurrentQueryID = query?.id;\n }\n\n /**\n * @function versionLoad\n * save the ABVersion.id of the current version.\n * @param {ABVersion} version\n */\n versionLoad(version) {\n this.CurrentVersionID = version?.id;\n }\n\n /**\n * @function viewLoad\n * save the ABView.id of the current view.\n * @param {ABView} view\n */\n viewLoad(view) {\n this.CurrentViewID = view?.id;\n\n if (view?.application) {\n this.applicationLoad(view.application);\n }\n }\n\n /**\n * @method CurrentApplication\n * return the current ABApplication being worked on.\n * @return {ABApplication} application\n */\n get CurrentApplication() {\n return this.AB?.applicationByID(this.CurrentApplicationID);\n }\n\n /**\n * @method CurrentDatacollection()\n * A helper to return the current ABDataCollection we are working with.\n * @return {ABDataCollection}\n */\n get CurrentDatacollection() {\n return this.AB?.datacollectionByID(this.CurrentDatacollectionID);\n }\n\n /**\n * @method CurrentObject()\n * A helper to return the current ABObject we are working with.\n * @return {ABObject}\n */\n get CurrentObject() {\n let obj = this.AB?.objectByID(this.CurrentObjectID);\n if (!obj) {\n obj = this.AB?.queryByID(this.CurrentObjectID);\n }\n return obj;\n }\n\n /**\n * @method CurrentProcess()\n * A helper to return the current ABProcess we are working with.\n * @return {ABProcess}\n */\n get CurrentProcess() {\n return this.AB?.processByID(this.CurrentProcessID);\n }\n\n /**\n * @method CurrentQuery()\n * A helper to return the current ABObjectQuery we are working with.\n * @return {ABObjectQuery}\n */\n get CurrentQuery() {\n return this.AB?.queryByID(this.CurrentQueryID);\n }\n\n /**\n * @method CurrentView()\n * A helper to return the current ABView we are working with.\n * @return {ABView}\n */\n get CurrentView() {\n return this.CurrentApplication?.views(\n (v) => v.id == this.CurrentViewID\n )[0];\n }\n\n /**\n * @method CurrentVersion()\n * A helper to return the current ABVersion we are working with.\n * @return {ABVersion}\n */\n // get CurrentVersion() {\n // return this.AB?.versionByID?.(this.CurrentVersionID);\n // }\n\n /**\n * @method datacollectionsIncluded()\n * return a list of datacollections that are included in the current\n * application.\n * @return [{id, value, icon}]\n * id: {string} the ABDataCollection.id\n * value: {string} the label of the ABDataCollection\n * icon: {string} the icon to display\n */\n datacollectionsIncluded() {\n return this.CurrentApplication?.datacollectionsIncluded()\n .filter((dc) => {\n const obj = dc.datasource;\n return (\n dc.sourceType == \"object\" && !obj?.isImported && !obj?.isReadOnly\n );\n })\n .map((d) => {\n let entry = { id: d.id, value: d.label };\n if (d.sourceType == \"query\") {\n entry.icon = \"fa fa-filter\";\n } else {\n entry.icon = \"fa fa-database\";\n }\n return entry;\n });\n }\n\n /**\n * @method uniqueIDs()\n * add a unique identifier to each of our this.ids to ensure they are\n * unique. Useful for components that are repeated, like items in a list.\n */\n uniqueIDs() {\n let uniqueInstanceID = webix.uid();\n Object.keys(this.ids).forEach((k) => {\n this.ids[k] = `${this.ids[k]}_${uniqueInstanceID}`;\n });\n }\n\n /**\n * @method warningsRefresh()\n * reset the warnings on the provided ABObject and then start propogating\n * the \"warnings\" display updates.\n * @param {ABObject} ABObject\n */\n warningsRefresh(ABObject) {\n ABObject?.warningsEval?.();\n this.emit(\"warnings\");\n }\n\n /**\n * @method warningsPropogate()\n * If any of the passed in ui elements issue a \"warnings\" event, we will\n * propogate that upwards.\n * @param {Array} elements\n * Array of UI elements that can emit \"warnings\" events\n */\n warningsPropogate(elements = []) {\n elements.forEach((e) => {\n e.on(\"warnings\", () => {\n this.emit(\"warnings\");\n });\n });\n }\n\n /**\n * @method init()\n * Initialize the plugin with the ABFactory instance.\n * @param {ABFactory} AB\n */\n async init(AB) {\n this.AB = AB;\n }\n}\n","const ABModel = require(\"../ABModel\");\n\nexport default class ABModelPlugin extends ABModel {}\n","import ABObject from \"../ABObject.js\";\n\nexport default class ABObjectPlugin extends ABObject {\n // constructor(...params) {\n // super(...params);\n\n // }\n\n static getPluginKey() {\n console.error(\"ABObjectPlugin.getPluginKey() not overwritten!\");\n return \"ab-object-plugin\";\n }\n\n static getPluginType() {\n return \"object\";\n }\n\n // Format our getDbInfo() response for the ABDesigner info options.\n async getDbInfo() {\n /*\n // Data format:\n {\n \"definitionId\": \"f2416a1a-d75c-40f2-8180-bad9b5f8b9cc\",\n \"tableName\": \"AB_MockupHR_TeamTargetLocation\",\n \"fields\": [\n {\n \"Field\": \"uuid\",\n \"Type\": \"varchar(255)\",\n \"Null\": \"NO\",\n \"Key\": \"PRI\",\n \"Default\": null,\n \"Extra\": \"\"\n },\n {\n \"Field\": \"created_at\",\n \"Type\": \"datetime\",\n \"Null\": \"YES\",\n \"Key\": \"\",\n \"Default\": null,\n \"Extra\": \"\"\n },\n {\n \"Field\": \"updated_at\",\n \"Type\": \"datetime\",\n \"Null\": \"YES\",\n \"Key\": \"\",\n \"Default\": null,\n \"Extra\": \"\"\n },\n {\n \"Field\": \"properties\",\n \"Type\": \"text\",\n \"Null\": \"YES\",\n \"Key\": \"\",\n \"Default\": null,\n \"Extra\": \"\"\n }\n ]\n }\n */\n let PK = this.PK();\n let fieldInfo = [];\n this.fields().forEach((f) => {\n let field = {\n Field: f.columnName,\n Type: f.key,\n Null: f.settings.required ? \"NO\" : \"YES\",\n Key: PK == f.columnName ? \"PRI\" : \"\",\n Default: \"\",\n Extra: \"\",\n };\n fieldInfo.push(field);\n });\n\n let TableInfo = {\n definitionId: this.id,\n tableName: this.tableName,\n fields: fieldInfo,\n };\n\n return TableInfo;\n }\n\n toObj() {\n const result = super.toObj();\n result.plugin_key = this.constructor.getPluginKey();\n // plugin_key : is what tells our ABFactory.objectNew() to create this object from the plugin class.\n return result;\n }\n}\n","import ABUIPlugin from \"./ABUIPlugin.js\";\n\nfunction scanForSaveButton(el, idButtonSave) {\n if (el.rows || el.cols || el.cells) {\n let res = false;\n (el.rows || el.cols || el.cells).forEach((e) => {\n if (e) {\n res = res || scanForSaveButton(e, idButtonSave);\n }\n });\n return res;\n }\n if (el.id && el.id == idButtonSave) {\n return true;\n }\n return false;\n}\n\nexport default class ABPropertiesObjectPlugin extends ABUIPlugin {\n constructor(key, ids = {}, AB) {\n key = key ?? ABPropertiesObjectPlugin.getPluginKey();\n // make sure we have these ids defined:\n ids = Object.assign(\n {\n form: \"\",\n buttonSave: \"\",\n buttonCancel: \"\",\n },\n ids\n );\n super(key, ids, AB);\n // console.log(\"ABPropertiesObjectPlugin constructor\", this);\n\n this.width = 800;\n this.height = 500;\n }\n\n static getPluginKey() {\n return \"ab-properties-object-plugin\";\n }\n\n async init(AB) {\n this.AB = AB;\n\n //\n // setup our listeners\n //\n this.on(\"save.error\", (...params) => {\n this.onError(...params);\n });\n\n this.on(\"save.success\", (...params) => {\n this.onSuccess(...params);\n });\n }\n\n /**\n * @method onError()\n * Our Error handler when the data we provided our parent\n * ui_work_object_list_newObject object had an error saving\n * the values.\n * @param {Error|ABValidation|other} err\n * The error information returned. This can be several\n * different types of objects:\n * - A javascript Error() object\n * - An ABValidation object returned from our .isValid()\n * method\n * - An error response from our API call.\n */\n onError(err) {\n let L = this.L();\n if (err) {\n console.error(err);\n let message = L(\"the entered data is invalid\");\n // if this was our Validation() object:\n if (err.updateForm) {\n err.updateForm(this.$form);\n } else {\n if (err.code && err.data) {\n message = err.data?.sqlMessage ?? message;\n } else {\n message = err?.message ?? message;\n }\n }\n\n const values = this.$form.getValues();\n webix.alert({\n title: L(\"Error creating Object: {0}\", [values.name]),\n ok: L(\"fix it\"),\n text: message,\n type: \"alert-error\",\n });\n }\n // get notified if there was an error saving.\n $$(this.ids.buttonSave).enable();\n }\n\n /**\n * @method onSuccess()\n * Our success handler when the data we provided our parent\n * ui_work_object_list_newObject successfully saved the values.\n */\n onSuccess() {\n this.formClear();\n $$(this.ids.buttonSave).enable();\n }\n\n ui() {\n return {\n id: this.ids.component,\n header: this.header(),\n body: {\n view: \"form\",\n id: this.ids.form,\n width: this.width,\n height: this.height,\n rules: this.rules(),\n elements: this.elementsCombined(),\n },\n };\n }\n\n elementsCombined() {\n let elements = this.elements();\n\n // function scan(el) {\n // if (el.rows || el.cols || el.cells) {\n // let res = false;\n // (el.rows || el.cols || el.cells).forEach((e) => {\n // res = res || scan(e);\n // });\n // return res;\n // }\n // if (el.id && el.id == this.ids.buttonSave) {\n // return true;\n // }\n // return false;\n // }\n\n let hasSaveButton = false;\n elements.forEach((el) => {\n if (scanForSaveButton(el, this.ids.buttonSave)) {\n hasSaveButton = true;\n }\n });\n if (!hasSaveButton) {\n let L = this.L();\n elements.push({\n margin: 5,\n cols: [\n { fillspace: true },\n {\n view: \"button\",\n id: this.ids.buttonCancel,\n value: L(\"Cancel\"),\n css: \"ab-cancel-button\",\n autowidth: true,\n click: () => {\n this.cancel();\n },\n on: {\n onAfterRender() {\n ABUIPlugin.CYPRESS_REF(this);\n },\n },\n },\n {\n view: \"button\",\n id: this.ids.buttonSave,\n css: \"webix_primary\",\n value: L(\"Add Object\"),\n autowidth: true,\n type: \"form\",\n click: () => {\n return this.save();\n },\n on: {\n onAfterRender() {\n ABUIPlugin.CYPRESS_REF(this);\n },\n },\n },\n ],\n });\n }\n return elements;\n }\n\n cancel() {\n this.formClear();\n this.emit(\"cancel\");\n }\n\n formClear() {\n $$(this.ids.form).clearValidation();\n $$(this.ids.form).clear();\n }\n\n /**\n * @function save\n *\n * verify the current info is ok, package it, and return it to be\n * added to the application.createModel() method.\n */\n async save() {\n var saveButton = $$(this.ids.buttonSave);\n saveButton.disable();\n\n // if it doesn't pass the basic form validation, return:\n if (!(await this.formIsValid())) {\n saveButton.enable();\n return false;\n }\n\n var values = await this.formValues();\n\n this.emit(\"save\", values);\n }\n\n busy() {\n const $form = $$(this.ids.form);\n const $saveButton = $$(this.ids.buttonSave);\n\n $form.showProgress({ type: \"icon\" });\n $saveButton.disable();\n }\n\n ready() {\n const $form = $$(this.ids.form);\n const $saveButton = $$(this.ids.buttonSave);\n\n $form.hideProgress();\n $saveButton.enable();\n }\n\n ///\n /// These methods are to be overridden by the Plugin definition\n ///\n header() {\n // this is the name used when choosing the Object Type\n // tab selector.\n let L = this.L();\n return L(\"PropertiesObjectPlugin\");\n }\n\n rules() {\n return {\n // name: webix.rules.isNotEmpty,\n };\n }\n\n elements() {\n // return the webix form element definitions to appear on the page.\n return [];\n }\n\n async formIsValid() {\n var Form = $$(this.ids.form);\n\n Form?.clearValidation();\n\n // if it doesn't pass the basic form validation, return:\n if (!Form.validate()) {\n $$(this.ids.buttonSave)?.enable();\n return false;\n }\n }\n\n async formValues() {\n var Form = $$(this.ids.form);\n return Form?.getValues();\n }\n}\n","import ClassUI from \"../../../ui/ClassUI.js\";\n\nexport default class ABUIPlugin extends ClassUI {\n constructor(...params) {\n super(...params);\n\n // this.AB = AB;\n // {ABFactory}\n // Our common ABFactory for our application.\n\n this.CurrentApplicationID = null;\n // {string} uuid\n // The current ABApplication.id we are working with.\n\n this.CurrentDatacollectionID = null;\n // {string}\n // the ABDataCollection.id of the datacollection we are working with.\n\n this.CurrentObjectID = null;\n // {string}\n // the ABObject.id of the object we are working with.\n\n this.CurrentProcessID = null;\n // {string}\n // the ABProcess.id of the process we are working with.\n\n this.CurrentQueryID = null;\n // {string}\n // the ABObjectQuery.id of the query we are working with.\n\n this.CurrentViewID = null;\n // {string}\n // the ABView.id of the view we are working with.\n }\n\n static getPluginKey() {\n return \"ab-ui-plugin\";\n }\n\n /**\n * @method L()\n * return a function that can be used to retrieve the a multilingual\n * label for this plugin.\n * @returns {string}\n */\n L() {\n let _self = this;\n return function (...params) {\n return _self.AB.Multilingual.labelPlugin(\n _self.constructor.getPluginKey(),\n ...params\n );\n };\n }\n\n /**\n * @function applicationLoad\n * save the ABApplication.id of the current application.\n * @param {ABApplication} app\n */\n applicationLoad(app) {\n this.CurrentApplicationID = app?.id;\n }\n\n datacollectionLoad(dc) {\n this.CurrentDatacollectionID = dc?.id;\n }\n\n objectLoad(obj) {\n this.CurrentObjectID = obj?.id;\n }\n\n processLoad(process) {\n this.CurrentProcessID = process?.id;\n }\n\n queryLoad(query) {\n this.CurrentQueryID = query?.id;\n }\n\n versionLoad(version) {\n this.CurrentVersionID = version?.id;\n }\n\n viewLoad(view) {\n this.CurrentViewID = view?.id;\n\n if (view?.application) {\n this.applicationLoad(view.application);\n }\n }\n\n /**\n * @method CurrentApplication\n * return the current ABApplication being worked on.\n * @return {ABApplication} application\n */\n get CurrentApplication() {\n return this.AB.applicationByID(this.CurrentApplicationID);\n }\n\n /**\n * @method CurrentDatacollection()\n * A helper to return the current ABDataCollection we are working with.\n * @return {ABObject}\n */\n get CurrentDatacollection() {\n return this.AB.datacollectionByID(this.CurrentDatacollectionID);\n }\n\n /**\n * @method CurrentObject()\n * A helper to return the current ABObject we are working with.\n * @return {ABObject}\n */\n get CurrentObject() {\n let obj = this.AB.objectByID(this.CurrentObjectID);\n if (!obj) {\n obj = this.AB.queryByID(this.CurrentObjectID);\n }\n return obj;\n }\n\n /**\n * @method CurrentProcess()\n * A helper to return the current ABProcess we are working with.\n * @return {ABProcess}\n */\n get CurrentProcess() {\n return this.AB.processByID(this.CurrentProcessID);\n }\n\n /**\n * @method CurrentQuery()\n * A helper to return the current ABObjectQuery we are working with.\n * @return {ABObjectQuery}\n */\n get CurrentQuery() {\n return this.AB.queryByID(this.CurrentQueryID);\n }\n\n /**\n * @method CurrentView()\n * A helper to return the current ABView we are working with.\n * @return {ABView}\n */\n get CurrentView() {\n return this.CurrentApplication?.views(\n (v) => v.id == this.CurrentViewID\n )[0];\n }\n\n /**\n * @method datacollectionsIncluded()\n * return a list of datacollections that are included in the current\n * application.\n * @return [{id, value, icon}]\n * id: {string} the ABDataCollection.id\n * value: {string} the label of the ABDataCollection\n * icon: {string} the icon to display\n */\n datacollectionsIncluded() {\n return this.CurrentApplication?.datacollectionsIncluded()\n .filter((dc) => {\n const obj = dc.datasource;\n return (\n dc.sourceType == \"object\" && !obj?.isImported && !obj?.isReadOnly\n );\n })\n .map((d) => {\n let entry = { id: d.id, value: d.label };\n if (d.sourceType == \"query\") {\n entry.icon = \"fa fa-filter\";\n } else {\n entry.icon = \"fa fa-database\";\n }\n return entry;\n });\n }\n\n /**\n * @method uniqueIDs()\n * add a unique identifier to each of our this.ids to ensure they are\n * unique. Useful for components that are repeated, like items in a list.\n */\n uniqueIDs() {\n let uniqueInstanceID = webix.uid();\n Object.keys(this.ids).forEach((k) => {\n this.ids[k] = `${this.ids[k]}_${uniqueInstanceID}`;\n });\n }\n\n /**\n * @method warningsRefresh()\n * reset the warnings on the provided ABObject and then start propogating\n * the \"warnings\" display updates.\n */\n warningsRefresh(ABObject) {\n ABObject?.warningsEval?.();\n this.emit(\"warnings\");\n }\n\n /**\n * @method warningsPropogate()\n * If any of the passed in ui elements issue a \"warnings\" event, we will\n * propogate that upwards.\n */\n warningsPropogate(elements = []) {\n elements.forEach((e) => {\n e.on(\"warnings\", () => {\n this.emit(\"warnings\");\n });\n });\n }\n}\n","import ABViewComponent from \"../views/viewComponent/ABViewComponent.js\";\n\nexport default class ABViewComponentPlugin extends ABViewComponent {\n constructor(...params) {\n super(...params);\n }\n}\n","import ABClassUIPlugin from \"./ABClassUIPlugin.js\";\n\nexport default class ABViewEditorPlugin extends ABClassUIPlugin {\n constructor(view, base = \"view_editor\", ids = {}) {\n // view: {ABView} The ABView instance this editor is for\n // base: {string} unique base id reference\n // ids: {hash} { key => '' }\n // this is provided by the Sub Class and has the keys\n // unique to the Sub Class' interface elements.\n\n var common = {\n component: \"\",\n };\n\n Object.keys(ids).forEach((k) => {\n if (typeof common[k] != \"undefined\") {\n console.error(\n `!!! ABViewEditorPlugin:: passed in ids contains a restricted field : ${k}`\n );\n return;\n }\n common[k] = \"\";\n });\n\n super(base, common);\n\n this.AB = view.AB;\n this.view = view;\n // {ABView}\n // The ABView instance this editor is editing\n\n this.settings = view?.settings || {};\n // {hash}\n // shortcut to reference the view's settings\n\n this.base = base;\n\n this.component = this.view.component(this.ids.component);\n // {ABComponent}\n // The component instance for this view.\n // Should be set via init() or component() method\n\n // Load the view to set CurrentViewID\n if (view) {\n this.viewLoad(view);\n }\n }\n\n /**\n * @method static key\n * Return the key identifier for this editor type.\n * NOTE: Sub classes should override this to return their specific key.\n * @return {string}\n */\n static get key() {\n return this.getPluginKey();\n }\n\n /**\n * @method ui()\n * Return the Webix UI definition for this editor.\n * NOTE: Sub classes should override this to provide their specific UI.\n * @return {object} Webix UI definition\n */\n ui() {\n // Default implementation - try to get UI from component\n if (this.component) {\n return typeof this.component.ui == \"function\"\n ? this.component.ui()\n : this.component.ui;\n }\n\n // Fallback: return a simple placeholder\n return {\n view: \"template\",\n template: `
    ${\n this.view?.label || \"View Editor\"\n }
    `,\n };\n }\n\n /**\n * @method init()\n * Initialize the editor with the ABFactory instance.\n * @param {ABFactory} AB\n */\n async init(AB) {\n await super.init(AB);\n\n // Initialize the component if it has an init method\n if (this.component?.init) {\n return this.component.init(AB, 2);\n // in our editor, we provide accessLv = 2\n }\n }\n\n /**\n * @method detatch()\n * Detach the editor component.\n * Called when the editor is being removed or hidden.\n */\n detatch() {\n this.component?.detatch?.();\n }\n\n /**\n * @method onShow()\n * Called when the editor is shown.\n * Sub classes can override this to perform actions when the editor becomes visible.\n */\n onShow() {\n this.component?.onShow?.();\n }\n\n /**\n * @method onHide()\n * Called when the editor is hidden.\n * Sub classes can override this to perform actions when the editor becomes hidden.\n */\n onHide() {\n this.component?.onHide?.();\n }\n}\n","import ABView from \"../views/ABView.js\";\n\nexport default class ABViewPlugin extends ABView {\n constructor(...params) {\n super(...params);\n }\n\n static getPluginKey() {\n return \"ab-view-plugin\";\n }\n\n static getPluginType() {\n return \"view\";\n }\n\n toObj() {\n const result = super.toObj();\n result.plugin_key = this.constructor.getPluginKey();\n // plugin_key : is what tells our ABFactory.objectNew() to create this object from the plugin class.\n return result;\n }\n\n static newInstance(application, parent) {\n // return a new instance from ABViewManager:\n return application.viewNew(\n { key: this.common().key, plugin_key: this.getPluginKey() },\n application,\n parent\n );\n }\n}\n","import ABClassUIPlugin from \"./ABClassUIPlugin.js\";\n\nexport default class ABViewPropertiesPlugin extends ABClassUIPlugin {\n constructor(base = \"properties_abview\", ids = {}) {\n // base: {string} unique base id reference\n // ids: {hash} { key => '' }\n // this is provided by the Sub Class and has the keys\n // unique to the Sub Class' interface elements.\n\n var common = {\n label: \"\",\n };\n\n Object.keys(ids).forEach((k) => {\n if (typeof common[k] != \"undefined\") {\n console.error(\n `!!! ABFieldProperty:: passed in ids contains a restricted field : ${k}`\n );\n return;\n }\n common[k] = \"\";\n });\n\n super(base, common);\n\n this.base = base;\n\n this.fieldsHide = {\n /* id.tag : bool */\n };\n // {hash}\n // indicates if a given field should be hidden.\n // this allows sub classes to hide fields from parent classes:\n // this.fieldsHide.required = true; hides the required field.\n }\n\n static get key() {\n return this.getPluginKey();\n }\n\n //\n // ABView\n //\n\n ui(elements = [], rules = {}) {\n let ids = this.ids;\n\n let L = this.AB.Label();\n\n let _ui = {\n view: \"form\",\n id: ids.component,\n scroll: true,\n elements: [\n {\n id: ids.label,\n view: \"text\",\n label: L(\"Name\"),\n name: \"name\",\n value: \"\",\n hidden: this.fieldsHide.label ? true : false,\n },\n ],\n rules: {\n // label: webix.rules.isNotEmpty,\n },\n };\n\n elements.forEach((e) => {\n _ui.elements.push(e);\n });\n\n Object.keys(rules).forEach((r) => {\n _ui.rules[r] = rules[r];\n });\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n this.$form = $$(this.ids.component);\n AB.Webix.extend(this.$form, webix.ProgressBar);\n\n var VC = this.ViewClass();\n if (VC) {\n /*\n// TODO:\n $$(this.ids.fieldDescription).define(\n \"label\",\n L(FC.defaults().description)\n );\n } else {\n $$(this.ids.fieldDescription).hide();\n*/\n }\n }\n\n /**\n * @method clear()\n * clear the property form.\n */\n clear() {\n $$(this.ids.label).setValue(\"\");\n }\n\n propertyDatacollections(view) {\n return view.application.datacollectionsIncluded().map((d) => {\n return { id: d.id, value: d.label };\n });\n }\n\n /**\n * @method defaults()\n * Return the ViewClass() default values.\n * NOTE: the child class MUST implement ViewClass() to return the\n * proper ABViewXXX class definition.\n * @return {obj}\n */\n defaults() {\n var ViewClass = this.ViewClass();\n if (!ViewClass) {\n console.error(\"!!! properties/views/ABView: could not find ViewClass\");\n return null;\n }\n return ViewClass.common();\n }\n\n formValues() {\n return $$(this.ids.component).getValues();\n }\n\n /**\n * @method isValid()\n * Verify the common ABField settings are valid before allowing\n * us to create the new field.\n * @return {bool}\n */\n isValid() {\n /*\n// TODO:\n var ids = this.ids;\n var isValid = $$(ids.component).validate(),\n colName = this.formValues()[\"columnName\"];\n\n // validate reserve column names\n var FC = this.FieldClass();\n if (!FC) {\n this.AB.notify.developer(\n new Error(\"Unable to resolve FieldClass\"),\n {\n context: \"ABFieldProperty: isValid()\",\n base: this.ids.component,\n }\n );\n }\n\n // columnName should not be one of the reserved names:\n if (FC?.reservedNames.indexOf(colName.trim().toLowerCase()) > -1) {\n this.markInvalid(\"columnName\", L(\"This is a reserved name\"));\n isValid = false;\n }\n\n // columnName should not be in use by other fields on this object\n // get All fields with matching colName\n var fieldColName = this.currentObject?.fields(\n (f) => f.columnName == colName\n );\n // ignore current edit field\n if (this._CurrentField) {\n fieldColName = fieldColName.filter(\n (f) => f.id != this._CurrentField.id\n );\n }\n // if any more matches, this is a problem\n if (fieldColName.length > 0) {\n this.markInvalid(\n \"columnName\",\n L(\"This column name is in use by another field ({0})\", [\n fieldColName.label,\n ])\n );\n isValid = false;\n }\n\n return isValid;\n*/\n }\n\n markInvalid(name, message) {\n $$(this.ids.component).markInvalid(name, message);\n }\n\n /**\n * @method onChange()\n * emit a \"changed\" event so our property manager can know\n * there are new values that need saving.\n */\n onChange() {\n this.emit(\"changed\");\n }\n\n /**\n * @function populate\n * populate the property form with the given ABField instance provided.\n * @param {ABView} view\n * The ABViewXXX instance that we are editing the settings for.\n */\n populate(view) {\n this.viewLoad(view);\n $$(this.ids.label)?.setValue(view.label);\n }\n\n requiredOnChange() {\n // Sub Class should overwrite this if it is necessary.\n }\n\n /*\n * @function values\n *\n * return the values for this form.\n * @return {obj}\n */\n values() {\n let vals = {};\n vals.label = $$(this.ids.label).getValue();\n return vals;\n }\n\n /**\n * @method ViewClass()\n * A method to return the proper ABViewXXX Definition.\n * NOTE: Can be overwritten by the Child Class\n */\n ViewClass() {\n return this._ViewClass(this.constructor.key);\n }\n\n _ViewClass(key) {\n var app = this.CurrentApplication;\n if (!app) {\n app = this.AB.applicationNew({});\n }\n return app.viewAll((V) => V.common().key == key)[0];\n }\n}\n","/**\n * ABProcessLane\n * manages a lane in a Process Diagram.\n *\n * Lanes manage users in the system, and provide a way to lookup a SiteUser.\n */\nvar ABProcessLaneCore = require(\"../../core/process/ABProcessLaneCore\");\n\nmodule.exports = class ABProcessLane extends ABProcessLaneCore {\n // constructor(attributes, process, application) {\n // super(attributes, process, application);\n // }\n\n ////\n //// Modeler Instance Methods\n ////\n\n transferParticipantWhereToMe(id) {\n var myParticipant = this.process.elementForDiagramID(id);\n if (myParticipant) {\n // if I haven't already set my where clause, and my Participant\n // has one, then take it:\n if (!this.stashed && myParticipant.stashed) {\n var copyParams = [\n \"stashed\",\n \"useRole\",\n \"role\",\n \"useAccount\",\n \"account\",\n ];\n copyParams.forEach((p) => {\n var swap = this[p];\n this[p] = myParticipant[p];\n myParticipant[p] = swap; // ?? do this ??\n });\n }\n }\n }\n\n /**\n * fromElement()\n * initialize this Lane's values from the given BPMN:Lane\n * @param {BPMNParticipant}\n */\n fromElement(element) {\n this.diagramID = element.id || this.diagramID;\n\n // on creation, if I have child objects, then move the .where definition\n // from my parent Participant to ME\n if (element.children && element.children.length > 0) {\n if (element.parent && element.parent.type == \"bpmn:Participant\") {\n this.transferParticipantWhereToMe(element.parent.id);\n }\n } else {\n // this info might just reside in the .parent.children[]\n if (\n element.parent &&\n element.parent.children &&\n element.parent.children.length > 0\n ) {\n element.parent.children.forEach((child) => {\n if (child.type != \"bpmn:Lane\") {\n // if child has lanes\n if (\n child.businessObject.lanes &&\n child.businessObject.lanes.length > 0\n ) {\n // if lane is me\n var myLane = child.businessObject.lanes.find((l) => {\n return l.id == this.diagramID;\n });\n if (myLane) {\n this.transferParticipantWhereToMe(element.parent.id);\n\n // tell child I'm it's lane:\n var objChild = this.process.elementForDiagramID(\n child.id\n );\n if (objChild) {\n objChild.setLane(this);\n }\n }\n }\n }\n });\n }\n }\n\n this.onChange(element);\n }\n\n /**\n * onChange()\n * update the current Lane with information that was relevant\n * from the provided BPMN:Lane\n * @param {BPMNParticipant}\n */\n onChange(defElement) {\n /*\n Sample DefElement:\n {\n \"labels\": [],\n \"children\": [],\n \"id\": \"Participant_185ljkg\",\n \"width\": 958,\n \"height\": 240,\n \"type\": \"bpmn:Participant\",\n \"x\": -810,\n \"y\": -2010,\n \"order\": {\n \"level\": -2\n },\n \"businessObject\": {\n \"$type\": \"bpmn:Participant\",\n \"id\": \"Participant_185ljkg\",\n \"di\": {\n \"$type\": \"bpmndi:BPMNShape\",\n \"bounds\": {\n \"$type\": \"dc:Bounds\",\n \"x\": -810,\n \"y\": -2010,\n \"width\": 958,\n \"height\": 240\n },\n \"id\": \"Participant_185ljkg_di\",\n \"isHorizontal\": true\n },\n \"processRef\": {\n \"$type\": \"bpmn:Process\",\n \"id\": \"Process_0x3sul5\"\n }\n }\n */\n\n // from the BPMI modeler we can gather a label for this:\n if (\n defElement.businessObject.name &&\n defElement.businessObject.name != \"\"\n ) {\n this.label = defElement.businessObject.name;\n }\n\n // if I picked up a new task, inform it I am it's lane:\n }\n};\n","/**\n * ABProcessParticipant\n * manages the participant lanes in a Process Diagram.\n *\n * Participants manage users in the system (when there are no lanes defined)\n * and provide a way to lookup a SiteUser.\n */\nvar ABProcessParticipantCore = require(\"../../core/process/ABProcessParticipantCore\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABProcessParticipant extends ABProcessParticipantCore {\n // constructor(attributes, process, AB) {\n // super(attributes, process, AB);\n // }\n\n ////\n //// Modeler Instance Methods\n ////\n\n /**\n * fromElement()\n * initialize this Participant's values from the given BPMN:Participant\n * @param {BPMNParticipant}\n */\n fromElement(element) {\n this.diagramID = element.id || this.diagramID;\n this.onChange(element);\n }\n\n /**\n * onChange()\n * update the current Participant with information that was relevant\n * from the provided BPMN:Participant\n * @param {BPMNParticipant}\n */\n onChange(defElement) {\n /*\n Sample DefElement:\n {\n \"labels\": [],\n \"children\": [],\n \"id\": \"Participant_185ljkg\",\n \"width\": 958,\n \"height\": 240,\n \"type\": \"bpmn:Participant\",\n \"x\": -810,\n \"y\": -2010,\n \"order\": {\n \"level\": -2\n },\n \"businessObject\": {\n \"$type\": \"bpmn:Participant\",\n \"id\": \"Participant_185ljkg\",\n \"di\": {\n \"$type\": \"bpmndi:BPMNShape\",\n \"bounds\": {\n \"$type\": \"dc:Bounds\",\n \"x\": -810,\n \"y\": -2010,\n \"width\": 958,\n \"height\": 240\n },\n \"id\": \"Participant_185ljkg_di\",\n \"isHorizontal\": true\n },\n \"processRef\": {\n \"$type\": \"bpmn:Process\",\n \"id\": \"Process_0x3sul5\"\n }\n }\n */\n\n // from the BPMI modeler we can gather a label for this:\n if (\n defElement.businessObject.name &&\n defElement.businessObject.name != \"\"\n ) {\n this.label = defElement.businessObject.name;\n }\n\n if (defElement.children) {\n var laneIDs = [];\n defElement.children.forEach((c) => {\n if (c.type == \"bpmn:Lane\") {\n laneIDs.push(c.id);\n }\n });\n this.laneIDs = laneIDs;\n }\n }\n\n /**\n * diagramProperties()\n * return a set of values for the XML shape definition based upon\n * the current values of this objec.\n * @return {json}\n */\n diagramProperties() {\n return [\n {\n id: this.diagramID,\n def: {\n name: this.name,\n },\n },\n ];\n }\n};\n","const ABProcessElementCore = require(\"../../../core/process/tasks/ABProcessElementCore.js\");\n\nmodule.exports = class ABProcessElement extends ABProcessElementCore {\n // constructor(attributes, process, AB, defaultValues) {\n // super(attributes, process, AB, defaultValues);\n\n // // listen\n // }\n\n /**\n * @method destroy()\n * remove this task definition.\n * @return {Promise}\n */\n destroy() {\n ////\n //// TODO: once our core conversion is complete, this .save() can be\n //// moved to ABProcessTaskCore, and our ABDefinition.save() can take\n //// care of the proper method to save depending on the current Platform.\n ////\n // return this.toDefinition()\n // .destroy()\n\n return super.destroy().then(() => {\n return this.process.elementRemove(this);\n });\n }\n\n isValid() {\n /*\n var validator = OP.Validation.validator();\n\n // label/name must be unique:\n var isNameUnique =\n this.AB.processes((o) => {\n return o.name.toLowerCase() == this.name.toLowerCase();\n }).length == 0;\n if (!isNameUnique) {\n validator.addError(\n \"name\",\n L(\n \"ab.validation.object.name.unique\",\n `Process name must be unique (\"${this.name}\"\" already used in this Application)`\n )\n );\n }\n\n return validator;\n */\n\n // var isValid =\n // this.AB.processes((o) => {\n // return o.name.toLowerCase() == this.name.toLowerCase();\n // }).length == 0;\n // return isValid;\n\n return true;\n }\n\n ////\n //// Modeler Instance Methods\n ////\n\n findLane(curr, cb) {\n if (!curr) {\n cb(null, null);\n return;\n }\n\n // if current object has a LANE definition, use that one:\n if (curr.lanes && curr.lanes.length > 0) {\n cb(null, curr.lanes[0]);\n } else if (curr.$type == \"bpmn:Participant\") {\n // if the current is a Participant, take that one\n cb(null, curr);\n } else {\n // else move upwards and check again:\n curr = curr.$parent;\n this.findLane(curr, cb);\n }\n }\n\n setLane(Lane) {\n this.laneDiagramID = Lane.diagramID;\n }\n\n /**\n * fromElement()\n * initialize this Task's values from the given BPMN:Element\n * @param {BPMNElement}\n */\n fromElement(element) {\n this.diagramID = element.id || this.diagramID;\n this.onChange(element);\n }\n\n /**\n * onChange()\n * update the current Task with information that was relevant\n * from the provided BPMN:Element\n * @param {BPMNElement}\n */\n onChange(defElement) {\n /*\n Sample DefElement:\n {\n \"labels\": [],\n \"children\": [],\n \"id\": \"Task_08j07ni\",\n \"width\": 100,\n \"height\": 80,\n \"type\": \"bpmn:SendTask\",\n \"x\": 20,\n \"y\": -2130,\n \"order\": {\n \"level\": 5\n },\n \"businessObject\": {\n \"$type\": \"bpmn:SendTask\",\n \"id\": \"Task_08j07ni\",\n \"name\": \"ffff\",\n \"di\": {\n \"$type\": \"bpmndi:BPMNShape\",\n \"bounds\": {\n \"$type\": \"dc:Bounds\",\n \"x\": 20,\n \"y\": -2130,\n \"width\": 100,\n \"height\": 80\n },\n \"id\": \"SendTask_0iidv6o_di\"\n }\n\n // Some elements (like EndEvents) have:\n .eventDefinitions: [\n {\n $type: \"actual bpmn:ElementType\",\n ...\n }\n ]\n },\n \"incoming\":[],\n \"outgoing\":[]\n }\n */\n\n // from the BPMI modeler we can gather a label for this:\n if (\n defElement.businessObject.name &&\n defElement.businessObject.name != \"\"\n ) {\n this.label = defElement.businessObject.name;\n }\n\n // our lane may have changed:\n var currObj = defElement.businessObject;\n this.findLane(currObj, (err, obj) => {\n if (obj) {\n this.laneDiagramID = obj.id;\n } else {\n // if my parent shape is a Participant, then use that:\n if (\n defElement.parent &&\n defElement.parent.type == \"bpmn:Participant\"\n ) {\n this.laneDiagramID = defElement.parent.id;\n } else {\n this.laneDiagramID = null;\n }\n }\n });\n }\n\n /**\n * diagramProperties()\n * return a set of values for the XML shape definition based upon\n * the current values of this object.\n * @return {json}\n */\n diagramProperties() {\n const warnings = this.warnings();\n return [\n {\n id: this.diagramID,\n def: {\n name: this.name,\n },\n warn: warnings.length ? warnings : null,\n },\n ];\n }\n\n /**\n * propertiesShow()\n * display the properties panel for this Process Element.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesShow(id) {\n var ui = {\n id: id,\n view: \"label\",\n label: \"this task has not implement properties yet...\",\n };\n\n webix.ui(ui, $$(id));\n\n $$(id).show();\n }\n\n /**\n * propertiesStash()\n * pull our values from our property panel.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesStash(id) {}\n\n /**\n * property()\n * return the specific property value if it exists.\n * @return {mixed} | undefined\n */\n property(id) {\n if ($$(id)) {\n return $$(id).getValue();\n }\n }\n\n /**\n * switchTo()\n * replace this object with an instance of one of our child classes:\n * @param {ABProcessTask*} child\n * an instance of the new Process Task we are replaced with.\n * @param {string} propertiesID\n * the webix ui.id container for the properties panel.\n */\n switchTo(child, propertiesID) {\n // remove myself from our containing process's elements\n this.process.elementRemove(this);\n\n // add the new Process WITH the same id\n this.process.elementAdd(child);\n\n // show the child properties:\n child.propertiesShow(propertiesID);\n\n this.emit(\"switchTo\", child);\n }\n\n /**\n * @method warningsEval()\n * re-evaluate our warnings for this Process Task.\n * Most of our ProcessTasks need to also verify data related to\n * other available tasks, so we need to call the onProcessReady()\n * so we can access those values.\n */\n warningsEval() {\n super.warningsEval();\n this.onProcessReady();\n\n // if this isn't an end type of task, then there must be\n // > 0 next tasks\n if (!this.isEndTask()) {\n const myOutgoingConnections = this.process.connectionsOutgoing(\n this.diagramID\n );\n if (myOutgoingConnections.length < 1) {\n this.warningMessage(\"should have another task after this one\");\n }\n }\n }\n\n /**\n * @method warningMessage(message)\n * Save a warning message in a common format for our ProcessTasks.\n */\n warningMessage(msg, data = {}) {\n let message = `${this.defaults.key}[${\n this.label ? this.label : this.name\n }]: ${msg}`;\n this._warnings.push({ message, data });\n }\n};\n","const ABProcessEndCore = require(\"../../../core/process/tasks/ABProcessEndCore.js\");\n\nmodule.exports = class ABProcessEnd extends ABProcessEndCore {\n /**\n * do()\n * this method actually performs the action for this task.\n * @param {obj} instance the instance data of the running process\n * @return {Promise}\n * resolve(true/false) : true if the task is completed.\n * false if task is still waiting\n */\n // do(instance) {\n // return new Promise((resolve, reject) => {\n // // An End Event doesn't perform any other actions\n // // than to signal it has successfully completed.\n // // But it provides no Additional Tasks to work on.\n // // for testing:\n // this.stateCompleted(instance);\n // this.log(instance, \"End Event Reached\");\n // resolve(true);\n // });\n // }\n};\n","const ABProcessGatewayExclusiveCore = require(\"../../../core/process/tasks/ABProcessGatewayExclusiveCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABProcessGatewayExclusive extends (\n ABProcessGatewayExclusiveCore\n) {\n ////\n //// Process Instance Methods\n ////\n\n /**\n * diagramProperties()\n * return a set of values for the XML shape definition based upon\n * the current values of this object.\n * @return {json}\n */\n diagramProperties() {\n // the first entry is for the gateway element itself\n var properties = super.diagramProperties();\n /*[\n {\n id: this.diagramID,\n def: {\n name: this.name,\n },\n },\n ];\n */\n\n // now add any additional updates for each of our connections:\n var myOutgoingConnections = this.process.connectionsOutgoing(\n this.diagramID\n );\n myOutgoingConnections.forEach((conn) => {\n properties.push({\n id: conn.id,\n def: {\n name: this.conditions[conn.id]?.label ?? \"\",\n },\n });\n });\n return properties;\n }\n\n warningsEval() {\n super.warningsEval();\n\n // make sure we have > 1 connection.\n const myOutgoingConnections = this.process.connectionsOutgoing(\n this.diagramID\n );\n if (myOutgoingConnections.length < 2) {\n this.warningMessage(\"should have multiple outgoing connections\");\n }\n\n // make sure there is no more then 1 connection that doesn't have\n // a condition:\n let numCondWithOne = 0;\n myOutgoingConnections.forEach((c) => {\n this.conditions[c.id] = this.conditions[c.id] ?? {};\n this.conditions[c.id].filterValue = this.conditions[c.id]\n .filterValue ?? { glue: \"and\", rules: [] };\n if ((this.conditions[c.id]?.filterValue.rules?.length ?? 0) == 0) {\n numCondWithOne++;\n }\n });\n\n if (numCondWithOne > 1) {\n this.warningMessage(\n \"should not have more than 1 unfiltered connection.\"\n );\n }\n }\n};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessTaskEmailCore = require(\"../../../core/process/tasks/ABProcessTaskEmailCore.js\");\n\nmodule.exports = class ABProcessTaskEmail extends ABProcessTaskEmailCore {\n ////\n //// Process Instance Methods\n ////\n\n warningsEval() {\n super.warningsEval();\n\n // check for warnings:\n\n if (!this.subject) {\n this.warningMessage(\"is missing a subject\");\n }\n\n if (!this.message) {\n this.warningMessage(\"is missing a message\");\n }\n\n this.verifySetting(\"to\");\n this.verifySetting(\"from\");\n this.verifyNextLane(\"to\");\n if (this.from == \"0\") {\n let thisLane = this.myLane();\n if (!thisLane) {\n this.warningMessage(\n \"can not resolve the lane participant for [.from] field.\"\n );\n }\n }\n this.verifyRoleAccount(\"to\", \"toUsers\");\n this.verifyRoleAccount(\"from\", \"fromUsers\");\n }\n\n /**\n * @method verifySetting()\n * make sure the given field key has a value assigned.\n * @param {string} key\n * the property of this object to check. (to, from)\n */\n verifySetting(key) {\n if (this[key] == \"\") {\n this.warningMessage(`does not have a [${key}] setting.`);\n }\n }\n\n /**\n * @method verifyNextLane()\n * make sure we can access a Lane for the given property key.\n * The \"to\" field can reference the \"Next Participant\". This checks to\n * see if we can reference a lane for the next task.\n * @param {string} key\n * the property that has the value for Next Participant. [to]\n */\n verifyNextLane(key) {\n if (this[key] === \"0\") {\n // Next Participant\n // we need to resolve our next task and see if we can pull the participant info from it.\n\n let nextTasks = this.process.connectionNextTask(this);\n let nextLanesResolved = true;\n nextTasks.forEach((t) => {\n let lane = t.myLane();\n if (!lane) {\n nextLanesResolved = false;\n }\n });\n if (!nextLanesResolved || nextTasks.length == 0) {\n this.warningMessage(\n `can not resolve next lane participant for [${key}] field.`\n );\n }\n }\n }\n\n /**\n * @method verifyRoleAccount()\n * Check to see if the provided property is set to use a Role/Account for\n * the email, and make sure there are values set for what is chosen.\n * @param {string} key\n * the property we are currently validating.\n * @param {string} valKey\n * the property that contains the specific value object.\n */\n verifyRoleAccount(key, valKey) {\n if (this[key] == \"1\") {\n if (this[valKey]) {\n if (this[valKey].useRole) {\n if (this[valKey].role.length == 0) {\n this.warningMessage(`can not resolve [${key}] Role setting.`);\n }\n }\n if (this[valKey].useAccount) {\n if (this[valKey].account.length == 0) {\n this.warningMessage(\n `can not resolve [${key}] Account setting.`\n );\n }\n }\n // TODO:\n // if (this[valKey].userFields.length > 0) {\n // // how to know if this is a problem?\n // }\n }\n }\n }\n};\n","const ABProcessTaskServiceCore = require(\"../../../core/process/tasks/ABProcessTaskServiceCore.js\");\n\nmodule.exports = class ABProcessTaskService extends ABProcessTaskServiceCore {};\n","const AccountingBatchProcessingCore = require(\"../../../core/process/tasks/ABProcessTaskServiceAccountingBatchProcessingCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class AccountingBatchProcessing extends (\n AccountingBatchProcessingCore\n) {\n ////\n //// Process Instance Methods\n ////\n\n propertyIDs(id) {\n return {\n name: `${id}_name`,\n processBatchValue: `${id}_processBatchValue`,\n objectBatch: `${id}_objectBatch`,\n fieldBatchEntries: `${id}_fieldBatchEntries`,\n fieldBatchFinancialPeriod: `${id}_fieldBatchFinancialPeriod`,\n objectJE: `${id}_objectJE`,\n fieldJEAccount: `${id}_fieldJEAccount`,\n fieldJERC: `${id}_fieldJERC`,\n fieldJEStatus: `${id}_fieldJEStatus`,\n fieldJEStatusComplete: `${id}_fieldJEStatusComplete`,\n objectBR: `${id}_objectBR`,\n fieldBRFinancialPeriod: `${id}_fieldBRFinancialPeriod`,\n fieldBRAccount: `${id}_fieldBRAccount`,\n fieldBRRC: `${id}_fieldBRRC`,\n fieldBREntries: `${id}_fieldBREntries`,\n };\n }\n\n /**\n * propertiesShow()\n * display the properties panel for this Process Element.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesShow(id) {\n var ids = this.propertyIDs(id);\n\n var processValues = [{ id: 0, value: L(\"Select a Process Value\") }];\n var processDataFields = this.process.processDataFields(this);\n (processDataFields || []).forEach((row) => {\n processValues.push({ id: row.key, value: row.label });\n });\n\n var objectList = this.AB.objects().map((o) => {\n return { id: o.id, value: o.label || o.name, object: o };\n });\n objectList.unshift({\n id: 0,\n value: L(\"Select an Object\"),\n });\n\n //\n // set up field settings:\n //\n\n var blankField = {\n id: 0,\n value: L(\"Select a Field\"),\n };\n // blankField : generic Select a field entry\n\n function defaultFields(objID) {\n // create a new options array of Field Choices for the given obj.id\n\n var fields = [blankField];\n if (objID) {\n var entry = objectList.find((o) => o.id == objID);\n if (entry && entry.object) {\n entry.object.fields().forEach((f) => {\n fields.push({ id: f.id, value: f.label, field: f });\n });\n }\n }\n return fields;\n }\n\n function updateFields(fieldPickers, fieldValues, defaultValue) {\n // update the list of field select choices with the new field choices\n\n fieldPickers.forEach((fp) => {\n var picker = $$(fp);\n if (picker) {\n picker.define(\"options\", fieldValues);\n // if (defaultValue) {\n // picker.define(\"value\", defaultValue);\n // } else {\n // picker.define(\"value\", fieldValues[0].value);\n // }\n picker.refresh();\n picker.show();\n }\n });\n }\n\n var batchFields = defaultFields(this.objectBatch);\n // batchFields : the default list of fields for the Batch Object\n\n var fieldPickersBatch = [\n ids.fieldBatchEntries,\n ids.fieldBatchFinancialPeriod,\n ];\n // fieldPickersBatch : the list of field selects to update for the Batch\n // object.\n\n var jeFields = defaultFields(this.objectJE);\n // jeFields : the default list of fields for the Journal Entry Object\n\n var fieldPickersJE = [\n ids.fieldJEAccount,\n ids.fieldJERC,\n ids.fieldJEStatus,\n ];\n // fieldPickersJE : the list of field selects to update for the Journal Entry\n // object.\n\n function compileStatusValues(statusField) {\n var values = [{ id: 0, value: L(\"Select the Complete Value\") }];\n if (statusField && statusField.options) {\n statusField.options().forEach((o) => {\n values.push({ id: o.id, value: o.text });\n });\n }\n return values;\n }\n\n function updatePickerStatusComplete(values) {\n var wbxComplete = $$(ids.fieldJEStatusComplete);\n if (wbxComplete) {\n // update fieldJEStatusComplete options\n wbxComplete.define(\"options\", values);\n wbxComplete.refresh();\n // show fieldJEStatusComplete\n wbxComplete.show();\n }\n }\n\n function onStatusComplete(newVal) {\n // pull the ABField object from newValue\n var jeEntryID = $$(ids.objectJE).getValue();\n var jeEntry = objectList.find((o) => o.id == jeEntryID);\n if (jeEntry && jeEntry.object) {\n var statusField = jeEntry.object.fieldByID(newVal);\n if (statusField && statusField.options) {\n // get the options as an []\n jeFieldStatusValues = compileStatusValues(statusField);\n\n updatePickerStatusComplete(jeFieldStatusValues);\n }\n }\n }\n\n var jeFieldStatusValues = compileStatusValues();\n // jeFieldStatusValues : the list of status options from the fieldJEStatus\n // selected entry.\n\n var brFields = defaultFields(this.objectBR);\n // jeFields : the default list of fields for the Journal Entry Object\n\n var fieldPickersBR = [\n ids.fieldBRFinancialPeriod,\n ids.fieldBRAccount,\n ids.fieldBRRC,\n ids.fieldBREntries,\n ];\n // fieldPickersBR : the list of field selects to update for the Balance Record\n // object.\n\n var ui = {\n id: id,\n view: \"form\",\n elements: [\n {\n id: ids.name,\n view: \"text\",\n label: L(\"Name\"),\n name: \"name\",\n value: this.name,\n },\n {\n id: ids.processBatchValue,\n view: \"select\",\n label: L(\"Process Batch Value\"),\n value: this.processBatchValue,\n name: \"processBatchValue\",\n options: processValues,\n },\n {\n id: ids.objectBatch,\n view: \"select\",\n label: L(\"Batch Object\"),\n value: this.objectBatch,\n name: \"objectBatch\",\n options: objectList,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n // gather new set of batchFields\n batchFields = defaultFields(newVal);\n // rebuild the associated list of Fields to pick\n updateFields(fieldPickersBatch, batchFields);\n }\n },\n },\n },\n {\n id: ids.fieldBatchEntries,\n view: \"select\",\n label: L(\"Batch->JE[]\"),\n value: this.fieldBatchEntries,\n name: \"fieldBatchEntries\",\n options: batchFields,\n hidden: true,\n },\n {\n id: ids.fieldBatchFinancialPeriod,\n view: \"select\",\n label: L(\"Batch->FinancialPeriod\"),\n value: this.fieldBatchFinancialPeriod,\n name: \"fieldBatchFinancialPeriod\",\n options: batchFields,\n hidden: true,\n },\n {\n id: ids.objectJE,\n view: \"select\",\n label: L(\"Journal Entry Object\"),\n value: this.objectJE,\n name: \"objectJE\",\n options: objectList,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n // gather new set of jeFields\n jeFields = defaultFields(newVal);\n // rebuild the associated list of Fields to pick\n updateFields(fieldPickersJE, jeFields);\n }\n },\n },\n },\n {\n id: ids.fieldJEAccount,\n view: \"select\",\n label: L(\"JE->Account\"),\n value: this.fieldJEAccount,\n name: \"fieldJEAccount\",\n options: jeFields,\n hidden: true,\n },\n {\n id: ids.fieldJERC,\n view: \"select\",\n label: L(\"JE->RC\"),\n value: this.fieldJERC,\n name: \"fieldJERC\",\n options: jeFields,\n hidden: true,\n },\n {\n id: ids.fieldJEStatus,\n view: \"select\",\n label: L(\"JE->Status\"),\n value: this.fieldJEStatus,\n name: \"fieldJEStatus\",\n options: jeFields,\n hidden: true,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n onStatusComplete(newVal);\n }\n },\n },\n },\n {\n id: ids.fieldJEStatusComplete,\n view: \"select\",\n label: L(\"JE->Status->Complete\"),\n value: this.fieldJEStatusComplete,\n name: \"fieldJEStatusComplete\",\n options: jeFieldStatusValues,\n hidden: true,\n },\n {\n id: ids.objectBR,\n view: \"select\",\n label: L(\"Balance Record\"),\n value: this.objectBR,\n name: \"objectBR\",\n options: objectList,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n // gather new set of jeFields\n brFields = defaultFields(newVal);\n // rebuild the associated list of Fields to pick\n updateFields(fieldPickersBR, brFields);\n }\n },\n },\n },\n {\n id: ids.fieldBRFinancialPeriod,\n view: \"select\",\n label: L(\"BR->FP\"),\n value: this.fieldBRFinancialPeriod,\n name: \"fieldBRFinancialPeriod\",\n options: brFields,\n hidden: true,\n },\n {\n id: ids.fieldBRAccount,\n view: \"select\",\n label: L(\"BR->Account\"),\n value: this.fieldBRAccount,\n name: \"fieldBRAccount\",\n options: brFields,\n hidden: true,\n },\n {\n id: ids.fieldBRRC,\n view: \"select\",\n label: L(\"BR->RC\"),\n value: this.fieldBRRC,\n name: \"fieldBRRC\",\n options: brFields,\n hidden: true,\n },\n {\n id: ids.fieldBREntries,\n view: \"select\",\n label: L(\"BR->Entries\"),\n value: this.fieldBREntries,\n name: \"fieldBREntries\",\n options: brFields,\n hidden: true,\n },\n ],\n };\n\n webix.ui(ui, $$(id));\n\n // if there are already default values for our Objects,\n // unhide the field selectors:\n if (this.objectBatch && this.objectBatch != 0) {\n updateFields(fieldPickersBatch, batchFields);\n }\n\n if (this.objectJE && this.objectJE != 0) {\n updateFields(fieldPickersJE, jeFields);\n }\n\n if (this.fieldJEStatus) {\n onStatusComplete(this.fieldJEStatus);\n }\n\n if (this.objectBR && this.objectBR != 0) {\n updateFields(fieldPickersBR, brFields);\n }\n\n $$(id).show();\n }\n\n /**\n * propertiesStash()\n * pull our values from our property panel.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesStash(id) {\n var ids = this.propertyIDs(id);\n this.name = this.property(ids.name);\n\n this.defaults.settings.forEach((s) => {\n this[s] = this.property(ids[s]);\n });\n }\n};\n","const AccountingFPCloseCore = require(\"../../../core/process/tasks/ABProcessTaskServiceAccountingFPCloseCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class AccountingFPClose extends AccountingFPCloseCore {\n ////\n //// Process Instance Methods\n ////\n\n propertyIDs(id) {\n return {\n name: `${id}_name`,\n processFPValue: `${id}_processFPValue`,\n objectFP: `${id}_objectFP`,\n objectGL: `${id}_objectGL`,\n objectAcc: `${id}_objectAcc`,\n fieldFPStart: `${id}_fieldFPStart`,\n fieldFPOpen: `${id}_fieldFPOpen`,\n fieldFPStatus: `${id}_fieldFPStatus`,\n fieldFPActive: `${id}_fieldFPActive`,\n fieldGLStarting: `${id}_fieldGLStarting`,\n fieldGLRunning: `${id}_fieldGLRunning`,\n fieldGLAccount: `${id}_fieldGLAccount`,\n fieldGLRc: `${id}_fieldGLRc`,\n fieldGLDebit: `${id}fieldGLDebit`,\n fieldGLCredit: `${id}_fieldGLCredit`,\n fieldAccType: `${id}_fieldAccType`,\n fieldAccAsset: `${id}_fieldAccAsset`,\n fieldAccExpense: `${id}_fieldAccExpense`,\n fieldAccLiabilities: `${id}_fieldAccLiabilities`,\n fieldAccEquity: `${id}_fieldAccEquity`,\n fieldAccIncome: `${id}_fieldAccIncome`,\n };\n }\n\n /**\n * propertiesShow()\n * display the properties panel for this Process Element.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesShow(id) {\n var ids = this.propertyIDs(id);\n\n var processValues = [{ id: 0, value: L(\"Select a Process Value\") }];\n var processDataFields = this.process.processDataFields(this);\n (processDataFields || []).forEach((row) => {\n processValues.push({ id: row.key, value: row.label });\n });\n\n var objectList = this.AB.objects().map((o) => {\n return { id: o.id, value: o.label || o.name, object: o };\n });\n objectList.unshift({\n id: 0,\n value: L(\"Select an Object\"),\n });\n\n let getFieldOptions = (objID) => {\n let fields = [\n {\n id: 0,\n value: L(\"Select a Field\"),\n },\n ];\n\n if (objID) {\n var entry = objectList.find((o) => o.id == objID);\n if (entry && entry.object) {\n entry.object.fields().forEach((f) => {\n fields.push({ id: f.id, value: f.label, field: f });\n });\n }\n }\n return fields;\n };\n\n let getStatusFieldOptions = (statusFieldId) => {\n let result = [];\n let fpObject = this.AB.objectByID(this.objectFP);\n if (!fpObject) return result;\n\n let fpStatusField = fpObject.fieldByID(statusFieldId);\n if (\n !fpStatusField ||\n !fpStatusField.settings ||\n !fpStatusField.settings.options\n )\n return result;\n\n result = (fpStatusField.settings.options || []).map((opt) => {\n return {\n id: opt.id,\n value: opt.text,\n };\n });\n\n return result;\n };\n\n let updateFPFields = (fpFields) => {\n [ids.fieldFPStart, ids.fieldFPOpen, ids.fieldFPStatus].forEach(\n (fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", fpFields);\n $$(fieldGLElem).refresh();\n }\n );\n };\n\n let updateFPStatusFields = (fpStatusOptions) => {\n $$(ids.fieldFPActive).define(\"options\", fpStatusOptions);\n $$(ids.fieldFPActive).refresh();\n };\n\n let updateGLFields = (glFields) => {\n [\n ids.fieldGLRunning,\n ids.fieldGLAccount,\n ids.fieldGLRc,\n ids.fieldGLDebit,\n ids.fieldGLCredit,\n ].forEach((fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", glFields);\n $$(fieldGLElem).refresh();\n });\n };\n\n let updateAccFields = (accFields) => {\n $$(ids.fieldAccType).define(\"options\", accFields);\n $$(ids.fieldAccType).refresh();\n };\n\n let updateAccTypeOptions = (accTypeOptions) => {\n [\n ids.fieldAccAsset,\n ids.fieldAccExpense,\n ids.fieldAccLiabilities,\n ids.fieldAccEquity,\n ids.fieldAccIncome,\n ].forEach((fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", accTypeOptions);\n $$(fieldGLElem).refresh();\n });\n };\n\n let getListOptions = (objectId, fieldId) => {\n let result = [];\n let object = this.AB.objectByID(objectId);\n if (!object) return result;\n\n let fpStatusField = object.fieldByID(fieldId);\n if (\n !fpStatusField ||\n !fpStatusField.settings ||\n !fpStatusField.settings.options\n )\n return result;\n\n result = (fpStatusField.settings.options || []).map((opt) => {\n return {\n id: opt.id,\n value: opt.text,\n };\n });\n\n return result;\n };\n\n let fpFields = getFieldOptions(this.objectFP);\n let glFields = getFieldOptions(this.objectGL);\n let accFields = getFieldOptions(this.objectAcc);\n let fpStatusFields = getStatusFieldOptions(this.fieldFPStatus);\n let accTypeOptions = getListOptions(this.objectAcc, this.fieldAccType);\n\n var ui = {\n id: id,\n view: \"form\",\n elementsConfig: {\n labelWidth: 200,\n },\n elements: [\n {\n id: ids.name,\n view: \"text\",\n label: L(\"Name\"),\n name: \"name\",\n value: this.name,\n },\n {\n id: ids.processFPValue,\n view: \"select\",\n label: L(\"Process Fiscal Period Value\"),\n value: this.processFPValue,\n name: \"processFPValue\",\n options: processValues,\n },\n {\n id: ids.objectFP,\n view: \"select\",\n label: L(\"FP Object\"),\n value: this.objectFP,\n name: \"objectFP\",\n options: objectList,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n // gather new set of batchFields\n fpFields = getFieldOptions(newVal);\n // rebuild the associated list of Fields to pick\n updateFPFields(fpFields);\n }\n },\n },\n },\n {\n id: ids.objectGL,\n view: \"select\",\n label: L(\"GL Object\"),\n value: this.objectGL,\n name: \"objectGL\",\n options: objectList,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n // gather new set of batchFields\n glFields = getFieldOptions(newVal);\n // rebuild the associated list of Fields to pick\n updateGLFields(glFields);\n }\n },\n },\n },\n {\n id: ids.objectAcc,\n view: \"select\",\n label: L(\"Account Object\"),\n value: this.objectAcc,\n name: \"objectAcc\",\n options: objectList,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n accFields = getFieldOptions(newVal);\n updateAccFields(accFields);\n }\n },\n },\n },\n {\n id: ids.fieldFPStart,\n view: \"select\",\n label: L(\"FP -> Start\"),\n value: this.fieldFPStart,\n name: \"fieldFPStart\",\n options: fpFields,\n },\n {\n id: ids.fieldFPOpen,\n view: \"select\",\n label: L(\"FP -> Open\"),\n value: this.fieldFPOpen,\n name: \"fieldFPOpen\",\n options: fpFields,\n },\n {\n id: ids.fieldFPStatus,\n view: \"select\",\n label: L(\"FP -> Status\"),\n value: this.fieldFPStatus,\n name: \"fieldFPStatus\",\n options: fpFields,\n on: {\n onChange(newVal, oldVal) {\n if (newVal != oldVal) {\n fpStatusFields = getStatusFieldOptions(newVal);\n updateFPStatusFields(fpStatusFields);\n }\n },\n },\n },\n {\n id: ids.fieldFPActive,\n view: \"select\",\n label: L(\"FP -> Active\"),\n value: this.fieldFPActive,\n name: \"fieldFPActive\",\n options: fpStatusFields,\n },\n {\n id: ids.fieldGLStarting,\n view: \"select\",\n label: L(\"GL -> Starting BL\"),\n value: this.fieldGLStarting,\n name: \"fieldGLStarting\",\n options: glFields,\n },\n {\n id: ids.fieldGLRunning,\n view: \"select\",\n label: L(\"GL -> Running BL\"),\n value: this.fieldGLRunning,\n name: \"fieldGLRunning\",\n options: glFields,\n },\n {\n id: ids.fieldGLAccount,\n view: \"select\",\n label: L(\"GL -> Account\"),\n value: this.fieldGLAccount,\n name: \"fieldGLAccount\",\n options: glFields,\n },\n {\n id: ids.fieldGLRc,\n view: \"select\",\n label: L(\"GL -> RC\"),\n value: this.fieldGLRc,\n name: \"fieldGLRc\",\n options: glFields,\n },\n {\n id: ids.fieldGLDebit,\n view: \"select\",\n label: L(\"GL -> Debit\"),\n value: this.fieldGLDebit,\n name: \"fieldGLDebit\",\n options: glFields,\n },\n {\n id: ids.fieldGLCredit,\n view: \"select\",\n label: L(\"GL -> Credit\"),\n value: this.fieldGLCredit,\n name: \"fieldGLCredit\",\n options: glFields,\n },\n {\n id: ids.fieldAccType,\n view: \"select\",\n label: L(\"Acc -> Type\"),\n value: this.fieldAccType,\n name: \"fieldAccType\",\n options: accFields,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n accTypeOptions = getListOptions(\n this.objectAcc || $$(ids.objectAcc).getValue(),\n newVal\n );\n updateAccTypeOptions(accTypeOptions);\n }\n },\n },\n },\n {\n id: ids.fieldAccAsset,\n view: \"select\",\n label: L(\"Acc -> Asset\"),\n value: this.fieldAccAsset,\n name: \"fieldAccAsset\",\n options: accTypeOptions,\n },\n {\n id: ids.fieldAccExpense,\n view: \"select\",\n label: L(\"Acc -> Expense\"),\n value: this.fieldAccExpense,\n name: \"fieldAccExpense\",\n options: accTypeOptions,\n },\n {\n id: ids.fieldAccLiabilities,\n view: \"select\",\n label: L(\"Acc -> Liabilities\"),\n value: this.fieldAccLiabilities,\n name: \"fieldAccLiabilities\",\n options: accTypeOptions,\n },\n {\n id: ids.fieldAccEquity,\n view: \"select\",\n label: L(\"Acc -> Equity\"),\n value: this.fieldAccEquity,\n name: \"fieldAccEquity\",\n options: accTypeOptions,\n },\n {\n id: ids.fieldAccIncome,\n view: \"select\",\n label: L(\"Acc -> Income\"),\n value: this.fieldAccIncome,\n name: \"fieldAccIncome\",\n options: accTypeOptions,\n },\n ],\n };\n\n webix.ui(ui, $$(id));\n\n $$(id).show();\n }\n\n /**\n * propertiesStash()\n * pull our values from our property panel.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesStash(id) {\n var ids = this.propertyIDs(id);\n this.name = this.property(ids.name);\n\n // TIP: keep the .settings entries == ids[s] keys and this will\n // remain simple:\n this.defaults.settings.forEach((s) => {\n this[s] = this.property(ids[s]);\n });\n }\n};\n","const AccountingFPYearCloseCore = require(\"../../../core/process/tasks/ABProcessTaskServiceAccountingFPYearCloseCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class AccountingFPYearClose extends AccountingFPYearCloseCore {\n ////\n //// Process Instance Methods\n ////\n propertyIDs(id) {\n return {\n name: `${id}_name`,\n processFPYearValue: `${id}_processFPYearValue`,\n objectFPYear: `${id}_objectFPYear`,\n objectFPMonth: `${id}_objectFPMonth`,\n objectGL: `${id}_objectGL`,\n objectAccount: `${id}_objectAccount`,\n valueFundBalances: `${id}_valueFundBalances`,\n valueNetIncome: `${id}_valueNetIncome`,\n fieldFPYearStart: `${id}_fieldFPYearStart`,\n fieldFPYearEnd: `${id}_fieldFPYearEnd`,\n fieldFPYearStatus: `${id}_fieldFPYearStatus`,\n fieldFPYearActive: `${id}_fieldFPYearActive`,\n fieldFPMonthStart: `${id}_fieldFPMonthStart`,\n fieldFPMonthEnd: `${id}_fieldFPMonthEnd`,\n fieldGLStartBalance: `${id}_fieldGLStartBalance`,\n fieldGLRunningBalance: `${id}_fieldGLRunningBalance`,\n fieldGLrc: `${id}_fieldGLrc`,\n fieldAccNumber: `${id}_fieldAccNumber`,\n fieldAccType: `${id}_fieldAccType`,\n fieldAccTypeIncome: `${id}_fieldAccTypeIncome`,\n fieldAccTypeExpense: `${id}_fieldAccTypeExpense`,\n fieldAccTypeEquity: `${id}_fieldAccTypeEquity`,\n };\n }\n\n /**\n * propertiesShow()\n * display the properties panel for this Process Element.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesShow(id) {\n var ids = this.propertyIDs(id);\n\n var processValues = [{ id: 0, value: L(\"Select a Process Value\") }];\n var processDataFields = this.process.processDataFields(this);\n (processDataFields || []).forEach((row) => {\n processValues.push({ id: row.key, value: row.label });\n });\n\n var objectList = this.AB.objects().map((o) => {\n return { id: o.id, value: o.label || o.name, object: o };\n });\n objectList.unshift({\n id: 0,\n value: L(\"Select an Object\"),\n });\n\n let getFieldOptions = (objID, fieldKey) => {\n let fields = [\n {\n id: 0,\n value: L(\"Select a Field\"),\n },\n ];\n\n if (objID) {\n var entry = objectList.find((o) => o.id == objID);\n if (entry && entry.object) {\n entry.object\n .fields((f) => f.key == fieldKey)\n .forEach((f) => {\n fields.push({ id: f.id, value: f.label, field: f });\n });\n }\n }\n return fields;\n };\n\n let getListOptions = (objectId, fieldId) => {\n let result = [];\n let object = this.AB.objectByID(objectId);\n if (!object) return result;\n\n let fpStatusField = object.fieldByID(fieldId);\n if (\n !fpStatusField ||\n !fpStatusField.settings ||\n !fpStatusField.settings.options\n )\n return result;\n\n result = (fpStatusField.settings.options || []).map((opt) => {\n return {\n id: opt.id,\n value: opt.text,\n };\n });\n\n return result;\n };\n\n let updateAccNumberFields = (accNumberFields) => {\n $$(ids.fieldAccNumber).define(\"options\", accNumberFields);\n $$(ids.fieldAccNumber).refresh();\n };\n\n let updateAccFields = (accFields) => {\n $$(ids.fieldAccType).define(\"options\", accFields);\n $$(ids.fieldAccType).refresh();\n };\n\n let updateAccTypeOptions = (accTypeOptions) => {\n [\n ids.fieldAccTypeIncome,\n ids.fieldAccTypeExpense,\n ids.fieldAccTypeEquity,\n ].forEach((fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", accTypeOptions);\n $$(fieldGLElem).refresh();\n });\n };\n\n let updateFPYearDateOptions = (fpYearDateOptions) => {\n [ids.fieldFPYearStart, ids.fieldFPYearEnd].forEach((fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", fpYearDateOptions);\n $$(fieldGLElem).refresh();\n });\n };\n\n let updateFPYearStatusOptions = (fpYearStatusFields) => {\n $$(ids.fieldFPYearStatus).define(\"options\", fpYearStatusFields);\n $$(ids.fieldFPYearStatus).refresh();\n };\n\n let updateFPYearActiveOptions = (fpYearStatusOptions) => {\n $$(ids.fieldFPYearActive).define(\"options\", fpYearStatusOptions);\n $$(ids.fieldFPYearActive).refresh();\n };\n\n let updateFPMonthDateFields = (fpMonthDateOpts) => {\n [ids.fieldFPMonthStart, ids.fieldFPMonthEnd].forEach((fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", fpMonthDateOpts);\n $$(fieldGLElem).refresh();\n });\n };\n\n let updateGlNumberFields = (glNumberOptions) => {\n [ids.fieldGLStartBalance, ids.fieldGLRunningBalance].forEach(\n (fieldGLElem) => {\n $$(fieldGLElem).define(\"options\", glNumberOptions);\n $$(fieldGLElem).refresh();\n }\n );\n };\n\n let updateGlConnectFields = (glRcOptions) => {\n $$(ids.fieldGLrc).define(\"options\", glRcOptions);\n $$(ids.fieldGLrc).refresh();\n };\n\n let fpYearDateFields = getFieldOptions(this.objectFPYear, \"date\");\n let fpYearStatusFields = getFieldOptions(this.objectFPYear, \"list\");\n let fpYearStatusOptions = getListOptions(\n this.objectFPYear,\n this.fieldFPYearStatus\n );\n let fpMonthDateFields = getFieldOptions(this.objectFPMonth, \"date\");\n let glNumberFields = getFieldOptions(this.objectGL, \"number\");\n let glRcFields = getFieldOptions(this.objectGL, \"connectObject\");\n let accNumberFields = getFieldOptions(this.objectAccount, \"number\");\n let accTypeFields = getFieldOptions(this.objectAccount, \"list\");\n let accTypeOptions = getListOptions(\n this.objectAccount,\n this.fieldAccType\n );\n\n var ui = {\n id: id,\n view: \"form\",\n elementsConfig: {\n labelWidth: 200,\n },\n elements: [\n {\n id: ids.name,\n view: \"text\",\n label: L(\"Name\"),\n name: \"name\",\n value: this.name,\n },\n {\n id: ids.processFPYearValue,\n view: \"select\",\n label: L(\"Process Fiscal Period Year Value\"),\n value: this.processFPYearValue,\n name: \"processFPYearValue\",\n options: processValues,\n },\n {\n id: ids.objectFPYear,\n view: \"select\",\n label: L(\"FP Year Object\"),\n value: this.objectFPYear,\n name: \"objectFPYear\",\n options: objectList,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n fpYearDateFields = getFieldOptions(newVal, \"date\");\n updateFPYearDateOptions(fpYearDateFields);\n\n accTypeFields = getFieldOptions(newVal, \"list\");\n updateFPYearStatusOptions(accTypeFields);\n }\n },\n },\n },\n {\n id: ids.objectFPMonth,\n view: \"select\",\n label: L(\"FP Month Object\"),\n value: this.objectFPMonth,\n name: \"objectFPMonth\",\n options: objectList,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n fpMonthDateFields = getFieldOptions(newVal, \"date\");\n updateFPMonthDateFields(fpMonthDateFields);\n }\n },\n },\n },\n {\n id: ids.objectGL,\n view: \"select\",\n label: L(\"Balance Object\"),\n value: this.objectGL,\n name: \"objectGL\",\n options: objectList,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n glNumberFields = getFieldOptions(newVal, \"number\");\n updateGlNumberFields(glNumberFields);\n\n glRcFields = getFieldOptions(newVal, \"connectObject\");\n updateGlConnectFields(glRcFields);\n }\n },\n },\n },\n {\n id: ids.objectAccount,\n view: \"select\",\n label: L(\"Account Object\"),\n value: this.objectAccount,\n name: \"objectAccount\",\n options: objectList,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n accTypeFields = getFieldOptions(newVal, \"list\");\n updateAccFields(accTypeFields);\n\n accNumberFields = getFieldOptions(newVal, \"number\");\n updateAccNumberFields(accNumberFields);\n }\n },\n },\n },\n {\n id: ids.valueFundBalances,\n view: \"text\",\n label: L(\"Fund Balances Code\"),\n value: this.valueFundBalances,\n name: \"valueFundBalances\",\n },\n {\n id: ids.valueNetIncome,\n view: \"text\",\n label: L(\"Net Income Code\"),\n value: this.valueNetIncome,\n name: \"valueNetIncome\",\n },\n {\n id: ids.fieldFPYearStart,\n view: \"select\",\n label: L(\"FP Year -> Start\"),\n value: this.fieldFPYearStart,\n name: \"fieldFPYearStart\",\n options: fpYearDateFields,\n },\n {\n id: ids.fieldFPYearEnd,\n view: \"select\",\n label: L(\"FP Year -> End\"),\n value: this.fieldFPYearEnd,\n name: \"fieldFPYearEnd\",\n options: fpYearDateFields,\n },\n {\n id: ids.fieldFPYearStatus,\n view: \"select\",\n label: L(\"FP Year -> Status\"),\n value: this.fieldFPYearStatus,\n name: \"fieldFPYearStatus\",\n options: fpYearStatusFields,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n fpYearStatusOptions = getListOptions(\n this.objectFPYear || $$(ids.objectFPYear).getValue(),\n newVal\n );\n updateFPYearActiveOptions(fpYearStatusOptions);\n }\n },\n },\n },\n {\n id: ids.fieldFPYearActive,\n view: \"select\",\n label: L(\"FP Year -> Active\"),\n value: this.fieldFPYearActive,\n name: \"fieldFPYearActive\",\n options: fpYearStatusOptions,\n },\n {\n id: ids.fieldFPMonthStart,\n view: \"select\",\n label: L(\"FP Month -> Start\"),\n value: this.fieldFPMonthStart,\n name: \"fieldFPMonthStart\",\n options: fpMonthDateFields,\n },\n {\n id: ids.fieldFPMonthEnd,\n view: \"select\",\n label: L(\"FP Month -> End\"),\n value: this.fieldFPMonthEnd,\n name: \"fieldFPMonthEnd\",\n options: fpMonthDateFields,\n },\n {\n id: ids.fieldGLStartBalance,\n view: \"select\",\n label: L(\"GL -> Start Balance\"),\n value: this.fieldGLStartBalance,\n name: \"fieldGLStartBalance\",\n options: glNumberFields,\n },\n {\n id: ids.fieldGLRunningBalance,\n view: \"select\",\n label: L(\"GL -> Running Balance\"),\n value: this.fieldGLRunningBalance,\n name: \"fieldGLRunningBalance\",\n options: glNumberFields,\n },\n {\n id: ids.fieldGLrc,\n view: \"select\",\n label: L(\"GL -> RC\"),\n value: this.fieldGLrc,\n name: \"fieldGLrc\",\n options: glRcFields,\n },\n {\n id: ids.fieldAccNumber,\n view: \"select\",\n label: L(\"Acc -> Account Number\"),\n value: this.fieldAccNumber,\n name: \"fieldAccNumber\",\n options: accNumberFields,\n },\n {\n id: ids.fieldAccType,\n view: \"select\",\n label: L(\"Acc -> Type\"),\n value: this.fieldAccType,\n name: \"fieldAccType\",\n options: accTypeFields,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n accTypeOptions = getListOptions(\n this.objectAccount ||\n $$(ids.objectAccount).getValue(),\n newVal\n );\n updateAccTypeOptions(accTypeOptions);\n }\n },\n },\n },\n {\n id: ids.fieldAccTypeIncome,\n view: \"select\",\n label: L(\"Acc -> Income\"),\n value: this.fieldAccTypeIncome,\n name: \"fieldAccTypeIncome\",\n options: accTypeOptions,\n },\n {\n id: ids.fieldAccTypeExpense,\n view: \"select\",\n label: L(\"Acc -> Expense\"),\n value: this.fieldAccTypeExpense,\n name: \"fieldAccTypeExpense\",\n options: accTypeOptions,\n },\n {\n id: ids.fieldAccTypeEquity,\n view: \"select\",\n label: L(\"Acc -> Equity\"),\n value: this.fieldAccTypeEquity,\n name: \"fieldAccTypeEquity\",\n options: accTypeOptions,\n },\n ],\n };\n\n webix.ui(ui, $$(id));\n\n $$(id).show();\n }\n\n /**\n * propertiesStash()\n * pull our values from our property panel.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesStash(id) {\n var ids = this.propertyIDs(id);\n this.name = this.property(ids.name);\n\n // TIP: keep the .settings entries == ids[s] keys and this will\n // remain simple:\n this.defaults.settings.forEach((s) => {\n this[s] = this.property(ids[s]);\n });\n }\n};\n","const AccountingJEArchiveCore = require(\"../../../core/process/tasks/ABProcessTaskServiceAccountingJEArchiveCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class AccountingJEArchive extends AccountingJEArchiveCore {\n ////\n //// Process Instance Methods\n ////\n\n propertyIDs(id) {\n return {\n name: `${id}_name`,\n processBatchValue: `${id}_processBatchValue`,\n objectBatch: `${id}_objectBatch`,\n objectBalance: `${id}_objectBalance`,\n objectJE: `${id}_objectJE`,\n objectJEArchive: `${id}_objectJEArchive`,\n\n fieldBatchFiscalMonth: `${id}_fieldBatchFiscalMonth`,\n fieldJeAccount: `${id}_fieldJeAccount`,\n fieldJeRC: `${id}_fieldJeRC`,\n fieldJeArchiveBalance: `${id}_fieldJeArchiveBalance`,\n fieldBrFiscalMonth: `${id}_fieldBrFiscalMonth`,\n fieldBrAccount: `${id}_fieldBrAccount`,\n fieldBrRC: `${id}_fieldBrRC`,\n\n fieldsMatch: `${id}_fieldsMatch`,\n };\n }\n\n /**\n * propertiesShow()\n * display the properties panel for this Process Element.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesShow(id) {\n let ids = this.propertyIDs(id);\n\n let processValues = [{ id: 0, value: L(\"Select a Process Value\") }];\n let processDataFields = this.process.processDataFields(this);\n (processDataFields || []).forEach((row) => {\n processValues.push({ id: row.key, value: row.label });\n });\n\n let objectList = this.AB.objects().map((o) => {\n return { id: o.id, value: o.label || o.name, object: o };\n });\n\n objectList.unshift({\n id: 0,\n value: L(\"Select an Object\"),\n });\n\n let getConnectFieldOptions = (objectId) => {\n let object = this.AB.objectByID(objectId);\n if (!object) return [];\n\n let options = object\n .fields((f) => f.isConnection)\n .map((f) => {\n return {\n id: f.id,\n value: f.label,\n };\n });\n\n options.unshift({\n id: 0,\n value: L(\"Select a Field\"),\n });\n\n return options;\n };\n\n let updateFields = (fieldPickers, fieldValues) => {\n fieldPickers.forEach((fp) => {\n var picker = $$(fp);\n if (picker) {\n picker.define(\"options\", fieldValues);\n picker.refresh();\n picker.show();\n }\n });\n };\n\n let refreshBatchFields = (objectId) => {\n let options = getConnectFieldOptions(objectId);\n updateFields([ids.fieldBatchFiscalMonth], options);\n };\n\n let refreshBRFields = (objectId) => {\n let options = getConnectFieldOptions(objectId);\n updateFields(\n [ids.fieldBrAccount, ids.fieldBrFiscalMonth, ids.fieldBrRC],\n options\n );\n };\n\n let refreshJeFields = (objectId) => {\n let options = getConnectFieldOptions(objectId);\n updateFields([ids.fieldJeAccount, ids.fieldJeRC], options);\n };\n\n let refreshJeArchiveFields = (objectId) => {\n let options = getConnectFieldOptions(objectId);\n updateFields([ids.fieldJeArchiveBalance], options);\n };\n\n let refreshFieldsMatch = () => {\n let $fieldsMatch = $$(ids.fieldsMatch);\n if (!$fieldsMatch) return;\n\n // clear form\n webix.ui([], $fieldsMatch);\n\n let JEObj = this.AB.objectByID(this.objectJE);\n if (!JEObj) return;\n\n let JEArchiveObj = this.AB.objectByID(this.objectJEArchive);\n if (!JEArchiveObj) return;\n\n // create JE acrhive field options to the form\n JEArchiveObj.fields().forEach((f) => {\n let jeFields = [];\n\n if (f.isConnection) {\n jeFields = JEObj.fields((fJe) => {\n return (\n fJe.isConnection &&\n fJe.settings &&\n f.settings &&\n fJe.settings.linkObject == f.settings.linkObject &&\n fJe.settings.linkType == f.settings.linkType &&\n fJe.settings.linkViaType == f.settings.linkViaType &&\n fJe.settings.isCustomFK == f.settings.isCustomFK\n );\n });\n } else {\n jeFields = JEObj.fields((fJe) => fJe.key == f.key);\n }\n\n jeFields = jeFields.map((fJe) => {\n return {\n id: fJe.id,\n value: fJe.label,\n };\n });\n\n $fieldsMatch.addView({\n view: \"select\",\n name: f.id,\n label: f.label,\n options: jeFields,\n });\n });\n\n $fieldsMatch.setValues(this.fieldsMatch || {});\n };\n\n let fieldBatchList = getConnectFieldOptions(this.objectBatch);\n let fieldBalanceList = getConnectFieldOptions(this.objectBalance);\n let fieldJeList = getConnectFieldOptions(this.objectJE);\n let fieldJeArchiveList = getConnectFieldOptions(this.objectJEArchive);\n\n let ui = {\n id: id,\n view: \"form\",\n elementsConfig: {\n labelWidth: 180,\n },\n elements: [\n {\n id: ids.name,\n view: \"text\",\n label: L(\"Name\"),\n name: \"name\",\n value: this.name,\n },\n {\n id: ids.processBatchValue,\n view: \"select\",\n label: L(\"Process Batch Value\"),\n value: this.processBatchValue,\n name: \"processBatchValue\",\n options: processValues,\n },\n {\n id: ids.objectBatch,\n view: \"select\",\n label: L(\"Batch Object\"),\n value: this.objectBatch,\n name: \"objectBatch\",\n options: objectList,\n on: {\n onChange: (newVal) => {\n this.objectBatch = newVal;\n refreshBatchFields(newVal);\n },\n },\n },\n {\n id: ids.fieldBatchFiscalMonth,\n view: \"select\",\n label: L(\"Batch -> Fiscal Month\"),\n value: this.fieldBatchFiscalMonth,\n name: \"fieldBatchFiscalMonth\",\n options: fieldBatchList,\n },\n {\n id: ids.objectBalance,\n view: \"select\",\n label: L(\"BR Object\"),\n value: this.objectBalance,\n name: \"objectBalance\",\n options: objectList,\n on: {\n onChange: (newVal) => {\n this.objectBalance = newVal;\n refreshBRFields(newVal);\n },\n },\n },\n {\n id: ids.fieldBrFiscalMonth,\n view: \"select\",\n label: L(\"BR -> Fiscal Month\"),\n value: this.fieldBrFiscalMonth,\n name: \"fieldBrFiscalMonth\",\n options: fieldBalanceList,\n },\n {\n id: ids.fieldBrAccount,\n view: \"select\",\n label: L(\"BR -> Account\"),\n value: this.fieldBrAccount,\n name: \"fieldBrAccount\",\n options: fieldBalanceList,\n },\n {\n id: ids.fieldBrRC,\n view: \"select\",\n label: L(\"BR -> RC\"),\n value: this.fieldBrRC,\n name: \"fieldBrRC\",\n options: fieldBalanceList,\n },\n {\n id: ids.objectJE,\n view: \"select\",\n label: L(\"JE Object\"),\n value: this.objectJE,\n name: \"objectJE\",\n options: objectList,\n on: {\n onChange: (newVal) => {\n this.objectJE = newVal;\n refreshJeFields(newVal);\n refreshFieldsMatch();\n },\n },\n },\n {\n id: ids.fieldJeAccount,\n view: \"select\",\n label: L(\"JE -> Account\"),\n value: this.fieldJeAccount,\n name: \"fieldJeAccount\",\n options: fieldJeList,\n },\n {\n id: ids.fieldJeRC,\n view: \"select\",\n label: L(\"JE -> RC\"),\n value: this.fieldJeRC,\n name: \"fieldJeRC\",\n options: fieldJeList,\n },\n {\n id: ids.objectJEArchive,\n view: \"select\",\n label: L(\"JE Archive Object\"),\n value: this.objectJEArchive,\n name: \"objectJEArchive\",\n options: objectList,\n on: {\n onChange: (newVal) => {\n this.objectJEArchive = newVal;\n refreshJeArchiveFields(newVal);\n refreshFieldsMatch();\n },\n },\n },\n {\n id: ids.fieldJeArchiveBalance,\n view: \"select\",\n label: L(\"JE Archive -> BR\"),\n value: this.fieldJeArchiveBalance,\n name: \"fieldJeArchiveBalance\",\n options: fieldJeArchiveList,\n },\n {\n view: \"fieldset\",\n label: \"Fields Matching\",\n body: {\n id: ids.fieldsMatch,\n view: \"form\",\n borderless: true,\n elements: [],\n },\n },\n ],\n };\n\n webix.ui(ui, $$(id));\n\n $$(id).show();\n\n refreshFieldsMatch();\n }\n\n /**\n * propertiesStash()\n * pull our values from our property panel.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n */\n propertiesStash(id) {\n let ids = this.propertyIDs(id);\n this.name = this.property(ids.name);\n\n // TIP: keep the .settings entries == ids[s] keys and this will\n // remain simple:\n this.defaults.settings.forEach((s) => {\n if (s === \"fieldsMatch\") {\n this[s] = $$(ids.fieldsMatch).getValues();\n } else {\n this[s] = this.property(ids[s]);\n }\n });\n }\n};\n","const ApiTaskCore = require(\"../../../core/process/tasks/ABProcessTaskServiceApiCore.js\");\n\n// let L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ApiTask extends ApiTaskCore {\n static defaults() {\n return { key: \"Api\" };\n }\n\n fromValues(values) {\n super.fromValues(values);\n // These are raw values on the client, need to be saved so we can update\n // the server. There they will be encrypted and stored seperate from our\n // definition.\n this.secrets = values.secrets;\n }\n\n toObj() {\n const obj = super.toObj();\n obj.secrets = this.secrets;\n return obj;\n }\n\n ////\n //// Process Instance Methods\n ////\n\n warningsEval() {\n super.warningsEval();\n\n [\"url\", \"method\"].forEach(\n (prop) => !this[prop] && this.warningMessage(`is missing a ${prop}`)\n );\n\n // Verify secrets / process data patterns are valid\n const dataPattern = /<%= (.+?) %>/g;\n const dataToCheck = [];\n [\"body\", \"url\"].forEach((prop) => {\n if (!this[prop]) return;\n const matches = (this[prop].match(dataPattern) ?? []).map((m) => ({\n location: prop,\n match: m,\n }));\n dataToCheck.push(...matches);\n });\n if (this.headers) {\n this.headers.forEach(({ value }) => {\n const matches = (value.match(dataPattern) ?? []).map((m) => ({\n location: \"header\",\n match: m,\n }));\n dataToCheck.push(...matches);\n });\n }\n if (dataToCheck.length == 0) return;\n const processData = this.process\n .processDataFields(this)\n .filter((i) => i)\n .map((i) => i.key);\n const secrets = this.storedSecrets ?? [];\n this.secrets?.forEach((s) => secrets.push(s.name));\n dataToCheck.forEach(({ location, match }) => {\n const [, secret] = /<%= Secret: (.+?) %>/.exec(match) ?? [];\n if (secret) {\n if (!secrets.includes(secret)) {\n this.warningMessage(\n `is missing secret '${secret}' in ${location}.`\n );\n }\n } else {\n const [, data] = /<%= (.+?) %>/.exec(match) ?? [];\n if (!processData.includes(data)) {\n this.warningMessage(\n `references unkown data field '${data}' in ${location}`\n );\n }\n }\n });\n }\n};\n","const CalculateTaskCore = require(\"../../../core/process/tasks/ABProcessTaskServiceCalculateCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class CalculateTask extends CalculateTaskCore {\n ////\n //// Process Instance Methods\n ////\n\n warningsEval() {\n super.warningsEval();\n\n if (!this.formulaText) {\n this.warningMessage(\"is missing a formula.\");\n }\n\n if (this.formulaText) {\n const hash = {};\n (this.process.processDataFields(this) || []).forEach((item) => {\n if (!item) return;\n hash[`{${item.label}}`] = item;\n });\n\n let exp = new RegExp(`{[^}]*}`, \"g\");\n let entries = this.formulaText.match(exp) || [];\n entries.forEach((entry) => {\n if (!hash[entry]) {\n this.warningMessage(\n `could not resolve process value [${entry}]`\n );\n }\n });\n }\n }\n};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessTaskServiceGetResetPasswordUrlCore = require(\"../../../core/process/tasks/ABProcessTaskServiceGetResetPasswordUrlCore.js\");\n\nmodule.exports = class ABProcessTaskServiceGetResetPasswordUrl extends (\n ABProcessTaskServiceGetResetPasswordUrlCore\n) {\n warningsEval() {\n super.warningsEval();\n\n if (!this.email) {\n this.warningMessage(\"is missing the email address.\");\n }\n\n const processData = (this.process.processDataFields(this) ?? [])\n .filter((item) => item.field?.key == \"email\")\n .map((item) => {\n return {\n id: item.key,\n value: item.label,\n };\n });\n\n if (processData.length == 0) {\n this.warningMessage(\"has no previous tasks exporting email fields.\");\n }\n }\n};\n","const InsertRecordTaskCore = require(\"../../../core/process/tasks/ABProcessTaskServiceInsertRecordCore.js\");\n\nmodule.exports = class InsertRecordTask extends InsertRecordTaskCore {\n warningsEval() {\n super.warningsEval();\n\n if (!this.objectID) {\n this.warningMessage(\"has no Object set.\");\n }\n\n const fv = Object.keys(this.fieldValues || {}) || [];\n if (fv.length == 0) {\n this.warningMessage(\"has no fields set\");\n } else {\n let isSet = false;\n fv.forEach((f) => {\n if (\n this.fieldValues[f]?.set != \"0\" &&\n this.fieldValues[f]?.value != null\n ) {\n isSet = true;\n }\n });\n if (!isSet) {\n this.warningMessage(\"has no fields set\");\n }\n }\n }\n};\n","const ABProcessTaskServiceQueryCore = require(\"../../../core/process/tasks/ABProcessTaskServiceQueryCore.js\");\n\nconst ABQLManager = require(\"../../ql/ABQLManager.js\");\n\nmodule.exports = class ABProcessTaskServiceQuery extends (\n ABProcessTaskServiceQueryCore\n) {\n constructor(attributes, process, AB) {\n super(attributes, process, AB);\n\n this.attributes = attributes;\n }\n\n ABQLManager() {\n return ABQLManager;\n }\n\n warnings() {\n // first get all our embedded QL Command warnings\n let qlWarnings = [];\n if (this.qlObj) {\n qlWarnings = qlWarnings.concat(this.qlObj.warnings());\n }\n // run the QL Warnings through our .warningMessage() to get a message\n // that includes this task's name:\n qlWarnings.forEach((w) => {\n if (w?.message) this.warningMessage(w.message);\n });\n let myWarnings = super.warnings();\n return myWarnings.filter((w) => w); // filter out any undefined.\n }\n\n warningsEval() {\n super.warningsEval();\n if (this.qlObj) {\n this.qlObj.warningsEval();\n } else {\n this.warningMessage(`has no Query defined.`);\n }\n\n if (!this.name) {\n this.warningMessage(\"does not have a name.\", {\n attributes: this.attributes,\n });\n }\n\n let hasSave = false;\n let curr = this.qlObj;\n while (curr) {\n if (curr.key === \"row_save\" || curr.key === \"set_save\") {\n hasSave = true;\n curr = null; // just stop here.\n } else {\n curr = curr.next;\n }\n }\n\n if (!hasSave) {\n this.warningMessage(\"requires at least one Save operation.\");\n }\n }\n};\n","const SubProcessCore = require(\"../../../core/process/tasks/ABProcessTaskSubProcessCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class SubProcess extends SubProcessCore {\n ////\n //// Process Instance Methods\n ////\n\n /*\n propertyIDs(id) {\n return {\n name: `${id}_name`,\n isEnable: `${id}_isEnable`,\n parameterId: `${id}_parameterId`,\n };\n }\n\n /**\n * @method propertiesShow()\n * display the properties panel for this Process Element.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n * /\n propertiesShow(id) {\n let ids = this.propertyIDs(id);\n\n // Pull query tasks option list\n let parameterOptions = (this.process.processDataFields(this) || []).map(\n (item) => {\n return {\n id: item.key,\n value: item.label,\n };\n }\n );\n\n let ui = {\n id: id,\n view: \"form\",\n elementsConfig: {\n labelWidth: 120,\n },\n elements: [\n {\n id: ids.name,\n view: \"text\",\n label: L(\"Name\"),\n name: \"name\",\n value: this.name,\n },\n {\n id: ids.isEnable,\n view: \"switch\",\n label: L(\"Enable\"),\n value: this.isEnable,\n },\n {\n id: ids.parameterId,\n view: \"richselect\",\n label: L(\"Repeat for\"),\n options: parameterOptions,\n value: this.parameterId,\n },\n ],\n };\n\n webix.ui(ui, $$(id));\n\n $$(id).show();\n }\n\n /**\n * @method propertiesStash()\n * pull our values from our property panel.\n * @param {string} id\n * the webix $$(id) of the properties panel area.\n * /\n propertiesStash(id) {\n let ids = this.propertyIDs(id);\n this.name = this.property(ids.name);\n this.isEnable = this.property(ids.isEnable);\n this.parameterId = this.property(ids.parameterId);\n }\n */\n\n /**\n * @method diagramProperties()\n * return a set of values for the XML shape definition based upon\n * the current values of this object.\n * @return {json}\n */\n diagramProperties(bpmnModeler) {\n let props = super.diagramProperties();\n props = props || [{}];\n props[0].def = props[0].def || {};\n\n if (this.parameterId != null) {\n props[0].def = props[0].def || {};\n props[0].def.loopCharacteristics = bpmnModeler\n .get(\"moddle\")\n .create(\"bpmn:MultiInstanceLoopCharacteristics\");\n props[0].def.loopCharacteristics.isSequential = true;\n }\n\n return props;\n }\n\n /**\n * @method onChange()\n * update the current Task with information that was relevant\n * from the provided BPMN:Element\n * @param {BPMNElement}\n */\n onChange(defElement) {\n let loopCharacteristics =\n defElement.loopCharacteristics ||\n defElement.businessObject.loopCharacteristics ||\n {};\n\n switch (loopCharacteristics.$type) {\n case \"bpmn:MultiInstanceLoopCharacteristics\":\n this.loopType = loopCharacteristics.isSequential\n ? \"sequential\"\n : \"parallel\";\n break;\n case \"bpmn:StandardLoopCharacteristics\":\n this.loopType = \"looping\";\n break;\n }\n }\n\n /**\n * @method destroy()\n * destroy this sub process and inside tasks\n *\n * @return {Promise}\n */\n destroy() {\n // reuse .destroy function of ABProcess\n // to clear tasks within this sub process\n return this.process.destroy.call(this);\n }\n\n /**\n * @method save()\n * persist this sub process\n *\n * @return {Promise}\n *\t\t\t\t\t\t.resolve( {this} )\n */\n save() {\n // reuse .save function of ABProcess\n // to update tasks within this sub process\n return this.process.save.call(this);\n }\n\n /**\n * @method elementNewForModelDefinition()\n * create a new process element defined by the given BPMN:Element\n *\n * the BPMN:Element definition comes from the BPMN Modeler when a new\n * diagram element is created.\n *\n * @param {BPMN:Element} element\n * the BPMN modeler diagram element definition\n * @return {ABProcessParticipant|ABProcessLane|ABProcessElement}\n *\n */\n elementNewForModelDefinition(element) {\n let task = this.AB.processElementNewForModelDefinition(element, this);\n\n // Add a new task to this sub process\n if (task) {\n this.elementAdd(task);\n }\n return task;\n }\n\n warningsEval() {\n super.warningsEval();\n\n (this._unknownElementIDs || []).forEach((eID) => {\n this.warningMessage(\n `is referencing an unknown process element id[${eID}]`,\n { process: this.id, eID }\n );\n });\n }\n};\n","const ABProcessTaskUserCore = require(\"../../../core/process/tasks/ABProcessTaskUserCore.js\");\n\nmodule.exports = class ABProcessTaskUser extends ABProcessTaskUserCore {};\n","const ABProcessTaskUserApprovalCore = require(\"../../../core/process/tasks/ABProcessTaskUserApprovalCore.js\");\n\nmodule.exports = class ABProcessTaskUserApproval extends (\n ABProcessTaskUserApprovalCore\n) {};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessTaskUserExternalCore = require(\"../../../core/process/tasks/ABProcessTaskUserExternalCore.js\");\n\nmodule.exports = class ABProcessTaskUserExternal extends (\n ABProcessTaskUserExternalCore\n) {};\n","const ABProcessTaskUserFormCore = require(\"../../../core/process/tasks/ABProcessTaskUserFormCore.js\");\n\nmodule.exports = class ABProcessTaskUserForm extends (\n ABProcessTaskUserFormCore\n) {};\n","// import ABApplication from \"./ABApplication\"\n// const ABApplication = require(\"./ABApplication\"); // NOTE: change to require()\nconst ABProcessTriggerCore = require(\"../../../core/process/tasks/ABProcessTriggerCore.js\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABProcessTrigger extends ABProcessTriggerCore {};\n","const ABProcessTriggerLifecycleCore = require(\"../../../core/process/tasks/ABProcessTriggerLifecycleCore.js\");\n\nmodule.exports = class ABProcessTriggerLifecycle extends (\n ABProcessTriggerLifecycleCore\n) {};\n","const ABProcessTriggerTimerCore = require(\"../../../core/process/tasks/ABProcessTriggerTimerCore.js\");\n\nconst START_URL = \"/process/timer/#id#/start\";\nconst STOP_URL = \"/process/timer/#id#/stop\";\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABProcessTriggerTimer extends ABProcessTriggerTimerCore {\n /**\n * @method save()\n * persist this instance of ABObject with it's parent ABApplication\n * @return {Promise}\n */\n save() {\n return (\n Promise.resolve()\n .then(() => super.save())\n // Restart the timer\n .then((result) => {\n return this.AB.Network.put({\n url: (this.isEnabled ? START_URL : STOP_URL).replace(\n \"#id#\",\n this.id\n ),\n });\n })\n );\n }\n};\n","/*\n * ABQL\n *\n * An ABQL defines the base class for our AB Query Language Objects.\n * These classes share a common way to\n * - parse input strings for commands\n *\n *\n */\nconst ABQLCore = require(\"../../core/ql/ABQLCore.js\");\nconst RowUpdater = require(\"../RowUpdater.js\").default;\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nclass ABQL extends ABQLCore {\n constructor(attributes, parameterDefinitions, prevOP, task, AB) {\n super(attributes, parameterDefinitions, prevOP, task, AB);\n\n this.on(\"warning\", (message, data) => {\n this._warnings.push({ message, data });\n });\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method parseRow()\n * When it is time to pull the information from the properties panel,\n * use this fn to get the current Row of data.\n *\n * This fn() will populate the this.params with the values for each\n * of our .parameterDefinitions.\n *\n * @param {webixNode} row\n * the current webix node that contains the ROW defining the\n * operation and it's parameters.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n */\n parseRow(row, id) {\n // const allColumns = row.getChildViews();\n // allColumns.shift(); // remove selector\n this.parameterDefinitions.forEach((pDef) => {\n // const col = allColumns.shift();\n const myID = this.uiID(id);\n\n this.ids = this.toIDs(myID);\n this.params = this.params ?? {};\n\n let $uiCondition = null;\n\n switch (pDef.type) {\n case \"objectFields\":\n this.params[pDef.name] = $$(this.ids.objectfields).getValue();\n\n break;\n\n case \"objectName\":\n this.params[pDef.name] = $$(this.ids.objectname).getValue();\n\n break;\n\n case \"objectConditions\":\n case \"objectValues\":\n $uiCondition = $$(this.ids.condition);\n\n if ($uiCondition) {\n const condition = $uiCondition.getValue();\n\n if (condition && condition !== \"\") {\n this.params[pDef.name] = JSON.parse(condition);\n }\n }\n\n break;\n\n case \"taskParam\":\n this.params[pDef.name] = $$(this.ids.taskparam).getValue();\n\n break;\n }\n });\n }\n\n /*\n * @method toIDs()\n * generate a set of unique webix ids to use for our UI.\n * @param {string} myID\n * the unique id generated by .uiID()\n */\n toIDs(myID) {\n return {\n condition: `${myID}_condition`,\n objectfields: `${myID}_objectfields`,\n objectname: `${myID}_objname`,\n popup: `${myID}_popup`,\n select: `${myID}_select`,\n shorthand: `${myID}_shorthand`,\n taskparam: `${myID}_taskparam`,\n spacer: `${myID}_spacer`,\n };\n }\n\n /**\n * @method uiAddParamForDef()\n * Add an operation parameter for each parameterDefinition we have defined.\n * @param {obj} pDef\n * the current parameterDefinition entry we are creating the UI\n * for.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @param {obj} ui\n * the current webix ui definition we are building.\n */\n uiAddParamForDef(pDef, id, ui) {\n // params are added to a .col[] definition.\n // if our ui isn't down to the current .col element, then drill down\n if (!ui.cols) {\n if (ui.rows) {\n for (let i = 0; i < ui.rows.length; i++)\n if (ui.rows[i].cols) {\n this.uiAddParamForDef(pDef, id, ui.rows[i]);\n\n break;\n }\n } else throw new Error(\"provided ui is not able to add a parameter!\");\n\n return;\n }\n\n const paramUI = this.uiParamUI(pDef, id);\n\n if (paramUI) {\n // if we only have 1 param\n if (this.parameterDefinitions.length === 1) {\n ui.cols.pop();\n ui.cols.push(paramUI);\n }\n // if we haven't already added a parameter\n else {\n // create a row stack of parameters:\n if (ui.cols.length < 3)\n ui.cols.push({\n rows: [paramUI],\n });\n // add to the current stack of parameters\n else ui.cols[2].rows.push(paramUI);\n }\n }\n }\n\n /**\n * @method uiAddNext()\n * Add the next row selector for this operation:\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @param {obj} ui\n * the current webix ui definition we are building.\n */\n uiAddNext(id, ui) {\n const uiRow = this.uiNextRow(id);\n\n // if we have a next operation defined, then add on the ui definitions\n // for that operation:\n if (this.next) {\n this.next.uiAddParams(id, uiRow);\n ui.rows.push(uiRow);\n this.next.uiAddNext(id, ui);\n }\n // otherwise we just leave the selector:\n else ui.rows.push(uiRow);\n }\n\n /**\n * @method uiAddParams()\n * Add operation parameter(s) for each parameterDefinition we have defined.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @param {obj} ui\n * the current webix ui definition we are building.\n */\n uiAddParams(id, ui) {\n this.parameterDefinitions.forEach((pDef) => {\n this.uiAddParamForDef(pDef, id, ui);\n });\n }\n\n /*\n * @method uiID()\n * generate a unique webix id for this operation.\n * @param {string} id\n * the webix id of the base property.query holder\n */\n uiID(id) {\n if (this.prevOP) return `${this.prevOP.uiID(id)}_${this.constructor.key}`;\n\n return `${id}_${this.constructor.key}`;\n }\n\n /*\n * uiXXX Operations:\n * are UI building operations that are performed BEFORE the webix UI\n * is generated. They work by filling out a {ui} object definition\n * that webix will eventually create into the DOM.\n *\n * viewXXX Operations:\n * are UI building operations that are performed AFTER the webix UI\n * is generated. They work by adding in child views to an existing\n * DOM.\n */\n\n /**\n * @method uiNextRow()\n * return the webix UI definition for the next of UI chaining.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @return {obj}\n */\n uiNextRow(id) {\n const nextOptions = this.NextQLOps ?? this.constructor.NextQLOps;\n const options = nextOptions.map((op) => {\n return { id: op.key, value: op.label };\n });\n\n options.unshift({ id: 0, value: L(\"choose next operation\") });\n\n const myID = this.uiID(id);\n const ids = this.toIDs(myID);\n\n const uiRow = {\n cols: [\n {\n id: ids.select,\n view: \"select\",\n value: this.next ? this.next.constructor.key : 0,\n options: options,\n on: {\n onChange: (newValue, oldValue) => {\n const resetValue = () => {\n const select = $$(ids.select);\n\n select.blockEvent();\n select.setValue(oldValue);\n select.unblockEvent();\n };\n\n if (newValue === oldValue) return;\n\n const newOP = nextOptions.find(\n (op) => op.key === newValue\n );\n\n if (!newOP) {\n resetValue();\n\n return;\n }\n\n const thisRow = $$(ids.select).getParentView();\n const thisQuery = thisRow.getParentView();\n const addOP = () => {\n if (newOP) {\n const nextOP = new newOP(\n {},\n this,\n this.task,\n this.AB\n );\n\n this.next = nextOP;\n\n nextOP.viewAddParams(id, thisRow);\n nextOP.viewAddNext(id, thisQuery);\n }\n };\n\n // if there are rows after this one, then warn\n // about changing\n const allRows = thisQuery.getChildViews();\n\n if (allRows.length - 1 > allRows.indexOf(thisRow))\n webix.confirm({\n title: L(\"continue?\"),\n text: L(\n \"changing this rule will reset any following rules.\"\n ),\n ok: L(\"Yes\"),\n cancel: L(\"No\"),\n callback: (result) => {\n if (result) {\n // remove the current additional Rows:\n let ir = allRows.length - 1;\n\n while (\n allRows[ir].config.id !== thisRow.config.id\n ) {\n thisQuery.removeView(allRows[ir]);\n ir--;\n }\n\n // now remove the parameters\n const allCols = thisRow.getChildViews();\n\n let ic = allCols.length;\n\n while (ic > 1) {\n thisRow.removeView(allCols[ic - 1]);\n ic--;\n }\n\n addOP();\n } else resetValue();\n },\n });\n else addOP();\n },\n },\n },\n {\n id: ids.spacer,\n },\n ],\n };\n\n return uiRow;\n }\n\n uiNextRowSelectorRefresh(id) {\n const $select = $$(this.ids.select);\n\n if (!$select) return;\n\n const uiNextRow = this.uiNextRow(id);\n\n const uiNextCol =\n uiNextRow.cols.filter((c) => c.id == $select.config.id)[0] ??\n uiNextRow.cols[1];\n\n if (uiNextCol) AB.Webix.ui(uiNextCol, $select);\n }\n\n /**\n * @method uiParamUI()\n * return the webix UI definition for the parameter entry of this current\n * operation.\n * @param {obj} pDef\n * the current parameterDefinition entry we are creating the UI\n * for.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @return {obj}\n */\n uiParamUI(pDef, id) {\n const uiConfig = AB.Config.uiSettings();\n\n let myID = this.uiID(id);\n\n this.ids = this.toIDs(myID);\n\n let paramUI = null;\n let options = null;\n let Filter = null;\n let hashFieldIDs = null;\n let initialCond = null;\n let displayLabel = null;\n let initialValue = null;\n let Updater = null;\n let popUp = null;\n\n // now add the parameter\n switch (pDef.type) {\n case \"objectFields\":\n // an objectFields parameter returns a select list of fields\n // available on an Object.\n if (this.object)\n options = this.object.fields().map((f) => {\n return { id: f.id, value: f.label, icon: `fa fa-${f.icon}` };\n });\n\n options.unshift({\n id: \"_PK\",\n value: \"[PK]\",\n });\n\n // if not set, default .fieldID to the 1st entry in options\n // so we will have a default. In use, if a user sees the\n // 1st item and continues on, then we will have chosen it.\n if (!this.fieldID && options.length > 0) {\n // act like it was selected:\n this.params[pDef.name] = options[0].id;\n this.paramChanged(pDef, id);\n }\n\n paramUI = {\n id: this.ids.objectfields,\n view: \"richselect\",\n label: L(\"Field\"),\n labelWidth: 70,\n value: this.fieldID,\n options: options,\n on: {\n onChange: (newValue, oldValue) => {\n // this.params = this.params ?? {};\n if (newValue !== this.params[pDef.name]) {\n this.params[pDef.name] = newValue;\n this.paramChanged(pDef, id);\n }\n },\n },\n };\n\n break;\n\n case \"objectName\":\n // an objectName parameter returns a select list of available\n // objects in this ABFactory.\n options = this.AB.objects().map((o) => {\n return { id: o.id, value: o.label };\n });\n\n if (!this.objectID && options.length > 0) {\n this.objectID = options[0].id;\n this.params[pDef.name] = this.objectID;\n this.paramChanged(pDef);\n }\n\n paramUI = {\n id: this.ids.objectname,\n view: \"select\",\n label: L(\"Data Source\"),\n labelWidth: uiConfig.labelWidthLarge,\n value: this.objectID,\n options: options,\n on: {\n onChange: (newValue /*, oldValue */) => {\n this.params = this.params ?? {};\n\n if (newValue !== this.params[pDef.name]) {\n this.params[pDef.name] = newValue;\n this.paramChanged(pDef);\n }\n },\n },\n };\n\n break;\n\n case \"objectConditions\":\n // objectConditions: returns a filter text summary, that when\n // clicked, pops up a Filter Entry Popup.\n // the actual value is stored in a hidden field.\n\n // we will create a new FilterComplex() object to use for our\n // filtering.\n // Our goal is to create a special filter entry for each avaiable\n // process data value that is available.\n // A filter entry needs to look like:\n // {\n // id: `{string}`, // A unique id selector for this filter\n // name: `{string}`, // the operation name displayed\n // type, {obj} // an object defining the editor to show\n // fn: ()=>{} // a function used for filtering elements\n // }\n //\n // In our filters, we are assigning filters to EACH field by the\n // field.id. So the type definition needs to look like:\n // {\n // \"uniqueID of the field (field.id)\" : {webixUI definition}\n // }\n\n Filter = this.AB.filterComplexNew(id);\n hashFieldIDs = this.availableProcessDataFieldsHash();\n\n if (this.object) {\n Filter.fieldsLoad(this.object.fields(), this.object);\n // NOTE: this will create default filters based upon the\n // object fields() and their types\n\n // Now we need to add in the Process Data Fields:\n // for each Process Data Field that matches our same object\n const foundFields = Object.keys(hashFieldIDs).map(\n (f) => hashFieldIDs[f]\n );\n\n Filter.processFieldsLoad(foundFields);\n /*\n (foundFields ?? []).forEach((processField) => {\n const type = {};\n if (processField.field) {\n type[processField.field.id] = {\n view: \"select\",\n options: [\n {\n id: \"empty\",\n value: \"choose option\"\n },\n {\n id: processField.key,\n value: `context(${processField.label})`\n }\n ]\n };\n } else {\n // if there is no .field, it is probably an embedded special field\n // like: .uuid\n const key = processField.key.split(\".\").pop();\n type[key] = {\n view: \"select\",\n options: [\n {\n id: \"empty\",\n value: \"choose option\"\n },\n {\n id: processField.key,\n value: `context(${processField.label})`\n }\n ]\n };\n }\n\n // add an \"equals\" and \"not equals\" filter for each:\n Filter.filterAdd([\n {\n id: `context_equals`,\n name: `equals`,\n type,\n fn: (a, b) => {\n return a === b;\n }\n },\n {\n id: `context_not_equal`,\n name: `not equals`,\n type,\n fn: (a, b) => {\n return a !== b;\n }\n }\n ]);\n\n }); */\n }\n\n // every time the Filter \"saves\" it's data, it emits this event:\n // take the given condition and store it in our hidden element.\n Filter.on(\"save\", (condition) => {\n // @param {obj} condition an object describing the filter\n // condition.\n\n this.params = this.params ?? {};\n this.params[pDef.name] = condition;\n\n const shortHand = $$(this.ids.shorthand);\n\n shortHand.define({\n label: Filter.toShortHand(),\n });\n shortHand.refresh();\n\n // NOTE: the hidden element is a text field, so convert the\n // {condition object} => a string\n const elCondition = $$(this.ids.condition);\n\n elCondition.define({\n value: JSON.stringify(this.params[pDef.name]),\n });\n elCondition.refresh();\n });\n\n // create the initial condition value from our inputs.\n initialCond = \"\";\n\n if (this.params && this.params[pDef.name]) {\n Filter.setValue(this.params[pDef.name]);\n initialCond = JSON.stringify(this.params[pDef.name]);\n } else {\n Filter.setValue(null);\n }\n\n // what we show on the panel, is a text representation\n // of the current condition.\n displayLabel = Filter.toShortHand();\n\n paramUI = {\n rows: [\n {\n id: this.ids.shorthand,\n view: \"button\",\n label: displayLabel,\n on: {\n onItemClick: function () {\n Filter.popUp(this.$view, null, {\n pos: \"center\",\n });\n },\n },\n },\n // have a hidden field to contain the condition\n // value we will parse out later\n {\n id: this.ids.condition,\n view: \"text\",\n value: initialCond,\n hidden: true,\n },\n ],\n };\n\n break;\n\n case \"objectValues\":\n // objectValues : shows a condenced textual representation of the\n // field => value changes. Clicking on the text will show a popup\n // that allows you to add/remove additional field updates for\n // the current object.\n\n initialValue = \"\";\n Updater = new RowUpdater(myID, this.AB);\n\n if (this.object) Updater.objectLoad(this.object);\n\n // Set processed data key to value options\n Updater.setExtendedOptions(\n (this.task.process.processDataFields(this.task) ?? []).map(\n (item) => {\n return {\n id: item.key,\n value: item.label,\n };\n }\n )\n );\n\n // NOTE: .setValue() must be called once the RowUpdater is already\n // displayed. See the end of popUp() below:\n if (this.params && this.params[pDef.name]) {\n Updater.setValue(this.params[pDef.name]);\n initialValue = JSON.stringify(this.params[pDef.name]);\n }\n\n popUp = () => {\n // show the RowUpdater in a popup:\n const ui = {\n id: this.ids.popup,\n view: \"popup\",\n position: \"center\",\n minWidth: 700,\n modal: true,\n resize: true,\n body: {\n rows: [\n {\n height: 30,\n borderless: true,\n cols: [\n { fillspace: true },\n {\n view: \"button\",\n value: \"X\",\n width: 30,\n click: () => {\n $$(this.ids.popup).hide();\n },\n },\n ],\n },\n Updater.ui(),\n {\n view: \"button\",\n value: L(\"Save\"),\n css: \"webix_primary\",\n click: () => {\n this.params = this.params ?? {};\n this.params[pDef.name] = Updater.getValue();\n const sh = $$(this.ids.shorthand);\n\n sh.define({\n badge: this.params[pDef.name].length,\n });\n sh.refresh();\n\n const cond = $$(this.ids.condition);\n\n cond.define({\n value: JSON.stringify(this.params[pDef.name]),\n });\n cond.refresh();\n\n $$(this.ids.popup).hide();\n },\n },\n ],\n },\n };\n\n // create and show the popup\n this._myPopup = webix.ui(ui);\n this._myPopup.show();\n\n // NOTE: on a RowUpdater, the values need to be set\n // AFTER it is displayed:\n if (this.params && this.params[pDef.name])\n Updater.setValue(this.params[pDef.name]);\n };\n\n paramUI = {\n rows: [\n // the textual shorthand for these values\n {\n id: this.ids.shorthand,\n view: \"button\",\n label: L(\"Update Popout\"),\n badge: this.params[pDef.name]?.length,\n on: {\n onItemClick: () => {\n popUp();\n },\n },\n },\n // the hidden field that contains the results\n {\n id: this.ids.condition,\n view: \"text\",\n value: initialValue,\n hidden: true,\n },\n ],\n };\n\n break;\n\n case \"taskParam\":\n paramUI = {\n id: this.ids.taskparam,\n view: \"text\",\n label: L(\"Variable\"),\n labelWidth: 70,\n value: this.params[pDef.name],\n placeholder: L(\"Enter parameter name\"),\n on: {\n onChange: (newValue, oldValue) => {\n // this.params = this.params ?? {};\n if (newValue !== this.params[pDef.name]) {\n this.params[pDef.name] = newValue;\n this.paramChanged(pDef, id);\n }\n },\n },\n };\n\n break;\n }\n\n return paramUI;\n }\n\n /**\n * @method viewAddNext()\n * Add the next selector row After this Operation:\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @param {webixNode} topView\n * the current webix node that needs this view added to\n * NOTE: this should be the top container that is adding a new\n * row for each operation.\n */\n viewAddNext(id, topView) {\n const uiRow = this.uiNextRow(id);\n\n topView.addView(uiRow);\n }\n\n /**\n * @method viewAddParams()\n * Add operation parameter(s) for each parameterDefinition we have defined.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n * @param {webixNode} rowView\n * the current webix node that needs this view added to\n * NOTE: this should be the ROW that the parameters are added to\n */\n viewAddParams(id, rowView) {\n const params = [];\n\n this.parameterDefinitions.forEach((pDef) => {\n // get the definition from .uiParamUI()\n params.push(this.uiParamUI(pDef, id));\n });\n\n let toInsert = null;\n\n // stack parameters in a row if there are more than 1\n if (params.length > 1)\n toInsert = {\n rows: params,\n };\n else toInsert = params.pop();\n\n if (toInsert) {\n rowView.removeView(rowView.getChildViews()[1]);\n rowView.addView(toInsert);\n }\n }\n\n warnings() {\n let myWarnings = this._warnings || [];\n if (this.next)\n myWarnings = myWarnings.concat(this.next.warnings()).filter((w) => w);\n return this.AB.uniq(myWarnings);\n }\n\n warningsEval() {\n this._warnings = [];\n if (this.next) this.next.warningsEval();\n }\n\n // warningsAll() {\n // let myWarnings = this.warnings();\n // if (this.next) {\n // myWarnings = myWarnings.concat(this.next.warningsAll());\n // }\n // return myWarnings;\n // }\n\n /**\n * @method warningMessage(message)\n * Save a warning message in a common format for our ProcessTasks.\n */\n warningMessage(message) {\n // this.emit(\"warning\", `${this.key}: ${message}`);\n this._warnings = this._warnings || [];\n this._warnings.push({ message: `${this.key}: ${message}` });\n }\n\n ////\n //// QueryString Parser routines:\n ////\n}\n\nmodule.exports = ABQL;\n","/*\n * ABQLFind\n *\n * An ABQLFind depends on a BASE QL object (Object, Datacollection, Query)\n * and can perform a DB query based upon that BASE object.\n *\n */\nconst ABQLFindCore = require(\"../../core/ql/ABQLFindCore.js\");\n\nclass ABQLFind extends ABQLFindCore {\n // constructor(attributes, prevOP, task, application) {\n // super(attributes, ParameterDefinitions, prevOP, task, application);\n // }\n ///\n /// Instance Methods\n ///\n}\n\nmodule.exports = ABQLFind;\n","/*\n * ABQLManager\n *\n * An interface for managing the different ABQL Operations available in our\n * AppBuilder.\n *\n */\n\nconst ABQLManagerCore = require(\"../../core/ql/ABQLManagerCore.js\");\nconst ABQLRootObject = require(\"./ABQLRootObject.js\");\n\nconst ABQLManager = {\n /**\n * @method fromAttributes()\n * return an {ABQL} object that represents the given attributes that\n * were saved from the previous .toObj()\n * @param {object} attributes\n *\t\t the values returned from the previous .toObj() call\n * @param {ABProcessTask***} task\n *\t\t the current ABProcessTaskServiceQuery that contains this QL\n * @param {ABFactory} AB\n *\t\t the current {ABFactory} active for this interface.\n * @return {ABQL} | null\n */\n fromAttributes: ABQLManagerCore.fromAttributes,\n\n /**\n * @method ids()\n * return a set of unique webix ids for the ui portions of this object.\n * @param {string} id\n *\t\t the webix base id of the parameters panel.\n * @return {object}\n */\n ids: (id) => {\n return {\n root: `${id}_root`,\n select: `${id}_root_select`,\n options: `${id}_root_options`,\n };\n },\n\n /**\n * @method builder\n * return a UI component like object that will display the QL builder.\n * The component will support:\n *\t\t.ui(id) : returns a webix ui definition for the current builder\n *\t\t.init(id) : performs any special actions to prepare the webix ui\n * @param {object} rootOP\n *\t\t the root ABQLxxxx operation\n * @param {ABProcessTask***} task\n *\t\t the current Process Task that is requesting the data.\n * @param {ABFactory} AB\n *\t\t the {ABFactory} active for this display.\n * @return {object}\n */\n builder: (rootOP, task, AB) => {\n // const rootOP = this.fromAttributes(attributes, task, AB);\n // const L = (...params) => AB.Multilingual.label(...params);\n\n return {\n ui: (id) => {\n rootOP = rootOP ?? new ABQLRootObject({}, task, AB);\n\n const ids = ABQLManager.ids(id);\n const ui = {\n rows: [\n {\n id: ids.root,\n cols: [],\n },\n ],\n };\n\n rootOP.uiAddParams(id, ui);\n rootOP.uiAddNext(id, ui);\n\n return ui;\n },\n init: (id) => {},\n };\n },\n\n /**\n * @method parse\n * step through the current properties panel and decode the QL objects\n * and their parameters.\n * Return the .toOBJ() attributes definition as a result.\n * @param {string} id\n *\t\t the webix base id of the parameters panel.\n * @param {ABProcessTask***} task\n *\t\t the current Process Task that is requesting the data.\n * @param {ABFactory} AB\n *\t\t the {ABFactory} object that is currently active.\n * @return {object}\n */\n parse: (id, task, AB) => {\n const ids = ABQLManager.ids(id);\n const root = $$(ids.root);\n\n if (!root) {\n console.warn(\"ABQLManager.parse(): unable to find root element\");\n\n return;\n }\n\n // get all the input rows\n const rows = root.getParentView().getChildViews();\n\n const parseCurrent = (rows, options, prevOP) => {\n if (rows.length === 0) return null;\n\n const row = rows.shift();\n\n // get which operation was selected\n // find the operation selector (skip any indents)\n const views = row.getChildViews();\n\n let selector = views.shift();\n\n while (!selector?.getValue) selector = views.shift();\n\n const value = selector.getValue();\n\n // figure out the QLOP object\n const OP = options.find((o) => {\n return o.key === value || o.key === ABQLRootObject.key;\n });\n\n if (OP) {\n let currOP = null;\n\n if (prevOP) currOP = new OP({}, prevOP, task, AB);\n else currOP = new OP({}, task, AB);\n\n // now get currOP to initialize from it's parameters:\n currOP.parseRow(row, id);\n\n // carry forward any .object info if not already established\n // by the .parseRow():\n if (!currOP.object && prevOP) {\n currOP.object = prevOP.object;\n currOP.objectID = currOP.object?.id ?? null;\n }\n\n const nextRow = parseCurrent(\n rows,\n currOP.NextQLOps ?? currOP.constructor.NextQLOps,\n currOP\n );\n\n currOP.next = nextRow;\n\n return currOP;\n }\n\n return null;\n };\n\n const operation = parseCurrent(rows, ABQLManagerCore.QLOps, null);\n\n return operation;\n },\n};\n\nmodule.exports = ABQLManager;\n","/*\n * ABQLRootObject\n *\n * An ABQL defines a Query Language Operation. A QL Operation\n * is intended to be evaluated at run time and return a value that can be\n * assigned to form value or an object.\n *\n *\n */\n\nconst ABQLRootObjectCore = require(\"../../core/ql/ABQLRootObjectCore.js\");\n\nclass ABQLObject extends ABQLRootObjectCore {\n // constructor(attributes, task, application) {\n // // NOTE: keep this so we can insert the prevOp === null\n // super(attributes, ParameterDefinitions, null, task, application);\n // }\n\n ///\n /// Instance Methods\n ///\n\n /*\n * @method paramChanged()\n * respond to an update to the given parameter.\n * NOTE: the value will ALREADY be saved in this.params[pDef.name].\n * @param {obj} pDef\n * the this.parameterDefinition entry of the parameter that was\n * changed.\n */\n paramChanged(pDef) {\n if (pDef.name === \"name\") {\n this.objectID = this.params[pDef.name];\n this.object = this.objectLookup(this.objectID);\n\n // ?? is this correct?\n // if we already have created a .next operation, and we have\n // just changed our .object, pass that information forward.\n if (this.next) this.next.object = this.object;\n }\n }\n\n /**\n * @method parseRow()\n * When it is time to pull the information from the properties panel,\n * use this fn to get the current Row of data.\n *\n * This fn() will populate the this.params with the values for each\n * of our .parameterDefinitions.\n *\n * @param {webixNode} row\n * the current webix node that contains the ROW defining the\n * operation and it's parameters.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n */\n parseRow(row, id) {\n super.parseRow(row, id);\n\n // for an Object operation, we need to set our .objectID after\n // the values are parsed.\n\n if (this.params.name) {\n this.objectID = this.params.name;\n this.object = this.objectLookup(this.params.name);\n }\n }\n\n warningsEval() {\n super.warningsEval();\n if (!this.object) {\n this.warningMessage(\"has no object set.\", {\n objectID: this.objectID,\n });\n }\n }\n}\n\nmodule.exports = ABQLObject;\n","const ABQLRowPluckCore = require(\"../../core/ql/ABQLRowPluckCore.js\");\n\nclass ABQLRowPluck extends ABQLRowPluckCore {\n /*\n * @method paramChanged()\n * respond to an update to the given parameter.\n * NOTE: the value will ALREADY be saved in this.params[pDef.name].\n * @param {obj} pDef\n * the this.parameterDefinition entry of the parameter that was\n * changed.\n */\n paramChanged(pDef, id) {\n super.paramChanged(pDef);\n\n // Re-generate next select options\n if (pDef.name === \"fieldID\") this.uiNextRowSelectorRefresh(id);\n }\n}\n\nmodule.exports = ABQLRowPluck;\n","/*\n * ABQLRowSave\n *\n * An ABQLRowSave can store the current Data set into the Process Task it is\n * in, so that this data can be made available to other Process Tasks.\n *\n */\n\nconst ABQLRowSaveCore = require(\"../../core/ql/ABQLRowSaveCore.js\");\n\nclass ABQLRowSave extends ABQLRowSaveCore {\n paramChanged(pDef, id) {\n super.paramChanged(pDef);\n }\n}\n\nmodule.exports = ABQLRowSave;\n","/*\n * ABQLRowUpdate\n *\n * An ABQLRow Update allows you to update the values on the current\n * Row of data.\n *\n */\n\nconst ABQLRowUpdateCore = require(\"../../core/ql/ABQLRowUpdateCore.js\");\n\nclass ABQLRowUpdate extends ABQLRowUpdateCore {\n // constructor(attributes, prevOP, task, application) {\n // super(attributes, ParameterDefinitions, prevOP, task, application);\n // // #Hack! : when an Operation provides the same .NextQlOps that it\n // // was defined in, we can't require it again ==> circular dependency.\n // // so we manually set it here from the operation that created us:\n // this.constructor.NextQLOps = prevOP.constructor.NextQLOps;\n // }\n ///\n /// Instance Methods\n ///\n}\n\nmodule.exports = ABQLRowUpdate;\n","/*\n * ABQLSetFirst\n *\n * An ABQLFind depends on a BASE QL object (Object, Datacollection, Query)\n * and can perform a DB query based upon that BASE object.\n *\n */\n\nconst ABQLSetFirstCore = require(\"../../core/ql/ABQLSetFirstCore.js\");\n\nclass ABQLSetFirst extends ABQLSetFirstCore {\n // constructor(attributes, prevOP, task, application) {\n // super(attributes, [], prevOP, task, application);\n // }\n ///\n /// Instance Methods\n ///\n}\n\nmodule.exports = ABQLSetFirst;\n","/*\n * ABQLSetPluck\n *\n * An ABQLSetPluck can process a set (array) of data and pluck out a specified\n * field from each row to then make an array of values that only contain that \n * field.\n * \n * Example: \narray = [\n {\n\tname: \"Neo\",\n\temail: \"neo@thematrix.com\",\n\trelationships: [ { morpheous}, {trinity} ]\n },\n {\n\tname: \"trinity\",\n\temail: \"trinity@thematrix.com\",\n\trelationships: [ {neo}, {morpheous} ]\n },\n {\n\tname: \"morpheous\",\n\temail: \"morpheous@thematrix.com\",\n\trelationships: [ {neo}, {trinity}]\n }\n\n]\n\npluck(\"email\") :\n\t[\n\t\t\"neo@thematrix.com\",\n\t\t\"trinity@thematrix.com\",\n\t\t\"morpheous@thematrix.com\"\n\t]\n\npluck(\"relationships\"):\n\t[\n\t\t{neo},\n\t\t{trinity},\n\t\t{morpheous}\n\t]\n *\n */\n\nconst ABQLSetPluckCore = require(\"../../core/ql/ABQLSetPluckCore.js\");\n\nclass ABQLSetPluck extends ABQLSetPluckCore {\n // constructor(attributes, prevOP, task, application) {\n // super(attributes, [], prevOP, task, application);\n // }\n ///\n /// Instance Methods\n ///\n\n /*\n * @method paramChanged()\n * respond to an update to the given parameter.\n * NOTE: the value will ALREADY be saved in this.params[pDef.name].\n * @param {obj} pDef\n * the this.parameterDefinition entry of the parameter that was\n * changed.\n */\n paramChanged(pDef) {\n if (pDef.name === \"fieldID\") {\n // debugger;\n this.fieldID = this.params[pDef.name];\n // v2 method:\n // this.field = this.object.fieldByID(this.fieldID);\n this.field = this.object.fieldByID(this.fieldID);\n\n // v2 method:\n // if (this.field && this.field.isConnected) {\n if (this.field && this.field.key === \"connectObject\") {\n this.objectOut = this.field.datasourceLink;\n this.objectOutID = this.objectOut.id;\n\n // ?? is this correct?\n // if we already have created a .next operation, and we have\n // just changed our .object, pass that information forward.\n if (this.next) this.next.object = this.objectOut;\n }\n }\n }\n\n /**\n * @method parseRow()\n * When it is time to pull the information from the properties panel,\n * use this fn to get the current Row of data.\n *\n * This fn() will populate the this.params with the values for each\n * of our .parameterDefinitions.\n *\n * NOTE: in this process our .object and .objectOut isn't as simple\n * as the other QL node types. We'll have to interpolate our values\n * from the given fieldID in our property panel.\n *\n * @param {webixNode} row\n * the current webix node that contains the ROW defining the\n * operation and it's parameters.\n * @param {string} id\n * the unique id for where the properties panel is displayed.\n */\n parseRow(row, id) {\n super.parseRow(row, id);\n\n this.fieldID = this.params.fieldID;\n\n // we now have to build backwards from the current fieldID to set our\n // relevant .object and .objectOut\n this.AB.objects((o) => {\n if (!this.field) {\n // const field = o.fieldByID(this.fieldID);\n const field = o.fieldByID(this.fieldID);\n\n if (field) this.field = field;\n }\n });\n\n if (this.field) {\n this.object = this.field.object;\n\n // v2 method:\n // if (this.field.isConnected) {\n if (this.field && this.field.key === \"connectObject\") {\n this.objectOut = this.field.datasourceLink;\n this.objectOutID = this.objectOut.id;\n }\n }\n }\n}\n\nmodule.exports = ABQLSetPluck;\n","/*\n * ABQLSetSave\n *\n * An ABQLSetSave can store the current Data set into the Process Task it is\n * in, so that this data can be made available to other Process Tasks.\n *\n */\n\nconst ABQLSetSaveCore = require(\"../../core/ql/ABQLSetSaveCore.js\");\n\nclass ABQLSetSave extends ABQLSetSaveCore {\n // constructor(attributes, prevOP, task, application) {\n // super(attributes, [], prevOP, task, application);\n // }\n ///\n /// Instance Methods\n ///\n\n /*\n * @method paramChanged()\n * respond to an update to the given parameter.\n * NOTE: the value will ALREADY be saved in this.params[pDef.name].\n * @param {obj} pDef\n * the this.parameterDefinition entry of the parameter that was\n * changed.\n */\n paramChanged(pDef) {\n if (pDef.name === \"task_param\") {\n this.taskParam = this.params[pDef.name];\n }\n }\n\n parseRow(row, id) {\n super.parseRow(row, id);\n\n this.taskParam = this.params[\"task_param\"];\n\n if (!this.registered) {\n this.task.registerDatasource(this);\n this.registered = true;\n }\n }\n\n warningsEval() {\n super.warningsEval();\n if (!this.taskParam || this.taskParam === \"\") {\n this.warningMessage(\"requires a name to save our data as.\");\n }\n }\n}\n\nmodule.exports = ABQLSetSave;\n","const ABViewCore = require(\"../../core/views/ABViewCore.js\");\nconst ABViewComponent = require(\"./viewComponent/ABViewComponent\").default;\n\nmodule.exports = class ABView extends ABViewCore {\n // constructor(attributes, application, parent) {\n // super(attributes, application, parent);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewComponent(this);\n }\n\n /*\n * @method componentList\n * return the list of components available on this view to display in the editor.\n * @param {bool} isEdited is this component currently in the Interface Editor\n * @return {array} of ABView objects.\n */\n componentList(isEdited) {\n // views not allowed to drop onto this View:\n var viewsToIgnore = [\n \"view\",\n \"page\",\n \"formpanel\",\n \"viewcontainer\",\n // not allowed Detail's widgets\n \"detailcheckbox\",\n \"detailcustom\",\n \"detailconnect\",\n \"detailimage\",\n \"detailselectivity\",\n \"detailtext\",\n \"detailtree\",\n // not allowed Form's widgets\n \"button\",\n \"checkbox\",\n \"connect\",\n \"datepicker\",\n \"fieldcustom\",\n \"textbox\",\n \"numberbox\",\n \"selectsingle\",\n \"selectmultiple\",\n \"formtree\",\n \"fieldreadonly\",\n // not allowed Chart's Widgets\n \"pie\",\n \"bar\",\n \"line\",\n \"area\",\n // not allowed Report page\n \"report\",\n \"reportPage\",\n \"reportPanel\",\n ];\n\n var allComponents = this.application.viewAll(); // ABViewManager.allViews();\n var allowedComponents = allComponents.filter((c) => {\n return viewsToIgnore.indexOf(c.common().key) == -1;\n });\n\n return allowedComponents;\n }\n\n changePage(pageId) {\n this.emit(\"changePage\", pageId);\n }\n\n warningsAll() {\n // report both OUR warnings, and any warnings from any of our fields\n var allWarnings = super.warningsAll();\n this.views().forEach((v) => {\n allWarnings = allWarnings.concat(v.warningsAll());\n });\n\n (this.pages?.() || []).forEach((p) => {\n allWarnings = allWarnings.concat(p.warningsAll());\n });\n\n return allWarnings.filter((w) => w);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let allViews = this.views();\n\n (this.__missingViews || []).forEach((id) => {\n this.warningsMessage(`references unknown View[${id}]`);\n });\n\n allViews.forEach((v) => {\n v.warningsEval();\n });\n\n // if a datacollection is specified, verify it can be accessed.\n if (this.settings.dataviewID) {\n let dc = this.datacollections || this.datacollection;\n if (!dc) {\n this.warningsMessage(\n `references unknown dataviewID[${this.settings.dataviewID}]`\n );\n }\n }\n }\n\n warningsMessage(msg, data = {}) {\n let message = `${this.key}[${this.name}]: ${msg}`;\n this._warnings.push({ message, data });\n }\n};\n","const ABViewCSVExporterCore = require(\"../../core/views/ABViewCSVExporterCore\");\nconst ABViewCSVExporterComponent = require(\"./viewComponent/ABViewCSVExporterComponent\");\n\nmodule.exports = class ABViewCSVExporter extends ABViewCSVExporterCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj } UI component\n */\n component() {\n return new ABViewCSVExporterComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n }\n};\n","const ABViewCSVImporterCore = require(\"../../core/views/ABViewCSVImporterCore\");\nconst ABViewCSVImporterComponent = require(\"./viewComponent/ABViewCSVImporterComponent\");\n\nmodule.exports = class ABViewCSVImporter extends ABViewCSVImporterCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component(idBase) {\n return new ABViewCSVImporterComponent(this, idBase);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n\n if (!this.settings.availableFieldIds?.length) {\n this.warningsMessage(\"has no fields set for matching import data\");\n }\n }\n};\n","const ABViewCarouselCore = require(\"../../core/views/ABViewCarouselCore\");\nimport ABViewCarouselComponent from \"./viewComponent/ABViewCarouselComponent\";\n\n// const ABViewPropertyFilterData = require(\"./viewProperties/ABViewPropertyFilterData\");\n// const ABViewPropertyLinkPage = require(\"./viewProperties/ABViewPropertyLinkPage\");\n\nimport ABViewPropertyFilterData from \"./viewProperties/ABViewPropertyFilterData\";\nimport ABViewPropertyLinkPage from \"./viewProperties/ABViewPropertyLinkPage\";\n\nlet PopupCarouselFilterMenu = null;\n\nexport default class ABViewCarousel extends ABViewCarouselCore {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // filter property\n this.filterHelper.fromSettings(this.settings.filter);\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n var dv = this.datacollection;\n if (dv) {\n this.filterHelper.objectLoad(dv.datasource);\n this.filterHelper.fromSettings(this.settings.filter);\n }\n\n return new ABViewCarouselComponent(this);\n }\n\n get idBase() {\n return `ABViewCarousel_${this.id}`;\n }\n\n get filterHelper() {\n if (this.__filterHelper == null)\n this.__filterHelper = new ABViewPropertyFilterData(\n this.AB,\n this.idBase\n );\n\n return this.__filterHelper;\n }\n\n get linkPageHelper() {\n if (this.__linkPageHelper == null)\n this.__linkPageHelper = new ABViewPropertyLinkPage();\n\n return this.__linkPageHelper;\n }\n\n warningsEval() {\n super.warningsEval();\n\n let field = this.imageField;\n if (!field) {\n this.warningsMessage(\n `can't resolve image field[${this.settings.field}]`\n );\n }\n }\n}\n","const ABViewChartCore = require(\"../../core/views/ABViewChartCore\");\nconst ABViewChartComponent = require(\"./viewComponent/ABViewChartComponent\");\n\nmodule.exports = class ABViewChart extends ABViewChartCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj} App\n * @return {obj} UI component\n */\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewChartComponent(this);\n }\n\n fromValues(values) {\n super.fromValues(values);\n this.refreshData();\n }\n\n getDCChart() {\n if (!this._dcChart) this._dcChart = new webix.DataCollection();\n\n return this._dcChart;\n }\n\n refreshData() {\n const dc = this.datacollection;\n if (dc == null) return this.dcChart;\n\n const labelCol = this.labelField();\n const valueCol = this.valueField();\n const valueCol2 = this.valueField2();\n\n if (!labelCol || !valueCol) return this.dcChart;\n\n // const labelColName = labelCol.columnName;\n const numberColName = valueCol.columnName;\n\n let numberColName2 = \"\";\n\n if (this.settings.multipleSeries && valueCol2) {\n numberColName2 = valueCol2.columnName;\n }\n\n const colorList = [\n \"#ee4339\",\n \"#ee9336\",\n \"#eed236\",\n \"#d3ee36\",\n \"#a7ee70\",\n \"#58dccd\",\n \"#36abee\",\n \"#476cee\",\n \"#a244ea\",\n \"#e33fc7\",\n ];\n\n const dInfo = dc.getData();\n\n let results = [];\n let sumData = {};\n let sumNumber = 0;\n let sumNumber2 = 0;\n let countNumber = dInfo.length;\n\n dInfo.forEach((item) => {\n const labelKey = labelCol.format(item) || item.id;\n\n let numberVal = parseFloat(item[numberColName] || 0);\n let numberVal2 = null;\n\n if (this.settings.multipleSeries)\n numberVal2 = parseFloat(item[numberColName2]) || 0;\n\n switch (valueCol.key) {\n //Formula Datatype\n case \"formula\":\n numberVal = valueCol.format(item);\n\n break;\n\n //Calcualte Datatype\n case \"calculate\":\n numberVal = parseFloat(\n valueCol.constructor.convertToJs(\n valueCol.object,\n valueCol.settings.formula,\n item,\n valueCol.settings.decimalPlaces\n )\n );\n\n break;\n\n default:\n break;\n }\n\n if (sumData[labelKey] == null) {\n let label = labelKey;\n\n // Get label of the connect field\n if (labelCol.isConnection) {\n let relateValues = labelCol.pullRelationValues(item);\n if (relateValues != null) {\n if (Array.isArray(relateValues))\n label = relateValues\n .map((val) => val.text || \"\")\n .join(\", \");\n else label = relateValues.text;\n }\n }\n\n if (this.settings.multipleSeries) {\n sumData[labelKey] = {\n label: label || item.id,\n value: 0,\n value2: 0,\n };\n } else {\n sumData[labelKey] = {\n label: label || item.id,\n value: 0,\n };\n }\n }\n\n sumData[labelKey].value += numberVal;\n sumNumber += numberVal;\n\n if (this.settings.multipleSeries) {\n sumData[labelKey].value2 += numberVal2;\n sumNumber2 += numberVal2;\n }\n });\n\n let index = 0;\n\n for (const key in sumData) {\n let val = sumData[key].value;\n\n if (val <= 0) continue;\n\n // Display to percent values\n if (this.settings.isPercentage) {\n val = (val / sumNumber) * 100;\n val = Math.round(val * 100) / 100; // round decimal 2 digits\n val = val + \" %\";\n }\n\n if (this.settings.multipleSeries) {\n let val2 = sumData[key].value2;\n\n if (val2 <= 0) continue;\n\n // Display to percent values\n if (this.settings.isPercentage) {\n val2 = (val2 / sumNumber2) * 100;\n val2 = Math.round(val2 * 100) / 100; // round decimal 2 digits\n val2 = val2 + \" %\";\n }\n\n results.push({\n label: sumData[key].label,\n value: val,\n value2: val2,\n color: colorList[index % colorList.length],\n count: countNumber,\n });\n } else {\n results.push({\n label: sumData[key].label,\n value: val,\n color: colorList[index % colorList.length],\n count: countNumber,\n });\n }\n\n index += 1;\n }\n\n const dcChart = this.getDCChart();\n\n dcChart.clearAll();\n dcChart.parse(results);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let labelField = this.labelField();\n if (!labelField) {\n this.warningsMessage(\n `can't resolve label field[${this.settings.columnLabel}]`\n );\n }\n\n let valueField = this.valueField();\n if (!valueField) {\n this.warningsMessage(\n `can't resolve value field[${this.settings.columnValue}]`\n );\n }\n }\n};\n","const ABViewChartAreaCore = require(\"../../core/views/ABViewChartAreaCore\");\nconst ABViewChartAreaComponent = require(\"./viewComponent/ABViewChartAreaComponent\");\n\nmodule.exports = class ABViewChartArea extends ABViewChartAreaCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewChartAreaComponent(this);\n }\n};\n","const ABViewChartBarCore = require(\"../../core/views/ABViewChartBarCore\");\nconst ABViewChartBarComponent = require(\"./viewComponent/ABViewChartBarComponent\");\n\nmodule.exports = class ABViewChartBar extends ABViewChartBarCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewChartBarComponent(this);\n }\n};\n","const ABViewWidget = require(\"./ABViewWidget\");\nconst ABViewChartContainerComponent = require(\"./viewComponent/ABViewChartContainerComponent\");\n\nmodule.exports = class ABViewChartContainer extends ABViewWidget {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewChartContainerComponent(this);\n }\n\n get datacollection() {\n return this.parent.datacollection;\n }\n};\n","const ABViewChartLineCore = require(\"../../core/views/ABViewChartLineCore\");\nconst ABViewChartLineComponent = require(\"./viewComponent/ABViewChartLineComponent\");\n\nmodule.exports = class ABViewChartLine extends ABViewChartLineCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewChartLineComponent(this);\n }\n};\n","const ABViewChartPieCore = require(\"../../core/views/ABViewChartPieCore\");\nconst ABViewChartPieComponent = require(\"./viewComponent/ABViewChartPieComponent\");\n\nmodule.exports = class ABViewChartPie extends ABViewChartPieCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewChartPieComponent(this);\n }\n};\n","const ABViewCommentCore = require(\"../../core/views/ABViewCommentCore\");\nconst ABViewCommentComponent = require(\"./viewComponent/ABViewCommentComponent\");\n\nmodule.exports = class ABViewComment extends ABViewCommentCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewCommentComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let field = this.getUserField();\n if (!field) {\n this.warningsMessage(\n `can't resolve user field[${this.settings.columnUser}]`\n );\n }\n\n field = this.getCommentField();\n if (!field) {\n this.warningsMessage(\n `can't resolve comment field[${this.settings.columnComment}]`\n );\n }\n\n field = this.getDateField();\n if (!field) {\n this.warningsMessage(\n `can't resolve date field[${this.settings.columnDate}]`\n );\n }\n }\n};\n","const ABViewConditionalContainerCore = require(\"../../core/views/ABViewConditionalContainerCore\");\nconst ABViewConditionalContainerComponent = require(\"./viewComponent/ABViewConditionalContainerComponent\");\n\nmodule.exports = class ABViewConditionalContainer extends (\n ABViewConditionalContainerCore\n) {\n /**\n * @function component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewConditionalContainerComponent(this);\n }\n\n async save() {\n const viewIf = this.views().find((v) => v.name === \"If\");\n const viewElse = this.views().find((v) => v.name === \"Else\");\n const pendingSave = [];\n\n if (viewIf) pendingSave.push(viewIf.save());\n\n if (viewElse) pendingSave.push(viewElse.save());\n\n await Promise.all(pendingSave);\n\n await super.save();\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n\n if (\n !this.settings.filterConditions ||\n this.settings.filterConditions?.rules?.length == 0\n ) {\n this.warningsMessage(\"has no filter conditions set\");\n }\n }\n};\n","import ABViewConnectDataFilterCore from \"../../core/views/ABViewConnectDataFilterCore\";\nimport ABViewConnectDataFilterComponent from \"./viewComponent/ABViewConnectDataFilterComponent\";\n\nexport default class ABViewConnectDataFilter extends ABViewConnectDataFilterCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewConnectDataFilterComponent(this);\n }\n}\n","const ABViewContainerCore = require(\"../../core/views/ABViewContainerCore\");\nconst ABViewContainerComponent = require(\"./viewComponent/ABViewContainerComponent\");\n\nmodule.exports = class ABViewContainer extends ABViewContainerCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewContainerComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let allViews = this.views();\n\n if (allViews.length == 0) {\n this.warningsMessage(\"has no content\");\n }\n\n // NOTE: this is done in ABView:\n // (allViews || []).forEach((v) => {\n // v.warningsEval();\n // });\n }\n};\n","import ABViewDataFilterCore from \"../../core/views/ABViewDataFilterCore\";\nimport ABViewDataFilterComponent from \"./viewComponent/ABViewDataFilterComponent\";\n\nexport default class ABViewDataFilter extends ABViewDataFilterCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj} App\n * @return {obj} UI component\n */\n component() {\n return new ABViewDataFilterComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n } else {\n if (this.settings.viewType == \"connected\") {\n const object = DC.datasource;\n const [field] = object.fields(\n (f) => f.columnName === this.settings.field\n );\n if (!field) {\n this.warningsMessage(`can't resolve field reference`);\n }\n }\n }\n }\n}\n","import ABViewDataSelectCore from \"../../core/views/ABViewDataSelectCore\";\nimport ABViewDataSelectComponent from \"./viewComponent/ABViewDataSelectComponent\";\n\nexport default class ABViewDataSelect extends ABViewDataSelectCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj} App\n * @return {obj} UI component\n */\n component() {\n return new ABViewDataSelectComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n } else {\n if (this.settings.viewType == \"connected\") {\n const object = DC.datasource;\n const [field] = object.fields(\n (f) => f.columnName === this.settings.field\n );\n if (!field) {\n this.warningsMessage(`can't resolve field reference`);\n }\n }\n }\n }\n}\n","const ABViewDataviewCore = require(\"../../core/views/ABViewDataviewCore\");\nconst ABViewDataviewComponent = require(\"./viewComponent/ABViewDataviewComponent\");\n\nconst ABViewDataviewDefaults = ABViewDataviewCore.defaultValues();\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewDataview extends ABViewDataviewCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.settings.detailsPage =\n this.settings.detailsPage ?? ABViewDataviewDefaults.detailsPage;\n this.settings.editPage =\n this.settings.editPage ?? ABViewDataviewDefaults.editPage;\n this.settings.detailsTab =\n this.settings.detailsTab ?? ABViewDataviewDefaults.detailsTab;\n this.settings.editTab =\n this.settings.editTab ?? ABViewDataviewDefaults.editTab;\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj } v1App\n * @param {string} idPrefix - define to support in 'Datacollection' widget\n *\n * @return {obj } UI component\n */\n component() {\n return new ABViewDataviewComponent(this);\n }\n};\n","const ABViewDetailCore = require(\"../../core/views/ABViewDetailCore\");\nconst ABViewDetailComponent = require(\"./viewComponent/ABViewDetailComponent\");\n\nmodule.exports = class ABViewDetail extends ABViewDetailCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj } v1App\n * @param {string} idPrefix - define to support in 'Datacollection' widget\n *\n * @return {obj } UI component\n */\n component() {\n return new ABViewDetailComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n }\n};\n","const ABViewDetailCheckboxCore = require(\"../../core/views/ABViewDetailCheckboxCore\");\nconst ABViewDetailCheckboxComponent = require(\"./viewComponent/ABViewDetailCheckboxComponent\");\n\nmodule.exports = class ABViewDetailCheckbox extends ABViewDetailCheckboxCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailCheckboxComponent(this);\n }\n};\n","const ABViewDetailConnectCore = require(\"../../core/views/ABViewDetailConnectCore\");\nconst ABViewPropertyAddPage =\n require(\"./viewProperties/ABViewPropertyAddPage\").default;\n\nconst ABViewDetailConnectComponent = require(\"./viewComponent/ABViewDetailConnectComponent\");\n\nmodule.exports = class ABViewDetailConnect extends ABViewDetailConnectCore {\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n this.addPageTool.fromSettings(this.settings);\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailConnectComponent(this);\n }\n\n get addPageTool() {\n if (this.__addPageTool == null)\n this.__addPageTool = new ABViewPropertyAddPage();\n\n return this.__addPageTool;\n }\n};\n","const ABViewDetailCustomCore = require(\"../../core/views/ABViewDetailCustomCore\");\nconst ABViewDetailCustomComponent = require(\"./viewComponent/ABViewDetailCustomComponent\");\n\nmodule.exports = class ABViewDetailCustom extends ABViewDetailCustomCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailCustomComponent(this);\n }\n};\n","const ABViewDetailImageCore = require(\"../../core/views/ABViewDetailImageCore\");\nconst ABViewDetailImageComponent = require(\"./viewComponent/ABViewDetailImageComponent\");\n\nmodule.exports = class ABViewDetailImage extends ABViewDetailImageCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailImageComponent(this);\n }\n};\n","const ABViewDetailItemCore = require(\"../../core/views/ABViewDetailItemCore\");\nconst ABViewDetailItemComponent = require(\"./viewComponent/ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailItem extends ABViewDetailItemCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailItemComponent(this);\n }\n};\n","const ABViewDetailTextCore = require(\"../../core/views/ABViewDetailTextCore\");\nconst ABViewDetailTextComponent = require(\"./viewComponent/ABViewDetailTextComponent\");\n\nmodule.exports = class ABViewDetailText extends ABViewDetailTextCore {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailTextComponent(this);\n }\n};\n","const ABViewDetailTreeCore = require(\"../../core/views/ABViewDetailTreeCore\");\nconst ABViewDetailTreeComponent = require(\"./viewComponent/ABViewDetailTreeComponent\");\n\nmodule.exports = class ABViewDetailTree extends ABViewDetailTreeCore {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDetailTreeComponent(this);\n }\n};\n","const ABViewDocxBuilderCore = require(\"../../core/views/ABViewDocxBuilderCore\");\nconst ABViewDocxBuilderComponent = require(\"./viewComponent/ABViewDocxBuilderComponent\");\n\nmodule.exports = class ABViewDocxBuilder extends ABViewDocxBuilderCore {\n /**\n * @function component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewDocxBuilderComponent(this);\n }\n\n letUserDownload(blob, filename) {\n const url = window.URL.createObjectURL(blob);\n\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a); // we need to append the element to the dom -> otherwise it will not work in firefox\n a.click();\n a.remove(); //afterwards we remove the element again\n\n window.URL.revokeObjectURL(url);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollections || this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n\n if (!this.settings.filename) {\n this.warningsMessage(\"is missing a DOCX template file\");\n } else {\n // TODO: should we check for the existance of the file?\n // this isn't currently an async friendly fn, so how?\n // let url = this.downloadUrl();\n }\n }\n};\n","const ABViewFormCore = require(\"../../core/views/ABViewFormCore\");\nconst ABViewFormComponent = require(\"./viewComponent/ABViewFormComponent\");\nconst ABViewFormButton = require(\"./ABViewFormButton\");\nconst ABViewFormCustom = require(\"./ABViewFormCustom\");\nconst ABViewFormConnect = require(\"./ABViewFormConnect\");\nconst ABViewFormDatepicker = require(\"./ABViewFormDatepicker\");\nconst ABViewFormSelectMultiple = require(\"./ABViewFormSelectMultiple\");\nconst ABViewFormTextbox = require(\"./ABViewFormTextbox\");\nconst ABViewFormJson = require(\"./ABViewFormJson\");\n\nconst L = (...params) => AB.Multilingual.label(...params);\n\n// const ABRecordRule = require(\"../../rules/ABViewRuleListFormRecordRules\");\n// const ABSubmitRule = require(\"../../rules/ABViewRuleListFormSubmitRules\");\n\n// let PopupRecordRule = null;\n// let PopupSubmitRule = null;\n\nconst ABViewFormPropertyComponentDefaults = ABViewFormCore.defaultValues();\n\nmodule.exports = class ABViewForm extends ABViewFormCore {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n\n this._callbacks = {\n onBeforeSaveData: () => true,\n };\n }\n\n superComponent() {\n if (this._superComponent == null)\n this._superComponent = super.component();\n\n return this._superComponent;\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormComponent(this);\n }\n\n refreshDefaultButton(ids) {\n // If default button is not exists, then skip this\n let defaultButton = this.views(\n (v) => v instanceof ABViewFormButton && v.settings.isDefault\n )[0];\n\n // Add a default button\n if (defaultButton == null) {\n defaultButton = ABViewFormButton.newInstance(this.application, this);\n defaultButton.settings.isDefault = true;\n }\n // Remove default button from array, then we will add it to be the last item later (.push)\n else {\n this._views = this.views((v) => v.id != defaultButton.id);\n }\n\n // Calculate position Y of the default button\n let yList = this.views().map((v) => (v.position.y || 0) + 1);\n yList.push(this._views.length || 0);\n yList.push($$(ids.fields).length || 0);\n let posY = Math.max(...yList);\n\n // Update to be the last item\n defaultButton.position.y = posY;\n\n // Keep the default button is always the last item of array\n this._views.push(defaultButton);\n\n return defaultButton;\n }\n\n /**\n * @method getFormValues\n *\n * @param {webix form} formView\n * @param {ABObject} obj\n * @param {ABDatacollection} dc\n * @param {ABDatacollection} dcLink [optional]\n */\n getFormValues(formView, obj, dc, dcLink) {\n // get the fields that are on this form\n const visibleFields = [\"id\"]; // we always want the id so we can udpate records\n formView.getValues(function (obj) {\n visibleFields.push(obj.config.name);\n });\n\n // only get data passed from form\n const allVals = formView.getValues();\n const formVals = {};\n visibleFields.forEach((val) => {\n formVals[val] = allVals[val];\n });\n\n // get custom values\n this.fieldComponents(\n (comp) =>\n comp instanceof ABViewFormCustom ||\n comp instanceof ABViewFormConnect ||\n comp instanceof ABViewFormDatepicker ||\n comp instanceof ABViewFormSelectMultiple ||\n (comp instanceof ABViewFormJson && comp.settings.type == \"filter\")\n ).forEach((f) => {\n const vComponent = this.viewComponents[f.id];\n if (vComponent == null) return;\n\n const field = f.field();\n if (field) {\n const getValue = vComponent.getValue ?? vComponent.logic.getValue;\n if (getValue)\n formVals[field.columnName] = getValue.call(vComponent, formVals);\n }\n });\n\n // remove connected fields if they were not on the form and they are present in the formVals because it is a datacollection\n obj.connectFields().forEach((f) => {\n if (\n visibleFields.indexOf(f.columnName) == -1 &&\n formVals[f.columnName]\n ) {\n delete formVals[f.columnName];\n delete formVals[f.relationName()];\n }\n });\n\n // clear undefined values or empty arrays\n for (const prop in formVals) {\n if (formVals[prop] == null || formVals[prop].length == 0)\n formVals[prop] = \"\";\n }\n\n // Add parent's data collection cursor when a connect field does not show\n let linkValues;\n\n if (dcLink) {\n linkValues = dcLink.getCursor();\n }\n\n if (linkValues) {\n const objectLink = dcLink.datasource;\n\n const connectFields = obj.connectFields();\n connectFields.forEach((f) => {\n const formFieldCom = this.fieldComponents(\n (fComp) => fComp?.field?.()?.id === f?.id\n );\n\n if (\n objectLink.id == f.settings.linkObject &&\n formFieldCom.length < 1 && // check field does not show\n formVals[f.columnName] === undefined\n ) {\n const linkColName = f.indexField\n ? f.indexField.columnName\n : objectLink.PK();\n\n formVals[f.columnName] = {};\n formVals[f.columnName][linkColName] =\n linkValues[linkColName] ?? linkValues.id;\n }\n });\n }\n\n // NOTE: need to pull data of current cursor to calculate Calculate & Formula fields\n // .formVals variable does not include data that does not display in the Form widget\n const cursorFormVals = Object.assign(dc.getCursor() ?? {}, formVals);\n\n // Set value of calculate or formula fields to use in record rule\n obj.fields((f) => f.key == \"calculate\" || f.key == \"formula\").forEach(\n (f) => {\n if (formVals[f.columnName] == null) {\n let reCalculate = true;\n\n // WORKAROUND: If \"Formula\" field will have Filter conditions,\n // Then it is not able to re-calculate on client side\n // because relational data is not full data so FilterComplex will not have data to check\n if (f.key == \"formula\" && f.settings?.where?.rules?.length > 0) {\n reCalculate = false;\n }\n\n formVals[f.columnName] = f.format(cursorFormVals, reCalculate);\n }\n }\n );\n\n if (allVals.translations?.length > 0)\n formVals.translations = allVals.translations;\n\n // give the Object a final chance to review the data being handled.\n obj.formCleanValues(formVals);\n\n return formVals;\n }\n\n /**\n * @method validateData\n *\n * @param {webix form} formView\n * @param {ABObject} object\n * @param {object} formVals\n *\n * @return {boolean} isValid\n */\n validateData($formView, object, formVals) {\n let list = \"\";\n\n // validate required fields\n const requiredFields = this.fieldComponents(\n (fComp) =>\n fComp?.field?.().settings?.required == true ||\n fComp?.settings?.required == true\n ).map((fComp) => fComp.field());\n\n // validate data\n const validator = object.isValidData(formVals);\n let isValid = validator.pass();\n\n // $$($formView).validate();\n $formView.validate();\n /**\n * helper function to fix the webix ui after adding an validation error\n * message.\n * @param {string} col - field.columnName\n */\n const fixInvalidMessageUI = (col) => {\n const $forminput = $formView.elements[col];\n if (!$forminput) return;\n // Y position\n const height = $forminput.$height;\n if (height < 56) {\n $forminput.define(\"height\", 60);\n $forminput.resize();\n }\n\n // X position\n const domInvalidMessage = $forminput.$view.getElementsByClassName(\n \"webix_inp_bottom_label\"\n )[0];\n if (!domInvalidMessage?.style[\"margin-left\"]) {\n domInvalidMessage.style.marginLeft = `${\n this.settings.labelWidth ??\n ABViewFormPropertyComponentDefaults.labelWidth\n }px`;\n }\n };\n\n // Display required messages\n requiredFields.forEach((f) => {\n if (!f) return;\n\n const fieldVal = formVals[f.columnName];\n if (fieldVal == \"\" || fieldVal == null || fieldVal.length < 1) {\n $formView.markInvalid(f.columnName, L(\"This is a required field.\"));\n list += `
  • ${L(\"Missing Required Field\")} ${f.columnName}
  • `;\n isValid = false;\n\n // Fix position of invalid message\n fixInvalidMessageUI(f.columnName);\n }\n });\n\n // if data is invalid\n if (!isValid) {\n const saveButton = $formView.queryView({\n view: \"button\",\n type: \"form\",\n });\n\n // error message\n if (validator?.errors?.length) {\n validator.errors.forEach((err) => {\n $formView.markInvalid(err.name, err.message);\n list += `
  • ${err.name}: ${err.message}
  • `;\n fixInvalidMessageUI(err.name);\n });\n\n saveButton?.disable();\n } else {\n saveButton?.enable();\n }\n }\n if (list) {\n webix.alert({\n type: \"alert-error\",\n title: L(\"Problems Saving\"),\n width: 400,\n text: `
      ${list}
    `,\n });\n }\n\n return isValid;\n }\n\n /**\n * @method recordRulesReady()\n * This returns a Promise that gets resolved when all record rules report\n * that they are ready.\n * @return {Promise}\n */\n async recordRulesReady() {\n return this.RecordRule.rulesReady();\n }\n\n /**\n * @method saveData\n * save data in to database\n * @param $formView - webix's form element\n *\n * @return {Promise}\n */\n async saveData($formView) {\n // call .onBeforeSaveData event\n // if this function returns false, then it will not go on.\n if (!this._callbacks?.onBeforeSaveData?.()) return;\n\n $formView.clearValidation();\n\n // get ABDatacollection\n const dv = this.datacollection;\n if (dv == null) return;\n\n // get ABObject\n const obj = dv.datasource;\n if (obj == null) return;\n\n // show progress icon\n $formView.showProgress?.({ type: \"icon\" });\n\n // get update data\n const formVals = this.getFormValues(\n $formView,\n obj,\n dv,\n dv.datacollectionLink\n );\n\n // form ready function\n const formReady = (newFormVals) => {\n // clear cursor after saving.\n if (dv) {\n if (this.settings.clearOnSave) {\n dv.setCursor(null);\n $formView.clear();\n } else {\n if (newFormVals && newFormVals.id) dv.setCursor(newFormVals.id);\n }\n }\n\n $formView.hideProgress?.();\n\n // if there was saved data pass it up to the onSaveData callback\n // if (newFormVals) this._logic.callbacks.onSaveData(newFormVals);\n if (newFormVals) this.emit(\"saved\", newFormVals); // Q? is this the right upgrade?\n };\n\n const formError = (err) => {\n const $saveButton = $formView.queryView({\n view: \"button\",\n type: \"form\",\n });\n\n // mark error\n if (err) {\n if (err.invalidAttributes) {\n for (const attr in err.invalidAttributes) {\n let invalidAttrs = err.invalidAttributes[attr];\n if (invalidAttrs && invalidAttrs[0])\n invalidAttrs = invalidAttrs[0];\n\n $formView.markInvalid(attr, invalidAttrs.message);\n }\n } else if (err.sqlMessage) {\n webix.message({\n text: err.sqlMessage,\n type: \"error\",\n });\n } else {\n webix.message({\n text: L(\"System could not save your data\"),\n type: \"error\",\n });\n this.AB.notify.developer(err, {\n message: \"Could not save your data\",\n view: this.toObj(),\n });\n }\n }\n\n $saveButton?.enable();\n\n $formView?.hideProgress?.();\n };\n\n // Load data of DCs that use in record rules\n await this.loadDcDataOfRecordRules();\n\n // wait for our Record Rules to be ready before we continue.\n await this.recordRulesReady();\n\n // update value from the record rule (pre-update)\n this.doRecordRulesPre(formVals);\n\n // validate data\n if (!this.validateData($formView, obj, formVals)) {\n // console.warn(\"Data is invalid.\");\n $formView.hideProgress?.();\n return;\n }\n let newFormVals;\n try {\n newFormVals = await this.submitValues(formVals);\n } catch (err) {\n formError(err.data);\n return;\n }\n // {obj}\n // The fully populated values returned back from service call\n // We use this in our post processing Rules\n\n /*\n // OLD CODE:\n try {\n await this.doRecordRules(newFormVals);\n // make sure any updates from RecordRules get passed along here.\n this.doSubmitRules(newFormVals);\n formReady(newFormVals);\n return newFormVals;\n } catch (err) {\n this.AB.notify.developer(err, {\n message: \"Error processing Record Rules.\",\n view: this.toObj(),\n newFormVals: newFormVals,\n });\n // Question: how do we respond to an error?\n // ?? just keep going ??\n this.doSubmitRules(newFormVals);\n formReady(newFormVals);\n return;\n }\n */\n\n try {\n await this.doRecordRules(newFormVals);\n } catch (err) {\n this.AB.notify.developer(err, {\n message: \"Error processing Record Rules.\",\n view: this.toObj(),\n newFormVals: newFormVals,\n });\n }\n\n // make sure any updates from RecordRules get passed along here.\n try {\n this.doSubmitRules(newFormVals);\n } catch (errs) {\n this.AB.notify.developer(errs, {\n message: \"Error processing Submit Rules.\",\n view: this.toObj(),\n newFormVals: newFormVals,\n });\n }\n\n formReady(newFormVals);\n return newFormVals;\n }\n\n focusOnFirst() {\n let topPosition = 0;\n let topPositionId = \"\";\n this.views().forEach((item) => {\n if (item.key == \"textbox\" || item.key == \"numberbox\") {\n if (item.position.y == topPosition) {\n // topPosition = item.position.y;\n topPositionId = item.id;\n }\n }\n });\n let childComponent = this.viewComponents[topPositionId];\n if (childComponent && $$(childComponent.ui.id)) {\n $$(childComponent.ui.id).focus();\n }\n }\n\n async loadDcDataOfRecordRules() {\n const tasks = [];\n\n (this.settings?.recordRules ?? []).forEach((rule) => {\n (rule?.actionSettings?.valueRules?.fieldOperations ?? []).forEach(\n (op) => {\n if (op.valueType !== \"exist\") return;\n\n const pullDataDC = this.AB.datacollectionByID(op.value);\n\n if (\n pullDataDC?.dataStatus ===\n pullDataDC.dataStatusFlag.notInitial\n )\n tasks.push(pullDataDC.loadData());\n }\n );\n });\n\n await Promise.all(tasks);\n\n return true;\n }\n\n get viewComponents() {\n const superComponent = this.superComponent();\n return superComponent.viewComponents;\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n\n if (this.settings.recordRules) {\n // TODO: scan recordRules for warnings\n }\n\n if (this.settings.submitRules) {\n // TODO: scan submitRules for warnings.\n }\n }\n\n async submitValues(formVals) {\n // get ABModel\n const model = this.datacollection.model;\n if (model == null) return;\n\n // is this an update or create?\n if (formVals.id) {\n return await model.update(formVals.id, formVals);\n } else {\n return await model.create(formVals);\n }\n }\n\n /**\n * @method deleteData\n * delete data in to database\n * @param $formView - webix's form element\n *\n * @return {Promise}\n */\n async deleteData($formView) {\n // get ABDatacollection\n const dc = this.datacollection;\n if (dc == null) return;\n\n // get ABObject\n const obj = dc.datasource;\n if (obj == null) return;\n\n // get ABModel\n const model = dc.model;\n if (model == null) return;\n\n // get update data\n const formVals = $formView.getValues();\n\n if (formVals?.id) {\n const result = await model.delete(formVals.id);\n\n // clear form\n if (result) {\n dc.setCursor(null);\n $formView.clear();\n }\n\n return result;\n }\n }\n};\n","const ABViewFormButtonCore = require(\"../../core/views/ABViewFormButtonCore\");\nconst ABViewFormButtonComponent = require(\"./viewComponent/ABViewFormButtonComponent\");\n\nmodule.exports = class ABViewFormButton extends ABViewFormButtonCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormButtonComponent(this);\n }\n};\n","const ABViewFormCheckboxCore = require(\"../../core/views/ABViewFormCheckboxCore\");\nconst ABViewFormCheckboxComponent = require(\"./viewComponent/ABViewFormCheckboxComponent\");\n\nmodule.exports = class ABViewFormCheckbox extends ABViewFormCheckboxCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormCheckboxComponent(this);\n }\n};\n","const ABViewFormConnectCore = require(\"../../core/views/ABViewFormConnectCore\");\nconst ABViewFormConnectComponent = require(\"./viewComponent/ABViewFormConnectComponent\");\nconst ABViewPropertyAddPage =\n require(\"./viewProperties/ABViewPropertyAddPage\").default;\nconst ABViewPropertyEditPage =\n require(\"./viewProperties/ABViewPropertyEditPage\").default;\n\nconst ABViewFormConnectPropertyComponentDefaults =\n ABViewFormConnectCore.defaultValues();\n\nmodule.exports = class ABViewFormConnect extends ABViewFormConnectCore {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABView} parent the ABView this view is a child of. (can be null)\n */\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n\n // Set filter value\n this.__filterComponent = this.AB.filterComplexNew(\n `${this.id}__filterComponent`\n );\n // this.__filterComponent.applicationLoad(application);\n this.__filterComponent.fieldsLoad(\n this.datasource ? this.datasource.fields() : [],\n this.datasource ? this.datasource : null\n );\n\n // NOTE: .objectWorkspace is a v1 setting\n // if (\n // !this.settings.objectWorkspace ||\n // !this.settings.objectWorkspace.filterConditions\n // ) {\n // this.AB.error(\"Error: filter conditions do not exist\", {\n // error: \"filterConditions do not exist\",\n // viewLocation: {\n // application: this.application.name,\n // id: this.id,\n // name: this.label,\n // },\n // view: this,\n // });\n // // manually place an empty filter\n // this.settings[\"objectWorkspace\"] = {};\n // this.settings[\"objectWorkspace\"][\"filterConditions\"] = { glue: \"and\" };\n // }\n\n this.__filterComponent.setValue(\n this.settings.filterConditions ??\n ABViewFormConnectPropertyComponentDefaults.filterConditions\n );\n }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n this.addPageTool.fromSettings(this.settings);\n this.editPageTool.fromSettings(this.settings);\n }\n\n static get addPageProperty() {\n return ABViewPropertyAddPage.propertyComponent(this.App, this.idBase);\n }\n\n static get editPageProperty() {\n return ABViewPropertyEditPage.propertyComponent(this.App, this.idBase);\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormConnectComponent(this);\n }\n\n get addPageTool() {\n if (this.__addPageTool == null)\n this.__addPageTool = new ABViewPropertyAddPage();\n\n return this.__addPageTool;\n }\n\n get editPageTool() {\n if (this.__editPageTool == null)\n this.__editPageTool = new ABViewPropertyEditPage();\n\n return this.__editPageTool;\n }\n};\n","const ABViewFormCustomCore = require(\"../../core/views/ABViewFormCustomCore\");\nconst ABViewFormCustomComponent = require(\"./viewComponent/ABViewFormCustomComponent\");\n\nmodule.exports = class ABViewFormCustom extends ABViewFormCustomCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormCustomComponent(this);\n }\n};\n","const ABViewFormDatepickerCore = require(\"../../core/views/ABViewFormDatepickerCore\");\nconst ABViewFormDatepickerComponent = require(\"./viewComponent/ABViewFormDatepickerComponent\");\n\nmodule.exports = class ABViewFormDatepicker extends ABViewFormDatepickerCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormDatepickerComponent(this);\n }\n};\n","const ABViewFormItemCore = require(\"../../core/views/ABViewFormItemCore\");\nconst ABViewFormItemComponent = require(\"./viewComponent/ABViewFormItemComponent\");\n\nconst ABViewFormFieldPropertyComponentDefaults =\n ABViewFormItemCore.defaultValues();\n\nmodule.exports = class ABViewFormItem extends ABViewFormItemCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n static get componentUI() {\n return ABViewFormItemComponent;\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormItemComponent(this);\n }\n\n /**\n * @method parentFormUniqueID\n * return a unique ID based upon the closest form object this component is on.\n * @param {string} key The basic id string we will try to make unique\n * @return {string}\n */\n parentFormUniqueID(key) {\n var form = this.parentFormComponent();\n var uniqueInstanceID;\n if (form) {\n uniqueInstanceID = form.uniqueInstanceID;\n } else {\n uniqueInstanceID = webix.uid();\n }\n\n return key + uniqueInstanceID;\n }\n};\n","const ABViewFormJsonCore = require(\"../../core/views/ABViewFormJsonCore\");\nconst ABViewFormJsonComponent = require(\"./viewComponent/ABViewFormJsonComponent\");\n\nmodule.exports = class ABViewFormJson extends ABViewFormJsonCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormJsonComponent(this);\n }\n};\n","const ABViewFormNumberCore = require(\"../../core/views/ABViewFormNumberCore\");\nconst ABViewFormNumberComponent = require(\"./viewComponent/ABViewFormNumberComponent\");\n\nmodule.exports = class ABViewFormNumber extends ABViewFormNumberCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormNumberComponent(this);\n }\n};\n","const ABViewFormReadonlyCore = require(\"../../core/views/ABViewFormReadonlyCore\");\nconst ABViewFormReadonlyComponent = require(\"./viewComponent/ABViewFormReadonlyComponent\");\n\nmodule.exports = class ABViewFormReadonly extends ABViewFormReadonlyCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormReadonlyComponent(this);\n }\n};\n","const ABViewFormSelectMultipleCore = require(\"../../core/views/ABViewFormSelectMultipleCore\");\nconst ABViewFormSelectMultipleComponent = require(\"./viewComponent/ABViewFormSelectMultipleComponent\");\n\nmodule.exports = class ABViewFormSelectMultiple extends (\n ABViewFormSelectMultipleCore\n) {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormSelectMultipleComponent(this);\n }\n};\n","const ABViewFormSelectSingleCore = require(\"../../core/views/ABViewFormSelectSingleCore\");\nconst ABViewFormSelectSingleComponent = require(\"./viewComponent/ABViewFormSelectSingleComponent\");\n\nmodule.exports = class ABViewFormSelectSingle extends (\n ABViewFormSelectSingleCore\n) {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormSelectSingleComponent(this);\n }\n};\n","const ABViewFormTextboxCore = require(\"../../core/views/ABViewFormTextboxCore\");\nconst ABViewFormTextboxComponent = require(\"./viewComponent/ABViewFormTextboxComponent\");\n\nmodule.exports = class ABViewFormTextbox extends ABViewFormTextboxCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormTextboxComponent(this);\n }\n};\n","const ABViewFormTreeCore = require(\"../../core/views/ABViewFormTreeCore\");\nconst ABViewFormTreeComponent = require(\"./viewComponent/ABViewFormTreeComponent\");\n\nmodule.exports = class ABViewFormTree extends ABViewFormTreeCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj} App\n * @return {obj} UI component\n */\n component() {\n return new ABViewFormTreeComponent(this);\n }\n};\n","const ABViewForm = require(\"./ABViewForm\");\n\nconst ABViewFormURLDefaults = {\n key: \"form-url\", // unique key identifier for this ABViewForm\n icon: \"list-alt\", // icon reference: (without 'fa-' )\n labelKey: \"FormUrl\", // {string} the multilingual label key for the class label\n};\n\nmodule.exports = class ABViewFormURL extends ABViewForm {\n static common() {\n return ABViewFormURLDefaults;\n }\n\n async submitValues(formVals) {\n let url = this.settings.url;\n let method = this.settings.method || \"get\";\n method = method.toLowerCase();\n if (![\"get\", \"post\", \"put\", \"delete\"].includes(method)) {\n throw new Error(\n `Invalid method \"${method}\" specified for ABViewFormURL`\n );\n }\n\n // remove empty id from formVals\n if (formVals.id === \"\") {\n delete formVals.id;\n }\n\n let params = {\n data: formVals,\n url,\n };\n\n if (this.settings.headers) {\n params.headers = this.settings.headers;\n }\n\n return await this.AB.Network[method](params);\n }\n};\n","import ABViewGanttComponent from \"./viewComponent/ABViewGanttComponent\";\n\nconst ABViewGanttCore = require(\"../../core/views/ABViewGanttCore\");\n\nexport default class ABViewGantt extends ABViewGanttCore {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewGanttComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n } else {\n if (!this.settings.startDateFieldID) {\n this.warningsMessage(`doesn't have a start date field set.`);\n } else {\n let field = DC.datasource?.fieldByID(\n this.settings.startDateFieldID\n );\n if (!field) {\n this.warningsMessage(\n `can't lookup field: startDate[${this.settings.startDateFieldID}]`\n );\n }\n }\n }\n }\n}\n","const ABViewGridCore = require(\"../../core/views/ABViewGridCore\");\nimport ABViewGridComponent from \"./viewComponent/ABViewGridComponent\";\nimport ABViewGridFilter from \"./viewProperties/ABViewPropertyFilterData\";\nconst ABViewPropertyLinkPage =\n require(\"./viewProperties/ABViewPropertyLinkPage\").default;\n\nexport default class ABViewGrid extends ABViewGridCore {\n /**\n * @param {obj} values key=>value hash of ABView values\n * @param {ABApplication} application the application object this view is under\n * @param {ABViewWidget} parent the ABViewWidget this view is a child of. (can be null)\n */\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n ///\n /// Instance Methods\n ///\n\n /**\n * @method fromValues()\n *\n * initialze this object with the given set of values.\n * @param {obj} values\n */\n fromValues(values) {\n super.fromValues(values);\n\n // filter property\n this.filterHelper.fromSettings(this.settings.gridFilter);\n }\n\n propertyGroupByList(ids, groupBy) {\n let colNames = groupBy || [];\n if (typeof colNames == \"string\") {\n colNames = colNames.split(\",\");\n }\n\n let options = $$(ids.groupBy).getList().data.find({});\n\n $$(ids.groupByList).clearAll();\n colNames.forEach((colName) => {\n let opt = options.filter((o) => o.id == colName)[0];\n if (opt) {\n $$(ids.groupByList).add(opt);\n }\n });\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewGridComponent(this);\n }\n\n get filterHelper() {\n if (this.__filterHelper == null) {\n this.__filterHelper = new ABViewGridFilter(\n this.AB,\n `${this.id}_filterHelper`\n );\n }\n\n return this.__filterHelper;\n }\n\n get linkPageHelper() {\n if (this.__linkPageHelper == null)\n this.__linkPageHelper = new ABViewPropertyLinkPage();\n\n return this.__linkPageHelper;\n }\n\n warningsEval() {\n super.warningsEval();\n let origWS = this.warningsSilent;\n this.warningsSilent = true;\n let DC = this.datacollection;\n this.warningsSilent = origWS;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n }\n}\n","/*\n * ABViewGridPopupExport.js\n * Manage the Popup that allows you to export data into one of our supported\n * formats.\n */\n\nimport ClassUI from \"../../../ui/ClassUI\";\n\nexport default class ABWorkObjectPopupExport extends ClassUI {\n constructor(idBase) {\n idBase = idBase || \"abviewgridpopupExport\";\n\n super({\n popupExport: `${idBase}_popupExport`,\n list: `${idBase}_popupExport_list`,\n });\n\n this._currentObject = null;\n // {ABObject}\n // The ABObject of the data we will export. We can find out the fields\n // from the object.\n\n this._dataCollection = null;\n // {ABDatacCollection}\n // The ABDataCollection that contains the data we are going to export.\n\n this._grid = null;\n // {webix.grid}\n // the current webix.grid that contains the data we are going to export.\n\n this._filename = null;\n // {string}\n // the name of the desired output file.\n\n this._hiddenFields = [];\n // {array}\n // An array of ABField.columnName(s) that we are not wanting to export\n }\n\n ui() {\n var self = this;\n\n // webix UI definition:\n return {\n view: \"popup\",\n id: this.ids.popupExport,\n width: 160,\n height: 0, //150,\n select: false,\n hidden: true,\n body: {\n id: this.ids.list,\n view: \"list\",\n autoheight: true,\n data: [\n { name: \"CSV\", icon: \"file-excel-o\" },\n { name: \"Excel\", icon: \"file-excel-o\" },\n { name: \"PDF\", icon: \"file-pdf-o\" },\n { name: \"PNG\", icon: \"file-image-o\" },\n ],\n template:\n \"
    #name#
    \",\n on: {\n onItemClick: function (id /*, e, node */) {\n var component = this.getItem(id);\n self.export(component.name);\n },\n },\n },\n };\n }\n\n async init(AB) {\n if (AB) {\n this.AB = AB;\n }\n webix.ui(this.ui());\n $$(this.ids.popupExport).resize();\n }\n\n // internal business logic\n\n /**\n * @method dataCollectionLoad()\n * the current ABDataCollection we are working with.\n * @param {ABDataCollection} dc\n */\n dataCollectionLoad(dc) {\n this._dataCollection = dc;\n }\n\n /**\n * @method objectLoad()\n * The current ABObject we are working with.\n * @param {ABObject} object\n */\n objectLoad(object) {\n this._currentObject = object;\n }\n\n /**\n * @method setHiddenFields\n * Register Fields we don't want exported in our data.\n * @param {array} fields\n * An array of ABField.columnName(s) to exclude from our export.\n */\n setHiddenFields(fields = []) {\n this._hiddenFields = fields ?? [];\n }\n\n /**\n * @method setFilename()\n * Register the name of the file we want our data to export as.\n * @param {string} filename\n */\n setFilename(filename) {\n this._filename = filename;\n }\n\n /**\n * @method setGridComponent()\n * Register the webix.grid that currently stores the data we are\n * exporting.\n * @param {webix.grid} $grid\n */\n setGridComponent($grid) {\n this._grid = $grid;\n }\n\n /**\n * @function show()\n * Show this component.\n * @param {obj} $view\n * the webix.$view to hover the popup around.\n */\n show($view) {\n $$(this.ids.popupExport).show($view);\n }\n\n async export(name) {\n let fnExport;\n\n let columns = {};\n\n let dc = this._dataCollection;\n let _currentObject = this._currentObject;\n let _grid = this._grid;\n let _filename = this._filename;\n\n if (\n dc &&\n (!dc.settings.loadAll || dc.dataStatus == dc.dataStatusFlag.notInitial)\n ) {\n // Load all data\n await dc.reloadData(0, null);\n dc.settings.loadAll = true;\n }\n\n // client filter data\n // template of report\n if (_currentObject) {\n _currentObject.fields().forEach((f) => {\n // hidden fields\n if (this._hiddenFields.indexOf(f.columnName) > -1) return;\n\n columns[f.columnName] = {\n template: (rowData) => {\n return f.format(rowData);\n },\n };\n });\n }\n\n // If there are checked items, then export them only\n // Otherwise export all items\n const noCheckedRow =\n _grid.data.find({ appbuilder_select_item: 1 }).length < 1;\n const filterRow = (row) =>\n noCheckedRow || row?.appbuilder_select_item == 1;\n\n switch (name) {\n case \"CSV\":\n webix.csv.delimiter.cols = \",\";\n\n fnExport = webix.toCSV(_grid, {\n filename:\n _filename || (_currentObject ? _currentObject.label : null),\n columns: columns,\n filter: filterRow,\n });\n break;\n case \"Excel\":\n fnExport = webix.toExcel(_grid, {\n filename:\n _filename || (_currentObject ? _currentObject.label : null),\n name:\n _filename || (_currentObject ? _currentObject.label : null),\n columns: columns,\n filterHTML: true,\n filter: filterRow,\n });\n break;\n case \"PDF\":\n fnExport = webix.toPDF(_grid, {\n filename:\n _filename || (_currentObject ? _currentObject.label : null),\n filterHTML: true,\n filter: filterRow,\n });\n break;\n case \"PNG\":\n fnExport = webix.toPNG(_grid, {\n filename:\n _filename || (_currentObject ? _currentObject.label : null),\n // filter: NOT SUPPORT\n });\n break;\n }\n\n try {\n await fnExport;\n $$(this.ids.popupExport).hide();\n } catch (err) {\n this.AB.notify.developer(err, {\n message: `ABViewGridPopupExport:export(): System could not export: ${name}`,\n exportType: name,\n columns,\n fileName: _filename,\n });\n }\n }\n\n // this.dataCollectionLoad = _logic.dataCollectionLoad;\n // this.objectLoad = _logic.objectLoad;\n // this.setGridComponent = _logic.setGridComponent;\n // this.setFilename = _logic.setFilename;\n // this.setHiddenFields = _logic.setHiddenFields;\n // this.show = _logic.show;\n}\n","/*\n * ABViewGridPopupMassUpdate\n *\n * An ABViewGrid can offer a mass update feature. This is a ui component\n * to help with the processing of the update.\n *\n */\n\nimport ClassUI from \"../../../ui/ClassUI\";\nimport RowUpdater from \"../RowUpdater\";\n\nvar L = null;\n\nexport default class ABViewGridPopupMassUpdate extends ClassUI {\n //.extend(idBase, function(App) {\n\n constructor(ABViewGridComponent, idBase) {\n idBase = idBase || \"abviewgridpopupMassUpdate\";\n\n super({\n component: `${idBase}_popupMassUpdate`,\n submit: `${idBase}_submitMassUpdate`,\n });\n\n this.CurrentObject = null;\n // {ABObject}\n // Which ABObject are we currently working with.\n\n this.GridComponent = ABViewGridComponent;\n // {ABViewGridComponent}\n // The current ABViewGridComponent we are working with.\n\n this.AB = ABViewGridComponent.AB;\n // {ABFactory}\n\n this.rowUpdater = new RowUpdater(idBase, this.AB);\n // {RowUpdater}\n // An instance of our RowUpdater form builder.\n\n if (!L) {\n L = (...params) => {\n return this.AB.Multilingual.label(...params);\n };\n }\n }\n\n ui() {\n var ids = this.ids;\n\n // Our webix UI definition:\n return {\n view: \"popup\",\n id: ids.component,\n // modal: true,\n body: {\n width: 500,\n rows: [\n // Update panel\n this.rowUpdater.ui(),\n { height: 15 },\n {\n cols: [\n {},\n {\n view: \"button\",\n value: L(\"Cancel\"),\n width: 100,\n click: () => {\n this.hide();\n },\n },\n {\n id: ids.submit,\n css: \"webix_primary\",\n view: \"button\",\n label: L(\"Update\"),\n type: \"form\",\n width: 120,\n click: () => {\n this.submit();\n },\n },\n ],\n },\n ],\n },\n on: {\n onShow: () => {\n this.onShow();\n },\n },\n };\n }\n\n async init(AB) {\n webix.ui(this.ui());\n this.rowUpdater.init(AB);\n\n return Promise.resolve();\n }\n\n /**\n * @method hide()\n * Hide the popup.\n */\n hide() {\n $$(this.ids.component).hide();\n }\n\n /**\n * @function objectLoad\n * Ready the Popup according to the current object & datatable\n * @param {ABObject} object\n * the currently selected object.\n * @param {webix.datatable} dataTable\n * the dataTable we need to run the mass update on...trust me this\n * will be good\n */\n objectLoad(object, dataTable) {\n this.CurrentObject = object;\n this.rowUpdater.objectLoad(object);\n this.DataTable = dataTable;\n }\n\n onShow() {}\n\n /**\n * @method show()\n * Show this component.\n * @param {obj} $view\n * the webix.$view to hover the popup around.\n * @param {json} options\n * Additional webix options related to the .show() method.\n */\n show($view, options = null) {\n if (options != null) {\n $$(this.ids.component).show($view, options);\n } else {\n $$(this.ids.component).show($view);\n }\n }\n\n /**\n * @method submit()\n * Process the submit action by getting the values to change and then\n * running a batchUpdate() on the items in our datatable that were selected.\n */\n submit() {\n // Update values to records\n let update_button = $$(this.ids.submit),\n update_items = this.rowUpdater.getValue() || [];\n\n update_button.disable();\n\n if (!this.GridComponent) {\n // TODO : Message\n // console.log(\"no data collection to update\");\n update_button.enable();\n return;\n } else if (update_items.length < 1) {\n // TODO : Message\n update_button.enable();\n return;\n }\n\n let $datatable = this.GridComponent.getDataTable(); // $$(DataTable.ui.id);\n let updatedRowIds = [];\n $datatable.data.each(function (row) {\n if (\n row &&\n Object.prototype.hasOwnProperty.call(\n row,\n \"appbuilder_select_item\"\n ) &&\n row.appbuilder_select_item == 1\n ) {\n updatedRowIds.push(row.id);\n }\n });\n\n let vals = {};\n update_items.forEach((item) => {\n let fieldInfo = this.CurrentObject.fieldByID(item.fieldId);\n if (!fieldInfo) return;\n\n vals[fieldInfo.columnName] = item.value;\n });\n\n if (updatedRowIds.length > 0) {\n webix.confirm({\n title: L(\"Updating Multiple Records\"),\n text: L(\"Are you sure you want to update the selected records?\"),\n callback: (result) => {\n if (result) {\n if ($datatable && $datatable.showProgress)\n $datatable.showProgress({ type: \"icon\" });\n\n let objModel = this.CurrentObject.model();\n objModel\n .batchUpdate({\n rowIds: updatedRowIds,\n values: vals,\n })\n .then(() => {\n // Update webix.datatable\n (updatedRowIds ?? []).forEach((rowId) => {\n $datatable.updateItem(rowId, vals);\n });\n\n // Anything we need to do after we are done.\n update_button.enable();\n this.hide();\n\n if ($datatable && $datatable.hideProgress)\n $datatable.hideProgress();\n })\n .catch((err) => {\n this.AB.notify.developer(err, {\n context:\n \"ABViewGridPopupMassUpdate:submit(): Error during batchUpdate\",\n rowIds: updatedRowIds,\n values: vals,\n });\n });\n } else {\n update_button.enable();\n }\n },\n });\n } else {\n webix.alert({\n title: L(\"No Records Selected\"),\n text: L(\n \"You need to select at least one record...did you drink your coffee today?\"\n ),\n });\n update_button.enable();\n this.hide();\n }\n }\n}\n","/*\n * ABViewGridPopupSortFields\n *\n * Manage the Sort Fields popup.\n *\n */\n\nimport ClassUI from \"../../../ui/ClassUI\";\n\nvar L = null;\n\nexport default class AB_Work_Object_Workspace_PopupSortFields extends ClassUI {\n constructor(idBase) {\n idBase = idBase || \"abviewgridpopupSortFields\";\n\n super({\n component: `${idBase}_popupSort`,\n list: `${idBase}_popupSort_list`,\n form: `${idBase}_popupSort_form`,\n });\n\n this.CurrentObject = null;\n // {ABObject}\n // The current ABObject we are working with.\n\n this._blockOnChange = false;\n // {bool}\n // Should we skip the onChange handler processing at this time?\n\n this._settings = null;\n // {json}\n // default sort settings.\n\n if (!L) {\n L = (...params) => {\n return (this.AB ?? AB).Multilingual.label(...params);\n };\n }\n }\n\n uiForm() {\n const compId = this.ids.component;\n return {\n view: \"form\",\n id: this.ids.form,\n borderless: true,\n elements: [\n {\n view: \"button\",\n type: \"form\",\n css: \"webix_primary\",\n value: L(\"Add new sort\"),\n on: {\n onItemClick: (/* id, e, node */) => {\n this.clickAddNewSort();\n this.triggerOnChange();\n },\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `${compId} add sort button`\n );\n },\n },\n },\n ],\n };\n }\n\n ui() {\n return {\n view: \"popup\",\n id: this.ids.component,\n // autoheight:true,\n width: 600,\n body: this.uiForm(),\n on: {\n onShow: () => {\n this.onShow();\n },\n },\n };\n }\n\n // Our init() function for setting up our UI\n async init(AB) {\n if (AB) {\n this.AB = AB;\n }\n\n (this.AB.Webix ?? webix).ui(this.ui());\n }\n\n /**\n * @function clickAddNewSort\n * When the user clicks the \"Add New Sort\" button, this routine will\n * add another row to the sort form.\n * @param {string} fieldId\n * The ABField.id of the field to auto select in this new row.\n * @param {string} dir\n * The sort order to auto select in this new row.\n */\n // clickAddNewSort: function(by, dir, isMulti, id) {\n clickAddNewSort(fieldId, dir) {\n var self = this;\n var sort_form = $$(this.ids.form);\n\n var viewIndex = sort_form.getChildViews().length - 1;\n var listFields = this.getFieldList(true);\n sort_form.addView(\n {\n id: `sort_${viewIndex + 1}`,\n cols: [\n {\n view: \"combo\",\n width: 220,\n options: listFields,\n on: {\n onChange: function (columnId) {\n var el = this;\n self.onChangeCombo(columnId, el);\n },\n },\n },\n this._valueElement(),\n {\n view: \"button\",\n css: \"webix_danger\",\n icon: \"fa fa-trash\",\n type: \"icon\",\n width: 30,\n on: {\n onItemClick: function () {\n sort_form.removeView(this.getParentView());\n self.refreshFieldList(true);\n self.triggerOnChange();\n },\n },\n },\n ],\n },\n viewIndex\n );\n\n // Select field\n if (fieldId) {\n var fieldsCombo = sort_form\n .getChildViews()\n [viewIndex].getChildViews()[0];\n fieldsCombo.setValue(fieldId);\n }\n // select direction\n if (dir) {\n var dirElem = sort_form.getChildViews()[viewIndex].getChildViews()[1];\n dirElem.setValue?.(dir);\n\n // [ABFieldList] Sorting following order\n dirElem.sort?.((a, b) => {\n return (dir ?? \"\").indexOf(a.id ?? a) >\n (dir ?? \"\").indexOf(b.id ?? b)\n ? 1\n : -1;\n });\n }\n }\n\n /**\n * @function getFieldList\n * return field list so we can present a custom UI for view\n * @param {bool} excludeSelected\n * Should we ignore fields that already exist in the form?\n * @return {array} [ { id, value } ]\n * an array that is compatible with the webix.list\n * widget.\n */\n getFieldList(excludeSelected) {\n var sort_form = $$(this.ids.form),\n listFields = [];\n\n var allFields = this.CurrentObject.fields();\n if (!allFields || !allFields.length) return listFields;\n\n // Get all fields include hidden fields\n allFields.forEach((f) => {\n if (f.fieldIsSortable()) {\n listFields.push({\n id: f.id,\n value: f.label,\n });\n }\n });\n\n // Remove selected field\n if (excludeSelected) {\n var childViews = sort_form.getChildViews();\n if (childViews.length > 1) {\n // Ignore 'Add new sort' button\n childViews.forEach(function (cView, index) {\n if (childViews.length - 1 <= index) return false;\n\n var selectedValue = cView.getChildViews()[0].getValue();\n if (selectedValue) {\n listFields = listFields.filter((f) => f.id != selectedValue);\n }\n });\n }\n }\n return listFields;\n }\n\n /**\n * @function objectLoad\n * Ready the Popup according to the current object\n * @param {ABObject} object the currently selected object.\n */\n objectLoad(object) {\n this.CurrentObject = object;\n }\n\n /**\n * @method setSettings\n * Initialize the form with a set of conditions.\n * @param {Array} settings\n * The default settings for this form.\n * [\n * {\n * key: uuid, // ABField.id\n * dir: string, // 'asc' or 'desc'\n * }\n * ]\n */\n setSettings(settings) {\n this._settings = this.AB.cloneDeep(settings);\n }\n\n /**\n * @method getSettings\n * return the current sort settings stored by this form.\n * @return {Array} -\n * [\n * {\n * key: uuid, // ABField.id\n * dir: string, // 'asc' or 'desc'\n * }\n * ]\n */\n getSettings() {\n var sort_form = $$(this.ids.form),\n sortFields = [];\n\n var childViews = sort_form.getChildViews();\n if (childViews.length > 1) {\n // Ignore 'Add new sort' button\n childViews.forEach(function (cView, index) {\n if (childViews.length - 1 <= index) return false;\n\n var fieldId = cView.getChildViews()[0].getValue();\n const dirElem = cView.getChildViews()[1];\n var dir =\n dirElem?.getValue?.() ??\n dirElem?.data?.getRange?.()?.map((opt) => opt.id) ?? // Select list field type\n \"\";\n sortFields.push({\n key: fieldId,\n dir: dir,\n });\n });\n }\n return sortFields;\n }\n\n /**\n * @method onChangeCombo()\n * Update the display once they have chosen a field to sort by.\n * We now need to offer the appropriate sort direction chooser.\n * @param {string} fieldID\n * The value of the combo box now.\n * @param {webix.$view} el\n * The current Webix.$view that was the combo box that just\n * changed.\n */\n onChangeCombo(fieldID, el) {\n var allFields = this.CurrentObject.fields();\n var chosenField = null,\n sortDir = el.getParentView().getChildViews()[1],\n // isMultiLingual = el.getParentView().getChildViews()[2],\n // isMulti = 0,\n options = null;\n\n chosenField = allFields.find((f) => f.id == fieldID);\n if (!chosenField) return;\n\n switch (chosenField.key) {\n case \"date\":\n options = [\n { id: \"asc\", value: L(\"Before -> After\") },\n { id: \"desc\", value: L(\"After -> Before\") },\n ];\n break;\n case \"number\":\n options = [\n { id: \"asc\", value: L(\"1 -> 9\") },\n { id: \"desc\", value: L(\"9 -> 1\") },\n ];\n break;\n case \"string\":\n default:\n options = [\n { id: \"asc\", value: L(\"A -> Z\") },\n { id: \"desc\", value: L(\"Z -> A\") },\n ];\n break;\n }\n\n if (chosenField.key == \"list\") {\n AB.Webix.ui(this._valueListElement(chosenField), sortDir);\n } else {\n const valElem = this._valueElement();\n valElem.options = options;\n AB.Webix.ui(valElem, sortDir);\n }\n\n // if (columnConfig.settings.supportMultilingual)\n // isMulti = columnConfig.settings.supportMultilingual;\n\n // isMultiLingual.setValue(isMulti);\n\n this.refreshFieldList();\n this.triggerOnChange();\n }\n\n /**\n * @function onShow\n * Rebuild the form when an onShow() is called.\n */\n onShow(view, options) {\n var sort_form = $$(this.ids.form);\n\n // clear field options in the form\n webix.ui(this.uiForm(), sort_form);\n\n var sorts = this._settings;\n if (sorts && sorts.forEach) {\n sorts.forEach((s) => {\n this.clickAddNewSort(s.key, s.dir);\n });\n }\n\n if (sorts == null || sorts.length == 0) {\n this.clickAddNewSort();\n }\n\n const $popup = $$(this.ids.component);\n $popup?.blockEvent();\n $popup?.show(view, options);\n $popup?.unblockEvent();\n }\n\n /**\n * @method refreshFieldList\n * return an updated field list so you cannot duplicate a sort\n * @param {bool} ignoreRemoveViews\n *\n */\n refreshFieldList(ignoreRemoveViews) {\n var sort_form = $$(this.ids.form),\n listFields = this.getFieldList(false),\n selectedFields = [],\n removeChildViews = [];\n\n var childViews = sort_form.getChildViews();\n if (childViews.length > 1) {\n // Ignore 'Add new sort' button\n childViews.forEach(function (cView, index) {\n if (childViews.length - 1 <= index) return false;\n\n let fieldId = cView.getChildViews()[0].getValue(),\n // fieldObj = $.grep(listFields, function (f) { return f.id == fieldId });\n fieldObj = listFields.filter((f) => {\n return f.id == fieldId;\n });\n\n if (fieldObj.length > 0) {\n // Add selected field to list\n selectedFields.push(fieldObj[0]);\n } else {\n // Add condition to remove\n removeChildViews.push(cView);\n }\n });\n }\n\n // Remove filter conditions when column is deleted\n if (!ignoreRemoveViews) {\n removeChildViews.forEach((cView /*, index */) => {\n sort_form.removeView(cView);\n });\n }\n\n // Field list should not duplicate field items\n childViews = sort_form.getChildViews();\n if (childViews.length > 1) {\n // Ignore 'Add new sort' button\n childViews.forEach((cView, index) => {\n if (childViews.length - 1 <= index) return false;\n\n let fieldId = cView.getChildViews()[0].getValue(),\n // fieldObj = $.grep(listFields, function (f) { return f.id == fieldId }),\n fieldObj = listFields.filter((f) => {\n return f.id == fieldId;\n });\n\n // var selectedFieldsExcludeCurField = $(selectedFields).not(fieldObj);\n var selectedFieldsExcludeCurField = selectedFields.filter((x) => {\n if (Array.isArray(fieldObj) && fieldObj.indexOf(x) !== -1) {\n return false;\n }\n return true;\n });\n\n // var enableFields = $(listFields).not(selectedFieldsExcludeCurField).get();\n var enableFields = listFields.filter((x) => {\n if (\n Array.isArray(selectedFieldsExcludeCurField) &&\n selectedFieldsExcludeCurField.indexOf(x) !== -1\n ) {\n return false;\n }\n return true;\n });\n\n // Update field list\n cView.getChildViews()[0].define(\"options\", enableFields);\n cView.getChildViews()[0].refresh();\n });\n }\n }\n\n /**\n * @function triggerOnChange\n * This parses the sort form to build in order the sorts then saves to the application object workspace\n */\n triggerOnChange() {\n // block .onChange callback\n if (this._blockOnChange) return;\n\n this._settings = this.getSettings();\n\n this.emit(\"changed\", this._settings);\n }\n\n blockOnChange() {\n this._blockOnChange = true;\n }\n\n unblockOnChange() {\n this._blockOnChange = false;\n }\n\n /**\n * @function show()\n * Show this component.\n * @param {obj} $view\n * the webix.$view to hover the popup around.\n * @param {uuid} fieldId\n * the ABField.id we want to prefill the sort with\n * @param {json} options\n * Additional webix.show() options parameters.\n */\n show($view, fieldId, options) {\n this.blockOnChange();\n\n this.onShow($view, options || null);\n\n if (fieldId) {\n this.clickAddNewSort(fieldId);\n }\n\n this.unblockOnChange();\n }\n\n /**\n * @function sort()\n * client sort data in list\n *\n * @param {Object} a\n * @param {Object} b\n */\n sort(a, b) {\n let result = 0;\n\n const childViews = $$(this.ids.form).getChildViews();\n if (childViews.length > 1) {\n // Ignore 'Add new sort' button\n childViews.forEach((cView, index) => {\n if (childViews.length - 1 <= index || result != 0) return;\n\n const fieldId = cView.getChildViews()[0].getValue();\n const dirElem = cView.getChildViews()[1];\n const dir =\n dirElem?.getValue?.() ??\n dirElem?.data?.getRange?.()?.map((opt) => opt.id) ?? // Select list field type\n \"\";\n\n const field = this.CurrentObject.fieldByID(fieldId);\n if (!field) return;\n\n const by = field.columnName; // column name\n\n let aValue = a[by],\n bValue = b[by];\n\n if (field.key == \"list\") {\n aValue = dir.indexOf(aValue);\n bValue = dir.indexOf(bValue);\n }\n\n if (Array.isArray(aValue)) {\n aValue = (aValue || [])\n .map((item) => item.text || item)\n .join(\" \");\n }\n\n if (Array.isArray(bValue)) {\n bValue = (bValue ?? [])\n .map((item) => item.text || item)\n .join(\" \");\n }\n\n if (aValue != bValue) {\n if (dir == \"asc\" || field.key == \"list\") {\n result = aValue > bValue ? 1 : -1;\n } else {\n result = aValue < bValue ? 1 : -1;\n }\n }\n });\n }\n\n return result;\n }\n\n _valueElement() {\n return {\n view: \"segmented\",\n width: 200,\n options: [\n {\n id: \"\",\n value: L(\"Please select field\"),\n },\n ],\n on: {\n onChange: (/* newv, oldv */) => {\n // 'asc' or 'desc' values\n this.triggerOnChange();\n },\n },\n };\n }\n\n _valueListElement(field) {\n return {\n view: \"list\",\n template: \"
    #text#\",\n type: {\n height: 35,\n },\n height: 150,\n select: true,\n drag: \"order\",\n data: field.options(),\n on: {\n onChange: () => {\n this.triggerOnChange();\n },\n onAfterDrop: () => {\n this.triggerOnChange();\n },\n },\n };\n }\n}\n","const ABViewImageCore = require(\"../../core/views/ABViewImageCore\");\nconst ABViewImageComponent = require(\"./viewComponent/ABViewImageComponent\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewImage extends ABViewImageCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n //\n //\tEditor Related\n //\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewImageComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n if (!this.settings.filename) {\n this.warningsMessage(`has no image set`);\n }\n }\n};\n","const ABViewKanbanCore = require(\"../../core/views/ABViewKanbanCore\");\nconst ABViewKanbanComponent = require(\"./viewComponent/ABViewKanbanComponent\");\n\nconst ABViewPropertyLinkPage =\n require(\"./viewProperties/ABViewPropertyLinkPage\").default;\n\nexport default class ABViewKanban extends ABViewKanbanCore {\n //\n //\tEditor Related\n //\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n\n component() {\n return new ABViewKanbanComponent(this);\n }\n\n get linkPageHelper() {\n return (this.__linkPageHelper =\n this.__linkPageHelper || new ABViewPropertyLinkPage());\n }\n\n warningsEval() {\n super.warningsEval();\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n }\n}\n","/*\n * ABViewKanbanFormSidePanel\n *\n * Provide a form area for editing data in the Kan Ban view.\n *\n */\n\nconst ABViewComponent = require(\"./viewComponent/ABViewComponent\").default;\nconst ABViewForm = require(\"./ABViewForm\");\nconst ABViewFormButton = require(\"./ABViewFormButton\");\n\nvar L = null;\n// multilingual Label fn()\n\nmodule.exports = class ABWorkObjectKanBan extends ABViewComponent {\n constructor(comKanBan, idBase, editFields) {\n idBase = idBase || `${comKanBan.view?.id}_formSidePanel`;\n super(idBase, {\n form: \"\",\n });\n\n if (!L) {\n L = (...params) => {\n return this.AB.Multilingual.label(...params);\n };\n }\n\n this.AB = comKanBan.AB;\n\n this.CurrentObjectID = null;\n // {string}\n // the ABObject.id of the object we are working with.\n\n this.editFields = editFields;\n // {array}\n // An array of {ABField.id} that determines which fields should show up\n // in the editor.\n\n this._mockApp = this.AB.applicationNew({});\n // {ABApplication}\n // Any ABViews we create are expected to be in relation to\n // an ABApplication, so we create a \"mock\" app for our\n // workspace views to use to display.\n }\n\n /**\n * @method CurrentObject()\n * A helper to return the current ABObject we are working with.\n * @return {ABObject}\n */\n get CurrentObject() {\n return this.AB.objectByID(this.CurrentObjectID);\n }\n\n ui() {\n var ids = this.ids;\n\n // Our webix UI definition:\n return {\n id: ids.component,\n width: 300,\n hidden: true,\n rows: [\n {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n view: \"label\",\n label: L(\"Edit Record\"),\n },\n {\n view: \"icon\",\n icon: \"wxi-close\",\n align: \"right\",\n click: (/* id */) => {\n this.hide();\n },\n },\n ],\n },\n {\n view: \"scrollview\",\n body: {\n rows: [\n {\n id: ids.form,\n view: \"form\",\n borderless: true,\n rows: [],\n },\n ],\n },\n },\n ],\n };\n }\n\n async init(AB) {\n this.AB = AB;\n }\n\n objectLoad(object) {\n this.CurrentObjectID = object.id;\n }\n\n hide() {\n $$(this.ids.component)?.hide();\n\n this.emit(\"close\");\n }\n\n show(data) {\n $$(this.ids.component)?.show();\n\n this.refreshForm(data);\n }\n\n isVisible() {\n return $$(this.ids.component)?.isVisible() ?? false;\n }\n\n refreshForm(data) {\n var ids = this.ids;\n let $formView = $$(ids.form);\n let CurrentObject = this.CurrentObject;\n\n if (!CurrentObject || !$formView) return;\n\n data = data || {};\n\n let formAttrs = {\n id: `${this.ids.component}_sideform`,\n key: ABViewForm.common().key,\n settings: {\n columns: 1,\n labelPosition: \"top\",\n showLabel: 1,\n clearOnLoad: 0,\n clearOnSave: 0,\n labelWidth: 120,\n height: 0,\n },\n };\n\n // let form = new ABViewForm(formAttrs, this._mockApp);\n let form = this.AB.viewNewDetatched(formAttrs);\n\n form.objectLoad(CurrentObject);\n\n // Populate child elements\n CurrentObject.fields().forEach((f, index) => {\n // if this is one of our .editFields\n if (!this.editFields || this.editFields.indexOf(f.id) > -1) {\n form.addFieldToForm(f, index);\n }\n });\n\n // add default button (Save button)\n form._views.push(\n new ABViewFormButton(\n {\n settings: {\n includeSave: true,\n includeCancel: false,\n includeReset: false,\n },\n position: {\n y: CurrentObject.fields().length, // yPosition\n },\n },\n this._mockApp,\n form\n )\n );\n\n // add temp id to views\n form._views.forEach(\n (v, index) => (v.id = `${form.id}_${v.key}_${index}`)\n );\n\n let formCom = form.component(this.AB._App);\n\n // Rebuild form\n webix.ui(formCom.ui().rows.concat({}), $formView);\n webix.extend($formView, webix.ProgressBar);\n\n formCom.init(\n this.AB,\n 2,\n {\n onBeforeSaveData: () => {\n // get update data\n var formVals = form.getFormValues($formView, CurrentObject);\n\n // validate data\n if (!form.validateData($formView, CurrentObject, formVals))\n return false;\n\n // show progress icon\n $formView?.showProgress({ type: \"icon\" });\n\n if (formVals.id) {\n CurrentObject.model()\n .update(formVals.id, formVals)\n .then((updateVals) => {\n this.emit(\"update\", updateVals);\n // _logic.callbacks.onUpdateData(updateVals);\n\n $formView?.hideProgress({ type: \"icon\" });\n })\n .catch((err) => {\n // TODO : error message\n this.AB.notify.developer(err, {\n context:\n \"ABViewKanbanFormSidePanel:onBeforeSaveData():update(): Error updating value\",\n formVals,\n });\n $formView?.hideProgress({ type: \"icon\" });\n });\n }\n // else add new row\n else {\n CurrentObject.model()\n .create(formVals)\n .then((newVals) => {\n // _logic.callbacks.onAddData(newVals);\n this.emit(\"add\", newVals);\n\n $formView?.hideProgress({ type: \"icon\" });\n })\n .catch((err) => {\n // TODO : error message\n this.AB.notify.developer(err, {\n context:\n \"ABViewKanbanFormSidePanel:onBeforeSaveData():.create(): Error creating value\",\n formVals,\n });\n\n $formView?.hideProgress({ type: \"icon\" });\n });\n }\n\n return false;\n },\n },\n 2 /* NOTE: if you can see this KanBan, you should be able to see the side form? */\n );\n\n // display data\n $formView.clear();\n $formView.parse(data);\n\n formCom.onShow(data);\n }\n};\n","const ABViewLabelCore = require(\"../../core/views/ABViewLabelCore\");\nconst ABViewLabelComponent = require(\"./viewComponent/ABViewLabelComponent\");\n\nmodule.exports = class ABViewLabel extends ABViewLabelCore {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewLabelComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n if (!this.text) {\n this.warningsMessage(\"has no text value set.\");\n }\n }\n};\n","const ABViewLayoutCore = require(\"../../core/views/ABViewLayoutCore\");\nconst ABViewLayoutComponent = require(\"./viewComponent/ABViewLayoutComponent\");\n\nmodule.exports = class ABViewLayout extends ABViewLayoutCore {\n /**\n * @function component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewLayoutComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n if (this._views.length == 0) {\n this.warningsMessage(\"has no columns set.\");\n }\n }\n};\n","const ABViewListCore = require(\"../../core/views/ABViewListCore\");\nconst ABViewListComponent = require(\"./viewComponent/ABViewListComponent\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewList extends ABViewListCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewListComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n }\n};\n","const ABViewMenuCore = require(\"../../core/views/ABViewMenuCore\");\nconst ABViewMenuComponent = require(\"./viewComponent/ABViewMenuComponent\");\n\nmodule.exports = class ABViewMenu extends ABViewMenuCore {\n /**\n * @function component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewMenuComponent(this);\n }\n};\n","const ABViewPDFImporterCore = require(\"../../core/views/ABViewPDFImporterCore\");\nconst ABViewPDFImporterComponent = require(\"./viewComponent/ABViewPDFImporterComponent\");\n\nmodule.exports = class ABViewPDFImporter extends ABViewPDFImporterCore {\n /**\n * @function component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewPDFImporterComponent(this);\n }\n};\n","const ABViewPageCore = require(\"../../core/views/ABViewPageCore\");\n\nconst ABPropertyComponentDefaults = ABViewPageCore.defaultValues();\n\nmodule.exports = class ABViewPage extends ABViewPageCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @function component()\n * return a UI component based upon this view.\n * @param {obj} v1App\n * @return {obj} UI component\n */\n component(v1App = false) {\n var component = super.component();\n\n component._ui = component.ui();\n\n // wrap our ABViewContainer in our Page scrollview\n component.ui = () => {\n return {\n view: \"scrollview\",\n borderless: true,\n css:\n this.settings.pageBackground ||\n ABPropertyComponentDefaults.pageBackground,\n body: component._ui,\n };\n };\n\n // if this is our v1Interface\n if (v1App) {\n var newComponent = component;\n component = {\n ui: component.ui(),\n init: (options, accessLevel) => {\n accessLevel = accessLevel ?? this.getUserAccess();\n return newComponent.init(this.AB, accessLevel, options);\n },\n onShow: (...params) => {\n return newComponent.onShow?.(...params);\n },\n };\n }\n\n return component;\n }\n\n warningsEval() {\n super.warningsEval();\n\n let allViews = this.views();\n\n if (allViews.length == 0) {\n this.warningsMessage(\"has no sub views\");\n }\n\n (this.pages() || []).forEach((p) => {\n p.warningsEval();\n });\n }\n};\n","const ABViewPivotCore = require(\"../../core/views/ABViewPivotCore\");\nconst ABViewPivotComponent = require(\"./viewComponent/ABViewPivotComponent\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewPivot extends ABViewPivotCore {\n constructor(values, application, parent, defaultValues) {\n super(values, application, parent, defaultValues);\n }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewPivotComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n\n let DC = this.datacollection;\n if (!DC) {\n this.warningsMessage(\n `can't resolve it's datacollection[${this.settings.dataviewID}]`\n );\n }\n }\n};\n","const ABViewReportsManagerCore = require(\"../../core/views/ABViewReportsManagerCore\");\nconst ABViewReportsManagerComponent = require(\"./viewComponent/ABViewReportsManagerComponent\");\n\nmodule.exports = class ABViewReportsManager extends ABViewReportsManagerCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n //\n //\tEditor Related\n //\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewReportsManagerComponent(this);\n }\n};\n","const ABViewSchedulerCore = require(\"../../core/views/ABViewSchedulerCore\");\nconst ABViewSchedulerComponent = require(\"./viewComponent/ABViewSchedulerComponent\");\n\nmodule.exports = class ABViewScheduler extends ABViewSchedulerCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component() {\n return new ABViewSchedulerComponent(this);\n }\n\n warningsEval() {\n super.warningsEval();\n }\n};\n","const ABViewTabCore = require(\"../../core/views/ABViewTabCore\");\n\nconst ABViewTabComponent = require(\"./viewComponent/ABViewTabComponent\");\n\nmodule.exports = class ABViewTab extends ABViewTabCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @param {obj} App\n * @return {obj} UI component\n */\n component(v1App = false) {\n let component = new ABViewTabComponent(this);\n\n // if this is our v1Interface\n if (v1App) {\n const newComponent = component;\n\n component = {\n ui: newComponent.ui(),\n init: (options, accessLevel) => {\n return newComponent.init(this.AB);\n },\n onShow: (...params) => {\n return newComponent.onShow?.(...params);\n },\n };\n }\n\n return component;\n }\n\n warningsEval() {\n super.warningsEval();\n\n let allViews = this.views();\n\n if (allViews.length == 0) {\n this.warningsMessage(\"has no tabs set\");\n }\n\n // NOTE: this is done in ABView:\n // (this.views() || []).forEach((v) => {\n // v.warningsEval();\n // });\n }\n};\n","const ABViewTextCore = require(\"../../core/views/ABViewTextCore\");\n\nconst ABViewTextComponent = require(\"./viewComponent/ABViewTextComponent\");\n\nmodule.exports = class ABViewText extends ABViewTextCore {\n /**\n * @method component()\n * return a UI component based upon this view.\n * @return {obj} UI component\n */\n component(parentId) {\n return new ABViewTextComponent(this, parentId);\n }\n};\n","const ABViewWidgetCore = require(\"../../core/views/ABViewWidgetCore\");\n\nconst ABPropertyComponentDefaults = ABViewWidgetCore.defaultValues();\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewWidget extends ABViewWidgetCore {\n // constructor(values, application, parent, defaultValues) {\n // super(values, application, parent, defaultValues);\n // }\n\n /**\n * @function component()\n * return a UI component based upon this view.\n * @param {obj} App\n * @return {obj} UI component\n */\n component(App) {\n let base = super.component(App);\n\n base.onShow = (viewId) => {\n let dv = this.datacollection; // get from a function or a (get) property\n if (dv && dv.dataStatus == dv.dataStatusFlag.notInitial) {\n // load data when a widget is showing\n dv.loadData();\n }\n };\n\n return base;\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewCSVExporterComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABCSVExporter_${baseView.id}`,\n Object.assign(\n {\n button: \"\",\n buttonFilter: \"\",\n filterComplex: \"\",\n },\n ids\n )\n );\n\n this.clientFilter = null;\n }\n\n ui() {\n const ids = this.ids;\n const settings = this.settings;\n const defaultSettings = this.view.constructor.defaultValues();\n const _ui = super.ui([\n {\n view: \"layout\",\n type: \"clean\",\n borderless: true,\n cols: [\n {\n id: ids.buttonFilter,\n view: \"button\",\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"fa fa-filter\",\n borderless: true,\n width: 50,\n label: \"\",\n click: () => {\n this.showFilterPopup();\n },\n },\n {\n id: ids.button,\n view: \"button\",\n css: \"webix_primary\",\n type: \"icon\",\n icon: \"fa fa-download\",\n borderless: true,\n width: settings.width || defaultSettings.width,\n label: settings.buttonLabel ?? defaultSettings.buttonLabel,\n click: () => {\n this.downloadCsvFile();\n },\n },\n { fillspace: true },\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n if (!this.clientFilter) {\n const clientFilter = AB.filterComplexNew(this.ids.filterComplex);\n\n const dc = this.datacollection;\n\n if (dc) {\n const obj = dc.datasource;\n\n clientFilter.fieldsLoad(obj?.fields?.() ?? []);\n }\n\n clientFilter.init();\n clientFilter.on(\"change\", (val) => {\n this.onFilterChange(val);\n });\n\n this.clientFilter = clientFilter;\n }\n }\n\n downloadCsvFile() {\n let url = `/appbuilder/csv-export/${this.view.id}`;\n\n const where = {\n glue: \"and\",\n rules: [],\n };\n\n const whereWidget = this.view.settings?.where;\n if ((whereWidget?.rules ?? []).length) {\n where.rules.push(whereWidget);\n }\n\n const whereClient = this.clientFilter.getValue();\n if ((whereClient?.rules ?? []).length) {\n where.rules.push(whereClient);\n }\n\n if ((where?.rules || []).length) {\n let qsWhere = JSON.stringify(where);\n\n qsWhere = encodeURIComponent(qsWhere);\n url = `${url}?where=${qsWhere}`;\n }\n\n window.open(url);\n }\n\n showFilterPopup() {\n const $buttonFilter = $$(this.ids.buttonFilter);\n\n this.clientFilter.popUp($buttonFilter ? $buttonFilter.$view : null);\n }\n\n onFilterChange() {\n const $buttonFilter = $$(this.ids.buttonFilter);\n\n if (!$buttonFilter) return;\n\n const where = this.clientFilter.getValue();\n\n $buttonFilter.define(\"badge\", (where.rules || []).length || null);\n $buttonFilter.refresh();\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\nconst CSVImporter = require(\"../../CSVImporter\");\n\nmodule.exports = class ABViewCSVImporterComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABCSVImporter_${baseView.id}`,\n Object.assign(\n {\n button: \"\",\n popup: \"\",\n\n form: \"\",\n uploader: \"\",\n uploadFileList: \"\",\n separatedBy: \"\",\n headerOnFirstLine: \"\",\n columnList: \"\",\n\n search: \"\",\n datatable: \"\",\n\n statusMessage: \"\",\n progressBar: \"\",\n\n linkedDataButton: \"\",\n importButton: \"\",\n rules: \"\",\n },\n ids\n )\n );\n\n this.csvImporter = new CSVImporter((...args) => this.label(...args));\n // {CSVImporter}\n // An instance of the object that imports the CSV data.\n\n this.validationError = false;\n\n this._dataRows = null;\n this._csvFileInfo = null;\n }\n\n ui() {\n const settings = this.settings;\n const defaultSettings = this.view.constructor.defaultValues();\n const _ui = super.ui([\n {\n cols: [\n {\n view: \"button\",\n css: \"webix_primary\",\n type: \"icon\",\n icon: \"fa fa-upload\",\n label: this.label(\n settings.buttonLabel || defaultSettings.buttonLabel\n ),\n width: settings.width || defaultSettings.width,\n click: () => {\n this.showPopup();\n },\n },\n {\n fillspace: true,\n },\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n uiConfig() {\n const ids = this.ids;\n\n return {\n id: ids.form,\n view: \"form\",\n type: \"clean\",\n borderless: true,\n minWidth: 400,\n gravity: 1,\n elements: [\n {\n rows: [\n {\n id: ids.uploader,\n view: \"uploader\",\n name: \"csvFile\",\n css: \"webix_primary\",\n value: this.label(\"Choose a CSV file\"),\n accept: \"text/csv\",\n multiple: false,\n autosend: false,\n link: ids.uploadFileList,\n on: {\n onBeforeFileAdd: (fileInfo) => {\n this._csvFileInfo = fileInfo;\n\n return this.loadCsvFile();\n },\n },\n },\n {\n id: ids.uploadFileList,\n name: \"uploadedFile\",\n view: \"list\",\n type: \"uploader\",\n autoheight: true,\n borderless: true,\n onClick: {\n webix_remove_upload: (e, id /*, trg */) => {\n this.removeCsvFile(id);\n },\n },\n },\n {\n padding: 10,\n rows: [\n {\n id: ids.separatedBy,\n view: \"richselect\",\n name: \"separatedBy\",\n label: this.label(\"Separated by\"),\n labelWidth: 140,\n options: this.csvImporter.getSeparateItems(),\n value: \",\",\n on: {\n onChange: () => {\n this.loadCsvFile();\n },\n },\n },\n {\n id: ids.headerOnFirstLine,\n view: \"checkbox\",\n name: \"headerOnFirstLine\",\n label: this.label(\"Header on first line\"),\n labelWidth: 140,\n disabled: true,\n value: true,\n on: {\n onChange: (/*newVal, oldVal*/) => {\n this.populateColumnList();\n },\n },\n },\n ],\n },\n {\n type: \"space\",\n rows: [\n {\n view: \"scrollview\",\n minHeight: 300,\n body: {\n padding: 10,\n id: ids.columnList,\n rows: [],\n },\n },\n ],\n },\n ],\n },\n ],\n };\n }\n\n uiRecordsView() {\n const ids = this.ids;\n\n return {\n gravity: 2,\n rows: [\n {\n view: \"toolbar\",\n css: \"bg_gray\",\n cols: [\n { width: 5 },\n {\n id: ids.search,\n view: \"search\",\n value: \"\",\n label: \"\",\n placeholder: this.label(\"Search records...\"),\n keyPressTimeout: 200,\n on: {\n onTimedKeyPress: () => {\n this.search($$(ids.search).getValue());\n },\n },\n },\n { width: 2 },\n ],\n },\n {\n id: ids.datatable,\n view: \"datatable\",\n resizeColumn: true,\n editable: true,\n editaction: \"dblclick\",\n css: \"ab-csv-importer\",\n borderless: false,\n tooltip: (obj) => {\n const tooltip = obj._errorMsg\n ? obj._errorMsg\n : \"No validation errors\";\n return tooltip;\n },\n minWidth: 650,\n columns: [],\n on: {\n onValidationError: (id, obj, details) => {\n // console.log(`item ${id} invalid`);\n let errors = \"\";\n\n Object.keys(details).forEach((key) => {\n this.$view.complexValidations[key].forEach((err) => {\n errors += err.invalidMessage + \"
    \";\n });\n });\n\n const $dt = $$(ids.datatable);\n\n $dt.blockEvent();\n $dt.updateItem(id, {\n _status: \"invalid\",\n _errorMsg: errors,\n });\n $dt.unblockEvent();\n\n this.validationError = true;\n },\n onValidationSuccess: (id, obj, details) => {\n // console.log(`item ${id} valid`);\n const $dt = $$(ids.datatable);\n\n $dt.blockEvent();\n $dt.updateItem(id, {\n _status: \"valid\",\n _errorMsg: \"\",\n });\n $dt.unblockEvent();\n this.validationError = false;\n },\n onCheck: () => {\n const selected = $$(ids.datatable).find({\n _included: true,\n });\n const $importButton = $$(ids.importButton);\n\n $importButton.setValue(this.labelImport(selected));\n\n if (this.overLimitAlert(selected)) $importButton.disable();\n else $importButton.enable();\n },\n },\n },\n {\n id: ids.progressBar,\n height: 6,\n },\n {\n cols: [\n {\n id: ids.linkedDataButton,\n view: \"button\",\n label: this.label(\"Linked Data\"),\n type: \"icon\",\n icon: \"fa fa-info\",\n maxWidth: 180,\n click: () => {\n this.showLinkedData();\n },\n },\n {\n view: \"button\",\n name: \"import\",\n id: ids.importButton,\n label: this.label(\"Import\"),\n css: \"webix_primary\",\n disabled: true,\n type: \"icon\",\n icon: \"fa fa-upload\",\n click: () => {\n this.import();\n },\n },\n ],\n },\n ],\n };\n }\n\n uiPopup() {\n const ids = this.ids;\n\n return {\n id: ids.popup,\n view: \"window\",\n hidden: true,\n position: \"center\",\n modal: true,\n resize: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {},\n {\n view: \"label\",\n label: this.label(\"CSV Importer\"),\n autowidth: true,\n },\n {},\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n this.hide();\n },\n },\n ],\n },\n body: {\n type: \"form\",\n rows: [\n {\n type: \"line\",\n cols: [\n this.uiConfig(),\n { width: 20 },\n this.uiRecordsView(),\n { width: 1 },\n ],\n },\n {\n id: ids.statusMessage,\n view: \"label\",\n align: \"right\",\n hidden: true,\n },\n {\n hidden: true,\n margin: 5,\n cols: [\n { fillspace: true },\n {\n view: \"button\",\n name: \"cancel\",\n value: this.label(\"Cancel\"),\n css: \"ab-cancel-button\",\n autowidth: true,\n click: () => {\n this.hide();\n },\n },\n /*,\n {\n view: \"button\",\n name: \"import\",\n id: ids.importButton,\n value: labels.component.import,\n css: \"webix_primary\",\n disabled: true,\n autowidth: true,\n type: \"form\",\n click: () => {\n _logic.import();\n }\n }*/\n ],\n },\n ],\n },\n };\n }\n\n async init(AB) {\n await super.init(AB);\n\n const ids = this.ids;\n\n // Populate values to rules\n\n const dc = this.datacollection;\n\n if (dc) this.objectLoad(dc.datasource);\n\n const abWebix = AB.Webix;\n\n abWebix.ui(this.uiPopup());\n\n const $form = $$(ids.form);\n\n if ($form) abWebix.extend($form, abWebix.ProgressBar);\n\n const $progressBar = $$(ids.progressBar);\n\n if ($progressBar) abWebix.extend($progressBar, abWebix.ProgressBar);\n }\n\n showPopup() {\n const ids = this.ids;\n\n $$(ids.popup)?.show();\n\n this.formClear();\n\n // open file dialog to upload\n $$(ids.uploader).fileDialog();\n }\n\n hide() {\n $$(this.ids.popup)?.hide();\n }\n\n formClear() {\n const ids = this.ids;\n\n this._dataRows = null;\n this._csvFileInfo = null;\n\n const $form = $$(ids.form);\n\n $form.clearValidation();\n $form.clear();\n\n $$(ids.separatedBy).setValue(\",\");\n\n this.AB.Webix.ui([], $$(ids.columnList));\n\n $$(ids.headerOnFirstLine).disable();\n $$(ids.importButton).disable();\n\n $$(ids.search).setValue(\"\");\n $$(ids.uploadFileList).clearAll();\n $$(ids.datatable).clearAll();\n\n const $statusMessage = $$(ids.statusMessage);\n\n $statusMessage.setValue(\"\");\n $statusMessage.hide();\n }\n\n search(searchText) {\n const $datatable = $$(this.ids.datatable);\n\n if (!$datatable) return;\n\n searchText = (searchText || \"\").toLowerCase();\n\n const matchFields = this.getMatchFields();\n\n $datatable.filter((row) => {\n let exists = false;\n\n (matchFields || []).forEach((f) => {\n if (exists) return;\n\n exists =\n (row[`${f.columnIndex}`] || \"\")\n .toString()\n .toLowerCase()\n .indexOf(searchText) > -1;\n });\n\n return exists;\n });\n }\n\n statusTemplate(item) {\n let template = \"\";\n\n if (!item) return template;\n\n switch (item._status) {\n case \"in-progress\":\n template = \"\";\n break;\n case \"invalid\":\n template = \"\";\n break;\n case \"valid\":\n template = \"\";\n break;\n case \"done\":\n template = \"\";\n break;\n case \"fail\":\n template = \"\";\n break;\n }\n\n return template;\n }\n\n async loadCsvFile() {\n const _csvFileInfo = this._csvFileInfo;\n\n if (!_csvFileInfo) return false;\n\n const csvImporter = this.csvImporter;\n\n if (!csvImporter.validateFile(_csvFileInfo)) {\n this.AB.Webix.alert({\n title: this.label(\"This file extension is not allowed\"),\n text: this.label(\"Please only upload CSV files\"),\n ok: this.label(\"Ok\"),\n });\n\n return false;\n }\n\n const ids = this.ids;\n\n // show loading cursor\n const $form = $$(ids.form);\n\n $form?.showProgress?.({ type: \"icon\" });\n\n // read CSV file\n const $headerOnFirstLine = $$(ids.headerOnFirstLine);\n const $importButton = $$(ids.importButton);\n\n $headerOnFirstLine.enable();\n $importButton.enable();\n\n this._dataRows = await csvImporter.getDataRows(\n _csvFileInfo,\n $$(ids.separatedBy).getValue()\n );\n\n const _dataRows = this._dataRows;\n\n let length = _dataRows.length;\n\n if ($headerOnFirstLine.getValue()) length = _dataRows.length - 1;\n\n $importButton.setValue(this.labelImport(length));\n this.populateColumnList();\n $form?.hideProgress?.();\n\n return true;\n }\n\n removeCsvFile(fileId) {\n $$(this.ids.uploadFileList).remove(fileId);\n this.formClear();\n\n return true;\n }\n\n populateColumnList() {\n const self = this;\n const ids = this.ids;\n const abWebix = this.AB.Webix;\n\n // clear list\n const $columnList = $$(ids.columnList);\n\n abWebix.ui([], $columnList);\n\n const _dataRows = this._dataRows;\n\n if (!_dataRows) return;\n\n // check first line of CSV\n const firstLine = _dataRows[0];\n\n if (!firstLine) return;\n\n const csvColumnList = [];\n const fieldList = [];\n const currentObject = this.CurrentObject;\n\n if (currentObject)\n fieldList.push(\n ...currentObject.fields((f) => {\n // available fields\n if (\n this.settings.availableFieldIds?.length &&\n this.settings.availableFieldIds.indexOf(f.id) < 0\n ) {\n return false;\n }\n\n // filter editable fields\n const formComp = f.formComponent();\n\n if (!formComp) return true;\n\n const formConfig = formComp.common();\n\n if (!formConfig) return true;\n\n return formConfig.key != \"fieldreadonly\";\n })\n );\n\n const csvImporter = this.csvImporter;\n\n // check first line be header columns\n if ($$(ids.headerOnFirstLine).getValue())\n csvColumnList.push(\n ...firstLine.map((colName, index) => {\n return {\n id: index + 1, // webix .options list disallow value 0\n value: colName,\n key: csvImporter.getGuessDataType(_dataRows, index),\n };\n })\n );\n else\n firstLine.forEach((e, i) => {\n csvColumnList.push({\n id: i + 1, // webix .options list disallow value 0\n value: this.label(\"Column {0}\", [i + 1]),\n key: csvImporter.getGuessDataType(_dataRows, i),\n });\n });\n\n // Add unselect item\n csvColumnList.unshift({\n id: \"none\",\n value: this.label(\"None\"),\n });\n\n // populate columns to UI\n const uiColumns = [];\n const selectedCsvCols = [];\n\n fieldList.forEach((f) => {\n // match up by data type\n const matchCol = csvColumnList.filter(\n (c) => c.key == f.key && selectedCsvCols.indexOf(c.id) < 0\n )[0];\n\n let selectVal = \"none\";\n\n if (matchCol) {\n selectVal = matchCol.id;\n\n // cache\n selectedCsvCols.push(selectVal);\n }\n\n let columnOptUI = {\n view: \"richselect\",\n gravity: 2,\n options: csvColumnList,\n fieldId: f.id,\n abName: \"columnIndex\",\n value: selectVal,\n on: {\n onChange: function () {\n self.toggleLinkFields(this);\n self.loadDataToGrid();\n },\n },\n };\n\n // Add date format options\n if (f.key === \"date\") {\n const dateSeparatorOptions = [\"/\", \"-\", \".\", \",\", \" \"];\n const dayFormatOptions = [\n { value: this.label(\"1 to 31\"), id: \"D\" },\n { value: this.label(\"01 to 31\"), id: \"DD\" },\n ];\n const monthFormatOptions = [\n { value: this.label(\"1 to 12\"), id: \"M\" },\n { value: this.label(\"01 to 12\"), id: \"MM\" },\n ];\n const yearFormatOptions = [\n { value: this.label(\"00 to 99\"), id: \"YY\" },\n { value: this.label(\"2000 to 2099\"), id: \"YYYY\" },\n ];\n const dateOrderOptions = [\n {\n value: this.label(\"D-M-Y\"),\n id: 1,\n },\n {\n value: this.label(\"M-D-Y\"),\n id: 2,\n },\n {\n value: this.label(\"Y-M-D\"),\n id: 3,\n },\n {\n value: this.label(\"Y-D-M\"),\n id: 4,\n },\n ];\n\n columnOptUI = {\n gravity: 2,\n rows: [\n columnOptUI,\n {\n view: \"richselect\",\n label: this.label(\"Separator\"),\n labelWidth: 100,\n on: {\n onChange: () => {\n this.loadDataToGrid();\n },\n },\n name: \"separator\",\n abName: \"columnDateFormat\",\n options: dateSeparatorOptions,\n value: \"/\",\n },\n {\n view: \"richselect\",\n label: this.label(\"Day\"),\n labelWidth: 100,\n on: {\n onChange: () => {\n this.loadDataToGrid();\n },\n },\n name: \"day\",\n abName: \"columnDateFormat\",\n options: dayFormatOptions,\n value: \"D\",\n },\n {\n view: \"richselect\",\n label: this.label(\"Month\"),\n labelWidth: 100,\n on: {\n onChange: () => {\n this.loadDataToGrid();\n },\n },\n name: \"month\",\n abName: \"columnDateFormat\",\n options: monthFormatOptions,\n value: \"M\",\n },\n {\n view: \"richselect\",\n label: this.label(\"Year\"),\n labelWidth: 100,\n on: {\n onChange: () => {\n this.loadDataToGrid();\n },\n },\n name: \"year\",\n abName: \"columnDateFormat\",\n options: yearFormatOptions,\n value: \"YY\",\n },\n {\n view: \"richselect\",\n label: this.label(\"Order\"),\n labelWidth: 100,\n on: {\n onChange: () => {\n this.loadDataToGrid();\n },\n },\n name: \"order\",\n abName: \"columnDateFormat\",\n options: dateOrderOptions,\n value: 1,\n },\n ],\n };\n }\n\n // Add connected field options\n if (f.isConnection) {\n let linkFieldOptions = [];\n\n if (f.datasourceLink) {\n linkFieldOptions = f.datasourceLink\n .fields((fld) => !fld.isConnection)\n .map((fld) => {\n return {\n id: fld.id,\n value: fld.label,\n };\n });\n }\n\n columnOptUI = {\n gravity: 2,\n rows: [\n columnOptUI,\n {\n view: \"richselect\",\n label: \"=\",\n labelWidth: 20,\n abName: \"columnLinkData\",\n hidden: true,\n options: linkFieldOptions,\n value: linkFieldOptions[0] ? linkFieldOptions[0].id : null,\n },\n ],\n };\n }\n\n uiColumns.push({\n view: \"layout\",\n borderless: true,\n cols: [\n {\n view: \"template\",\n gravity: 1,\n borderless: true,\n css: { \"padding-top\": 10 },\n template: ` ${f.label}`,\n },\n columnOptUI,\n ],\n });\n });\n abWebix.ui(uiColumns, $columnList);\n\n this.loadDataToGrid();\n }\n\n toggleLinkFields($columnOption) {\n if (!$columnOption) return;\n\n const $optionPanel = $columnOption.getParentView();\n const $linkFieldOption = $optionPanel.queryView(\n { abName: \"columnLinkData\" },\n \"all\"\n )[0];\n\n if (!$linkFieldOption) return;\n\n if ($columnOption.getValue() === \"none\") $linkFieldOption.hide();\n else $linkFieldOption.show();\n }\n\n overLimitAlert(data) {\n const limit = 1000;\n\n if (data.length > limit) {\n // we only allow 1000 record imports\n this.AB.Webix.alert({\n title: this.label(\"Too many records\"),\n ok: this.label(\"Ok\"),\n text: this.label(\n \"Due to browser limitations we only allow imports of {0} records. Please upload a new CSV or deselect records to import.\",\n [limit]\n ),\n });\n\n return true;\n }\n\n return false;\n }\n\n loadDataToGrid() {\n const ids = this.ids;\n const $datatable = $$(ids.datatable);\n const ab = this.AB;\n\n if (!$datatable) return;\n\n $datatable.clearAll();\n\n // show loading cursor\n $datatable.showProgress?.({ type: \"icon\" });\n\n /** Prepare Columns */\n const matchFields = this.getMatchFields();\n const columns = [];\n\n // add \"status\" column\n columns.push({\n id: \"_status\",\n header: \"\",\n template: this.statusTemplate,\n width: 30,\n });\n\n // add \"checkbox\" column\n columns.push({\n id: \"_included\",\n header: { content: \"masterCheckbox\" },\n template: \"{common.checkbox()}\",\n width: 30,\n });\n\n const fieldValidations = [];\n const rulePops = [];\n\n // populate columns\n (matchFields || []).forEach((f) => {\n let validationRules = f.field.settings.validationRules;\n // parse the rules because they were stored as a string\n // check if rules are still a string...if so lets parse them\n if (validationRules && typeof validationRules === \"string\")\n validationRules = JSON.parse(validationRules);\n\n if (validationRules?.length) {\n const validationUI = [];\n\n // there could be more than one so lets loop through and build the UI\n validationRules.forEach((rule) => {\n const Filter = ab.filterComplexNew(\n `${f.field.id}_${ab.Webix.uid()}`\n );\n // add the new ui to an array so we can add them all at the same time\n validationUI.push(Filter.ui);\n // store the filter's info so we can assign values and settings after the ui is rendered\n fieldValidations.push({\n filter: Filter,\n view: Filter.ids.querybuilder,\n columnName: f.field.id,\n validationRules: rule.rules,\n invalidMessage: rule.invalidMessage,\n columnIndex: f.columnIndex,\n });\n });\n\n // create a unique view id for popup\n const popUpId = `${ids.rules}_${f.field.id}_${ab.Webix.uid()}`;\n\n // store the popup ids so we can remove the later\n rulePops.push(popUpId);\n // add the popup to the UI but don't show it\n ab.Webix.ui({\n view: \"popup\",\n css: \"ab-rules-popup\",\n id: popUpId,\n body: {\n rows: validationUI,\n },\n });\n }\n\n const editor = f.field?.key == \"number\" ? \"number\" : \"text\";\n\n columns.push({\n id: f.columnIndex,\n header: f.field.label,\n editor: editor,\n template: (obj, common, value /*, col, ind */) =>\n value.replace(/[<]/g, \"<\"),\n minWidth: 150,\n fillspace: true,\n });\n });\n\n if (fieldValidations.length) {\n // we need to store the rules for use later so lets build a container array\n const complexValidations = [];\n\n fieldValidations.forEach((f) => {\n // init each ui to have the properties (app and fields) of the object we are editing\n // f.filter.applicationLoad(App);\n f.filter.fieldsLoad(this.CurrentObject.fields());\n // now we can set the value because the fields are properly initialized\n f.filter.setValue(f.validationRules);\n // if there are validation rules present we need to store them in a lookup hash\n // so multiple rules can be stored on a single field\n if (!Array.isArray(complexValidations[f.columnName]))\n complexValidations[f.columnName] = [];\n\n // now we can push the rules into the hash\n complexValidations[f.columnName].push({\n filters: $$(f.view).getFilterHelper(),\n values: $datatable.getSelectedItem(),\n invalidMessage: f.invalidMessage,\n columnIndex: f.columnIndex,\n });\n });\n\n const rules = {};\n\n // store the rules in a data param to be used later\n $datatable.$view.complexValidations = complexValidations;\n\n // use the lookup to build the validation rules\n Object.keys(complexValidations).forEach((key) => {\n rules[key] = (value, data) => {\n // default valid is true\n let isValid = true;\n\n $datatable.$view.complexValidations[key].forEach((filter) => {\n const rowValue = {};\n // use helper funtion to check if valid\n // map the column names to the index numbers of data\n // reformat data to display\n\n (matchFields || []).forEach((f) => {\n const record = data[f.columnIndex];\n\n if (\n f.field.key === \"date\" &&\n record.includes(\"Invalid date\")\n )\n isValid = false;\n\n rowValue[f.field.id] = record;\n });\n\n const ruleValid = filter.filters(rowValue);\n\n // if invalid we need to tell the field\n if (!ruleValid) {\n isValid = false;\n // this.AB.Webix.message({\n // type: \"error\",\n // text: invalidMessage\n // });\n }\n });\n\n return isValid;\n };\n });\n // define validation rules\n $datatable.define(\"rules\", rules);\n // store the array of view ids on the webix object so we can get it later\n $datatable.config.rulePops = rulePops;\n $datatable.refresh();\n } else {\n // check if the previous datatable had rule popups and remove them\n if ($datatable.config.rulePops) {\n $datatable.config.rulePops.forEach((popup) => {\n const $popup = $$(popup);\n\n if (!$popup) return;\n\n $popup.destructor();\n });\n }\n\n // remove any validation rules from the previous table\n $datatable.define(\"rules\", {});\n $datatable.refresh();\n }\n\n /** Prepare Data */\n const parsedData = [];\n\n (this._dataRows || []).forEach((row, index) => {\n const rowValue = {\n id: index + 1,\n };\n\n // reformat data to display\n (matchFields || []).forEach((f) => {\n const data = row[f.columnIndex - 1];\n\n if (f.field.key === \"date\") {\n // let dateFormat = moment(data, f.format).format(\n // \"YYYY-MM-DD\"\n // );\n // debugger;\n let dateFormat = ab.rules.toDate(data, {\n format: f.format,\n });\n dateFormat = ab.rules.toDateFormat(dateFormat, {\n format: \"YYYY-MM-DD\",\n });\n\n if (dateFormat === \"Invalid date\")\n dateFormat = dateFormat + \" - \" + data;\n\n rowValue[f.columnIndex] = dateFormat;\n } else rowValue[f.columnIndex] = data; // array to object\n });\n\n // insert \"true\" value of checkbox\n rowValue[\"_included\"] = true;\n\n parsedData.push(rowValue);\n });\n\n // skip the first line\n const isSkipFirstLine = $$(ids.headerOnFirstLine).getValue();\n\n if (isSkipFirstLine && parsedData.length > 1) parsedData.shift();\n\n const $importButton = $$(ids.importButton);\n\n $importButton.setValue(this.labelImport(parsedData));\n $datatable.refreshColumns(columns);\n $datatable.parse(parsedData);\n\n if (this.overLimitAlert(parsedData)) $importButton.disable();\n else $importButton.enable();\n\n // hide loading cursor\n $datatable.hideProgress?.();\n }\n\n refreshRemainingTimeText(startUpdateTime, total, index) {\n const ids = this.ids;\n\n // Calculate remaining time\n const spentTime = new Date() - startUpdateTime; // milliseconds that has passed since last completed record since start\n\n const averageRenderTime = spentTime / index; // average milliseconds per single render at this point\n\n const remainTime = averageRenderTime * (total - index);\n\n let result = \"\";\n\n // Convert milliseconds to a readable string\n const days = (remainTime / 86400000).toFixed(0);\n const hours = (remainTime / 3600000).toFixed(0);\n const minutes = (remainTime / 60000).toFixed(0);\n const seconds = (remainTime / 1000).toFixed(0);\n\n if (seconds < 1) result = \"\";\n else if (seconds < 60)\n result = this.label(\"Approximately {0} second(s) remaining\", [\n seconds,\n ]);\n // result = `Approximately ${seconds} second${\n // seconds > 1 ? \"s\" : \"\"\n // }`;\n else if (minutes == 1)\n result = this.label(\"Approximately 1 minute {0} seconds remaining\", [\n seconds - 60,\n ]);\n // result = `Approximately 1 minute ${seconds - 60} seconds`;\n else if (minutes < 60)\n result = this.label(\"Approximately {0} minutes remaining\", [minutes]);\n else if (hours < 24)\n result = this.label(\"Approximately {0} hour(s) remaining\", [hours]);\n else result = this.label(\"Approximately {0} day(s) remaining\", [days]);\n\n if (result) {\n $$(ids.importButton)?.setValue(result);\n } else {\n const selected = $$(ids.datatable)?.find({ _included: true });\n $$(ids.importButton)?.setValue(this.labelImport(selected));\n }\n }\n\n /**\n * @method getMatchFields\n *\n * @return {Object} - [\n * {\n * columnIndex: {number},\n * field: {ABField},\n * searchField: {ABField} [optional]\n * },\n * ...\n * ]\n */\n getMatchFields() {\n const result = [];\n const ids = this.ids;\n\n // get richselect components\n const $selectorViews = $$(ids.columnList)\n .queryView({ abName: \"columnIndex\" }, \"all\")\n .filter((selector) => selector.getValue() != \"none\");\n\n ($selectorViews || []).forEach(($selector) => {\n const currentObject = this.CurrentObject;\n\n if (!currentObject) return;\n\n // webix .options list disallow value 0\n const field = currentObject.fieldByID($selector.config.fieldId);\n\n if (!field) return;\n\n const colIndex = $selector.getValue();\n const fieldData = {\n columnIndex: colIndex,\n field: field,\n };\n\n if (field.key === \"date\") {\n const $optionPanel = $selector.getParentView();\n const $dateFormatSelectors = $optionPanel.queryView(\n { abName: \"columnDateFormat\" },\n \"all\"\n );\n\n // define the column to compare data to search .id\n if ($dateFormatSelectors) {\n $dateFormatSelectors.forEach((selector) => {\n fieldData[selector.config.name] = selector.getValue();\n });\n\n // convert all dates into mysql date format YYYY-DD-MM\n let format;\n\n switch (fieldData.order) {\n case \"1\":\n format =\n fieldData.day +\n fieldData.separator +\n fieldData.month +\n fieldData.separator +\n fieldData.year;\n break;\n case \"2\":\n format =\n fieldData.month +\n fieldData.separator +\n fieldData.day +\n fieldData.separator +\n fieldData.year;\n break;\n case \"3\":\n format =\n fieldData.year +\n fieldData.separator +\n fieldData.month +\n fieldData.separator +\n fieldData.day;\n break;\n case \"4\":\n format =\n fieldData.year +\n fieldData.separator +\n fieldData.day +\n fieldData.separator +\n fieldData.month;\n }\n\n fieldData.format = format;\n }\n }\n\n if (field.isConnection) {\n const $optionPanel = $selector.getParentView();\n const $linkDataSelector = $optionPanel.queryView(\n { abName: \"columnLinkData\" },\n \"all\"\n )[0];\n\n // define the column to compare data to search .id\n if ($linkDataSelector) {\n const searchField = field.datasourceLink.fieldByID(\n $linkDataSelector.getValue()\n );\n\n fieldData.searchField = searchField;\n }\n }\n\n result.push(fieldData);\n });\n\n return result;\n }\n\n labelImport(selected) {\n let length = selected;\n\n if (Array.isArray(selected)) length = selected.length;\n\n return this.label(\"Import {0} Records\", [length]);\n }\n\n /**\n * @method import\n *\n * @return {Promise}\n */\n async import() {\n // if (dv == null) return Promise.resolve();\n\n // // get ABObject\n // let obj = dv.datasource;\n\n // Make sure we are connected to an Object\n const currentObject = this.CurrentObject;\n\n if (!currentObject) return;\n\n // get ABModel\n // let model = dv.model;\n // if (model == null) return Promise.resolve();\n\n const ids = this.ids;\n const $importButton = $$(ids.importButton);\n\n $importButton.disable();\n\n // Show loading cursor\n const $form = $$(ids.form);\n const $progressBar = $$(ids.progressBar);\n\n $form.showProgress({ type: \"icon\" });\n $progressBar.showProgress({\n type: \"top\",\n position: 0.0001,\n });\n\n // get richselect components\n const matchFields = this.getMatchFields();\n\n // Get object's model\n const objModel = currentObject.model();\n const $datatable = $$(ids.datatable);\n const selectedRows = $datatable.find({ _included: true });\n\n let _currProgress = 0;\n\n const increaseProgressing = () => {\n _currProgress += 1;\n $progressBar.showProgress({\n type: \"bottom\",\n position: _currProgress / selectedRows.length,\n });\n };\n const itemFailed = (itemId, errMessage) => {\n if ($datatable) {\n // set \"fail\" status\n $datatable.addRowCss(itemId, \"row-fail\");\n $datatable.blockEvent();\n $datatable.updateItem(itemId, {\n _status: \"fail\",\n _errorMsg: errMessage,\n });\n $datatable.unblockEvent();\n }\n\n increaseProgressing();\n\n console.error(errMessage);\n };\n const abWebix = this.AB.Webix;\n const itemInvalid = (itemId, errors = []) => {\n if ($datatable) {\n // combine all error messages to display in tooltip\n const errorMsg = [];\n // mark which column are invalid\n errors.forEach((err) => {\n if (!err?.name) return;\n\n const fieldInfo = matchFields.filter(\n (f) => f.field && f.field.columnName == err.name\n )[0];\n\n errorMsg.push(err.name + \": \" + err.message);\n // we also need to define an error message\n // abWebix.message({\n // type: \"error\",\n // text: err.name + \": \" + err.message\n // });\n });\n\n // set \"fail\" status\n $datatable.blockEvent();\n $datatable.updateItem(itemId, {\n _status: \"invalid\",\n _errorMsg: errorMsg.join(\"
    \"),\n });\n $datatable.unblockEvent();\n $datatable.addRowCss(itemId, \"webix_invalid\");\n }\n // increaseProgressing();\n };\n const itemPass = (itemId) => {\n if ($datatable) {\n // set \"done\" status\n $datatable.removeRowCss(itemId, \"row-fail\");\n $datatable.addRowCss(itemId, \"row-pass\");\n $datatable.blockEvent();\n $datatable.updateItem(itemId, {\n _status: \"done\",\n _errorMsg: \"\",\n });\n $datatable.unblockEvent();\n }\n\n increaseProgressing();\n };\n const itemValid = (itemId) => {\n if ($datatable) {\n // mark all columns valid (just in case they were invalid before)\n // matchFields.forEach((f) => {\n // $datatable.removeCellCss(\n // itemId,\n // f.columnIndex,\n // \"webix_invalid_cell\"\n // );\n // });\n // highlight the row\n $datatable.removeRowCss(itemId, \"webix_invalid\");\n $datatable.blockEvent();\n $datatable.updateItem(itemId, {\n _status: \"\",\n _errorMsg: \"\",\n });\n $datatable.unblockEvent();\n // $datatable.addRowCss(itemId, \"row-pass\");\n }\n };\n const $statusMessage = $$(ids.statusMessage);\n const uiCleanUp = () => {\n // To Do anyUI updates\n // console.log(\"ui clean up now\");\n $importButton.enable();\n\n // Hide loading cursor\n $form.hideProgress();\n $progressBar.hideProgress();\n\n $statusMessage.setValue(\"\");\n $statusMessage.hide();\n\n const selected = $datatable.find({ _included: true });\n\n $importButton.setValue(this.labelImport(selected));\n this.emit(\"done\");\n };\n\n const validRows = [];\n\n let allValid = true;\n\n // Pre Check Validations of whole CSV import\n // update row to green if valid\n // update row to red if !valid\n (selectedRows || []).forEach((data, index) => {\n const newRowData = this.getParentValues();\n\n matchFields.forEach((f) => {\n if (!f.field?.key) return;\n\n switch (f.field.key) {\n // case \"connectObject\":\n // // skip\n // break;\n case \"number\":\n if (typeof data[f.columnIndex] !== \"number\") {\n newRowData[f.field.columnName] = (\n data[f.columnIndex] || \"\"\n ).replace(/[^-0-9.]/gi, \"\");\n\n break;\n }\n\n newRowData[f.field.columnName] = data[f.columnIndex];\n\n break;\n\n default:\n newRowData[f.field.columnName] = data[f.columnIndex];\n\n break;\n }\n });\n\n let isValid = false;\n let errorMsg = \"\";\n\n // first check legacy and server side validation\n const validator = currentObject.isValidData(newRowData);\n\n isValid = validator.pass();\n errorMsg = validator.errors;\n\n if (isValid)\n // now check complex field validation rules\n isValid = $datatable.validate(data.id);\n else {\n allValid = false;\n\n itemInvalid(data.id, errorMsg);\n }\n\n if (isValid) {\n itemValid(data.id);\n validRows.push({ id: data.id, data: newRowData });\n } else allValid = false;\n\n // $datatable.unblockEvent();\n });\n\n if (!allValid) {\n // To Do anyUI updates\n // $importButton.enable();\n //\n // // Hide loading cursor\n // $form.hideProgress();\n // $progressBar.hideProgress();\n // $statusMessage.setValue(\"\");\n // $statusMessage.hide();\n //\n // // _logic.hide();\n //\n // if (_logic.callbacks && _logic.callbacks.onDone)\n // _logic.callbacks.onDone();\n uiCleanUp();\n\n abWebix.alert({\n title: this.label(\"Invalid Data\"),\n ok: this.label(\"Ok\"),\n text: this.label(\n \"The highlighted row has invalid data. Please edit in the window or update the CSV and try again.\"\n ),\n });\n\n return;\n }\n\n // if pass, then continue to process each row\n // ?? : can we process in Parallel?\n // ?? : implement hash Lookups for connected Fields\n const hashLookups = {};\n // {obj} /* { connectField.id : { 'searchWord' : \"uuid\"}}\n // use this hash to reduce the # of lookups needed to fill in our\n // connected entries\n\n const connectedFields = matchFields.filter(\n (f) => f && f.field?.isConnection && f.searchField\n );\n\n const throttledSize = 10;\n let startUpdateTime;\n let numDone = 0;\n\n try {\n // forEach connectedFields in csv\n const allLookups = [];\n\n (connectedFields || []).forEach((f) => {\n const connectField = f.field;\n // const searchWord = newRowData[f.columnIndex];\n const connectObject = connectField.datasourceLink;\n\n if (!connectObject) return;\n\n const connectModel = connectObject.model();\n\n if (!connectModel) return;\n\n const linkIdKey = connectField.indexField\n ? connectField.indexField.columnName\n : connectField.object.PK();\n\n // prepare default hash entry:\n hashLookups[connectField.id] = {};\n\n // load all values of connectedField entries\n const gethashLookup = async () => {\n try {\n const list = await connectModel.findAll({\n where: {}, // !!!\n populate: false,\n });\n const data = list.data || list;\n\n (data || []).forEach((row) => {\n // store in hash[field.id] = { 'searchKey' : \"uuid\" }\n\n hashLookups[connectField.id][\n row[f.searchField.columnName]\n ] = row[linkIdKey];\n });\n } catch (err) {\n console.error(err);\n }\n };\n\n allLookups.push(gethashLookup());\n });\n\n await Promise.all(allLookups);\n\n // forEach validRow\n validRows.forEach((data) => {\n const newRowData = data.data;\n\n // update the datagrid row to in-progress\n $datatable.blockEvent();\n $datatable.updateItem(data.id, {\n _status: \"in-progress\",\n _errorMsg: \"\",\n });\n $datatable.unblockEvent();\n\n // forEach ConnectedField\n (connectedFields || []).forEach((f) => {\n // find newRowData[field.columnName] = { field.PK : hash[field.id][searchWord] }\n const connectField = f.field;\n const linkIdKey = connectField.indexField\n ? connectField.indexField.columnName\n : connectField.object.PK();\n const uuid =\n hashLookups[connectField.id][\n newRowData[connectField.columnName]\n ];\n\n if (!uuid) {\n itemInvalid(data.id, [{ name: connectField.columnName }]);\n allValid = false;\n }\n\n newRowData[connectField.columnName] = {};\n newRowData[connectField.columnName][linkIdKey] = uuid;\n });\n });\n\n if (!allValid) {\n abWebix.alert({\n title: this.label(\"Invalid Data\"),\n ok: this.label(\"Ok\"),\n text: this.label(\n \"The highlighted row has invalid data. Please edit in the window or update the CSV and try again.\"\n ),\n });\n uiCleanUp();\n\n return;\n }\n\n // NOTE: Parallel exectuion of all these:\n const allSaves = [];\n const createRecord = (objModel, newRowsData, element, total) =>\n new Promise((resolve, reject) => {\n element.doRecordRulesPre(newRowsData);\n\n const processResult = async () => {\n try {\n const result = await objModel.batchCreate({\n batch: newRowsData,\n });\n const resultErrors = result.errors;\n\n // Show errors of each row\n Object.keys(resultErrors).forEach((rowIndex) => {\n const error = resultErrors[rowIndex];\n\n if (error) {\n itemFailed(\n rowIndex,\n error.message || error.sqlMessage || error\n );\n }\n });\n\n const resultData = result.data;\n const penddingRecordRules = [];\n\n Object.keys(resultData).forEach((rowIndex) => {\n penddingRecordRules.push(\n new Promise((resolve, reject) => {\n // Process Record Rule\n const processRowData = async () => {\n try {\n await element.doRecordRules(\n resultData[rowIndex]\n );\n\n itemPass(rowIndex);\n resolve();\n } catch (err) {\n itemFailed(rowIndex, err);\n reject(\"that didn't work\");\n }\n };\n\n processRowData();\n })\n );\n });\n\n const waitPenddingRecordRules = async () => {\n try {\n await Promise.all(penddingRecordRules);\n\n newRowsData.forEach((row) => {\n // itemPass(row.id);\n numDone++;\n if (numDone % throttledSize == 0) {\n this.refreshRemainingTimeText(\n startUpdateTime,\n validRows.length,\n numDone\n );\n }\n });\n\n if (numDone === total) {\n uiCleanUp();\n $importButton.disable();\n }\n\n resolve();\n } catch (err) {\n // newRowsData.forEach((row) => {\n // itemFailed(row.id, err);\n // });\n // throw err;\n reject(err);\n }\n };\n\n await waitPenddingRecordRules();\n } catch (err) {\n console.error(err);\n reject(err);\n }\n };\n\n processResult();\n });\n\n validRows.forEach((data) => {\n allSaves.push({ id: data.id, data: data.data });\n });\n\n // we are going to store these promises in an array of\n // arrays with 50 in each sub array\n const throttledSaves = [];\n const total = allSaves.length;\n\n let index = 0;\n\n while (allSaves.length) {\n throttledSaves[index] = allSaves.splice(0, throttledSize);\n\n index++;\n }\n\n // execute the array of array of 100 promises one at at time\n const performThrottledSaves = (\n currentRecords,\n remainingRecords,\n importer,\n total\n ) =>\n new Promise((resolve, reject) => {\n // execute the next 100\n // const requests = currentRecords.map((data) => {\n // return createRecord(\n // objModel,\n // data.record,\n // data.data,\n // importer\n // );\n // });\n\n const processRequest = async () => {\n try {\n await createRecord(\n objModel,\n currentRecords,\n importer,\n total\n );\n\n // when done get the next 10\n const nextRecords = remainingRecords.shift();\n\n // if there are any remaining in the group call performThrottledSaves\n if (nextRecords?.length) {\n await performThrottledSaves(\n nextRecords,\n remainingRecords,\n importer,\n total\n );\n } else {\n // uiCleanUp();\n resolve();\n }\n } catch (err) {\n // Handle errors here\n reject(err);\n }\n };\n\n processRequest();\n });\n\n // now we are going to processes these new containers one at a time\n // $datatable.blockEvent();\n // this is when the real work starts so lets begin our countdown timer now\n startUpdateTime = new Date();\n // get the first group of Promises out of the collection\n const next = throttledSaves.shift();\n\n // execute our Promise iterator\n await performThrottledSaves(next, throttledSaves, this.view, total);\n } catch (err) {\n // resolve Error UI\n abWebix.alert({\n title: this.label(\"Error Creating Records\"),\n ok: this.label(\"Ok\"),\n text: this.label(\"One or more records failed upon creation.\"),\n });\n // $datatable.unblockEvent();\n uiCleanUp();\n console.error(err);\n }\n }\n\n // Display linked data\n uiLinkedData() {\n const dcLink = this.datacollection?.datacollectionLink;\n const linkedData = dcLink?.getCursor();\n if (!linkedData) return;\n\n return {\n view: \"window\",\n modal: true,\n resize: false,\n head: {\n view: \"toolbar\",\n cols: [\n {},\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n this.hideLinkedData();\n },\n },\n ],\n },\n body: {\n view: \"property\",\n id: \"sets\",\n editable: false,\n width: 400,\n height: 200,\n elements: [\n { label: this.label(\"Linked Data\"), type: \"label\" },\n {\n label: \"ID\",\n type: \"text\",\n value: linkedData.uuid ?? linkedData.id,\n },\n {\n label: \"Label\",\n type: \"text\",\n value: dcLink.datasource.displayData(linkedData),\n },\n ],\n },\n };\n }\n\n showLinkedData() {\n const ui = this.uiLinkedData();\n this._info_popup = this.AB.Webix.ui(ui);\n this._info_popup.show($$(this.ids.linkedDataButton).$view, {\n pos: \"top\",\n });\n }\n\n hideLinkedData() {\n this._info_popup?.hide();\n }\n\n getParentValues() {\n const result = {};\n\n // get ABDatacollection\n const dc = this.datacollection;\n const currentObject = this.CurrentObject;\n\n // Set parent's data collection cursor\n const dcLink = dc?.datacollectionLink;\n const linkConnectFields = [];\n\n let objectLink;\n let linkValues;\n\n if (dcLink?.getCursor()) {\n objectLink = dcLink.datasource;\n\n linkConnectFields.push(\n ...currentObject.fields(\n (f) => f.isConnection && f.settings.linkObject === objectLink.id\n )\n );\n\n linkValues = dcLink.getCursor();\n }\n\n // Set parent's data collection cursor\n if (objectLink && linkConnectFields.length && linkValues) {\n linkConnectFields.forEach((f) => {\n const linkColName = f.indexField\n ? f.indexField.columnName\n : objectLink.PK();\n\n result[f.columnName] = result[f.columnName] ?? {};\n result[f.columnName][linkColName] =\n linkValues[linkColName] ?? linkValues.id;\n });\n }\n\n return result;\n }\n};\n","import ABViewComponent from \"./ABViewComponent\";\n\nexport default class ABViewCarouselComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewCarousel_${baseView.id}`,\n Object.assign(\n {\n carousel: \"\",\n },\n ids\n )\n );\n\n this._handler_doOnShow = () => {\n this.onShow();\n };\n\n this._handler_doReload = () => {\n // this.datacollection?.reloadData();\n };\n\n this._handler_doFilter = (fnFilter, filterRules) => {\n // NOTE: fnFilter is depreciated and will be removed.\n\n // this.onShow(filterRules);\n const dv = this.datacollection;\n\n if (!dv) return;\n\n dv.filterCondition(filterRules);\n dv.reloadData();\n };\n\n this._handler_busy = () => {\n this.busy();\n };\n\n this._handler_ready = () => {\n this.ready();\n };\n }\n\n ui() {\n const ids = this.ids;\n\n const baseView = this.view;\n\n this.filterUI = baseView.filterHelper; // component(/* App, idBase */);\n this.linkPage = baseView.linkPageHelper.component(/* App, idBase */);\n\n const spacer = {};\n const settings = this.settings;\n\n if (settings.width === 0)\n Object.assign(spacer, {\n width: 1,\n });\n\n const _ui = super.ui([\n {\n borderless: true,\n cols: [\n spacer, // spacer\n {\n borderless: true,\n rows: [\n this.filterUI.ui(), // filter UI\n {\n id: ids.carousel,\n view: \"carousel\",\n cols: [],\n width: settings.width,\n height: settings.height,\n navigation: {\n items: !settings.hideItem,\n buttons: !settings.hideButton,\n type: settings.navigationType,\n },\n on: {\n onShow: () => {\n const activeIndex = $$(\n ids.carousel\n ).getActiveIndex();\n\n this.switchImage(activeIndex);\n },\n },\n },\n ],\n },\n spacer, // spacer\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n // make sure each of our child views get .init() called\n async init(AB) {\n await super.init(AB);\n\n const dv = this.datacollection;\n\n if (!dv) {\n AB.notify.builder(`Datacollection is ${dv}`, {\n message: \"This is an invalid datacollection\",\n });\n\n return;\n }\n\n const object = dv.datasource;\n\n if (!object) {\n AB.notify.developer(`Object is ${dv}`, {\n message: \"This is an invalid object\",\n });\n\n return;\n }\n\n dv.removeListener(\"loadData\", this._handler_doOnShow);\n dv.on(\"loadData\", this._handler_doOnShow);\n\n dv.removeListener(\"update\", this._handler_doReload);\n dv.on(\"update\", this._handler_doReload);\n\n dv.removeListener(\"delete\", this._handler_doReload);\n dv.on(\"delete\", this._handler_doReload);\n\n dv.removeListener(\"create\", this._handler_doReload);\n dv.on(\"create\", this._handler_doReload);\n\n dv.removeListener(\"initializingData\", this._handler_busy);\n dv.on(\"initializingData\", this._handler_busy);\n\n dv.removeListener(\"initializedData\", this._handler_ready);\n dv.on(\"initializedData\", this._handler_ready);\n\n if (this.settings.filterByCursor) {\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n dv.removeListener(key, this._handler_doOnShow);\n dv.on(key, this._handler_doOnShow);\n });\n }\n\n const baseView = this.view;\n\n // filter helper\n baseView.filterHelper.objectLoad(object);\n baseView.filterHelper.viewLoad(this);\n\n this.filterUI.init(this.AB);\n this.filterUI.removeListener(\"filter.data\", this._handler_doFilter);\n this.filterUI.on(\"filter.data\", this._handler_doFilter);\n\n // link page helper\n this.linkPage.init({\n view: baseView,\n datacollection: dv,\n });\n\n // set data-cy\n const $carouselView = $$(this.ids.carousel)?.$view;\n\n if ($carouselView) {\n $carouselView.setAttribute(\n \"data-cy\",\n `${baseView.key} ${baseView.id}`\n );\n $carouselView\n .querySelector(\".webix_nav_button_prev\")\n ?.firstElementChild?.setAttribute(\n \"data-cy\",\n `${baseView.key} button previous ${baseView.id}`\n );\n $carouselView\n .querySelector(\".webix_nav_button_next\")\n ?.firstElementChild?.setAttribute(\n \"data-cy\",\n `${baseView.key} button next ${baseView.id}`\n );\n }\n }\n\n /**\n * @method detatch()\n * Will make sure all our handlers are removed from any object\n * we have attached them to.\n *\n * You'll want to call this in situations when we are dynamically\n * creating and recreating instances of the same Widget (like in\n * the ABDesigner).\n */\n detatch() {\n const dv = this.datacollection;\n\n if (!dv) return;\n\n dv.removeListener(\"loadData\", this._handler_doOnShow);\n\n if (this._handler_doReload) {\n dv.removeListener(\"update\", this._handler_doReload);\n dv.removeListener(\"delete\", this._handler_doReload);\n dv.removeListener(\"create\", this._handler_doReload);\n }\n\n dv.removeListener(\"initializingData\", this._handler_busy);\n\n dv.removeListener(\"initializedData\", this._handler_ready);\n\n if (this.settings.filterByCursor)\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n dv.removeListener(key, this._handler_doOnShow);\n });\n\n this.filterUI.removeListener(\"filter.data\", this._handler_doOnShow);\n }\n\n myTemplate(row) {\n if (row?.src) {\n const settings = this.settings;\n\n return ``;\n }\n // empty image\n else return \"\";\n }\n\n busy() {\n const $carousel = $$(this.ids.carousel);\n\n $carousel?.disable();\n $carousel?.showProgress?.({ type: \"icon\" });\n }\n\n ready() {\n const $carousel = $$(this.ids.carousel);\n\n $carousel?.enable();\n $carousel?.hideProgress?.();\n }\n\n async switchImage(currentPosition) {\n const dv = this.datacollection;\n\n if (!dv) return;\n\n // Check want to load more images\n if (\n currentPosition >= this._imageCount - 1 && // check last image\n dv.totalCount > this._rowCount\n ) {\n // loading cursor\n this.busy();\n\n try {\n await dv.loadData(this._rowCount || 0);\n } catch (err) {\n this.AB.notify.developer(err, {\n message:\n \"ABViewCarousel:switchImage():Error when load data from a Data collection\",\n });\n }\n\n this.ready();\n }\n }\n\n onShow(fnFilter = this.filterUI.getFilter()) {\n const ids = this.ids;\n const dv = this.datacollection;\n\n if (!dv) return;\n\n const obj = dv.datasource;\n\n if (!obj) return;\n\n const field = this.view.imageField;\n\n if (!field) return;\n\n if (dv.dataStatus == dv.dataStatusFlag.notInitial) {\n // load data when a widget is showing\n dv.loadData();\n\n // it will call .onShow again after dc loads completely\n return;\n }\n\n const settings = this.settings;\n\n let rows = dv.getData(fnFilter);\n\n // Filter images by cursor\n if (settings.filterByCursor) {\n const cursor = dv.getCursor();\n\n if (cursor)\n rows = rows.filter(\n (r) =>\n (r[obj.PK()] || r.id || r) ===\n (cursor[obj.PK()] || cursor.id || cursor)\n );\n }\n\n const images = [];\n\n rows.forEach((r) => {\n const imgFile = r[field.columnName];\n\n if (imgFile) {\n const imgData = {\n id: r.id,\n src: `/file/${imgFile}`,\n imgFile,\n };\n\n // label of row data\n if (settings.showLabel) imgData.label = obj.displayData(r);\n\n images.push({\n css: \"image\",\n borderless: true,\n template: (...params) => {\n return this.myTemplate(...params);\n },\n data: imgData,\n });\n }\n });\n\n const ab = this.AB;\n\n // insert the default image to first item\n if (field.settings.defaultImageUrl)\n images.unshift({\n css: \"image\",\n template: (...params) => this.myTemplate(...params),\n data: {\n id: ab.uuid(),\n src: `/file/${field.settings.defaultImageUrl}`,\n label: this.label(\"Default image\"),\n },\n });\n\n // empty image\n if (images.length < 1)\n images.push({\n rows: [\n {\n view: \"label\",\n align: \"center\",\n height: settings.height,\n label: \"
    \",\n },\n {\n view: \"label\",\n align: \"center\",\n label: this.label(\"No image\"),\n },\n ],\n });\n\n // store total of rows\n this._rowCount = rows.length;\n\n // store total of images\n this._imageCount = images.length;\n\n const $carousel = $$(ids.carousel);\n const abWebix = ab.Webix;\n\n if ($carousel) {\n // re-render\n abWebix.ui(images, $carousel);\n\n // add loading cursor\n abWebix.extend($carousel, abWebix.ProgressBar);\n\n // link pages events\n const editPage = settings.editPage;\n const detailsPage = settings.detailsPage;\n\n // if (detailsPage || editPage) {\n $carousel.$view.onclick = async (e) => {\n if (e.target.className) {\n if (e.target.className.indexOf(\"ab-carousel-edit\") > -1) {\n abWebix.html.removeCss($carousel.getNode(), \"fullscreen\");\n abWebix.fullscreen.exit();\n let rowId = e.target.getAttribute(\"ab-row-id\");\n this.linkPage.changePage(editPage, rowId);\n } else if (\n e.target.className.indexOf(\"ab-carousel-detail\") > -1\n ) {\n abWebix.html.removeCss($carousel.getNode(), \"fullscreen\");\n abWebix.fullscreen.exit();\n let rowId = e.target.getAttribute(\"ab-row-id\");\n this.linkPage.changePage(detailsPage, rowId);\n } else if (\n e.target.className.indexOf(\"ab-carousel-fullscreen\") > -1\n ) {\n $carousel.define(\"css\", \"fullscreen\");\n abWebix.fullscreen.set(ids.carousel, {\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n elements: [\n {},\n {\n view: \"icon\",\n icon: \"fa fa-times\",\n click: function () {\n abWebix.html.removeCss(\n $carousel.getNode(),\n \"fullscreen\"\n );\n abWebix.fullscreen.exit();\n },\n },\n ],\n },\n });\n } else if (\n e.target.className.indexOf(\"ab-carousel-rotate-left\") > -1\n ) {\n const rowId = e.target.getAttribute(\"ab-row-id\");\n const imgFile = e.target.getAttribute(\"ab-img-file\");\n this.rotateImage(rowId, imgFile, field, \"left\");\n } else if (\n e.target.className.indexOf(\"ab-carousel-rotate-right\") > -1\n ) {\n const rowId = e.target.getAttribute(\"ab-row-id\");\n const imgFile = e.target.getAttribute(\"ab-img-file\");\n this.rotateImage(rowId, imgFile, field, \"right\");\n } else if (\n e.target.className.indexOf(\"ab-carousel-zoom-in\") > -1\n ) {\n this.zoom(\"in\");\n } else if (\n e.target.className.indexOf(\"ab-carousel-zoom-out\") > -1\n ) {\n this.zoom(\"out\");\n }\n }\n };\n }\n }\n\n showFilterPopup($view) {\n this.filterUI.showPopup($view);\n }\n\n async rotateImage(rowId, imgFile, field, direction = \"right\") {\n this.busy();\n\n // call api to rotate\n if (direction == \"left\") await field.rotateLeft(imgFile);\n else await field.rotateRight(imgFile);\n\n // refresh image\n const imgElm = document.getElementById(`${this.ids.component}-${rowId}`);\n if (imgElm) {\n await fetch(imgElm.src, { cache: \"reload\", mode: \"no-cors\" });\n imgElm.src = `${imgElm.src}#${new Date().getTime()}`;\n }\n\n this.ready();\n }\n\n zoom(inOrOut = \"in\") {\n const imgContainer = document.getElementsByClassName(\n \"ab-carousel-image-container\"\n )[0];\n if (!imgContainer) return;\n\n const imgElem = imgContainer.getElementsByTagName(\"img\")[0];\n if (!imgElem) return;\n\n const step = 15;\n const height = parseInt(\n (imgElem.style.height || 100).toString().replace(\"%\", \"\")\n );\n const newHeight = inOrOut == \"in\" ? height + step : height - step;\n imgElem.style.height = `${newHeight}%`;\n\n imgContainer.style.overflow = newHeight > 100 ? \"auto\" : \"\";\n }\n}\n","const ABViewChartContainerComponent = require(\"./ABViewChartContainerComponent\");\n\nmodule.exports = class ABViewChartAreaComponent extends (\n ABViewChartContainerComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewChartArea_${baseView.id}`, ids);\n }\n\n ui() {\n const settings = this.settings;\n\n return super.ui({\n view: \"chart\",\n type: settings.areaType,\n yAxis: {\n start: 0,\n step: settings.stepValue, //\"#stepValue#\",\n end: settings.maxValue, //\"#maxValue#\"\n },\n xAxis: {\n template: settings.isLegend\n ? `
    #label#
    `\n : \"\",\n },\n legend: settings.isLegend\n ? {\n template: `
    #label#
    `,\n values: [], // TODO : bug in webix 5.1.7\n }\n : null,\n series: [\n {\n alpha: 0.7,\n value: \"#value#\",\n color: \"#ee4339\",\n },\n {\n alpha: 0.4,\n value: \"#value2#\",\n color: \"#a7ee70\",\n },\n ],\n height: settings.chartHeight,\n // width: settings.chartWidth,\n });\n }\n\n async init(AB) {\n await super.init(AB);\n }\n\n onShow() {\n super.onShow();\n }\n};\n","const ABViewChartContainerComponent = require(\"./ABViewChartContainerComponent\");\n\nmodule.exports = class ABViewChartBarComponent extends (\n ABViewChartContainerComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewChartBar_${baseView.id}`, ids);\n }\n\n ui() {\n const settings = this.settings;\n\n return super.ui({\n view: \"chart\",\n type: settings.barType,\n preset: settings.barPreset,\n value: \"#value#\",\n color: \"#color#\",\n yAxis: {\n start: 0,\n step: settings.stepValue, //\"#stepValue#\",\n end: settings.maxValue, //\"#maxValue#\"\n },\n xAxis: {\n template: settings.isLegend\n ? `
    #label#
    `\n : \"\",\n },\n legend:\n settings.barType === \"bar\" || !settings.barType\n ? settings.isLegend\n ? `
    #label#
    `\n : \"\"\n : settings.isLegend\n ? {\n template: `
    #label#
    `,\n values: [], // TODO : bug in webix 5.1.7\n }\n : null,\n height: settings.height,\n // width: settings.chartWidth,\n });\n }\n\n async init(AB) {\n await super.init(AB);\n }\n\n onShow() {\n super.onShow();\n }\n};\n","const ABViewContainerComponent = require(\"./ABViewContainerComponent\");\n\nmodule.exports = class ABViewChartComponent extends ABViewContainerComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewChart_${baseView.id}`, ids);\n }\n\n async init(AB, accessLevel) {\n await super.init(AB, accessLevel);\n\n const $component = $$(this.ids.component);\n const abWebix = this.AB.Webix;\n\n if ($component) abWebix.extend($component, abWebix.ProgressBar);\n\n const baseView = this.view;\n const dc = this.datacollection;\n\n if (dc) {\n const eventNames = [\n \"changeCursor\",\n \"cursorStale\",\n \"create\",\n \"update\",\n \"delete\",\n \"initializedData\",\n ];\n\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n // QUESTION: is this a problem if the check !(key in (...)) finds\n // an event that some OTHER widget has added and not this one?\n if (\n dc.datacollectionLink &&\n !(key in (dc.datacollectionLink._events ?? []))\n )\n baseView.eventAdd({\n emitter: dc.datacollectionLink,\n eventName: key,\n listener: () => {\n baseView.refreshData();\n },\n });\n });\n\n eventNames.forEach((evtName) => {\n baseView.eventAdd({\n emitter: dc,\n eventName: evtName,\n listener: () => {\n baseView.refreshData();\n },\n });\n });\n }\n\n baseView.refreshData();\n }\n\n onShow() {\n super.onShow();\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewChartContainerComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewChartContainer_${baseView.id}`,\n Object.assign(\n {\n chartContainer: \"\",\n },\n ids\n )\n );\n }\n\n ui(uiChartComponent) {\n const _ui = super.ui([\n Object.assign({ id: this.ids.chartContainer }, uiChartComponent ?? {}),\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n }\n\n onShow() {\n super.onShow();\n // if (!this._isShow) {\n\n // Mark this widget is showing\n const baseView = this.view;\n\n baseView._isShow = true;\n\n this.refreshData(baseView.parent.getDCChart());\n // }\n }\n\n refreshData(dcChart) {\n const $chartContainer = $$(this.ids.chartContainer);\n const $chartComponent = $$(this.ids.component);\n\n if ($chartContainer?.data) $chartContainer.data.sync(dcChart);\n\n setTimeout(() => {\n $chartComponent?.adjust();\n $chartContainer?.adjust();\n }, 160);\n }\n};\n","const ABViewChartContainerComponent = require(\"./ABViewChartContainerComponent\");\n\nmodule.exports = class ABViewChartLineComponent extends (\n ABViewChartContainerComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewChartLine_${baseView.id}`, ids);\n }\n\n ui() {\n const settings = this.settings;\n\n return super.ui({\n view: \"chart\",\n type: settings.lineType,\n preset: settings.linePreset,\n value: \"#value#\",\n color: \"#color#\",\n yAxis: {\n start: 0,\n step: settings.stepValue,\n end: settings.maxValue, //\"#maxValue#\"\n },\n xAxis: {\n template: settings.isLegend\n ? `
    #label#
    `\n : \"\",\n },\n legend: settings.isLegend\n ? {\n template: `
    #label#
    `,\n values: [], // TODO : bug in webix 5.1.7\n }\n : null,\n height: settings.chartHeight,\n // width: settings.chartWidth,\n });\n }\n};\n","const ABViewChartContainerComponent = require(\"./ABViewChartContainerComponent\");\n\nmodule.exports = class ABViewChartPieComponent extends (\n ABViewChartContainerComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewChartPie_${baseView.id}`, ids);\n }\n\n ui() {\n const settings = this.settings;\n\n return super.ui({\n view: \"chart\",\n type: settings.pieType,\n value: \"#value#\",\n color: \"#color#\",\n legend: settings.isLegend\n ? {\n width: this.view.parent.settings.labelWidth,\n template: `
    #label#
    `,\n }\n : null,\n pieInnerText: `
    #value#
    `,\n shadow: 1,\n height: settings.height,\n // width: settings.chartWidth,\n });\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewCommentComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewComment_${baseView.id}`,\n Object.assign(\n {\n comment: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const baseView = this.view;\n const _ui = super.ui([\n {\n id: this.ids.comment,\n view: \"comments\",\n users: baseView.getUserData(),\n currentUser: baseView.getCurrentUserId(),\n height: this.settings.height,\n data: this.getCommentData(),\n on: {\n onBeforeAdd: (id, obj, index) => {\n this.addComment(obj.text, new Date());\n },\n // NOTE: no update event of comment widget !!\n // Updating event handles in .init function\n // https://docs.webix.com/api__ui.comments_onbeforeeditstart_event.html#comment-4509366150\n\n // onAfterEditStart: function (rowId) {\n // let item = this.getItem(rowId);\n\n // _logic.updateComment(rowId, item);\n // },\n onAfterDelete: (rowId) => {\n this.deleteComment(rowId);\n },\n },\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const baseView = this.view;\n\n baseView.__dvEvents = baseView.__dvEvents || {};\n\n const ids = this.ids;\n const $comment = $$(ids.comment);\n\n if ($comment) {\n const $commentList = $comment.queryView({ view: \"list\" });\n\n if ($commentList) {\n // Updating comment event\n if (!baseView.__dvEvents.onStoreUpdated)\n baseView.__dvEvents.onStoreUpdated =\n $commentList.data.attachEvent(\n \"onStoreUpdated\",\n (rowId, data, operate) => {\n if (operate === \"update\") {\n this.updateComment(rowId, (data || {}).text);\n }\n }\n );\n\n // Implement progress bar\n webix.extend($commentList, webix.ProgressBar);\n }\n }\n\n const dv = this.datacollection;\n\n if (!dv) return;\n\n // bind dc to component\n // dv.bind($$(ids.comment));\n\n if (!baseView.__dvEvents.create)\n baseView.__dvEvents.create = dv.on(\"create\", () =>\n this.refreshComment()\n );\n\n if (!baseView.__dvEvents.update)\n baseView.__dvEvents.update = dv.on(\"update\", () =>\n this.refreshComment()\n );\n\n if (!baseView.__dvEvents.delete)\n baseView.__dvEvents.delete = dv.on(\"delete\", () =>\n this.refreshComment()\n );\n\n if (!baseView.__dvEvents.loadData)\n baseView.__dvEvents.loadData = dv.on(\"loadData\", () =>\n this.refreshComment()\n );\n\n $comment.refresh();\n }\n\n getCommentData() {\n const baseView = this.view;\n const dv = this.datacollection;\n\n if (!dv) return null;\n\n const userCol = baseView.getUserField();\n const commentCol = baseView.getCommentField();\n const dateCol = baseView.getDateField();\n\n if (!userCol || !commentCol) return null;\n\n const userColName = userCol.columnName;\n const commentColName = commentCol.columnName;\n const dateColName = dateCol ? dateCol.columnName : null;\n const dataObject = dv.getData();\n const dataList = [];\n\n dataObject.forEach((item, index) => {\n if (item[commentColName]) {\n const user = baseView.getUserData().find((user) => {\n return user.value === item[userColName];\n });\n const data = {\n id: item.id,\n user_id: user ? user.id : 0,\n date: item[dateColName] ? new Date(item[dateColName]) : null,\n default_date: new Date(item[\"created_at\"]),\n text: item[commentColName],\n };\n\n dataList.push(data);\n }\n });\n\n dataList.sort(function (a, b) {\n if (dateColName)\n return new Date(a.date).getTime() - new Date(b.date).getTime();\n else\n return (\n new Date(a.default_date).getTime() -\n new Date(b.default_date).getTime()\n );\n });\n\n return dataList;\n }\n\n refreshComment() {\n const baseView = this.view;\n\n if (baseView.__refreshTimeout) clearTimeout(baseView.__refreshTimeout);\n\n this.busy();\n\n const ids = this.ids;\n\n baseView.__refreshTimeout = setTimeout(() => {\n const $comment = $$(ids.comment);\n\n if (!$comment) return;\n\n // clear comments\n const $commentList = $comment.queryView({ view: \"list\" });\n\n if ($commentList) $commentList.clearAll();\n\n // populate comments\n const commentData = this.getCommentData();\n\n if (commentData) {\n $comment.parse(commentData);\n }\n\n // scroll to the last item\n if ($commentList) $commentList.scrollTo(0, Number.MAX_SAFE_INTEGER);\n\n delete baseView.__refreshTimeout;\n\n this.ready();\n }, 90);\n }\n\n addComment(commentText, dateTime) {\n this.saveData(commentText, dateTime);\n }\n\n async updateComment(rowId, commentText) {\n const baseView = this.view;\n const model = baseView.model();\n\n if (!model) return; // already notified\n\n const commentField = baseView.getCommentField();\n\n if (!commentField) return; // already notified\n\n const values = {};\n\n values[commentField.columnName] = commentText ?? \"\";\n\n return await model.update(rowId, values);\n }\n\n async deleteComment(rowId) {\n const baseView = this.view;\n const model = baseView.model();\n\n if (!model) return;\n\n return await model.delete(rowId);\n }\n\n busy() {\n const ids = this.ids;\n const $comment = $$(ids.comment);\n\n if (!$comment) return;\n\n const $commentList = $comment.queryView({ view: \"list\" });\n\n if (!$commentList) return;\n\n $commentList.disable();\n\n if ($commentList.showProgress)\n $commentList.showProgress({ type: \"icon\" });\n }\n\n ready() {\n const ids = this.ids;\n const $comment = $$(ids.comment);\n\n if (!$comment) return;\n\n const $commentList = $comment.queryView({ view: \"list\" });\n\n if (!$commentList) return;\n\n $commentList.enable();\n\n if ($commentList.hideProgress) $commentList.hideProgress();\n }\n\n async saveData(commentText, dateTime) {\n if (!commentText) return;\n\n const dv = this.datacollection;\n\n if (!dv) return;\n\n const baseView = this.view;\n const model = baseView.model();\n const ab = this.AB;\n\n if (!model) {\n ab.notify.builder(\n {},\n {\n message:\n \"ABViewComment.saveData(): could not pull a model to work with.\",\n viewName: baseView.label,\n }\n );\n\n return;\n }\n\n const comment = {};\n const userField = baseView.getUserField();\n\n if (userField) comment[userField.columnName] = ab.Account.username();\n\n const commentField = baseView.getCommentField();\n\n if (commentField) comment[commentField.columnName] = commentText;\n\n const dateField = baseView.getDateField();\n\n if (dateField) comment[dateField.columnName] = dateTime;\n\n // add parent cursor to default\n const dvLink = dv.datacollectionLink;\n\n if (dvLink?.getCursor()) {\n const objectLink = dvLink.datasource;\n const fieldLink = dv.fieldLink;\n\n if (objectLink && fieldLink) {\n comment[fieldLink.columnName] = {};\n comment[fieldLink.columnName][objectLink.PK()] =\n dvLink.getCursor().id;\n }\n }\n\n return await model.create(comment);\n }\n};\n","/**\n * ABViewComponent\n * A common UI component class for our UI widgets.\n */\nimport ClassUI from \"../../../../ui/ClassUI\";\n\nexport default class ABViewComponent extends ClassUI {\n constructor(baseView, idBase, ids) {\n super(idBase || `ABView_${baseView.id}`, ids);\n\n this.view = baseView;\n this.settings = baseView.settings;\n this.AB = baseView.AB;\n this.datacollection = baseView.datacollections || baseView.datacollection;\n\n this.__events = [];\n // {array}\n // A collection of any listeners we are managing.\n // {\n // emitter: {EventEmitter} the object we are listening on\n // eventName: {string} the event key we are listening for\n // listener: {fn} the function to call on\n // }\n\n this.CurrentObjectID = null;\n // {string}\n // the ABObject.id of the object we are working with.\n\n this.CurrentDatacollectionID = null;\n // {string}\n // the ABDataCollection.id of the DC we are working with\n }\n\n /**\n * @method CurrentObject()\n * A helper to return the current ABObject we are working with.\n * @return {ABObject}\n */\n get CurrentObject() {\n return this.AB.objectByID(this.CurrentObjectID);\n }\n /**\n * @method CurrentDatacollection()\n * A helper to return the current ABDataCollection we are working with.\n * @return {ABDataCollection}\n */\n get CurrentDatacollection() {\n return this.AB.datacollectionByID(this.CurrentDatacollectionID);\n }\n\n ui(uiComponents = []) {\n // an ABView is a collection of rows:\n const _ui = {\n id: this.ids.component,\n view: \"layout\",\n type: \"space\",\n rows: uiComponents,\n };\n\n // if this form is empty, then force a minimal row height\n // so the component isn't completely hidden on the screen.\n // (important in the editor so we don't loose the ability to edit the\n // component)\n if (!_ui.rows.length) _ui.height = 30;\n\n return _ui;\n }\n\n async init(AB) {\n this.AB = AB;\n }\n\n /**\n * @method datacollectionLoad\n *\n * @param datacollection {ABDatacollection}\n */\n datacollectionLoad(datacollection) {\n this.CurrentDatacollectionID = datacollection?.id;\n }\n\n objectLoad(object) {\n this.CurrentObjectID = object?.id;\n }\n\n /**\n * @method eventAdd()\n * Create a new listener on an object. Note, this will prevent multiple\n * listeners being applied to the same Object.\n * @param {object} evt\n * The definition of the event we are adding:\n * {\n * emitter: {EventEmitter} the object we are listening on\n * eventName: {string} the event key we are listening for\n * listener: {fn} the function to call on\n * }\n */\n eventAdd(evt) {\n if (!evt || !evt.emitter || !evt.listener) return;\n\n // make sure we haven't done this before:\n const __events = this.__events;\n const exists = __events.filter(\n (e) => e.emitter === evt.emitter && e.eventName === evt.eventName\n // && e.listener === evt.listener\n );\n\n if (!exists.length) {\n // add to array\n __events.push({\n emitter: evt.emitter,\n eventName: evt.eventName,\n listener: evt.listener,\n });\n\n // listening this event\n evt.emitter.on(evt.eventName, evt.listener);\n }\n }\n\n /**\n * @method eventsClear()\n * Remove all the attached event listeners and reset our tracking.\n */\n eventsClear() {\n this.__events.forEach((evt) => {\n evt.emitter.removeListener(evt.eventName, evt.listener);\n });\n\n this.__events = [];\n }\n\n /**\n * @method waitInitializingDCEvery()\n * Wait until the DC is initialized, checking every millisecond as specified by the parameter\n * @param {number} milliSeconds\n * The amount of milliseconds to recheck DC status.\n * @param {object} dc\n * the AB DC instance.\n */\n\n async waitInitializingDCEvery(milliSeconds, dc) {\n if (!this.__isShowing || dc == null) return;\n // if we manage a datacollection, then make sure it has started\n // loading it's data when we are showing our component.\n // load data when a widget is showing\n if (dc.dataStatus === dc.dataStatusFlag.notInitial) await dc.loadData();\n\n return await new Promise((resolve) => {\n if (dc.dataStatus === dc.dataStatusFlag.initialized) {\n resolve();\n\n return;\n }\n\n const interval = setInterval(() => {\n if (dc.dataStatus === dc.dataStatusFlag.initialized) {\n clearInterval(interval);\n\n resolve();\n }\n }, milliSeconds);\n });\n }\n\n /**\n * @method onShow()\n * perform any preparations necessary when showing this component.\n */\n onShow() {\n // check if tab has a hint\n if (this?.view?.settings?.hintID) {\n // fetch the steps for the hint\n let hint = this.AB.hintID(this.view.settings.hintID);\n if (hint.settings.active) {\n hint.createHintUI();\n }\n }\n // if we manage a datacollection, then make sure it has started\n // loading it's data when we are showing our component.\n const dc = this.datacollection;\n\n if (!dc) return;\n\n if (Array.isArray(dc)) {\n dc.forEach((item) => {\n if (item.dataStatus === item.dataStatusFlag.notInitial)\n // load data when a widget is showing\n item.loadData();\n });\n } else {\n if (dc.dataStatus === dc.dataStatusFlag.notInitial)\n // load data when a widget is showing\n dc.loadData();\n }\n }\n}\n","const ABViewContainerComponent = require(\"./ABViewContainerComponent\");\n\nmodule.exports = class ABViewConditionalContainerComponent extends (\n ABViewContainerComponent\n) {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewConditionalContainer_${baseView.id}`,\n Object.assign(\n {\n batch: \"\",\n },\n ids\n )\n );\n\n this._ifComponent = null;\n this._elseComponent = null;\n\n // Set filter value\n this.__filterComponent = baseView.AB.filterComplexNew(\n `${baseView.id}_filterComponent`\n );\n // this.__filterComponent.applicationLoad(application);\n this.populateFilterComponent();\n }\n\n ui() {\n const _uiConditionalContainer = {\n id: this.ids.batch,\n view: \"multiview\",\n cells: [\n {\n batch: \"wait\",\n view: \"layout\",\n rows: [\n {\n view: \"label\",\n label: this.label(\"Please wait...\"),\n },\n ],\n },\n ],\n };\n const _ui = super.ui([_uiConditionalContainer]);\n\n _uiConditionalContainer.cells.push(\n Object.assign({ batch: \"if\" }, this.ifComponent.ui()),\n Object.assign({ batch: \"else\" }, this.elseComponent.ui())\n );\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB, accessLevel) {\n await super.init(AB, accessLevel);\n\n await Promise.all([\n this.ifComponent.init(AB, accessLevel),\n this.elseComponent.init(AB, accessLevel),\n ]);\n\n this.populateFilterComponent();\n\n const dc = this.datacollection;\n\n if (dc) {\n const baseView = this.view;\n\n // listen DC events\n baseView.eventAdd({\n emitter: dc,\n eventName: \"loadData\",\n listener: () => this.displayView(), // Q? does this need to remain empty param?\n });\n\n baseView.eventAdd({\n emitter: dc,\n eventName: \"initializedData\",\n listener: () => this.displayView(), // Q? does this need to remain empty param?\n });\n\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n baseView.eventAdd({\n emitter: dc,\n eventName: key,\n listener: (...p) => this.displayView(...p),\n });\n });\n }\n\n this.displayView();\n }\n\n onShow() {\n super.onShow();\n\n this.populateFilterComponent();\n this.displayView();\n }\n\n get ifComponent() {\n return (this._ifComponent =\n this._ifComponent ||\n this.view\n .views()\n .find((v) => v?.name === \"If\")\n .component());\n }\n\n get elseComponent() {\n return (this._elseComponent =\n this._elseComponent ||\n this.view\n .views()\n .find((v) => v?.name === \"Else\")\n .component());\n }\n\n displayView(currData) {\n const dc = this.datacollection;\n const ids = this.ids;\n const $batch = $$(ids.batch);\n\n if (dc) {\n if (!currData) currData = dc.getCursor();\n\n // show 'waiting' panel\n if (\n !currData &&\n (dc.dataStatus === dc.dataStatusFlag.notInitial ||\n dc.dataStatus === dc.dataStatusFlag.initializing)\n ) {\n $batch?.showBatch(\"wait\");\n\n return;\n }\n }\n\n const isValid = this.__filterComponent.isValid(currData);\n\n if (isValid) {\n // if (isValid && currData) {\n $batch?.showBatch(\"if\");\n this.ifComponent?.onShow?.();\n } else {\n $batch?.showBatch(\"else\");\n this.elseComponent?.onShow?.();\n }\n }\n\n populateFilterComponent() {\n const dc = this.datacollection;\n const __filterComponent = this.__filterComponent;\n\n if (dc?.datasource) __filterComponent.fieldsLoad(dc.datasource.fields());\n else __filterComponent.fieldsLoad([]);\n\n __filterComponent.setValue(\n this.settings.filterConditions ??\n this.view.constructor.defaultValues().filterConditions\n );\n }\n};\n","import ABViewComponent from \"./ABViewComponent\";\n\nexport default class ABViewConnectDataFilterComponent extends ABViewComponent {\n constructor(baseView, idbase, ids) {\n super(\n baseView,\n idbase || `ABViewConnectDataFilter_${baseView.id}`,\n Object.assign(\n {\n filter: \"\",\n reset: \"\",\n },\n ids\n )\n );\n\n this.field = null;\n }\n\n ui() {\n const ids = this.ids;\n const _ui = super.ui([\n {\n type: \"space\",\n borderless: true,\n cols: [\n {\n view: \"icon\",\n icon: \"fa fa-filter\",\n align: \"left\",\n disabled: true,\n },\n {\n view: \"combo\",\n id: ids.filter,\n labelWidth: this.AB.UISettings.config().labelWidthXLarge,\n disabled: true,\n on: {\n onChange: (id) => this.applyConnectFilter(id),\n },\n },\n {\n view: \"icon\",\n id: ids.reset,\n icon: \"fa fa-times\",\n align: \"left\",\n disabled: true,\n tooltip: this.label(\"Renmove this filter\"),\n on: {\n onItemClick: () => this.resetConnectFilter(),\n },\n },\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const dv = this.datacollection;\n\n if (!dv) return;\n\n const object = dv.datasource;\n\n if (!object) return;\n\n const [field] = object.fields(\n (f) => f.columnName === this.settings.field\n );\n\n if (!field) {\n this.AB.notify.developer(\n `Cannot find field \"${this.settings.field}\" in ${object.name}`,\n {\n context: \"ABViewConnectDataFilterComponent.init()\",\n data: { settings: this.settings },\n }\n );\n\n return;\n }\n\n this.field = field;\n\n const ids = this.ids;\n const suggest = webix.ui({\n view: \"suggest\",\n filter: ({ value }, search) =>\n value.toLowerCase().includes(search.toLowerCase()),\n on: {\n onShow: () => {\n field.populateOptionsDataCy($$(ids.filter), field, {});\n },\n },\n });\n field.getAndPopulateOptions(suggest, null, field);\n\n const $filter = $$(ids.filter);\n\n $filter.define(\"suggest\", suggest);\n $filter.define(\"label\", `${this.label(\"Filter by\")} ${field.label}`);\n $filter.enable();\n $filter.refresh();\n }\n\n resetConnectFilter() {\n const ids = this.ids;\n const dc = this.datacollection;\n\n dc.filterCondition({ glue: \"and\", rules: [] });\n dc.reloadData();\n // Block applyConnectFields() from triggering\n\n const $filter = $$(ids.filter);\n\n $filter.blockEvent();\n $filter.setValue();\n $filter.unblockEvent();\n $$(ids.reset).disable();\n }\n\n applyConnectFilter(connectId) {\n const filterRule = {\n key: this.field.id,\n rule: \"equals\",\n value: connectId,\n };\n const dc = this.datacollection;\n\n dc.filterCondition({ glue: \"and\", rules: [filterRule] });\n dc.reloadData();\n $$(this.ids.reset).enable();\n }\n}\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewContainerComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewContainer_${baseView.id}`, ids);\n\n this.idBase = idBase;\n this.options = null;\n\n this.viewComponents = {\n /* view.id : {viewComponent} */\n };\n // {hash}\n // a reference of all our child views that we manage\n\n this.viewComponentIDs = {\n /* view.id : {viewComponent} */\n };\n // {hash}\n // a reference of all our child.ui().ids of the views we manage\n\n this._handlerChangePage = (pageId) => {\n baseView.changePage(pageId);\n };\n }\n\n ui(uiComponents) {\n // Generate rows & cols of views to .layout\n const views = this.view.viewsSortByPosition();\n const rowViews = this.getElements(views);\n const _ui = super.ui(uiComponents || rowViews);\n\n delete _ui.type;\n\n return _ui;\n }\n\n // make sure each of our child views get .init() called\n async init(AB, accessLevel = 0, options = {}) {\n await super.init(AB);\n\n this.options = options;\n\n const allInits = [];\n\n // // register our callbacks:\n // if (options) {\n // for (var c in _logic.callbacks) {\n // _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n // }\n // }\n\n // see access by CSS class\n $$(this.ids.component)?.define(\"css\", `accessLevel-${accessLevel}`);\n\n const viewComponents = this.viewComponents;\n\n // attach all the .UI views:\n for (const key in viewComponents) {\n // skip when the view is removed.\n if (\n !viewComponents[key] ??\n !this.view.views((v) => v.id === key).length\n )\n continue;\n\n // Initial component along with options in case there are callbacks we need to listen for\n if (accessLevel) {\n allInits.push(viewComponents[key].init(AB, accessLevel, options));\n\n continue;\n }\n\n $$(this.viewComponentIDs[key])?.hide();\n }\n\n await Promise.all(allInits);\n }\n\n getElements(views) {\n const rows = [];\n const componentMap = {};\n\n let curRowIndex;\n let curColIndex;\n\n const settings = this.settings;\n const defaultSettings = this.view.constructor.defaultValues();\n\n views.forEach((v) => {\n // let component = v.component(/* App, idPrefix */);\n // NOTE: PONG - Just temporary to be compatible old & new versions\n let component;\n\n try {\n component = v.component(this.idBase);\n // make sure any existing handlers for changePage are removed.\n v.removeAllListeners(\"changePage\");\n } catch (err) {\n component = v.component(this.idBase);\n\n const ui = component.ui;\n\n component.ui = (() => ui).bind(component);\n }\n\n this.viewComponents[v.id] = component;\n\n ////\n //// TODO: figure out the embedded Callbacks => emit()\n ////\n // if key == \"form\" or \"button\" register the callbacks to the parent\n // NOTE this will only work on the last form of a page!\n // if (v.key == \"form\" && v._logic.callbacks) {\n // _logic.callbacks = v._logic.callbacks;\n // }\n\n // Create a new row\n if (v.position.y == null || v.position.y !== curRowIndex) {\n curRowIndex = v.position.y || rows.length;\n curColIndex = 0;\n\n const rowNew = {\n cols: [],\n };\n\n // Create columns following setting value\n const colNumber = settings.columns || defaultSettings.columns;\n\n for (let i = 0; i < colNumber; i++)\n rowNew.cols.push({\n gravity: settings.gravity?.[i]\n ? parseInt(settings.gravity[i])\n : defaultSettings.gravity,\n });\n\n rows.push(rowNew);\n }\n\n // Get the last row\n const rowIndx = rows.length - 1;\n const curRow = rows[rowIndx];\n const newPos = v.position.x ?? 0;\n const mapKey = `${rowIndx}-${newPos}`;\n\n let getGrav = 1;\n\n if (componentMap[mapKey])\n console.error(\n `Component[${component?.ids?.component}] is overwriting component[${componentMap[mapKey].ids?.component}]. <-- Reorder them to fix.`\n );\n\n componentMap[mapKey] = component;\n\n if (curRow.cols[newPos]?.gravity)\n getGrav = curRow.cols[newPos].gravity;\n\n const _ui = component.ui();\n\n this.viewComponentIDs[v.id] = _ui.id;\n _ui.gravity = getGrav;\n\n // Add ui of sub-view to column\n curRow.cols[newPos] = _ui;\n\n // Trigger 'changePage' event to parent\n this.eventAdd({\n emitter: v,\n eventName: \"changePage\",\n listener: this._handlerChangePage,\n });\n\n curColIndex++;\n });\n\n return rows;\n }\n\n onShow() {\n super.onShow();\n\n // calll .onShow in child components\n Object.values(this.viewComponents).forEach((val) => {\n val.onShow?.();\n });\n }\n};\n","import ABViewComponent from \"./ABViewComponent\";\nimport ABPopupSortField from \"../ABViewGridPopupSortFields\";\nimport ABViewCustomFilter from \"../viewProperties/ABViewPropertyFilterData\";\nimport _ from \"lodash\";\n\nexport default class ABViewDataFilterComponent extends ABViewComponent {\n constructor(baseView, idbase, ids) {\n super(\n baseView,\n idbase || `ABViewDataFilter_${baseView.id}`,\n Object.assign(\n {\n filter: \"\",\n reset: \"\",\n sortButton: \"\",\n filterButton: \"\",\n globalSearchToolbar: \"\",\n },\n ids\n )\n );\n\n this._handler_filterData = (fnFilter, filterRules) => {\n this.callbackFilterData(fnFilter, filterRules); // be notified when there is a change in the filter\n };\n\n this.field = null;\n const ab = this.AB;\n\n // {ABViewGridPopupSortFields}\n // The popup for adding sort criteria to our grid.\n this.PopupSortComponent = new ABPopupSortField(\n `ABViewDataFilter_Sort_Popup_${this.settings.dataviewID}`\n );\n this.PopupSortComponent.init(ab);\n this.PopupSortComponent.on(\"changed\", (sortOptions) => {\n this.callbackSortData(sortOptions);\n });\n\n this.filterHelper = new ABViewCustomFilter(\n this.AB,\n `ABViewDataFilter_Filter_Popup_${this.settings.dataviewID}`\n );\n this.filterHelper.settings = {\n filterOption: 1,\n userFilterPosition: \"toolbar\",\n isGlobalToolbar: 1,\n };\n this.filterHelper.init(ab);\n this.detatch();\n this.filterHelper.on(\"filter.data\", this._handler_filterData);\n }\n\n advancedUI() {\n const compId = this.ids.component;\n return [\n {\n css: \"bg_gray\",\n maxHeight: 60,\n rows: [\n {},\n {\n cols: [\n {\n width: 18,\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-filter\",\n width: 40,\n id: this.ids.filterButton,\n css: `webix_primary abFilterButton${this.settings.dataviewID}`,\n click: (id, event) => {\n this.toolbarFilter($$(this.ids.filterButton).$view);\n },\n on: {\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `${compId} filter button`\n );\n },\n },\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-sort\",\n width: 40,\n id: this.ids.sortButton,\n css: `webix_primary abSortButton${this.settings.dataviewID}`,\n click: (id, event) => {\n this.openSort($$(this.ids.sortButton).$view);\n },\n on: {\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `${compId} sort button`\n );\n },\n },\n },\n {\n id: this.ids.globalSearchToolbar,\n view: \"search\",\n placeholder: this.label(\"Search..\"),\n css: `abGlobalSearchField${this.settings.dataviewID}`,\n width: 0,\n attributes: {\n \"data-cy\": `${this.ids.component} global search`,\n datacollection: this.settings.dataviewID,\n },\n on: {\n onTimedKeyPress: () => {\n const searchText = $$(\n this.ids.globalSearchToolbar\n ).getValue();\n // store search text in datacollection because\n // it is shared amoung the similar filterHelpers\n const dc = this.datacollection;\n dc.settings.objectWorkspace.searchText =\n searchText;\n\n this.filterHelper.externalSearchText(searchText);\n },\n },\n },\n {\n width: 18,\n },\n ],\n },\n {},\n ],\n },\n ];\n }\n\n connectedFieldUI() {\n return [\n {\n css: \"bg_gray\",\n maxHeight: 60,\n cols: [\n {\n width: 18,\n },\n {\n rows: [\n {},\n {\n view: \"abslayout\",\n cells: [\n {\n css: \"bg_gray\",\n view: \"combo\",\n id: this.ids.filter,\n labelWidth: 0,\n relative: true,\n disabled: true,\n on: {\n onChange: (id) => {\n this.applyConnectFilter(\n $$(this.ids.filter).getList().getItem(id)\n );\n },\n },\n },\n {\n view: \"icon\",\n id: this.ids.reset,\n icon: \"fa fa-times\",\n right: 24,\n top: 7,\n width: 24,\n height: 24,\n hidden: true,\n tooltip: this.label(\"Remove this filter\"),\n on: {\n onItemClick: () =>\n $$(this.ids.filter).setValue(),\n },\n },\n ],\n },\n {},\n ],\n },\n {\n width: 18,\n },\n ],\n },\n ];\n }\n\n ui() {\n if (\n !this.settings?.dataviewID ||\n (this.settings?.viewType !== \"advanced\" && !this.settings?.field)\n )\n return { height: 1, id: this.ids.component };\n\n const ui =\n this.settings.viewType == \"advanced\"\n ? this.advancedUI()\n : this.connectedFieldUI();\n const _ui = super.ui(ui);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const dv = this.datacollection;\n\n if (!dv) return;\n\n const object = dv.datasource;\n\n if (!object) return;\n\n if (this.settings.viewType == \"advanced\") {\n if (this.settings.showSort) {\n this.PopupSortComponent.objectLoad(object);\n // if there are some preset sorts show them to user\n this.PopupSortComponent.setSettings(\n dv?.settings?.objectWorkspace?.sortFields\n );\n } else {\n $$(this.ids.sortButton).hide();\n }\n if (this.settings.showFilter) {\n this.filterHelper.objectLoad(object);\n } else {\n $$(this.ids.filterButton).hide();\n }\n } else if (this.settings.viewType == \"connected\") {\n const [field] = object.fields(\n (f) => f.columnName === this.settings.field\n );\n\n if (!field) {\n this.AB.notify.developer(\n `Cannot find field \"${this.settings.field}\" in ${object.name}`,\n {\n context: \"ABViewDataFilterComponent.init()\",\n data: { settings: this.settings },\n }\n );\n\n return;\n }\n\n this.field = field;\n\n const ids = this.ids;\n const suggest = webix.ui({\n view: \"suggest\",\n filter: ({ value }, search) =>\n value.toLowerCase().includes(search.toLowerCase()),\n on: {\n onShow: () => {\n field.populateOptionsDataCy($$(ids.filter), field, {});\n },\n },\n showAllOptions: true,\n });\n field.getAndPopulateOptions(suggest, null, field);\n\n const $filter = $$(ids.filter);\n\n $filter.define(\"suggest\", suggest);\n $filter.define(\n \"placeholder\",\n `${this.label(\"Filter by\")} ${field.label}`\n );\n $filter.enable();\n $filter.refresh();\n }\n }\n\n onShow() {\n super.onShow();\n this.updateUI();\n }\n\n applyConnectFilter(rowData) {\n let connectedVal = rowData?.id ?? null;\n\n if (\n connectedVal &&\n this.field.settings?.isCustomFK &&\n this.field.settings?.isSource\n ) {\n connectedVal =\n (this.field.indexField\n ? rowData[this.field.indexField.columnName]\n : null) ?? // custom index\n (this.field.indexField2\n ? rowData[this.field.indexField2.columnName]\n : null) ?? // custom index 2\n rowData.id ??\n rowData;\n }\n\n let filterRule = [];\n if (connectedVal) {\n $$(this.ids.reset).show();\n filterRule = [\n {\n key: this.field.id,\n rule: \"equals\",\n value: connectedVal,\n },\n ];\n } else {\n $$(this.ids.reset).hide();\n }\n const dc = this.datacollection;\n\n dc.filterCondition({ glue: \"and\", rules: filterRule });\n dc.reloadData();\n }\n\n openSort($view) {\n this.PopupSortComponent.show($view);\n }\n\n /**\n * @method callbackSortData()\n * Process the provided sort options from our sort ui.\n * @param {array} sortRules\n * Any Sort Rules added by the user.\n */\n async callbackSortData(sortRules = []) {\n const dc = this.datacollection;\n if (!_.isEqual(dc?.settings?.objectWorkspace?.sortFields, sortRules)) {\n dc.settings.objectWorkspace.sortFields = sortRules;\n await this.datacollection.reloadData();\n }\n this.updateUI();\n }\n\n /**\n * @method callbackFilterData()\n * Process the provided filter options from our filterHelper.\n * @param {fn} fnFilter\n * A function that returns true/false for each row of data\n * to determine if is should exist.\n * @param {array} filterRules\n * Any Filter Rules added by the user.\n */\n callbackFilterData(fnFilter, filterRules = []) {\n const dc = this.datacollection;\n if (!_.isEqual(dc?.__filterCond, filterRules)) {\n dc.filterCondition(filterRules);\n dc.reloadData();\n this.updateUI();\n }\n }\n\n toolbarFilter($view) {\n this.filterHelper.showPopup($view);\n }\n\n updateUI() {\n const dc = this.datacollection;\n\n if (!dc) return;\n\n var filterButtons = document.getElementsByClassName(\n `abFilterButton${this.settings.dataviewID}`\n );\n\n const onlyFilterRules = this.filterHelper.filterRules();\n let filterBadge =\n onlyFilterRules?.rules?.length > 0\n ? onlyFilterRules?.rules?.length\n : null;\n for (let b of filterButtons) {\n $$(b).define(\"badge\", filterBadge);\n $$(b).refresh();\n }\n\n var sortButtons = document.getElementsByClassName(\n `abSortButton${this.settings.dataviewID}`\n );\n\n const onlySortRules = dc.settings.objectWorkspace.sortFields;\n let sortBadge = onlySortRules?.length > 0 ? onlySortRules?.length : null;\n\n for (let b of sortButtons) {\n $$(b).define(\"badge\", sortBadge);\n $$(b).refresh();\n }\n\n var searchFields = document.getElementsByClassName(\n `abGlobalSearchField${this.settings.dataviewID}`\n );\n\n const searchText = dc.settings.objectWorkspace.searchText;\n if (searchText != null) {\n for (let s of searchFields) {\n var activeElement = document.activeElement;\n if (\n activeElement?.attributes?.datacollection?.value ==\n this.settings.dataviewID &&\n activeElement == s.getElementsByTagName(\"input\")[0]\n ) {\n // skip the already selected input\n } else {\n $$(s).setValue(searchText);\n }\n }\n }\n }\n\n detatch() {\n this.filterHelper.removeListener(\"filter.data\", this._handler_filterData);\n // this.datacollection?.removeListener(\"changeCursor\", this.handler_select);\n }\n}\n","import ABViewComponent from \"./ABViewComponent\";\nexport default class ABViewDataSelectComponent extends ABViewComponent {\n constructor(baseView, idbase, ids) {\n super(\n baseView,\n idbase || `ABViewDataSelect_${baseView.id}`,\n Object.assign(\n {\n select: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const _ui = super.ui([\n {\n view: \"combo\",\n id: this.ids.select,\n on: {\n onChange: (n, o) => {\n if (n !== o) this.cursorChange(n);\n },\n },\n },\n ]);\n delete _ui.type;\n\n return _ui;\n }\n\n async onShow() {\n super.onShow();\n const dc = this.datacollection;\n if (!dc) return;\n await dc.waitReady();\n const labelField = this.AB.definitionByID(\n this.settings.labelField\n )?.columnName;\n const options = dc\n .getData()\n .map((o) => ({ id: o.id, value: o[labelField] }))\n .sort((a, b) => (a.value > b.value ? 1 : -1));\n const $select = $$(this.ids.select);\n $select.define(\"options\", options);\n $select.refresh();\n $select.setValue(dc.getCursor().id);\n }\n\n cursorChange(n) {\n this.datacollection.setCursor(n);\n }\n}\n","const ABViewComponent = require(\"./ABViewComponent\").default;\nconst ABViewDetailComponent = require(\"./ABViewDetailComponent\");\nconst ABViewPropertyLinkPage =\n require(\"../viewProperties/ABViewPropertyLinkPage\").default;\n\nmodule.exports = class ABViewDataviewComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewDataview_${baseView.id}`,\n Object.assign(\n {\n dataview: \"\",\n reload: \"\",\n },\n ids\n )\n );\n\n this.linkPage = null;\n }\n\n ui() {\n // NOTE: need to initial the detail component here\n // because its dom width & height values are used .template function\n this.initDetailComponent();\n\n const ids = this.ids;\n const L = (...params) => (this.AB ?? AB).Multilingual.label(...params);\n const _ui = super.ui([\n {\n view: \"layout\",\n rows: [\n {\n id: ids.reload,\n view: \"button\",\n value: L(\"New data available. Click to reload.\"),\n css: \"webix_primary webix_warn\",\n hidden: true,\n click: (id, event) => {\n this.reloadData();\n },\n },\n {\n id: ids.dataview,\n view: \"dataview\",\n scroll: \"y\",\n sizeToContent: true,\n css: \"borderless transparent\",\n xCount: this.settings.xCount != 1 ? this.settings.xCount : 0,\n height: this.settings.height,\n template: (item) => this.itemTemplate(item),\n on: {\n onAfterRender: () => {\n this.applyClickEvent();\n this.addCyAttribute();\n },\n },\n },\n ],\n },\n ]);\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const dc = this.datacollection;\n if (!dc) return;\n\n // Initial the link page helper\n this.linkPage = this.linkPageHelper.component();\n this.linkPage.init({\n view: this.view,\n datacollection: dc,\n });\n\n const ids = this.ids;\n const $dataView = $$(ids.dataview);\n AB.Webix.extend($dataView, AB.Webix.ProgressBar);\n dc.bind($dataView);\n\n this.initRefreshWarning();\n\n window.addEventListener(\"resize\", () => {\n clearTimeout(this._resizeEvent);\n this._resizeEvent = setTimeout(() => {\n this.resize($dataView.getParentView());\n delete this._resizeEvent;\n }, 20);\n });\n }\n\n /**\n * @method initRefreshWarning\n *\n */\n initRefreshWarning() {\n const dc = this.datacollection;\n const includeInQuery =\n (dc?.settings?.objectWorkspace?.filterConditions?.rules ?? []).filter(\n (r) =>\n [\n \"in_query\",\n \"not_in_query\",\n \"in_query_field\",\n \"not_in_query_field\",\n ].includes(r.rule)\n ).length > 0;\n\n if (!includeInQuery) return;\n [\n \"ab.datacollection.create\",\n \"ab.datacollection.update\",\n \"ab.datacollection.delete\",\n ].forEach((eventKey) => {\n dc.on(eventKey, (data) => {\n if (data.objectId == dc.datasource.id)\n this.showRefreshWarning(data);\n });\n });\n }\n\n showRefreshWarning() {\n if (this.__throttleRefreshWarning)\n clearTimeout(this.__throttleRefreshWarning);\n\n this.__throttleRefreshWarning = setTimeout(() => {\n $$(this.ids.reload)?.show();\n }, 200);\n }\n\n reloadData() {\n const dc = this.datacollection;\n dc?.reloadData();\n\n $$(this.ids.reload)?.hide();\n }\n\n onShow() {\n super.onShow();\n\n this.resize();\n }\n\n resize(base_element) {\n const $dataview = $$(this.ids.dataview);\n if (!$dataview) {\n // Not sure if its a problem so notify\n this.AB.notify.developer(\n new Error(\"Resize called on missing dataview component\"),\n { context: \"ABViewDataviewComponent.resize()\", ids: this.ids }\n );\n return;\n }\n $dataview.resize();\n\n const item_width = this.getItemWidth(base_element);\n $dataview.customize({ width: item_width });\n $dataview.getTopParentView?.().resize?.();\n }\n\n initDetailComponent() {\n const detailUI = this.getDetailUI();\n this._detail_ui = this.AB.Webix.ui(detailUI);\n\n // 2 - Always allow access to components inside data view\n this.detailComponent.init(null, 2);\n }\n\n getDetailUI() {\n const detailCom = this.detailComponent;\n const editPage = this.settings.editPage;\n const detailsPage = this.settings.detailsPage;\n\n const _ui = detailCom.ui();\n // adjust the UI to make sure it will look like a \"card\"\n _ui.type = \"clean\";\n _ui.css = \"ab-detail-view\";\n\n if (detailsPage || editPage) {\n _ui.css += ` ab-detail-hover ab-record-#itemId#`;\n\n if (detailsPage) _ui.css += \" ab-detail-page\";\n if (editPage) _ui.css += \" ab-edit-page\";\n }\n\n return _ui;\n }\n\n itemTemplate(item) {\n const detailCom = this.detailComponent;\n const $dataview = $$(this.ids.dataview);\n const $detail_item = this._detail_ui;\n\n // Mock up data to initialize height of item\n if (!item || !Object.keys(item).length) {\n item = item ?? {};\n this.datacollection?.datasource?.fields().forEach((f) => {\n switch (f.key) {\n case \"string\":\n case \"LongText\":\n item[f.columnName] = \"Lorem Ipsum\";\n break;\n case \"date\":\n case \"datetime\":\n item[f.columnName] = new Date();\n break;\n case \"number\":\n item[f.columnName] = 7;\n break;\n }\n });\n }\n detailCom.displayData(item);\n\n const itemWidth =\n $dataview.data.count() > 0\n ? $dataview.type.width\n : ($detail_item.$width - 20) / this.settings.xCount;\n\n const itemHeight =\n $dataview.data.count() > 0\n ? $dataview.type.height\n : $detail_item.getChildViews()?.[0]?.$height;\n\n const tmp_dom = document.createElement(\"div\");\n tmp_dom.appendChild($detail_item.$view);\n\n $detail_item.define(\"width\", itemWidth - 24);\n $detail_item.define(\"height\", itemHeight + 15);\n $detail_item.adjust();\n\n // Add cy attributes\n this.addCyItemAttributes(tmp_dom, item);\n\n return tmp_dom.innerHTML.replace(/#itemId#/g, item.id);\n }\n\n getItemWidth(base_element) {\n const $dataview = $$(this.ids.dataview);\n\n let currElem = base_element ?? $dataview;\n let parentWidth = currElem?.$width;\n while (currElem) {\n if (\n currElem.config.view == \"scrollview\" ||\n currElem.config.view == \"layout\"\n )\n parentWidth =\n currElem?.$width < parentWidth ? currElem?.$width : parentWidth;\n\n currElem = currElem?.getParentView?.();\n }\n\n if (!parentWidth)\n parentWidth = $dataview?.getParentView?.().$width || window.innerWidth;\n\n if (parentWidth > window.innerWidth) parentWidth = window.innerWidth;\n\n // check if the browser window minus webix default padding is the same as the parent window\n // if so we need to check to see if there is a sidebar and reduce the usable space by the\n // width of the sidebar\n if (window.innerWidth - 19 <= parentWidth) {\n const $sidebar = this.getTabSidebar();\n if ($sidebar) {\n parentWidth -= $sidebar.$width;\n }\n }\n\n const recordWidth = Math.floor(parentWidth / this.settings.xCount);\n\n return recordWidth;\n }\n\n getTabSidebar() {\n const $dataview = $$(this.ids.dataview);\n let $sidebar;\n let currElem = $dataview;\n while (currElem && !$sidebar) {\n $sidebar = (currElem.getChildViews?.() ?? []).filter(\n (item) => item?.config?.view == \"sidebar\"\n )[0];\n\n currElem = currElem?.getParentView?.();\n }\n\n return $sidebar;\n }\n\n applyClickEvent() {\n const editPage = this.settings.editPage;\n const detailsPage = this.settings.detailsPage;\n if (!detailsPage && !editPage) return;\n\n const $dataview = $$(this.ids.dataview);\n if (!$dataview) return;\n\n $dataview.$view.onclick = (e) => {\n let clicked = false;\n let divs = e.path ?? [];\n\n // NOTE: Some web browser clients do not support .path\n if (!divs.length) {\n divs.push(e.target);\n divs.push(e.target.parentNode);\n }\n\n if (editPage) {\n for (let p of divs) {\n if (\n p.className &&\n p.className.indexOf(\"webix_accordionitem_header\") > -1\n ) {\n clicked = true;\n p.parentNode.parentNode.classList.forEach((c) => {\n if (c.indexOf(\"ab-record-\") > -1) {\n // var record = parseInt(c.replace(\"ab-record-\", \"\"));\n const record = c.replace(\"ab-record-\", \"\");\n this.linkPage.changePage(editPage, record);\n // com.logic.toggleTab(detailsTab, ids.component);\n }\n });\n break;\n }\n }\n }\n\n if (detailsPage && !clicked) {\n for (let p of divs) {\n if (\n p.className &&\n p.className.indexOf(\"webix_accordionitem\") > -1\n ) {\n p.parentNode.parentNode.classList.forEach((c) => {\n if (c.indexOf(\"ab-record-\") > -1) {\n // var record = parseInt(c.replace(\"ab-record-\", \"\"));\n const record = c.replace(\"ab-record-\", \"\");\n this.linkPage.changePage(detailsPage, record);\n // com.logic.toggleTab(detailsTab, ids.component);\n }\n });\n\n break;\n }\n }\n }\n };\n }\n\n addCyAttribute() {\n const baseView = this.view;\n const $dataview = $$(this.ids.dataview);\n const name = (baseView.name ?? \"\").replace(\".dataview\", \"\");\n\n $dataview.$view.setAttribute(\n \"data-cy\",\n `dataview container ${name} ${baseView.id}`\n );\n }\n\n addCyItemAttributes(dom, item) {\n const baseView = this.view;\n const uuid = item.uuid;\n const name = (baseView.name ?? \"\").replace(\".dataview\", \"\");\n dom.querySelector(\".webix_accordionitem_body\")?.setAttribute(\n \"data-cy\",\n `dataview item ${name} ${uuid} ${baseView.id}`\n );\n dom.querySelector(\".webix_accordionitem_button\")?.setAttribute(\n \"data-cy\",\n `dataview item button ${name} ${uuid} ${baseView.id}`\n );\n }\n\n get detailComponent() {\n return (this._detailComponent =\n this._detailComponent ??\n new ABViewDetailComponent(\n this.view,\n `${this.ids.component}_detail_view`\n ));\n }\n\n get linkPageHelper() {\n return (this.__linkPageHelper =\n this.__linkPageHelper || new ABViewPropertyLinkPage());\n }\n};\n","const ABViewDetailItemComponent = require(\"./ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailCheckboxComponent extends (\n ABViewDetailItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetailCheckbox_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field();\n\n return super.ui({\n on: {\n //Add data-cy attribute for Cypress Testing\n onAfterRender: () => {\n const dataCy = `detail checkbox ${field?.columnName} ${\n field?.id\n } ${baseView.parentDetailComponent()?.id ?? baseView.parent.id}`;\n\n $$(this.ids.detailItem)?.$view.setAttribute(\"data-cy\", dataCy);\n },\n },\n });\n }\n\n setValue(val) {\n let checkbox = \"\";\n\n // Check\n if (val && JSON.parse(val))\n checkbox =\n '';\n // Uncheck\n else checkbox = '';\n\n super.setValue(checkbox);\n }\n};\n","const ABObjectQuery = require(\"../../ABObjectQuery\");\nconst ABViewContainerComponent = require(\"./ABViewContainerComponent\");\n\nmodule.exports = class ABViewDetailComponent extends ABViewContainerComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetail_${baseView.id}`, ids);\n this.idBase = idBase;\n }\n\n ui() {\n let _ui = super.ui();\n\n // this wrapper allows the detail view to have a\n // card appearance as well as enables the edit and\n // details functions to work when clicked\n return {\n type: \"form\",\n id: this.ids.component,\n borderless: true,\n rows: [\n {\n body: _ui,\n },\n ],\n };\n }\n\n onShow() {\n const baseView = this.view;\n\n try {\n const dataCy = `Detail ${baseView.name?.split(\".\")[0]} ${baseView.id}`;\n\n $$(this.ids.component)?.$view.setAttribute(\"data-cy\", dataCy);\n } catch (e) {\n console.warn(\"Problem setting data-cy\", e);\n }\n\n // listen DC events\n const dv = this.datacollection;\n\n if (dv) {\n const currData = dv.getCursor();\n\n if (currData) this.displayData(currData);\n\n [\"changeCursor\", \"cursorStale\", \"collectionEmpty\"].forEach((key) => {\n this.eventAdd({\n emitter: dv,\n eventName: key,\n listener: (...p) => this.displayData(...p),\n });\n });\n\n this.eventAdd({\n emitter: dv,\n eventName: \"create\",\n listener: (createdRow) => {\n const currCursor = dv.getCursor();\n\n if (currCursor?.id === createdRow.id)\n this.displayData(createdRow);\n },\n });\n\n this.eventAdd({\n emitter: dv,\n eventName: \"update\",\n listener: (updatedRow) => {\n const currCursor = dv.getCursor();\n\n if (currCursor?.id === updatedRow.id)\n this.displayData(updatedRow);\n },\n });\n }\n\n super.onShow();\n }\n\n displayData(rowData = {}) {\n // make sure we have data to work with. If null is passed in\n // then pull current cursor.\n if (rowData == null) {\n rowData = this.datacollection.getCursor();\n }\n\n const views = (this.view.views() || []).sort((a, b) => {\n if (!a?.field?.() || !b?.field?.()) return 0;\n\n // NOTE: sort order of calculated fields.\n // FORMULA field type should be calculated before CALCULATE field type\n if (a.field().key === \"formula\" && b.field().key === \"calculate\")\n return -1;\n else if (a.field().key === \"calculate\" && b.field().key === \"formula\")\n return 1;\n\n return 0;\n });\n\n views.forEach((f) => {\n let val;\n\n if (f.field) {\n const field = f.field();\n\n if (!field) return;\n\n // get value of relation when field is a connect field\n switch (field.key) {\n case \"connectObject\":\n val = field.pullRelationValues(rowData);\n\n break;\n\n case \"list\":\n val = rowData?.[field.columnName];\n\n if (!val) {\n val = \"\";\n\n break;\n }\n\n if (field.settings.isMultiple === 0) {\n let myVal = \"\";\n\n field.settings.options.forEach((options) => {\n if (options.id === val) myVal = options.text;\n });\n\n if (field.settings.hasColors) {\n let myHex = \"#66666\";\n let hasCustomColor = \"\";\n\n field.settings.options.forEach((h) => {\n if (h.text === myVal) {\n myHex = h.hex;\n hasCustomColor = \"hascustomcolor\";\n }\n });\n\n myVal = `${myVal}`;\n }\n\n val = myVal;\n } else {\n const items = [];\n\n let myVal = \"\";\n\n val.forEach((value) => {\n let hasCustomColor = \"\";\n let optionHex = \"\";\n\n if (field.settings.hasColors && value.hex) {\n hasCustomColor = \"hascustomcolor\";\n optionHex = `background: ${value.hex};`;\n }\n\n field.settings.options.forEach((options) => {\n if (options.id === value.id) myVal = options.text;\n });\n items.push(\n `${myVal}`\n );\n });\n\n val = items.join(\"\");\n }\n\n break;\n\n case \"user\":\n val = field.pullRelationValues(rowData);\n\n break;\n\n case \"file\":\n val = rowData?.[field.columnName];\n\n if (!val) {\n val = \"\";\n\n break;\n }\n\n break;\n\n case \"formula\":\n if (rowData) {\n // const dv = this.datacollection;\n // const ds = dv ? dv.datasource : null;\n // const needRecalculate =\n // !ds || ds instanceof ABObjectQuery ? false : true;\n\n // NOTE: Could not to re-calculate because `__relation` data is extracted from full data at the moment\n // rowData.__relation format\n // {\n // id: \"string\"\n // text: \"string\"\n // translations: []\n // uuid: \"0cb52669-d626-4c9d-85ea-2d931751d0ce\"\n // value: \"LABEL\"\n // }\n const needRecalculate = false;\n\n val = field.format(rowData, needRecalculate);\n }\n\n break;\n\n default:\n val = field.format(rowData);\n // break;\n }\n }\n\n // set value to each components\n const vComponent = f.component(this.idBase);\n\n // vComponent?.onShow();\n\n vComponent?.setValue?.(val);\n vComponent?.displayText?.(rowData);\n });\n }\n};\n","const ABViewDetailItemComponent = require(\"./ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailConnectComponent extends (\n ABViewDetailItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetailConnect_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const settings = this.settings;\n\n return super.ui({\n on: {\n //Add data-cy attribute for Cypress Testing\n onAfterRender: () => {\n const columnName =\n baseView.field((fld) => fld.id === settings.fieldId)\n ?.columnName ?? \"\";\n const dataCy = `detail connected ${columnName} ${\n settings.fieldId\n } ${baseView.parentDetailComponent()?.id || baseView.parent.id}`;\n\n $$(this.ids.detailItem)?.$view.setAttribute(\"data-cy\", dataCy);\n },\n },\n });\n }\n\n setValue(val) {\n const vals = [];\n\n if (Array.isArray(val))\n val.forEach((record) => {\n vals.push(\n `${record.text}`\n );\n });\n else vals.push(`${val.text}`);\n\n super.setValue(vals.join(\"\"));\n }\n};\n","const ABViewDetailItemComponent = require(\"./ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailCustomComponent extends (\n ABViewDetailItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetailCustom_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field();\n const detailView = baseView.detailComponent();\n\n let template = field ? field.columnHeader().template({}) : \"\";\n\n return super.ui({\n minHeight: 45,\n height: 60,\n template,\n on: {\n //Add data-cy attribute for Cypress Testing\n onAfterRender: () => {\n const dataCy = `detail custom ${field?.columnName} ${\n field?.id\n } ${baseView.parentDetailComponent()?.id || baseView.parent.id}`;\n\n $$(this.ids.detailItem)?.$view.setAttribute(\"data-cy\", dataCy);\n },\n },\n });\n }\n\n onShow() {\n super.onShow();\n\n const baseView = this.view;\n const field = baseView.field();\n\n if (!field) return;\n\n const $detailItem = $$(this.ids.detailItem);\n\n if (!$detailItem) return;\n\n const detailCom = baseView.detailComponent(),\n rowData = detailCom.datacollection.getCursor() || {},\n node = $detailItem.$view;\n\n field.customDisplay(rowData, null, node, {\n editable: false,\n });\n // Hack: remove the extra webix_template class here, which adds padding so\n // the item is not alligned with the others\n node\n .getElementsByClassName(\"webix_template\")[1]\n ?.removeAttribute(\"class\");\n }\n\n setValue(val) {\n const field = this.view.field();\n\n if (!field) return;\n\n const $detailItem = $$(this.ids.detailItem);\n\n if (!$detailItem) return;\n\n const rowData = {};\n\n rowData[field.columnName] = val;\n\n field.setValue($detailItem, rowData);\n }\n};\n","const ABViewDetailItemComponent = require(\"./ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailImageComponent extends (\n ABViewDetailItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetailImage_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field();\n const _ui = {\n on: {\n //Add data-cy attribute for Cypress Testing\n onAfterRender: () => {\n const dataCy = `detail image ${field?.columnName} ${field?.id} ${\n baseView.parentDetailComponent()?.id || baseView.parent.id\n }`;\n\n $$(this.ids.detailItem)?.$view.setAttribute(\"data-cy\", dataCy);\n },\n },\n };\n const settings = this.settings;\n\n if (settings.height) _ui.height = settings.height;\n\n return super.ui(_ui);\n }\n\n setValue(val) {\n const field = this.view.field();\n\n if (!field) {\n super.setValue(\"\");\n\n return;\n }\n\n const parsedImageUrl = val || field.settings.defaultImageUrl;\n\n if (!parsedImageUrl) {\n super.setValue(\"\");\n\n return;\n }\n\n const imageUrl = field.urlImage(parsedImageUrl);\n const settings = this.settings;\n const width = settings.width || field.settings.imageWidth || 200;\n const height = settings.height\n ? `${settings.height}px`\n : field.settings.imageHeight\n ? `${field.settings.imageHeight}px`\n : \"100%\";\n const imageTemplate = [\n `
    `,\n `
    `,\n ``,\n `
    `,\n ].join(\"\");\n\n super.setValue(imageTemplate);\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nconst SAFE_HTML_TAGS = [\n \"abbr\",\n \"acronym\",\n \"b\",\n \"blockquote\",\n \"br\",\n \"code\",\n \"div\",\n \"em\",\n \"i\",\n \"li\",\n \"ol\",\n \"p\",\n \"span\",\n \"strong\",\n \"table\",\n \"td\",\n \"tr\",\n \"ul\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n];\n\nmodule.exports = class ABViewDetailItemComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewDetailItem_${baseView.id}`,\n Object.assign(\n {\n detailItem: \"\",\n detailItemLabel: \"\",\n },\n ids\n )\n );\n }\n\n ui(uiDetailItemComponent = {}) {\n const baseView = this.view;\n\n // setup 'label' of the element\n const settings = baseView.detailComponent()?.settings ?? {};\n const field = baseView.field();\n\n const isLabelTop = settings.labelPosition == \"top\";\n\n const group = [];\n /** @const group will be used later as rows or cols depending on label position */\n if (settings.showLabel) {\n const templateLabel = isLabelTop\n ? \"\"\n : \"\";\n\n const labelUi = {\n id: this.ids.detailItemLabel,\n view: \"template\",\n borderless: true,\n height: 38,\n template: templateLabel,\n data: { label: field?.label ?? \"\" },\n };\n if (!isLabelTop) labelUi.width = settings.labelWidth + 24; // Add 24px to compensate for webix padding\n group.push(labelUi);\n }\n\n let height;\n if (field?.settings?.useHeight === 1)\n height = parseInt(field.settings.imageHeight) || height;\n\n const valueUi = Object.assign(\n {\n id: this.ids.detailItem,\n view: \"template\",\n borderless: true,\n autowidth: true,\n height,\n isUsers: field?.key === \"user\",\n template: isLabelTop\n ? \"
    #display#
    \"\n : \"
    #display#
    \",\n data: { display: \"\" }, // show empty data in template\n },\n uiDetailItemComponent\n );\n // height = 0 behaves a bit differently then autoheight here.\n if (!valueUi.height || valueUi.height == 0) {\n delete valueUi.height;\n valueUi.autoheight = true;\n }\n group.push(valueUi);\n const itemUi = {};\n settings.labelPosition == \"top\"\n ? (itemUi.rows = group)\n : (itemUi.cols = group);\n const _ui = super.ui([itemUi]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n // async init(AB) {\n // await super.init(AB);\n // }\n\n setValue(val, detailId) {\n const $detailItem = $$(detailId ?? this.ids.detailItem);\n\n if (!$detailItem) return;\n\n const field = this.view.field();\n\n switch (field?.key) {\n case \"string\":\n case \"LongText\": {\n const strVal = val\n // Sanitize all of HTML tags\n .replace(/[<]/gm, \"<\")\n // Allow safe HTML tags\n .replace(\n new RegExp(`(<(/)?(${SAFE_HTML_TAGS.join(\"|\")}))`, \"gm\"),\n \"<$2$3\"\n );\n\n $detailItem.setValues({ display: strVal });\n break;\n }\n default:\n $detailItem.setValues({ display: val });\n break;\n }\n }\n};\n","const ABViewDetailItemComponent = require(\"./ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailTextComponent extends (\n ABViewDetailItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetailText_${baseView.id}`, ids);\n }\n\n ui() {\n const field = this.view.field();\n const _ui = {\n css: \"ab-text\",\n on: {\n //Add data-cy attribute for Cypress Testing\n onAfterRender: () => {\n const dataCy = `detail text ${field?.columnName} ${field?.id} ${\n this.view.parentDetailComponent()?.id || this.view.parent.id\n }`;\n\n $$(this.ids.component)?.$view.setAttribute(\"data-cy\", dataCy);\n },\n },\n };\n const settings = this.settings;\n\n if (settings.height) _ui.height = settings.height;\n\n return super.ui(_ui);\n }\n};\n","const ABViewDetailItemComponent = require(\"./ABViewDetailItemComponent\");\n\nmodule.exports = class ABViewDetailTreeComponent extends (\n ABViewDetailItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewDetailTree_${baseView.id}`, ids);\n }\n\n get className() {\n return \"ab-detail-tree\";\n }\n\n async init(AB) {\n await super.init(AB);\n\n // add div of tree to detail\n this.setValue(`
    `);\n }\n\n getDomTree() {\n const $detailItem = $$(this.ids.detailItem);\n\n if (!$detailItem) return;\n\n return $detailItem.$view.getElementsByClassName(this.className)[0];\n }\n\n setValue(val) {\n // convert value to array\n const vals = [];\n\n if (val && !Array.isArray(val)) vals.push(val);\n\n setTimeout(() => {\n // get tree dom\n const domTree = this.getDomTree();\n\n if (!domTree) return false;\n\n const field = this.view.field();\n const branches = [];\n\n if (typeof field.settings.options.data === \"undefined\")\n field.settings.options = new this.AB.Webix.TreeCollection({\n data: field.settings.options,\n });\n\n field.settings.options.data.each(function (obj) {\n if (vals.indexOf(obj.id) !== -1) {\n let html = \"\";\n let rootid = obj.id;\n\n while (this.getParentId(rootid)) {\n field.settings.options.data.each(function (par) {\n if (\n field.settings.options.data.getParentId(rootid) ===\n par.id\n ) {\n html = `${par.text}: ${html}`;\n }\n });\n\n rootid = this.getParentId(rootid);\n }\n\n html += obj.text;\n branches.push(html);\n }\n });\n\n const myHex = \"#4CAF50\";\n\n let nodeHTML = \"
    \";\n\n branches.forEach(function (item) {\n nodeHTML += `${item}`;\n });\n\n nodeHTML += \"
    \";\n domTree.innerHTML = nodeHTML;\n\n let height = 33;\n\n if (domTree.scrollHeight > 33) height = domTree.scrollHeight;\n\n const $detailItem = $$(this.ids.detailItem);\n\n $detailItem.config.height = height;\n $detailItem.resize();\n }, 50);\n }\n};\n","const Docxtemplater = require(\"../../../../js/docxtemplater.v3.0.12.min.js\");\nconst ImageModule = require(\"../../../../js/docxtemplater-image-module.v3.0.2.min.js\");\nconst JSZipUtils = require(\"jszip-utils/dist/jszip-utils.min.js\");\nconst JSZip = require(\"../../../../js/jszip.min.js\");\nconst sizeOf = require(\"image-size\");\n\nconst ABFieldConnect = require(\"../../dataFields/ABFieldConnect\");\nconst ABFieldImage = require(\"../../dataFields/ABFieldImage\");\nconst ABObjectQuery = require(\"../../ABObjectQuery\");\n\nconst ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewDocxBuilderComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewDocxBuilder_${baseView.id}`,\n Object.assign(\n {\n downloadButton: \"\",\n noFileLabel: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const baseView = this.view;\n const settings = this.settings;\n const defaultSettings = baseView.constructor.defaultValues();\n const buttonWidth = settings.width ?? defaultSettings.width;\n\n let autowidth = false;\n\n if (buttonWidth === 0) autowidth = true;\n\n let leftSpacer = {\n type: \"spacer\",\n width: 1,\n };\n let rightSpacer = {\n type: \"spacer\",\n width: 1,\n };\n\n switch (settings.buttonPosition ?? defaultSettings.buttonPosition) {\n case \"left\":\n break;\n case \"center\":\n leftSpacer = {\n type: \"spacer\",\n };\n rightSpacer = {\n type: \"spacer\",\n };\n break;\n case \"right\":\n leftSpacer = {\n type: \"spacer\",\n };\n break;\n }\n\n const buttonLabelText =\n baseView.buttonlabel ||\n settings.buttonlabel ||\n defaultSettings.buttonlabel; // Use || to check empty string \"\"\n const ids = this.ids;\n const _ui = super.ui([\n {\n view: \"toolbar\",\n css:\n settings.toolbarBackground ?? defaultSettings.toolbarBackground,\n cols: [\n leftSpacer,\n {\n id: ids.downloadButton,\n view: \"button\",\n css: \"webix_primary\",\n type: \"icon\",\n icon: \"fa fa-file-word-o\",\n label: buttonLabelText,\n width: settings.width || defaultSettings.width,\n autowidth: autowidth,\n click: () => {\n this.renderFile();\n },\n on: {\n // Add data-cy attribute for cypress tests\n onAfterRender: () => {\n const name = baseView.name?.replace(\".docxBuilder\", \"\");\n const dataCy = `docx download ${name} ${baseView.id}`;\n $$(ids.downloadButton)\n ?.$view.querySelector(\"button\")\n .setAttribute(\"data-cy\", dataCy);\n },\n },\n },\n {\n id: ids.noFileLabel,\n view: \"label\",\n label: this.label(\"No template file\"),\n },\n {\n type: \"spacer\",\n },\n rightSpacer,\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const ids = this.ids;\n const $downloadButton = $$(ids.downloadButton);\n const $noFileLabel = $$(ids.noFileLabel);\n\n if (this.view.settings.filename) {\n $downloadButton.show();\n $noFileLabel.hide();\n } else {\n $downloadButton.hide();\n $noFileLabel.show();\n }\n }\n\n async onShow() {\n super.onShow();\n\n const tasks = [];\n\n this.view.datacollections.forEach((dc) => {\n if (dc.dataStatus === dc.dataStatusFlag.notInitial)\n // load data when a widget is showing\n tasks.push(dc.loadData());\n });\n\n // Show loading cursor\n if (tasks.length > 0) this.busy();\n\n await Promise.all(tasks);\n\n // Hide loading cursor\n this.ready();\n }\n\n busy() {\n const $downloadButton = $$(this.ids.downloadButton);\n\n if (!$downloadButton) return;\n\n $downloadButton.disable();\n $downloadButton.define(\"icon\", \"fa fa-refresh fa-spin\");\n $downloadButton.refresh();\n }\n\n ready() {\n const $downloadButton = $$(this.ids.downloadButton);\n\n if (!$downloadButton) return;\n\n $downloadButton.enable();\n $downloadButton.define(\"icon\", \"fa fa-file-word-o\");\n $downloadButton.refresh();\n }\n\n async renderFile() {\n this.busy();\n\n const reportValues = await this.getReportData();\n\n // console.log(\"DOCX data: \", reportValues);\n\n // Download images\n const images = await this.downloadImages(reportValues);\n\n // Download the template file\n const contentTemplateFile = await this.downloadTemplateFile();\n\n // Generate Docx file\n const blobFile = this.generateDocxFile(\n contentTemplateFile,\n reportValues,\n images\n );\n\n const baseView = this.view;\n\n // Let user download the output file\n baseView.letUserDownload(blobFile, baseView.filelabel);\n\n // Final step\n this.ready();\n }\n\n async getReportData() {\n const result = {};\n const tasks = [];\n\n // Get current cursor\n const datacollections = this.view.datacollections;\n const isDcLabelAdded = datacollections.length > 1;\n\n datacollections\n .filter((dc) => dc?.datasource)\n .forEach(async (dc) => {\n tasks.push(\n new Promise((resolve, reject) => {\n const obj = dc.datasource;\n const objModel = obj.model();\n const dcCursor = dc.getCursor();\n const dcValues = [];\n\n // pull the defined sort values\n let sorts = dc.settings.objectWorkspace.sortFields || [];\n\n // pull filter conditions\n let wheres = this.AB.cloneDeep(\n dc.settings.objectWorkspace.filterConditions ?? {}\n );\n // if there is a selected cursor set the filter here\n if (dcCursor) {\n // if there is a selected cursor set the filter here\n wheres = {\n glue: \"and\",\n rules: [\n {\n key: obj.PK(),\n rule: \"equals\",\n value: dcCursor[obj.PK()],\n },\n ],\n };\n } else if (dc.__reloadWheres) {\n // if we pass new wheres with a reload use them instead\n wheres = dc.__reloadWheres;\n }\n wheres.glue = wheres.glue || \"and\";\n wheres.rules = wheres.rules || [];\n\n const __additionalWheres = {\n glue: \"and\",\n rules: [],\n };\n\n // add the filterCond from user filters if there are rules to add\n if (dc?.__filterCond?.rules?.length > 0) {\n __additionalWheres.rules.push(dc?.__filterCond);\n }\n\n // Filter by a selected cursor of a link DC\n let linkRule = dc.ruleLinkedData();\n if (!dc.settings.loadAll && linkRule) {\n __additionalWheres.rules.push(linkRule);\n }\n // pull data rows following the follow data collection\n else if (dc.datacollectionFollow) {\n const followCursor = dc.datacollectionFollow.getCursor();\n // store the PK as a variable\n let PK = dc.datasource.PK();\n // if the datacollection we are following is a query\n // add \"BASE_OBJECT.\" to the PK so we can select the\n // right value to report the cursor change to\n if (dc.datacollectionFollow.settings.isQuery) {\n PK = \"BASE_OBJECT.\" + PK;\n }\n if (followCursor) {\n wheres = {\n glue: \"and\",\n rules: [\n {\n key: dc.datasource.PK(),\n rule: \"equals\",\n value: followCursor[PK],\n },\n ],\n };\n }\n // Set no return rows\n else {\n wheres = {\n glue: \"and\",\n rules: [\n {\n key: this.datasource.PK(),\n rule: \"equals\",\n value: \"NO RESULT ROW\",\n },\n ],\n };\n }\n }\n\n // Combine setting & program filters\n if (__additionalWheres.rules.length) {\n if (wheres.rules.length) {\n __additionalWheres.rules.unshift(wheres);\n }\n wheres = __additionalWheres;\n }\n\n // remove any null in the .rules\n // if (wheres?.rules?.filter) wheres.rules = wheres.rules.filter((r) => r);\n wheres = obj.whereCleanUp(wheres);\n\n // Pull data that have full relation values.\n // NOTE: When get data from DataCollection, those data is pruned.\n objModel\n .findAll({\n where: wheres || {},\n skip: 0,\n sort: sorts,\n populate: true,\n })\n .then((dataList) => {\n // update property names to column labels to match format names in docx file\n const mlFields = obj.multilingualFields();\n\n dataList?.data.forEach((data) => {\n let resultData;\n\n // For support label of columns every languages\n obj.fields().forEach((f) => {\n const fieldLabels = [];\n\n // Query Objects\n if (obj instanceof ABObjectQuery) {\n if (typeof f.object.translations === \"string\")\n f.object.translations = JSON.parse(\n f.object.translations\n );\n\n if (typeof f.translations === \"string\")\n f.translations = JSON.parse(f.translations);\n\n (f.object.translations || []).forEach(\n (objTran) => {\n const fieldTran = (\n f.translations || []\n ).filter(\n (fieldTran) =>\n fieldTran.language_code ===\n objTran.language_code\n )[0];\n\n if (!fieldTran) return;\n\n const objectLabel = objTran.label;\n const fieldLabel = fieldTran.label;\n\n // Replace alias with label of object\n fieldLabels.push(\n `${objectLabel}.${fieldLabel}`\n );\n }\n );\n }\n // Normal Objects\n else if (typeof f.translations === \"string\")\n f.translations = JSON.parse(f.translations);\n\n f.translations.forEach((tran) => {\n fieldLabels.push(tran.label);\n });\n\n resultData = Object.assign(\n resultData ?? {},\n this.setReportValues(\n data,\n f,\n fieldLabels,\n mlFields\n ) ?? {}\n );\n\n // Keep ABObject into .scope of DOCX templater\n resultData._object = obj;\n });\n\n dcValues.push(resultData);\n });\n\n // If data sources have more than 1 or the result data more than 1 items, then add label of data source\n const datacollectionData =\n dcValues.length > 1 ? dcValues : dcValues[0];\n\n if (\n isDcLabelAdded ||\n (Array.isArray(datacollectionData) &&\n datacollectionData.length > 1)\n )\n (dc.translations || []).forEach((tran) => {\n result[tran.label] = datacollectionData;\n });\n else Object.assign(result, datacollectionData);\n\n resolve();\n });\n })\n );\n });\n\n await Promise.all(tasks);\n\n return result;\n }\n\n setReportValues(data, field, fieldLabels = [], multilinguageFields) {\n const result = {};\n\n let val = null;\n\n result.id = data.id;\n result[`${field.columnName}_ORIGIN`] = data[field.columnName]; // Keep origin value for compare value with custom index\n\n const baseView = this.view;\n\n // Translate multilinguage fields\n if (multilinguageFields.length) {\n const transFields = (multilinguageFields || []).filter(\n (fieldName) => data[fieldName] != null\n );\n\n baseView.translate(data, data, transFields, baseView.languageCode);\n }\n\n // Pull value\n if (field instanceof ABFieldConnect) {\n // If field is connected field, then\n // {\n // fieldName: {Object} or [Array]\n // }\n val = data[this.AB.rules.toFieldRelationFormat(field.columnName)];\n\n if (val?.forEach)\n val.forEach((v) => {\n if (!v) return;\n\n // Sentry Fix: sometimes v is just the uuid\n // Q: what should we do in this case?\n if (typeof v == \"string\") return;\n\n // format relation data\n if (field.datasourceLink) {\n field.datasourceLink\n .fields((f) => !f.isConnection)\n .forEach((f) => {\n v[`${f.columnName}_ORIGIN`] = v[f.columnName];\n\n v[f.columnName] = f.format(v, {\n languageCode: baseView.languageCode,\n });\n });\n }\n\n // Keep ABObject to relation data\n if (v && typeof v === \"object\") v._object = field.datasourceLink;\n });\n\n // TODO\n // data[label + '_label'] = field.format(baseData);\n } else\n val = field.format(data, {\n languageCode: baseView.languageCode,\n });\n\n // Set value to report with every languages of label\n fieldLabels.forEach((label) => {\n if (val) result[label] = val;\n else if (!result[label]) result[label] = \"\";\n });\n\n // normalize child items\n if (data.data?.length) {\n result.data = result.data || [];\n\n (data.data || []).forEach((childItem, index) => {\n // add new data item\n result.data[index] = this.setReportValues(\n childItem,\n field,\n fieldLabels,\n multilinguageFields\n );\n });\n }\n\n return result;\n }\n\n async downloadImages(reportValues) {\n const images = {};\n const tasks = [];\n const addDownloadTask = (fieldImage, data = []) => {\n if (Array.isArray(data) == false) {\n data = [data];\n }\n data.forEach((d) => {\n const imageVal = fieldImage.format(d);\n\n if (imageVal && !images[imageVal]) {\n tasks.push(\n new Promise((resolve, reject) => {\n const imgUrl = fieldImage.urlImage(imageVal); // `/opsportal/image/${this.application.name}/${imageVal}`;\n\n JSZipUtils.getBinaryContent(imgUrl, (error, content) => {\n if (error) return reject(error);\n\n // store binary of image\n images[imageVal] = content;\n\n resolve();\n });\n })\n );\n }\n\n // download images of child items\n addDownloadTask(fieldImage, d.data || []);\n });\n };\n\n this.view.datacollections\n .filter((dc) => dc?.datasource)\n .forEach((dc) => {\n const obj = dc.datasource;\n\n // let currCursor = dc.getCursor();\n\n // if (currCursor) {\n // // Current cursor\n // const treeCursor = dc.getCursor(true);\n\n // currCursor = [this.AB.merge({}, currCursor, treeCursor)];\n // } // List of data\n // else currCursor = dc.getData();\n\n obj.fields((f) => f instanceof ABFieldImage).forEach((f) => {\n addDownloadTask(f, reportValues[dc.label] || [reportValues]);\n });\n });\n\n await Promise.all(tasks);\n\n return images;\n }\n\n downloadTemplateFile() {\n const url = this.view.downloadUrl();\n\n return new Promise((resolve, reject) => {\n JSZipUtils.getBinaryContent(url, (error, content) => {\n if (error) return reject(error);\n\n resolve(content);\n });\n });\n }\n\n generateDocxFile(contentFile, data, images) {\n const summaries = {}; // { varName: sum number, ..., varName2: number2 }\n const zip = new JSZip(contentFile);\n const doc = new Docxtemplater();\n const imageModule = new ImageModule({\n centered: false,\n getImage: (tagValue, tagName) => {\n // NOTE: .getImage of version 3.0.2 does not support async\n // we can buy newer version to support it\n // https://docxtemplater.com/modules/image/\n\n return images[tagValue] || \"\";\n },\n getSize: (imgBuffer, tagValue, tagName) => {\n const defaultVal = [300, 160];\n const baseView = this.view;\n const dc = baseView.datacollection;\n\n if (!dc) {\n const dcs = baseView.datacollections;\n\n if (dcs) {\n dcs.forEach((dc) => {\n let obj = dc.datasource;\n\n if (!obj) return false;\n\n // This is a query object\n if (tagName.indexOf(\".\") > -1) {\n let tagNames = tagName.split(\".\");\n\n if (!obj.objects) return false; // not a query\n\n obj = obj.objects((o) => o.label === tagNames[0])[0]; // Label of object\n\n if (!obj) return false;\n\n tagName = tagNames[1]; // Field name\n }\n\n const imageField = obj.fields(\n (f) => f.columnName === tagName\n )[0];\n\n if (!imageField?.settings) return false;\n\n if (\n imageField.settings.useWidth &&\n imageField.settings.imageWidth\n )\n defaultVal[0] = imageField.settings.imageWidth;\n\n if (\n imageField.settings.useHeight &&\n imageField.settings.imageHeight\n )\n defaultVal[1] = imageField.settings.imageHeight;\n\n return false;\n });\n }\n } else {\n let obj = dc.datasource;\n\n if (!obj) return defaultVal;\n\n // This is a query object\n if (tagName.indexOf(\".\") > -1) {\n const tagNames = tagName.split(\".\");\n\n obj = obj.objects((o) => o.label === tagNames[0])[0]; // Label of object\n\n if (!obj) return defaultVal;\n\n tagName = tagNames[1]; // Field name\n }\n\n const imageField = obj.fields(\n (f) => f.columnName === tagName\n )[0];\n\n if (!imageField?.settings) return defaultVal;\n\n if (\n imageField.settings.useWidth &&\n imageField.settings.imageWidth\n )\n defaultVal[0] = imageField.settings.imageWidth;\n\n if (\n imageField.settings.useHeight &&\n imageField.settings.imageHeight\n )\n defaultVal[1] = imageField.settings.imageHeight;\n }\n // Find aspect ratio image dimensions\n try {\n var img = new Uint8Array(imgBuffer);\n var image = sizeOf(img);\n var ratio = Math.min(\n defaultVal[0] / image.width,\n defaultVal[1] / image.height\n );\n\n return [image.width * ratio, image.height * ratio];\n } catch (err) {\n // if invalid image, then should return 0, 0 sizes\n return defaultVal;\n }\n },\n // getSize: function (imgBuffer, tagValue, tagName) {\n // if (imgBuffer) {\n // var maxWidth = 300;\n // var maxHeight = 160;\n\n // // Find aspect ratio image dimensions\n // try {\n // var image = sizeOf(imgBuffer);\n // var ratio = Math.min(maxWidth / image.width, maxHeight / image.height);\n\n // return [image.width * ratio, image.height * ratio];\n // }\n // // if invalid image, then should return 0, 0 sizes\n // catch (err) {\n // return [0, 0];\n // }\n\n // }\n // else {\n // return [0, 0];\n // }\n // }\n });\n\n try {\n doc.attachModule(imageModule)\n .loadZip(zip)\n .setData(data)\n .setOptions({\n parser: function (tag) {\n return {\n get: function (scope, context) {\n // NOTE: AppBuilder custom filter : no return empty items\n if (tag.indexOf(\"data|\") === 0) {\n const prop = (tag.split(\"|\")[1] || \"\").trim();\n\n return (scope[\"data\"] || []).filter(function (item) {\n return item[prop] ? true : false;\n });\n }\n // Mark number to add to a variable\n else if (tag.indexOf(\"|$sum?\") > -1) {\n const prop = tag.split(\"|$sum?\")[0];\n const varName = tag.split(\"|$sum?\")[1];\n\n let number = scope[prop];\n\n if (typeof number === \"string\")\n number = number.replace(\n /[^\\d.]/g, // return only number and dot\n \"\"\n );\n\n if (!summaries[varName]) summaries[varName] = 0.0;\n\n summaries[varName] += parseFloat(number);\n\n return scope[prop];\n }\n // Show sum value ^\n else if (tag.indexOf(\"$sum?\") === 0) {\n const varName = tag.replace(\"$sum?\", \"\");\n\n return summaries[varName] || 0;\n }\n // // Sum number of .data (Grouped query)\n // else if (tag.indexOf(\"$sum|\") === 0) {\n // const prop = (\n // tag.split(\"|\")[1] || \"\"\n // ).trim();\n\n // let sum = 0;\n // (scope[\"data\"] || []).forEach(\n // (childItem) => {\n // if (!childItem[prop]) return;\n\n // let number = childItem[prop];\n // if (typeof number === \"string\") {\n // number = number.replace(\n // /[^\\d.]/g, // return only number and dot\n // \"\"\n // );\n // }\n\n // try {\n // sum += parseFloat(\n // number || 0\n // );\n // } catch (e) {}\n // }\n // );\n\n // // Print number with commas\n // if (sum) {\n // sum = sum\n // .toString()\n // .replace(\n // /\\B(?=(\\d{3})+(?!\\d))/g,\n // \",\"\n // );\n // }\n\n // return sum;\n // }\n // NOTE: AppBuilder custom filter of another data source\n else if (tag.indexOf(\"$\") === 0) {\n const props = tag.replace(\"$\", \"\").split(\"|\");\n const propSource = props[0].trim();\n const propFilter = props[1].trim(); // column name of ABFieldConnect\n\n if (!propSource || !propFilter) return \"\";\n\n // Pull Index field of connect field\n let indexColName;\n\n const obj = scope._object;\n\n if (obj) {\n const connectedField = obj.fields(\n (f) => f.columnName === propFilter\n )[0];\n\n if (connectedField) {\n const indexField = connectedField.indexField;\n\n indexColName = indexField\n ? indexField.columnName\n : null;\n }\n }\n\n let sourceVals = data[propSource];\n\n if (sourceVals && !Array.isArray(sourceVals))\n sourceVals = [sourceVals];\n\n const getVal = (data) =>\n data[`${indexColName}_ORIGIN`] || // Pull origin data to compare by custom index\n data[indexColName] ||\n data.id ||\n data;\n\n return (sourceVals || []).filter(function (item) {\n // Pull data of parent to compare\n let comparer = scope[propFilter];\n\n if (Array.isArray(comparer))\n return (\n comparer.filter(\n (c) => getVal(c) === getVal(item)\n ).length > 0\n );\n else return getVal(item) === getVal(comparer);\n });\n }\n // ์NOTE : Custom filter\n else if (tag.indexOf(\"?\") > -1) {\n const result = scope;\n const prop = tag.split(\"?\")[0];\n const condition = tag.split(\"?\")[1];\n\n if (prop && condition) {\n let data = scope[prop];\n\n if (data) {\n if (!Array.isArray(data)) data = [data];\n\n return data.filter((d) =>\n eval(condition.replace(/\\./g, \"d.\"))\n );\n }\n }\n return result;\n } else if (tag === \".\") return scope;\n else return scope[tag];\n },\n };\n },\n })\n .render(); // render the document\n } catch (error) {\n return error;\n }\n\n // Output the document using Data-URI\n const docxFile = doc.getZip().generate({\n type: \"blob\",\n mimeType:\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n });\n\n return docxFile;\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormButton extends ABViewFormItemComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormButton_${baseView.id}`, ids);\n }\n\n ui() {\n const self = this;\n const baseView = this.view;\n const form = baseView.parentFormComponent();\n const settings = baseView.settings ?? {};\n\n const alignment =\n settings.alignment || baseView.constructor.defaultValues().alignment;\n\n const _ui = {\n cols: [],\n };\n\n // spacer\n if (alignment === \"center\" || alignment === \"right\") {\n _ui.cols.push({});\n }\n\n // delete button\n if (settings.includeDelete) {\n _ui.cols.push(\n {\n view: \"button\",\n autowidth: true,\n value: settings.deleteLabel || this.label(\"Delete\"),\n css: \"webix_danger\",\n click: function () {\n self.onDelete(this);\n },\n on: {\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `button delete ${form.id}`\n );\n },\n },\n },\n {\n width: 10,\n }\n );\n }\n\n // cancel button\n if (settings.includeCancel) {\n _ui.cols.push(\n {\n view: \"button\",\n autowidth: true,\n value: settings.cancelLabel || this.label(\"Cancel\"),\n click: function () {\n self.onCancel(this);\n },\n on: {\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `button cancel ${form.id}`\n );\n },\n },\n },\n {\n width: 10,\n }\n );\n }\n\n // reset button\n if (settings.includeReset) {\n _ui.cols.push(\n {\n view: \"button\",\n autowidth: true,\n value: settings.resetLabel || this.label(\"Reset\"),\n click: function () {\n self.onClear(this);\n },\n on: {\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `button reset ${form.id}`\n );\n },\n },\n },\n {\n width: 10,\n }\n );\n }\n\n // save button\n if (settings.includeSave) {\n _ui.cols.push({\n view: \"button\",\n type: \"form\",\n css: \"webix_primary\",\n autowidth: true,\n value: settings.saveLabel || this.label(\"Save\"),\n click: function () {\n self.onSave(this);\n },\n on: {\n onAfterRender: function () {\n this.getInputNode().setAttribute(\n \"data-cy\",\n `button save ${form.id}`\n );\n },\n },\n });\n }\n\n // spacer\n if (alignment === \"center\" || alignment === \"left\") _ui.cols.push({});\n\n return super.ui(_ui);\n }\n\n onCancel(cancelButton) {\n const baseView = this.view;\n const settings = baseView.settings ?? {};\n\n // get form component\n const form = baseView.parentFormComponent();\n\n // get ABDatacollection\n const dc = form.datacollection;\n\n // clear cursor of DC if not set to follow another\n if (!dc?.isCursorFollow) {\n dc?.setCursor(null);\n }\n // dc?.setStaticCursor(); // unless it should be static\n\n cancelButton?.getFormView?.().clear();\n\n if (settings.afterCancel) form.changePage(settings.afterCancel);\n // If the redirect page is not defined, then redirect to parent page\n else {\n const noPopupFilter = (p) => p.settings && p.settings.type != \"popup\";\n\n const pageCurr = this.view.pageParent();\n if (pageCurr) {\n const pageParent = pageCurr.pageParent(noPopupFilter) ?? pageCurr;\n\n if (pageParent) form.changePage(pageParent.id);\n }\n }\n }\n\n onClear(resetButton) {\n // get form component\n const form = this.view.parentFormComponent();\n\n // get ABDatacollection\n const dc = form.datacollection;\n\n // clear cursor of DC\n if (dc) {\n dc.setCursor(null);\n }\n\n resetButton?.getFormView?.().clear();\n }\n\n onSave(saveButton) {\n if (!saveButton) {\n console.error(\"Require the button element\");\n return;\n }\n // get form component\n const form = this.view.parentFormComponent();\n const formView = saveButton.getFormView();\n\n // disable the save button\n saveButton.disable?.();\n\n // save data\n form\n .saveData(formView)\n .then(() => {\n saveButton.enable?.();\n\n //Focus on first focusable component\n form.focusOnFirst();\n })\n .catch((err) => {\n console.error(err);\n // Catch uncaught error reported in Sentry and add context\n // APPBUILDER-WEB-1A3(https://appdev-designs.sentry.io/issues/4631880265/)\n try {\n saveButton.enable?.();\n } catch (e) {\n this.AB.notify.developer(e, {\n context:\n \"formButton.onSave > catch err > saveButton.enable()\",\n buttonID: this?.view?.id,\n formID: this?.view?.parent?.id,\n });\n }\n });\n }\n\n onDelete(deleteButton) {\n this.AB.Webix.confirm({\n title: this.label(\"Delete data\"),\n text: this.label(\"Do you want to delete this data?\"),\n callback: async (confirm) => {\n if (!confirm) return;\n\n deleteButton.disable?.();\n\n try {\n // get form component\n const form = this.view.parentFormComponent();\n const $formView = deleteButton.getFormView();\n\n // delete a record row\n await form.deleteData($formView);\n } catch (err) {\n console.error(err);\n } finally {\n deleteButton.enable?.();\n }\n },\n });\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormCheckboxComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormCheckbox_${baseView.id}`, ids);\n }\n\n ui() {\n return super.ui({\n view: \"checkbox\",\n });\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\nconst ABViewFormItem = require(\"../ABViewFormItem\");\nconst ABViewFormConnect = require(\"../ABViewFormConnect\");\nconst ABViewFormCustom = require(\"../ABViewFormCustom\");\nconst ABViewFormTextbox = require(\"../ABViewFormTextbox\");\nconst ABViewFormJson = require(\"../ABViewFormJson\");\n\nasync function timeout(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nconst fieldValidations = [];\n\nmodule.exports = class ABViewFormComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewForm_${baseView.id}`,\n Object.assign(\n {\n form: \"\",\n\n layout: \"\",\n filterComplex: \"\",\n },\n ids\n )\n );\n\n this.timerId = null;\n this._showed = false;\n }\n\n ui() {\n const baseView = this.view;\n const superComponent = baseView.superComponent();\n const rows = superComponent.ui().rows ?? [];\n const fieldValidationsHolder = this.uiValidationHolder();\n const _ui = super.ui([\n {\n id: this.ids.form,\n view: \"form\",\n abid: baseView.id,\n rows: rows.concat(fieldValidationsHolder),\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n uiValidationHolder() {\n const result = [\n {\n hidden: true,\n rows: [],\n },\n ];\n\n // NOTE: this._currentObject can be set in the KanBan Side Panel\n const baseView = this.view;\n const object = this.datacollection?.datasource ?? baseView._currentObject;\n\n if (!object) return result;\n\n const validationUI = [];\n const existsFields = baseView.fieldComponents();\n\n object\n // Pull fields that have validation rules\n .fields((f) => f?.settings?.validationRules)\n .forEach((f) => {\n const view = existsFields.find(\n (com) => f.id === com.settings.fieldId\n );\n if (!view) return;\n\n // parse the rules because they were stored as a string\n // check if rules are still a string...if so lets parse them\n if (typeof f.settings.validationRules === \"string\") {\n f.settings.validationRules = JSON.parse(\n f.settings.validationRules\n );\n }\n\n // there could be more than one so lets loop through and build the UI\n f.settings.validationRules.forEach((rule, indx) => {\n const Filter = this.AB.filterComplexNew(\n `${f.columnName}_${indx}`\n );\n // add the new ui to an array so we can add them all at the same time\n if (typeof Filter.ui === \"function\") {\n validationUI.push(Filter.ui());\n } else {\n // Legacy v1 method:\n validationUI.push(Filter.ui);\n }\n\n // store the filter's info so we can assign values and settings after the ui is rendered\n fieldValidations.push({\n filter: Filter,\n view: Filter.ids.querybuilder,\n columnName: f.columnName,\n validationRules: rule.rules,\n invalidMessage: rule.invalidMessage,\n });\n });\n });\n\n result.rows = validationUI;\n\n return result;\n }\n\n async init(AB, accessLevel, options = {}) {\n await super.init(AB);\n\n this.view.superComponent().init(AB, accessLevel, options);\n\n this.initCallbacks(options);\n this.initEvents();\n this.initValidationRules();\n\n const abWebix = this.AB.Webix;\n const $form = $$(this.ids.form);\n\n if ($form) {\n abWebix.extend($form, abWebix.ProgressBar);\n }\n\n if (accessLevel < 2) $form.disable();\n }\n\n initCallbacks(options = {}) {\n // ? We need to determine from these options whether to clear on load?\n if (options?.clearOnLoad) {\n // does this need to be a function?\n this.view.settings.clearOnLoad = options.clearOnLoad();\n }\n // Q: Should we use emit the event instead ?\n const baseView = this.view;\n\n if (options.onBeforeSaveData)\n baseView._callbacks.onBeforeSaveData = options.onBeforeSaveData;\n else baseView._callbacks.onBeforeSaveData = () => true;\n }\n\n initEvents() {\n // bind a data collection to form component\n const dc = this.datacollection;\n\n if (!dc) return;\n\n // listen DC events\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n this.eventAdd({\n emitter: dc,\n eventName: key,\n listener: (rowData) => {\n const baseView = this.view;\n const linkViaOneConnection = baseView.fieldComponents(\n (comp) => comp instanceof ABViewFormConnect\n );\n // clear previous xxx->one selections and add new from\n // cursor change\n linkViaOneConnection.forEach((f) => {\n const field = f.field();\n if (\n field?.settings?.linkViaType == \"one\" &&\n field?.linkViaOneValues\n ) {\n delete field.linkViaOneValues;\n const relationVals =\n rowData?.[field.relationName()] ??\n rowData?.[field.columnName];\n if (relationVals) {\n if (Array.isArray(relationVals)) {\n const valArray = [];\n relationVals.forEach((v) => {\n valArray.push(\n field.getRelationValue(v, { forUpdate: true })\n );\n });\n field.linkViaOneValues = valArray.join(\",\");\n } else {\n field.linkViaOneValues = field.getRelationValue(\n relationVals,\n { forUpdate: true }\n );\n }\n }\n }\n });\n\n this.displayData(rowData);\n },\n });\n });\n\n const ids = this.ids;\n\n this.eventAdd({\n emitter: dc,\n eventName: \"initializingData\",\n listener: () => {\n const $form = $$(ids.form);\n\n if ($form) {\n $form.disable();\n\n $form.showProgress?.({ type: \"icon\" });\n }\n },\n });\n\n this.eventAdd({\n emitter: dc,\n eventName: \"initializedData\",\n listener: () => {\n const $form = $$(ids.form);\n\n if ($form) {\n $form.enable();\n\n $form.hideProgress?.();\n }\n },\n });\n\n // I think this case is currently handled by the DC.[changeCursor, cursorStale]\n // events:\n // this.eventAdd({\n // emitter: dc,\n // eventName: \"ab.datacollection.update\",\n // listener: (msg, data) => {\n // if (!data?.objectId) return;\n\n // const object = dc.datasource;\n\n // if (!object) return;\n\n // if (\n // object.id === data.objectId ||\n // object.fields((f) => f.settings.linkObject === data.objectId)\n // .length > 0\n // ) {\n // const currData = dc.getCursor();\n\n // if (currData) this.displayData(currData);\n // }\n // },\n // });\n\n // bind the cursor event of the parent DC\n const linkDv = dc.datacollectionLink;\n\n if (linkDv)\n // update the value of link field when data of the parent dc is changed\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n this.eventAdd({\n emitter: linkDv,\n eventName: key,\n listener: (rowData) => {\n this.displayParentData(rowData);\n },\n });\n });\n }\n\n initValidationRules() {\n const dc = this.datacollection;\n\n if (!dc) return;\n\n if (!fieldValidations.length) return;\n\n // we need to store the rules for use later so lets build a container array\n const complexValidations = [];\n\n fieldValidations.forEach((f) => {\n // init each ui to have the properties (app and fields) of the object we are editing\n f.filter.applicationLoad?.(dc.datasource.application); // depreciated.\n f.filter.fieldsLoad(dc.datasource.fields());\n // now we can set the value because the fields are properly initialized\n f.filter.setValue(f.validationRules);\n\n // if there are validation rules present we need to store them in a lookup hash\n // so multiple rules can be stored on a single field\n if (!Array.isArray(complexValidations[f.columnName]))\n complexValidations[f.columnName] = [];\n\n // now we can push the rules into the hash\n // what happens if $$(f.view) isn't present?\n if ($$(f.view)) {\n complexValidations[f.columnName].push({\n filters: $$(f.view).getFilterHelper(),\n // values: $$(ids.form).getValues(),\n invalidMessage: f.invalidMessage,\n });\n }\n });\n\n const ids = this.ids;\n\n // use the lookup to build the validation rules\n Object.keys(complexValidations).forEach((key) => {\n // get our field that has validation rules\n const formField = $$(ids.form).queryView({\n name: key,\n });\n\n if (!formField) return;\n\n // store the rules in a data param to be used later\n formField.$view.complexValidations = complexValidations[key];\n // define validation rules\n formField.define(\"validate\", function (nval, oval, field) {\n // get field now that we are validating\n const fieldValidating = $$(ids.form)?.queryView({\n name: field,\n });\n if (!fieldValidating) return true;\n\n // default valid is true\n let isValid = true;\n\n // check each rule that was stored previously on the element\n fieldValidating.$view.complexValidations.forEach((filter) => {\n const object = dc.datasource;\n const data = this.getValues();\n\n // convert rowData from { colName : data } to { id : data }\n const newData = {};\n\n (object.fields() || []).forEach((field) => {\n newData[field.id] = data[field.columnName];\n });\n\n // for the case of \"this_object\" conditions:\n if (data.uuid) newData[\"this_object\"] = data.uuid;\n\n // use helper funtion to check if valid\n const ruleValid = filter.filters(newData);\n\n // if invalid we need to tell the field\n if (!ruleValid) {\n isValid = false;\n // we also need to define an error message\n fieldValidating.define(\n \"invalidMessage\",\n filter.invalidMessage\n );\n }\n });\n\n return isValid;\n });\n\n formField.refresh();\n });\n }\n\n async onShow(data) {\n this.saveButton?.disable();\n\n this._showed = true;\n\n const baseView = this.view;\n\n // call .onShow in the base component\n const superComponent = baseView.superComponent();\n await superComponent.onShow();\n\n const $form = $$(this.ids.form);\n const dc = this.datacollection;\n\n if (dc) {\n // clear current cursor on load\n // if (this.settings.clearOnLoad || _logic.callbacks.clearOnLoad() ) {\n const settings = this.settings;\n\n if (settings.clearOnLoad) {\n dc.setCursor(null);\n }\n\n // pull data of current cursor\n // await dc.waitReady();\n const rowData = dc.getCursor();\n\n if ($form) dc.bind($form);\n\n // do this for the initial form display so we can see defaults\n await this.displayData(rowData);\n }\n // show blank data in the form\n else await this.displayData(data ?? {});\n\n //Focus on first focusable component\n this.focusOnFirst();\n\n if ($form) $form.adjust();\n\n // Load data of DCs that are use in record rules here\n // no need to wait until they are done. (Let the save button enable)\n // It will be re-check again when saving.\n baseView.loadDcDataOfRecordRules();\n\n this.saveButton?.enable();\n }\n\n async displayData(rowData) {\n // If setTimeout is already scheduled, no need to do anything\n if (this.timerId) return;\n else this.timerId = await timeout(80);\n\n const baseView = this.view;\n const customFields = baseView.fieldComponents(\n (comp) =>\n comp instanceof ABViewFormCustom ||\n // rich text\n (comp instanceof ABViewFormTextbox &&\n comp.settings.type === \"rich\") ||\n (comp instanceof ABViewFormJson && comp.settings.type === \"filter\")\n );\n\n const normalFields = baseView.fieldComponents(\n (comp) =>\n comp instanceof ABViewFormItem &&\n !(comp instanceof ABViewFormCustom)\n );\n\n // Set default values\n if (!rowData) {\n customFields.forEach((f) => {\n const field = f.field();\n if (!field) return;\n\n const comp = baseView.viewComponents[f.id];\n if (!comp) return;\n\n // var colName = field.columnName;\n if (this._showed) comp?.onShow?.();\n\n // set value to each components\n const defaultRowData = {};\n\n field.defaultValue(defaultRowData);\n field.setValue($$(comp.ids.formItem), defaultRowData);\n\n comp?.refresh?.(defaultRowData);\n });\n\n normalFields.forEach((f) => {\n if (f.key === \"button\") return;\n\n const field = f.field();\n if (!field) return;\n\n const comp = baseView.viewComponents[f.id];\n if (!comp) return;\n\n const colName = field.columnName;\n\n // set value to each components\n const values = {};\n\n field.defaultValue(values);\n $$(comp.ids.formItem)?.setValue(values[colName] ?? \"\");\n });\n\n // select parent data to default value\n const dc = this.datacollection;\n const linkDv = dc.datacollectionLink;\n\n if (linkDv) {\n const parentData = linkDv.getCursor();\n\n this.displayParentData(parentData);\n }\n }\n\n // Populate value to custom fields\n else {\n customFields.forEach((f) => {\n const comp = baseView.viewComponents[f.id];\n if (!comp) return;\n\n if (this._showed) comp?.onShow?.();\n\n // set value to each components\n f?.field()?.setValue($$(comp.ids.formItem), rowData);\n\n comp?.refresh?.(rowData);\n });\n\n normalFields.forEach((f) => {\n if (f.key === \"button\") return;\n\n const field = f.field();\n if (!field) return;\n\n const comp = baseView.viewComponents[f.id];\n if (!comp) return;\n //\n if (f.key === \"datepicker\") {\n // Not sure why, but the local format isn't applied correctly\n // without a timeout here\n setTimeout(() => {\n field.setValue($$(comp.ids.formItem), rowData);\n }, 200);\n return;\n }\n\n field.setValue($$(comp.ids.formItem), rowData);\n });\n }\n\n this.timerId = null;\n }\n\n displayParentData(rowData) {\n const dc = this.datacollection;\n\n // If the cursor is selected, then it will not update value of the parent field\n const currCursor = dc.getCursor();\n if (currCursor) return;\n\n const relationField = dc.fieldLink;\n if (!relationField) return;\n\n const baseView = this.view;\n // Pull a component of relation field\n const relationFieldCom = baseView.fieldComponents((comp) => {\n if (!(comp instanceof ABViewFormItem)) return false;\n\n return comp.field()?.id === relationField.id;\n })[0];\n if (!relationFieldCom) return;\n\n const relationFieldView = baseView.viewComponents[relationFieldCom.id];\n if (!relationFieldView) return;\n\n const $relationFieldView = $$(relationFieldView.ids.formItem),\n relationName = relationField.relationName();\n\n // pull data of parent's dc\n const formData = {};\n\n formData[relationName] = rowData;\n\n // set data of parent to default value\n relationField.setValue($relationFieldView, formData);\n }\n\n detatch() {\n // TODO: remove any handlers we have attached.\n }\n\n focusOnFirst() {\n const baseView = this.view;\n\n let topPosition = 0;\n let topPositionId = \"\";\n\n baseView.views().forEach((item) => {\n if (item.key === \"textbox\" || item.key === \"numberbox\")\n if (item.position.y === topPosition) {\n topPosition = item.position.y;\n topPositionId = item.id;\n }\n });\n\n const childComponent = baseView.viewComponents[topPositionId];\n\n if (childComponent && $$(childComponent.ids.formItem))\n $$(childComponent.ids.formItem).focus();\n }\n\n get saveButton() {\n return $$(this.ids.form)?.queryView({\n view: \"button\",\n type: \"form\",\n });\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormConnectComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewFormConnect_${baseView.id}`,\n Object.assign(\n {\n popup: \"\",\n editpopup: \"\",\n },\n ids\n )\n );\n\n this.addPageComponent = null;\n this.editPageComponent = null;\n }\n\n get field() {\n return this.view.field();\n }\n\n get multiselect() {\n return this.field?.settings.linkType == \"many\";\n }\n\n ui() {\n const field = this.field;\n const baseView = this.view;\n const form = baseView.parentFormComponent();\n const settings = this.settings;\n\n if (!field) {\n console.error(`This field could not found : ${settings.fieldId}`);\n\n return super.ui({\n view: \"label\",\n label: \"\",\n });\n }\n\n const multiselect = this.multiselect; // field.settings.linkType == \"many\";\n const formSettings = form?.settings || {};\n const ids = this.ids;\n\n let _ui = {\n id: ids.formItem,\n view: multiselect ? \"multicombo\" : \"combo\",\n name: field.columnName,\n required:\n field?.settings?.required || parseInt(settings?.required) || false,\n // label: field.label,\n // labelWidth: settings.labelWidth,\n dataFieldId: field.id,\n on: {\n onItemClick: (id, e) => {\n if (\n e.target.classList.contains(\"editConnectedPage\") &&\n e.target.dataset.itemId\n ) {\n const rowId = e.target.dataset.itemId;\n if (!rowId) return;\n this.goToEditPage(rowId);\n }\n },\n onChange: (data) => {\n this._onChange(data);\n },\n },\n };\n\n if (formSettings.showLabel) {\n _ui.label = field.label;\n _ui.labelWidth = formSettings.labelWidth;\n _ui.labelPosition = formSettings.labelPosition;\n }\n\n this.initAddEditTool();\n\n _ui.suggest = {\n button: true,\n selectAll: multiselect ? true : false,\n body: {\n data: [],\n template: `${\n baseView?.settings?.editForm\n ? ''\n : \"\"\n }#value#`,\n },\n on: {\n onShow: () => {\n field.populateOptionsDataCy($$(ids.formItem), field, form);\n },\n },\n // Support partial matches\n filter: ({ value }, search) =>\n value.toLowerCase().includes(search.toLowerCase()),\n };\n\n _ui.onClick = {\n customField: (id, e, trg) => {\n if (settings.disable === 1) return;\n\n const rowData = {};\n const $formItem = $$(ids.formItem);\n\n if ($formItem) {\n const node = $formItem.$view;\n\n field.customEdit(rowData, /* App,*/ node);\n }\n },\n };\n\n let apcUI = this.addPageComponent?.ui;\n if (apcUI) {\n // reset some component vals to make room for button\n _ui.label = \"\";\n _ui.labelWidth = 0;\n\n // add click event to add new button\n apcUI.on = {\n onItemClick: (/*id, evt*/) => {\n // let $form = $$(id).getFormView();\n this.addPageComponent?.onClick(form.datacollection);\n\n return false;\n },\n };\n\n if (_ui.labelPosition == \"top\") {\n _ui.labelPosition = \"left\";\n _ui = {\n inputId: ids.formItem,\n rows: [\n {\n view: \"label\",\n label: field.label,\n // height: 22,\n align: \"left\",\n },\n {\n cols: [apcUI, _ui],\n },\n ],\n };\n } else {\n _ui = {\n inputId: ids.formItem,\n rows: [\n {\n cols: [\n {\n view: \"label\",\n label: field.label,\n width: formSettings.labelWidth,\n align: \"left\",\n },\n apcUI,\n _ui,\n ],\n },\n ],\n };\n }\n\n _ui = super.ui(_ui);\n } else {\n _ui = {\n inputId: ids.formItem,\n rows: [_ui],\n };\n\n _ui = super.ui(_ui);\n\n delete _ui.rows[0].id;\n }\n\n return _ui;\n }\n\n async _onChange(data) {\n const ids = this.ids;\n const field = this.field;\n const baseView = this.view;\n\n if (this.multiselect) {\n if (typeof data == \"string\") {\n data = data.split(\",\");\n }\n }\n\n let selectedValues;\n if (Array.isArray(data)) {\n selectedValues = [];\n data.forEach((record) => {\n selectedValues.push(record.id || record);\n // let recordObj = record;\n // if (typeof record != \"object\") {\n // // we need to convert either index or uuid to full data object\n // recordObj = field.getItemFromVal(record);\n // }\n // if (recordObj?.id) selectedValues.push(recordObj.id);\n });\n } else {\n selectedValues = data;\n if (typeof data != \"object\") {\n // we need to convert either index or uuid to full data object\n selectedValues = field.getItemFromVal(data);\n }\n // selectedValues = field.pullRecordRelationValues(selectedValues);\n if (selectedValues?.id) {\n selectedValues = selectedValues.id;\n } else {\n selectedValues = data;\n }\n }\n\n // We can now set the new value but we need to block event listening\n // so it doesn't trigger onChange again\n const $formItem = $$(ids.formItem);\n\n // Q: if we don't have a $formItem, is any of the rest valid?\n if ($formItem) {\n // for xxx->one connections we need to populate again before setting\n // values because we need to use the selected values to add options\n // to the UI\n if (this?.field?.settings?.linkViaType == \"one\") {\n this.busy();\n await field.getAndPopulateOptions(\n $formItem,\n baseView.options,\n field,\n baseView.parentFormComponent()\n );\n this.ready();\n }\n\n $formItem.blockEvent();\n\n // store the user's selected option in local storage.\n field.saveSelect(selectedValues);\n\n const prepedVals = selectedValues.join\n ? selectedValues.join()\n : selectedValues;\n\n $formItem.setValue(prepedVals);\n $formItem.unblockEvent();\n }\n }\n\n async init(AB, options) {\n await super.init(AB);\n\n const $formItem = $$(this.ids.formItem);\n if ($formItem) webix.extend($formItem, webix.ProgressBar);\n\n this.initAddEditTool();\n }\n\n initAddEditTool() {\n const baseView = this.view;\n\n // Initial add/edit page tools\n const addFormID = baseView?.settings?.formView;\n if (addFormID && baseView && !this.addPageComponent) {\n this.addPageComponent = baseView.addPageTool.component(\n this.AB,\n `${baseView.id}_${addFormID}`\n );\n this.addPageComponent.applicationLoad(baseView.application);\n this.addPageComponent.init({\n onSaveData: this.callbackSaveData.bind(this),\n onCancelClick: this.callbackCancel.bind(this),\n clearOnLoad: this.callbackClearOnLoad.bind(this),\n });\n }\n\n const editFormID = baseView?.settings?.editForm;\n if (editFormID && baseView && !this.editPageComponent) {\n this.editPageComponent = baseView.editPageTool.component(\n this.AB,\n `${baseView.id}_${editFormID}`\n );\n this.editPageComponent.applicationLoad(baseView.application);\n this.editPageComponent.init({\n onSaveData: this.callbackSaveData.bind(this),\n onCancelClick: this.callbackCancel.bind(this),\n clearOnLoad: this.callbackClearOnLoad.bind(this),\n });\n }\n }\n\n async callbackSaveData(saveData) {\n if (saveData == null) return;\n else if (!Array.isArray(saveData)) saveData = [saveData];\n\n const ids = this.ids;\n const field = this.field;\n\n // find the select component\n const $formItem = $$(ids.formItem);\n if (!$formItem) return;\n\n // Refresh option list\n this.busy();\n field.clearStorage(this.view.settings.filterConditions);\n const data = await field.getAndPopulateOptions(\n $formItem,\n this.view.options,\n field,\n this.view.parentFormComponent()\n );\n this.ready();\n\n // field.once(\"option.data\", (data) => {\n data.forEach((item) => {\n item.value = item.text;\n });\n\n $formItem.getList().clearAll();\n $formItem.getList().define(\"data\", data);\n\n if (field.settings.linkType === \"many\") {\n let selectedItems = $formItem.getValue();\n saveData.forEach((sData) => {\n if (selectedItems.indexOf(sData.id) === -1)\n selectedItems = selectedItems\n ? `${selectedItems},${sData.id}`\n : sData.id;\n });\n\n $formItem.setValue(selectedItems);\n } else {\n $formItem.setValue(saveData[0].id);\n }\n // close the popup when we are finished\n // $$(ids.popup)?.close();\n // $$(ids.editpopup)?.close();\n // });\n\n // field.getOptions(this.settings.filterConditions, \"\");\n // .then(function (data) {\n // // we need new option that will be returned from server (above)\n // // so we will not set this and then just reset it.\n // });\n }\n\n callbackCancel() {\n $$(this.ids?.popup)?.close?.();\n\n return false;\n }\n\n callbackClearOnLoad() {\n return true;\n }\n\n getValue(rowData) {\n return this.field.getValue($$(this.ids.formItem), rowData);\n }\n\n formBusy($form) {\n if (!$form) return;\n\n $form.disable?.();\n $form.showProgress?.({ type: \"icon\" });\n }\n\n formReady($form) {\n if (!$form) return;\n\n $form.enable?.();\n $form.hideProgress?.();\n }\n\n goToEditPage(rowId) {\n const settings = this.settings;\n\n if (!settings.editForm) return;\n\n const editForm = this.view.application.urlResolve(settings.editForm);\n\n if (!editForm) return;\n\n const $form = $$(this.ids.formItem).getFormView() || null;\n\n // Open the form popup\n this.editPageComponent.onClick().then(() => {\n const dc = editForm.datacollection;\n\n if (dc) {\n dc.setCursor(rowId);\n\n this.__editFormDcEvent =\n this.__editFormDcEvent ||\n dc.on(\"initializedData\", () => {\n dc.setCursor(rowId);\n });\n }\n });\n }\n\n async onShow() {\n const ids = this.ids;\n const $formItem = $$(ids.formItem);\n\n if (!$formItem) return;\n\n const field = this.field;\n\n if (!field) return;\n\n const node = $formItem.$view;\n\n if (!node) return;\n\n const $node = $$(node);\n\n if (!$node) return;\n\n const settings = this.settings;\n let filterConditions = {\n glue: \"and\",\n rules: [],\n };\n\n if (settings?.filterConditions?.rules?.length) {\n filterConditions = this.AB.cloneDeep(\n this.view.settings.filterConditions\n );\n }\n\n // NOTE: compatible with version 1. This code should not be here too long.\n if (\n !filterConditions?.rules?.length &&\n settings?.objectWorkspace?.filterConditions?.rules?.length\n ) {\n filterConditions = this.AB.cloneDeep(\n settings.objectWorkspace.filterConditions\n );\n }\n\n // Add the filter connected value\n if ((settings?.filterConnectedValue ?? \"\").indexOf(\":\") > -1) {\n const values = settings.filterConnectedValue.split(\":\"),\n uiConfigName = values[0],\n connectFieldId = values[1];\n\n filterConditions.rules.push({\n key: connectFieldId,\n rule: \"filterByConnectValue\",\n value: uiConfigName,\n });\n }\n\n const getFilterByConnectValues = (conditions, depth = 0) => {\n return [\n ...conditions.rules\n .filter((e) => e.rule === \"filterByConnectValue\")\n .map((e) => {\n const filterByConnectValue = Object.assign({}, e);\n\n filterByConnectValue.depth = depth;\n\n return filterByConnectValue;\n }),\n ].concat(\n ...conditions.rules\n .filter((e) => e.glue)\n .map((e) => getFilterByConnectValues(e, depth + 1))\n );\n };\n\n const baseView = this.view;\n const filterByConnectValues = getFilterByConnectValues(\n filterConditions\n ).map((e) => {\n for (const key in baseView.parent.viewComponents) {\n if (\n !(\n baseView.parent.viewComponents[key] instanceof\n this.constructor\n )\n )\n continue;\n\n const $ui = $$(\n baseView.parent.viewComponents[key]\n .ui()\n .rows.find((vc) => vc.inputId)?.inputId\n );\n\n if ($ui?.config?.name === e.value) {\n // we need to use the element id stored in the settings to find out what the\n // ui component id is so later we can use it to look up its current value\n e.filterValue = $ui;\n\n break;\n }\n }\n\n const ab = this.AB;\n const field = ab\n .objectByID(settings.objectId)\n .fieldByID(settings.fieldId);\n const linkedObject = ab.objectByID(field.settings.linkObject);\n const linkedField = linkedObject.fieldByID(e.key);\n\n if (linkedField?.settings?.isCustomFK) {\n // finally if this is a custom foreign key we need the stored columnName by\n // default uuid is passed for all non CFK\n e.filterColumn = ab\n .objectByID(linkedField.settings.linkObject)\n .fields(\n (filter) =>\n filter.id === linkedField.settings.indexField ||\n linkedField.settings.indexField2\n )[0].columnName;\n } else e.filterColumn = null;\n\n return e;\n });\n\n baseView.options = {\n formView: settings.formView,\n filters: filterConditions,\n // NOTE: settings.objectWorkspace.xxx is a depreciated setting.\n // We will be phasing this out.\n sort: settings.sortFields ?? settings.objectWorkspace?.sortFields,\n editable: settings.disable === 1 ? false : true,\n editPage:\n !settings.editForm || settings.editForm === \"none\" ? false : true,\n filterByConnectValues,\n };\n\n // if this field's options are filtered off another field's value we need\n // to make sure the UX helps the user know what to do.\n // fetch the options and set placeholder text for this view\n if (baseView.options.editable) {\n const parentFields = [];\n\n filterByConnectValues.forEach((fv) => {\n if (fv.filterValue && fv.key) {\n const $filterValueConfig = $$(fv.filterValue.config.id);\n\n let parentField = null;\n\n if (!$filterValueConfig) {\n // this happens in the Interface Builder when only the single form UI is displayed\n parentField = {\n id: \"perentElement\",\n label: this.label(\"PARENT ELEMENT\"),\n };\n } else {\n const value = field.getValue($filterValueConfig);\n\n if (!value) {\n // if there isn't a value on the parent select element set this one to readonly and change placeholder text\n parentField = {\n id: fv.filterValue.config.id,\n label: $filterValueConfig.config.label,\n };\n }\n\n $filterValueConfig.attachEvent(\n \"onChange\",\n async (e) => {\n const parentVal = $filterValueConfig.getValue();\n\n if (parentVal) {\n $node.define(\"disabled\", false);\n $node.define(\n \"placeholder\",\n this.label(\"Select items\")\n );\n this.busy();\n await field.getAndPopulateOptions(\n $node,\n baseView.options,\n field,\n baseView.parentFormComponent()\n );\n this.ready();\n } else {\n $node.define(\"disabled\", true);\n $node.define(\n \"placeholder\",\n this.label(\"Must select item from '{0}' first.\", [\n $filterValueConfig.config.label,\n ])\n );\n }\n\n // TODO: Do we need to clear selected value?\n // $node.setValue(\"\");\n $node.refresh();\n },\n false\n );\n }\n\n if (\n parentField &&\n parentFields.findIndex((e) => e.id === parentField.id) < 0\n )\n parentFields.push(parentField);\n }\n });\n\n if (parentFields.length && !$node.getValue()) {\n $node.define(\"disabled\", true);\n $node.define(\n \"placeholder\",\n this.label(`Must select item from '{0}' first.`, [\n parentFields.map((e) => e.label).join(\", \"),\n ])\n );\n } else {\n $node.define(\"disabled\", false);\n $node.define(\"placeholder\", this.label(\"Select items\"));\n }\n } else {\n $node.define(\"placeholder\", \"\");\n $node.define(\"disabled\", true);\n }\n\n $node.refresh();\n\n // Add data-cy attributes\n const dataCy = `${field.key} ${field.columnName} ${field.id} ${baseView.parent.id}`;\n node.setAttribute(\"data-cy\", dataCy);\n\n this.busy();\n try {\n await field.getAndPopulateOptions(\n // $node,\n $formItem,\n baseView.options,\n field,\n baseView.parentFormComponent()\n );\n } catch (err) {\n this.AB.notify.developer(err, {\n context:\n \"ABViewFormConnectComponent > onShow() error calling field.getAndPopulateOptions\",\n });\n }\n this.ready();\n\n // Need to refresh selected values when they are custom index\n this._onChange($formItem.getValue());\n }\n\n busy() {\n const $formItem = $$(this.ids.formItem);\n\n $formItem?.disable();\n $formItem?.showProgress?.({ type: \"icon\" });\n }\n\n ready() {\n const $formItem = $$(this.ids.formItem);\n\n $formItem?.enable();\n $formItem?.hideProgress?.();\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\nconst ABFieldImage = require(\"../../dataFields/ABFieldImage\");\nconst FocusableTemplate = require(\"../../../../webix_custom_components/focusableTemplate\");\n\nconst DEFAULT_HEIGHT = 80;\n\nmodule.exports = class ABViewFormCustomComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormCustom_${baseView.id}`, ids);\n }\n\n get new_width() {\n const baseView = this.view;\n const form = baseView.parentFormComponent();\n const formSettings = form?.settings ?? {};\n const settings = baseView.settings ?? {};\n\n let newWidth = formSettings.labelWidth;\n\n if (settings.formView) newWidth += 40;\n else if (formSettings.showLabel && formSettings.labelPosition === \"top\")\n newWidth = 0;\n\n return newWidth;\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field();\n const form = baseView.parentFormComponent();\n const formSettings = form?.settings ?? {};\n const settings = field?.settings ?? baseView.settings ?? {};\n\n const requiredClass =\n field?.settings?.required || this.settings.required\n ? \"webix_required\"\n : \"\";\n\n let templateLabel = \"\";\n\n if (formSettings.showLabel) {\n if (formSettings.labelPosition === \"top\")\n templateLabel = ``;\n else\n templateLabel = ``;\n }\n\n let height = 38;\n let width = this.new_width;\n\n if (typeof field == \"undefined\") {\n console.warn(\n `BaseView[${baseView.id}] returned an undefined field()`,\n baseView.toObj()\n );\n }\n\n if (field instanceof ABFieldImage) {\n if (settings.useHeight) {\n if (formSettings.labelPosition === \"top\") {\n height = parseInt(settings.imageHeight) || DEFAULT_HEIGHT;\n height += 38;\n } else {\n height = parseInt(settings.imageHeight) || DEFAULT_HEIGHT;\n }\n } else if (formSettings.labelPosition === \"top\") {\n height = DEFAULT_HEIGHT + 38;\n } else {\n if (DEFAULT_HEIGHT > 38) {\n height = DEFAULT_HEIGHT;\n }\n }\n width =\n settings.useWidth && settings.imageWidth ? settings.imageWidth : 0;\n } else if (formSettings.showLabel && formSettings.labelPosition === \"top\")\n height = DEFAULT_HEIGHT;\n\n let template = `
    ${\n formSettings.labelPosition == \"top\" ? \"\" : templateLabel\n }#template#
    `\n .replace(/#width#/g, formSettings.labelWidth)\n .replace(/#label#/g, field?.label ?? \"\")\n .replace(\n /#template#/g,\n field\n ?.columnHeader({\n width: width,\n height: height,\n editable: true,\n })\n .template({}) ?? \"\"\n );\n\n if (settings.useWidth == 0) {\n template = template.replace(\n /\"ab-image-data-field\" style=\"float: left; width: 100%/g,\n '\"ab-image-data-field\" style=\"float: left; width: calc(100% - ' +\n formSettings.labelWidth +\n \"px)\"\n );\n }\n\n return super.ui({\n view: \"forminput\",\n labelWidth: 0,\n paddingY: 0,\n paddingX: 0,\n css: \"ab-custom-field\",\n // label: field.label,\n // labelPosition: settings.labelPosition, // webix.forminput does not have .labelPosition T T\n // labelWidth: settings.labelWidth,\n body: {\n view: new FocusableTemplate(this.AB._App).key,\n css: \"customFieldCls\",\n borderless: true,\n template: template,\n height: height,\n onClick: {\n customField: (evt, e, trg) => {\n if (settings.disable === 1) return;\n\n let rowData = {};\n\n const formView =\n this?.parentFormComponent?.() ||\n this.view?.parentFormComponent?.();\n\n if (formView) {\n const dv = formView.datacollection;\n if (dv) rowData = dv.getCursor() || {};\n }\n\n // var node = $$(ids.formItem).$view;\n let node = $$(trg).getParentView().$view;\n field?.customEdit(\n rowData,\n this.AB_App,\n node,\n this.ids.formItem,\n evt\n );\n },\n },\n },\n });\n }\n\n onShow() {\n const ids = this.ids;\n const $formItem = $$(ids.formItem);\n\n if (!$formItem) return;\n\n const baseView = this.view;\n const field = baseView.field(),\n rowData = {},\n node = $formItem.$view;\n\n // Add data-cy attributes\n const dataCy = `${baseView.key} ${field.key} ${field.columnName} ${baseView.id} ${baseView.parent.id}`;\n node.setAttribute(\"data-cy\", dataCy);\n\n const options = {\n formId: ids.formItem,\n editable: baseView.settings.disable === 1 ? false : true,\n };\n\n if (field instanceof ABFieldImage) {\n options.height = field.settings.useHeight\n ? parseInt(field.settings.imageHeight) || DEFAULT_HEIGHT\n : DEFAULT_HEIGHT;\n options.width = field.settings.useWidth\n ? parseInt(field.settings.imageWidth) || 0\n : 0;\n }\n\n field.customDisplay(rowData, this.AB._App, node, options);\n }\n\n getValue(rowData) {\n const field = this.view.field();\n const $formItem = $$(this.ids.formItem);\n\n return field.getValue($formItem, rowData);\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormDatepickerComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormDatepicker_${baseView.id}`, ids);\n }\n\n ui() {\n const self = this;\n const field = this.view.field();\n\n const _ui = {\n view: \"datepicker\",\n suggest: {\n body: {\n view:\n this.AB.Account?._config?.languageCode == \"th\"\n ? \"thaicalendar\"\n : \"calendar\",\n type: field.settings?.dateFormat === 1 ? \"time\" : \"\",\n timepicker:\n field.key === \"datetime\" && field.settings?.timeFormat !== 1\n ? true\n : false,\n editable: true,\n on: {\n onAfterDateSelect: function (date) {\n this.getParentView().setMasterValue({\n value: date,\n });\n },\n onTodaySet: function (date) {\n this.getParentView().setMasterValue({\n value: date,\n });\n },\n onDateClear: function (date) {\n this.getParentView().setMasterValue({\n value: date,\n });\n },\n },\n },\n on: {\n onShow: function () {\n const text = this.getMasterValue();\n const field = self.view.field();\n if (!text || !field) return true;\n\n const vals = {};\n vals[field.columnName] = text;\n const date = self.getValue(vals);\n\n const $calendar = this.getChildViews()[0];\n $calendar.setValue(date);\n },\n },\n },\n };\n\n if (!field) return _ui;\n\n // Ignore date - Only time picker\n if (field.settings?.dateFormat === 1) _ui.type = \"time\";\n\n // Date & Time picker\n if (field.key === \"datetime\" && field.settings?.timeFormat !== 1)\n _ui.timepicker = true;\n\n // allows entering characters in datepicker input, false by default\n _ui.editable = true;\n\n // default value\n if (_ui.value && !(_ui.value instanceof Date))\n _ui.value = new Date(_ui.value);\n\n // if we have webix locale set, will use the date format form there.\n if (!window.webixLocale) _ui.format = field.getFormat();\n\n return super.ui(_ui);\n }\n\n getValue(rowData) {\n const field = this.view.field();\n const text = rowData[field.columnName];\n if (!field || !text) return null;\n\n // Sentry Fix: caught an error where this.AB was not set, but this.view was...\n // attempt to catch this situation and post more data:\n if (!this.AB) {\n if (this.view.AB) {\n this.AB = this.view.AB;\n } else {\n let errNoAB = new Error(\n \"ABViewFormDatePicerComponent:getValue(): AB was not set.\"\n );\n // sentry logs the console before the error, so dump the offending view here:\n console.log(\"view:\", JSON.stringify(this.view.toObj()));\n throw errNoAB;\n }\n }\n // NOTE: if we are using the Thai language we force the format to be \"%d/%m/%Y\" in th-TH.js:13\n // so we have to use that format here\n let dateVal = this.AB.Webix.Date.strToDate(field.getFormat())(text);\n if (this.AB.Account?._config?.languageCode == \"th\") {\n dateVal = this.AB.Webix.Date.strToDate(\"%j/%m/%Y\")(text);\n }\n const date = dateVal;\n\n if (\n this.AB.Account?._config?.languageCode == \"th\" &&\n field.settings?.dateFormat !== 1\n )\n date.setFullYear(date.getFullYear() - 543);\n\n return date;\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewFormItemComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewFormItem_${baseView.id}`,\n Object.assign({ formItem: \"\" }, ids)\n );\n }\n\n ui(uiFormItemComponent = {}) {\n // setup 'label' of the element\n const baseView = this.view;\n const form = baseView.parentFormComponent(),\n field = baseView.field?.() || null,\n label = \"\";\n const settings = form?.settings || {};\n const _uiFormItem = {\n id: this.ids.formItem,\n labelPosition: settings.labelPosition,\n labelWidth: settings.labelWidth,\n label,\n };\n\n if (field) {\n _uiFormItem.name = field.columnName;\n\n // default value\n const data = {};\n\n field.defaultValue(data);\n\n if (data[field.columnName]) _uiFormItem.value = data[field.columnName];\n\n if (settings.showLabel) _uiFormItem.label = field.label;\n\n if (field.settings.required || baseView.settings?.required)\n _uiFormItem.required = 1;\n\n if (baseView.settings?.disable === 1) _uiFormItem.disabled = true;\n\n // add data-cy to form element for better testing code\n _uiFormItem.on = {\n onAfterRender() {\n if (this.getList) {\n const popup = this.getPopup();\n\n if (!popup) return;\n\n this.getList().data.each((option) => {\n if (!option) return;\n\n // our option.ids are based on builder input and can include the ' character\n const node = popup.$view.querySelector(\n `[webix_l_id='${(option?.id ?? \"\")\n .toString()\n .replaceAll(\"'\", \"\\\\'\")}']`\n );\n\n if (!node) return;\n\n node.setAttribute(\n \"data-cy\",\n `${field.key} options ${option.id} ${field.id} ${\n form?.id || \"nf\"\n }`\n );\n });\n }\n\n this.getInputNode?.().setAttribute?.(\n \"data-cy\",\n `${field.key} ${field.columnName} ${field.id} ${\n form?.id || \"nf\"\n }`\n );\n },\n };\n\n // this may be needed if we want to format data at this point\n // if (field.format) data = field.format(data);\n\n _uiFormItem.validate = (val, data, colName) => {\n const validator = this.AB.Validation.validator();\n\n field.isValidData(data, validator);\n\n return validator.pass();\n };\n }\n\n const _ui = super.ui([\n Object.assign({}, _uiFormItem, uiFormItemComponent),\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormJsonComponent extends ABViewFormItemComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormJson_${baseView.id}`, ids);\n if (this.settings.type == \"filter\") {\n this.rowFilter = this.AB.filterComplexNew(\n `${baseView.id}_filterComplex`,\n {\n isSaveHidden: true,\n height: 300,\n borderless: false,\n showObjectName: true,\n }\n );\n }\n }\n\n getFilterField(instance) {\n if (\n instance?.settings?.filterField &&\n instance?.view?.parent?.viewComponents\n ) {\n let filterField = \"\";\n for (const [key, value] of Object.entries(\n instance.view.parent.viewComponents\n )) {\n if (value.settings.fieldId == instance.settings.filterField) {\n filterField = value;\n }\n }\n\n if (filterField?.ids?.formItem) {\n return filterField.ids.formItem;\n } else {\n return \"\";\n }\n } else {\n return \"\";\n }\n }\n\n get getSystemObjects() {\n // get list of all objects in the app\n let objects = this.AB.objects();\n // reformat objects into simple array for Webix multicombo\n // if you do not the data causes a maximum stack error\n let objectsArray = [];\n objects.forEach((obj) => {\n objectsArray.push({ id: obj.id, label: obj.label });\n });\n // return the simple array\n return objectsArray;\n }\n\n refreshFilter(values) {\n if (values) {\n let fieldDefs = [];\n values.forEach((obj) => {\n let object = this.AB.objectByID(obj);\n let fields = object.fields();\n if (fields.length) {\n fields.forEach((f) => {\n fieldDefs.push(f);\n });\n }\n });\n this.rowFilter.fieldsLoad(fieldDefs);\n if ($$(this.ids.formItem).config.value)\n this.rowFilter.setValue($$(this.ids.formItem).config.value);\n } else {\n this.rowFilter.fieldsLoad([]);\n if ($$(this.ids.formItem).config.value)\n this.rowFilter.setValue($$(this.ids.formItem).config.value);\n }\n }\n\n getValue() {\n return this.rowFilter.getValue();\n }\n\n setValue(formVals) {\n $$(this.ids.formItem).config.value = formVals;\n }\n\n ui() {\n const _ui = {};\n\n switch (\n this.settings.type ||\n this.view.settings.type ||\n this.view.constructor.defaultValues().type\n ) {\n case \"string\":\n _ui.view = \"textarea\";\n _ui.disabled = true;\n _ui.height = 200;\n _ui.format = {\n parse: function (parsed) {\n try {\n parsed = JSON.parse(parsed);\n } catch (err) {\n // already parsed\n }\n return parsed;\n },\n edit: function (stringify) {\n try {\n stringify = JSON.stringify(stringify);\n } catch (err) {\n // already a string\n }\n return stringify;\n },\n };\n break;\n case \"systemObject\":\n _ui.view = \"multicombo\";\n _ui.placeholder = this.label(\"Select one or more system objects\");\n _ui.button = false;\n _ui.stringResult = false;\n _ui.suggest = {\n selectAll: true,\n body: {\n data: this.getSystemObjects,\n template: webix.template(\"#label#\"),\n },\n };\n break;\n case \"filter\":\n _ui.view = \"forminput\";\n _ui.css = \"ab-custom-field\";\n _ui.body = this.rowFilter.ui;\n break;\n }\n\n return super.ui(_ui);\n }\n\n init() {\n // if (this.settings.type == \"filter\") {\n // this.rowFilter.init({ showObjectName: true });\n // }\n }\n\n onShow() {\n const _ui = this.ui();\n if (this?.settings?.type == \"filter\") {\n let filterField = this.getFilterField(this);\n if (!$$(filterField)) return;\n $$(filterField).detachEvent(\"onChange\");\n $$(filterField).attachEvent(\"onChange\", (values) => {\n this.refreshFilter(values);\n });\n this.rowFilter.init({ showObjectName: true });\n this.rowFilter.on(\"changed\", (val) => {\n this.setValue(val);\n });\n if ($$(this.ids.formItem).config.value) {\n this.rowFilter.setValue($$(this.ids.formItem).config.value);\n } else {\n this.rowFilter.setValue(\"\");\n }\n }\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\nconst NumberTextInput = require(\"../../../../webix_custom_components/numbertext\");\n\nmodule.exports = class ABViewFormNumberComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormNumber_${baseView.id}`, ids);\n\n this._numberTextInputKey = null;\n }\n\n get numberTextInputKey() {\n return (this._numberTextInputKey =\n this._numberTextInputKey || new NumberTextInput(this.AB._App).key);\n }\n\n ui() {\n return super.ui({\n view: this.settings.isStepper ? \"counter\" : this.numberTextInputKey,\n type: \"number\",\n validate: (val) => !isNaN(val * 1),\n });\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormReadonlyComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewFormReadonly_${baseView.id}`,\n Object.assign(\n {\n template: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field();\n\n const _ui = {\n view: \"forminput\",\n labelWidth: 0,\n paddingY: 0,\n paddingX: 0,\n readonly: true,\n css: \"ab-readonly-field\",\n // name: component.ui.name,\n // label: field.label,\n // labelPosition: settings.labelPosition, // webix.forminput does not have .labelPosition T T\n // labelWidth: settings.labelWidth,\n body: {\n id: this.ids.template,\n view: \"label\",\n borderless: true,\n css: { \"background-color\": \"#fff\" },\n label: \"\",\n },\n };\n\n const settings = baseView.parentFormComponent().settings || {};\n\n if (settings.showLabel == true && settings.labelPosition == \"top\") {\n _ui.body.height = 80;\n } else if (field.settings.useHeight) {\n _ui.body.height = parseInt(field.settings.imageHeight) || 38;\n } else _ui.body.height = 38;\n\n return super.ui(_ui);\n }\n\n async init(AB) {\n await super.init(AB);\n\n const $formItem = $$(this.ids.formItem);\n if (!$formItem) return;\n\n const $form = $formItem.getFormView();\n const rowData = $form?.getValues() ?? {};\n\n this.refresh(rowData);\n $form?.attachEvent(\"onChange\", (newv, oldv) => {\n const rowData = $form?.getValues() ?? {};\n\n this.refresh(rowData);\n });\n }\n\n onShow() {\n const $formItem = $$(this.ids.formItem);\n if (!$formItem) return;\n\n const $form = $formItem.getFormView();\n const rowData = $form?.getValues() ?? {};\n\n this.refresh(rowData);\n }\n\n getValue(rowData) {\n const field = this.view.field();\n if (!field) return null;\n\n return rowData[field.columnName];\n }\n\n refresh(rowData) {\n const baseView = this.view;\n const form = baseView.parentFormComponent(),\n field = baseView.field();\n\n const formSettings = form.settings || {};\n\n let templateLabel = \"\";\n\n if (formSettings.showLabel) {\n if (formSettings.labelPosition === \"top\")\n templateLabel = ``;\n else\n templateLabel = ``;\n }\n\n let newWidth = formSettings.labelWidth;\n\n if (this.settings.formView) newWidth += 40;\n else if (formSettings.showLabel && formSettings.labelPosition === \"top\")\n newWidth = 0;\n\n const template =\n `
    ${templateLabel}#template#
    `.replace(\n /#template#/g,\n field\n .columnHeader({\n width: newWidth,\n editable: true,\n })\n .template(rowData)\n );\n\n // Re-build template element\n $$(this.ids.template)?.setHTML(template);\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormSelectMultipleComponentComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormSelectMultiple_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field(),\n settings = this.settings;\n const options = [];\n\n if (field?.key === \"user\") options.push(...field.getUsers());\n else if (field)\n options.push(...(field.settings.options ?? settings.options ?? []));\n\n const ids = this.ids;\n const _ui = {\n id: ids.formItem,\n view: settings.type || baseView.constructor.defaultValues().type,\n options: options.map((opt) => {\n return {\n id: opt.id,\n value: opt.text,\n hex: opt.hex,\n };\n }),\n };\n\n switch (_ui.view) {\n case \"multicombo\":\n _ui.tagMode = false;\n _ui.css = \"hideWebixMulticomboTag\";\n _ui.tagTemplate = (values) => {\n const selectedOptions = [];\n const $formItem = $$(ids.formItem) ?? $$(_ui.id);\n\n values.forEach((val) => {\n selectedOptions.push($formItem.getList().getItem(val));\n });\n\n let vals = selectedOptions;\n\n if (field.getSelectedOptions)\n vals = field.getSelectedOptions(field, selectedOptions);\n\n const items = [];\n\n vals.forEach((val) => {\n let hasCustomColor = \"\";\n let optionHex = \"\";\n\n if (field.settings.hasColors && val.hex) {\n hasCustomColor = \"hascustomcolor\";\n optionHex = `background: ${val.hex};`;\n }\n\n const text = val.text ? val.text : val.value;\n\n items.push(\n `${text}`\n );\n });\n\n return items.join(\"\");\n };\n\n break;\n\n case \"checkbox\":\n // radio element could not be empty options\n _ui.options.push({\n id: \"temp\",\n value: this.label(\"Option\"),\n });\n\n break;\n }\n\n return super.ui(_ui);\n }\n\n getValue(rowData) {\n const field = this.view.field(),\n $formItem = $$(this.ids.formItem);\n\n return field.getValue($formItem, rowData);\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormSelectSingleComponentComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormSelectSingle_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field(),\n settings = baseView.settings;\n const options = [];\n\n if (field?.key === \"user\") options.push(...field.getUsers());\n else if (field)\n options.push(...(field.settings.options ?? settings.options ?? []));\n else options.push(...(settings.options ?? []));\n\n const _ui = {\n view: settings.type || baseView.constructor.defaultValues().type,\n };\n\n if (field?.settings.hasColors) {\n _ui.css = \"combowithcolors\";\n _ui.options = {\n view: \"suggest\",\n body: {\n view: \"list\",\n data: options.map((opt) => {\n return {\n id: opt.id,\n value: opt.text || opt.value,\n hex: field.settings.hasColors ? opt.hex : \"\",\n };\n }),\n template: function (value) {\n const items = [];\n\n let hasCustomColor = \"\";\n let optionHex = \"\";\n\n if (value.hex) {\n hasCustomColor = \"hascustomcolor\";\n optionHex = `background: ${value.hex};`;\n }\n\n items.push(\n `${value.value}`\n );\n\n return items.join(\"\");\n },\n },\n };\n } else\n _ui.options = options.map((opt) => {\n return {\n id: opt.id,\n value: opt.text || opt.value,\n };\n });\n\n // radio element could not be empty options\n if (_ui.view === \"radio\" && _ui.options.length < 1)\n _ui.options.push({\n id: \"temp\",\n value: this.label(\"Option\"),\n });\n\n return super.ui(_ui);\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormTextboxComponent extends (\n ABViewFormItemComponent\n) {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormTextbox_${baseView.id}`, ids);\n this.type =\n this.settings.type ||\n this.view.settings.type ||\n this.view.constructor.defaultValues().type;\n }\n\n ui() {\n const _ui = {};\n\n switch (this.type) {\n case \"single\":\n _ui.view = \"text\";\n break;\n case \"multiple\":\n _ui.view = \"textarea\";\n _ui.height = 200;\n break;\n case \"rich\":\n _ui.view = \"forminput\";\n _ui.height = 200;\n _ui.css = \"ab-rich-text\";\n _ui.body = {\n view: \"tinymce-editor\",\n value: \"\",\n cdn: \"/js/webix/extras/tinymce\",\n config: {\n plugins: \"link\",\n menubar: \"format edit\",\n toolbar:\n \"undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | fontsizeselect | link\",\n },\n };\n break;\n }\n\n return super.ui(_ui);\n }\n\n async onShow() {\n if (this.type !== \"rich\") return;\n await this.initTinyMCE();\n const _ui = this.ui();\n const _uiFormItem = _ui.rows[0];\n let $formItem = $$(this.ids.formItem);\n\n // WORKAROUND : to fix breaks TinyMCE when switch pages/tabs\n // https://forum.webix.com/discussion/6772/switching-tabs-breaks-tinymce\n if ($formItem) {\n // recreate rich editor\n $formItem = this.AB.Webix.ui(_uiFormItem, $formItem);\n\n // Add dataCy to TinyMCE text editor\n const baseView = this.view;\n\n $formItem\n .getChildViews()[0]\n .getEditor(true)\n .then((editor) => {\n const dataCy = `${baseView.key} rich ${_uiFormItem.name} ${\n baseView.id ?? \"\"\n } ${baseView.parent?.id ?? \"\"}`;\n\n editor.contentAreaContainer.setAttribute(\"data-cy\", dataCy);\n });\n }\n }\n\n /**\n * Ensure TinyMCE has been loaded and initialized.\n */\n async initTinyMCE() {\n await this.AB.custom[\"tinymce-editor\"].init();\n }\n};\n","const ABViewFormItemComponent = require(\"./ABViewFormItemComponent\");\n\nmodule.exports = class ABViewFormTreeComponent extends ABViewFormItemComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewFormTree_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n const field = baseView.field();\n\n const _ui = {};\n\n // this field may be deleted\n if (!field) return super.ui(_ui);\n\n const formSettings = baseView.parentFormComponent().settings || {};\n\n const requiredClass =\n field.settings.required === 1 ? \"webix_required\" : \"\";\n\n let templateLabel = \"\";\n\n if (formSettings.showLabel) {\n if (formSettings.labelPosition === \"top\")\n templateLabel = ``;\n else\n templateLabel = ``;\n }\n\n let newWidth = formSettings.labelWidth;\n\n if (this.settings.formView) newWidth += 40;\n\n const template = `${templateLabel}#template#`\n .replace(/#width#/g, formSettings.labelWidth)\n .replace(/#label#/g, field.label)\n .replace(\n /#template#/g,\n field.columnHeader({\n width: newWidth,\n }).template\n );\n\n _ui.view = \"template\";\n _ui.css = \"webix_el_box\";\n _ui.height =\n field.settings.useHeight === 1\n ? parseInt(field.settings.imageHeight)\n : 38;\n _ui.borderless = true;\n\n _ui.template = `
    ${template}
    `;\n\n _ui.onClick = {\n customField: (id, e, trg) => {\n const rowData = {},\n node = $$(this.ids.formItem).$view;\n\n rowData[field.columnName] = this.getValue();\n field.customEdit(rowData, this.AB._App, node, this);\n },\n };\n\n return super.ui(_ui);\n }\n\n getValue(rowData) {\n let vals = $$(this.ids.formItem).getValues();\n\n // Pass empty string if the returned values is empty array\n if (Array.isArray(vals) && vals.length === 0) vals = \"\";\n\n return vals;\n }\n};\n","import ABViewComponent from \"./ABViewComponent\";\n\nexport default class ABViewGanttComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewGantt_${baseView.id}`,\n Object.assign(\n {\n menu: \"\",\n gantt: \"\",\n },\n ids\n )\n );\n\n this._tempDC = null;\n // {ABDataCollection}\n // A link to a DC that was passed in. NOTE: this is only for\n // the temp DCs created in the AppBuilder Designer and passed\n // in. Normal DCs are handled by the default CurrentDatacollection\n // methods.\n\n this.TitleField = null;\n this.StartDateField = null;\n this.EndDateField = null;\n this.DurationField = null;\n this.ProgressField = null;\n this.NotesField = null;\n\n this.originalStartDate = null;\n this.originalEndDate = null;\n\n this.pendingAdds = {};\n // {Promise} /* id : {Promise} */\n // In order to prevent a race condition where multiple adds can be\n // generated on the same item, we catch the repeats and just return\n // the same data for each.\n\n const idGantt = this.ids.gantt;\n\n this.ganttElement = {\n isExistsTask: (taskId) => {\n const localService = $$(idGantt).getService(\"local\");\n if (!localService) return false;\n\n const tasksData = localService.tasks();\n if (!tasksData || !tasksData.exists) return false;\n\n return tasksData.exists(taskId);\n },\n removeTask: (taskId) => {\n if (!this.ganttElement.isExistsTask(taskId)) return;\n\n const opsService = $$(idGantt).getService(\"operations\");\n if (!opsService) return;\n\n return opsService.removeTask(taskId);\n },\n };\n }\n\n ui() {\n const ids = this.ids;\n const self = this;\n const { YEAR_SCALE, MONTH_SCALE, DAY_SCALE } = this.getConstantScales;\n const _ui = super.ui([\n {\n cols: [\n { fillspace: true },\n {\n view: \"menu\",\n id: ids.menu,\n layout: \"x\",\n width: 300,\n data: [\n {\n id: \"day\",\n value: this.label(\"Day\"),\n },\n {\n id: \"week\",\n value: this.label(\"Week\"),\n },\n {\n id: \"month\",\n value: this.label(\"Month\"),\n },\n {\n id: \"year\",\n value: this.label(\"Year\"),\n },\n ],\n on: {\n onItemClick: (id /* , e, node */) => {\n this.setScale(id);\n },\n },\n },\n ],\n },\n {\n id: ids.gantt,\n view: \"gantt\",\n scales: [YEAR_SCALE, MONTH_SCALE, DAY_SCALE],\n override: new Map([\n [\n gantt.services.Backend,\n // global webix gantt object\n class MyBackend extends gantt.services.Backend {\n async tasks() {\n const DC = self.CurrentDatacollection;\n if (!DC) return [];\n\n // if (DC.dataStatus != DC.dataStatusFlag.initialized) {\n // await DC.loadData().catch((err) => {\n // console.error(err);\n // });\n // }\n return (DC.getData() || []).map((d, indx) =>\n self.convertFormat(d, indx)\n );\n }\n links() {\n return Promise.resolve([]);\n }\n async addTask(obj, index, parent) {\n if (!self.pendingAdds[obj.id]) {\n self.pendingAdds[obj.id] = self.taskAdd(obj);\n }\n const newTask = await self.pendingAdds[obj.id];\n delete self.pendingAdds[obj.id];\n return {\n id: (newTask || {}).id,\n };\n }\n async updateTask(id, obj) {\n return await self.taskUpdate(obj.id, obj);\n }\n async removeTask(id) {\n return await self.taskRemove(id);\n }\n },\n ],\n ]),\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n // #HACK!: as of webix v.8.1.1 there is a visual glitch of the Gantt\n // object if you replace a gantt widget with a new definition (like in\n // the ABDesigner you can switch from Gantt1 to Gantt2 in the object\n // workspace). In that one case, the menu would disappear even though\n // the data is present. So this makes sure the menu is shown\n const $menu = $$(this.ids.menu);\n\n if ($menu) $menu.showItem(\"day\");\n }\n\n /**\n * @method CurrentDatacollection()\n * A helper to return the current ABDataCollection we are working with.\n * @return {ABDataCollection}\n */\n get CurrentDatacollection() {\n return super.CurrentDatacollection || this._tempDC;\n }\n\n /**\n * @method convertFormat()\n * Convert an ABObject's row value into a gantt task data format.\n * @param {obj} row\n * The current row of data returned from an ABObject.\n * @param {int} index\n * The order of this task.\n * @return {obj}\n * A key=>value hash corresponding to the gantt task that\n * represents this row of data.\n */\n convertFormat(row = {}, index = null) {\n const data = {};\n const StartDateField = this.StartDateField;\n const EndDateField = this.EndDateField;\n const DurationField = this.DurationField;\n\n if (!StartDateField || (!EndDateField && !DurationField)) return data;\n\n const currDate = new Date();\n\n data[\"id\"] = row.id || row.uuid;\n data[\"type\"] = \"task\";\n data[\"parent\"] = 0;\n data[\"open\"] = true;\n\n // define label\n const TitleField = this.TitleField;\n const ProgressField = this.ProgressField;\n const NotesField = this.NotesField;\n\n data[\"text\"] = TitleField\n ? row[TitleField.columnName] || \"\"\n : this.CurrentObject.displayData(row);\n data[\"start_date\"] = row[StartDateField.columnName] || currDate;\n data[\"progress\"] = ProgressField\n ? parseFloat(row[ProgressField.columnName] || 0)\n : 0;\n\n if (NotesField) data[\"details\"] = row[NotesField.columnName] || \"\";\n\n if (EndDateField)\n data[\"end_date\"] = row[EndDateField.columnName] || currDate;\n\n if (DurationField) data[\"duration\"] = row[DurationField.columnName] || 1;\n\n // Default values\n if (!data[\"end_date\"] && !data[\"duration\"]) {\n data[\"end_date\"] = currDate;\n data[\"duration\"] = 1;\n }\n\n if (index) data[\"order\"] = index;\n\n return data;\n }\n\n /**\n * @method convertValues()\n * Convert a Gantt task into a set of values for our ABObject.\n * @param {obj} task\n * The current gantt task data.\n * @return {obj}\n * A key=>value hash corresponding to the ABObject that\n * is tied to this gantt.\n */\n convertValues(task) {\n const patch = {};\n const TitleField = this.TitleField;\n const StartDateField = this.StartDateField;\n const ProgressField = this.ProgressField;\n const NotesField = this.NotesField;\n const EndDateField = this.EndDateField;\n const DurationField = this.DurationField;\n\n if (TitleField) patch[TitleField.columnName] = task[\"text\"] || \"\";\n\n if (StartDateField) patch[StartDateField.columnName] = task[\"start_date\"];\n\n if (ProgressField)\n patch[ProgressField.columnName] = parseFloat(task[\"progress\"] || 0);\n\n if (NotesField) patch[NotesField.columnName] = task[\"details\"];\n\n if (EndDateField) patch[EndDateField.columnName] = task[\"end_date\"];\n\n if (DurationField) patch[DurationField.columnName] = task[\"duration\"];\n\n return patch;\n }\n\n /**\n * @method objectLoad\n * @param {ABObject} object\n */\n objectLoad(object) {\n super.objectLoad(object);\n\n // const baseView = this.view;\n const settings = this.settings;\n\n if (object) {\n this.TitleField = object.fieldByID(settings.titleFieldID);\n this.StartDateField = object.fieldByID(settings.startDateFieldID);\n this.EndDateField = object.fieldByID(settings.endDateFieldID);\n this.DurationField = object.fieldByID(settings.durationFieldID);\n this.ProgressField = object.fieldByID(settings.progressFieldID);\n this.NotesField = object.fieldByID(settings.notesFieldID);\n }\n }\n\n /**\n * @method datacollectionLoad\n * @param {ABDatacollection} datacollection\n */\n datacollectionLoad(datacollection) {\n super.datacollectionLoad(datacollection);\n\n const dc = this.CurrentDatacollection || datacollection;\n if (!dc) return;\n\n // NOTE: this can happen in the ABDesigner object workspace.\n // we send in a temp DC with no .id\n this._tempDC = datacollection;\n\n // NOTE: keep .objectLoad() before any .initData() is called.\n this.objectLoad(dc.datasource);\n\n const eventNames = [\"create\", \"update\", \"delete\", \"initializedData\"];\n\n eventNames.forEach((e) => {\n if (\n e in dc._events &&\n this.__events.findIndex((eo) => eo.eventName === e) !== -1\n )\n return;\n\n switch (e) {\n case \"delete\":\n this.eventAdd({\n emitter: dc,\n eventName: \"delete\",\n listener: (taskId) => {\n // remove this task in gantt\n if (this.ganttElement.isExistsTask(taskId))\n this.ganttElement.removeTask(taskId);\n },\n });\n\n break;\n\n default:\n this.eventAdd({\n emitter: dc,\n eventName: e,\n listener: () => {\n this.initData();\n },\n });\n\n break;\n }\n });\n }\n\n /**\n * @function hide()\n * hide this component.\n */\n hide() {\n $$(this.ids.component)?.hide();\n }\n\n initData() {\n const ganttElem = $$(this.ids.gantt);\n if (!ganttElem) return;\n\n const dataService = ganttElem.getService(\"local\");\n if (!dataService) return;\n\n const dcTasks = dataService.tasks();\n if (!dcTasks) return;\n\n // gantt v 8.1.1\n // Note: there is a race condition that can happen here.\n // dataService.tasks() calls the MyBackend.tasks() above which\n // returns a Promise.\n // when you call dcTasks.clearAll() before the promise\n // is resolved, the gantt internally throws an error.\n //\n // So give webix some time to internally complete it's process\n // before we do .clearAll();\n setTimeout(() => {\n dcTasks.clearAll();\n\n const DC = this.CurrentDatacollection;\n const gantt_data = {\n data: DC\n ? (DC.getData() || []).map((d, index) =>\n this.convertFormat(d, index)\n )\n : [],\n };\n\n // check required fields before parse\n if (this.StartDateField && (this.EndDateField || this.DurationField)) {\n dcTasks.parse(gantt_data);\n }\n\n // Keep original start and end dates for calculate scale to display\n const currScale = dataService.getScales();\n\n this.originalStartDate = currScale.start;\n this.originalEndDate = currScale.end;\n\n this.sort();\n }, 10);\n }\n\n get getConstantScales() {\n const DAY_SCALE = { unit: \"day\", format: \"%d\" },\n WEEK_SCALE = {\n unit: \"week\",\n format: (start) => {\n const parser = webix.Date.dateToStr(\"%d %M\");\n const wstart = webix.Date.weekStart(start);\n const wend = webix.Date.add(\n webix.Date.add(wstart, 1, \"week\", true),\n -1,\n \"day\",\n true\n );\n\n return parser(wstart) + \" - \" + parser(wend);\n },\n },\n MONTH_SCALE = { unit: \"month\", format: \"%F\" },\n YEAR_SCALE = { unit: \"year\", format: \"%Y\" };\n\n return {\n DAY_SCALE,\n WEEK_SCALE,\n MONTH_SCALE,\n YEAR_SCALE,\n };\n }\n\n setScale(scale) {\n const ganttElem = $$(this.ids.gantt);\n if (!ganttElem) return;\n\n const ganttData = ganttElem.getService(\"local\");\n if (!ganttData) return;\n\n const newScales = [];\n const { YEAR_SCALE, MONTH_SCALE, WEEK_SCALE, DAY_SCALE } =\n this.getConstantScales;\n\n switch (scale) {\n case \"day\":\n newScales.push(YEAR_SCALE, MONTH_SCALE, DAY_SCALE);\n break;\n\n case \"week\":\n newScales.push(YEAR_SCALE, MONTH_SCALE, WEEK_SCALE);\n break;\n\n case \"month\":\n newScales.push(YEAR_SCALE, MONTH_SCALE);\n break;\n\n case \"year\":\n newScales.push(YEAR_SCALE);\n break;\n }\n\n const abWebix = this.AB.Webix;\n const currScale = ganttElem.getService(\"local\").getScales(),\n start = abWebix.Date.add(this.originalStartDate, -1, scale, true),\n end = abWebix.Date.add(this.originalEndDate, 1, scale, true);\n\n ganttData.setScales(\n start,\n end,\n currScale.precise,\n currScale.cellWidth,\n currScale.cellHeight,\n newScales\n );\n ganttElem.$app.refresh();\n ganttElem.getState().$batch({ top: 0, left: 0 });\n }\n\n /**\n * @function show()\n * Show this component.\n */\n onShow() {\n super.onShow();\n this.datacollectionLoad(this.datacollection);\n\n $$(this.ids.component)?.show();\n }\n\n sort() {\n // TODO: sorting;\n return;\n // const gantt = $$(ids.gantt).getGantt();\n // if (!gantt) return;\n\n // // default sort\n // const MAX_date = new Date(8640000000000000);\n // gantt.sort(function(a, b) {\n // const aStartDate = a[\"start_date\"],\n // aEndDate = a[\"end_date\"],\n // aDuration = a[\"duration\"] || 1,\n // bStartDate = b[\"start_date\"],\n // bEndDate = b[\"end_date\"],\n // bDuration = b[\"duration\"] || 1;\n\n // // if no start date, then be a last item\n // if (\n // a[this.StartDateField.columnName] == null ||\n // b[this.StartDateField.columnName] == null\n // ) {\n // return (\n // (a[this.StartDateField.columnName] || MAX_date) -\n // (b[this.StartDateField.columnName] || MAX_date)\n // );\n // } else if (aStartDate != bStartDate) {\n // return aStartDate - bStartDate;\n // } else if (aEndDate != bEndDate) {\n // return aEndDate - bEndDate;\n // } else if (aDuration != bDuration) {\n // return bDuration - aDuration;\n // }\n // }, false);\n }\n\n async taskAdd(taskData) {\n const patch = this.convertValues(taskData);\n const ab = this.AB;\n\n try {\n // this method is being used in MyBackend addTask() method\n // On Webix documents, the method addTask() have to return the added object so we have to pass the data we add through this method.\n return await this.CurrentObject?.model().create(patch);\n } catch (e) {\n ab.Webix.alert({\n title: this.label(\"Error Saving Item\"),\n ok: this.label(\"Okay\"),\n text: this.label(\"Unable to save this item.\"),\n });\n ab.notify.developer(e, {\n context: \"ABViewGantt:taskAdd(): Error Saving Item\",\n patch,\n });\n\n throw e;\n }\n }\n\n async taskRemove(rowId) {\n const ab = this.AB;\n\n try {\n // this method is being used in MyBackend removeTask() method\n // On Webix documents, the method removeTask() return {} (an empty object) so we return {} in removeTask() instead.\n await this.CurrentObject.model().delete(rowId);\n\n return {};\n } catch (e) {\n ab.Webix.alert({\n title: this.label(\"Error Removing Item\"),\n ok: this.label(\"Okay\"),\n text: this.label(\"Unable to remove this item.\"),\n });\n ab.notify.developer(e, {\n context: \"ABViewGantt:taskRemove(): Error Removing Item\",\n rowId,\n });\n\n throw e;\n }\n }\n\n async taskUpdate(rowId, updatedTask) {\n const patch = this.convertValues(updatedTask);\n const ab = this.AB;\n\n try {\n // this method is being used in MyBackend updateTask() method\n // On Webix documents, the method updateTask() return {} (an empty object) so we return {} in updateTask() instead.\n await this.CurrentObject.model().update(rowId, patch);\n\n return {};\n } catch (e) {\n ab.Webix.alert({\n title: this.label(\"Error Updating Item\"),\n ok: this.label(\"Okay\"),\n text: this.label(\"Unable to update this item.\"),\n });\n ab.notify.developer(e, {\n context: \"ABViewGantt:taskUpdate(): Error Updating Item\",\n patch,\n });\n\n throw e;\n }\n }\n}\n","import ABViewComponent from \"./ABViewComponent\";\nimport ABPopupExport from \"../ABViewGridPopupExport\";\nimport ABPopupMassUpdateClass from \"../ABViewGridPopupMassUpdate\";\nimport ABPopupSortField from \"../ABViewGridPopupSortFields\";\n\nexport default class ABViewGridComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewGrid_${baseView.id}`,\n Object.assign(\n {\n table: \"\",\n\n // component: `${base}_component`,\n toolbar: \"\",\n buttonDeleteSelected: \"\",\n\n buttonFilter: \"\",\n buttonMassUpdate: \"\",\n buttonSort: \"\",\n buttonExport: \"\",\n\n globalSearchToolbar: \"\",\n\n datatable: \"\",\n },\n ids\n )\n );\n\n this._handler_filterData = (fnFilter, filterRules) => {\n this.callbackFilterData(fnFilter, filterRules); // be notified when there is a change in the filter\n };\n\n this.handler_select = (...params) => {\n this.selectRow(...params);\n };\n // {fn} .handler_select\n // the callback fn for our selectRow()\n // We want this called when the .datacollection we are linked to\n // emits an \"onChange\" event.\n\n this.detatch();\n baseView.filterHelper.on(\"filter.data\", this._handler_filterData);\n\n // derive these from viewGrid\n this.id = baseView.id;\n\n /////\n ///// For TEsting:\n /////\n // this.settings.showToolbar = 1;\n // this.settings.isEditable = 1;\n // this.settings.isExportable = 1;\n // this.settings.gridFilter = {\n // filterOption: 1,\n // userFilterPosition: \"form\",\n // isGlobalToolbar: 1,\n // };\n\n // this.settings.detailsPage = \"some-uuid\";\n // this.settings.detailTab = \"some_uuid_2\";\n // this.settings.trackView = 1;\n /////\n ///// end testing\n /////\n\n this.columnSplitLeft = 0;\n // {integer}\n // Which column to \"split\"/\"freeze\" from the left side of the grid.\n\n this.columnSplitRight = 0;\n // {integer}\n // The # columns to the right to freeze.\n\n // this.datacollection = null;\n // // {ABDataCollection}\n // // The Webix DataCollection that manages the data we are displaying.\n\n this.validationError = false;\n // {bool}\n // Has a Validation Error occured?\n\n this.linkPage = baseView.linkPageHelper.component();\n // {ABViewPropertyLinkPage}\n //\n\n const idTable = this.ids.table;\n const ab = this.AB;\n\n this.PopupExport = new ABPopupExport(idTable);\n this.PopupExport.init(ab);\n // {ABViewGridPopupExport}\n // Popup for managing how to export our data.\n\n this.PopupMassUpdateComponent = new ABPopupMassUpdateClass(this, idTable);\n this.PopupMassUpdateComponent.init(ab);\n // this.PopupMassUpdateComponent.on(\"\")\n // {}\n // The popup for performing a Mass Edit operation.\n\n this.PopupSortDataTableComponent = new ABPopupSortField(idTable);\n this.PopupSortDataTableComponent.init(ab);\n this.PopupSortDataTableComponent.on(\"changed\", (sortOptions) => {\n this.callbackSortData(sortOptions);\n });\n // {ABViewGridPopupSortFields}\n // The popup for adding sort criteria to our grid.\n\n this.skippableColumns = [\n \"appbuilder_select_item\",\n \"appbuilder_view_detail\",\n \"appbuilder_view_track\",\n \"appbuilder_view_edit\",\n \"appbuilder_trash\",\n ];\n // {array}\n // An array of column names that should be skipped from some of our\n // event handlers.\n\n // this.EditField = null;\n // // {ABFieldXXX}\n // // Which ABField is the focus of our PopupHeader menu?\n\n // this.EditNode = null;\n // // {HTML DOM}\n // // The webix.$node where the ABField Header is that our PopupHeader\n // // should be displayed at.\n\n this.ignoreLocalSettings = false;\n // {bool}\n // should we ignore our local settings in our current context?\n // (used in ABDesigner when our settings will change as we need to\n // use those instead of the saved settings.)\n\n this._gridSettings = null;\n // {hash} { grid.id : [ {columnHeader}, {columnHeader} ...]}\n // Keep a global copy of our local Grid settings, so we can optimize the header\n // sizes.\n\n this._isDatacollectionLoaded = false;\n }\n\n // {string}\n // the unique key for ABViewGrids to store/retrieve their local settings\n get keyStorageSettings() {\n return \"abviewgrid_settings\";\n }\n\n detatch() {\n this.view.filterHelper.removeAllListeners(\"filter.data\");\n [\"changeCursor\", \"cursorStale\", \"cursorSelect\"].forEach((key) => {\n this.datacollection?.removeListener(key, this.handler_select);\n });\n }\n\n /**\n * @method getColumnIndex()\n * return the Datatable.getColumnIndex() value\n * @param {string} id\n * the uuid of the column we are referencing.\n * @return {integer}\n */\n getColumnIndex(id) {\n let indx = this.getDataTable().getColumnIndex(id);\n if (!this.settings.massUpdate) {\n // the index is 0 based. So if the massUpdate feature isn't\n // enabled, we need to add 1 to the result so they look like\n // a 1, 2, ...\n\n indx++;\n }\n return indx;\n }\n\n uiDatatable() {\n const ids = this.ids;\n const settings = this.settings;\n const self = this;\n\n let view = \"datatable\";\n\n if (settings.isTreeDatable || settings.groupBy)\n // switch datatable to support tree\n view = \"treetable\";\n\n let selectType = \"cell\";\n\n if (!settings.isEditable && (settings.detailsPage || settings.editPage))\n selectType = \"row\";\n\n return {\n view,\n id: ids.datatable,\n resizeColumn: { size: 10 },\n resizeRow: { size: 10 },\n prerender: false,\n editable: settings.isEditable,\n fixedRowHeight: false,\n height: settings.height || 0,\n editaction: \"custom\",\n select: selectType,\n footer:\n // show footer when there are summary columns\n settings.summaryColumns.length > 0 ||\n settings.countColumns.length > 0,\n tooltip: true,\n // tooltip: {\n // // id: ids.tooltip,\n // template: (obj, common) => {\n // return this.toolTip(obj, common);\n // },\n // on: {\n // // When showing a larger image preview the tooltip sometime displays part of the image off the screen...this attempts to fix that problem\n // onBeforeRender: function () {\n // self.toolTipOnBeforeRender(this.getNode());\n // },\n // onAfterRender: function (data) {\n // self.toolTipOnAfterRender(this.getNode());\n // },\n // },\n // },\n dragColumn: true,\n on: {\n onBeforeSelect: function (data, preserve) {\n if (self.skippableColumns.indexOf(data.column) != -1) {\n return false;\n } else if (settings.isEditable) {\n const currObject = self.datacollection.datasource;\n const selectField = currObject.fields(\n (f) => f.columnName === data.column\n )[0];\n\n if (selectField == null) return true;\n\n const cellNode = this.getItemNode({\n row: data.row,\n column: data.column,\n }),\n rowData = this.getItem(data.row);\n\n return selectField.customEdit(rowData, null, cellNode);\n } else if (!settings.detailsPage && !settings.editPage)\n return false;\n },\n onAfterSelect: (data, preserve) => {\n // {ABObject} data\n // the selected object\n // {bool} prevent\n // indicates whether the previous selection state should\n // be saved. (is multiselect and they are holding SHIFT)\n if (this.settings.isEditable) {\n this.onAfterSelect(data, preserve);\n }\n },\n // onBeforeEditStart: function (/*id*/) {\n // // Not sure what this is suposed to check, but this condition\n // // will always be false.\n // if (!this.getItem(id) == \"appbuilder_select_item\") return false;\n // },\n onCheck: function (row, col, val) {\n // Update checkbox data\n if (col == \"appbuilder_select_item\") {\n // do nothing because we will parse the table once we decide\n // if we are deleting or updating rows\n self.toggleUpdateDelete();\n } else {\n if (settings.isEditable) {\n // get the field related to this col\n const currObject = self.datacollection.datasource;\n const selectField = currObject.fields(\n (f) => f.columnName === col\n )[0];\n\n // if the colum is not the select item column move on to\n // the next step to save\n const state = {\n value: val,\n };\n const editor = {\n row: row,\n column: col,\n config: { fieldID: selectField?.id ?? null },\n };\n\n self.onAfterEditStop(state, editor);\n } else {\n const node = this.getItemNode({\n row: row,\n column: col,\n });\n const checkbox = node.querySelector(\n 'input[type=\"checkbox\"]'\n );\n\n if (val == 1) {\n checkbox.checked = false;\n } else {\n checkbox.checked = true;\n }\n }\n }\n },\n onBeforeEditStop: function (state, editor) {\n // Check if data loading is complete\n const oldValue = state.old;\n let newValue = state.value;\n if (!Array.isArray(newValue)) newValue = [newValue];\n if (\n oldValue != null &&\n oldValue != \"\" &&\n // If options does not load completely, then Webix returns state.value as ['', '', '']\n newValue.filter((val) => val != null && val != \"\").length <\n 1 &&\n // Check if no data load to the option\n editor.getPopup?.().getList?.().data?.find({}).length < 1\n ) {\n return false;\n }\n },\n onAfterEditStop: (state, editor, ignoreUpdate) => {\n if (this.validationError == false)\n this.onAfterEditStop(state, editor, ignoreUpdate);\n },\n onValidationError: function () {\n this.validationError = true;\n },\n onValidationSuccess: function () {\n this.validationError = false;\n },\n\n // We are sorting with server side requests now so we can remove this\n // onAfterLoad: function () {\n // _logic.onAfterLoad();\n // },\n onColumnResize: function (\n columnName,\n newWidth,\n oldWidth,\n user_action\n ) {\n // if we resize the delete column we want to resize the last\n // column but Webix will not allow since the column is split\n const rightSplitItems = [\n \"appbuilder_view_detail\",\n \"appbuilder_view_track\",\n \"appbuilder_view_edit\",\n \"appbuilder_trash\",\n ];\n\n if (rightSplitItems.indexOf(columnName) != -1) {\n // Block events so we can leave the delete column alone\n this.blockEvent();\n // keeps original width\n this.setColumnWidth(columnName, oldWidth);\n this.unblockEvent();\n // Listen to events again\n\n // find the last column's config\n const column = self.getLastColumn();\n\n columnName = column.id;\n\n // determine if we are making the column larger or smaller\n if (newWidth < oldWidth) {\n newWidth = column.width + 40;\n // add 40 because there is not any more space to drag so we\n // will allow 40px increments\n } else {\n newWidth = column.width - (newWidth - 40);\n // take the column's width and subtrack the difference of\n // the expanded delet column drag\n }\n // we don't want columns to be smaller than 50 ?? do we ??\n // I could be wrong maybe a checkbox could be smaller so this\n // could change\n if (newWidth < 50) {\n newWidth = 50;\n }\n // minWidth is important because we are using fillspace:true\n column.minWidth = newWidth;\n // Sets the UI\n this.setColumnWidth(columnName, newWidth);\n }\n // Saves the new width\n if (user_action) {\n self.onColumnResize(\n columnName,\n newWidth,\n oldWidth,\n user_action\n );\n }\n },\n onRowResize: (rowId) => {\n // V2: we no longer do anything onRowResize()\n // before we saved the row height in the record.\n // this.onRowResize(rowId);\n },\n onBeforeColumnDrag: (sourceId, event) =>\n !(this.skippableColumns.indexOf(sourceId) !== -1),\n onBeforeColumnDrop: (sourceId, targetId, event) =>\n // Make sure we are not trying to drop onto one of our special\n // columns ...\n !(this.skippableColumns.indexOf(targetId) !== -1),\n onAfterColumnDrop: (sourceId, targetId, event) =>\n this.onAfterColumnDrop(sourceId, targetId, event),\n // onAfterColumnShow: function (id) {\n // // console.warn(\"!! ToDo: onAfterColumnShow()\");\n // // $$(self.webixUiId.visibleFieldsPopup).showField(id);\n // },\n // onAfterColumnHide: function (id) {\n // // console.warn(\"!! ToDo: onAfterColumnHide()\");\n // // $$(self.webixUiId.visibleFieldsPopup).hideField(id);\n // },\n\n onHeaderClick: (id, e, node) => {\n /* if (settings.configureHeaders) */\n this.onHeaderClick(id, e, node);\n },\n },\n };\n }\n\n uiFilter() {\n return this.view.filterHelper.ui();\n\n // make sure onFilterData is now .emit()ed instead of passing in a callback.\n }\n\n /**\n * @method uiToolbar()\n * Return the webix definition for the toolbar row for our Grids.\n * @return {json}\n */\n uiToolbar() {\n const ids = this.ids;\n const self = this;\n\n return {\n view: \"toolbar\",\n id: ids.toolbar,\n hidden: true,\n css: \"ab-data-toolbar\",\n cols: [\n {\n view: \"button\",\n id: ids.buttonMassUpdate,\n css: \"webix_transparent\",\n label: this.label(\"Edit\"),\n icon: \"fa fa-pencil-square-o\",\n type: \"icon\",\n disabled: true,\n autowidth: true,\n click: function () {\n self.toolbarMassUpdate(this.$view);\n },\n },\n {\n view: \"button\",\n id: ids.buttonDeleteSelected,\n css: \"webix_transparent\",\n label: this.label(\"Delete\"),\n icon: \"fa fa-trash\",\n type: \"icon\",\n disabled: true,\n autowidth: true,\n click: function () {\n self.toolbarDeleteSelected(this.$view);\n },\n },\n {\n view: \"button\",\n id: ids.buttonFilter,\n css: \"webix_transparent\",\n label: this.label(\"Filters\"),\n icon: \"fa fa-filter\",\n type: \"icon\",\n autowidth: true,\n click: function () {\n self.toolbarFilter(this.$view);\n },\n },\n {\n view: \"button\",\n id: ids.buttonSort,\n css: \"webix_transparent\",\n label: this.label(\"Sort\"),\n icon: \"fa fa-sort\",\n type: \"icon\",\n autowidth: true,\n click: function () {\n self.toolbarSort(this.$view);\n },\n },\n {\n view: \"button\",\n id: ids.buttonExport,\n css: \"webix_transparent\",\n label: this.label(\"Export\"),\n icon: \"fa fa-print\",\n type: \"icon\",\n autowidth: true,\n click: function () {\n self.toolbarExport(this.$view);\n },\n },\n {},\n {\n id: ids.globalSearchToolbar,\n view: \"search\",\n placeholder: this.label(\"Search...\"),\n on: {\n onTimedKeyPress: () => {\n const searchText = $$(ids.globalSearchToolbar).getValue();\n\n this.view.filterHelper.externalSearchText(searchText);\n },\n },\n },\n ],\n };\n }\n\n ui() {\n const _uiGrid = {\n id: this.ids.table,\n type: \"space\",\n borderless: true,\n rows: [\n {},\n {\n view: \"label\",\n label: this.label(\"Select an object to load.\"),\n inputWidth: 200,\n align: \"center\",\n },\n {},\n ],\n };\n\n const settings = this.settings;\n\n if (this.datacollection || settings.dataviewID !== \"\") {\n _uiGrid.padding = settings.padding;\n _uiGrid.rows = [];\n if (settings.showToolbar) {\n _uiGrid.rows.push(this.uiToolbar());\n }\n if (this.settings.gridFilter.filterOption) {\n _uiGrid.rows.push(this.uiFilter());\n }\n\n _uiGrid.rows.push(this.uiDatatable());\n }\n\n const _ui = super.ui([_uiGrid]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB, accessLevel = 2) {\n if (AB) await super.init(AB);\n\n const self = this;\n const ids = this.ids;\n\n // WORKAROUND : Where should we define this ??\n // For include PDF.js\n const abWebix = AB.Webix;\n\n abWebix.codebase = \"\";\n abWebix.cdn = \"/js/webix\";\n\n // this shows the options to Hide, Filter, sort , etc...\n // only in Designer?\n // PopupHeaderEditComponent.init({\n // onClick: _logic.callbackHeaderEdit, // be notified when there is a change in the hidden fields\n // });\n\n // NOTE: register the onAfterRender() here, so it only registers\n // one.\n const $DataTable = this.getDataTable();\n\n let throttleCustomDisplay = null;\n let scrollStarted = null;\n\n if (!$DataTable) return;\n\n abWebix.extend($DataTable, abWebix.ProgressBar);\n\n $DataTable.config.accessLevel = accessLevel;\n\n if (accessLevel < 2) $DataTable.define(\"editable\", false);\n\n const settings = this.settings;\n\n const customDisplays = (data) => {\n const CurrentObject = this.datacollection?.datasource;\n\n if (!CurrentObject || !$DataTable.data) return;\n\n const displayRecords = [];\n\n const verticalScrollState = $DataTable.getScrollState().y,\n rowHeight = $DataTable.config.rowHeight,\n height =\n $DataTable.$view.querySelector(\".webix_ss_body\").clientHeight,\n startRecIndex = Math.floor(verticalScrollState / rowHeight),\n endRecIndex = startRecIndex + $DataTable.getVisibleCount();\n\n let index = 0;\n\n $DataTable.data.order.each((id) => {\n if (id != null && startRecIndex <= index && index <= endRecIndex)\n displayRecords.push(id);\n\n index++;\n });\n\n let editable = settings.isEditable;\n\n if ($DataTable.config.accessLevel < 2) editable = false;\n\n CurrentObject.customDisplays(\n data,\n this.AB._App,\n $DataTable,\n displayRecords,\n editable\n );\n };\n\n $DataTable.attachEvent(\"onAfterRender\", function (data) {\n $DataTable.resize();\n\n if (throttleCustomDisplay) clearTimeout(throttleCustomDisplay);\n\n throttleCustomDisplay = setTimeout(() => {\n if (scrollStarted) clearTimeout(scrollStarted);\n customDisplays(this.data);\n }, 350);\n\n AB.ClassUI.CYPRESS_REF($DataTable);\n Object.keys(ids).forEach((key) => {\n const $el = $$(ids[key]);\n if ($el) {\n AB.ClassUI.CYPRESS_REF($el);\n }\n });\n });\n\n // we have some data types that have custom displays that don't look\n // right after scrolling large data sets we need to call customDisplays\n // again\n $DataTable.attachEvent(\"onScroll\", function () {\n if (scrollStarted) clearTimeout(scrollStarted);\n\n if (throttleCustomDisplay) clearTimeout(throttleCustomDisplay);\n\n scrollStarted = setTimeout(() => {\n customDisplays(this.data);\n }, 1500);\n });\n $DataTable.attachEvent(\"onAfterScroll\", function () {\n if (throttleCustomDisplay) clearTimeout(throttleCustomDisplay);\n\n throttleCustomDisplay = setTimeout(() => {\n if (scrollStarted) clearTimeout(scrollStarted);\n customDisplays(this.data);\n }, 350);\n });\n\n // Process our onItemClick events.\n // this is a good place to check if our delete/trash icon was clicked.\n $DataTable.attachEvent(\"onItemClick\", function (id, e, node) {\n // make sure we have an object selected before processing this.\n const dc = self.datacollection;\n const CurrentObject = dc?.datasource;\n\n if (!CurrentObject) return;\n\n if (settings.isEditable === 0) {\n const items = $DataTable.getItem(id);\n }\n // if this was our edit icon:\n // console.log(e.target.className);\n if (e === \"auto\" || e.target.className.indexOf(\"eye\") > -1) {\n // View a Details Page:\n self.changePage(dc, id, settings.detailsPage);\n self.toggleTab(settings.detailsTab, this);\n } else if (e.target.className.indexOf(\"pencil\") > -1) {\n self.changePage(dc, id, settings.editPage);\n self.toggleTab(settings.editTab, this);\n } else if (e.target.className.indexOf(\"track\") > -1)\n self.emit(\"object.track\", CurrentObject, id.row);\n // App.actions.openObjectTrack(CurrentObject, id.row);\n else if (e.target.className.indexOf(\"clear-combo-value\") > -1) {\n const clearValue = {};\n\n clearValue[id.column] = \"\";\n\n const updateRow = async () => {\n try {\n const response = await CurrentObject.model().update(\n id.row,\n clearValue\n );\n\n // console.log(response);\n } catch (err) {\n self.AB.notify.developer(err, {\n context: \"ABViewGridComponent.onItemClick\",\n message: \"Error updating item\",\n obj: CurrentObject.toObj(),\n id: id.row,\n });\n }\n };\n\n updateRow();\n }\n // if this was our trash icon:\n else if (e.target.className.indexOf(\"trash\") > -1) {\n // If the confirm popup is showing, then skip to show a new one\n if (!this._deleteConfirmPopup) {\n this._deleteConfirmPopup = abWebix.confirm({\n title: self.label(\"Delete data\"),\n text: self.label(\"Do you want to delete this row?\"),\n callback: (result) => {\n delete this._deleteConfirmPopup;\n if (result) {\n const deleteRow = async () => {\n try {\n const response =\n await CurrentObject.model().delete(id.row);\n\n if (response.numRows > 0) {\n $DataTable.remove(id);\n $DataTable.clearSelection();\n } else\n abWebix.alert({\n text: self.label(\n \"No rows were effected. This does not seem right.\"\n ),\n });\n } catch (err) {\n self.AB.notify.developer(err, {\n context: \"ABViewGridComponent.onItemClick\",\n message: \"Error deleting item\",\n obj: CurrentObject.toObj(),\n id: id.row,\n });\n\n //// TODO: what do we do here?\n }\n };\n\n deleteRow();\n }\n\n $DataTable.clearSelection();\n\n return true;\n },\n });\n }\n } else if (settings.detailsPage.length) {\n // If an icon wasn't selected but a details page is set\n // view the details page\n self.changePage(dc, id, settings.detailsPage);\n self.toggleTab(settings.detailsTab, this);\n } else if (settings.editPage.length) {\n // If an icon wasn't selected but an edit page is set\n // view the edit page\n self.changePage(dc, id, settings.editPage);\n self.toggleTab(settings.editTab, this);\n }\n });\n\n // ABViewGrid Original init();\n if (settings.showToolbar) {\n if (\n settings.massUpdate ||\n settings.isSortable ||\n settings.isExportable ||\n (settings.gridFilter &&\n settings.gridFilter.filterOption &&\n settings.gridFilter.userFilterPosition === \"toolbar\")\n )\n $$(ids.toolbar).show();\n\n if (!settings.massUpdate) {\n $$(ids.buttonMassUpdate).hide();\n $$(ids.buttonDeleteSelected).hide();\n }\n\n if (!settings.allowDelete) $$(ids.buttonDeleteSelected).hide();\n\n if (settings.gridFilter) {\n if (\n settings.gridFilter.filterOption !== 1 ||\n settings.gridFilter.userFilterPosition !== \"toolbar\"\n )\n $$(ids.buttonFilter).hide();\n\n if (\n settings.gridFilter.filterOption === 3 &&\n settings.gridFilter.globalFilterPosition === \"single\"\n )\n $DataTable.hide();\n\n if (settings.gridFilter.isGlobalToolbar)\n $$(ids.globalSearchToolbar).show();\n else $$(ids.globalSearchToolbar).hide();\n\n if (settings.gridFilter.filterOption)\n this.view.filterHelper.init(this.AB);\n }\n\n if (!settings.isSortable) $$(ids.buttonSort).hide();\n\n if (!settings.isExportable) $$(ids.buttonExport).hide();\n }\n\n if (settings.hideHeader) this.hideHeader();\n\n const dc =\n this.datacollection || this.AB.datacollectionByID(settings.dataviewID);\n\n if (!this._isDatacollectionLoaded) this.datacollectionLoad(dc);\n\n // Make sure\n this._gridSettings =\n this._gridSettings ||\n (await this.AB.Storage.get(this.keyStorageSettings)) ||\n {};\n\n if (dc?.datasource) {\n // TRANSITION: ABViewGrid_orig line 862 ...\n\n this.linkPage.init({\n view: this.view,\n datacollection: dc,\n });\n\n this.refreshHeader();\n }\n }\n\n /**\n * @method busy()\n * Indicate that our datatable is currently busy loading/processing\n * data.\n */\n busy() {\n this.getDataTable()?.showProgress?.({ type: \"icon\" });\n }\n\n /**\n * @method callbackFilterData()\n * Process the provided filter options from our filterHelper.\n * @param {fn} fnFilter\n * A function that returns true/false for each row of data\n * to determine if is should exist.\n * @param {array} filterRules\n * Any Filter Rules added by the user.\n */\n callbackFilterData(fnFilter, filterRules = []) {\n const ids = this.ids;\n const $ButtonFilter = $$(ids.buttonFilter);\n\n if ($ButtonFilter) {\n const onlyFilterRules = this.view.filterHelper.filterRules();\n\n $ButtonFilter.define(\"badge\", onlyFilterRules?.rules?.length ?? 0);\n $ButtonFilter.refresh();\n }\n\n const dc = this.datacollection;\n\n dc.filterCondition(filterRules);\n dc.reloadData();\n }\n\n async callbackSortData(sortRules = []) {\n const $buttonSort = $$(this.ids.buttonSort);\n\n $buttonSort.define(\"badge\", sortRules.length || null);\n $buttonSort.refresh();\n\n const gridElem = this.getDataTable();\n\n if (gridElem.data.find({}).length < gridElem.data.count()) {\n try {\n // NOTE: Webix's client sorting does not support dynamic loading.\n // If the data does not be loaded, then load all data.\n await this.datacollection.reloadData(0, 0);\n } catch (err) {\n this.AB.notify.developer(err, {\n context:\n \"ABViewGrid:callbackSortData(): Error perform datacollection.reloadData()\",\n });\n }\n }\n\n // wait until the grid component will done to repaint UI\n setTimeout(() => {\n gridElem.sort((a, b) => this.PopupSortDataTableComponent.sort(a, b));\n }, 777);\n }\n\n /**\n * @method changePage()\n * Helper method to switch to another View.\n * @param {ABDataCollection} dv\n * The DataCollection we are working with.\n * @param {obj} rowItem\n * the { row:#, column:{string} } of the item that was clicked.\n * @param {ABViewPage.uuid} page\n * The .uuid of the ABViewPage/ABViewTab we are to swtich to.\n *\n */\n changePage(dv, rowItem, page) {\n const rowId = rowItem?.row ?? null;\n\n // Set cursor to data view\n if (dv) dv.setCursor(rowId);\n\n // Pass settings to link page module\n if (this.linkPage) this.linkPage.changePage(page, rowId);\n else super.changePage(page);\n }\n\n columnConfig(headers = []) {\n this.settings.columnConfig = headers;\n }\n /**\n * @method datacollectionLoad()\n * Assign an ABDataCollection to this component to use instead of any\n * provided .dataviewID in our settings.\n * NOTE: this primarily happens in the ABDesigner's Object Workspace.\n * @param {ABDataCollection} dc\n */\n datacollectionLoad(dc) {\n const oldDC = this.datacollection;\n this.datacollection = dc;\n\n const CurrentObject = dc?.datasource;\n const $DataTable = this.getDataTable();\n\n if ($DataTable) {\n // preventing too many handlers\n if (!this.__handler_dc_busy) {\n this.__handler_dc_busy = () => {\n this.busy();\n };\n\n this.__handler_dc_ready = () => {\n this.ready();\n this.populateGroupData();\n };\n\n this.__handler_dc_loadData = () => {\n this.populateGroupData();\n };\n }\n\n if (oldDC) {\n // remove our listeners from the previous DC\n oldDC.removeListener(\"initializingData\", this.__handler_dc_busy);\n oldDC.removeListener(\"initializedData\", this.__handler_dc_ready);\n oldDC.removeListener(\"loadData\", this.__handler_dc_loadData);\n }\n\n if (dc) {\n if (dc.datacollectionLink && dc.fieldLink)\n dc.bind($DataTable, dc.datacollectionLink, dc.fieldLink);\n else dc.bind($DataTable);\n\n // making sure we only have 1 registered listener on this dc\n dc.removeListener(\"initializingData\", this.__handler_dc_busy);\n dc.on(\"initializingData\", this.__handler_dc_busy);\n dc.removeListener(\"initializedData\", this.__handler_dc_ready);\n dc.on(\"initializedData\", this.__handler_dc_ready);\n dc.removeListener(\"loadData\", this.__handler_dc_loadData);\n dc.on(\"loadData\", this.__handler_dc_loadData);\n this.grouping();\n\n this._isDatacollectionLoad = true;\n } else $DataTable.unbind();\n\n // Be sure to pass on our CurrentObject to our dependent components.\n if (CurrentObject) {\n this.view.filterHelper.objectLoad(CurrentObject);\n this.PopupMassUpdateComponent.objectLoad(\n CurrentObject,\n this.getDataTable()\n );\n this.PopupSortDataTableComponent.objectLoad(CurrentObject);\n\n this.PopupExport.objectLoad(CurrentObject);\n this.PopupExport.dataCollectionLoad(dc);\n this.PopupExport.setGridComponent(this.getDataTable());\n this.PopupExport.setHiddenFields(this.settings.hiddenFields);\n this.PopupExport.setFilename(this.view.label);\n }\n }\n }\n\n /**\n * @function enableUpdateDelete\n *\n * disable the update or delete buttons in the toolbar if there no items selected\n * we will make this externally accessible so we can call it from within the datatable component\n */\n disableUpdateDelete() {\n $$(this.ids.buttonMassUpdate)?.disable();\n $$(this.ids.buttonDeleteSelected)?.disable();\n // externally indicate that no rows are selected\n this.emit(\"selection.cleared\");\n }\n\n /**\n * @function enableUpdateDelete\n *\n * enable the update or delete buttons in the toolbar if there are any items selected\n * we will make this externally accessible so we can call it from within the datatable component\n */\n enableUpdateDelete() {\n $$(this.ids.buttonMassUpdate)?.enable();\n $$(this.ids.buttonDeleteSelected)?.enable();\n // externally indicate that a row has been selected\n this.emit(\"selection\");\n }\n\n freezeDeleteColumn() {\n // we are going to always freeze the delete column if the datatable\n // is wider than the container so it is easy to get to\n return this.getDataTable().define(\"rightSplit\", this.columnSplitRight);\n }\n\n /**\n * @method getDataTable()\n * return the webix grid component.\n * @return {webix.grid}\n */\n getDataTable() {\n return $$(this.ids.datatable);\n }\n\n /**\n * @method getLastColumn\n * return the last column of a datagrid that is resizeable\n */\n getLastColumn() {\n const $DataTable = this.getDataTable();\n\n let lastColumn = {};\n\n // Loop through each columns config to find out if it is in the split 1 region and set it as the last item...then it will be overwritten by next in line\n $DataTable.eachColumn((columnId) => {\n const columnConfig = $DataTable.getColumnConfig(columnId);\n\n if (columnConfig.split === 1) lastColumn = columnConfig;\n });\n\n return lastColumn;\n }\n\n /**\n * @method grouping()\n * perform any grouping operations\n */\n grouping() {\n if (!this.settings.groupBy) return;\n\n const $treetable = this.getDataTable();\n\n // map: {\n // votes:[\"votes\", \"sum\"],\n // title:[\"year\"]\n // }\n const baseGroupMap = {};\n const CurrentObject = this.datacollection.datasource;\n\n CurrentObject.fields().forEach((f) => {\n switch (f.key) {\n case \"number\":\n baseGroupMap[f.columnName] = [f.columnName, \"sum\"];\n\n break;\n\n case \"calculate\":\n case \"formula\":\n baseGroupMap[f.columnName] = [\n f.columnName,\n (prop, listData) => {\n if (!listData) return 0;\n\n let sum = 0;\n\n listData.forEach((r) => {\n // we only want numbers returned so pass `true` as third param\n // to signify that this is part of a grouping row\n sum += f.format(r, false, true) * 1;\n });\n\n // simulate reformat from ABFieldFormulaCore\n if (!f.fieldLink || f.fieldLink.key === \"calculate\")\n return sum;\n else {\n const rowDataFormat = {};\n\n rowDataFormat[f.fieldLink.columnName] = sum;\n\n return f.fieldLink.format(rowDataFormat);\n }\n },\n ];\n\n break;\n\n case \"connectObject\":\n baseGroupMap[f.columnName] = [\n f.columnName,\n (prop, listData) => {\n if (!listData || !listData.length) return 0;\n\n let count = 0;\n\n listData.forEach((r) => {\n const valRelation = r[f.relationName()];\n\n // array\n if (valRelation?.length) count += valRelation.length;\n // object\n else if (valRelation) count += 1;\n });\n\n return count;\n },\n ];\n\n break;\n\n default:\n baseGroupMap[f.columnName] = [\n f.columnName,\n function (prop, listData) {\n if (!listData || !listData.length) return 0;\n\n let count = 0;\n\n listData.forEach((r) => {\n const val = prop(r);\n\n // count only exists data\n if (val) count += 1;\n });\n\n return count;\n },\n ];\n\n break;\n }\n });\n\n // set group definition\n // $DataTable.define(\"scheme\", {\n // $group: {\n // by: settings.groupBy,\n // map: groupMap\n // }\n // });\n\n // NOTE: https://snippet.webix.com/e3a2bf60\n let groupBys = (this.settings.groupBy || \"\")\n .split(\",\")\n .map((g) => g.trim());\n // Reverse the array NOTE: call .group from child to root\n groupBys = groupBys.reverse();\n\n groupBys.forEach((colName, gIndex) => {\n const groupMap = this.AB.cloneDeep(baseGroupMap);\n\n let by;\n\n // Root\n if (gIndex === groupBys.length - 1) by = colName;\n // Sub groups\n else {\n by = (row) => {\n let byValue = row[colName];\n\n for (let i = gIndex + 1; i < groupBys.length; i++) {\n byValue = `${row[groupBys[i]]} - ${byValue}`;\n }\n\n return byValue;\n };\n\n // remove parent group data\n groupBys.forEach((gColName) => {\n if (gColName !== colName) groupMap[gColName] = [gColName];\n });\n }\n\n $treetable.data.group({\n by: by,\n map: groupMap,\n });\n });\n }\n\n hideHeader() {\n const $DataTable = this.getDataTable();\n\n $DataTable.define(\"header\", false);\n $DataTable.refresh();\n }\n\n /**\n * @function onAfterColumnDrop\n * When an editor drops a column to save a new column order\n * @param {string} sourceId\n * the columnName of the item dragged\n * @param {string} targetId\n * the columnName of the item dropped on\n * @param {event} event\n */\n async onAfterColumnDrop(sourceId, targetId, event) {\n const $DataTable = this.getDataTable();\n const CurrentObject = this.datacollection.datasource;\n const settings = this.settings;\n const columnConfig = this.localSettings();\n\n // Reorder our current columnConfig\n // We know what was moved and what item it has replaced/pushed forward\n // so first we want to splice the item moved out of the array of fields\n // and store it so we can put it somewhere else\n let itemMoved = null;\n let oPos = 0; // original position\n\n for (let i = 0; i < columnConfig.length; i++)\n if (columnConfig[i].id == sourceId) {\n itemMoved = columnConfig[i];\n columnConfig.splice(i, 1);\n oPos = i;\n\n break;\n }\n // once we have removed/stored it we can find where its new position\n // will be by looping back through the array and finding the item it\n // is going to push forward\n for (let j = 0; j < columnConfig.length; j++)\n if (columnConfig[j].id == targetId) {\n // if the original position was before the new position we will\n // follow webix's logic that the drop should go after the item\n // it was placed on\n if (oPos <= j) j++;\n\n columnConfig.splice(j, 0, itemMoved);\n\n break;\n }\n\n // special case: dropped on end and need to update .fillspace\n // if (j == columnConfig.length - 1) {\n // if (columnConfig[j - 1].fillspace) {\n // columnConfig[j - 1].fillspace = false;\n // columnConfig[j].fillspace = true;\n // }\n // }\n\n // if we allow local changes\n this.localSettings(columnConfig);\n\n if (settings.saveLocal) this.localSettingsSave();\n\n // Now emit this event, in case an external object is wanting to\n // respond to this: ABDesigner.objectBuilder, Interface Designer,\n // we send back an array[ ABField.id, ...] in the order we have\n // them.\n this.emit(\n \"column.order\",\n columnConfig.map((c) => c.fieldID)\n );\n\n this.refreshHeader();\n\n // CurrentObject.fieldReorder(sourceId, targetId)\n // .then(() => {\n // // reset each column after a drop so we do not have multiple fillspace and minWidth settings\n // var editiable = settings.isEditable;\n // if ($DataTable.config.accessLevel < 2) {\n // editiable = false;\n // }\n // var columnHeaders = CurrentObject.columnHeaders(true, editiable);\n // columnHeaders.forEach(function (col) {\n // if (col.id == sourceId && col.fillspace == true) {\n // columnHeader.fillspace = false;\n // columnHeader.minWidth = columnHeader.width;\n // }\n // });\n\n // _logic.callbacks.onColumnOrderChange(CurrentObject);\n // // freeze columns:\n // let frozenColumnID =\n // settings.frozenColumnID != null\n // ? settings.frozenColumnID\n // : CurrentObject.workspaceFrozenColumnID;\n // if (frozenColumnID != \"\") {\n // $DataTable.define(\n // \"leftSplit\",\n // $DataTable.getColumnIndex(frozenColumnID) + columnSplitLeft\n // );\n // } else {\n // $DataTable.define(\"leftSplit\", columnSplitLeft);\n // }\n // _logic.freezeDeleteColumn();\n // $DataTable.refreshColumns();\n // })\n // .catch((err) => {\n // OP.Error.log(\"Error saving new column order:\", {\n // error: err,\n // });\n // });\n }\n\n /**\n * @function onAfterEditStop\n * When an editor is finished.\n * @param {json} state\n * @param {} editor\n * @param {} ignoreUpdate\n * @return\n */\n async onAfterEditStop(state, editor, ignoreUpdate) {\n // state: {value: \"new value\", old: \"old value\"}\n // editor: { column:\"columnName\", row:ID, value:'value', getInputNode:fn(), config:{}, focus: fn(), getValue: fn(), setValue: function, getInputNode: function, render: function…}\n\n const $DataTable = this.getDataTable();\n\n // if you don't edit an empty cell we just need to move on\n if (\n (!state.old && state.value === \"\") ||\n (state.old === \"\" && state.value === \"\")\n ) {\n $DataTable?.clearSelection();\n\n return false;\n }\n\n const CurrentObject = this.datacollection.datasource;\n\n if (editor.config)\n switch (editor.config.editor) {\n case \"number\":\n state.value = parseFloat(state.value);\n\n break;\n\n case \"datetime\":\n state.value = state.value.getTime();\n\n if (state && state.old && state.old.getTime)\n state.old = state.old.getTime();\n\n break;\n\n default:\n // code block\n }\n\n // lets make sure we are comparing things properly:\n // reduce newValue and oldValue down to PK if they were objects\n let newVal = state.value;\n if (newVal) {\n newVal = newVal[CurrentObject.PK()] || newVal;\n }\n let oldVal = state.old;\n if (oldVal) {\n oldVal = oldVal[CurrentObject.PK()] || oldVal;\n }\n\n // NOTE: != vs !== :\n // want to handle when newVal = \"3\" and oldVal = 3\n // that is why we don't use !== so that we convert the values into\n // the same case.\n if (newVal != oldVal) {\n const item = $DataTable?.getItem(editor.row);\n\n item[editor.column] = state.value;\n\n $DataTable.removeCellCss(item.id, editor.column, \"webix_invalid\");\n $DataTable.removeCellCss(item.id, editor.column, \"webix_invalid_cell\");\n\n //maxlength field\n const f = CurrentObject.fieldByID(editor.config?.fieldID);\n if (\n f?.settings.maxLength &&\n state.value.length > f.settings.maxLength\n ) {\n this.AB.alert({\n title: this.label(\"Limit max length\"),\n text: this.label(\n \"You can enter a maximum of \" +\n f.settings.maxLength +\n \" characters\"\n ),\n });\n $DataTable.addCellCss(item.id, editor.column, \"webix_invalid_cell\");\n $DataTable.refresh(editor.row);\n $DataTable.clearSelection();\n return false;\n }\n\n const validator = CurrentObject.isValidData(item);\n\n if (validator.pass()) {\n //// Question: do we submit full item updates? or just patches?\n // IF Patch:\n // var patch = {};\n // patch.id = item.id;\n // patch[editor.column] = item[editor.column];\n // await CurrentObject.model().update(item.id, patch)\n\n const ab = this.AB;\n\n try {\n await CurrentObject.model().update(item.id, item);\n\n if ($DataTable.exists(editor.row)) {\n $DataTable.updateItem(editor.row, item);\n $DataTable.clearSelection();\n $DataTable.refresh(editor.row);\n }\n } catch (err) {\n ab.notify.developer(err, {\n context: \"ABViewGrid:onAfterEditStop(): Error saving item\",\n item,\n editor,\n state,\n object: CurrentObject.toObj(),\n });\n\n $DataTable.clearSelection();\n\n if (\n ab.Validation.isGridValidationError(\n err,\n editor.row,\n $DataTable\n )\n ) {\n // Do we reset the value?\n // item[editor.column] = state.old;\n // $DataTable.updateItem(editor.row, item);\n } else {\n // this was some other Error!\n }\n }\n // CurrentObject.model()\n // .update(item.id, item)\n // .then(() => {\n // if ($DataTable.exists(editor.row)) {\n // $DataTable.updateItem(editor.row, item);\n // $DataTable.clearSelection();\n // $DataTable.refresh(editor.row);\n // }\n // })\n // .catch((err) => {\n // OP.Error.log(\"Error saving item:\", {\n // error: err\n // });\n\n // $DataTable.clearSelection();\n // if (\n // OP.Validation.isGridValidationError(\n // err,\n // editor.row,\n // $DataTable\n // )\n // ) {\n // // Do we reset the value?\n // // item[editor.column] = state.old;\n // // $DataTable.updateItem(editor.row, item);\n // } else {\n // // this was some other Error!\n // }\n // });\n } else validator.updateGrid(editor.row, $DataTable);\n } else $DataTable?.clearSelection();\n\n return false;\n\n // var item = $$(self.webixUiId.objectDatatable).getItem(editor.row);\n\n // self.updateRowData(state, editor, ignoreUpdate)\n // .fail(function (err) { // Cached\n // item[editor.column] = state.old;\n // $$(self.webixUiId.objectDatatable).updateItem(editor.row, item);\n // $$(self.webixUiId.objectDatatable).refresh(editor.row);\n\n // // TODO : Message\n\n // $$(self.webixUiId.objectDatatable).hideProgress();\n // })\n // .then(function (result) {\n // if (item) {\n // item[editor.column] = state.value;\n\n // if (result && result.constructor.name === 'Cached' && result.isUnsync())\n // item.isUnsync = true;\n\n // $$(self.webixUiId.objectDatatable).updateItem(editor.row, item);\n // }\n\n // // TODO : Message\n\n // $$(self.webixUiId.objectDatatable).hideProgress();\n // });\n }\n\n /**\n * @function onAfterSelect\n * This is when a user clicks on a cell. We use the onAfterSelect to\n * trigger a normal .editCell() if there isn't a custom editor for this field.\n * @param {json} data webix cell data\n * @return\n */\n onAfterSelect(data /*, preserve */) {\n // data: {row: 1, column: \"name\", id: \"1_name\", toString: function}\n // data.row: ABObject.id\n // data.column => columnName of the field\n\n // Normal update data\n this.getDataTable()?.editCell(data.row, data.column);\n }\n\n /**\n * @function onColumnResizeResize\n * This is when a user adjusts the size of a column\n * @param {} columnName\n * @param {int} newWidth\n * @param {int} oldWidth\n * @param {} user_action\n * @return\n */\n async onColumnResize(columnName, newWidth, oldWidth, user_action) {\n // update the settings\n\n let requireRefresh = false;\n\n const ab = this.AB;\n\n if (newWidth < 30) {\n newWidth = 30;\n requireRefresh = true;\n\n ab.Webix.message({\n type: \"info\",\n text: this.label(\"minimum column width is {0}\", [30]),\n expire: 1000,\n });\n }\n\n const localSettings = this.localSettings();\n\n if (localSettings) {\n const header = localSettings.find((h) => h.id == columnName);\n\n if (header) {\n header.width = newWidth;\n\n delete header.adjust;\n }\n }\n\n this.localSettings(localSettings);\n\n if (this.settings.saveLocal) {\n await this.localSettingsSave();\n // for (const item in GridSettings) {\n // GridSettings[item].forEach((item) => {\n // // we cannot include field info because of the cicular structure\n // if (item?.footer?.field) {\n // delete item.footer.field;\n // }\n // });\n // }\n // await this.AB.Storage.set(this.keyStorageSettings, GridSettings);\n }\n\n // refresh the display\n if (requireRefresh) this.refreshHeader();\n\n this.freezeDeleteColumn();\n\n // this.getDataTable().refreshColumns();\n\n // TODO: allow external app to respond in special cases:\n // eg: ABDesigner object workspace, interface builder, etc...\n this.emit(\"column.resize\", columnName, newWidth, oldWidth);\n }\n\n /**\n * @method onHeaderClick\n * process the user clicking on the header for one of our columns.\n */\n onHeaderClick(id, e, node) {\n if (this.skippableColumns.indexOf(id.column) !== -1) return false;\n\n // save our EditNode & EditField:\n // this.EditNode = node;\n\n const EditField = this.datacollection.datasource.fields(\n (f) => f.columnName === id.column\n )[0];\n // if (this.EditField) {\n // // show the popup\n // PopupHeaderEditComponent.show(node, this.EditField);\n // }\n\n this.emit(\"column.header.clicked\", node, EditField);\n\n return false;\n }\n\n /**\n * @method onShow()\n * perform any preparations necessary when showing this component.\n */\n onShow() {\n super.onShow();\n\n // make sure our grid is properly .adjust()ed to the screen.\n this.getDataTable()?.adjust();\n\n const dv = this.datacollection;\n\n if (dv)\n [\"changeCursor\", \"cursorStale\", \"cursorSelect\"].forEach((key) => {\n this.eventAdd({\n emitter: dv,\n eventName: key,\n listener: this.handler_select.bind(this),\n });\n });\n }\n\n /**\n * @method ready()\n * Indicate that our datatable is currently ready for operation.\n */\n ready() {\n const dc = this.datacollection;\n if (\n this.isCustomGroup &&\n dc?.dataStatus != dc?.dataStatusFlag.initialized\n )\n return;\n\n this.getDataTable()?.hideProgress?.();\n }\n\n /**\n * @function refreshHeader()\n *\n * refresh the header for the table apart from the refresh() command\n * @param {bool} ignoreLocal\n * Should we ignore our local settings and build directly from\n * our config settings?\n */\n refreshHeader(ignoreLocal = this.ignoreLocal) {\n // columnSplitRight = 0;\n // wait until we have an Object defined:\n const CurrentObject = this.datacollection.datasource;\n\n if (!CurrentObject) return;\n\n const ids = this.ids;\n const $DataTable = $$(ids.datatable);\n\n if (!$DataTable) return;\n\n const accessLevel = $DataTable.config.accessLevel;\n\n $DataTable.define(\"leftSplit\", 0);\n $DataTable.define(\"rightSplit\", 0);\n\n let rowHeight = 0;\n\n CurrentObject.imageFields().forEach((image) => {\n const settings = image.getSettings();\n\n if (settings.useHeight && settings.imageHeight > rowHeight)\n rowHeight = settings.imageHeight;\n });\n\n if (rowHeight) $DataTable.define(\"rowHeight\", rowHeight);\n\n // $DataTable.clearAll();\n\n const settings = this.settings;\n\n let editable = settings.isEditable;\n\n if ($DataTable.config.accessLevel < 2) editable = false;\n\n //// update DataTable structure:\n // get column list from our local settings\n const objColumnHeaders = CurrentObject.columnHeaders(\n true,\n editable,\n // TRANSITION: moving these from .columnHeaders() to here:\n [], //settings.summaryColumns,\n [], //settings.countColumns,\n [] //settings.hiddenFields\n );\n\n let columnHeaders = this.localSettings();\n\n const ab = this.AB;\n\n // if that is empty, pull from our settings.columnConfig\n if (!columnHeaders || ignoreLocal)\n columnHeaders = ab.cloneDeep(this.settings.columnConfig);\n\n // if that is empty for some reason, rebuild from our CurrentObject\n if (!columnHeaders || columnHeaders.length === 0)\n columnHeaders = objColumnHeaders;\n\n // sanity check:\n // columnHeaders can't contain a column that doesn't exist in objColumHeaders:\n // (eg: a field might have been removed but localStorage doesn't know that )\n const objColumnHeaderIDs = objColumnHeaders.map((h) => h.fieldID);\n\n columnHeaders = columnHeaders.filter(\n (c) => objColumnHeaderIDs.indexOf(c.fieldID) > -1\n );\n\n // default our columnConfig values to our columnHeaders:\n columnHeaders.forEach((c) => {\n // we want to overwrite our default settings with anything stored\n // in local storage\n const origCol = objColumnHeaders.find((h) => h.fieldID === c.fieldID);\n\n // none of our functions can be stored in localStorage, so scan\n // the original column and attach any template functions to our\n // stashed copy.\n // also the suggest for selects and connected fields may contain a\n // function so go ahead and copy the original suggest to the column\n Object.keys(origCol).forEach((k) => {\n if (typeof origCol[k] === \"function\" || k === \"suggest\") {\n c[k] = origCol[k];\n }\n });\n\n const f = CurrentObject.fieldByID(c.fieldID);\n\n if (!f) return;\n\n // if it's a hidden field:\n if (settings.hiddenFields.indexOf(f.columnName) > -1) {\n c.hidden = true;\n }\n\n // add summary footer:\n if (settings.summaryColumns.indexOf(f.id) > -1) {\n if (f.key == \"calculate\" || f.key == \"formula\")\n c.footer = { content: \"totalColumn\", field: f };\n else c.footer = { content: \"summColumn\" };\n }\n // or add the count footer\n else if (settings.countColumns.indexOf(f.id) > -1)\n c.footer = { content: \"countColumn\" };\n });\n\n let localSettings = this.localSettings();\n\n if (!localSettings || ignoreLocal) {\n this.localSettings(columnHeaders);\n\n localSettings = columnHeaders;\n }\n\n columnHeaders = ab.cloneDeep(localSettings);\n\n const fieldValidations = [];\n const rulePops = [];\n\n columnHeaders.forEach((col) => {\n col.fillspace = false;\n\n // parse the rules because they were stored as a string\n // check if rules are still a string...if so lets parse them\n if (col.validationRules) {\n if (typeof col.validationRules === \"string\") {\n col.validationRules = JSON.parse(col.validationRules);\n }\n\n if (col.validationRules.length) {\n const validationUI = [];\n\n // there could be more than one so lets loop through and build the UI\n col.validationRules.forEach((rule) => {\n const Filter = ab.filterComplexNew(\n col.id /*+ \"_\" + webix.uid()*/\n );\n // add the new ui to an array so we can add them all at the same time\n validationUI.push(Filter.ui);\n // store the filter's info so we can assign values and settings after the ui is rendered\n fieldValidations.push({\n filter: Filter,\n view: Filter.ids.querybuilder,\n columnName: col.id,\n validationRules: rule.rules,\n invalidMessage: rule.invalidMessage,\n });\n });\n\n // create a unique view id for popup\n const popUpId =\n ids.rules + \"_\" + col.id; /* + \"_\" + webix.uid() */\n\n // store the popup ids so we can remove the later\n rulePops.push(popUpId);\n // add the popup to the UI but don't show it\n ab.Webix.ui({\n view: \"popup\",\n css: \"ab-rules-popup\",\n id: popUpId,\n body: {\n rows: validationUI,\n },\n });\n }\n }\n\n // group header\n if (\n settings.groupBy &&\n (settings.groupBy || \"\").indexOf(col.id) > -1\n ) {\n const groupField = CurrentObject.fieldByID(col.fieldID);\n\n if (groupField)\n col.template = (obj, common) => {\n // return common.treetable(obj, common) + obj.value;\n if (obj.$group) {\n const rowData = ab.cloneDeep(obj);\n\n rowData[groupField.columnName] = rowData.value;\n\n return (\n common.treetable(obj, common) +\n groupField.format(rowData)\n );\n } else return groupField.format(obj);\n };\n }\n });\n\n if (fieldValidations.length) {\n // we need to store the rules for use later so lets build a container array\n const complexValidations = [];\n\n fieldValidations.forEach((f) => {\n // init each ui to have the properties (app and fields) of the object we are editing\n // f.filter.applicationLoad(CurrentObject.application);\n f.filter.fieldsLoad(CurrentObject.fields());\n // now we can set the value because the fields are properly initialized\n f.filter.setValue(f.validationRules);\n // if there are validation rules present we need to store them in a lookup hash\n // so multiple rules can be stored on a single field\n if (!Array.isArray(complexValidations[f.columnName]))\n complexValidations[f.columnName] = [];\n\n // now we can push the rules into the hash\n complexValidations[f.columnName].push({\n filters: f.filter.getValue(),\n values: $DataTable.getSelectedItem[f.columnName],\n invalidMessage: f.invalidMessage,\n });\n });\n\n const rules = {};\n\n // store the rules in a data param to be used later\n $DataTable.$view.complexValidations = complexValidations;\n // use the lookup to build the validation rules\n Object.keys(complexValidations).forEach((key) => {\n rules[key] = (value, data) => {\n // default valid is true\n let isValid = true;\n let invalidMessage = \"\";\n\n $DataTable.$view.complexValidations[key].forEach((filter) => {\n // convert rowData from { colName : data } to { id : data }\n const newData = {};\n\n (CurrentObject.fields() || []).forEach((field) => {\n newData[field.id] = data[field.columnName];\n });\n\n // for the case of \"this_object\" conditions:\n if (data.uuid) {\n newData[\"this_object\"] = data.uuid;\n data[\"this_object\"] = data.uuid;\n }\n\n // use helper funtion to check if valid\n // const ruleValid = filter.filters(newData);\n const filterComplex = ab.filterComplexNew(\n `rule-validate-${key}`\n );\n filterComplex.fieldsLoad(\n CurrentObject.fields(),\n CurrentObject\n );\n const ruleValid = filterComplex.isValid(data, filter.filters);\n\n // if invalid we need to tell the field\n if (!ruleValid) {\n isValid = false;\n invalidMessage = filter.invalidMessage;\n }\n });\n\n // we also need to define an error message\n if (!isValid)\n ab.Webix.message({\n type: \"error\",\n text: invalidMessage,\n });\n\n return isValid;\n };\n });\n // define validation rules\n $DataTable.define(\"rules\", rules);\n // store the array of view ids on the webix object so we can get it later\n $DataTable.config.rulePops = rulePops;\n $DataTable.refresh();\n } else {\n // check if the previous datatable had rule popups and remove them\n if ($DataTable.config.rulePops)\n $DataTable.config.rulePops.forEach((popup) => {\n if ($$(popup)) $$(popup).destructor();\n });\n // remove any validation rules from the previous table\n $DataTable.define(\"rules\", {});\n $DataTable.refresh();\n }\n\n const addedColumns = [];\n // {array} the .id of the columnHeaders we add based upon our settings.\n // this will help us pick the lastColumn that is part of the\n // object.\n\n if (settings.labelAsField) {\n // console.log(CurrentObject);\n columnHeaders.unshift({\n id: \"appbuilder_label_field\",\n header: \"Label\",\n fillspace: true,\n template: (obj) => CurrentObject.displayData(obj),\n // css: { 'text-align': 'center' }\n });\n addedColumns.push(\"appbuilder_label_field\");\n }\n\n if (settings.massUpdate && accessLevel === 2) {\n columnHeaders.unshift({\n id: \"appbuilder_select_item\",\n header: { content: \"masterCheckbox\", contentId: \"mch\" },\n width: 40,\n template: \"
    {common.checkbox()}
    \",\n css: { \"text-align\": \"center\" },\n });\n this.columnSplitLeft = 1;\n addedColumns.push(\"appbuilder_select_item\");\n } else this.columnSplitLeft = 0;\n\n if (settings.detailsPage !== \"\" && !settings.hideButtons) {\n columnHeaders.push({\n id: \"appbuilder_view_detail\",\n header: \"\",\n width: 40,\n template: (obj, common) =>\n \"
    \",\n css: { \"text-align\": \"center\" },\n });\n // columnSplitRight++;\n addedColumns.push(\"appbuilder_view_detail\");\n }\n\n if (settings.trackView !== 0 && accessLevel === 2) {\n columnHeaders.push({\n id: \"appbuilder_view_track\",\n header: \"\",\n width: 40,\n template:\n \"
    \",\n css: { \"text-align\": \"center\", cursor: \"pointer\" },\n });\n // columnSplitRight++;\n addedColumns.push(\"appbuilder_view_track\");\n }\n\n if (\n settings.editPage !== \"\" &&\n !settings.hideButtons &&\n accessLevel === 2\n ) {\n columnHeaders.push({\n id: \"appbuilder_view_edit\",\n header: \"\",\n width: 40,\n template: \"
    {common.editIcon()}
    \",\n css: { \"text-align\": \"center\" },\n });\n // columnSplitRight++;\n addedColumns.push(\"appbuilder_view_edit\");\n }\n\n if (settings.allowDelete && accessLevel === 2) {\n columnHeaders.push({\n id: \"appbuilder_trash\",\n header: \"\",\n width: 40,\n template: \"
    {common.trashIcon()}
    \",\n css: { \"text-align\": \"center\" },\n });\n // columnSplitRight++;\n addedColumns.push(\"appbuilder_trash\");\n }\n\n // find our last displayed column (that isn't one we added);\n let lastCol = null;\n\n for (let i = columnHeaders.length - 1; i >= 0; i--) {\n const col = columnHeaders[i];\n if (!col.hidden && addedColumns.indexOf(col.id) === -1) {\n lastCol = col;\n break;\n }\n }\n\n if (lastCol) {\n lastCol.fillspace = true;\n lastCol.minWidth = lastCol.width;\n lastCol.width = 150; // set a width for last column but by default it will fill the available space or use the minWidth to take up more\n }\n\n $DataTable.refreshColumns(columnHeaders);\n\n // the addedColumns represent the additional icons that can be added.\n this.columnSplitRight = addedColumns.length;\n\n // the .massUpdate gets added to Left so don't include that in split right:\n if (addedColumns.indexOf(\"appbuilder_select_item\") > -1)\n this.columnSplitRight -= 1;\n // .columnSplitRight can't be < 0\n if (this.columnSplitRight < 0) this.columnSplitRight = 0;\n\n // freeze columns:\n const frozenColumnID = settings.frozenColumnID;\n\n if (frozenColumnID != \"\")\n $DataTable.define(\n \"leftSplit\",\n $DataTable.getColumnIndex(frozenColumnID) + 1\n );\n else $DataTable.define(\"leftSplit\", this.columnSplitLeft);\n\n this.freezeDeleteColumn();\n $DataTable.refreshColumns();\n // }\n }\n\n /**\n * localSettingsSave()\n * Persist our current working copy of our GridSettings to localStorage.\n * @return {Promise}\n */\n async localSettingsSave() {\n const ab = this.AB;\n const savedLocalSettings =\n (await ab.Storage.get(this.keyStorageSettings)) || {};\n const _gridSettings = this._gridSettings;\n\n savedLocalSettings[this.settingsID()] = _gridSettings[this.settingsID()]\n ? _gridSettings[this.settingsID()]\n : [];\n\n for (const item in savedLocalSettings) {\n savedLocalSettings[item].forEach((item) => {\n // we cannot include field info because of the cicular structure\n if (item?.footer?.field) delete item.footer.field;\n });\n }\n\n await ab.Storage.set(this.keyStorageSettings, savedLocalSettings);\n }\n\n /**\n * @method localSettings()\n * An interface method to handle get/set operations on our local GridSettings\n * storage.\n * .localStorage() : a getter to return the current value\n * .localStorage(value) : a setter to save value as our current value.\n * @param {various} value\n * the value to set to our settings.\n * @return {various}\n */\n localSettings(value = null) {\n const _gridSettings = this._gridSettings;\n\n if (value) _gridSettings[this.settingsID()] = value;\n else return _gridSettings[this.settingsID()];\n }\n\n /**\n * @method selectRow()\n * Select the grid row that correspondes to the provided rowData.\n * @param {json} rowData\n * A key=>value hash of data that matches an entry in the grid.\n * rowData.id should match an existing entry.\n */\n selectRow(rowData) {\n let id = rowData?.id ?? rowData;\n if (this.__timeout_selectRow) {\n console.log(\"Duplicate selectRow():\", id);\n clearTimeout(this.__timeout_selectRow);\n }\n this.__timeout_selectRow = setTimeout(() => {\n const $DataTable = this.getDataTable();\n if (!$DataTable) return;\n\n if (!id) $DataTable.unselect();\n else if ($DataTable.exists(id)) {\n $DataTable.select(id, false);\n $DataTable.showItem(id);\n } else $DataTable.select(null, false);\n\n this.__timeout_selectRow = null;\n }, 15);\n }\n\n /**\n * @method settingsID()\n * return the unique key for this Grid + object combo to store data\n * in our localStorage.\n * @return {string}\n */\n settingsID() {\n const CurrentObject = this.datacollection.datasource;\n\n return `${this.id}-${CurrentObject ? CurrentObject.id : \"0\"}`;\n }\n\n /**\n * @method toggleTab()\n * recursively toggle tabs into view once a user chooses a detail/edit view\n * to display.\n * @param {ABView.id} parentTab\n * @param {webix.view} wb\n */\n toggleTab(parentTab, wb) {\n // find the tab || if we didn't pass and id we may have passed a domNode\n const tab =\n wb.getTopParentView().queryView({ id: parentTab }) || $$(parentTab);\n\n if (!tab) return;\n\n // set the tabbar to to the tab\n const tabbar = tab.getParentView().getParentView();\n\n if (!tabbar) return;\n\n // if we have reached the top we won't have a tab\n if (tabbar.setValue) tabbar.setValue(parentTab);\n\n // find if it is in a multiview of a tab\n const nextTab = tabbar.queryView({ view: \"scrollview\" }, \"parent\");\n\n // if so then do this again\n if (nextTab) this.toggleTab(nextTab, wb);\n }\n\n toggleUpdateDelete() {\n const $DataTable = this.getDataTable();\n\n let checkedItems = 0;\n\n $DataTable.data.each((obj) => {\n if (\n typeof obj !== \"undefined\" &&\n Object.prototype.hasOwnProperty.call(\n obj,\n \"appbuilder_select_item\"\n ) &&\n obj.appbuilder_select_item === 1\n )\n checkedItems++;\n });\n\n if (checkedItems > 0) this.enableUpdateDelete();\n else this.disableUpdateDelete();\n }\n\n toolbarDeleteSelected($view) {\n const $DataTable = this.getDataTable();\n const CurrentObject = this.datacollection.datasource;\n const deleteTasks = [];\n\n $DataTable.data.each((row) => {\n if (\n typeof row !== \"undefined\" &&\n // row.hasOwnProperty(\"appbuilder_select_item\") &&\n Object.prototype.hasOwnProperty.call(\n row,\n \"appbuilder_select_item\"\n ) &&\n row.appbuilder_select_item === 1\n ) {\n // NOTE: store a fn() to run later.\n deleteTasks.push(() => CurrentObject.model().delete(row.id));\n }\n });\n\n const abWebix = this.AB.Webix;\n\n if (deleteTasks.length > 0)\n abWebix.confirm({\n title: this.label(\"Delete Multiple Records\"),\n text: this.label(\n \"Are you sure you want to delete the selected records?\"\n ),\n callback: async (result) => {\n if (result) {\n // Now run those functions\n await Promise.all(deleteTasks.map((t) => t()));\n\n // Anything we need to do after we are done.\n this.disableUpdateDelete();\n }\n },\n });\n else\n abWebix.alert({\n title: this.label(\"No Records Selected\"),\n text: this.label(\n \"You need to select at least one record...did you drink your coffee today?\"\n ),\n });\n }\n\n toolbarFilter($view) {\n this.view.filterHelper.showPopup($view);\n }\n\n toolbarSort($view) {\n this.PopupSortDataTableComponent.show($view);\n }\n\n toolbarExport($view) {\n this.PopupExport.show($view);\n }\n\n toolbarMassUpdate($view) {\n this.PopupMassUpdateComponent.show($view);\n }\n\n /**\n * @function toolTip()\n *\n * Retrieve the items toolTip\n */\n toolTip(obj, common) {\n const CurrentObject = this.datacollection.datasource;\n const imageFieldColNames = CurrentObject.imageFields().map(\n (f) => f.columnName\n );\n\n let tip = \"\";\n\n const columnName = common.column.id.replace(\" \", \"\");\n\n if (Array.isArray(obj[columnName])) {\n obj[columnName].forEach(function (o) {\n if (o.text) tip += o.text + \"
    \";\n });\n } else if (\n typeof obj[columnName + \"__relation\"] !== \"undefined\" &&\n typeof obj[columnName] === \"number\"\n )\n tip = obj[columnName + \"__relation\"].text;\n else if (typeof obj[columnName + \"__relation\"] !== \"undefined\") {\n let relationData = obj[columnName + \"__relation\"];\n\n if (!Array.isArray(relationData)) relationData = [relationData];\n\n (relationData || []).forEach(function (o) {\n if (o) tip += o.text + \"
    \";\n });\n } else if (imageFieldColNames.indexOf(columnName) !== -1) {\n if (!obj[columnName]) {\n return \"\";\n } else {\n // TODO: we need to get this URL from the ABFieldImage object!\n tip = ``;\n }\n } else if (common.column.editor === \"date\")\n tip = common.column.format(obj[columnName]);\n else if (common.column.editor === \"richselect\")\n CurrentObject.fields().forEach((f) => {\n if (f.columnName === columnName) {\n if (f.settings.options) {\n f.settings.options.forEach((o) => {\n if (o.id === obj[columnName]) {\n tip = o.text;\n }\n });\n }\n }\n });\n else tip = obj[columnName];\n\n if (!tip) return \"\";\n else return tip;\n }\n\n /**\n * @function toolTipOnBeforeRender()\n *\n * Add visibility \"hidden\" to all tooltips before render so we can move to a new location without the visual jump\n */\n toolTipOnBeforeRender(node) {\n // var node = $$(ids.tooltip).getNode();\n node.style.visibility = \"hidden\";\n }\n\n /**\n * @function toolTipOnAfterRender()\n *\n * If the tooltip is displaying off the screen we want to try to reposition it for a better experience\n */\n toolTipOnAfterRender(node) {\n // var node = $$(ids.tooltip).getNode();\n if (node.firstChild?.nodeName === \"IMG\") {\n setTimeout(() => {\n const imgBottom = parseInt(node.style.top.replace(\"px\", \"\")) + 500;\n const imgRight = parseInt(node.style.left.replace(\"px\", \"\")) + 500;\n\n if (imgBottom > window.innerHeight) {\n const imgOffsetY = imgBottom - window.innerHeight;\n const newTop =\n parseInt(node.style.top.replace(\"px\", \"\")) - imgOffsetY;\n node.style.top = newTop + \"px\";\n }\n\n if (imgRight > window.innerWidth) {\n const imgOffsetX = imgRight - window.innerWidth;\n const newLeft =\n parseInt(node.style.left.replace(\"px\", \"\")) - imgOffsetX;\n node.style.left = newLeft + \"px\";\n }\n\n node.style.visibility = \"visible\";\n }, 250);\n } else node.style.visibility = \"visible\";\n }\n\n get isCustomGroup() {\n const dc = this.datacollection;\n const CurrentObject = dc?.datasource;\n const $DataTable = this.getDataTable();\n\n return (\n $DataTable?.config?.view === \"treetable\" && !CurrentObject?.isGroup\n );\n }\n\n populateGroupData() {\n if (!this.isCustomGroup) return;\n\n this.busy();\n\n const dc = this.datacollection;\n const $DataTable = this.getDataTable();\n\n $DataTable.clearAll();\n $DataTable.parse(dc.getData() || []);\n\n this.grouping();\n this.ready();\n }\n}\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewImageComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewImage_${baseView.id}`,\n Object.assign({ image: \"\" }, ids)\n );\n }\n\n ui() {\n const settings = this.settings;\n const _ui = super.ui([\n {\n cols: [\n {\n id: this.ids.image,\n view: \"template\",\n template: \"\",\n height: settings.height,\n width: settings.width,\n },\n {},\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const $image = $$(this.ids.image);\n if (!$image) return;\n\n const settings = this.settings;\n\n if (settings.filename)\n $image.define(\n \"template\",\n ``\n );\n else $image.define(\"template\", \"\");\n\n $image.refresh();\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\nconst ABFormSidePanel = require(\"../ABViewKanbanFormSidePanel\");\n\nmodule.exports = class ABViewKanbanComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewKanBan_${baseView.id}`,\n Object.assign(\n {\n kanbanView: \"\",\n\n kanban: \"\",\n resizer: \"\",\n formSidePanel: \"\",\n },\n ids\n )\n );\n\n this.FormSide = new ABFormSidePanel(\n this,\n this.ids.formSidePanel,\n this.settings.editFields\n );\n\n this.CurrentVerticalField = null;\n this.CurrentHorizontalField = null;\n this.CurrentOwnerField = null;\n\n this.TextTemplate = baseView.TextTemplate;\n\n this._updatingOwnerRowId = null;\n this._ABFieldConnect = null;\n this._ABFieldUser = null;\n this._ABFieldList = null;\n }\n\n get ABFieldConnect() {\n return (this._ABFieldConnect =\n this._ABFieldConnect ||\n this.AB.Class.ABFieldManager.fieldByKey(\"connectObject\"));\n }\n\n get ABFieldUser() {\n return (this._ABFieldUser =\n this._ABFieldUser || this.AB.Class.ABFieldManager.fieldByKey(\"user\"));\n }\n\n get ABFieldList() {\n return (this._ABFieldList =\n this._ABFieldList || this.AB.Class.ABFieldManager.fieldByKey(\"list\"));\n }\n\n ui() {\n const ids = this.ids;\n const self = this;\n this.linkPage = this.view.linkPageHelper.component();\n\n const _ui = super.ui([\n {\n id: ids.kanbanView,\n cols: [\n {\n id: ids.kanban,\n view: \"kanban\",\n cols: [],\n userList: {\n view: \"menu\",\n // yCount: 8,\n // scroll: false,\n template: ' #value#',\n width: 150,\n on: {\n onSelectChange: function () {\n // get this row id from onAvatarClick event\n if (!self._updatingOwnerRowId) return;\n\n const userId = this.getSelectedId(false);\n if (!userId) return;\n\n self.updateOwner(self._updatingOwnerRowId, userId);\n },\n },\n },\n editor: false, // we use side bar\n users: [],\n tags: [],\n data: [],\n on: {\n onListAfterSelect: (itemId, list) => {\n this.CurrentDatacollection?.setCursor(itemId);\n this.emit(\"select\", itemId);\n\n // link pages events\n const editPage = this.settings.editPage;\n if (editPage)\n this.linkPage.changePage(editPage, itemId);\n\n const detailsPage = this.settings.detailsPage;\n if (detailsPage)\n this.linkPage.changePage(detailsPage, itemId);\n },\n onAfterStatusChange: (rowId, status /*, list */) => {\n this.updateStatus(rowId, status);\n },\n onAvatarClick: (rowId /*, ev, node, list */) => {\n // keep this row id for update owner data in .userList\n this._updatingOwnerRowId = rowId;\n },\n },\n },\n {\n id: ids.resizer,\n view: \"resizer\",\n css: \"bg_gray\",\n width: 11,\n hidden: true,\n },\n this.FormSide.ui(),\n ],\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const abWebix = this.AB.Webix;\n\n if (this.$kb) abWebix.extend(this.$kb, abWebix.ProgressBar);\n\n this.FormSide.init(AB);\n this.FormSide.on(\"add\", (newVals) => {\n this.saveData(newVals);\n });\n this.FormSide.on(\"update\", (updateVals) => {\n this.saveData(updateVals);\n });\n\n let dc = this.view.datacollection;\n if (dc) this.datacollectionLoad(dc);\n\n this.linkPage.init({\n view: this.view,\n datacollection: dc,\n });\n\n this.show();\n }\n\n get $kb() {\n return (this._kb = this._kb || $$(this.ids.kanban));\n }\n\n kanbanListTemplate() {\n return {\n icons: [\n // { icon: \"mdi mdi-comment\", show: function (obj) { return !!obj.comments }, template: \"#comments.length#\" },\n {\n icon: \"fa fa-trash-o\",\n click: (rowId /*, e */) => {\n this.removeCard(rowId);\n },\n },\n ],\n // avatar template\n templateAvatar: (obj) => {\n if (\n this.CurrentOwnerField &&\n obj[this.CurrentOwnerField.columnName]\n )\n return this.CurrentOwnerField.format(obj);\n else return \"\";\n },\n // template for item body\n // show item image and text\n templateBody: (data) => {\n // if (!this.settings.template)\n if (!this.TextTemplate.text)\n return this.CurrentObject?.displayData(data);\n\n // return our default text template\n return this.TextTemplate.displayText(data);\n },\n };\n }\n\n /**\n * @function hide()\n *\n * hide this component.\n */\n hide() {\n $$(this.ids.kanbanView)?.hide();\n }\n\n /**\n * @function show()\n * Show this component.\n */\n async show() {\n const ids = this.ids;\n\n $$(ids.kanbanView)?.show();\n\n this.FormSide.hide();\n\n $$(ids.resizer)?.hide();\n\n var CurrentObject = this.CurrentObject;\n if (!CurrentObject) {\n CurrentObject = this.datacollection?.datasource;\n }\n if (!CurrentObject) return;\n\n // Get vertical grouping field and populate to kanban list\n // NOTE: this field should be the select list type\n const CurrentVerticalField = CurrentObject.fieldByID(\n this.settings.verticalGroupingField\n );\n if (!CurrentVerticalField) return;\n\n this.CurrentVerticalField = CurrentVerticalField;\n\n let horizontalOptions = [];\n\n const CurrentHorizontalField = CurrentObject.fieldByID(\n this.settings.horizontalGroupingField\n );\n\n this.CurrentHorizontalField = CurrentHorizontalField;\n\n if (\n CurrentHorizontalField &&\n CurrentHorizontalField instanceof this.ABFieldConnect\n )\n // Pull horizontal options\n horizontalOptions = await CurrentHorizontalField.getOptions();\n\n // Option format - { id: \"1543563751920\", text: \"Normal\", hex: \"#4CAF50\" }\n const verticalOptions = (CurrentVerticalField.settings.options || []).map(\n (opt) => {\n // Vertical & Horizontal fields\n if (CurrentVerticalField && CurrentHorizontalField) {\n let rows = [],\n // [{\n // id: '',\n // text: ''\n // }]\n horizontalVals = [];\n\n // pull options of the Horizontal field\n if (CurrentHorizontalField instanceof this.ABFieldList) {\n // make a copy of the settings.\n horizontalVals = (\n CurrentHorizontalField.settings.options || []\n ).map((o) => o);\n } else if (CurrentHorizontalField instanceof this.ABFieldUser) {\n horizontalVals = CurrentHorizontalField.getUsers().map(\n (u) => {\n return {\n id: u.id,\n text: u.text || u.value,\n };\n }\n );\n } else if (CurrentHorizontalField instanceof this.ABFieldConnect)\n horizontalVals = horizontalOptions.map(({ id, text }) => ({\n id,\n text,\n }));\n\n horizontalVals.push({\n id: null,\n text: this.label(\"Other\"),\n });\n\n horizontalVals.forEach((val) => {\n const statusOps = {};\n\n statusOps[CurrentVerticalField.columnName] = opt.id;\n statusOps[CurrentHorizontalField.columnName] = val.id;\n\n // Header\n rows.push({\n template: val.text,\n height: 20,\n css: \"progress_header\",\n });\n\n // Kanban list\n rows.push({\n view: \"kanbanlist\",\n status: statusOps,\n type: this.kanbanListTemplate(),\n });\n });\n\n return {\n header: opt.text,\n body: {\n margin: 0,\n rows: rows,\n },\n };\n }\n // Vertical field only\n else if (CurrentVerticalField) {\n const statusOps = {};\n\n statusOps[CurrentVerticalField.columnName] = opt.id;\n\n return {\n header: opt.text,\n body: {\n view: \"kanbanlist\",\n status: statusOps,\n type: this.kanbanListTemplate(),\n },\n };\n }\n }\n );\n\n const ab = this.AB;\n const abWebix = ab.Webix;\n\n // Rebuild kanban that contains options\n // NOTE: webix kanban does not support dynamic vertical list\n abWebix.ui(verticalOptions, $$(ids.kanban));\n $$(ids.kanban).reconstruct();\n\n // Owner field\n const CurrentOwnerField = CurrentObject.fieldByID(\n this.settings.ownerField\n );\n\n this.CurrentOwnerField = CurrentOwnerField;\n\n if (CurrentOwnerField) {\n const $menuUser = $$(ids.kanban).getUserList();\n\n $menuUser.clearAll();\n\n if (CurrentOwnerField instanceof this.ABFieldUser) {\n const users = ab.Account.userList().map((u) => {\n return {\n id: u.username,\n value: u.username,\n };\n });\n\n $menuUser.parse(users);\n } else if (CurrentOwnerField instanceof this.ABFieldConnect) {\n const options = await CurrentOwnerField.getOptions();\n\n try {\n $menuUser.parse(\n options.map((opt) => {\n return {\n id: opt.id,\n value: opt.text,\n };\n })\n );\n } catch (e) {\n // TODO: remove this. Trying to catch a random webix error:\n // Cannot read properties of null (reading 'driver')\n console.error(e);\n console.warn(options);\n }\n }\n }\n }\n\n busy() {\n this.$kb?.showProgress?.({ type: \"icon\" });\n }\n\n ready() {\n this.$kb?.hideProgress?.();\n }\n\n objectLoad(object) {\n super.objectLoad(object);\n\n this.TextTemplate.objectLoad(object);\n this.FormSide.objectLoad(object);\n }\n\n /**\n * @method datacollectionLoad\n *\n * @param datacollection {ABDatacollection}\n */\n datacollectionLoad(datacollection) {\n super.datacollectionLoad(datacollection);\n\n const DC = this.CurrentDatacollection || datacollection;\n\n if (DC) {\n DC.bind(this.$kb);\n\n const obj = DC.datasource;\n\n if (obj) this.objectLoad(obj);\n\n return;\n }\n\n this.$kb.unbind();\n }\n\n async updateStatus(rowId, status) {\n if (!this.CurrentVerticalField) return;\n\n // Show loading cursor\n this.busy();\n\n let patch = {};\n\n // update multi-values\n if (status instanceof Object) patch = status;\n // update single value\n else patch[this.CurrentVerticalField.columnName] = status;\n\n // update empty value\n let needRefresh = false;\n\n for (const key in patch)\n if (!patch[key]) {\n patch[key] = \"\";\n\n // WORKAROUND: if update data is empty, then it will need to refresh\n // the kanban after update\n needRefresh = true;\n }\n\n try {\n await this.CurrentObject?.model().update(rowId, patch);\n\n this.ready();\n\n if (needRefresh) this.show();\n\n // update form data\n if (this.FormSide.isVisible()) {\n const data = $$(this.ids.kanban).getItem(rowId);\n\n this.FormSide.refresh(data);\n }\n } catch (err) {\n this.AB.notify.developer(err, {\n context: \"ABViewKanban:updateStatus(): Error saving item:\",\n rowId,\n patch,\n });\n }\n }\n\n async updateOwner(rowId, val) {\n if (!this.CurrentOwnerField) return;\n\n // Show loading cursor\n this.busy();\n\n const patch = {};\n\n patch[this.CurrentOwnerField.columnName] = val;\n\n try {\n const updatedRow = await this.CurrentObject?.model().update(\n rowId,\n patch\n );\n\n // update card\n this.$kb?.updateItem(rowId, updatedRow);\n\n // update form data\n if (this.FormSide.isVisible()) {\n const data = this.$kb.getItem(rowId);\n\n this.FormSide.refresh(data);\n }\n\n this.ready();\n } catch (err) {\n this.AB.notify.developer(err, {\n context: \"ABViewKanban:updateOwner(): Error saving item:\",\n rowId,\n val,\n });\n\n this.ready();\n }\n }\n\n saveData(data) {\n // update\n if (data.id && this.$kb.exists(data.id))\n this.$kb.updateItem(data.id, data);\n // insert\n else this.$kb.add(data);\n }\n\n unselect() {\n if (this.$kb)\n this.$kb.eachList((list /*, status*/) => {\n list?.unselect?.();\n });\n }\n\n addCard() {\n this.unselect();\n\n // show the side form\n this.FormSide.show();\n $$(this.ids.resizer).show();\n }\n\n async removeCard(rowId) {\n const ab = this.AB;\n const abWebix = ab.Webix;\n\n abWebix.confirm({\n title: this.label(\"Remove card\"),\n text: this.label(\"Do you want to delete this card?\"),\n callback: async (result) => {\n if (!result) return;\n\n this.busy();\n\n try {\n const response = await this.CurrentObject?.model().delete(rowId);\n\n if (response.numRows > 0) {\n this.$kb.remove(rowId);\n } else {\n abWebix.alert({\n text: this.label(\n \"No rows were effected. This does not seem right.\"\n ),\n });\n }\n } catch (err) {\n ab.notify.developer(err, {\n message: \"ABViewKanban:removeCard(): Error deleting item:\",\n rowId,\n });\n }\n\n this.ready();\n },\n });\n }\n\n /**\n * @method setFields()\n * Save the current view options.\n * @param options - {\n * verticalGrouping: {ABField} - required\n * horizontalGrouping: {ABField} - optional\n * ownerField: {ABField} - optional\n * }\n */\n setFields(options) {\n this.CurrentVerticalField = options.verticalGrouping;\n this.CurrentHorizontalField = options.horizontalGrouping;\n this.CurrentOwnerField = options.ownerField;\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewLabelComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewLabel_${baseView.id}`, ids);\n }\n\n ui() {\n const baseView = this.view;\n\n const _ui = super.ui([\n this.uiFormatting({\n view: \"label\",\n // css: 'ab-component-header ab-ellipses-text',\n label: baseView.text || \"*\",\n align: this.settings.alignment,\n type: {\n height: \"auto\",\n },\n }),\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n /**\n * @method uiFormatting\n * a common routine to properly update the displayed label\n * UI with the css formatting for the given .settings\n * @param {obj} _ui the current webix.ui definition\n * @return {obj} a properly formatted webix.ui definition\n */\n uiFormatting(ui) {\n // add different css settings based upon it's format\n // type.\n switch (parseInt(this.settings.format)) {\n // normal\n case 0:\n ui.css = \"ab-component-label ab-ellipses-text\";\n break;\n\n // title\n case 1:\n ui.css = \"ab-component-header ab-ellipses-text\";\n break;\n\n // description\n case 2:\n ui.css = \"ab-component-description ab-ellipses-text\";\n break;\n }\n\n return ui;\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewLayoutComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(baseView, idBase || `ABViewLayout_${baseView.id}`, ids);\n\n const viewComponents = this.viewComponents ?? {}; // { viewId: viewComponent, ..., viewIdn: viewComponent }\n\n baseView.views().forEach((v) => {\n viewComponents[v.id] = v.component();\n });\n\n this.viewComponents = viewComponents;\n }\n\n ui() {\n const viewComponents = this.viewComponents;\n const uiComponents = Object.keys(viewComponents)\n .map((vId) => viewComponents[vId].ui())\n .filter((ui) => ui);\n\n if (uiComponents.length == 0) {\n uiComponents.push({});\n uiComponents.push({\n view: \"label\",\n label: this.label(\"no content\"),\n });\n uiComponents.push({});\n }\n\n const _ui = super.ui([\n {\n view: \"layout\",\n cols: uiComponents,\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB, accessLevel) {\n await super.init(AB);\n\n const baseView = this.view;\n\n // make sure each of our child views get .init() called\n baseView.views().forEach((v) => {\n const component = this.viewComponents[v.id];\n\n // initial sub-component\n component?.init(AB, accessLevel);\n\n // Trigger 'changePage' event to parent\n baseView.eventAdd({\n emitter: v,\n eventName: \"changePage\",\n listener: (pageId) => {\n baseView.changePage(pageId);\n },\n });\n });\n }\n\n onShow() {\n // calll .onShow in child components\n this.view.views().forEach((v) => {\n const component = this.viewComponents[v.id];\n component?.onShow();\n });\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewListComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewList_${baseView.id}`,\n Object.assign({ list: \"\" }, ids)\n );\n }\n\n ui() {\n const settings = this.settings;\n const _uiList = {\n id: this.ids.list,\n view: \"dataview\",\n type: {\n width: 1000,\n height: 30,\n },\n template: (item) => {\n const field = this.view.field();\n\n if (!field) return \"\";\n\n return field.format(item);\n },\n };\n\n // set height or autoHeight\n if (settings.height !== 0) _uiList.height = settings.height;\n else _uiList.autoHeight = true;\n\n const _ui = super.ui([_uiList]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const dc = this.datacollection;\n\n if (!dc) return;\n\n // bind dc to component\n dc.bind($$(this.ids.list));\n // $$(ids.list).sync(dv);\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewMenuComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewMenu_${baseView.id}`,\n Object.assign(\n {\n menu: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const settings = this.settings;\n const _ui = super.ui([\n parseInt(settings.menuInToolbar) ? this.uiToolbar() : this.uiMenu(),\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n uiMenu() {\n const baseView = this.view;\n const settings = this.settings;\n const defaultSettings = baseView.constructor.defaultValues();\n const css = `${settings.buttonStyle || defaultSettings.buttonStyle} ${\n settings.menuAlignment || defaultSettings.menuAlignment\n } `;\n\n return {\n id: this.ids.menu,\n view: \"menu\",\n autoheight: true,\n autowidth: true,\n datatype: \"json\",\n css: css,\n layout: settings.orientation || defaultSettings.orientation,\n on: {\n onMenuItemClick: (id /*, e, node */) => {\n this.onClick(id);\n },\n onAfterRender: () => {\n this.defineCypress();\n },\n },\n type: {\n subsign: true,\n },\n };\n }\n\n uiToolbar() {\n const settings = this.settings;\n const baseView = this.view;\n const defaultSettings = baseView.constructor.defaultValues();\n const _uiMenu = this.uiMenu();\n\n let elems = [];\n let menuIncluded = false;\n\n // Legacy support: use old settings values if translated values are not set\n const menuTextLeft = baseView.menuTextLeft ?? settings.menuTextLeft;\n const menuTextCenter = baseView.menuTextCenter ?? settings.menuTextCenter;\n const menuTextRight = baseView.menuTextRight ?? settings.menuTextRight;\n\n if (settings.menuPosition === \"left\") {\n menuIncluded = true;\n elems.push(_uiMenu);\n } else if (menuTextLeft?.length) {\n const width = menuTextLeft.length * 15;\n\n elems.push({\n view: \"label\",\n label: menuTextLeft,\n align: \"left\",\n width: width,\n });\n } else\n elems.push({\n view: \"label\",\n label: \"\",\n autowidth: true,\n });\n\n if (settings?.menuPosition === \"center\") {\n menuIncluded = true;\n\n elems.push(_uiMenu);\n } else if (menuTextCenter?.length) {\n const width = menuTextLeft.length * 15;\n\n elems.push(\n {},\n {\n view: \"label\",\n label: menuTextCenter,\n align: \"center\",\n width: width,\n },\n {}\n );\n } else\n elems.push({\n view: \"label\",\n label: \"\",\n autowidth: true,\n });\n\n if (settings?.menuPosition === \"right\") {\n menuIncluded = true;\n\n elems.push(_uiMenu);\n } else if (menuTextRight?.length) {\n const width = menuTextLeft.length * 15;\n\n elems.push({\n view: \"label\",\n label: menuTextRight,\n align: \"right\",\n width: width,\n });\n } else\n elems.push({\n view: \"label\",\n label: \"\",\n autowidth: true,\n });\n\n if (menuIncluded === false) elems = [_uiMenu];\n\n return {\n view: \"toolbar\",\n css: settings.menuTheme ?? defaultSettings.menuTheme,\n padding: settings.menuPadding\n ? parseInt(settings.menuPadding)\n : defaultSettings.menuPadding,\n elements: elems,\n };\n }\n\n async init(AB) {\n await super.init(AB);\n\n const $menu = $$(this.ids.menu);\n const baseView = this.view;\n\n if ($menu) {\n const settings = this.settings;\n\n baseView.ClearPagesInView($menu);\n\n if (settings.order?.length) {\n baseView.AddPagesToView($menu, settings.order);\n // Force onAfterRender to fire\n $menu.refresh();\n }\n }\n }\n\n onClick(itemId) {\n const $menu = $$(this.ids.menu);\n let $item;\n try {\n $item = $menu.getMenuItem(itemId);\n } catch (err) {\n this.AB.notify.developer(err, {\n context:\n \"ABViewMenuComponent > onClick error gettint menu / menu item\",\n itemId,\n menu: {\n id: this.view.id,\n settings: this.view.settings,\n },\n });\n return;\n }\n const baseView = this.view;\n\n // switch tab view\n if ($item.type === \"tab\") {\n baseView.changePage($item.pageId);\n\n const redirectPage = baseView.application.pages(\n (p) => p.id === $item.pageId,\n true\n )[0];\n\n if (!redirectPage) return;\n\n const tabView = redirectPage.views((v) => v.id === $item.id, true)[0];\n\n if (!tabView) return;\n\n const tab = tabView.parent;\n\n if (!tab) return;\n\n this.toggleParent(tab);\n\n // if (!$$(tabView.id) || !$$(tabView.id).isVisible()) {\n const showIt = setInterval(() => {\n if ($$(tabView.id) && $$(tabView.id).isVisible()) {\n clearInterval(showIt);\n\n return;\n }\n\n tab.emit(\"changeTab\", tabView.id);\n }, 100);\n // }\n }\n // switch page\n else baseView.changePage(itemId);\n }\n\n toggleParent(element) {\n if (!element.parent) return false;\n\n const parentElem = element.parent;\n\n if (!parentElem?.parent) return false;\n\n parentElem.parent.emit(\"changeTab\", parentElem.id);\n this.toggleParent(parentElem.parent);\n }\n\n defineCypress() {\n const $menu = $$(this.ids.menu);\n\n if (!$menu) return;\n\n $menu.data.each((item) => {\n const node = $menu.getItemNode(item.id);\n\n if (!node) return;\n\n // get linked page/tab info so we can use its name in the data-cy\n const viewInfo = this.AB.definitionByID(item.id);\n\n node.setAttribute(\n \"data-cy\",\n `menu-item ${viewInfo?.name} ${item.id} ${this.view.id}`\n );\n });\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nconst SMALL_PAGE_WIDTH = 150;\nconst BIG_PAGE_WIDTH = 250;\n\nmodule.exports = class ABViewPDFImporterComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewPDFImporter_${baseView.id}`,\n Object.assign(\n {\n fileUploader: \"\",\n uploadList: \"\",\n dataview: \"\",\n fullImagePopup: \"\",\n fullImageCarousel: \"\",\n fullImageSelectToggle: \"\",\n fullImageLabel: \"\",\n selectAll: \"\",\n unselectAll: \"\",\n submit: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const ids = this.ids;\n const self = this;\n const _ui = super.ui([\n {\n rows: [\n {\n cols: [\n {\n id: ids.fileUploader,\n view: \"uploader\",\n name: \"records\",\n link: ids.uploadList,\n label: this.label(\"Upload a PDF file\"),\n inputWidth: 200,\n width: 210,\n accept: \"application/pdf\",\n multiple: false,\n autosend: false,\n type: \"icon\",\n icon: \"fa fa-file-pdf-o\",\n on: {\n onBeforeFileAdd: (fileInfo) => {\n this._csvFileInfo = fileInfo;\n if (!this._csvFileInfo) return false;\n\n this.loadFile();\n\n return true;\n },\n },\n },\n {\n id: ids.uploadList,\n view: \"list\",\n type: \"uploader\",\n autoheight: true,\n borderless: true,\n onClick: {\n webix_remove_upload: (e, id) => {\n this.removeFile(id);\n },\n },\n },\n {\n width: 10,\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-th-large\",\n maxWidth: 30,\n click: () => {\n this.displayBig();\n },\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-th\",\n maxWidth: 30,\n click: () => {\n this.displaySmall();\n },\n },\n ],\n },\n {\n height: 10,\n },\n {\n id: ids.dataview,\n view: \"dataview\",\n borderless: true,\n css: \"pdf-data-view\",\n multiselect: false,\n select: false,\n type: {\n template: (item) => {\n return this.pageTemplate(item);\n },\n width: \"auto\",\n height: \"auto\",\n },\n on: {\n onSelectChange: (pageIds) => {\n this.renderPageImages();\n },\n onItemClick: function (id, e, node) {\n // Unselect\n if (e?.target?.className?.includes?.(\"unselect-page\")) {\n self.unselect(id);\n }\n // Select\n else if (\n e?.target?.className?.includes?.(\"select-page\")\n ) {\n self.select(id);\n }\n // Zoom\n else if (e?.target?.className?.includes?.(\"pdf-zoom\")) {\n self._fullImagePopup.show();\n $$(self.ids.fullImageCarousel).setActiveIndex(\n parseInt(id ?? 0) - 1\n );\n self.refreshFullImage();\n }\n },\n },\n },\n {\n height: 10,\n },\n {\n cols: [\n {\n id: ids.selectAll,\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-check-square-o\",\n maxWidth: 160,\n label: this.label(\"Select All\"),\n click: () => {\n this.selectAll();\n },\n },\n {\n id: ids.unselectAll,\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-square-o\",\n maxWidth: 160,\n label: this.label(\"Unselect All\"),\n click: () => {\n this.unselectAll();\n },\n },\n {\n fillspace: true,\n },\n {\n id: ids.submit,\n view: \"button\",\n css: \"webix_primary\",\n type: \"icon\",\n icon: \"fa fa-floppy-o\",\n disabled: true,\n maxWidth: 180,\n label: this.label(\"Submit\"),\n click: () => {\n this.submit();\n },\n },\n ],\n },\n ],\n },\n ]);\n\n return _ui;\n }\n\n uiPopup() {\n const ids = this.ids;\n return {\n id: ids.fullImagePopup,\n view: \"window\",\n modal: true,\n position: \"center\",\n headHeight: 25,\n head: {\n cols: [\n { fillspace: true },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-times\",\n maxWidth: 25,\n height: 25,\n click: () => {\n $$(ids.fullImagePopup)?.hide();\n },\n },\n ],\n },\n body: {\n rows: [\n {\n id: ids.fullImageCarousel,\n view: \"carousel\",\n width: 600,\n height: 500,\n navigation: {\n items: true,\n buttons: true,\n type: \"side\",\n },\n cols: [],\n on: {\n onShow: () => {\n this.refreshFullImage();\n },\n },\n },\n {\n view: \"layout\",\n cols: [\n {\n id: ids.fullImageSelectToggle,\n view: \"toggle\",\n type: \"icon\",\n offIcon: \"fa fa-square-o\",\n onIcon: \"fa fa-check-square-o\",\n offLabel: this.label(\"Unselected\"),\n onLabel: this.label(\"Selected\"),\n width: 130,\n on: {\n onChange: (isSelected) => {\n const activeIndex = $$(\n this.ids.fullImageCarousel\n ).getActiveIndex();\n const pageNumber = activeIndex + 1;\n\n if (isSelected) this.select(pageNumber);\n else this.unselect(pageNumber);\n },\n },\n },\n {\n fillspace: true,\n },\n {\n id: ids.fullImageLabel,\n view: \"label\",\n width: 120,\n label: `${this.label(\"Page Number\")}: ${\"#\"}`,\n },\n ],\n },\n ],\n },\n };\n }\n\n async init(AB) {\n await super.init(AB);\n\n const $dataview = $$(this.ids.dataview);\n if ($dataview) this.AB.Webix.extend($dataview, webix.ProgressBar);\n\n if (!this._fullImagePopup) {\n const fullImagePopup = this.uiPopup();\n this._fullImagePopup = this.AB.Webix.ui(fullImagePopup);\n }\n }\n\n onShow() {\n this.initPdfjs();\n super.onShow();\n }\n\n /**\n * Loads the pdfjs dependecies. We defer loading since it is a large library\n * that is not needed in the initial page load.\n */\n async initPdfjs() {\n if (this.pdfjs && window.pdfjsWorker) return;\n this.busy();\n this.pdfjs = (\n await import(\n /* webpackPrefetch: true */\n \"../../../../init/pdfjs\"\n )\n ).default;\n this.ready();\n }\n\n async _readFileBuffer() {\n const _csvFileInfo = this._csvFileInfo;\n if (!_csvFileInfo || !_csvFileInfo.file)\n return Promise.resolve(new ArrayBuffer(0));\n\n const fileReader = new FileReader();\n\n return new Promise((resolve, reject) => {\n fileReader.onload = (event) => {\n const fileBuffer = event.target.result;\n resolve(fileBuffer);\n };\n fileReader.onerror = (event) => {\n reject(event);\n };\n fileReader.readAsArrayBuffer(_csvFileInfo.file);\n });\n }\n\n async _toBlob(pageNumber, canvas) {\n if (!canvas) return;\n\n return new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n const file = new File([blob], `${pageNumber}.png`, {\n type: \"image/png\",\n });\n\n resolve(file);\n }, \"image/png\");\n });\n }\n\n async _uploadImage(pageNumber) {\n // set quality of the saving image\n const WIDTH_OF_SAVE_IMAGE = 1200;\n\n // Create a temporary CANVAS dom to render page image with specify the height\n const canvasId = `${this.view.id}_temp_canvas`;\n const canvas =\n document.getElementById(canvasId) ?? document.createElement(\"canvas\");\n canvas.id = canvasId;\n canvas.width = WIDTH_OF_SAVE_IMAGE;\n\n await this.showPage(pageNumber, canvas);\n const fileBlob = await this._toBlob(pageNumber, canvas);\n\n return new Promise((resolve, reject) => {\n // Create a uploader to upload images\n const $uploader = this.AB.Webix.ui({\n view: \"uploader\",\n apiOnly: true,\n upload: this.field.urlUpload(),\n inputName: \"file\",\n multiple: false,\n on: {\n // when upload is complete:\n onFileUpload: (item, response) => {\n // RETURN HERE\n resolve(response?.data?.uuid);\n },\n // if an error was returned\n onFileUploadError: (item, response) => {\n reject(response);\n },\n onUploadComplete: () => $uploader.destructor(),\n },\n });\n\n $uploader.addFile(fileBlob, fileBlob.size);\n });\n }\n\n _increaseProgressValue() {\n const $dataview = $$(this.ids.dataview);\n const maxProgressStep = ($dataview.getSelectedId(true) ?? []).length * 2;\n\n this._progressSteps = this._progressSteps ?? 0;\n this._progressSteps++;\n\n $dataview?.showProgress?.({\n type: \"bottom\",\n position: this._progressSteps / maxProgressStep,\n });\n }\n\n async loadFile() {\n this.clearDataview();\n\n const _csvFileInfo = this._csvFileInfo;\n if (!_csvFileInfo) return;\n\n const fileBuffer = await this._readFileBuffer();\n this._pdfDoc = await this.pdfjs.getDocument(fileBuffer).promise;\n\n const total_page = this._pdfDoc.numPages;\n const $dataview = $$(this.ids.dataview);\n const $carousel = $$(this.ids.fullImageCarousel);\n const carousel_list = [];\n for (let pageNumber = 1; pageNumber <= total_page; pageNumber++) {\n $dataview.add({\n id: pageNumber,\n pageNumber,\n });\n\n carousel_list.push({\n template: (item) => {\n return this.fullImageTemplate(item);\n },\n data: {\n pageNumber,\n },\n });\n }\n\n this.renderPageImages();\n if ($carousel) this.AB.Webix.ui(carousel_list, $carousel);\n\n // Select all of images by default\n this.selectAll();\n\n $$(this.ids.submit)?.enable();\n }\n\n removeFile(id) {\n $$(this.ids.uploadList)?.remove(id);\n\n delete this._pdfDoc;\n delete this._csvFileInfo;\n this.clearDataview();\n\n $$(this.ids.submit)?.disable();\n\n return true;\n }\n\n pageTemplateId(pageNumber) {\n return `pdf-importer-${this.view.id}-${pageNumber}`;\n }\n\n pageTemplate(item) {\n const $dataview = $$(this.ids.dataview);\n let selectedPageIds = $dataview.getSelectedId(true);\n\n return `\n
    \n
    \n
    \n ${\n selectedPageIds.filter((pageId) => pageId == item.id).length\n ? ''\n : ''\n }\n
    \n
    \n ${item.pageNumber}\n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n `;\n }\n\n renderPageImages() {\n const $dataview = $$(this.ids.dataview);\n $dataview?.find({}).forEach((item) => {\n const canvas_dom = document.querySelector(\n `#${this.pageTemplateId(item.pageNumber)}`\n );\n this.showPage(item.pageNumber, canvas_dom);\n });\n }\n\n async showPage(pageNumber, canvas_dom) {\n if (!this._pdfDoc) return;\n\n pageNumber = parseInt(pageNumber);\n const page = await this._pdfDoc.getPage(pageNumber);\n const pdf_original_width = page.getViewport({ scale: 1 }).width;\n const scale_required = canvas_dom.width / pdf_original_width;\n\n // get viewport to render the page at required scale\n const viewport = page.getViewport({ scale: scale_required });\n canvas_dom.height = viewport.height;\n\n return page.render({\n canvasContext: canvas_dom.getContext(\"2d\"),\n viewport: viewport,\n }).promise;\n }\n\n clearDataview() {\n const $dataview = $$(this.ids.dataview);\n const $carousel = $$(this.ids.fullImageCarousel);\n\n $dataview?.clearAll();\n if ($carousel)\n this.AB.Webix.ui(\n [\n {\n view: \"label\",\n align: \"center\",\n height: $carousel.height,\n label: this.label(\"No image\"),\n },\n ],\n $carousel\n );\n }\n\n displaySmall() {\n this._isDisplayBig = false;\n $$(this.ids.dataview)?.render();\n this.renderPageImages();\n }\n\n displayBig() {\n this._isDisplayBig = true;\n $$(this.ids.dataview)?.render();\n this.renderPageImages();\n }\n\n get pageItemWidth() {\n return this._isDisplayBig ? BIG_PAGE_WIDTH : SMALL_PAGE_WIDTH;\n }\n\n select(pageNumber) {\n const $dataview = $$(this.ids.dataview);\n\n let selectedIds = $dataview.getSelectedId(true);\n\n selectedIds.push(pageNumber);\n selectedIds = selectedIds.filter((pageId) => pageId);\n\n if (selectedIds.length) $dataview.select(selectedIds);\n else $dataview.unselectAll();\n }\n\n unselect(pageNumber) {\n const $dataview = $$(this.ids.dataview);\n\n let selectedIds = $dataview.getSelectedId(true);\n\n selectedIds = selectedIds.filter(\n (pageId) => pageId && pageId != pageNumber\n );\n\n if (selectedIds.length) $dataview.select(selectedIds);\n else $dataview.unselectAll();\n }\n\n selectAll() {\n $$(this.ids.dataview)?.selectAll();\n }\n\n unselectAll() {\n $$(this.ids.dataview)?.unselectAll();\n }\n\n fullImageTemplateId(pageNumber) {\n return `${this.pageTemplateId(pageNumber)}_full_size`;\n }\n\n fullImageTemplate(item) {\n const $carousel = $$(this.ids.fullImageCarousel);\n return ``;\n }\n\n refreshFullImage() {\n const ids = this.ids;\n const activeIndex = $$(ids.fullImageCarousel).getActiveIndex();\n const pageNumber = activeIndex + 1;\n const canvas_dom = document.querySelector(\n `#${this.fullImageTemplateId(pageNumber)}`\n );\n this.showPage(pageNumber, canvas_dom);\n\n const selectedPageIds = $$(ids.dataview).getSelectedId(true);\n const isSelected =\n selectedPageIds.filter((pageId) => pageId == pageNumber).length > 0;\n $$(ids.fullImageSelectToggle).setValue(isSelected);\n\n $$(ids.fullImageLabel).setValue(\n `${this.label(\"Page Number\")}: ${pageNumber}`\n );\n }\n\n get object() {\n return this.view.datacollection?.datasource;\n }\n\n get field() {\n return this.object?.fields?.(\n (f) => f.id == this.view.settings.fieldID\n )[0];\n }\n\n busy() {\n const ids = this.ids;\n\n const $fileUploader = $$(ids.fileUploader);\n const $uploadList = $$(ids.uploadList);\n const $dataview = $$(ids.dataview);\n const $submit = $$(ids.submit);\n const $selectAll = $$(ids.selectAll);\n const $unselectAll = $$(ids.unselectAll);\n const $selectToggle = $$(ids.fullImageSelectToggle);\n\n $fileUploader?.disable();\n $uploadList?.disable();\n $submit?.disable();\n $selectAll?.disable();\n $unselectAll?.disable();\n $selectToggle?.disable();\n $dataview?.showProgress?.({\n type: \"bottom\",\n position: 0.001,\n });\n }\n\n ready() {\n const ids = this.ids;\n\n const $fileUploader = $$(ids.fileUploader);\n const $uploadList = $$(ids.uploadList);\n const $dataview = $$(ids.dataview);\n const $submit = $$(ids.submit);\n const $selectAll = $$(ids.selectAll);\n const $unselectAll = $$(ids.unselectAll);\n const $selectToggle = $$(ids.fullImageSelectToggle);\n\n $fileUploader?.enable();\n $uploadList?.enable();\n $submit?.enable();\n $selectAll?.enable();\n $unselectAll?.enable();\n $selectToggle?.enable();\n $dataview?.hideProgress?.();\n\n delete this._progressSteps;\n }\n\n async submit() {\n const field = this.field;\n if (!this._pdfDoc || !field) return;\n\n this.busy();\n\n const ids = this.ids;\n const $dataview = $$(ids.dataview);\n const selectedPageIds = $dataview.getSelectedId(true) ?? [];\n const model = field.object.model();\n const dcLink = this.datacollection.datacollectionLink;\n const newValues = [];\n\n for (let i = 0; i < selectedPageIds.length; i++) {\n const pageNumber = selectedPageIds[i];\n if (pageNumber == null || pageNumber == \"\") return;\n\n const uploadId = await this._uploadImage(pageNumber);\n\n this._increaseProgressValue();\n\n // Insert Data\n const values = field.object.defaultValues();\n values[field.columnName] = uploadId;\n\n // Set linked data from the parent DC\n const linkValues = dcLink?.getCursor();\n if (linkValues) {\n const objectLink = dcLink?.datasource;\n\n const connectFields = field.object.connectFields();\n connectFields.forEach((f) => {\n if (\n objectLink.id == f.settings.linkObject &&\n values[f.columnName] === undefined\n ) {\n const linkColName = f.indexField\n ? f.indexField.columnName\n : objectLink.PK();\n\n values[f.columnName] = {};\n values[f.columnName][linkColName] =\n linkValues[linkColName] ?? linkValues.id;\n }\n });\n }\n\n newValues.push(await model.create(values));\n\n this._increaseProgressValue();\n }\n\n this.view.doSubmitRules(newValues);\n\n // NOTE: trigger this event to ABViewPropertyAddPage\n if (newValues) this.view.emit(\"saved\", newValues);\n\n this.ready();\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\nconst ABFieldCalculate = require(\"../../dataFields/ABFieldCalculate\");\nconst ABFieldFormula = require(\"../../dataFields/ABFieldFormula\");\nconst ABFieldNumber = require(\"../../dataFields/ABFieldNumber\");\n/* global pivot */\nmodule.exports = class ABViewPivotComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewPivot_${baseView.id}`,\n Object.assign({ pivot: \"\" }, ids)\n );\n }\n\n ui() {\n const self = this;\n const settings = this.settings;\n const uiPivot = {\n id: this.ids.pivot,\n view: \"pivot\",\n readonly: true,\n removeMissed: settings.removeMissed,\n totalColumn: settings.totalColumn,\n separateLabel: settings.separateLabel,\n min: settings.min,\n max: settings.max,\n height: settings.height,\n fields: this._getFields(),\n format: (value) => {\n const decimalPlaces = settings.decimalPlaces ?? 2;\n\n return value && value != \"0\"\n ? parseFloat(value).toFixed(decimalPlaces || 0)\n : value;\n },\n override: new Map([\n [\n pivot.services.Backend,\n class MyBackend extends pivot.services.Backend {\n async data() {\n const dc = self.datacollection;\n if (!dc) return webix.promise.resolve([]);\n\n const object = dc.datasource;\n if (!object) return webix.promise.resolve([]);\n\n switch (dc.dataStatus) {\n case dc.dataStatusFlag.notInitial:\n await dc.loadData();\n break;\n }\n\n const data = dc.getData();\n const dataMapped = data.map((d) => {\n const result = {};\n\n object.fields().forEach((f) => {\n if (\n f instanceof ABFieldCalculate ||\n f instanceof ABFieldFormula ||\n f instanceof ABFieldNumber\n )\n result[f.columnName] = d[f.columnName];\n else result[f.columnName] = f.format(d);\n });\n\n return result;\n });\n\n return webix.promise.resolve(dataMapped);\n }\n },\n ],\n [\n pivot.views.table,\n class CustomTable extends pivot.views.table {\n CellFormat(value) {\n const decimalPlaces = settings.decimalPlaces ?? 2;\n if (!value) value = value === 0 ? \"0\" : \"\";\n return value\n ? parseFloat(value).toFixed(decimalPlaces)\n : value;\n }\n },\n ],\n ]),\n };\n\n if (settings.structure) uiPivot.structure = settings.structure;\n\n const _ui = super.ui([uiPivot]);\n delete _ui.type;\n\n return _ui;\n }\n\n _getFields() {\n const dc = this.datacollection;\n if (!dc) return [];\n\n const object = dc.datasource;\n if (!object) return [];\n\n const fields = object.fields().map((f) => {\n let fieldType = \"text\";\n\n switch (f.key) {\n case \"calculate\":\n case \"formula\":\n case \"number\":\n fieldType = \"number\";\n break;\n case \"date\":\n case \"datetime\":\n fieldType = \"date\";\n break;\n }\n\n return {\n id: f.columnName,\n value: f.label,\n type: fieldType,\n };\n });\n\n return fields;\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewReportsManagerComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewReportManager_${baseView.id}`,\n Object.assign(\n {\n reportManager: \"\",\n },\n ids\n )\n );\n\n this.readonly = false;\n }\n\n ui() {\n const self = this;\n const settings = this.settings;\n const ab = this.AB;\n const abWebix = ab.Webix;\n const dc = this.datacollection;\n const fieldName = dc?.datasource.fieldByID(\n settings.dataviewFields.name\n )?.columnName;\n const fieldText = dc?.datasource.fieldByID(\n settings.dataviewFields.text\n )?.columnName;\n const fieldQueries = dc?.datasource.fieldByID(\n settings.dataviewFields.queries\n )?.columnName;\n const ids = this.ids;\n class MyBackend extends reports.services.Backend {\n async getModules() {\n if (dc == null) return [];\n\n await self.waitInitializingDCEvery(1000, dc);\n\n return dc.getData().map((e) => {\n return {\n id: e.id,\n name: e[fieldName],\n text: JSON.stringify(e[fieldText]),\n updated: e[\"updated_at\"],\n };\n });\n }\n\n async addModule(data) {\n const parsedData = {};\n\n parsedData[fieldName] = data.name;\n parsedData[fieldText] = data.text;\n\n const response = await dc.model.create(parsedData);\n\n return {\n id: response.id,\n };\n }\n\n async updateModule(id, data) {\n const parsedData = {};\n\n parsedData[fieldName] = data.name;\n parsedData[fieldText] = data.text;\n\n let response = {};\n\n response = await dc.model.update(id, parsedData);\n\n return { id: response.id };\n }\n\n async deleteModule(id) {\n await dc.model.delete(id);\n\n return { id: id };\n }\n\n async getModels() {\n const reportModels = {};\n\n // If no selected DC then get all DCs\n (settings.datacollectionIDs.length > 0\n ? settings.datacollectionIDs\n : self.view.application.datacollectionIDs\n ).forEach((dcID) => {\n const dc = ab.datacollectionByID(dcID);\n\n if (!dc) return;\n\n const obj = dc.datasource;\n\n if (!obj) return;\n\n const reportFields = self.getReportFields(dc);\n\n // get connected data collections\n // let linkedFields = [];\n // (obj.connectFields() || []).forEach((f, index) => {\n // let connectedDcs = ab.datacollections(\n // (dColl) =>\n // dColl &&\n // dColl.datasource &&\n // dColl.datasource.id === f.settings.linkObject\n // );\n // (connectedDcs || []).forEach((linkedDc) => {\n // linkedFields.push({\n // id: index + 1,\n // name: linkedDc.label,\n // source: dc.id,\n // target: linkedDc.id\n // });\n // });\n // });\n\n // // MOCK UP for testing\n // let linkedFields = [\n // {\n // id: \"id\",\n // name: \"id\",\n // source: \"39378ee0-38f0-4b9d-a5aa-dddc61137fcd\", // Player\n // target: \"0de82362-4ab5-4f0f-8cfa-d1288d173cba\" // Team\n // }\n // ];\n\n reportModels[dc.id] = {\n id: dc.id,\n name: dc.label,\n data: reportFields,\n refs: [],\n };\n });\n\n return reportModels;\n }\n\n async getQueries() {\n const moduleID = $$(ids.reportManager).getState().moduleId || \"\";\n\n if (moduleID === \"\") return [];\n\n return (\n (\n await dc.model.findAll({\n where: {\n uuid: moduleID,\n },\n })\n ).data[0][fieldQueries] || []\n );\n }\n\n async addQuery(data) {\n const moduleID = $$(ids.reportManager).getState().moduleId || \"\";\n\n if (moduleID === \"\") return {};\n\n const moduleData = (\n await dc.model.findAll({\n where: {\n uuid: moduleID,\n },\n })\n ).data[0];\n\n if (moduleData == null) return {};\n\n const queries = [...(moduleData[fieldQueries] || [])];\n const queryID = abWebix.uid();\n\n queries.push(Object.assign({ id: queryID }, data));\n\n const parsedData = {};\n\n parsedData[fieldQueries] = queries.sort((a, b) => {\n if (a.name < b.name) return -1;\n\n if (a.name > b.name) return 1;\n\n return 0;\n });\n\n await dc.model.update(moduleID, parsedData);\n\n return { id: queryID };\n }\n\n async updateQuery(id, data) {\n const moduleID = $$(ids.reportManager).getState().moduleId || \"\";\n\n if (moduleID === \"\") return {};\n\n const moduleData = (\n await dc.model.findAll({\n where: {\n uuid: moduleID,\n },\n })\n ).data[0];\n\n if (moduleData == null) return {};\n\n const queries = [...(moduleData[fieldQueries] || [])];\n const queryIndex = queries.findIndex((e) => e.id === id);\n\n queries[queryIndex] = Object.assign({ id }, data);\n\n const parsedData = {};\n\n parsedData[fieldQueries] = queries.sort((a, b) => {\n if (a.name < b.name) return -1;\n\n if (a.name > b.name) return 1;\n\n return 0;\n });\n\n await dc.model.update(moduleID, parsedData);\n\n return { id };\n }\n\n async deleteQuery(id) {\n const moduleID = $$(ids.reportManager).getState().moduleId || \"\";\n\n if (moduleID === \"\") return {};\n\n const moduleData = (\n await dc.model.findAll({\n where: {\n uuid: moduleID,\n },\n })\n ).data[0];\n\n if (moduleData == null) return {};\n\n const queries = moduleData[fieldQueries] || [];\n const queryIndex = queries.findIndex((e) => e.id === id);\n\n if (queryIndex >= 0) {\n const parsedData = {};\n\n parsedData[fieldQueries] = queries\n .filter((e, i) => i !== queryIndex)\n .sort((a, b) => {\n if (a.name < b.name) return -1;\n\n if (a.name > b.name) return 1;\n\n return 0;\n });\n\n await dc.model.update(moduleID, parsedData);\n }\n\n return { id: id };\n }\n\n async getData(config) {\n let result = [];\n let pullDataTasks = [];\n let dcIds = [];\n let dcData = {};\n let reportFields = [];\n\n // pull data of the base and join DCs\n dcIds.push(config.data);\n (config.joins || []).forEach((j) => {\n dcIds.push(j.sid);\n dcIds.push(j.tid);\n });\n dcIds = ab.uniq(dcIds);\n dcIds.forEach((dcId) => {\n pullDataTasks.push(\n new Promise((resolve, reject) => {\n const getData = async () => {\n try {\n dcData[dcId] = (await self.getData(dcId)) || [];\n\n resolve();\n } catch (err) {\n reject(err);\n }\n };\n\n getData();\n })\n );\n });\n\n dcIds.forEach((dcId) => {\n const dataCol = ab.datacollectionByID(dcId);\n\n if (!dataCol) return;\n\n reportFields = reportFields.concat(\n self.getReportFields(dataCol).map((f) => {\n // change format of id to match the report widget\n f.id = `${dcId}.${f.id}`; // dc_id.field_id\n return f;\n })\n );\n });\n\n await Promise.all(pullDataTasks);\n\n // the data result equals data of the base DC\n result = dcData[config.data] || [];\n\n if (config.joins?.length)\n (config.joins || []).forEach((j) => {\n const sourceDc = ab.datacollectionByID(j.sid);\n if (!sourceDc) return;\n\n const sourceObj = sourceDc.datasource;\n if (!sourceObj) return;\n\n const targetDc = ab.datacollectionByID(j.tid);\n if (!targetDc) return;\n\n const targetObj = targetDc.datasource;\n if (!targetObj) return;\n\n const sourceLinkField = sourceObj.fieldByID(j.sf);\n const targetLinkField = targetObj.fieldByID(j.tf);\n if (!sourceLinkField && !targetLinkField) return;\n\n const sourceData = dcData[j.sid] || [];\n const targetData = dcData[j.tid] || [];\n\n sourceData.forEach((sData) => {\n targetData.forEach((tData) => {\n let sVal =\n sData[\n sourceLinkField\n ? `${j.sid}.${sourceLinkField.columnName}.id`\n : `${j.sid}.id`\n ] || [];\n\n let tVal =\n tData[\n targetLinkField\n ? `${j.tid}.${targetLinkField.columnName}.id`\n : `${j.tid}.id`\n ] || [];\n\n if (!Array.isArray(sVal)) sVal = [sVal];\n\n if (!Array.isArray(tVal)) tVal = [tVal];\n\n // Add joined row to the result array\n const matchedVal = sVal.filter(\n (val) => tVal.indexOf(val) > -1\n );\n\n if (matchedVal?.length) {\n const updateRows =\n result.filter(\n (r) =>\n r[`${j.sid}.id`] === sData[`${j.sid}.id`] &&\n !r[`${j.tid}.id`]\n ) || [];\n\n if (updateRows?.length)\n (updateRows || []).forEach((r) => {\n for (const key in tData)\n if (key !== \"id\") r[key] = tData[key];\n });\n else\n result.push(\n Object.assign(\n ab.cloneDeep(sData),\n ab.cloneDeep(tData)\n )\n );\n }\n });\n });\n });\n\n // filter & sort\n const queryVal = JSON.parse(config.query || \"{}\");\n\n if (queryVal?.rules?.length)\n queryVal.rules.forEach((r) => {\n if (!r || !r.type || !r.condition) return;\n\n switch (r.type) {\n case \"date\":\n // Convert string to Date object\n if (r.condition.filter) {\n if (typeof r.condition.filter === \"string\")\n r.condition.filter = ab.rules.toDate(\n r.condition.filter\n );\n\n if (\n r.condition.filter.start &&\n typeof r.condition.filter.start === \"string\"\n )\n r.condition.filter.start = ab.rules.toDate(\n r.condition.filter.start\n );\n\n if (\n r.condition.filter.end &&\n typeof r.condition.filter.end === \"string\"\n )\n r.condition.filter.end = ab.rules.toDate(\n r.condition.filter.end\n );\n }\n\n break;\n }\n });\n\n // create a new query widget to get the filter function\n const filterElem = abWebix.ui({\n view: \"query\",\n fields: reportFields,\n value: queryVal,\n });\n\n // create a new data collection and apply the query filter\n const tempDc = new abWebix.DataCollection();\n\n tempDc.parse(result);\n\n // filter\n let filterFn;\n\n try {\n filterFn = filterElem.getFilterFunction();\n } catch (error) {\n // continue regardless of error\n }\n\n if (filterFn) tempDc.filter(filterFn);\n\n // sorting\n (config.sort || []).forEach((sort) => {\n if (sort.id)\n tempDc.sort({\n as: \"string\",\n dir: sort.mod || \"asc\",\n by: `#${sort.id}#`,\n });\n });\n\n result = tempDc.serialize();\n\n // clear\n filterElem.destructor();\n tempDc.destructor();\n\n // group by\n if (config?.group?.length) {\n result = _.groupBy(result, (e) => {\n return config.group\n .map((column) => {\n const parsedColumn = column.split(\".\");\n const originalColumn =\n parsedColumn.length > 2\n ? `${parsedColumn[1]}.${parsedColumn[2]}`\n : column;\n const reportField = reportFields.find(\n (reportField) => reportField.id === originalColumn\n );\n\n switch (reportField.type) {\n case \"date\": {\n const dateStringData = abWebix.i18n.dateFormatStr(\n e[originalColumn]\n );\n const parsedDateStringData =\n dateStringData.split(\"/\");\n\n switch (parsedColumn[0]) {\n case \"day\":\n e[column] = parsedDateStringData[1];\n\n return parsedDateStringData[1];\n\n case \"month\":\n e[column] = parsedDateStringData[0];\n\n return parsedDateStringData[0];\n\n case \"year\":\n e[column] = parsedDateStringData[2];\n\n return parsedDateStringData[2];\n\n case \"yearmonth\": {\n e[\n column\n ] = `${parsedDateStringData[0]}/${parsedDateStringData[2]}`;\n\n return e[column];\n }\n\n default:\n e[column] = dateStringData;\n\n return dateStringData;\n\n // switch (reportField.abField.key) {\n // case \"datetime\":\n // return abWebix.i18n.fullDateFormatStr(\n // e[originalColumn]\n // );\n\n // default:\n // break;\n // }\n }\n }\n\n default:\n return e[originalColumn]?.toString?.();\n }\n })\n .join(\"\");\n });\n\n result = Object.values(result).map((groupedData) => {\n const groupedResult = {};\n\n (config.columns || []).forEach((col) => {\n const agg = col.split(\".\")[0];\n const rawCol = col.replace(\n /sum.|avg.|count.|max.|min./g,\n \"\"\n );\n\n switch (agg) {\n case \"sum\":\n groupedResult[col] = ab.sumBy(groupedData, rawCol);\n break;\n case \"avg\":\n groupedResult[col] = ab.meanBy(groupedData, rawCol);\n break;\n case \"count\":\n groupedResult[col] = (groupedData || []).length;\n break;\n case \"max\":\n groupedResult[col] =\n (ab.maxBy(groupedData, rawCol) || {})[rawCol] ||\n \"\";\n break;\n case \"min\":\n groupedResult[col] =\n (ab.minBy(groupedData, rawCol) || {})[rawCol] ||\n \"\";\n break;\n default:\n groupedResult[col] = groupedData[0][col];\n break;\n }\n });\n\n return groupedResult;\n });\n }\n\n return result;\n }\n\n async getOptions(fields) {\n return [];\n }\n async getFieldData(fieldId) {\n return [];\n }\n }\n class MyLocal extends reports.services.Local {\n constructor(app) {\n super(app);\n\n this._currentModuleID = \"\";\n }\n\n getQueries() {\n const currentModuleID = $$(ids.reportManager).getState().moduleId;\n\n if (this._currentModuleID !== currentModuleID) {\n this._currentModuleID = currentModuleID;\n this._queries = null;\n }\n\n return super.getQueries();\n }\n }\n class MyEditor extends reports.views.editor {\n init() {\n super.init();\n\n if (!self.readonly || settings.editMode === 1) return;\n\n const $tabbar = this.$$(\"tabbar\");\n\n if (settings.hideCommonTab === 1) {\n const listener = () => {\n $tabbar.callEvent(\"onChange\", [\"data\"]);\n $tabbar.disableOption(\"common\");\n self.removeListener(\"editMode.tabbar.query\", listener);\n };\n\n self.on(\"editMode.tabbar.query\", listener);\n }\n\n if (settings.hideDataTab === 1) $tabbar.disableOption(\"other\");\n\n if (settings.hideViewTab === 1) $tabbar.disableOption(\"structure\");\n\n this.on(this.app, \"editMode.button.back\", () => {\n this.Reset(true);\n });\n }\n\n Reset(forceReset = false) {\n const id = this.AppState.moduleId;\n const condition = self.readonly && !(settings.editMode === 1);\n\n if (!condition || id == null || forceReset) super.Reset();\n\n this.Local.getModule(id);\n }\n\n TrackChanges() {\n super.TrackChanges();\n\n if (settings.hideCommonTab) self.emit(\"editMode.tabbar.query\");\n }\n }\n class MyToolBar extends reports.views.toolbar {\n config() {\n const ui = super.config();\n\n if (self.readonly && !(settings.editMode === 1)) {\n ui.elements[5].cols = ui.elements[5].cols.map((e) =>\n Object.assign(e, {\n hidden: self.readonly && !(settings.editMode === 1),\n })\n );\n\n ui.elements[5].cols.push(\n {},\n {\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-angle-double-left\",\n label: self.label(\"Back\"),\n localId: \"forceReset\",\n click: () => {\n return this.app.callEvent(\"editMode.button.back\", []);\n },\n }\n );\n }\n\n return ui;\n }\n }\n class MyEditorCommon extends reports.views[\"editor/common\"] {\n config() {\n const ui = super.config();\n\n if (!self.readonly) return ui;\n\n return Object.assign({}, ui, {\n elements: ui.elements.map((e, i) =>\n Object.assign(\n {\n hidden: !(i >= 2 && i < 5),\n },\n e\n )\n ),\n });\n }\n\n ShowDeleteButton() {\n super.ShowDeleteButton();\n\n if (self.readonly) this.$$(\"delete\").hide();\n }\n }\n class MyEditorData extends reports.views[\"editor/data\"] {\n config() {\n const ui = super.config();\n\n if (self.readonly) {\n ui.rows[0].rows[0].hidden = true;\n\n ui.rows[0].rows.unshift({\n label: \"Filtering query\",\n view: \"label\",\n width: 120,\n });\n }\n\n return ui;\n }\n }\n class MyTable extends reports.views.table {\n // NOTE: fix format of date column type\n GetColumnConfig(a) {\n let config = {\n id: a.id,\n header:\n !a.meta.header || a.meta.header === \"none\"\n ? a.meta.name || a.name\n : [\n a.meta.name || a.name,\n {\n content:\n a.header === \"text\"\n ? \"textFilter\"\n : \"richSelectFilter\",\n },\n ],\n type: a.type,\n sort: \"date\",\n width: a.width || 200,\n };\n\n const abField = self.AB.datacollectionByID(\n a.mid\n )?.datasource.fields((field) => field.columnName === a.name)[0];\n\n switch (a.type) {\n case \"date\":\n config.format = (val) => {\n // check valid date\n if (val?.getTime && !isNaN(val.getTime()))\n return abField?.key === \"datetime\"\n ? abWebix.i18n.fullDateFormatStr(val)\n : abWebix.i18n.dateFormatStr(val);\n else return \"\";\n };\n\n break;\n\n default:\n config = super.GetColumnConfig(a);\n\n break;\n }\n\n return config;\n }\n\n async GetTableData(mod) {\n const data = await super.GetTableData(mod);\n const buckets = mod.buckets;\n\n if (!buckets) return data;\n\n if (buckets.length === 0) return data;\n\n const columnIDs = mod.columns.map((e) => e.id);\n const parsedBuckets = mod.buckets.filter((bucket) =>\n columnIDs.includes(bucket.column)\n );\n\n if (parsedBuckets.length === 0) return data;\n\n const records = data[0].map((e) => {\n const parseRecord = {};\n\n parsedBuckets.forEach((bucket) => {\n const options = bucket.options;\n\n for (let i = 0; i < options.length; i++)\n if (\n options[i].values?.includes(e[bucket.column]) ||\n i === options.length - 1\n ) {\n parseRecord[bucket.column] = options[i].id;\n\n break;\n }\n });\n\n return Object.assign({}, e, parseRecord);\n });\n\n return [records, data[1]];\n }\n }\n\n const _ui = super.ui([\n {\n id: ids.reportManager,\n view: \"reports\",\n toolbar: true,\n override: new Map([\n [reports.services.Backend, MyBackend],\n [reports.services.Local, MyLocal],\n [reports.views.editor, MyEditor],\n [reports.views.toolbar, MyToolBar],\n [reports.views[\"editor/common\"], MyEditorCommon],\n [reports.views[\"editor/data\"], MyEditorData],\n [reports.views.table, MyTable],\n ]),\n },\n ]);\n\n delete _ui.type;\n delete _ui.height;\n\n return _ui;\n }\n\n async init(AB, accessLevel) {\n this.AB = AB;\n this.readonly = accessLevel < 2;\n\n const $reportManager = $$(this.ids.reportManager);\n const state = $reportManager.getState();\n\n state.readonly = this.readonly;\n state.mode =\n this.readonly && this.settings.editMode === 1 ? \"edit\" : \"list\";\n }\n\n getReportFields(dc) {\n if (!dc) return [];\n\n const object = dc.datasource;\n if (!object) return [];\n\n const fields = [];\n\n object.fields().forEach((f) => {\n const columnFormat = f.columnHeader();\n\n if (!f.isConnection) {\n let type = \"text\";\n\n switch (f.key) {\n case \"boolean\":\n case \"number\":\n case \"date\":\n type = f.key;\n\n break;\n\n case \"datetime\":\n type = \"date\";\n\n break;\n\n default:\n break;\n }\n\n fields.push({\n id: f.columnName,\n name: f.label,\n filter: f.fieldIsFilterable(),\n edit: false,\n type: type,\n format: columnFormat.format,\n options: columnFormat.options,\n ref: \"\",\n key: false,\n show: true,\n abField: f,\n });\n\n return;\n }\n\n if (f.isSource()) {\n const linkedDcs = this.view.application.datacollectionsIncluded(\n (dc) =>\n this.settings.datacollectionIDs.includes(dc.id) &&\n dc.settings.datasourceID === f.settings.linkObject\n );\n\n (linkedDcs || []).forEach((linkDc) => {\n fields.push({\n id: f.id,\n name: f.label,\n filter: false,\n edit: false,\n type: \"reference\",\n ref: linkDc.id,\n key: false,\n show: false,\n });\n });\n }\n });\n\n return fields;\n }\n\n async getData(datacollectionId) {\n const datacollection = this.AB.datacollectionByID(datacollectionId);\n if (!datacollection) return [];\n\n const object = datacollection.datasource;\n if (!object) return [];\n\n await this.waitInitializingDCEvery(1000, datacollection);\n\n const reportFields = this.getReportFields(datacollection);\n const reportData = [];\n const rawData = datacollection.getData();\n\n (rawData || []).forEach((row) => {\n const reportRow = { id: row.id };\n\n reportRow[`${datacollection.id}.id`] = row.id;\n\n object.fields().forEach((field) => {\n const columnName = field.columnName;\n const col = `${datacollection.id}.${columnName}`;\n\n if (field) {\n // FK value of the connect field\n if (field.isConnection) {\n let $pk = field.datasourceLink.PK();\n if (Array.isArray(row[columnName]))\n reportRow[`${col}.id`] = row[columnName].map(\n (link) => link[$pk] || link.id || link\n );\n else if (row[columnName])\n reportRow[`${col}.id`] =\n row[columnName][$pk] ||\n row[columnName].id ||\n row[columnName];\n } else reportRow[col] = field.format(row);\n } else reportRow[col] = row[columnName];\n\n const rField = reportFields.find(\n (f) => f.id === columnName || f.id === field.id\n );\n\n if (!rField) return;\n\n switch (rField.type) {\n case \"text\":\n case \"reference\":\n reportRow[col] = (reportRow[col] || \"\").toString();\n break;\n\n case \"number\":\n reportRow[col] = parseFloat(\n (reportRow[col] || 0).toString().replace(/[^\\d.-]/g, \"\")\n );\n break;\n\n case \"date\":\n reportRow[col] = row[columnName];\n if (reportRow[col]) {\n if (!(reportRow[col] instanceof Date))\n reportRow[col] = this.AB.rules.toDate(row[columnName]);\n } else reportRow[col] = \"\";\n break;\n }\n });\n\n reportData.push(reportRow);\n });\n\n return reportData;\n }\n\n async onShow() {\n super.onShow();\n\n const ids = this.ids;\n const $component = $$(ids.component);\n\n if ($component != null && !this.__isShowing) {\n this.__isShowing = true;\n\n $component.reconstruct();\n }\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewSchedulerComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewScheduler_${baseView.id}`,\n Object.assign(\n {\n scheduler: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const ids = this.ids;\n const ab = this.AB;\n const self = this;\n const abWebix = this.AB.Webix;\n const settings = this.settings;\n const dc = this.datacollection;\n const fieldName = dc?.datasource.fieldByID(\n settings.dataviewFields.name\n )?.columnName;\n const fieldStart = dc?.datasource.fieldByID(\n settings.dataviewFields.start\n )?.columnName;\n const fieldEnd = dc?.datasource.fieldByID(\n settings.dataviewFields.end\n )?.columnName;\n const fieldAllDay = dc?.datasource.fieldByID(\n settings.dataviewFields.allDay\n )?.columnName;\n const fieldRepeat = dc?.datasource.fieldByID(\n settings.dataviewFields.repeat\n )?.columnName;\n const fieldCalendar = dc?.datasource.fieldByID(\n settings.dataviewFields.calendar\n )?.columnName;\n const fieldEventColor = dc?.datasource.fieldByID(\n settings.dataviewFields.color\n )?.columnName;\n const fieldNotes = dc?.datasource.fieldByID(\n settings.dataviewFields.notes\n )?.columnName;\n const fieldOriginID = dc?.datasource.fieldByID(\n settings.dataviewFields.originID\n )?.columnName;\n const fieldSectionID = dc?.datasource.fieldByID(\n settings.dataviewFields.sectionID\n )?.columnName;\n const fieldUnitID = dc?.datasource.fieldByID(\n settings.dataviewFields.unitID\n )?.columnName;\n const dcCalendar = ab.datacollectionByID(\n this.settings.calendarDataviewID\n );\n const fieldTitle = dcCalendar?.datasource.fieldByID(\n settings.calendarDataviewFields.title\n )?.columnName;\n const fieldCalendarColor = dcCalendar?.datasource.fieldByID(\n settings.calendarDataviewFields.color\n )?.columnName;\n const fieldActive = dcCalendar?.datasource.fieldByID(\n settings.calendarDataviewFields.active\n )?.columnName;\n const timelineOptions = [];\n\n Object.keys(settings.timeline).forEach((key) => {\n if (settings.timeline[key] === 0) return;\n\n timelineOptions.push({\n id: `${key}`,\n value: `${key.charAt(0).toUpperCase()}${key.slice(1)}`,\n });\n });\n\n const _ui = super.ui([\n {\n padding: 6,\n cols: [\n { view: \"label\", width: 150, label: \"Export events data to: \" },\n {\n view: \"button\",\n width: 100,\n value: this.label(\"Excel\"),\n hidden: settings.export.excel === 0,\n click: () => {\n abWebix.toExcel(ids.scheduler);\n },\n },\n {\n view: \"button\",\n width: 100,\n value: this.label(\"CSV\"),\n hidden: settings.export.csv === 0,\n click: () => {\n abWebix.toCSV(ids.scheduler);\n },\n },\n {\n view: \"button\",\n width: 100,\n value: this.label(\"PDF\"),\n hidden: settings.export.pdf === 0,\n click: () => {\n abWebix.toPDF(ids.scheduler, { autowidth: true });\n },\n },\n {},\n ],\n },\n {\n id: ids.scheduler,\n view: \"scheduler\",\n date: new Date(),\n readonly: settings.readonly === 1,\n timeline: settings.timeline.timeline === 1,\n override: new Map([\n [\n scheduler.services.Backend,\n class MyBackend extends reports.services.Backend {\n async addCalendar(obj) {\n if (dcCalendar == null) return {};\n\n const data = {};\n\n data[fieldTitle] = obj.text;\n data[fieldCalendarColor] = obj.color;\n data[fieldActive] = obj.active;\n\n const response = await dcCalendar.model.create(data);\n\n return { id: response.id };\n }\n async addEvent(obj) {\n if (dc == null) return {};\n\n const data = {};\n\n data[fieldName] = obj.text;\n data[fieldStart] = new Date(obj.start_date);\n data[fieldEnd] = new Date(obj.end_date);\n data[fieldAllDay] = obj.all_day;\n data[fieldRepeat] = obj.recurring;\n data[fieldCalendar] = obj.calendar;\n data[fieldEventColor] = obj.color;\n data[fieldSectionID] = obj.section || \"No Section\";\n data[fieldUnitID] = obj.units || \"No Unit\";\n data[fieldNotes] = obj.details;\n data[fieldOriginID] = obj.origin_id;\n\n const response = await dc.model.create(data);\n\n return { id: response.id };\n }\n async calendars() {\n // if we manage a datacollection, then make sure it has started\n // loading it's data when we are showing our component.\n if (dcCalendar == null) return [];\n\n await self.waitInitializingDCEvery(1000, dcCalendar);\n\n return dcCalendar.getData().map((e) => {\n return {\n id: e.id,\n text: e[fieldTitle],\n color: e[fieldCalendarColor],\n active: e[fieldActive],\n };\n });\n }\n async events(params) {\n // if we manage a datacollection, then make sure it has started\n // loading it's data when we are showing our component.\n if (dc == null) return [];\n\n await self.waitInitializingDCEvery(1000, dc);\n\n const units = await this.units();\n const sections = await this.sections();\n\n return dc.getData().map((e) => {\n let unitID = units.find(\n (u) => u.id === e[fieldUnitID]\n )?.id;\n let sectionID = sections.find(\n (s) => s.id === e[fieldSectionID]\n )?.id;\n\n if (sectionID == null || unitID == null) {\n sectionID = sectionID || \"No Section\";\n unitID = unitID || \"No Unit\";\n\n // const data = {};\n\n // data[fieldSectionID] = sectionID;\n // data[fieldUnitID] = unitID;\n\n // dc.model.update(e.id, data);\n }\n\n return {\n id: e.id,\n text: e[fieldName],\n start_date: abWebix.Date.dateToStr(\n \"%Y-%m-%d %H:%i:%s\"\n )(e[fieldStart]),\n end_date: abWebix.Date.dateToStr(\n \"%Y-%m-%d %H:%i:%s\"\n )(e[fieldEnd]),\n all_day: e[fieldAllDay],\n recurring: e[fieldRepeat],\n calendar: e[fieldCalendar],\n color: e[fieldEventColor],\n section: sectionID,\n units: unitID,\n details: e[fieldNotes],\n origin_id: e[fieldOriginID],\n };\n });\n }\n async removeCalendar(id) {\n await dcCalendar.model.delete(id);\n }\n async removeEvent(id) {\n await dc.model.delete(id);\n }\n async sections() {\n return [\n { text: \"No Section\", id: \"No Section\" },\n ].concat(\n settings.timelineSectionList.split(\", \").map((e) => {\n return {\n id: e,\n text: e,\n };\n })\n );\n }\n async units() {\n return [{ id: \"No Unit\", value: \"No Unit\" }].concat(\n settings.unitList.split(\", \").map((e) => {\n return {\n id: e,\n value: e,\n };\n })\n );\n }\n async updateCalendar(id, obj) {\n if (dcCalendar == null) return {};\n\n const data = {};\n\n data[fieldTitle] = obj.text;\n data[fieldCalendarColor] = obj.color;\n data[fieldActive] = obj.active;\n\n await dcCalendar.model.update(id, data);\n }\n async updateEvent(id, obj, mode, date) {\n if (dc == null) return {};\n\n const data = {};\n\n data[fieldName] = obj.text;\n data[fieldStart] = new Date(obj.start_date);\n data[fieldEnd] = new Date(obj.end_date);\n data[fieldAllDay] = obj.all_day;\n data[fieldRepeat] = obj.recurring;\n data[fieldCalendar] = obj.calendar;\n data[fieldEventColor] = obj.color;\n data[fieldSectionID] = obj.section || \"No Section\";\n data[fieldUnitID] = obj.units || \"No Unit\";\n data[fieldNotes] = obj.details;\n data[fieldOriginID] = obj.origin_id;\n\n await dc.model.update(id, data);\n }\n },\n ],\n [\n scheduler.views[\"bars/nav\"],\n class CustomBarsView extends scheduler.views[\"bars/nav\"] {\n config() {\n const uiNav = super.config();\n uiNav.width = 160;\n uiNav.options = timelineOptions;\n return uiNav;\n }\n },\n ],\n [\n scheduler.views[\"bars/navpopup\"],\n class CustomNavPopupView extends scheduler.views[\n \"bars/navpopup\"\n ] {\n config() {\n const uiNavPopup = super.config();\n\n const options = timelineOptions.map((e) =>\n Object.assign({ icon: `shi-${e.id}` }, e)\n );\n\n if (this.app.config.calendars)\n uiNavPopup.body.body.rows[0].data = options;\n else uiNavPopup.body.data = options;\n\n return uiNavPopup;\n }\n },\n ],\n [\n scheduler.views[\"modes/day/multiday\"],\n class CustomModesDayMultiday extends scheduler.views[\n \"modes/day/multiday\"\n ] {\n LimitData(data) {\n // Get an error the case when the data parameter is undefined.\n super.LimitData(data || []);\n }\n },\n ],\n ]),\n },\n ]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async onShow() {\n super.onShow();\n\n const ids = this.ids;\n const $component = $$(ids.component);\n\n if ($component != null && !this.__isShowing) {\n this.__isShowing = true;\n\n $component.reconstruct();\n }\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewTabComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewTab_${baseView.id}`,\n Object.assign(\n {\n tab: \"\",\n\n sidebar: \"\",\n expandMenu: \"\",\n collapseMenu: \"\",\n\n popupTabManager: \"\",\n popupTabManagerForm: \"\",\n popupTabManagerSaveButton: \"\",\n },\n ids\n )\n );\n\n this.viewComponents =\n this.viewComponents ||\n baseView\n .views((v) => v.getUserAccess())\n .map((v) => {\n return {\n view: v,\n // component: v.component(App)\n };\n });\n }\n\n ui() {\n const ids = this.ids;\n const baseView = this.view;\n const ab = this.AB;\n const abWebix = ab.Webix;\n\n let _ui = null;\n\n // We are going to make a custom icon using the first letter of a menu item for menu items that don't have an icon\n // to do this we need to modify the default template with the method webix recommended form this snippet https://snippet.webix.com/b566d9f8\n abWebix.type(abWebix.ui.tree, {\n baseType: \"sideBar\", // inherit everything else from sidebar type\n name: \"customIcons\",\n icon: (obj, common) => {\n if (obj.icon.length)\n return [\n \"\",\n ].join(\"\");\n\n return [\n \"\",\n obj.value.charAt(0).toUpperCase(),\n \"\",\n ].join(\"\");\n },\n });\n\n const viewComponents = this.viewComponents;\n const settings = this.settings;\n\n if (viewComponents.length > 0) {\n if (settings.stackTabs) {\n // define your menu items from the view components\n const menuItems = viewComponents.map((vc) => {\n const view = vc.view;\n\n return {\n id: `${view.id}_menu`,\n value: view.label,\n icon: view.tabicon ? view.tabicon : \"\",\n };\n });\n\n if (menuItems.length) {\n // create a menu item for the collapse option to use later\n const collapseMenu = {\n id: ids.collapseMenu,\n value: this.label(\"Collapse Menu\"),\n icon: \"chevron-circle-left\",\n };\n\n // create a menu item from the expand option to use later\n const expandMenu = {\n id: ids.expandMenu,\n value: this.label(\"Expand Menu\"),\n icon: \"chevron-circle-right\",\n hidden: true,\n };\n\n // find out what the first option is so we can set it later\n let selectedItem = `${viewComponents[0].view.id}_menu`;\n\n const abStorage = ab.Storage;\n const sidebar = {\n view: \"sidebar\",\n type: \"customIcons\", // define the sidebar type with the new template created above\n id: ids.sidebar,\n height: settings.height,\n width: settings.sidebarWidth ? settings.sidebarWidth : 0,\n scroll: true,\n position: settings.sidebarPos ? settings.sidebarPos : \"left\",\n css: settings.darkTheme ? \"webix_dark\" : \"\",\n data: menuItems.concat(collapseMenu), // add you menu items along with the collapse option to start\n on: {\n onItemClick: (id) => {\n // when a menu item is clicked\n if (id === ids.collapseMenu) {\n // if it was the collapse menu item\n setTimeout(() => {\n const $sidebar = $$(ids.sidebar);\n\n // remove the collapse option from the menu\n $sidebar.remove(ids.collapseMenu);\n // add the expand option to the menu\n $sidebar.add(expandMenu);\n // toggle the sidebar state\n $sidebar.toggle();\n // we just clicked the collapse...but we don't wanted highlighted\n // so highlight the previously selected menu item\n $sidebar.select(selectedItem);\n // store this state in local storage the user preference is\n // remembered next time they see this sidebar\n abStorage.set(\n `${ids.tab}-state`,\n $sidebar.getState()\n );\n }, 0);\n } else if (id === ids.expandMenu) {\n setTimeout(() => {\n const $sidebar = $$(ids.sidebar);\n\n // remove the expand option from the menu\n $sidebar.remove(ids.expandMenu);\n // add the collapse option to the menu\n $sidebar.add(collapseMenu);\n // toggle the sidebar state\n $sidebar.toggle();\n // we just clicked the collapse...but we don't wanted highlighted\n // so highlight the previously selected menu item\n $sidebar.select(selectedItem);\n // store this state in local storage the user preference is\n // remembered next time they see this sidebar\n abStorage.set(\n `${ids.tab}-state`,\n $sidebar.getState()\n );\n }, 0);\n } else {\n // store the selecte menu item just in case someone toggles the menu later\n selectedItem = id;\n // if the menu item is a regular menu item\n // call the onShow with the view id to load the view\n\n id = id.replace(\"_menu\", \"\");\n let node = $$(id);\n if (node) {\n node.show(false, false);\n } else {\n // How often does this occure?\n let msg = `ABViewTabComponent[${this.name}][${this.id}] could not resolve UI panel for provided menu [${selectedItem}].`;\n this.AB.notify(\"developer\", msg, {});\n }\n // $$(id).show(false, false);\n\n // onShow(id);\n }\n },\n onSelectChange: () => {\n addDataCy();\n },\n onAfterRender: () => {\n addDataCy();\n },\n },\n };\n\n const multiview = {\n view: \"multiview\",\n id: ids.tab,\n keepViews: true,\n minWidth: settings.minWidth,\n cells: viewComponents.map((view) => {\n const tabUi = {\n id: view.view.id,\n // ui will be loaded when its tab is opened\n view: \"layout\",\n rows: [],\n };\n\n return tabUi;\n }),\n on: {\n onViewChange: (prevId, nextId) => {\n this.onShow(nextId);\n },\n },\n };\n\n const addDataCy = function () {\n const $sidebar = $$(ids.sidebar);\n\n // set ids of controller buttons\n const collapseNode = $sidebar?.$view.querySelector(\n `[webix_tm_id=\"${ids.collapseMenu}\"]`\n );\n\n if (collapseNode)\n collapseNode.setAttribute(\n \"data-cy\",\n `tab-collapseMenu-${ids.collapseMenu}`\n );\n\n const expandNode = $sidebar?.$view.querySelector(\n `[webix_tm_id=\"${ids.expandMenu}\"]`\n );\n\n if (expandNode)\n expandNode.setAttribute(\n \"data-cy\",\n `tab-expandMenu-${ids.expandMenu}`\n );\n\n baseView.views((view) => {\n const node = $sidebar?.$view?.querySelector(\n `[webix_tm_id=\"${view.id}_menu\"]`\n );\n\n if (!node) {\n return;\n }\n\n node.setAttribute(\n \"data-cy\",\n `tab-${view.name.replace(\" \", \"\")}-${view.id}-${\n baseView.id\n }`\n );\n });\n };\n\n let columns = [sidebar, multiview];\n\n if (settings.sidebarPos === \"right\") {\n columns = [multiview, sidebar];\n }\n\n _ui = {\n cols: columns,\n };\n } else\n _ui = {\n view: \"spacer\",\n };\n } else {\n const cells = baseView\n .views((view) => {\n const accessLevel = view.getUserAccess();\n\n if (accessLevel > 0) {\n return view;\n }\n })\n .map((view) => {\n const tabUi = {\n id: view.id,\n // ui will be loaded when its tab is opened\n view: \"layout\",\n rows: [],\n };\n\n let tabTemplate = \"\";\n\n // tab icon\n if (view.tabicon) {\n if (settings.iconOnTop)\n tabTemplate = [\n \"

    \",\n view.label,\n \"
    \",\n ].join(\"\");\n else\n tabTemplate = [\n \" \",\n view.label,\n ].join(\"\");\n }\n\n // no icon\n else tabTemplate = view.label;\n\n return {\n header: tabTemplate,\n body: tabUi,\n };\n });\n\n // if there are cells to display then return a tabview\n if (cells.length) {\n _ui = {\n rows: [\n {\n view: \"tabview\",\n id: ids.tab,\n minWidth: settings.minWidth,\n height: settings.height,\n tabbar: {\n height: 60,\n type: \"bottom\",\n css: settings.darkTheme ? \"webix_dark\" : \"\",\n on: {\n onAfterRender: () => {\n baseView.views((view) => {\n const node = $$(\n ids.tab\n )?.$view?.querySelector(\n `[button_id=\"${view.id}\"]`\n );\n\n if (!node) return;\n\n node.setAttribute(\n \"data-cy\",\n `tab ${view.name} ${view.id} ${baseView.id}`\n );\n });\n },\n },\n },\n multiview: {\n on: {\n onViewChange: (prevId, nextId) => {\n this.onShow(nextId);\n },\n },\n },\n cells: cells,\n },\n ],\n };\n }\n // else we return a spacer\n else\n _ui = {\n view: \"spacer\",\n };\n }\n } else\n _ui = {\n view: \"spacer\",\n };\n\n _ui = super.ui([_ui]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n async init(AB) {\n await super.init(AB);\n\n const ids = this.ids;\n const $tab = $$(ids.tab);\n const ab = this.AB;\n const abWebix = ab.Webix;\n\n if ($tab) abWebix.extend($tab, abWebix.ProgressBar);\n\n const baseView = this.view;\n const viewComponents = this.viewComponents;\n\n viewComponents.forEach((vc) => {\n // vc.component.init(AB);\n\n // Trigger 'changePage' event to parent\n this.eventAdd({\n emitter: vc.view,\n eventName: \"changePage\",\n listener: (...p) => this.changePage(...p),\n });\n });\n\n // Trigger 'changeTab' event to parent\n this.eventAdd({\n emitter: baseView,\n eventName: \"changeTab\",\n listener: (...p) => this.changeTab(...p),\n });\n\n // initialize the sidebar and figure out if it should be collased or not\n const $sidebar = $$(ids.sidebar);\n\n if (!$sidebar) return;\n\n const state = await ab.Storage.get(`${ids.tab}-state`);\n\n if (!state) return;\n\n // create a menu item for the collapse option to use later\n const collapseMenu = {\n id: ids.collapseMenu,\n value: this.label(\"Collapse Menu\"),\n icon: \"chevron-circle-left\",\n };\n\n // create a menu item from the expand option to use later\n const expandMenu = {\n id: ids.expandMenu,\n value: this.label(\"Expand Menu\"),\n icon: \"chevron-circle-right\",\n hidden: true,\n };\n\n // this will collapse or expand the sidebar\n $sidebar.setState(state);\n\n const checkCollapseMenu = $sidebar.getItem(ids.collapseMenu) ?? null;\n const checkExpandMenu = $sidebar.getItem(ids.expandMenu) ?? null;\n\n // if the state is collapsed we need to make sure the expand option is available\n if (state.collapsed) {\n if (checkCollapseMenu && checkExpandMenu)\n // $sidebar.remove(ids.collapseMenu);\n $sidebar.add(expandMenu);\n } else if (checkCollapseMenu && checkExpandMenu)\n // $sidebar.remove(ids.collapseMenu);\n $sidebar.add(collapseMenu);\n }\n\n changePage(pageId) {\n const $tab = $$(this.ids.tab);\n\n $tab?.blockEvent();\n this.view.changePage(pageId);\n $tab?.unblockEvent();\n }\n\n changeTab(tabViewId) {\n const baseView = this.view;\n const $tabViewId = $$(tabViewId);\n\n // switch tab view\n this.toggleParent(baseView.parent);\n\n if (this.settings.stackTabs)\n if (!$tabViewId.isVisible()) {\n const showIt = setInterval(() => {\n if ($tabViewId.isVisible()) clearInterval(showIt);\n\n $tabViewId.show(false, false);\n }, 200);\n } else $$(this.ids.tab).setValue(tabViewId);\n }\n\n toggleParent(view) {\n const $viewID = $$(view.id);\n\n if (view.key === \"tab\" || view.key === \"viewcontainer\") {\n $viewID?.show(false, false);\n }\n if (view.parent) {\n this.toggleParent(view.parent);\n }\n }\n\n onShow(viewId) {\n const ids = this.ids;\n\n let defaultViewIsSet = false;\n\n const $sidebar = $$(ids.sidebar);\n\n // if no viewId is given, then try to get the currently selected ID\n if (!viewId && $sidebar)\n viewId = $sidebar.getSelectedId().replace(\"_menu\", \"\");\n\n const baseView = this.view;\n const viewComponents = this.viewComponents;\n\n viewComponents.forEach((vc) => {\n // set default view id\n const currView = baseView.views((view) => {\n return view.id === vc.view.id;\n });\n\n let accessLevel = 0;\n\n if (currView.length) accessLevel = currView[0].getUserAccess();\n\n // choose the 1st View if we don't have one we are looking for.\n if (!viewId && !defaultViewIsSet && accessLevel > 0) {\n viewId = vc.view.id;\n\n defaultViewIsSet = true;\n }\n\n // create view's component once\n const $tab = $$(ids.tab);\n const settings = this.settings;\n\n if (!vc?.component && vc?.view?.id === viewId) {\n // show loading cursor\n if ($tab?.showProgress) $tab.showProgress({ type: \"icon\" });\n\n vc.component = vc.view.component();\n\n const $viewID = $$(vc.view.id);\n const ab = this.AB;\n const abWebix = ab.Webix;\n\n if (settings.stackTabs) {\n // update multiview UI\n abWebix.ui(\n {\n // able to 'scroll' in tab view\n id: vc.view.id,\n view: \"scrollview\",\n css: \"ab-multiview-scrollview\",\n body: vc.component.ui(),\n },\n $viewID\n );\n } else {\n // update tab UI\n abWebix.ui(\n {\n // able to 'scroll' in tab view\n id: vc.view.id,\n view: \"scrollview\",\n css: \"ab-tabview-scrollview\",\n body: vc.component.ui(),\n },\n $viewID\n );\n }\n\n // for tabs we need to look at the view's accessLevels\n accessLevel = vc.view.getUserAccess();\n\n vc.component.init(ab, accessLevel);\n\n // done\n setTimeout(() => {\n // $$(v.view.id).adjust();\n\n $tab?.hideProgress?.();\n // check if tab has a hint\n // if (vc?.view?.settings?.hintID) {\n // // fetch the steps for the hint\n // let hint = ab.hintID(vc.view.settings.hintID);\n // hint.createHintUI();\n // }\n }, 10);\n }\n\n // show UI\n if (vc?.view?.id === viewId && vc?.component?.onShow)\n vc.component.onShow();\n\n if (settings.stackTabs && vc?.view?.id === viewId) {\n $$(viewId)?.show(false, false);\n $sidebar?.select(`${viewId}_menu`);\n }\n });\n }\n};\n","const ABViewComponent = require(\"./ABViewComponent\").default;\n\nmodule.exports = class ABViewTextComponent extends ABViewComponent {\n constructor(baseView, idBase, ids) {\n super(\n baseView,\n idBase || `ABViewText_${baseView.id}`,\n Object.assign(\n {\n text: \"\",\n },\n ids\n )\n );\n }\n\n ui() {\n const ids = this.ids;\n const settings = this.settings;\n\n const _uiText = {\n id: ids.text,\n view: \"template\",\n minHeight: 10,\n css: \"ab-custom-template\",\n borderless: true,\n };\n\n if (settings.height) _uiText.height = settings.height;\n else _uiText.autoheight = true;\n\n const _ui = super.ui([_uiText]);\n\n delete _ui.type;\n\n return _ui;\n }\n\n displayText(value) {\n const ids = this.ids;\n const result = this.view.displayText(value, ids.text);\n\n const $text = $$(ids.text);\n\n if (!$text) return;\n\n $text.define(\"template\", result);\n $text.refresh();\n }\n\n onShow() {\n super.onShow();\n\n // listen DC events\n const dataview = this.datacollection;\n const baseView = this.view;\n\n if (dataview && baseView.parent.key !== \"dataview\") {\n [\"changeCursor\", \"cursorStale\"].forEach((key) => {\n baseView.eventAdd({\n emitter: dataview,\n eventName: key,\n listener: (...p) => this.displayText(...p),\n });\n });\n }\n\n this.displayText();\n }\n};\n","import ClassUI from \"../../../../ui/ClassUI\";\n\nexport default class ABViewProperty extends ClassUI {\n // constructor() {}\n\n /**\n * @property default\n * return default settings\n *\n * @return {Object}\n */\n static get default() {\n return {};\n }\n\n /** == Property == */\n /**\n * @function propertyComponent\n * return the view and logic to display in property panel\n *\n * @return {Object} - {\n * \t\t\t\t\t\tui: webix element,\n * \t\t\t\t\t\tinit: function,\n * \t\t\t\t\t\tlogic: object\n * \t\t\t\t\t}\n */\n static propertyComponent() {\n let ui = {\n view: \"template\",\n template: \"No UI\",\n };\n\n let init = (options) => {\n // register callbacks:\n for (var c in logic.callbacks) {\n logic.callbacks[c] = options[c] || logic.callbacks[c];\n }\n };\n\n let logic = {\n callbacks: {},\n };\n\n return {\n ui: ui,\n init: init,\n logic: logic,\n };\n }\n\n fromSettings(settings) {\n this.settings = settings;\n }\n\n toSettings() {\n return this.settings || {};\n }\n\n /** == UI == */\n /**\n * @function component\n * return the view and logic to display in display widget\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n *\n * @return {Object} - {\n * \t\t\t\t\t\tui: webix element,\n * \t\t\t\t\t\tinit: function,\n * \t\t\t\t\t\tlogic: object\n * \t\t\t\t\t}\n */\n component(App, idBase) {\n this.App = App;\n this.idBase = idBase;\n\n let ui = {\n view: \"template\",\n template: \"No UI\",\n };\n\n let init = (options) => {\n // register callbacks:\n for (var c in logic.callbacks) {\n logic.callbacks[c] = options[c] || logic.callbacks[c];\n }\n };\n\n let logic = {\n callbacks: {},\n };\n\n return {\n ui: ui,\n init: init,\n logic: logic,\n };\n }\n}\n","import ABViewProperty from \"./ABViewProperty\";\nimport ABViewFormButton from \"../ABViewFormButton\";\nimport ABViewPDFImporter from \"../ABViewPDFImporter\";\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nexport default class ABViewPropertyAddPage extends ABViewProperty {\n /**\n * @property default\n * return default settings\n *\n * @return {Object}\n */\n static get default() {\n return {\n formView: \"none\", // id of form to add new data\n };\n }\n\n static propertyComponent(App, idBase) {\n let ids = {\n formView: `${idBase}_formView`,\n };\n\n let ui = {\n id: ids.formView,\n name: \"formView\",\n view: \"richselect\",\n label: L(\"Add New Form\"),\n labelWidth: this.AB.UISettings.config().labelWidthXLarge,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal == L(\"No add new option\")) {\n $$(ids.formView).setValue(\"\");\n }\n\n _logic.callbacks.onSave();\n },\n },\n };\n\n let _init = (options) => {\n for (let c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n };\n\n let _logic = {\n callbacks: {\n onSave: function () {\n console.warn(\"NO onSave()!\");\n },\n },\n\n setSettings: (view, settings = {}) => {\n if (view == null) return;\n\n // Set the options of the possible edit forms\n let editForms = [\n {\n id: \"none\",\n value: L(\"No add new option\"),\n },\n ];\n\n let pagesHasForm = view\n .pageRoot()\n .pages((p) => {\n return p.views((v) => {\n return (\n v &&\n v.key == \"form\" &&\n v.datacollection &&\n v.datacollection.datasource &&\n v.datacollection.datasource.id ==\n view.field().settings.linkObject\n );\n }, true).length;\n }, true)\n .map((p) => {\n return {\n id: p.id,\n value: p.label,\n };\n });\n\n editForms = editForms.concat(pagesHasForm);\n\n let $selector = $$(ids.formView);\n if ($selector) {\n $selector.define(\"options\", editForms);\n $selector.define(\n \"value\",\n settings.formView || this.default.formView\n );\n $selector.refresh();\n }\n },\n\n getSettings: (view) => {\n let settings = view.settings || {};\n\n settings.formView = $$(ids.formView).getValue();\n\n return settings;\n },\n };\n\n return {\n ui: ui,\n init: _init,\n setSettings: _logic.setSettings,\n getSettings: _logic.getSettings,\n };\n }\n\n fromSettings(settings = {}) {\n this.settings = this.settings || {};\n this.settings.formView =\n settings.formView || this.constructor.default.formView;\n }\n\n getIds(idBase, App) {\n return {\n popup: App._App.unique(`${idBase}_popup_add_new`),\n field: idBase.split(\"_\")[1],\n button: App._App.unique(`${idBase}_popup_add_new_button`),\n };\n }\n\n component(App, idBase) {\n // This can be overwritten by creating a different getIds before calling .super\n let ids = this.getIds(idBase, App);\n\n let ui = \"\";\n\n if (\n this.settings.formView &&\n this.settings.formView != this.constructor.default.formView\n ) {\n // let iDiv = document.createElement(\"div\");\n // iDiv.className = \"ab-connect-add-new\";\n const dataCy = `add new CR button ${this.settings.formView} ${ids.field}`;\n // iDiv.innerHTML = ``;\n // iDiv.appendChild(node);\n // ui = iDiv.outerHTML;\n ui = {\n id: ids.button,\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-plus\",\n width: 32,\n height: 32,\n css: \"webix_primary ab-connect-add-new-link\",\n on: {\n onAfterRender: () => {\n $$(ids.button)\n ?.$view.querySelector(\"button\")\n .setAttribute(\"data-cy\", dataCy);\n },\n },\n };\n }\n\n let _logic = {\n callbacks: {\n onSaveData: (saveData) => {\n if ($$(ids.popup)) $$(ids.popup).close();\n },\n onCancel: () => {\n if ($$(ids.popup)) $$(ids.popup).close();\n\n return false;\n },\n onClearOnLoad: () => {\n return true;\n },\n clearOnLoad: () => {\n return true;\n },\n },\n\n applicationLoad: (application) => {\n this._application = application;\n },\n\n onClick: (dc) => {\n let pageId = this.settings.formView;\n let page = this._application.pages((p) => p.id == pageId, true)[0];\n\n return _logic.openFormPopup(page, dc);\n },\n\n /**\n * @method openFormPopup\n *\n * @param page {ABViewPage}\n * @param dc {ABDataCollection}\n */\n openFormPopup: (page, dc) => {\n return new Promise((resolve, reject) => {\n if (this._application == null) return resolve();\n\n if ($$(ids.popup)) {\n $$(ids.popup).show();\n return resolve();\n }\n\n // Clone page so we modify without causing problems\n let pageClone = page.clone(null, null, { ignoreSubPages: true });\n pageClone.id = this._application.AB.uuid(); // lets take the stored id can create a new dynamic one so our views don't duplicate\n // pageClone.id = pageClone.id + \"-\" + webix.uid(); // lets take the stored id can create a new dynamic one so our views don't duplicate\n let popUpComp = pageClone.component();\n let ui = popUpComp.ui();\n\n // Listen 'saved' event of the form widget\n const saveViews =\n pageClone.views(\n (v) =>\n v instanceof ABViewFormButton ||\n v instanceof ABViewPDFImporter,\n true\n ) ?? [];\n\n saveViews.forEach((view) => {\n const v =\n view instanceof ABViewFormButton ? view.parent : view;\n v.on(\"saved\", (savedData) => {\n _logic?.callbacks?.onSaveData(savedData);\n // ? is there ever a case where we want to keep an add popup open after saving?\n // ! setting this to always close\n\n if ($$(ids.popup)) {\n $$(ids.popup).close();\n } else {\n var popup = this.getTopParentView();\n popup.close();\n }\n });\n });\n\n let popupTemplate = {\n view: \"window\",\n id: ids.popup,\n modal: true,\n position: \"center\",\n // position:function(stthis.__addPageToolate){\n // \tstate.left = x + 20this.__addPageTool; // offset the popups\n // \tstate.top = y + 20;this.__addPageTool\n // },\n resize: true,\n width: parseInt(this.settings.popupWidth) || 700,\n height: parseInt(this.settings.popupHeight) + 44 || 450,\n css: \"ab-main-container\",\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n view: \"label\",\n label: page.label,\n css: \"modal_title\",\n align: \"center\",\n },\n {\n view: \"button\",\n label: L(\"Close\"),\n autowidth: true,\n align: \"center\",\n click: function () {\n var popup = this.getTopParentView();\n popup.close();\n },\n },\n ],\n },\n body: {\n view: \"scrollview\",\n scroll: true,\n body: ui,\n },\n };\n\n // Create popup\n webix.ui(popupTemplate).show();\n\n // Initial UI components\n const accessLevel = 3; // TODO: Is it correct\n popUpComp.init(this._application.AB, accessLevel, {\n onSaveData: _logic.callbacks.onSaveData,\n onCancelClick: _logic.callbacks.onCancel,\n clearOnLoad: _logic.callbacks.clearOnLoad,\n onClearOnLoad: _logic.callbacks.onClearOnLoad,\n });\n\n popUpComp.onShow();\n\n setTimeout(async () => {\n _logic.setDefaultValue(dc, pageClone);\n\n resolve();\n }, 100);\n });\n },\n\n setDefaultValue: (dc, page) => {\n if (!dc) return;\n\n let obj = dc.datasource;\n if (!obj) return;\n\n let linkedData = dc.getCursor();\n if (!linkedData) return;\n\n page.views().forEach((v) => {\n if (!v || v.key != \"form\") return;\n\n v.views().forEach((fView) => {\n if (fView.key != \"connect\" || fView.settings == null) return;\n\n let field = fView.field();\n if (field == null) return;\n\n let objLink = field.datasourceLink;\n if (objLink == null || objLink.id != obj.id) return;\n\n let data = {};\n let relationName = field.relationName();\n data[relationName] = {\n id: linkedData.id,\n };\n\n // Add custom index values\n let indexes = obj.indexes() || [];\n indexes.forEach((idx) => {\n (idx.fields || []).forEach((f) => {\n data[relationName][f.columnName] =\n linkedData[f.columnName];\n });\n });\n\n // Set label of selected item\n if (linkedData.text) {\n data[relationName].text = linkedData.text;\n data[relationName].value = data[relationName].text;\n } else {\n let rawData = {};\n rawData[relationName] = linkedData;\n data[relationName].text = field.format(rawData);\n data[relationName].value = data[relationName].text;\n }\n\n let comp = v.viewComponents[fView.id];\n if (!comp) return;\n\n const ui = typeof comp.ui == \"function\" ? comp.ui() : comp.ui;\n const inputId = ui?.inputId || ui?.rows?.[0]?.inputId;\n\n if (inputId) field.setValue($$(inputId), data);\n });\n });\n },\n };\n\n let init = (options) => {\n for (let c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n if (ui) {\n for (let c in options) {\n ui.on[c] = options[c];\n }\n }\n };\n\n return {\n ui: ui,\n init: init,\n\n applicationLoad: _logic.applicationLoad,\n onClick: _logic.onClick,\n openFormPopup: _logic.openFormPopup,\n };\n }\n}\n","import ABViewPropertyAddPage from \"./ABViewPropertyAddPage\";\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nexport default class ABViewPropertyEditPage extends ABViewPropertyAddPage {\n /**\n * @property default\n * return default settings\n *\n * @return {Object}\n */\n static get default() {\n return {\n editForm: \"none\", // The url pointer of ABViewForm\n };\n }\n\n static propertyComponent(App, idBase) {\n let ids = {\n formEdit: `${idBase}_editForm`,\n };\n\n let ui = {\n id: ids.formEdit,\n name: \"editForm\",\n view: \"richselect\",\n label: L(\"Edit Form\"),\n labelWidth: this.AB.UISettings.config().labelWidthXLarge,\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal == L(\"No add new option\")) {\n $$(ids.formEdit).setValue(\"\");\n }\n\n _logic.callbacks.onSave();\n },\n },\n };\n\n let _init = (options) => {\n for (let c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n };\n\n let _logic = {\n callbacks: {\n onSave: function () {\n console.warn(\"NO onSave()!\");\n },\n clearOnLoad: () => {\n return false; // always false, we're trying to edit data\n },\n },\n\n setSettings: (view, settings = {}) => {\n if (view == null) return;\n settings.clearOnLoad = false; // doesn't work\n\n // Set the options of the possible edit forms\n let editForms = [\n {\n id: \"none\",\n\n value: L(\"No add new option\"),\n },\n ];\n\n (view.pageRoot().pages(() => true, true) || []).forEach((p) => {\n if (!p) return;\n\n p.views(() => true, true).forEach((v) => {\n if (\n v &&\n v.key == \"form\" &&\n v.datacollection &&\n v.datacollection.datasource &&\n v.datacollection.datasource.id ==\n view.field().settings.linkObject\n ) {\n editForms.push({\n id: v.urlPointer(),\n value: `${p.label} - ${v.label}`,\n });\n }\n });\n });\n\n let $selector = $$(ids.formEdit);\n if ($selector) {\n $selector.define(\"options\", editForms);\n $selector.define(\n \"value\",\n settings.editForm || this.default.editForm\n );\n $selector.refresh();\n }\n },\n\n getSettings: (view) => {\n let settings = view.settings || {};\n\n let $selector = $$(ids.formEdit);\n let $selectPopup = $selector.getPopup();\n let selectedItem = ($selectPopup.config.body.data || []).filter(\n (opt) => opt.id == $selector.getValue()\n )[0];\n if (selectedItem) {\n settings.editForm = selectedItem.id; // The url pointer of ABViewForm\n }\n\n return settings;\n },\n };\n\n return {\n ui: ui,\n init: _init,\n setSettings: _logic.setSettings,\n getSettings: _logic.getSettings,\n };\n }\n\n fromSettings(settings = {}) {\n this.settings = this.settings || {};\n this.settings.editForm =\n settings.editForm || this.constructor.default.editForm;\n }\n\n component(App, idBase) {\n // Overwrite the popup-lookup function\n function getIds(idBase, App) {\n return {\n popup: App._App.unique(`${idBase}_popup_edit_form`),\n field: idBase.split(\"_\")[1],\n };\n }\n this.getIds = getIds;\n\n // call to addpage\n let comp = super.component(App, idBase);\n\n comp.onClick = () => {\n if (\n !this._application ||\n !this.settings.editForm ||\n this.settings.editForm == this.constructor.default.editForm\n )\n return Promise.resolve();\n\n let form = this._application.urlResolve(this.settings.editForm);\n if (!form) return Promise.resolve();\n\n let page = form.pageParent();\n if (!page) return Promise.resolve();\n\n return comp.openFormPopup(page);\n };\n\n return comp;\n }\n}\n","/*\n * ABViewPropertyFilterData\n * This is a displayable ui component that will manage displaying a\n * means of searching for the user.\n *\n * This component will emit: \"filter.data\" when one of the filter options\n * have been enabled.\n * \"filter.data\" has 2 parameters: fnFilter, filterRules\n * fnFilter {function} when passed a row of data from the grid,\n * return true/false if it passes the filter.\n * filterRules {array} of each of the filter rules that have been\n * created. Note: the fnFilter still checks the validity\n * of the row based on these rules.\n * (this is used for the parent component to indicate how\n * many rules are currently applied to the data being displayed)\n */\nconst ABMLClass = require(\"../../ABMLClass\");\nimport ABViewProperty from \"./ABViewProperty\";\nimport ABViewComponent from \"../viewComponent/ABViewComponent\";\n\n// const ABViewGridFilterRule = require(\"../../../rules/ABViewGridFilterRule\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nclass FilterRuleSettings extends ABMLClass {\n constructor() {\n super([\"label\"], AB);\n }\n\n fromSettings(settings) {\n super.fromValues(settings);\n this.filters = settings.filters;\n }\n\n toSettings() {\n let obj = super.toObj();\n obj.filters = this.filters;\n return obj;\n }\n}\n\nclass ABViewPropertyFilterDataComponent extends ABViewComponent {\n constructor(viewPropertyFilterData, idBase) {\n var base = idBase || viewPropertyFilterData.idBase;\n super(base, {});\n }\n}\n\nexport default class ABViewPropertyFilterData extends ABViewProperty {\n constructor(AB, idBase) {\n super(idBase, {\n buttonAddfilter: \"\",\n filterPanel: \"\",\n globalFilterFormContainer: \"\",\n globalFilterForm: \"\",\n filterMenutoolbar: \"\",\n resetFilterButton: \"\",\n });\n\n this.AB = AB;\n this.idBase = idBase;\n this.object = null;\n // this.queryRules = [];\n\n this.__externalSearchText = null;\n // {string}\n // External sources of text filters are stored here. This is most likely\n // from the global search toolbar entry.\n this.rowFilter = this.AB.filterComplexNew(`${this.ids.component}_filter`);\n // {RowFilter}\n // When .userFilterPosition == \"toolbar\" we use this RowFilter to\n // display a form in a popup where the toolbar button is.\n\n this.rowFilterForm = this.AB.filterComplexNew(\n `${this.ids.component}_filter_form`\n );\n // {RowFilter}\n // When .userFilterPosition == \"form\" we use this RowFilter to\n // display a form under the toolbar.\n\n this._handler_rowFilterChanged = (value) => {\n let filterRules = value.rules || [];\n\n // if ($$(ids.buttonFilter)) {\n // $$(ids.buttonFilter).define('badge', filterRules.length || null);\n // $$(ids.buttonFilter).refresh();\n // }\n\n // be notified when there is a change in the filter\n this.triggerCallback((rowData) => {\n return this.rowFilter.isValid(rowData);\n }, filterRules);\n };\n\n this._handler_rowFilterFormChanged = () => {\n this.triggerCallback();\n };\n\n this.initialized = false;\n // {bool}\n // make sure this is not .init() more than once\n }\n\n /**\n * @property default\n * return default settings\n *\n * @return {Object}\n */\n static get default() {\n return {\n filterOption: 1,\n // {integer}\n // 0 - Not allow\n // 1 - Enable user filter\n // 2 - Predefined filter menu\n // 3 - Global filter input\n\n // filterOptions == 1 options\n userFilterPosition: \"toolbar\",\n // {string} the location of the filter:\n // \"toolbar\" : there will be an \"Add Filters\" button on\n // the toolbar that will trigger the form popup\n // \"form\" : there will be a button under the toolbar that\n // will bring up the form popup.\n\n isGlobalToolbar: 1,\n // {boolean|truthy}\n // when \"toolbar\" is chosen for userFilterPosition, this setting\n // allows us to also include the search criteria specified in\n // the search box on the toolbar.\n\n // filterOptions == 2 options\n // predefined filters created by the builders. There will be\n // an area under the toolbar that displays buttons to choose\n // between one of the predefined queryRules.\n // queryRules: [], // An array of ABViewGridFilterRule object\n\n // filterOptions == 3 options\n // globalFilterPosition: \"default\",\n // {string} [ \"default\", \"single\" ]\n // \"default\" : shows default grid with all potential matches\n // \"single\" : grid only shows when it has a match. only 1\n // match is shown. ( is this true?? )\n };\n }\n\n /**\n * @method fromSettings\n * Create an initial set of default values based upon our settings object.\n * @param {obj} settings The settings object we created in .toSettings()\n */\n fromSettings(settings) {\n settings = settings || {};\n\n settings.filterOption =\n typeof settings.filterOption != \"undefined\"\n ? settings.filterOption\n : ABViewPropertyFilterData.default.filterOption;\n\n settings.isGlobalToolbar =\n typeof settings.isGlobalToolbar != \"undefined\"\n ? settings.isGlobalToolbar\n : ABViewPropertyFilterData.default.isGlobalToolbar;\n\n this.settings = settings;\n }\n\n /**\n * @method objectLoad\n * A rule is based upon a Form that was working with an Object.\n * .objectLoad() is how we specify which object we are working with.\n *\n * @param {ABObject} The object that will be used to evaluate the Rules\n */\n objectLoad(object) {\n this.object = object;\n\n if (this.rowFilter) {\n // this.rowFilter.applicationLoad(object.application);\n this.rowFilter.fieldsLoad(object.fields());\n }\n\n if (this.rowFilterForm) {\n // this.rowFilterForm.applicationLoad(object.application);\n this.rowFilterForm.fieldsLoad(object.fields());\n }\n }\n\n viewLoad(view) {\n this.view = view;\n }\n\n /** == UI == */\n ui() {\n var self = this;\n var ids = this.ids;\n\n return {\n id: ids.filterPanel,\n type: \"space\",\n borderless: true,\n padding: 0,\n hidden: true,\n rows: [\n {\n id: ids.globalFilterFormContainer,\n hidden: true,\n cols: [\n {\n id: ids.globalFilterForm,\n view: \"text\",\n placeholder: L(\"Search or scan a barcode to see results\"),\n on: {\n onTimedKeyPress: () => {\n this.triggerCallback();\n },\n },\n },\n {\n view: \"button\",\n css: \"webix_primary\",\n width: 28,\n type: \"icon\",\n icon: \"fa fa-times\",\n click: function () {\n var $form = $$(ids.globalFilterForm);\n $form.setValue(\"\");\n $form.focus();\n $form.callEvent(\"onTimedKeyPress\");\n },\n },\n ],\n },\n {\n id: ids.buttonAddfilter,\n view: \"button\",\n css: \"webix_primary\",\n value: L(\"Add Filter\"),\n click: () => {\n this.rowFilterForm.popUp($$(ids.buttonAddfilter).getNode(), {\n pos: \"bottom\",\n });\n },\n },\n {\n view: \"toolbar\",\n id: ids.filterMenutoolbar,\n css: \"ab-data-toolbar\",\n hidden: true,\n cols: [\n {\n view: \"button\",\n css: \"webix_primary\",\n id: ids.resetFilterButton,\n label: L(\"Reset Filter\"),\n icon: \"fa fa-ban\",\n type: \"icon\",\n // badge: 0,\n autowidth: true,\n click: function () {\n self.resetFilter();\n },\n },\n ],\n },\n ],\n };\n }\n\n async init(AB) {\n if (AB) {\n this.AB = AB;\n }\n\n var ids = this.ids;\n // this.filter_popup = webix.ui({\n // view: \"popup\",\n // id: ids.component,\n // width: 600,\n // height: 400,\n // hidden: true,\n // body: this.rowFilter.ui,\n // });\n\n this.rowFilter.init();\n this.rowFilter.removeListener(\"changed\", this._handler_rowFilterChanged);\n this.rowFilter.on(\"changed\", this._handler_rowFilterChanged);\n\n this.rowFilterForm.init();\n this.rowFilterForm.removeListener(\n \"changed\",\n this._handler_rowFilterFormChanged\n );\n this.rowFilterForm.on(\"changed\", this._handler_rowFilterFormChanged);\n this.rowFilterForm.removeListener(\n \"save\",\n this._handler_rowFilterFormChanged\n );\n this.rowFilterForm.on(\"save\", this._handler_rowFilterFormChanged);\n\n $$(ids.filterPanel)?.hide();\n $$(ids.buttonAddfilter)?.hide();\n $$(ids.filterMenutoolbar)?.hide();\n $$(ids.globalFilterFormContainer)?.hide();\n\n switch (this.settings.filterOption) {\n case 0:\n break;\n case 1:\n switch (this.settings.userFilterPosition) {\n case \"form\":\n $$(ids.buttonAddfilter)?.show();\n $$(ids.filterPanel)?.show();\n break;\n case \"toolbar\":\n $$(ids.filterPanel)?.hide();\n break;\n }\n break;\n case 2:\n $$(ids.filterPanel)?.show();\n var $filterMenutoolbar = $$(ids.filterMenutoolbar);\n if ($filterMenutoolbar) {\n $filterMenutoolbar.show();\n\n // populate filter items\n if (this.settings?.queryRules) {\n (this.settings.queryRules || []).forEach((qr) => {\n let Rule = new FilterRuleSettings();\n Rule.fromSettings(qr);\n var filterRuleButton = {\n view: \"button\",\n css: \"webix_primary\",\n label: Rule.label,\n icon: \"fa fa-filter\",\n type: \"icon\",\n // badge: 0,\n autowidth: true,\n click: () => {\n this.emit(\"filter.data\", null, Rule.filters);\n // this.selectFilter(qr.filter);\n },\n };\n $filterMenutoolbar.addView(filterRuleButton);\n });\n }\n }\n break;\n case 3:\n $$(ids.globalFilterFormContainer)?.show();\n $$(ids.filterPanel)?.show();\n break;\n }\n }\n\n filterRules() {\n let rowFilterRules = null;\n\n switch (this.settings.userFilterPosition) {\n case \"form\":\n rowFilterRules = this.rowFilterForm.getValue();\n break;\n case \"toolbar\":\n rowFilterRules = this.rowFilter.getValue();\n break;\n }\n\n return rowFilterRules;\n }\n\n /**\n * @method getFilter()\n * Return a fn() that returns {truthy} with a given row of\n * data.\n */\n getFilter() {\n // default filter\n if (this.__currentFilter == null) {\n // if empty search text in global single mode, then no display rows\n if (\n this.settings.filterOption == 3 &&\n this.settings.globalFilterPosition == \"single\"\n )\n this.__currentFilter = (/* row */) => {\n return false;\n };\n // always true, show every rows\n else\n this.__currentFilter = (/* row */) => {\n return true;\n };\n }\n\n return this.__currentFilter;\n }\n\n /**\n * @method triggerCallback()\n * We compile our current search options and emit them back to our\n * parent container.\n */\n triggerCallback(/*fnFilter, filterRules*/) {\n let searchRules = this.searchText(this.__externalSearchText);\n let rowFilterRules = this.filterRules();\n\n let badgeCount = 0;\n if (rowFilterRules?.rules?.length) {\n badgeCount = rowFilterRules?.rules?.length;\n if (searchRules) {\n badgeCount++;\n rowFilterRules = {\n glue: \"and\",\n rules: [rowFilterRules, searchRules],\n };\n }\n } else {\n rowFilterRules = searchRules;\n }\n\n this.emit(\"filter.data\", null, rowFilterRules);\n\n if (badgeCount == 0) badgeCount = false;\n const $button = $$(this.ids.buttonAddfilter);\n if ($button) {\n $button.config.badge = badgeCount;\n $button.refresh();\n }\n }\n\n resetFilter() {\n this.triggerCallback(() => true, []);\n }\n\n /**\n * @method externalSearchText()\n * Save any search criteria established from outside this filterHelper.\n * NOTE: The ABViewGrid has a toolbar search entry that will provide\n * this value.\n * @param {string} search\n * The typed in search criteria.\n */\n externalSearchText(search = null) {\n this.__externalSearchText = search;\n this.triggerCallback(); // update each time\n }\n\n /**\n * @method searchText()\n * Retrieve the typed in search terms from the user, and convert them\n * into a set of Rules that will modify our results.\n * If an external search param is provided, use that instead.\n * @param {string} externalText\n * @return {json} The QB Rule condition for the search criteria\n */\n searchText(externalText) {\n var search;\n if (externalText) {\n search = externalText;\n } else {\n search = ($$(this.ids.globalFilterForm)?.getValue() ?? \"\").trim();\n }\n if (!search) return null; // <-- includes \"\"\n\n // find the individual \"terms\" that we should search for\n let terms = search.trim().toLowerCase().split(\" \");\n\n // build a set of conditions for each term\n var allTerms = [];\n\n var allFields = this.object?.fields() || [];\n\n terms.forEach((t) => {\n var fieldTerms = [];\n\n // for each field, add a match condition for that field\n // (if the field applies)\n allFields.forEach((f) => {\n if (f.fieldIsFilterable()) {\n switch (f.key) {\n case \"number\":\n case \"string\":\n case \"LongText\":\n case \"email\":\n fieldTerms.push({\n key: f.id,\n rule: \"contains\",\n value: t,\n });\n break;\n\n case \"list\":\n var options = f.options();\n options.forEach((o) => {\n if (o.text.indexOf(t) > -1) {\n fieldTerms.push({\n key: f.id,\n rule: \"equals\",\n value: o.id,\n });\n }\n });\n break;\n }\n }\n });\n\n if (fieldTerms.length > 0) {\n allTerms.push({\n glue: \"or\",\n rules: fieldTerms,\n });\n }\n });\n\n if (allTerms.length > 0) {\n var searchRules = {\n glue: \"and\",\n rules: allTerms,\n };\n return searchRules;\n } else {\n return null;\n }\n }\n\n showPopup($view) {\n // this.filter_popup.show($view, null, { pos: \"top\" });\n this.rowFilter.popUp($view, null, { pos: \"center\" });\n }\n}\n","import ABViewProperty from \"./ABViewProperty\";\nimport ABViewComponent from \"../viewComponent/ABViewComponent\";\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nclass ABViewPropertyLinkPageComponent extends ABViewComponent {\n constructor(linkPageHelper, idBase) {\n let base = idBase || `ABViewPropertyLinkPage_xxx`;\n super(base, {});\n\n this.linkPageHelper = linkPageHelper;\n this.AB = linkPageHelper.AB;\n\n this.view = null;\n // {ABViewXXXX}\n // the ABView object this link references.\n\n this.datacollection = null;\n // {ABDataCollection}\n // The related Datacollection to this view that drives it's data.\n // we usually have to set the cursor before the view displays the\n // appropriate data.\n }\n\n ui() {\n return {};\n }\n\n init(options) {\n if (options.view) this.view = options.view;\n\n if (options.datacollection) this.datacollection = options.datacollection;\n }\n\n changePage(pageId, rowId) {\n if (this.datacollection) {\n this.datacollection.once(\"changeCursor\", () => {\n this.view?.changePage(pageId);\n });\n this.datacollection.setCursor(rowId);\n } else {\n this.view?.changePage(pageId);\n }\n }\n}\n\nexport default class ABViewPropertyLinkPage extends ABViewProperty {\n // constructor() {\n // super();\n // }\n\n /** == UI == */\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n component(v1App = false) {\n let component = new ABViewPropertyLinkPageComponent(this);\n\n // if this is our v1Interface\n if (v1App) {\n var newComponent = component;\n component = {\n ui: newComponent.ui(),\n init: (...params) => {\n return newComponent.init(...params);\n },\n onShow: (...params) => {\n return newComponent.onShow?.(...params);\n },\n changePage: (...params) => {\n return newComponent.changePage(...params);\n },\n };\n }\n\n return component;\n }\n}\n","//\n// ABViewQueryBuilderObjectFieldConditions\n//\n// A UI component that is responsible for displaying a QueryBuilder based upon\n// the fields of a given ABObject.\n//\n// This object is also responsible for saving it's state to a settings value,\n// and generating the settings value to be saved.\n\nmodule.exports = class ABViewQueryBuilderObjectFieldConditions {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(label) {\n this.label = label;\n this.ui = null;\n }\n\n /**\n * cleanRules\n * walk through all the QueryBuilder (QB) rules and make conversions\n * of the data into their proper formats.\n * @param {obj} rules the {rules} obj that is returned from the QB object\n * @param {array} fields an array of field definitions from the QB object\n * @param {bool} dateToString convert Dates to String format?\n */\n cleanRules(rules, fields, dateToString) {\n if (typeof dateToString == \"undefined\") dateToString = true;\n\n // walk the given condition rules / values, walk them and make sure\n // any given rules have properly formatted values.\n function processCondition(rule) {\n // make sure rule is provided\n if (rule) {\n if (rule.glue && rule.rules) {\n rule.rules.forEach((r) => {\n processCondition(r);\n });\n } else {\n // converting a single rule:\n\n var field = fields.filter((f) => {\n return f.id == rule.key;\n })[0];\n if (field) {\n switch (field.type) {\n case \"number\":\n case \"formula\":\n // when getting data from the server, the numbers are\n // sent back as strings (\"100.25\").\n // make sure to convert strings to numbers:\n if (typeof rule.value == \"string\") {\n if (rule.value.indexOf(\".\") == -1) {\n rule.value = parseInt(rule.value);\n } else {\n rule.value = parseFloat(rule.value);\n }\n }\n break;\n case \"date\":\n // in some cases we want to convert the Date() object returned\n // by QueryBuilder into a string for saving on the Server.\n if (dateToString) {\n // if we have a Date() obj returned from QueryBuilder,\n // convert to a string format:\n if (rule.value instanceof Date) {\n rule.value = webix.i18n.dateFormatStr(rule.value);\n }\n } else {\n // in other cases we want to convert the string returned\n // by the server into a Date() for the QB\n if (typeof rule.value == \"string\") {\n rule.value = new Date(rule.value);\n }\n }\n\n break;\n }\n }\n }\n }\n }\n processCondition(rules);\n }\n\n // component\n // initialize the UI display for this popup editor.\n component(App, idBase) {\n this.App = App;\n this.idBase = idBase;\n\n var L = App.Label;\n\n var uniqueInstanceID = webix.uid();\n var myUnique = (key) => {\n // return this.unique(idBase + key ) + '_' + uniqueInstanceID;\n return `${idBase}_${key}_${uniqueInstanceID}`;\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = (this.ids = {\n component: myUnique(\"qbObjectFieldConditions\"),\n queryBuilder: myUnique(\"qBuilder\"),\n queryBuilderContainer: myUnique(\"qBuilderContainer\"),\n queryBuilderLayout: myUnique(\"qBuilderLayout\"),\n showQBButton: myUnique(\"showQBButton\"),\n });\n\n // webix UI definition:\n this.ui = {\n view: \"layout\",\n id: ids.queryBuilderLayout,\n hidden: true,\n type: \"line\",\n rows: [\n {\n id: ids.showQBButton,\n cols: [\n { fillspace: true },\n {\n view: \"button\",\n css: \"webix_primary\",\n name: \"addqb\",\n value: L(\"Add Custom Conditions\"),\n autowidth: true,\n click: function () {\n $$(ids.queryBuilderContainer).show();\n $$(ids.showQBButton).hide();\n // _logic.buttonCancel();\n },\n },\n { fillspace: true },\n ],\n },\n {\n hidden: true,\n id: ids.queryBuilderContainer,\n cols: [\n {\n view: \"querybuilder\",\n id: ids.queryBuilder,\n fields: this.conditionFields(),\n },\n ],\n },\n ],\n };\n\n // tack on a label if provided.\n if (this.label) {\n this.ui.rows[1].cols.unshift({\n view: \"label\",\n css: \"ab-text-bold\",\n label: this.label,\n width: this.AB.UISettings.config().labelWidthLarge,\n });\n }\n\n // for setting up UI\n this.init = (options) => {\n options = options || {};\n\n // register callbacks:\n for (var c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n };\n\n // internal business logic\n var _logic = (this._logic = {\n callbacks: {\n onCancel: function () {\n console.warn(\"NO onCancel()!\");\n },\n onSave: function (field) {\n console.warn(\"NO onSave()!\");\n },\n },\n\n /**\n * cleanRules\n * walk through all the QueryBuilder (QB) rules and make conversions\n * of the data into their proper formats.\n * @param {obj} rules the {rules} obj that is returned from the QB object\n * @param {array} fields an array of field definitions from the QB object\n * @param {bool} dateToString convert Dates to String format?\n */\n cleanRules: (rules, fields, dateToString) => {\n this.cleanRules(rules, fields, dateToString);\n },\n\n getValue: () => {\n var values = null;\n var QB = $$(ids.queryBuilder);\n if (QB) {\n values = QB.getValue();\n }\n\n // convert dates to simpler format:\n // by default we're getting long values: \"Mon Feb 2, 2018 GMT xxxxxxx\",\n // and webix doesn't seem to understand them when we send them back.\n // so save simple date values: \"mm/dd/yyyy\"\n if (values) {\n _logic.cleanRules(values[0], values[1], true);\n }\n\n return values;\n },\n\n setValue: (values) => {\n values = values || [];\n if (!Array.isArray(values)) values = [values];\n if (values.length == 0) {\n values.push({});\n } // push default rules\n if (values.length < 2) {\n values.push(this.conditionFields());\n }\n\n // convert dates from our server side \"string\" format into\n // Date() objects.\n _logic.cleanRules(values[0], values[1], false);\n\n var QB = $$(ids.queryBuilder);\n if (QB) {\n if (values[0] && values[0].rules && values[0].rules.length) {\n QB.setValue(values[0]);\n $$(ids.queryBuilderContainer).show();\n $$(ids.showQBButton).hide();\n }\n }\n },\n });\n\n this.getValue = _logic.getValue;\n this.show = _logic.show;\n this.setValue = _logic.setValue;\n }\n\n objectLoad(object) {\n this.currentObject = object;\n }\n\n // conditionFields()\n // Return the list of fields we are able to update.\n // @return {array} of querybuilder field definitions:\n //\t\t\t\t\t[\n // \t\t\t\t\t\t{ id:\"fname\", value:\"First Name\", type:\"string\" },\n //\t\t\t\t\t { id:\"lname\", value:\"Last Name\", type:\"string\" },\n //\t\t\t\t\t { id:\"age\", value:\"Age\", type:\"number\" },\n //\t\t\t\t\t { id:\"bdate\", value:\"Birth Date\", type:\"date\" }\n //\t\t\t\t\t]\n conditionFields() {\n var fieldTypes = [\n \"string\",\n \"LongText\",\n \"number\",\n \"date\",\n \"email\",\n \"formula\",\n \"calculate\",\n ];\n\n var currFields = [];\n\n if (this.currentObject) {\n this.currentObject.fields().forEach((f) => {\n if (fieldTypes.indexOf(f.key) != -1) {\n // NOTE: the .id value must match the obj[.id] in the data set\n // so if your object data looks like:\n // \t{\n //\t\tname_first:'Neo',\n //\t\tname_last: 'The One'\n // },\n // then the ids should be:\n // { id:'name_first', value:'xxx', type:'string' }\n\n let type = f.key;\n if (f.key == \"formula\" || f.key == \"calculate\") type = \"number\";\n else if (f.key == \"LongText\") type = \"string\";\n\n currFields.push({\n id: f.columnName,\n value: f.label,\n type: type,\n });\n }\n });\n }\n\n return currFields;\n }\n\n // process\n // Take the provided data and process each of our rules.\n // @param {obj} options\n // @return {promise}\n process(options) {\n return new Promise((resolve, reject) => {\n var numDone = 0;\n var onDone = () => {\n numDone++;\n if (numDone >= this.listRules.length) {\n resolve();\n }\n };\n\n this.listRules.forEach((rule) => {\n rule\n .process(options)\n .then(function () {\n onDone();\n })\n .catch((err) => {\n reject(err);\n });\n });\n\n if (this.listRules.length == 0) {\n resolve();\n }\n });\n }\n\n showQueryBuilderContainer() {\n $$(this.ids.queryBuilderLayout).show();\n $$(this.ids.queryBuilderContainer).show();\n $$(this.ids.showQBButton).hide();\n }\n\n // // fromSettings\n // // Create an initial set of default values based upon our settings object.\n // // @param {obj} settings The settings object we created in .toSettings()\n // fromSettings (settings) {\n // \t// settings: [\n // \t// { rule.settings },\n // \t// { rule.settings }\n // \t// ]\n\n // \t// clear any existing Rules:\n // \tthis.listRules.forEach((rule)=>{\n // \t\t$$(this.ids.rules).removeView(rule.ids.component);\n // \t})\n // \tthis.listRules = [];\n\n // \tif (settings) {\n // \t\tsettings.forEach((ruleSettings)=>{\n // \t\t\tthis.addRule(ruleSettings);\n // \t\t})\n // \t}\n // }\n\n // // toSettings\n // // create a settings object to be persisted with the application.\n // // @return {array} of rule settings.\n // toSettings () {\n // \tvar settings = [];\n // \tthis.listRules.forEach((r)=>{\n // \t\tsettings.push(r.toSettings());\n // \t})\n // \treturn settings;\n // }\n};\n","//\n// ABViewRule\n//\n// A component that manages an individual Rule in a Rule list.\n//\n// Each rule can manage a set of given Actions. For each Rule, one Action\n// can be chosen, A condition for when that action is executed, and then\n// inputs for any additional data required by that action.\n//\n// Rules are used in the Interface Builder to present the designer an interface\n// for defining the Action+Condition:\n//\n//\n//\n// In live apps, Rules are used when processing events and determining if an\n// action is to be performed:\n//\n//\n//\n// A Rule needs to save it's current state to an objects settings, and to\n// initialize itself from those settings.\n//\nconst ObjectQueryBuilder = require(\"./ABViewQueryBuilderObjectFieldConditions\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRule {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(listActions) {\n this.listActions = listActions || []; // the list of Actions this Rule manages\n\n this.actionDropList = []; // the Webix UI droplist\n this.listActions.forEach((a) => {\n this.actionDropList.push({ id: a.key, value: a.label });\n });\n\n this.selectedAction = null; // the currently selected Action.key\n if (this.actionDropList.length > 0) {\n this.selectedAction = this.actionDropList[0].id;\n }\n\n this.removable = true; // can I delete this rule?\n\n this.currentObject = null; // What ABObject is this associated with\n // NOTE: this is important for Actions.\n\n this.objectQB = null; // The QueryBuilder (QB) object\n\n this.currentForm = null;\n }\n\n component(App, idBase) {\n this.App = App;\n this.idBase = idBase;\n\n // this is different because multiple instances of this View can be displayed\n // at the same time. So make each instance Unique:\n var uniqueInstanceID = webix.uid();\n var myUnique = (key) => {\n // return this.unique(idBase + key ) + '_' + uniqueInstanceID;\n return `${idBase}_${key}_${uniqueInstanceID}`;\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = (this.ids = {\n // each instance must be unique\n component: myUnique(\"component\"),\n\n selectAction: myUnique(\"chooseAction\"),\n\n queryBuilder: myUnique(\"queryBuilder\"),\n\n valueDisplay: myUnique(\"valueArea\"),\n });\n\n this.objectQB.label = L(\"When\");\n this.objectQB.component(this.App, this.idBase);\n this.ui = this._generateUI();\n\n // for setting up UI\n this.init = (options) => {\n // register callbacks:\n for (var c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n\n this.objectQB.init();\n\n // make sure the current Action's value display is initialized:\n var Action = this.currentAction();\n if (Action) {\n Action.component(this.App, this.idBase);\n var comp = Action.valueDisplay(ids.valueDisplay);\n\n _logic.replaceValueDisplay(comp);\n\n // webix.ui(comp.ui, $$(this.ids.valueDisplay));\n comp.init();\n }\n };\n\n // internal business logic\n var _logic = (this._logic = {\n callbacks: {\n onDelete: function () {\n console.warn(\"NO onDelete()!\");\n },\n onSave: function (field) {\n console.warn(\"NO onSave()!\");\n },\n },\n\n replaceValueDisplay: (component) => {\n // remove current content area:\n var $ValueDisplay = $$(this.ids.valueDisplay);\n if (!$ValueDisplay) return;\n\n var children = $ValueDisplay.getChildViews();\n var cloneChildren = [];\n children.forEach((c) => {\n cloneChildren.push(c);\n });\n cloneChildren.forEach((c) => {\n $ValueDisplay.removeView(c);\n });\n\n $ValueDisplay.addView(component.ui);\n },\n\n selectAction: (newValue, oldVal) => {\n if (newValue) {\n $$(this.ids.component)\n .getChildViews()\n .forEach((views) => {\n views.show();\n });\n }\n // bonus: save current state of previous Action\n var prevAction = this.getAction(oldVal);\n if (prevAction) {\n prevAction.stashCondition(this.objectQB.getValue());\n }\n\n // now switch to the new Action\n this.selectedAction = newValue;\n var currAction = this.currentAction();\n if (currAction) {\n // reset Condition filters.\n this.objectQB.setValue(currAction.condition());\n\n // have Action display it's values form\n currAction.component(this.App, this.idBase);\n var component = currAction.valueDisplay(ids.valueDisplay);\n _logic.replaceValueDisplay(component);\n component.init();\n // currAction.valueDisplay(ids.valueDisplay);\n }\n },\n });\n }\n\n // not intended to be called externally\n _generateUI() {\n return {\n id: this.ids.component,\n view: \"layout\",\n css: \"ab-component-form-rules\",\n padding: 20,\n // margin: 10,\n\n // this should be a CSS setting: this.AB.Config.xxxx\n // width: 680,\n type: \"line\",\n rows: [\n {\n view: \"template\",\n css: \"ab-component-form-rules-delete\",\n template: '',\n height: 30,\n borderless: true,\n hidddatasourceen: this.removable == false,\n onClick: {\n \"ab-component-remove\": (e, id, trg) => {\n this._logic.callbacks.onDelete(this);\n },\n },\n },\n // Action\n {\n id: this.ids.selectAction,\n view: \"richselect\",\n label: L(\"Action\"),\n placeholder: L(\"Choose an action\"),\n labelWidth: this.AB.UISettings.config().labelWidthLarge,\n options: this.actionDropList,\n on: {\n onChange: (newVal, oldVal) => {\n this._logic.selectAction(newVal, oldVal);\n },\n },\n },\n\n // Values\n {\n for: \"values\",\n hidden: true,\n cells: [\n {\n view: \"layout\",\n cols: [\n {\n view: \"label\",\n label: L(\"Values\"),\n css: \"ab-text-bold\",\n width: this.AB.UISettings.config().labelWidthLarge,\n },\n {\n id: this.ids.valueDisplay,\n view: \"layout\",\n rows: [\n {\n label: L(\n \" ABViewRule: This should be the Set Area\"\n ),\n css: \"ab-text-bold\",\n height: 30,\n },\n ],\n },\n ],\n },\n ],\n },\n\n // When\n this.objectQB.ui,\n ],\n };\n }\n\n // return the QueryBuilder fields data for the currently selected Action.\n conditionFields() {\n var fields = [];\n\n var selectedAction = this.currentAction();\n if (selectedAction) {\n fields = selectedAction.conditionFields();\n }\n\n return fields;\n }\n\n currentAction() {\n return this.getAction(this.selectedAction);\n }\n\n getAction(key) {\n return this.listActions.filter((a) => {\n return a.key == key;\n })[0];\n }\n\n objectLoad(object) {\n this.currentObject = object;\n this.listActions.forEach((a) => {\n a.objectLoad(object);\n });\n\n var label = L(\"When\");\n\n this.objectQB = new ObjectQueryBuilder(label);\n this.objectQB.objectLoad(object);\n\n // regenerate our UI when a new object is loaded.\n if (this.ids) {\n this.ui = this._generateUI();\n }\n }\n\n formLoad(form) {\n this.currentForm = form;\n this.listActions.forEach((a) => {\n a.formLoad(form);\n });\n }\n\n processPre(options = {}) {\n let isValid = this.isValid(options.data);\n if (!isValid) return;\n\n let currentAction = this.currentAction();\n if (!currentAction) return;\n\n currentAction.processUpdateObject({}, options.data);\n }\n\n // process\n // Take the provided data and process this rule\n // @param {obj} options\n // @return {Promise}\n process(options) {\n var currentAction = this.currentAction();\n if (!currentAction) return Promise.resolve();\n\n let isValid = this.isValid(options.data);\n if (isValid) {\n return currentAction.process(options);\n } else {\n // else just resolve and continue on\n return new Promise((resolve, reject) => {\n resolve();\n });\n }\n }\n\n fromSettings(settings) {\n settings = settings || {};\n\n if (settings.selectedAction) {\n // store our Query Rules\n this.selectedAction = settings.selectedAction;\n var selectedAction = this.currentAction();\n if (!selectedAction) return;\n selectedAction.stashCondition(settings.queryRules || {});\n\n // if our UI components are present, populate them properly:\n if (this.ids) {\n // Trigger our UI to refresh with this selected Action:\n // NOTE: this also populates the QueryBuilder\n $$(this.ids.selectAction).setValue(this.selectedAction);\n // this._logic.selectAction(this.selectedAction);\n }\n\n // now continue with setting up our settings:\n selectedAction.fromSettings(settings.actionSettings);\n }\n }\n\n toSettings() {\n var settings = {};\n\n if (this.selectedAction) {\n settings.selectedAction = this.selectedAction;\n settings.queryRules = this.objectQB.getValue();\n let currentAction = this.currentAction();\n if (currentAction) {\n settings.actionSettings = currentAction.toSettings();\n }\n }\n\n return settings;\n }\n\n // NOTE: Querybuilder v5.2 has a bug where it won't display the [and/or]\n // choosers properly if it hasn't been shown before the .setValue() call.\n // so this work around allows us to refresh the display after the .show()\n // on the popup.\n // When they've fixed the bug, we'll remove this workaround:\n qbFixAfterShow() {\n var currAction = this.currentAction();\n if (currAction && this.objectQB) {\n this.objectQB.setValue(currAction.condition());\n currAction.qbFixAfterShow();\n }\n }\n\n /**\n * @method isReady()\n * returns a promise that gets resolved once our action is ready to work.\n * @return {Promise}\n */\n async isReady() {\n let currentAction = this.currentAction();\n if (currentAction) {\n return currentAction.isReady();\n }\n return Promise.resolve();\n }\n\n isValid(data = {}) {\n const fields = this.currentObject.fields(),\n currentAction = this.currentAction(),\n QBCondition = currentAction.condition(),\n query = QBCondition[0] ?? {};\n\n const convertToNumber = (text = \"\") => {\n // if we have multiple rules we need to check if value is already a number before converting.\n if (typeof text == \"number\") return text;\n\n return parseFloat(text.replace(/[^-0-9.]/g, \"\"));\n };\n\n // Fix string data in number type\n // NOTE: \"1000\" > \"99\" = false >_\n f.key == \"number\" || f.key == \"calculate\" || f.key == \"formula\"\n )\n .forEach((f) => {\n try {\n // filter conditions\n if (Array.isArray(query?.rules)) {\n query.rules.forEach((r) => {\n // NOTE: compatible with old settings\n if (r.key == f.id || r.key == f.columnName)\n r.value = convertToNumber(r.value);\n });\n }\n\n // row data\n if (\n data[f.columnName] &&\n typeof data[f.columnName] === \"string\"\n ) {\n data[f.columnName] = convertToNumber(data[f.columnName]);\n }\n } catch (e) {\n // continue regardless of error\n }\n });\n\n const hiddenFilter = (this.AB ?? AB).filterComplexNew(\n `${this.idBase}_filter_complex`\n );\n hiddenFilter.fieldsLoad(fields, this.currentObject);\n hiddenFilter.setValue(query);\n hiddenFilter.init();\n\n return hiddenFilter.isValid(data);\n\n // var id = \"hiddenQB_\" + webix.uid();\n\n // // if our data passes the QueryRules then tell Action to process\n // var ui = {\n // id: id,\n // hidden: true,\n // view: \"querybuilder\",\n // };\n // var hiddenQB = webix.ui(ui);\n\n // let currentAction = this.currentAction();\n // var QBCondition = currentAction.condition();\n\n // if (this.objectQB) {\n // this.objectQB.cleanRules(QBCondition[0], QBCondition[1], false);\n // }\n\n // let query = QBCondition[0] || {},\n // fields = QBCondition[1] || [];\n\n // // hiddenQB.setValue(QBCondition);\n // hiddenQB.setValue({\n // query: query,\n // fields: fields,\n // });\n\n // var QBHelper = hiddenQB.getFilterHelper();\n // var isValid = QBHelper(data);\n\n // hiddenQB.destructor(); // remove the QB\n\n // return isValid;\n }\n\n get isPreProcess() {\n let currentAction = this.currentAction();\n return currentAction.isPreProcess || false;\n }\n};\n","//\n// ABViewRuleAction\n//\n// A component that manages an individual Action in a Rule.\n//\n// Each Action is responsible for figuring out when it can run, and what to do.\n//\n// Actions are used in the Interface Builder to present the designer an interface\n// for defining the a Condition and a set of data necessary to complete the Action:\n//\n//\n//\n// In live apps, Actions are used when processing events and determining if an\n// if and what is to be performed:\n//\n//\n//\n// An Action needs to save it's current state to an objects settings, and to\n// initialize itself from those settings.\n//\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleAction {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n * @param {ABViewForm} currentForm\tthe current form this Action is associated with.\n */\n constructor(App, idBase, currentForm) {\n this.key = \"ABViewRuleAction\";\n\n this.queryObject = null; // the current ABObject we use to create QueryBuilder information.\n\n this.currentForm = null;\n\n this.queryRules = {}; // default set of rules for the Query Builder condition\n\n this.valueRules = {}; // the initial Value Rules for this Action\n // The Action Subclass defines what this {} is.\n\n this.currentForm = currentForm; // the ABViewForm object that this rule Action is tied to.\n }\n\n component(App, idBase) {\n this.App = App;\n this.idBase = idBase;\n\n this.label = L(\"generic abviewruleaction\");\n\n function myUnique(key) {\n return App.unique(`${idBase}_${key}`);\n }\n\n // internal list of Webix IDs to reference our UI components.\n var ids = (this.ids = {\n // each instance must be unique\n component: `${myUnique(\"component\")}_${webix.uid()}`,\n });\n\n this._ui = null; // internally track our UI Component value Rules\n\n // for setting up UI\n this.init = (options) => {\n // register callbacks:\n for (var c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n };\n\n // internal business logic\n var _logic = (this._logic = {\n callbacks: {\n onDelete: function () {\n console.warn(\"NO onDelete()!\");\n },\n onSave: function (field) {\n console.warn(\"NO onSave()!\");\n },\n },\n });\n }\n\n // condition\n // Return the querybuilder setup structure for this Action.\n // @return {array} of querybuilder setup\n //\t\t\t\t\t[\n //\t\t\t\t\t\t{rules},\n //\t\t\t\t\t\t[fields]\n //\t\t\t\t\t]\n condition() {\n return [this.conditionRules(), this.conditionFields()];\n }\n\n // stashCondition\n // capture the current set of rules provided by the QB object.\n // This doesn't guarantee these will be saved to the App settings.\n // Instead it is a temporary stash. Only the selected Action's\n // values will be persisited to the App settings.\n // @param {obj/Array} rules The QueryBuilder rule value returned from\n //\t\t\t\t\t\t\t .getValue()\n //\t\t\t\t\t\t\t note: it is the first entry .getValue()[0]\n //\n stashCondition(rules) {\n // check to see if they sent us the raw QueryBuilder values and only\n // pull off the rules if they did\n if (Array.isArray(rules)) {\n rules = rules[0];\n }\n\n // sanity check on glue value: don't update if null or not given.\n if (rules) {\n // sometimes .glue is undefined so default to 'and'\n if (rules.glue != \"or\") rules.glue = \"and\";\n\n this.queryRules = rules;\n }\n }\n\n // conditionFields()\n // Return the list of fields we are able to update.\n // @return {array} of querybuilder field definitions:\n //\t\t\t\t\t[\n // \t\t\t\t\t\t{ id:\"fname\", value:\"First Name\", type:\"string\" },\n //\t\t\t\t\t { id:\"lname\", value:\"Last Name\", type:\"string\" },\n //\t\t\t\t\t { id:\"age\", value:\"Age\", type:\"number\" },\n //\t\t\t\t\t { id:\"bdate\", value:\"Birth Date\", type:\"date\" }\n //\t\t\t\t\t]\n conditionFields() {\n var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n var currFields = [];\n\n if (this.queryObject) {\n this.queryObject.fields().forEach((f) => {\n if (fieldTypes.indexOf(f.key) != -1) {\n // NOTE: the .id value must match the obj[.id] in the data set\n // so if your object data looks like:\n // \t{\n //\t\tname_first:'Neo',\n //\t\tname_last: 'The One'\n // },\n // then the ids should be:\n // { id:'name_first', value:'xxx', type:'string' }\n currFields.push({\n id: f.columnName,\n value: f.label,\n type: f.key,\n });\n }\n });\n }\n\n return currFields;\n }\n\n // conditionRules()\n // Return the current rule definition object for this Action.\n // @return {obj}\n conditionRules() {\n return this.queryRules;\n }\n\n // objectLoad\n // save the current object this Action is associated with.\n objectLoad(object) {\n // this.currentObject = object;\t\t\t\t// DO WE NEED THIS?\n this.queryObjectLoad(object);\n }\n\n // queryObjectLoad\n // save the current object this Action is using to build query rules.\n queryObjectLoad(object) {\n this.queryObject = object;\n }\n\n formLoad(form) {\n this.currentForm = form;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n // @return {Promise}\n process(options) {\n console.error(\n \"!!! ABViewRuleAction.process() should be overridden by its child class.\"\n );\n return new Promise((resolve, reject) => {\n reject(\n new Error(\n \"ABViewRuleAction.process() should be overridden by its child class.\"\n )\n );\n });\n }\n\n // valueDisplay\n // create the form to collect the specific data this Action needs to function.\n // @param {string} webixID the $$(webixID) of the area to insert our display.\n valueDisplay(webixID) {\n return this.valueDisplayComponent(webixID);\n }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n return (this._ui = {\n ui: {\n template: \"ABViewRuleAction.valueDisplayComponent\",\n },\n init: (data) => {\n console.error(\n \"!!! ABViewRuleAction.valueDisplayComponent() should be overridden.\"\n );\n console.warn(\" --> passed in data:\", data);\n },\n });\n }\n\n // fromSettings\n // initialize this Action from a given set of setting values.\n // @param {obj} settings\n fromSettings(settings) {\n // settings: {\n //\tvalueRules:{}\n // }\n settings = settings ?? {};\n this.valueRules = settings.valueRules ?? settings;\n }\n\n // toSettings\n // return an object that represents the current state of this Action\n // @return {obj}\n toSettings() {\n var settings = {};\n\n // require the child to insert the valueRules\n return settings;\n }\n\n /**\n * @method isReady()\n * returns a promise that gets resolved once our action is ready to work.\n * @return {Promise}\n */\n isReady() {\n return Promise.resolve();\n }\n\n // NOTE: Querybuilder v5.2 has a bug where it won't display the [and/or]\n // choosers properly if it hasn't been shown before the .setValue() call.\n // so this work around allows us to refresh the display after the .show()\n // on the popup.\n // When they've fixed the bug, we'll remove this workaround:\n qbFixAfterShow() {\n // our child classes can implement this if needed.\n // \t- ABViewRuleActionFormRecordRuleUpdateConnected\n }\n};\n","//\n// ABViewRuleList\n//\n// A UI component that is responsible for displaying a list of current \"Rules\"\n// for a given purpose. Some examples are the\n//\t\tForm -> Submit Rules,\n//\t\tForm -> Display Rules\n// \t\tForm -> Record Rules.\n//\n\n// ABViewRuleList is the parent object that manages displaying the common popup,\n// list, adding a rule, removing rules, etc...\n//\n// It is intending to be subclassed by a Specific List object that will load\n// up a given set of Actions for their list.\n//\n// When using it in the AppBuilder Interface Builder, this object provides:\n// \tvar PopupRecordList = new ABViewRuleList(App, idBase);\n// PopupRecordList.fromSettings(CurrentObjectDefinition.rules); // populates List with current settings defined in CurrentObjectDefinition\n// PopupRecordList.init({ onSave:()=>{}})\t// displays the popup for IB\n// CurrentObjectDefinition.rules = PopupRecordList.toSettings(); // save the settings to store in json config\n//\n// When using on a live running App:\n// PopupRecordList = new ABViewRuleList(App, idBase);\n// PopupRecordList.fromSettings();\n//\n// onFormSubmit(data) {\n//\t\t// note: this automatically validates and runs each rule:\n//\t\tPopupRecordList.process({data:data, view:{ current ABViewForm object }})\n//\t\t.then()\n//\t\t.catch();\n// }\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleList {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(childSettings) {\n this.listRules = [];\n this.currentObject = null;\n\n // ensure required values:\n childSettings = childSettings || {};\n childSettings.labels = childSettings.labels || {};\n childSettings.labels.header =\n childSettings.labels.header || \"ab.components.form.ruleList\";\n childSettings.labels.headerDefault =\n childSettings.labels.headerDefault || \"*Rule List\";\n this.childSettings = childSettings;\n }\n\n /**\n * @method component\n * initialize the UI display for this popup editor.\n * @param {obj} App The common UI App object shared among our UI components\n * @param {string} idBase A unique Key used the the base of our unique ids\n */\n component(App, idBase) {\n this.App = this.App || App;\n this.idBase = idBase;\n\n App = App || this.App;\n\n this.currentForm = null;\n\n // internal list of Webix IDs to reference our UI components.\n var ids = (this.ids = {\n component: `${idBase}_component`,\n rules: `${idBase}_rules`,\n rulesScrollview: `${idBase}_rulesScrollview`,\n\n action: `${idBase}_action`,\n when: `${idBase}_when`,\n\n values: `${idBase}_values`,\n set: `${idBase}_set`,\n });\n\n // webix UI definition:\n this.ui = {\n view: \"window\",\n id: ids.component,\n modal: true,\n position: \"center\",\n resize: true,\n width: 700,\n height: 450,\n css: \"ab-main-container\",\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n view: \"label\",\n label: this.childSettings.labels.headerDefault,\n },\n {\n view: \"button\",\n css: \"webix_primary\",\n icon: \"fa fa-plus\",\n type: \"iconButton\",\n label: L(\"Add new rule\"),\n width: 150,\n click: () => {\n this.addRule();\n console.log($$(ids.rules).$height);\n $$(ids.rulesScrollview).scrollTo(0, $$(ids.rules).$height);\n },\n },\n ],\n },\n body: {\n type: \"form\",\n rows: [\n {\n view: \"scrollview\",\n id: ids.rulesScrollview,\n scroll: \"xy\",\n body: {\n view: \"layout\",\n id: ids.rules,\n margin: 20,\n padding: 10,\n rows: [],\n },\n },\n // {\n // \tcss: { 'background-color': '#fff' },\n // \tcols: [\n // \t\t{\n // \t\t\tview: \"button\",\n // \t\t\ticon: \"plus\",\n // \t\t\ttype: \"iconButton\",\n // \t\t\tlabel: labels.component.addNewRule,\n // \t\t\twidth: 150,\n // \t\t\tclick: () => {\n // \t\t\t\tthis.addRule();\n // \t\t\t}\n // \t\t},\n // \t\t{ fillspace: true }\n // \t]\n // },\n {\n css: { \"background-color\": \"#fff\" },\n cols: [\n { fillspace: true },\n {\n view: \"button\",\n name: \"cancel\",\n value: L(\"Cancel\"),\n css: \"ab-cancel-button\",\n autowidth: true,\n click: function () {\n _logic.buttonCancel();\n },\n },\n {\n view: \"button\",\n css: \"webix_primary\",\n name: \"save\",\n label: L(\"Save\"),\n type: \"form\",\n autowidth: true,\n click: function () {\n _logic.buttonSave();\n },\n },\n { fillspace: true },\n ],\n },\n ],\n },\n };\n\n // var _currentObject = null;\n var _rules = [];\n\n // for setting up UI\n this.init = (options) => {\n // register callbacks:\n for (var c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n\n webix.ui(this.ui);\n };\n\n // internal business logic\n var _logic = (this._logic = {\n buttonCancel: function () {\n $$(ids.component).hide();\n },\n\n buttonSave: () => {\n var results = this.toSettings();\n\n _logic.callbacks.onSave(results);\n _logic.hide();\n },\n\n callbacks: {\n onCancel: function () {\n console.warn(\"NO onCancel()!\");\n },\n onSave: function (field) {\n console.warn(\"NO onSave()!\");\n },\n },\n\n hide: function () {\n $$(ids.component).hide();\n },\n\n show: function () {\n $$(ids.component).show();\n },\n });\n\n this.show = _logic.show;\n this.setValue = _logic.setValue;\n }\n\n /**\n * @method addRule\n * Instantiate a new Rule in our list.\n * @param {obj} settings The settings object from the Rule we created in .toSettings()\n */\n addRule(settings) {\n var Rule = this.getRule();\n if (!Rule) return;\n\n this.listRules.push(Rule);\n\n // if we have tried to create our component:\n if (this.ids) {\n // if our actually exists, then populate it:\n var RulesUI = $$(this.ids.rules);\n if (RulesUI) {\n // make sure Rule.ui is created before calling .init()\n Rule.component(this.App, this.idBase); // prepare the UI component\n var viewId = RulesUI.addView(Rule.ui);\n\n Rule.init({\n onDelete: (deletedRule) => {\n $$(this.ids.rules).removeView(Rule.ids.component);\n\n var index = this.listRules.indexOf(deletedRule);\n if (index !== -1) {\n this.listRules.splice(index, 1);\n }\n },\n });\n }\n }\n\n if (settings) {\n Rule.fromSettings(settings);\n }\n }\n\n /**\n * @method fromSettings\n * Create an initial set of default values based upon our settings object.\n * @param {obj} settings The settings object we created in .toSettings()\n */\n fromSettings(settings) {\n // settings: [\n // { rule.settings },\n // { rule.settings }\n // ]\n\n // clear any existing Rules:\n this.listRules.forEach((rule) => {\n if (\n this.ids &&\n this.ids.rules &&\n rule &&\n rule.ids &&\n rule.ids.component\n ) {\n $$(this.ids.rules).removeView(rule.ids.component);\n }\n });\n this.listRules = [];\n\n if (settings) {\n settings.forEach((ruleSettings) => {\n this.addRule(ruleSettings);\n });\n }\n }\n\n /**\n * @method objectLoad\n * A rule is based upon a Form that was working with an Object.\n * .objectLoad() is how we specify which object we are working with.\n *\n * @param {ABObject} The object that will be used to evaluate the Rules\n */\n objectLoad(object) {\n this.currentObject = object;\n\n // tell each of our rules about our object\n this.listRules.forEach((r) => {\n r.objectLoad(object);\n });\n }\n\n processPre(options) {\n (this.listRules || [])\n .filter((rule) => rule.isPreProcess == true)\n .forEach((rule) => {\n rule.processPre(options, options.data);\n });\n }\n\n /**\n * @method process\n * Take the provided data and process each of our rules.\n * @param {obj} options\n * @return {promise}\n */\n process(options) {\n return new Promise((resolve, reject) => {\n let listRules = (this.listRules || []).filter(\n (rule) => !rule.isPreProcess\n );\n\n var numDone = 0;\n var onDone = () => {\n numDone++;\n if (numDone >= listRules.length) {\n resolve();\n }\n };\n\n listRules.forEach((rule) => {\n rule\n .process(options)\n .then(function () {\n onDone();\n })\n .catch((err) => {\n reject(err);\n });\n });\n\n if (listRules.length == 0) {\n resolve();\n }\n });\n }\n\n /**\n * @method toSettings\n * create a settings object to be persisted with the application.\n * @return {array} of rule settings.\n */\n toSettings() {\n var settings = [];\n this.listRules.forEach((r) => {\n settings.push(r.toSettings());\n });\n return settings;\n }\n\n getRule() {\n console.error(\n \"!!! ABViewRuleList.getRule() should be overridded by a child object.\"\n );\n return null;\n }\n\n formLoad(form) {\n this.currentForm = form;\n this.App = this.App || form.App;\n }\n\n /**\n * @method isReady()\n * returns a promise that gets resolved once our action is ready to work.\n * @return {Promise}\n */\n rulesReady() {\n // This base class should be overwritten by any subclass that needs\n // to prepare:\n return Promise.resolve();\n }\n\n // NOTE: Querybuilder v5.2 has a bug where it won't display the [and/or]\n // choosers properly if it hasn't been shown before the .setValue() call.\n // so this work around allows us to refresh the display after the .show()\n // on the popup.\n // When they've fixed the bug, we'll remove this workaround:\n qbFixAfterShow() {\n this.listRules.forEach((r) => {\n r.qbFixAfterShow();\n });\n }\n};\n","//\n// ABViewRuleListFormRecordRules\n//\n// A component that is responsible for displaying the specific list of Record\n// Rules for a form.\n//\nconst ABViewRuleList = require(\"./ABViewRuleList\");\nconst ABViewRule = require(\"./ABViewRule\");\n\nconst RoleUpdateExisting = require(\"./ruleActions/ABViewRuleActionFormRecordRuleUpdate\");\nconst RoleInsertConnected = require(\"./ruleActions/ABViewRuleActionFormRecordRuleInsertConnected\");\nconst RoleUpdateConnected = require(\"./ruleActions/ABViewRuleActionFormRecordRuleUpdateConnected\");\nconst RoleRemoveConnected = require(\"./ruleActions/ABViewRuleActionFormRecordRuleRemoveConnected\");\n\nmodule.exports = class ABViewRuleListFormRecordRules extends ABViewRuleList {\n /**\n * @param {object} App\n * ?what is this?\n * @param {string} idBase\n * Identifier for this component\n */\n constructor() {\n var settings = {\n labels: {\n header: \"ab.components.form.recordRules\",\n headerDefault: \"*Record Rules\",\n },\n };\n super(settings);\n }\n\n // must return the actual Rule object.\n getRule() {\n var listActions = [\n new RoleUpdateExisting(\n this.App,\n `${this.idBase}_ruleActionUpdate`,\n this.currentForm\n ),\n new RoleInsertConnected(\n this.App,\n `${this.idBase}_ruleActionInsert`,\n this.currentForm\n ),\n new RoleUpdateConnected(\n this.App,\n `${this.idBase}_ruleActionUpdateConnected`,\n this.currentForm\n ),\n new RoleRemoveConnected(\n this.App,\n `${this.idBase}_ruleActionRemoveConnected`,\n this.currentForm\n ),\n ];\n\n var Rule = new ABViewRule(listActions);\n if (this.currentObject) {\n Rule.objectLoad(this.currentObject);\n }\n return Rule;\n }\n\n /**\n * @method isReady()\n * returns a promise that gets resolved once our list of Rules is\n * ready to work.\n * @return {Promise}\n */\n async rulesReady() {\n var allReady = (this.listRules || []).map((r) => r.isReady());\n await Promise.all(allReady);\n }\n};\n","//\n// ABViewRuleListFormSubmitRules\n//\n// A component that is responsible for displaying the specific list of Submit\n// Rules for a form.\n//\nconst ABViewRuleList = require(\"./ABViewRuleList\");\nconst ABViewRule = require(\"./ABViewRule\");\n\nconst RoleConfirmMessage = require(\"./ruleActions/ABViewRuleActionFormSubmitRuleConfirmMessage\");\nconst RuleExistPage = require(\"./ruleActions/ABViewRuleActionFormSubmitRuleExistPage\");\nconst RuleParentPage = require(\"./ruleActions/ABViewRuleActionFormSubmitRuleParentPage\");\nconst RuleClosePopup = require(\"./ruleActions/ABViewRuleActionFormSubmitRuleClosePopup\");\nconst RuleWebsite = require(\"./ruleActions/ABViewRuleActionFormSubmitRuleWebsite\");\nconst RuleEmail = require(\"./ruleActions/ABViewRuleActionFormSubmitRuleEmail\");\n\nmodule.exports = class ABViewRuleListFormSubmitRules extends ABViewRuleList {\n /**\n * @param {object} App\n * ?what is this?\n * @param {string} idBase\n * Identifier for this component\n */\n constructor() {\n var settings = {\n labels: {\n header: \"ab.component.form.submitRule\",\n headerDefault: \"*Submit Rules\",\n },\n };\n super(settings);\n }\n\n // must return the actual Rule object.\n getRule() {\n var listActions = [\n new RoleConfirmMessage(\n this.App,\n `${this.idBase}_ruleActionConfirmMessage`\n ),\n new RuleExistPage(this.App, `${this.idBase}_ruleActionExistPage`),\n new RuleParentPage(this.App, `${this.idBase}_ruleActionParentPage`),\n new RuleClosePopup(this.App, `${this.idBase}_ruleActionClosePopup`),\n new RuleWebsite(this.App, `${this.idBase}_ruleActionWebsite`),\n new RuleEmail(this.App, `${this.idBase}_ruleActionEmail`),\n ];\n\n var Rule = new ABViewRule(listActions);\n Rule.objectLoad(this.currentObject);\n Rule.formLoad(this.currentForm);\n return Rule;\n }\n};\n","//\n// ABViewRuleActionFormRecordRuleInsertConnected\n//\n// An action that allows you to insert a connected object.\n//\n// NOTE: this is very similar to the Update Connected Rule, so we subclass that one and\n// modify it to only Insert data.\n//\n//\nconst UpdateConnected = require(\"./ABViewRuleActionFormRecordRuleUpdateConnected\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormRecordRuleInsertConnected extends (\n UpdateConnected\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase, currentForm) {\n super(App, idBase, currentForm);\n\n this.key = \"ABViewRuleActionFormRecordRuleInsertConnected\";\n this.label = L(\"Insert Connected Object\");\n }\n\n /**\n * valueDisplayChooser\n * Our Values Display is a Select Box with a choice of connected fields.\n * Once a field is chosen, then we display the Updater form.\n * @param {string} idBase a unique webix id to base our sub components on.\n */\n valueDisplayChooser(idBase) {\n var Component = super.valueDisplayChooser(idBase);\n\n // in our case, there are no additional QB conditions:\n // so overwrite the .showQBIfNeeded() routine to not show anything:\n Component._logic.showQBIfNeeded = function () {};\n\n return Component;\n }\n\n /**\n * queryBuilderDisplay\n * override our parent .queryBuilderDisplay to not create a new .objectQB\n * @return {null}\n */\n queryBuilderDisplay() {\n return null;\n }\n\n /**\n * process\n * gets called when a form is submitted and the data passes the Query Builder Rules.\n * @param {obj} options\n *\t\t\t\toptions.data : {obj} the key=>value of the data just entered by the form\n *\t\t\t\toptions.form : {ABViewForm} the Form object that is processing this rule\n * @return {Promise}\n */\n process(options) {\n // get connected object\n var connObj = this.connectedObject();\n var model = connObj.model();\n\n var connectionField = this.selectedField();\n\n // var condition = null; // our lookup condition\n\n // we are going to create a new instance of the connected object\n // and make sure our .id is in the connected object's connectionField\n // the server side will take care of making the proper relationship.\n\n // first, create a new set of values:\n var newObjectValues = {};\n\n // update them according to our rules\n this.processUpdateObject({}, newObjectValues);\n\n if (newObjectValues.newRecords) {\n // now add our .id to the proper field in newObjectValues\n let connectedObjectField = connObj.fieldByID(\n connectionField.settings.linkColumn\n );\n\n if (!connectedObjectField)\n return Promise.reject(\"No connected object field\");\n\n newObjectValues.newRecords.forEach((r) => {\n r[connectedObjectField.columnName] = options.data.id;\n // perform the update/insert\n return model.create(r);\n });\n } else {\n // now add our .id to the proper field in newObjectValues\n let connectedObjectField = connObj.fieldByID(\n connectionField.settings.linkColumn\n );\n\n if (!connectedObjectField)\n return Promise.reject(\"No connected object field\");\n\n newObjectValues[connectedObjectField.columnName] = options.data.id;\n\n // perform the update/insert\n return model.create(newObjectValues);\n }\n }\n\n /**\n * toSettings\n * return an object that represents the current state of this Action\n * @return {obj}\n */\n toSettings() {\n // settings: {\n // \tselectedFieldID: 'guid',\n //\tvalueRules:{}\t\t// from ABViewRuleActionObjectUpdater\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n // we don't use .qpCondition\n delete settings.qbCondition;\n\n return settings;\n }\n};\n","//\n// ABViewRuleActionFormRecordRuleRemoveConnected\n//\n// An action that allows you to update fields on an object that is connected to\n// the current object we just Added/Updated\n//\n//\nconst ABViewRuleActionFormRecordRuleUpdateConnected = require(\"./ABViewRuleActionFormRecordRuleUpdateConnected\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormRecordRuleRemoveConnected extends (\n ABViewRuleActionFormRecordRuleUpdateConnected\n) {\n constructor(App, idBase, currentForm) {\n super(App, idBase, currentForm);\n\n this.key = \"ABViewRuleActionFormRecordRuleRemoveConnected\";\n this.label = L(\"Remove Connected Record\");\n\n this.isUpdateValueDisabled = true; // disable update data of each fields\n }\n\n /**\n * process\n * gets called when a form is submitted and the data passes the Query Builder Rules.\n * @param {obj} options\n *\t\t\t\toptions.data : {obj} the key=>value of the data just entered by the form\n *\t\t\t\toptions.form : {ABViewForm} the Form object that is processing this rule\n * @return {Promise}\n */\n process(options) {\n let selectedField = this.selectedField();\n this._formData = options.data;\n\n return new Promise((resolve, reject) => {\n // get the model from the provided Form Obj:\n let dc = options.form.datacollection;\n if (!dc) return resolve();\n\n let model = dc.model;\n if (!model) return resolve();\n\n let updatedVals = {};\n updatedVals[selectedField.columnName] = \"\";\n\n model\n .update(options.data.id, updatedVals)\n .then(resolve)\n .catch((err) => {\n this.AB.notify.developer(err, {\n message:\n \"!!! ABViewRuleActionFormRecordRuleUpdate.process(): update error:\",\n data: options.data,\n });\n reject(err);\n });\n });\n }\n};\n","//\n// ABViewRuleActionFormRecordRuleUpdate\n//\n// An action that allows you to update fields on an object that was currently\n// Added/Updated.\n//\n//\nconst ABViewRuleActionObjectUpdater = require(\"./ABViewRuleActionObjectUpdater\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormRecordRuleUpdate extends (\n ABViewRuleActionObjectUpdater\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase, currentForm) {\n super(App, idBase, currentForm);\n\n this.key = \"ABViewRuleActionFormRecordRuleUpdate\";\n this.label = L(\"Update Record\");\n }\n\n get isPreProcess() {\n return true;\n }\n};\n","//\n// ABViewRuleActionFormRecordRuleUpdateConnected\n//\n// An action that allows you to update fields on an object that is connected to\n// the current object we just Added/Updated\n//\n//\nconst ABViewRuleActionObjectUpdater = require(\"./ABViewRuleActionObjectUpdater\");\nconst ABFieldConnect = require(\"../../platform/dataFields/ABFieldConnect\");\nconst ObjectQueryBuilder = require(\"../ABViewQueryBuilderObjectFieldConditions\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormRecordRuleUpdateConnected extends (\n ABViewRuleActionObjectUpdater\n) {\n constructor(App, idBase, currentForm) {\n super(App, idBase, currentForm);\n\n this.key = \"ABViewRuleActionFormRecordRuleUpdateConnected\";\n this.label = L(\"Update Connected Record\");\n\n this.baseObject = null; // the object the current form is working with.\n // Use this to find our connected fields.\n\n this.selectedFieldID = null; // the selected field ID in the .baseObject that is\n // used for updating. This should be one of the connection Fields.\n\n this.fieldDropList = []; // the list of fields to offer based upon the current .baseObject.\n\n this.objectQB = null; // the QueryBuilder used for offering conditions based upon our connected Object.\n this.qbCondition = null; // the QB condition entered for selecting which remote object.\n }\n\n // field\n\n /**\n * objectLoad\n * save the current object this Action is associated with.\n * in the case of the UpdateConnected Action, assigning us\n * this object only impacts the queryObject.\n *\n * The Updater form will use another object we select in\n * the form dropdown.\n *\n * @param {object} object\n *\n */\n objectLoad(object) {\n this.queryObjectLoad(object);\n this.baseObject = object;\n\n // now build our fieldDropList for the select\n var connectionFields = this.connectedFieldList();\n connectionFields.forEach((cf) => {\n this.fieldDropList.push({\n id: cf.id,\n value: cf.label,\n });\n });\n }\n\n /**\n * connectedFieldList\n * return the fields in our .baseObject that are connections to other objects.\n * @return {array} of {ABField}\n */\n connectedFieldList() {\n var connectKey = ABFieldConnect.defaults().key;\n if (this.baseObject && this.baseObject.fields) {\n return this.baseObject.fields((f) => {\n return f.key == connectKey;\n });\n } else {\n return [];\n }\n }\n\n /**\n * connectedObject\n * return the ABObject associated with the selected connection field.\n * @return {ABObject}\n */\n connectedObject() {\n if (this.selectedFieldID) {\n var selectedField = this.selectedField();\n if (selectedField) {\n return selectedField.datasourceLink;\n }\n }\n\n return null;\n }\n\n /**\n * selectedField\n * return the selected {ABField} object.\n * @return {ABField}\n */\n selectedField() {\n return this.connectedFieldList().filter((f) => {\n return f.id == this.selectedFieldID;\n })[0];\n }\n\n /**\n * valueDisplayComponent\n * Return an ABView to display our values form.\n * @param {string} idBase a unique webix id to base our sub components on.\n */\n valueDisplayComponent(idBase) {\n if (this._uiChooser == null) {\n this._uiChooser = this.valueDisplayChooser(idBase);\n }\n\n return this._uiChooser;\n }\n\n /**\n * valueDisplayChooser\n * Our Values Display is a Select Box with a choice of connected fields.\n * Once a field is chosen, then we display the Updater form.\n * @param {string} idBase a unique webix id to base our sub components on.\n */\n valueDisplayChooser(idBase) {\n var uniqueInstanceID = webix.uid();\n var myUnique = (key) => {\n // return idBase + '_' + key + '_' + uniqueInstanceID;\n return key + \"_\" + uniqueInstanceID;\n };\n\n var ids = {\n component: myUnique(\"updateConnectedValues\"),\n updateForm: myUnique(\"updateChooser\"),\n selectConnectedField: myUnique(\"updateSelect\"),\n updateFieldsForm: myUnique(\"updateForm\"),\n };\n\n var _ui = {\n id: ids.component,\n view: \"layout\",\n css: \"ab-component-form-rule\",\n rows: [\n {\n id: ids.selectConnectedField,\n view: \"richselect\",\n label: L(\"Select which connected object to update.\"),\n labelWidth: 300,\n value: this.selectedField,\n options: this.fieldDropList,\n on: {\n onChange: (newVal, oldVal) => {\n _logic.selectAction(newVal, oldVal);\n },\n },\n },\n ],\n };\n\n var init = (valueRules) => {\n valueRules = valueRules || this.valueRules;\n\n // make sure our currently selected field is selected.\n if (this.selectedFieldID) {\n var select = $$(ids.selectConnectedField);\n if (select) {\n select.setValue(this.selectedFieldID);\n }\n }\n };\n\n var _logic = (this._logic = {\n addDisplay: (view) => {\n $$(ids.component).addView(view);\n },\n\n // removePreviousDisplays\n // remove the previous components that reflected the conditions and\n // update values of the previously selected field.\n removePreviousDisplays: () => {\n var allViews = $$(ids.component).getChildViews();\n var cloneAllViews = [];\n allViews.forEach((v) => {\n cloneAllViews.push(v);\n });\n cloneAllViews.forEach((v) => {\n // don't remove the field picker\n if (v.config.id != ids.selectConnectedField) {\n $$(ids.component).removeView(v);\n }\n });\n },\n\n selectAction: (newVal, oldVal) => {\n _logic.removePreviousDisplays(); // of the Query Builder and Update form for old selection:\n\n this.selectedFieldID = newVal;\n var connectedObject = this.connectedObject();\n\n if (connectedObject) {\n // it is the remote object that we are allowed to Update fields on.\n this.updateObjectLoad(connectedObject);\n ///// NOTE: important to call super.valueDisplayComponent()\n this.updateComponent = super.valueDisplayComponent(\n ids.updateFieldsForm\n ); // parent obj\n\n _logic.showQBIfNeeded();\n\n // create a new blank update form\n _logic.addDisplay(this.updateComponent.ui);\n this.updateComponent.init();\n\n if (this.isUpdateValueDisabled) {\n let $updateForm = $$(this.updateComponent.ui.id);\n if ($updateForm) {\n $updateForm.disable();\n $updateForm.hide();\n }\n }\n } else {\n this.AB.notify.builder(new Error(\"No connectedObject found.\"), {\n fieldID: this.selectedFieldID,\n });\n }\n },\n\n showQBIfNeeded: () => {\n //// NOTE: we decided to go ahead and display the QB in ALL situations to give\n //// the user the ability to set a condition on the update even if the field\n //// is only a one to one.\n //// If we want to remove the filter in case of a \"one\" linkType, then put\n //// these conditions back in:\n\n // var field = this.selectedField();\n\n // // we don't need the QB if the destination object link type if 'one'.\n // // there will only be one to get back, so no conditions needed.\n // if (field.settings.linkType != 'one') {\n\n var qbComponent = this.queryBuilderDisplay();\n\n qbComponent.component(this.App, this.idBase);\n _logic.addDisplay(qbComponent.ui);\n qbComponent.init({});\n\n // }\n },\n\n fromSettings: (settings) => {\n // // first time through, be sure to set the connectedObject first\n // this.selectedFieldID = settings.selectedFieldID;\n // var connectedObject = this.connectedObject();\n\n // this triggers the update of the display, creation of QB,\n $$(ids.selectConnectedField).setValue(settings.selectedFieldID);\n\n if (this.objectQB) {\n this.objectQB.setValue(this.qbCondition);\n }\n\n if (this.updateComponent) {\n this.updateComponent.fromSettings(settings);\n }\n },\n\n toSettings: () => {\n // valueRules = {\n //\tfieldOperations:[\n //\t\t{ fieldID:xxx, value:yyyy, type:zzz, op:aaa }\n //\t]\n // }\n var settings = { fieldOperations: [] };\n\n // for each of our formRows, decode the propery {}\n this.formRows.forEach((fr) => {\n var rowSettings = fr.toSettings();\n if (rowSettings) {\n settings.fieldOperations.push(rowSettings);\n }\n });\n\n return settings;\n },\n });\n\n return {\n ui: _ui,\n init: init,\n fromSettings: (settings) => {\n _logic.fromSettings(settings);\n },\n toSettings: () => {\n return _logic.toSettings();\n },\n _logic: _logic,\n };\n }\n\n /**\n * queryBuilderDisplay\n * returns our Query Builder object used in our display.\n * It is called by the .showQBIfNeeded() method.\n * @return {ABViewQueryBuilderObjectFieldConditions}\n */\n queryBuilderDisplay() {\n if (!this.objectQB) {\n this.objectQB = new ObjectQueryBuilder(\n L(\"How to choose which object:\")\n );\n\n var connObj = this.connectedObject();\n if (connObj) this.objectQB.objectLoad(connObj);\n }\n return this.objectQB;\n }\n\n /**\n * process\n * gets called when a form is submitted and the data passes the Query Builder Rules.\n * @param {obj} options\n *\t\t\t\toptions.data : {obj} the key=>value of the data just entered by the form\n *\t\t\t\toptions.form : {ABViewForm} the Form object that is processing this rule\n * @return {Promise}\n */\n process(options) {\n this._formData = options.data;\n\n // get connected object\n var connObj = this.connectedObject();\n var model = connObj.model();\n\n var connectionField = this.selectedField();\n\n var condition = null; // our lookup condition\n\n // modifyCondition\n // async fn() to fill out what the condition should be for limiting the remote\n // objects to values in use by the current object.\n // @param {fn} cb the callback to use when we are finished:\n //\t\t\t\t\tcb(err, )\n var modifyCondition = (cb) => {\n // So, let's get a copy of our current data, with all it's connected items\n // attached.\n var thisModel = this.baseObject.model();\n thisModel\n .findConnected(connectionField.columnName, options.data)\n .then((items) => {\n // if we didn't get any results, then simply return\n // NOTE: this will leave condition == null and cancel this update.\n if (!items || items.length == 0) {\n cb();\n return;\n }\n\n // then use these to limit the connected data of our Action:\n\n // get all the ids\n var ids = items.map((i) => {\n return i.id;\n });\n\n // resulting condition: { id in [listIDs]} AND { QB Condition }\n condition = {\n glue: \"and\",\n rules: [\n {\n key: `${connObj.tableName}.${connObj.PK()}`,\n rule: \"in\",\n value: ids,\n },\n ],\n };\n\n // check to make sure qbCondition actually has a condition before adding it\n // to our condition:\n if (Object.keys(this.qbCondition).length > 0) {\n condition.rules.push(this.qbCondition);\n }\n\n cb();\n })\n .catch(cb);\n };\n\n // .process() returns a Promise\n return new Promise((resolve, reject) => {\n // upateIt()\n // updates a given item with our changes.\n // @param {obj} item the item to update\n // @param {fn} cb a callback function when update is complete.\n var updateIt = (item, cb) => {\n let isUpdated = this.processUpdateObject({}, item);\n if (!isUpdated) {\n cb();\n } else {\n model\n .update(item.id, item)\n .then(() => {\n cb();\n })\n .catch((err) => {\n this.AB.notify.developer(err, {\n message:\n \"!!! ABViewRuleActionFormRecordRuleUpdateConnected.process(): update error:\",\n data: options.data,\n });\n cb(err);\n });\n }\n };\n\n // now figure out which elements belong to this object\n // done in modifyCondition()\n modifyCondition((err) => {\n if (err) {\n AB.notify.developer(err, {\n message:\n \"!!! ABViewRuleActionFormRecordRuleUpdateConnected.modifyCondition: error:\",\n data: options.data,\n });\n reject(err);\n return;\n }\n\n if (condition === null) {\n // this is the case where we didn't have the proper data to complete our\n // update. So let's just fail gracefully, and continue on.\n\n // QUESTION: is this the right way to handle it?\n resolve();\n } else {\n // get all the entries that match our condition:\n model\n .findAll({ where: condition })\n .then((list) => {\n var done = 0;\n\n // list : {data: Array(4), total_count: 4, pos: null, offset: null, limit: null}\n if (list && list.data) {\n list = list.data;\n }\n\n // for each entry, update it with our values:\n list.forEach((item) => {\n updateIt(item, (err) => {\n if (err) {\n return reject(err);\n }\n done++;\n if (done >= list.length) {\n // now they are all updated, so continue.\n resolve();\n }\n });\n });\n\n // if there were no entries to update -> continue\n if (list.length == 0) {\n resolve();\n }\n })\n .catch(reject);\n }\n }); // end modifyCondition()\n }); // end Promise()\n }\n\n /**\n * fromSettings\n * initialize this Action = require(a given set of setting values.\n * @param {obj} settings the settings {} returned = require(toSettings()\n */\n fromSettings(settings) {\n settings = settings || {};\n\n this.selectedFieldID = settings.selectedFieldID || null;\n this.qbCondition = settings.qbCondition || {};\n\n super.fromSettings(settings);\n\n // if we have a display component, then populate it:\n if (this._uiChooser) {\n this._logic.fromSettings(settings);\n }\n }\n\n /**\n * toSettings\n * return an object that represents the current state of this Action\n * @return {obj}\n */\n toSettings() {\n // settings: {\n // \tselectedFieldID: 'guid',\n // qbCondition: [],\n //\tvalueRules:{}\t\t// = require(ABViewRuleActionObjectUpdater\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n settings.selectedFieldID = this.selectedFieldID;\n\n var qbCond = null;\n if (this.objectQB) {\n qbCond = this.objectQB.getValue();\n if (Array.isArray(qbCond)) {\n qbCond = qbCond[0];\n }\n\n // FIX: make sure qbCond root element has a 'glue'\n if (qbCond) {\n qbCond.glue = qbCond?.glue || \"and\";\n }\n }\n settings.qbCondition = qbCond;\n\n // if we have a display component, then request our details = require(it:\n if (this._uiChooser) {\n settings.valueRules = this._logic.toSettings();\n }\n\n return settings;\n }\n\n // NOTE: Querybuilder v5.2 has a bug where it won't display the [and/or]\n // choosers properly if it hasn't been shown before the .setValue() call.\n // so this work around allows us to refresh the display after the .show()\n // on the popup.\n // When they've fixed the bug, we'll remove this workaround:\n qbFixAfterShow() {\n if (this.objectQB) {\n this.objectQB.setValue(this.qbCondition);\n }\n }\n};\n","//\n// ABViewRuleActionFormSubmitRuleClosePopup\n//\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormSubmitRuleClosePopup extends (\n ABViewRuleAction\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase) {\n super();\n\n this.App = App;\n this.key = \"ABViewRuleActionFormSubmitRuleClosePopup\";\n this.label = L(\"Close the current popup\");\n\n this.currentObject = null; // the object this Action is tied to.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n }\n\n // conditionFields() {\n // var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n // var currFields = [];\n\n // if (this.currentObject) {\n // this.currentObject.fields().forEach((f) => {\n // if (fieldTypes.indexOf(f.key) != -1) {\n // // NOTE: the .id value must match the obj[.id] in the data set\n // // so if your object data looks like:\n // // \t{\n // //\t\tname_first:'Neo',\n // //\t\tname_last: 'The One'\n // // },\n // // then the ids should be:\n // // { id:'name_first', value:'xxx', type:'string' }\n // currFields.push({\n // id: f.columnName,\n // value: f.label,\n // type: f.key\n // });\n // }\n // });\n // }\n\n // return currFields;\n // }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n this._ui = {\n ui: {\n view: \"layout\",\n rows: [],\n },\n\n init: () => {},\n };\n\n return this._ui;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n process(options) {\n return new Promise((resolve, reject) => {\n let form = options.form;\n if (!form) return;\n\n let popup = form.pageParent((p) => p.settings.type == \"popup\");\n if (!popup) return;\n\n // get the dom id of page. it is dom id that is generated in ABLiveTool.js\n // let pageDomId = [\"ab_live_page\", popup.application.id, popup.id].join(\n // \"_\"\n // );\n\n // close current popup\n let $popup = $$(popup.id);\n if ($popup) $popup.hide();\n\n // this clears the UI's record of the current form.\n options.form.changePage(null);\n\n resolve();\n });\n }\n};\n","//\n// ABViewRuleActionFormSubmitRuleConfirmMessage\n//\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormSubmitRuleConfirmMessage extends (\n ABViewRuleAction\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase) {\n super();\n\n this.App = App;\n this.key = \"ABViewRuleActionFormSubmitRuleConfirmMessage\";\n this.label = L(\"Show a confirmation message\");\n\n this.currentObject = null; // the object this Action is tied to.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n }\n\n // conditionFields() {\n // var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n // var currFields = [];\n\n // if (this.currentObject) {\n // this.currentObject.fields().forEach((f) => {\n // if (fieldTypes.indexOf(f.key) != -1) {\n // // NOTE: the .id value must match the obj[.id] in the data set\n // // so if your object data looks like:\n // // \t{\n // //\t\tname_first:'Neo',\n // //\t\tname_last: 'The One'\n // // },\n // // then the ids should be:\n // // { id:'name_first', value:'xxx', type:'string' }\n // currFields.push({\n // id: f.columnName,\n // value: f.label,\n // type: f.key\n // });\n // }\n // });\n // }\n\n // return currFields;\n // }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n var ids = {\n message: `${idBase}_message`,\n };\n\n this._ui = {\n ui: {\n id: ids.message,\n view: \"textarea\",\n // label: this.labels.component.message,\n // labelWidth: this.AB.UISettings.config().labelWidthLarge,\n height: 130,\n },\n\n init: () => {},\n\n _logic: _logic,\n\n fromSettings: (valueRules) => {\n _logic.fromSettings(valueRules);\n },\n toSettings: () => {\n return _logic.toSettings();\n },\n };\n\n var _logic = {\n fromSettings: (valueRules) => {\n valueRules = valueRules || {};\n\n $$(ids.message).setValue(valueRules.message || \"\");\n },\n\n toSettings: () => {\n // return the confirm message\n return {\n message: $$(ids.message).getValue() || \"\",\n };\n },\n };\n\n return this._ui;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n process(options) {\n return new Promise((resolve, reject) => {\n var confirmMessage = this.valueRules.message || \"\";\n\n webix.message({\n text: confirmMessage,\n type: \"info\",\n });\n\n resolve();\n });\n }\n\n // fromSettings\n // initialize this Action from a given set of setting values.\n // @param {obj} settings\n fromSettings(settings) {\n settings = settings || {};\n super.fromSettings(settings); // let the parent handle the QB\n\n // if we have a display component, then populate it:\n if (this._ui) {\n // now we handle our valueRules:{} object settings.\n // pass the settings off to our DisplayList component:\n this._ui.fromSettings(settings.valueRules);\n }\n }\n\n // toSettings\n // return an object that represents the current state of this Action\n // @return {obj}\n toSettings() {\n // settings: {\n //\tmessage:''\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n settings.valueRules = this._ui.toSettings();\n\n return settings;\n }\n};\n","//\n// ABViewRuleActionFormSubmitRuleWebsite\n//\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\nconst ABFieldConnect = require(\"../../platform/dataFields/ABFieldConnect\");\nconst ABFieldEmail = require(\"../../platform/dataFields/ABFieldEmail\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormSubmitRuleEmail extends (\n ABViewRuleAction\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase) {\n super();\n\n this.App = App;\n this.key = \"ABViewRuleActionFormSubmitRuleEmail\";\n this.label = L(\"Send a custom email\");\n\n this.queryObject = null; // the object this Action is tied to.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n }\n\n // conditionFields() {\n // var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n // var currFields = [];\n\n // if (this.queryObject) {\n // this.queryObject.fields().forEach((f) => {\n // if (fieldTypes.indexOf(f.key) != -1) {\n // // NOTE: the .id value must match the obj[.id] in the data set\n // // so if your object data looks like:\n // // \t{\n // //\t\tname_first:'Neo',\n // //\t\tname_last: 'The One'\n // // },\n // // then the ids should be:\n // // { id:'name_first', value:'xxx', type:'string' }\n // currFields.push({\n // id: f.columnName,\n // value: f.label,\n // type: f.key\n // });\n // }\n // });\n // }\n\n // return currFields;\n // }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n var ids = {\n form: `${idBase}_form`,\n popup: `${idBase}_popup`,\n list: `${idBase}_fieldList`,\n toEmailsContainer: `${idBase}_toEmailsContainer`,\n toEmails: `${idBase}_toEmails`,\n message: `${idBase}_message`,\n };\n\n this._ui = {\n ui: {\n id: ids.form,\n view: \"form\",\n width: 450,\n elementsConfig: {\n labelPosition: \"top\",\n labelWidth: 100,\n },\n cols: [\n // email form\n {\n width: 330,\n rows: [\n {\n view: \"text\",\n name: \"fromName\",\n label: L(\"From Name\"),\n },\n {\n view: \"text\",\n name: \"fromEmail\",\n label: L(\"From Email\"),\n validate: webix.rules.isEmail,\n on: {\n onChange: function (newVal, oldVal) {\n if (this.getValue() && !this.validate()) {\n $$(ids.form).markInvalid(\n \"fromEmail\",\n \"Email is invalid\"\n );\n } else {\n $$(ids.form).markInvalid(\"fromEmail\", false);\n }\n },\n },\n },\n {\n id: ids.toEmailsContainer,\n view: \"forminput\",\n name: \"toEmails\",\n label: L(\"Send\"),\n css: \"ab-rich-text\",\n width: 320,\n body: {\n width: 320,\n rows: [\n {\n height: 25,\n },\n {\n id: ids.toEmails,\n width: 320,\n view: \"layout\",\n rows: [],\n },\n {\n view: \"button\",\n css: \"webix_primary\",\n type: \"icon\",\n icon: \"fa fa-plus\",\n label: L(\"Add a recipient\"),\n width: 150,\n click: () => {\n _logic.toEmailAdd();\n },\n },\n ],\n },\n },\n {\n view: \"text\",\n name: \"subject\",\n label: L(\"Subject\"),\n },\n {\n view: \"textarea\",\n id: ids.message,\n name: \"message\",\n label: L(\"Message\"),\n width: 320,\n height: 400,\n },\n // {\n // \tview: 'label',\n // \tlabel: 'Message',\n // \tcss: { 'font-weight': 'bold' }\n // },\n // {\n // \tview: 'forminput',\n // \tid: ids.message,\n // \tname: 'message',\n // \tlabel: 'Message',\n // \tcss: \"ab-rich-text\",\n // \twidth: 320,\n // \theight: 400,\n // \tbody: {\n // \t\tview: 'tinymce-editor'\n // \t}\n // }\n ],\n },\n // field list\n {\n rows: [\n {\n view: \"template\",\n type: \"header\",\n template: \"Fields\",\n },\n {\n id: ids.list,\n view: \"list\",\n width: 120,\n css: { \"background-color\": \"#fff !important;\" },\n template: function (obj, common) {\n return _logic.fieldTemplate(obj, common);\n },\n on: {\n onItemClick: function (id, e, node) {\n var component = this.getItem(id);\n\n _logic.enterField(component);\n },\n },\n },\n ],\n },\n ],\n },\n\n init: () => {\n if (this.queryObject) {\n $$(ids.list).parse(\n this.queryObject.fields((f) => f.fieldUseAsLabel())\n );\n $$(ids.list).refresh();\n }\n\n _logic.refreshUI();\n },\n\n _logic: _logic,\n\n fromSettings: (valueRules) => {\n _logic.fromSettings(valueRules);\n },\n toSettings: () => {\n return _logic.toSettings();\n },\n };\n\n var _logic = {\n fromSettings: (valueRules) => {\n valueRules = valueRules || {};\n\n $$(ids.form).setValues(valueRules);\n\n // Populate recipients\n var recipients = valueRules.toEmails || [];\n recipients.forEach((r) => {\n _logic.toEmailAdd({\n type: r.type, // 'to', 'cc' or 'bcc'\n emailType: r.emailType, // 'email' or 'field'\n value: r.value,\n });\n });\n\n _logic.refreshUI();\n },\n\n toSettings: () => {\n var formVals = $$(ids.form).getValues() || {};\n\n // Get recipients\n var recipients = [];\n $$(ids.toEmails)\n .getChildViews()\n .forEach((e) => {\n // var type = e.queryView({ name: 'type' }).getValue();\n var type = \"to\"; // TODO\n var emailType = e.queryView({ name: \"emailType\" }).getValue();\n var value = e.queryView({ name: emailType }).getValue();\n\n recipients.push({\n type: type,\n emailType: emailType,\n value: value,\n });\n });\n\n // return the confirm message\n return {\n fromName: formVals[\"fromName\"],\n fromEmail: formVals[\"fromEmail\"],\n toEmails: recipients,\n subject: formVals[\"subject\"],\n message: formVals[\"message\"],\n };\n },\n\n /**\n * @method toEmailTemplate\n *\n * @param settings - {\n * \t\t\ttype: string, // 'to', 'cc' or 'bcc'\n * \t\t\temailType: string, // 'email' or 'field'\n * \t\t\tvalue: string\n * }\n */\n toEmailTemplate: (settings) => {\n settings = settings || {};\n\n return {\n width: 320,\n cols: [\n // {\n // \tview: 'richselect',\n // \tname: 'type',\n // \tvalue: settings.type || 'to',\n // \twidth: 80,\n // \toptions: [\n // \t\t{ id: 'to', value: \"To:\" },\n // \t\t// EmailNotification does not support cc, bcc and reply.\n // \t\t// { id: 'cc', value: \"Cc:\" },\n // \t\t// { id: 'bcc', value: \"Bcc:\" },\n // \t\t// { id: 'reply', value: \"Reply-To:\" }\n // \t]\n // },\n {\n view: \"richselect\",\n name: \"emailType\",\n value: settings.emailType || \"email\",\n width: 150,\n options: [\n {\n id: \"email\",\n value: L(\"A custom email address\"),\n },\n { id: \"field\", value: L(\"An email field\") },\n { id: \"query\", value: L(\"From query\") },\n ],\n on: {\n onChange: function (newVal, oldVal) {\n _logic.emailTypeChange(newVal, this);\n },\n },\n },\n {\n width: 150,\n name: \"emailValue\",\n visibleBatch: settings.emailType || \"email\",\n cols: [\n {\n view: \"text\",\n name: \"email\",\n batch: \"email\",\n value:\n settings.emailType == \"email\"\n ? settings.value\n : \"\",\n validate: webix.rules.isEmail,\n width: 150,\n on: {\n onChange: function (newVal, oldVal) {\n _logic.toEmailValidate();\n },\n },\n },\n {\n view: \"richselect\",\n name: \"field\",\n batch: \"field\",\n value:\n settings.emailType == \"field\"\n ? settings.value\n : \"\",\n width: 150,\n suggest: {\n on: {\n onBeforeShow: function () {\n this.define(\"width\", 300);\n this.resize();\n },\n },\n data: _logic.emailFieldOptions(),\n },\n },\n {\n view: \"richselect\",\n name: \"query\",\n batch: \"query\",\n value:\n settings.emailType == \"query\"\n ? settings.value\n : \"\",\n width: 150,\n suggest: {\n on: {\n onBeforeShow: function () {\n this.define(\"width\", 300);\n this.resize();\n },\n },\n data: _logic.queryOptions(),\n },\n },\n ],\n },\n {\n view: \"button\",\n css: \"webix_danger\",\n type: \"icon\",\n icon: \"fa fa-trash-o\",\n width: 32,\n click: function () {\n var $toView = this.getParentView();\n\n _logic.toEmailRemove($toView);\n },\n },\n ],\n };\n },\n\n toEmailAdd: (settings) => {\n var count = $$(ids.toEmails).getChildViews().length;\n\n $$(ids.toEmails).addView(_logic.toEmailTemplate(settings), count);\n\n _logic.refreshUI();\n },\n\n emailTypeChange: (type, $select) => {\n var $recipient = $select.getParentView();\n var $emailValue = $recipient.queryView({ name: \"emailValue\" });\n\n switch (type) {\n case \"field\":\n $emailValue.showBatch(\"field\");\n break;\n case \"query\":\n $emailValue.showBatch(\"query\");\n break;\n default:\n $emailValue.showBatch(\"email\");\n break;\n }\n\n $$(ids.toEmailsContainer).adjust();\n },\n\n toEmailRemove: ($toView) => {\n $$(ids.toEmails).removeView($toView);\n\n _logic.refreshUI();\n },\n\n toEmailValidate: () => {\n var isAllValid = true;\n\n $$(ids.toEmails)\n .getChildViews()\n .forEach((v) => {\n let emailText = v.queryView({ name: \"email\" });\n if (emailText.getValue() && !emailText.validate()) {\n isAllValid = false;\n }\n });\n\n if (isAllValid) $$(ids.form).markInvalid(\"toEmails\", false);\n else $$(ids.form).markInvalid(\"toEmails\", \"Email is invalid\");\n },\n\n fieldTemplate: (field, common) => {\n return ` ${field.label}`;\n },\n\n emailFieldOptions: () => {\n var existsFieldIds = [];\n var options = [];\n\n var fnAddOptions = (currObj, fLink) => {\n var emailFields = currObj\n .fields((f) => f instanceof ABFieldEmail)\n .map((f) => {\n var optId = \"\",\n optLabel = \"\";\n\n if (fLink) {\n optId = `${fLink.id}|${f.urlPointer()}`;\n optLabel = `${currObj.label}.${f.label} (${fLink.label})`;\n } else {\n optId = `|${f.urlPointer()}`;\n optLabel = `${currObj.label}.${f.label}`;\n }\n\n return {\n id: optId, // linkFieldId|fieldUrl\n value: optLabel,\n };\n });\n\n // TODO: prevent duplicate\n\n options = options.concat(emailFields);\n };\n\n fnAddOptions(this.queryObject);\n\n this.queryObject.connectFields().forEach((f) => {\n // prevent looping\n if (\n // - prevent include connect objects of the base object\n // f.datasourceLink.id == this.queryObject.id ||\n // - check duplicate include objects\n existsFieldIds.indexOf(f.id) > -1\n )\n return;\n\n // store\n existsFieldIds.push(f.id);\n\n // add email fields of link object\n fnAddOptions(f.datasourceLink, f);\n });\n\n return options;\n },\n\n queryOptions: () => {\n var options = [];\n\n // get data collections who is query and contains email field\n let dcQueries = this.currentForm.AB.datacollections((dc) => {\n let obj = dc.datasource;\n return (\n dc.settings.isQuery &&\n obj &&\n obj.fields((f) => f.key == \"email\").length > 0\n );\n });\n\n dcQueries.forEach((dv) => {\n if (dv.datasource) {\n dv.datasource\n .fields((f) => f.key == \"email\")\n .forEach((f) => {\n options.push({\n id: `${dv.id}|${f.id}`, // ABDatacollectionID|fieldID\n value: `${dv.label}.${f.label}`,\n });\n });\n }\n });\n\n return options;\n },\n\n enterField: (field) => {\n var focusElem = webix.UIManager.getFocus();\n var val = \"\";\n\n if (\n focusElem.config.view != \"text\" ||\n focusElem.config.view != \"textarea\"\n ) {\n if (focusElem.getValue) val = focusElem.getValue();\n\n if (focusElem.setValue)\n focusElem.setValue(`${val}${field.label}`);\n\n webix.UIManager.setFocus(focusElem);\n }\n },\n\n refreshUI: () => {\n $$(ids.toEmailsContainer).adjust();\n $$(ids.message).adjust();\n },\n };\n\n return this._ui;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options - {\n //\t\t\t\t\t\t\tdata: {obj} rowData,\n //\t\t\t\t\t\t\tform: {ABViewForm}\n //\t\t\t\t\t\t}\n process(options) {\n // validate sender's email is invalid\n if (!webix.rules.isEmail(this.valueRules.fromEmail)) {\n return Promise.resolve();\n }\n\n var recipients = [];\n\n return Promise.resolve()\n .then(() => {\n // Pull recipients data\n return new Promise((resolve, reject) => {\n var tasks = [];\n\n this.valueRules.toEmails.forEach((rec) => {\n tasks.push(\n new Promise((next, err) => {\n // TODO: Cc, Bcc\n\n // field\n if (rec.emailType == \"field\") {\n var emailFieldUrl = rec.value.split(\"|\")[1]; // linkFieldId|emailFieldUrl\n var emailField =\n this.queryObject.application.urlResolve(\n emailFieldUrl\n );\n if (emailField) {\n // Pull email source object\n if (emailField.object.id == this.queryObject.id) {\n var emailData =\n options.data[emailField.columnName];\n if (emailData)\n recipients = recipients.concat(emailData);\n }\n // Pull emails from link object\n else {\n let linkFieldId = rec.value.split(\"|\")[0];\n let linkFields = this.queryObject.fields(\n (f) =>\n f instanceof ABFieldConnect &&\n f.id == linkFieldId\n );\n linkFields.forEach((f) => {\n var linkedData =\n options.data[f.relationName()] || [];\n\n // convert to an array\n if (\n linkedData &&\n !Array.isArray(linkedData)\n )\n linkedData = [linkedData];\n\n // pull email address\n linkedData.forEach((d) => {\n var email = d[emailField.columnName];\n if (email)\n recipients = recipients.concat(email);\n });\n });\n }\n\n next();\n } else {\n next();\n }\n }\n\n // query\n else if (rec.emailType == \"query\") {\n var dvIdAndFieldId = rec.value; // ABDatacollectionId|fieldId\n if (!dvIdAndFieldId) return next();\n\n var dcId = dvIdAndFieldId.split(\"|\")[0];\n var fieldId = dvIdAndFieldId.split(\"|\")[1];\n\n var dcQuery =\n this.currentForm.AB.datacollectionByID(dcId);\n if (!dcQuery) return next();\n\n var field = dcQuery.datasource.fieldByID(fieldId);\n if (!field) return next();\n\n // get data of data collection\n dcQuery.getData().forEach((data) => {\n var emailAddr = data[field.columnName];\n if (emailAddr) recipients.push(emailAddr);\n });\n\n next();\n }\n\n // email\n else {\n recipients.push(rec.value);\n next();\n }\n })\n );\n });\n\n Promise.all(tasks).catch(reject).then(resolve);\n });\n })\n .then(() => {\n // send out\n return new Promise((resolve, reject) => {\n recipients = this.AB.uniq(recipients).filter((r) => r);\n\n if (!recipients || recipients.length < 1) return resolve();\n\n // replace form value to template\n var fromName = this.valueRules.fromName,\n subject = this.valueRules.subject,\n message = this.valueRules.message;\n\n this.queryObject\n .fields((f) => f.fieldUseAsLabel())\n .forEach((f) => {\n var template = new RegExp(`{${f.label}}`, \"g\"),\n data = f.format(options.data);\n\n fromName = fromName.replace(template, data);\n subject = subject.replace(template, data);\n message = message.replace(template, data);\n });\n\n // send a email\n this.AB.Network.post({\n url: \"/app_builder/email\",\n params: {\n fromName: fromName,\n fromEmail: this.valueRules.fromEmail,\n subject: subject,\n message: message,\n recipients: this.AB.uniq(recipients),\n },\n })\n .then(() => {\n resolve();\n })\n .catch(reject);\n });\n });\n }\n\n // fromSettings\n // initialize this Action from a given set of setting values.\n // @param {obj} settings\n fromSettings(settings) {\n settings = settings || {};\n super.fromSettings(settings); // let the parent handle the QB\n\n // if we have a display component, then populate it:\n if (this._ui) {\n // now we handle our valueRules:{} object settings.\n // pass the settings off to our DisplayList component:\n this._ui.fromSettings(settings.valueRules);\n }\n }\n\n // toSettings\n // return an object that represents the current state of this Action\n // @return {obj}\n toSettings() {\n // settings: {\n //\tmessage:''\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n settings.valueRules = this._ui.toSettings();\n\n return settings;\n }\n};\n","//\n// ABViewRuleActionFormSubmitRuleExistPage\n//\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormSubmitRuleExistPage extends (\n ABViewRuleAction\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase) {\n super();\n\n this.App = App;\n this.key = \"ABViewRuleActionFormSubmitRuleExistPage\";\n this.label = L(\"Redirect to an existing page\");\n\n this.currentObject = null; // the object this Action is tied to.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n }\n\n // conditionFields() {\n // var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n // var currFields = [];\n\n // if (this.currentObject) {\n // this.currentObject.fields().forEach((f) => {\n // if (fieldTypes.indexOf(f.key) != -1) {\n // // NOTE: the .id value must match the obj[.id] in the data set\n // // so if your object data looks like:\n // // \t{\n // //\t\tname_first:'Neo',\n // //\t\tname_last: 'The One'\n // // },\n // // then the ids should be:\n // // { id:'name_first', value:'xxx', type:'string' }\n // currFields.push({\n // id: f.columnName,\n // value: f.label,\n // type: f.key\n // });\n // }\n // });\n // }\n\n // return currFields;\n // }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n var ids = {\n pagesAndTabs: `${idBase}_PagesAndTabs`,\n };\n\n this._ui = {\n ui: { id: ids.pagesAndTabs, view: \"richselect\", options: [] },\n\n init: () => {\n _logic.populateOptions();\n },\n\n _logic: _logic,\n\n fromSettings: (valueRules) => {\n _logic.fromSettings(valueRules);\n },\n toSettings: () => {\n return _logic.toSettings();\n },\n };\n\n var _logic = {\n populateOptions: () => {\n // Pull page list to \"Redirect to an existing page\"\n var _pageOptions = [];\n\n /**\n * @param pageOrTab\t{Object}\t- ABViewPage or ABViewTab\n * @param indent\t{integer}\n * @param type\t\t{string}\t- 'page' or 'tab'\n * @param pageId\t{uuid}\t\t- the id of page (only tab)\n */\n var addPage = (pageOrTab, indent, type, pageId) => {\n indent = indent || \"\";\n\n let icon = \"fa fa-file-o\";\n if (type == \"tab\") icon = \"fa fa-window-maximize\";\n\n let pageParent = pageOrTab.pageParent();\n\n _pageOptions.push({\n id: pageOrTab.id,\n value: indent + pageOrTab.label,\n type: type,\n pageId: pageParent ? pageParent.id : null,\n\n icon: icon,\n });\n\n if (type == \"page\" || type == \"tab\") {\n if (pageOrTab.pages) {\n pageOrTab.pages().forEach(function (p) {\n addPage(p, indent + \"-\", \"page\");\n });\n }\n\n // add 'tab' options\n if (pageOrTab.views) {\n pageOrTab\n .views((v) => v.key == \"tab\")\n .forEach((tab) => {\n // add 'tab view' to options\n tab.views().forEach((tabView) => {\n addPage(\n tabView,\n indent + \"-\",\n \"tab\",\n pageOrTab.id\n );\n });\n });\n }\n }\n };\n\n addPage(this.currentForm.pageRoot(), \"\", \"page\");\n\n $$(ids.pagesAndTabs).define(\"options\", _pageOptions);\n $$(ids.pagesAndTabs).refresh();\n },\n\n fromSettings: (valueRules) => {\n valueRules = valueRules || {};\n\n $$(ids.pagesAndTabs).setValue(\n valueRules.tabId || valueRules.pageId || \"\"\n );\n },\n\n toSettings: () => {\n var result = {};\n\n var selectedId = $$(ids.pagesAndTabs).getValue();\n var selectedItem = $$(ids.pagesAndTabs)\n .getPopup()\n .getList()\n .config.data.filter((opt) => opt.id == selectedId)[0];\n if (selectedItem) {\n if (selectedItem.type == \"tab\") {\n // store page id and tab id\n result = {\n pageId: selectedItem.pageId,\n tabId: selectedId,\n };\n } else {\n // store only page id\n result = {\n pageId: selectedId,\n };\n }\n }\n\n // return the confirm message\n return result;\n },\n };\n\n return this._ui;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n process(options) {\n return new Promise((resolve, reject) => {\n // redirect page\n if (this.valueRules.pageId) {\n options.form.changePage(this.valueRules.pageId);\n\n if (this.valueRules.tabId) {\n var curPage = options.form.application.pages(\n (p) => p.id == this.valueRules.pageId,\n true\n )[0];\n if (!curPage) return resolve();\n\n // switch tab\n var tabView = curPage.views(\n (v) => v.id == this.valueRules.tabId,\n true\n )[0];\n if (!tabView) return resolve();\n\n var tab = tabView.parent;\n if (!tab) return resolve();\n\n var toggleParent = (element) => {\n if (!element.parent) return false;\n var parentElem = element.parent;\n if (!parentElem.parent) return false;\n parentElem.parent.emit(\"changeTab\", parentElem.id);\n toggleParent(parentElem.parent);\n };\n\n toggleParent(tab);\n let showIt = setInterval(function () {\n if ($$(tabView.id) && $$(tabView.id).isVisible()) {\n clearInterval(showIt);\n return;\n }\n tab.emit(\"changeTab\", tabView.id);\n }, 100);\n }\n }\n\n resolve();\n });\n }\n\n // fromSettings\n // initialize this Action from a given set of setting values.\n // @param {obj} settings\n fromSettings(settings) {\n settings = settings || {};\n super.fromSettings(settings); // let the parent handle the QB\n\n // if we have a display component, then populate it:\n if (this._ui) {\n // now we handle our valueRules:{} object settings.\n // pass the settings off to our DisplayList component:\n this._ui.fromSettings(settings.valueRules);\n }\n }\n\n // toSettings\n // return an object that represents the current state of this Action\n // @return {obj}\n toSettings() {\n // settings: {\n //\tmessage:''\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n settings.valueRules = this._ui.toSettings();\n\n return settings;\n }\n};\n","//\n// ABViewRuleActionFormSubmitRuleParentPage\n//\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormSubmitRuleParentPage extends (\n ABViewRuleAction\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase) {\n super();\n\n this.App = App;\n this.key = \"ABViewRuleActionFormSubmitRuleParentPage\";\n this.label = L(\"Redirect to the parent page\");\n\n this.currentObject = null; // the object this Action is tied to.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n }\n\n // conditionFields() {\n // var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n // var currFields = [];\n\n // if (this.currentObject) {\n // this.currentObject.fields().forEach((f) => {\n // if (fieldTypes.indexOf(f.key) != -1) {\n // // NOTE: the .id value must match the obj[.id] in the data set\n // // so if your object data looks like:\n // // \t{\n // //\t\tname_first:'Neo',\n // //\t\tname_last: 'The One'\n // // },\n // // then the ids should be:\n // // { id:'name_first', value:'xxx', type:'string' }\n // currFields.push({\n // id: f.columnName,\n // value: f.label,\n // type: f.key\n // });\n // }\n // });\n // }\n\n // return currFields;\n // }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n this._ui = {\n ui: {\n view: \"label\",\n label: this.label,\n },\n\n init: () => {},\n\n _logic: _logic,\n };\n\n var _logic = {};\n\n return this._ui;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n process(options) {\n return new Promise((resolve, reject) => {\n var pageCurrent = options.form.pageParent();\n var pageParent = pageCurrent.pageParent();\n\n // redirect page\n options.form.changePage(pageParent.id);\n\n resolve();\n });\n }\n};\n","//\n// ABViewRuleActionFormSubmitRuleWebsite\n//\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nmodule.exports = class ABViewRuleActionFormSubmitRuleWebsite extends (\n ABViewRuleAction\n) {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase) {\n super();\n\n this.App = App;\n this.key = \"ABViewRuleActionFormSubmitRuleWebsite\";\n this.label = L(\"Redirect to another website URL\");\n\n this.currentObject = null; // the object this Action is tied to.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n }\n\n // conditionFields() {\n // var fieldTypes = [\"string\", \"number\", \"date\", \"formula\", \"calculate\"];\n\n // var currFields = [];\n\n // if (this.currentObject) {\n // this.currentObject.fields().forEach((f) => {\n // if (fieldTypes.indexOf(f.key) != -1) {\n // // NOTE: the .id value must match the obj[.id] in the data set\n // // so if your object data looks like:\n // // \t{\n // //\t\tname_first:'Neo',\n // //\t\tname_last: 'The One'\n // // },\n // // then the ids should be:\n // // { id:'name_first', value:'xxx', type:'string' }\n // currFields.push({\n // id: f.columnName,\n // value: f.label,\n // type: f.key\n // });\n // }\n // });\n // }\n\n // return currFields;\n // }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n var ids = {\n website: `${idBase}_website`,\n };\n\n this._ui = {\n ui: {\n id: ids.website,\n view: \"text\",\n },\n\n init: () => {},\n\n _logic: _logic,\n\n fromSettings: (valueRules) => {\n _logic.fromSettings(valueRules);\n },\n toSettings: () => {\n return _logic.toSettings();\n },\n };\n\n var _logic = {\n fromSettings: (valueRules) => {\n valueRules = valueRules || {};\n\n $$(ids.website).setValue(valueRules.website || \"\");\n },\n\n toSettings: () => {\n // return the confirm message\n return {\n website: $$(ids.website).getValue() || \"\",\n };\n },\n };\n\n return this._ui;\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n process(options) {\n return new Promise((resolve, reject) => {\n // redirect to website\n if (this.valueRules.website)\n window.open(\n `http://${this.valueRules.website.replace(\"http://\", \"\")}`,\n \"_blank\"\n );\n\n resolve();\n });\n }\n\n // fromSettings\n // initialize this Action from a given set of setting values.\n // @param {obj} settings\n fromSettings(settings) {\n settings = settings || {};\n super.fromSettings(settings); // let the parent handle the QB\n\n // if we have a display component, then populate it:\n if (this._ui) {\n // now we handle our valueRules:{} object settings.\n // pass the settings off to our DisplayList component:\n this._ui.fromSettings(settings.valueRules);\n }\n }\n\n // toSettings\n // return an object that represents the current state of this Action\n // @return {obj}\n toSettings() {\n // settings: {\n //\tmessage:''\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n settings.valueRules = this._ui.toSettings();\n\n return settings;\n }\n};\n","// ABViewRuleActionObjectUpdater\n//\n// An action that allows you to update fields on an object.\n//\n//\nconst ABViewRuleAction = require(\"../ABViewRuleAction\");\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nvar ABViewRuleActionObjectUpdaterDefaults = {\n filterConditions: {\n // array of filters to apply to the data table\n glue: \"and\",\n rules: [],\n },\n};\n\nmodule.exports = class ABViewRuleActionObjectUpdater extends ABViewRuleAction {\n /**\n * @param {object} App\n * The shared App object that is created in OP.Component\n * @param {string} idBase\n * Identifier for this component\n */\n constructor(App, idBase, currentForm) {\n super(App, idBase, currentForm);\n\n this.key = \"ABViewRuleActionFormRecordRuleUpdate\";\n this.label = L(\"Update Record\");\n\n this.updateObject = null; // the object this Action will Update.\n\n this.formRows = []; // keep track of the Value Components being set\n // [\n //\t\t{ fieldId: xxx, value:yyy, type:key['string', 'number', 'date',...]}\n // ]\n\n this.stashRules = {}; // keep track of rule settings among our selected objects.\n }\n\n // valueDisplayComponent\n // Return an ABView to display our values form.\n //\n valueDisplayComponent(idBase) {\n if (this._uiUpdater == null) {\n this._uiUpdater = this.valueDisplayList(idBase);\n }\n\n return this._uiUpdater;\n }\n\n // Our Values Display is a List of ValueRows\n // Each ValueRow will display an additional set of [add] [delete] buttons.\n\n valueDisplayList(idBase) {\n var uniqueInstanceID = webix.uid();\n var myUnique = (key) => {\n // return idBase + '_' + key + '_' + uniqueInstanceID;\n return `${idBase}_${key}_${uniqueInstanceID}`;\n };\n var ids = {\n updateForm: myUnique(\"updateForm\"),\n };\n\n var _ui = {\n view: \"form\",\n id: ids.updateForm,\n elements: [],\n };\n\n var init = (valueRules) => {\n valueRules = valueRules || this.valueRules;\n _logic.setValues(valueRules);\n };\n\n var _logic = {\n removeAddRow: () => {\n // get our Form\n var UpdateForm = _logic.formGet();\n if (!UpdateForm) return;\n\n // check row that's unselect a field\n var rows = UpdateForm.getChildViews();\n\n var addRow = rows.filter((r) => {\n return r.queryView(function (view) {\n return view.config.name == \"field\" && !view.getValue();\n });\n })[0];\n if (!addRow) return;\n\n UpdateForm.removeView(addRow);\n },\n\n // addRow\n // add a new data entry to this form.\n // @param {obj} data (optional) initial values for this row.\n addRow: (data) => {\n // get our Form\n var UpdateForm = _logic.formGet();\n if (!UpdateForm) return;\n\n // check row that's unselect a field\n var rows = UpdateForm.getChildViews();\n if (\n data == null &&\n rows.filter((r) => {\n return r.queryView(function (view) {\n return view.config.name == \"field\" && !view.getValue();\n });\n }).length > 0\n )\n return;\n\n // get a new Row Component\n var row = this.valueDisplayRow(idBase);\n\n // add row to Form\n UpdateForm.addView(row.ui);\n\n // initialize row with any provided data:\n row.init({\n onAdd: () => {\n // add a new Row\n _logic.addRow();\n },\n onDelete: (rowId) => {\n // remove a row\n _logic.delRow(rowId);\n },\n data: data,\n });\n\n // store this row\n this.formRows.push(row);\n },\n\n delRow: (rowId) => {\n // store this row\n this.formRows.forEach((r, index) => {\n if (r.ui.id == rowId) this.formRows.splice(index, 0);\n });\n\n // get our Form\n var UpdateForm = _logic.formGet();\n if (!UpdateForm) return;\n\n // remove UI\n UpdateForm.removeView($$(rowId));\n },\n\n formClear: () => {\n var UpdateForm = _logic.formGet();\n if (!UpdateForm) return;\n\n var children = UpdateForm.getChildViews();\n\n // NOTE: need to clone this array, because it is connected with the UpdatForm's\n // internal array of items. Once we start .removeView() the element actually\n // is removed from the internal array, which then upset's the .forEach() from\n // properly iterating through the structure. It results in missed items from\n // being sent to the .forEach().\n // So Clone it and use that for .forEach()\n var cloneChildren = [];\n children.forEach((c) => {\n cloneChildren.push(c);\n });\n cloneChildren.forEach((c) => {\n UpdateForm.removeView(c);\n });\n\n // clear our stored .formRows\n this.formRows = [];\n },\n\n formGet: () => {\n var UpdateForm = $$(ids.updateForm);\n if (!UpdateForm) {\n // this is a problem!\n this.currentForm.AB.notify.developer(\n new Error(\"no webix form\"),\n {\n context:\n \"ABViewRuleActionObjectUpdater:formGet could not find webix form\",\n id: ids.updateForm,\n }\n );\n return null;\n }\n\n return UpdateForm;\n },\n\n setValues: (valueRules) => {\n // valueRules = {\n //\tfieldOperations:[\n //\t\t{ fieldID:xxx, value:yyyy, type:zzz, op:aaa }\n //\t]\n // }\n\n valueRules = valueRules || {};\n valueRules.fieldOperations = valueRules.fieldOperations || [];\n\n // find the form\n var UpdateForm = _logic.formGet();\n if (!UpdateForm) return;\n\n // clear form:\n _logic.formClear();\n\n // if there are values to\n if (valueRules.fieldOperations.length > 0) {\n valueRules.fieldOperations.forEach((r) => {\n _logic.addRow(r);\n });\n }\n\n // our default operation will cause an empty row to\n // appear after our first value entry.\n // let's remove that one, and then add a new one\n // at the end:\n _logic.removeAddRow();\n\n // display an empty row\n _logic.addRow();\n },\n\n fromSettings: (settings) => {\n // Note: we just want the { valueRules:[] } here:\n var mySettings = settings.valueRules || settings;\n\n _logic.setValues(mySettings);\n },\n\n toSettings: () => {\n // valueRules = {\n //\tfieldOperations:[\n //\t\t{ fieldID:xxx, value:yyyy, type:zzz, op:aaa }\n //\t]\n // }\n var settings = { fieldOperations: [] };\n\n // for each of our formRows, decode the propery {}\n this.formRows.forEach((fr) => {\n var rowSettings = fr.toSettings();\n if (rowSettings) {\n settings.fieldOperations.push(fr.toSettings());\n }\n });\n\n return settings;\n },\n };\n\n return {\n ui: _ui,\n init: init,\n fromSettings: (settings) => {\n _logic.fromSettings(settings);\n },\n toSettings: () => {\n return _logic.toSettings();\n },\n _logic: _logic,\n };\n }\n\n valueDisplayRow(idBase) {\n var uniqueInstanceID = webix.uid();\n var myUnique = (key) => {\n // return idBase + '_' + key + '_' + uniqueInstanceID;\n return key + \"_\" + uniqueInstanceID;\n };\n\n var ids = {\n row: myUnique(\"row\"),\n updateForm: myUnique(\"updateFormRow\"),\n field: myUnique(\"field\"),\n value: myUnique(\"value\"),\n selectDc: myUnique(\"selectDc\"),\n selectBy: myUnique(\"selectBy\"),\n queryField: myUnique(\"queryField\"),\n multiview: myUnique(\"multiview\"),\n buttonAdd: myUnique(\"add\"),\n buttonDelete: myUnique(\"delete\"),\n };\n\n var FilterComponent;\n\n var _logic = {\n callbacks: {\n onAdd: () => {},\n onDelete: () => {},\n },\n\n buttonsToggle: () => {\n $$(ids.row).getChildViews()[0].getChildViews()[4].hide();\n $$(ids.row).getChildViews()[0].getChildViews()[5].show();\n },\n\n getFieldList: (shouldFilter) => {\n var options = [];\n if (this.updateObject) {\n options = (this.updateObject.fields() || []).map((f) => {\n return {\n id: f.id,\n value: f.label,\n };\n });\n\n // options = (this.updateObject.fields() || [])\n // .filter(f => {\n //\n // \tif (f.key != 'connectObject') {\n // \t\treturn true;\n // \t} else {\n // \t\t// if this is a connection field, only return\n // \t\t// fields that are 1:x where this field is the\n // \t\t// source:\n // \t\t// return ((f.linkType() == 'one') && (f.isSource()))\n //\n // \t\t// 6-14-2018 Changing from only 1:x to support many\n // \t\t// if this is a connected field, only return\n // \t\t// fields that this is the source\n // \t\treturn (f.isSource())\n // \t}\n // })\n // .map(f => {\n // \treturn {\n // \t\tid: f.id,\n // \t\tvalue: f.label\n // \t};\n // });\n\n // Remove fields who are selected\n if (shouldFilter) {\n // store this row\n var usedHash = {};\n this.formRows.forEach((row) => {\n var rowView = $$(row.ui.id);\n if (rowView) {\n var field = rowView\n .getChildViews()[0]\n .getChildViews()[1];\n usedHash[field.getValue()] = true;\n }\n });\n options = options.filter((o) => {\n return !usedHash[o.id];\n });\n }\n }\n return options;\n },\n\n isValid: () => {\n var validator = this.currentForm.AB.Validation.validator();\n var valueField = $$(ids.row).getChildViews()[0].getChildViews()[3];\n var FormView = valueField.getParentView().getParentView();\n\n var field = this.getUpdateObjectField($$(ids.field).getValue());\n if (field) {\n var value = field.getValue(valueField, {});\n\n // // if a standard component that supports .getValue()\n // if (valueField.getValue) {\n // \tvalue = valueField.getValue();\n // } else {\n // \t// else use for field.getValue();\n // \tvalue = field.getValue(valueField, {});\n // }\n\n // our .isValidData() wants value in an object:\n var obj = {};\n obj[field.columnName] = value;\n\n field.isValidData(obj, validator);\n\n // if value is empty, this is also an error:\n if (\n value == \"\" ||\n value == null ||\n (Array.isArray(value) && value.length == 0)\n ) {\n validator.addError(\n field.columnName,\n L(\"A value is required\")\n );\n }\n\n // field.getParentView() -> row\n // row.getParentView() -> Form\n FormView.clearValidation();\n validator.updateForm(FormView);\n\n return validator.pass();\n } else {\n // if we didn't find an associated field ... then this isn't good\n // data.\n\n //// TODO: display error for our field picker. Note, it doesn't have a unique .name\n // field.\n var fieldField = $$(ids.row)\n .getChildViews()[0]\n .getChildViews()[1];\n fieldField.define(\"invalidMessage\", L(\"A value is required\"));\n fieldField.define(\"invalid\", true);\n fieldField.refresh();\n // fieldField.markInvalid(this.labels.component.errorRequired);\n return false;\n }\n },\n\n selectField: (columnID) => {\n var field = this.getUpdateObjectField(columnID);\n if (!field) return;\n\n var fieldComponent = field.formComponent(),\n abView = fieldComponent.newInstance(field.object.application),\n formFieldComponent = abView.component(this.App),\n $componentView = formFieldComponent.ui,\n $inputView;\n\n $componentView.id = ids.value; // set our expected id\n\n // find all the DataSources\n var datasources = this.currentForm.AB.datacollections(\n (dc) => dc.datasource\n );\n\n // create a droplist with those dataSources\n var optionsDataSources = [];\n datasources.forEach((dc) => {\n optionsDataSources.push({ id: dc.id, value: dc.label });\n });\n\n // create a droplist with select options\n var optionsSelectBy = [\n { id: \"select-one\", value: L(\"Current selection\") },\n {\n id: \"filter-select-one\",\n value: L(\"Select first after filter by...\"),\n },\n ];\n\n var $optionUpdateExsits = {\n type: \"clean\",\n rows: [\n {\n cols: [\n {\n id: ids.selectDc,\n view: \"combo\",\n options: optionsDataSources,\n placeholder: L(\"Choose a data source\"),\n on: {\n onChange: (newv, oldv) => {\n var selectedDC =\n this.currentForm.AB.datacollectionByID(\n newv\n );\n if (\n selectedDC &&\n (selectedDC.sourceType == \"query\" ||\n !field.isConnection)\n ) {\n var queryFieldOptions = [];\n selectedDC.datasource\n .fields()\n .forEach((f) => {\n queryFieldOptions.push({\n id: f.id,\n value: f.label,\n });\n });\n $$(ids.queryField).define(\n \"options\",\n queryFieldOptions\n );\n $$(ids.queryField).refresh();\n $$(ids.queryField).show();\n } else {\n $$(ids.queryField).hide();\n }\n },\n },\n },\n // we will place a list of query fields if you choose a datasource that has a query source type\n {\n id: ids.queryField,\n view: \"combo\",\n hidden: true,\n placeholder: L(\"Choose value from...\"),\n options: [{ id: 1, value: \"figure this out\" }],\n },\n ],\n },\n {\n id: ids.selectBy,\n view: \"combo\",\n options: optionsSelectBy,\n placeholder: L(\"Choose select option\"),\n on: {\n onChange: (newv, oldv) => {\n var $row = $$(ids.row);\n $row.removeView($row.getChildViews()[1]);\n if (newv == \"select-one\") {\n $row.addView({}, 1);\n } else {\n var options =\n this.currentForm.datacollection.datasource\n .fields()\n .map(function (f) {\n return {\n id: f.id,\n value: f.label,\n };\n });\n\n FilterComponent = this.AB.filterComplexNew(\n `${idBase}_filter`\n );\n // FilterComponent.applicationLoad(\n // this.currentForm.application\n // );\n FilterComponent.init({\n isRecordRule: true,\n recordRuleFieldOptions: options,\n });\n FilterComponent.on(\"change\", (val) => {\n _logic.onFilterChange(val);\n });\n\n $row.addView(FilterComponent.ui, 1);\n\n var dcId = $$(ids.selectDc).getValue();\n var dataCollection =\n this.currentForm.AB.datacollectionByID(dcId);\n if (dataCollection) {\n _logic.populateFilters(dataCollection);\n }\n }\n },\n },\n },\n ],\n };\n\n // WORKAROUND: add '[Current User]' option to the user data field\n if (field.key == \"user\") {\n $componentView.options = $componentView.options || [];\n $componentView.options.unshift({\n id: \"ab-current-user\",\n value: L(\"[Current User]\"),\n });\n }\n\n // UPDATE: ok, in practice we have not had any use cases where\n // we want individual values on connectedObject fields, but\n // instead we want to insert the current selected element from\n // a relevant data view. So, replace the fieldComponet\n // from a connectedObject field with a list of data views that\n // are based upon the same object we are connected to:\n if (field.isConnection) {\n // find the ABObject this field connects to\n var connectedObject = field.datasourceLink;\n\n // find all the DataSources that are based upon this ABObject\n // to do this, we find the root Page we are on, then ask that Page for datasources:\n datasources = datasources.filter((dc) => {\n return dc.datasource.id == connectedObject.id;\n });\n\n var dcQueries = this.currentForm.AB.datacollections((dc) => {\n return (\n dc.sourceType == \"query\" &&\n dc.datasource &&\n dc.datasource.canFilterObject(connectedObject)\n );\n // return dc.datasource.id == connectedObject.id;\n });\n\n datasources = datasources.concat(dcQueries);\n\n // refresh a droplist with those dataSources\n optionsDataSources = [];\n datasources.forEach((dc) => {\n optionsDataSources.push({ id: dc.id, value: dc.label });\n });\n\n // add select an array value option\n optionsSelectBy.push({\n id: \"filter-select-all\",\n value: L(\"Select all after filter by...\"),\n });\n\n $inputView = $optionUpdateExsits;\n\n // and the upcoming formFieldComponent.init()\n // doesn't need to do anything:\n formFieldComponent = {\n init: function () {},\n };\n\n // and we reset field so it's customDisplay isn't called:\n // field = {};\n } else {\n $inputView = {\n id: ids.multiview,\n view: \"multiview\",\n cells: [\n {\n batch: \"custom\",\n rows: [\n $componentView,\n {\n view: \"label\",\n label: `${L(\"Or exists value\")}`,\n on: {\n onItemClick: function () {\n var $container = this.getParentView(),\n $multiview = $container.getParentView();\n\n $multiview.showBatch(\"exist\");\n },\n },\n },\n ],\n },\n {\n // Update value from exists object\n batch: \"exist\",\n rows: [\n $optionUpdateExsits,\n {\n view: \"label\",\n label: `${L(\"Or custom value\")}`,\n on: {\n onItemClick: function () {\n var $container = this.getParentView(),\n $multiview = $container.getParentView();\n\n // clear filter view\n $$(ids.selectBy).setValue(\"select-one\");\n\n $multiview.showBatch(\"custom\");\n },\n },\n },\n ],\n },\n ],\n };\n }\n\n // Change component to display this field's form input\n var $row = $$(ids.row).getChildViews()[0];\n $row.removeView($row.getChildViews()[3]);\n $row.addView($inputView, 3);\n\n formFieldComponent.init();\n\n // Show custom display of data field\n if (!field.isConnection && field.customDisplay) {\n // field.customDisplay(field, this.App, $row.getChildViews()[3].$view, {\n\n var compNodeView = $$($componentView.id).$view;\n\n // wait until render UI complete\n setTimeout(() => {\n field.customDisplay(field, this.App, compNodeView, {\n editable: true,\n\n // tree\n isForm: true,\n });\n }, 50);\n }\n\n // Show the remove button\n var $buttonRemove = $row.getChildViews()[4];\n $buttonRemove.show();\n\n // Add a new row\n if (columnID) _logic.callbacks.onAdd();\n },\n\n setValue: (data) => {\n $$(ids.field).setValue(data.fieldID);\n // note: this triggers our _logic.selectField() fn.\n var field = this.getUpdateObjectField(data.fieldID);\n if (field) {\n var setValueFn = () => {\n $$(ids.selectDc).setValue(data.value);\n if (data.queryField) {\n $$(ids.queryField).setValue(data.queryField);\n }\n var selectBy = data.selectBy || \"select-one\";\n $$(ids.selectBy).setValue(selectBy);\n\n if (selectBy != \"select-one\") {\n var collectionId = data.value;\n var dataCollection =\n this.currentForm.AB.datacollectionByID(collectionId);\n if (dataCollection && data.filterConditions) {\n _logic.populateFilters(\n dataCollection,\n data.filterConditions\n );\n }\n }\n };\n\n // now handle our special connectedObject case:\n if (field.isConnection) {\n setValueFn();\n } else {\n if (data.valueType == \"exist\") {\n $$(ids.multiview).showBatch(\"exist\");\n\n setValueFn();\n } else {\n $$(ids.multiview).showBatch(\"custom\");\n\n // wait until render UI complete\n setTimeout(function () {\n // set value to custom field\n var rowData = {};\n rowData[field.columnName] = data.value;\n field.setValue($$(ids.value), rowData);\n }, 50);\n }\n }\n }\n },\n\n populateFilters: (dataView, filterConditions) => {\n filterConditions =\n filterConditions ||\n ABViewRuleActionObjectUpdaterDefaults.filterConditions;\n\n // Populate data to popups\n // FilterComponent.objectLoad(objectCopy);\n FilterComponent.fieldsLoad(\n dataView.datasource ? dataView.datasource.fields() : []\n );\n FilterComponent.setValue(filterConditions);\n },\n\n toSettings: () => {\n // if this isn't the last entry row\n // * a row with valid data has the [delete] button showing.\n var buttonDelete = $$(ids.buttonDelete);\n if (buttonDelete && buttonDelete.isVisible()) {\n var data = {};\n data.fieldID = $$(ids.field).getValue();\n\n var $valueField = $$(ids.value);\n var field = this.getUpdateObjectField(data.fieldID);\n\n var getValueFn = () => {\n data.value = $$(ids.selectDc).getValue();\n data.queryField = $$(ids.queryField).getValue();\n data.op = \"set\"; // possible to create other types of operations.\n data.type = field.key;\n data.selectBy = $$(ids.selectBy).getValue();\n data.valueType = \"exist\";\n if (FilterComponent) {\n data.filterConditions = FilterComponent.getValue();\n }\n };\n\n // now handle our special connectedObject case:\n if (field.isConnection) {\n getValueFn();\n } else {\n if ($$(ids.multiview).config.visibleBatch == \"exist\") {\n getValueFn();\n } else {\n data.value = field.getValue($valueField, {});\n data.op = \"set\"; // possible to create other types of operations.\n data.type = field.key;\n data.valueType = \"custom\";\n }\n }\n\n return data;\n } else {\n return null;\n }\n },\n };\n\n var _ui = {\n id: ids.row,\n view: \"layout\",\n rows: [\n {\n cols: [\n {\n // Label\n view: \"label\",\n width: this.currentForm.AB.Config.labelWidthSmall,\n label: L(\"Set\"),\n },\n {\n // Field list\n view: \"combo\",\n name: \"field\",\n placeholder: L(\"Choose a field\"),\n id: ids.field,\n height: 32,\n options: _logic.getFieldList(true),\n on: {\n onChange: function (columnId) {\n _logic.selectField(columnId);\n },\n },\n },\n {\n // Label\n view: \"label\",\n width: this.currentForm.AB.Config.labelWidthSmall,\n label: L(\"To\"),\n },\n\n // Field value\n // NOTE: this view gets replaced each time a field is selected.\n // We replace it with a component associated with the Field\n {},\n\n {\n // \"Remove\" button\n view: \"button\",\n css: \"webix_danger\",\n id: ids.buttonDelete,\n icon: \"fa fa-trash\",\n type: \"icon\",\n width: 30,\n hidden: true,\n click: function () {\n _logic.callbacks.onDelete(ids.row);\n },\n },\n ],\n },\n {}, // we will add filters here if we need them\n ],\n };\n\n var init = (options) => {\n for (var c in _logic.callbacks) {\n _logic.callbacks[c] = options[c] || _logic.callbacks[c];\n }\n\n if (options.data) {\n // options.data = { formID:xxx, value:yyy, type:zzzz }\n _logic.setValue(options.data);\n\n // _logic.buttonsToggle();\n }\n };\n\n return {\n ui: _ui,\n init: init,\n toSettings: () => {\n return _logic.toSettings();\n },\n _logic: _logic,\n };\n }\n\n getUpdateObjectField(fieldID) {\n return (\n this.queryObject?.fieldByID(fieldID) ??\n this.updateObject?.fieldByID(fieldID) ??\n this.currentForm.AB.fieldNew(\n this.currentForm.AB.definitionByID(fieldID) ?? {},\n this.currentForm.AB.objectNew({})\n )\n );\n }\n\n /**\n * @method processUpdateObject\n * Perform the specified update actions on the provided objectToUpdate\n * @param {obj} options Additional information required to make updates.\n * @param {obj} objectToUpdate The object to make the updates on.\n * @return {boolean} true if an update took place, false if no updates.\n */\n processUpdateObject(options, objectToUpdate) {\n this._formData = objectToUpdate;\n // return new Promise((resolve, reject) => {\n var isUpdated = false;\n\n this.valueRules = this.valueRules || {};\n this.valueRules.fieldOperations = this.valueRules.fieldOperations || [];\n\n // var allPromises = [];\n\n // for each of our operations\n this.valueRules.fieldOperations.forEach((op) => {\n // op = {\n // \tfieldID:'zzzzz',\n //\tvalue: 'xxx',\n //\top: 'set',\n // type:'',\n // queryField: '', // id of ABField\n // selectBy:'', ['select-one', 'filter-select-one', 'filter-select-all']\n // valueType: \"\", ['custom', 'exist']\n // \tfilterConditions: { // array of filters to apply to the data table\n //\t\tglue: 'and',\n // \t\trules: []\n // }\n // }\n\n var field = this.getUpdateObjectField(op.fieldID);\n if (!field) return;\n\n let value = op?.value?.id ?? op?.value;\n\n switch (value) {\n case \"ab-current-user\":\n value = this.currentForm.AB.Account.username();\n break;\n case \"ab-current-date\":\n value = new Date();\n break;\n }\n\n // in the case of a connected Field, we use op.value to get the\n // datacollection, and find it's currently selected value:\n if ((field.isConnection && !field.isUser) || op.valueType == \"exist\") {\n // NOTE: 30 May 2018 :current decision from Ric is to limit this\n // to only handle 1:x connections where we update the current obj\n // with the PK of the value from the DC.\n //\n // In the future, if we want to handle the other options,\n // we need to modify this to handle the M:x connections where\n // we insert our PK into the value from the DC.\n\n // op.value is the ABDatacollection.id we need to find\n const dataCollection = this.currentForm.AB.datacollectionByID(\n op.value\n );\n if (!dataCollection) {\n isUpdated = false;\n return;\n }\n\n // we don't want to mess with the dataView directly since it might\n // be used by other parts of the system and this refresh might reset\n // it's cursor.\n // var clonedDataCollection = dataView.filteredClone(op.filterConditions);\n\n // loop through rules to find \"same-as-field\" or \"not-same-as-field\"\n // adjust operator and switch key value to actual value when found\n var filterConditions = this.currentForm.AB.cloneDeep(\n op.filterConditions\n );\n if (filterConditions && filterConditions.rules) {\n filterConditions.rules\n .filter((r) => {\n return (\n r.rule == \"same_as_field\" ||\n r.rule == \"not_same_as_field\"\n );\n })\n .forEach((item) => {\n var valueField =\n this.currentForm.datacollection.datasource.fieldByID(\n item.value\n );\n if (valueField.isConnection) {\n item.value = valueField.format(this._formData);\n } else {\n item.value = this._formData[valueField.columnName];\n }\n\n if (item.rule == \"not_same_as_field\") {\n item.rule = \"not equals\";\n } else {\n item.rule = \"equals\";\n }\n });\n }\n\n let clonedDataCollection =\n dataCollection.filteredClone(filterConditions);\n\n switch (op.selectBy) {\n // the 'select-one' is getting the currently set cursor on this data collection\n // and using that value.\n // TODO: rename to 'select-cursor'\n case \"select-one\":\n default: // dataView.getItem(dataView.getCursor());\n value = clonedDataCollection.getCursor();\n\n if (value) {\n // NOTE: webix documentation issue: .getCursor() is supposed to return\n // the .id of the item. However it seems to be returning the {obj}\n\n if (op.valueType == \"exist\") {\n let fieldWithValue =\n clonedDataCollection.datasource.fieldByID(\n op.queryField\n );\n\n if (fieldWithValue)\n value = value[fieldWithValue.columnName];\n } else if (value.id) {\n value = value.id;\n }\n }\n\n // QUESTION: if value returns undefined should we do something else?\n switch (op.op) {\n case \"set\":\n if (!value) break;\n\n if (field.isConnection) {\n // if we are setting a connection we do not want to pass the full object because\n // batch creates payload gets too large\n objectToUpdate[field.columnName] = {};\n objectToUpdate[field.columnName].id =\n value[field.datasourceLink.PK()];\n objectToUpdate[field.columnName][\n field.datasourceLink.PK()\n ] = value[field.datasourceLink.PK()];\n\n // If the connect field use the custom FK, then it requires to pass value of the custom FK.\n if (field.settings.isCustomFK) {\n if (field.indexField) {\n objectToUpdate[field.columnName][\n field.indexField.columnName\n ] = value[field.indexField.columnName];\n }\n if (field.indexField2) {\n objectToUpdate[field.columnName][\n field.indexField2.columnName\n ] = value[field.indexField2.columnName];\n }\n }\n\n field.datasourceLink\n .fields(\n (f) =>\n f.key == \"combined\" || f.key == \"AutoIndex\"\n )\n .forEach((f) => {\n objectToUpdate[field.columnName][\n f.columnName\n ] = value[f.columnName];\n });\n } else {\n objectToUpdate[field.columnName] = value;\n }\n\n break;\n }\n break;\n\n // attempt to filter this data collection by the given filterConditions\n case \"filter-select-all\":\n var newValues = [];\n\n var currRow = clonedDataCollection.getFirstRecord();\n while (currRow) {\n // do something there\n\n switch (clonedDataCollection.sourceType) {\n // case: datacollection is an object\n // we want to set our field to this values\n case \"object\":\n newValues.push(currRow.id);\n break;\n\n // case: datacollection is a query\n // our field is a pointer to an object. we want to pull out that object\n // from the query data.\n case \"query\": {\n let fieldWithValue =\n clonedDataCollection.datasource.fieldByID(\n op.queryField\n );\n\n var newValue = currRow[fieldWithValue.columnName];\n\n if (typeof newValue == \"undefined\") {\n newValue = currRow[fieldWithValue.relationName()];\n\n if (Array.isArray(newValue)) {\n newValue = newValue.map((v) => {\n return v.id ? v.id : v;\n });\n } else if (newValue.id) {\n newValue = newValue.id;\n }\n }\n\n newValues = this.currentForm.AB.uniq(\n newValues.concat(newValue)\n );\n\n break;\n }\n }\n\n currRow = clonedDataCollection.getNextRecord(currRow);\n }\n\n // QUESTION: if value returns undefined should we do something else?\n switch (op.op) {\n case \"set\":\n if (field.linkType() == \"one\") {\n var updates = [];\n newValues.forEach((v) => {\n var objectToUpdateClone =\n this.currentForm.AB.cloneDeep(objectToUpdate);\n objectToUpdateClone[field.columnName] = v;\n updates.push(objectToUpdateClone);\n });\n objectToUpdate.newRecords = updates;\n } else {\n objectToUpdate[field.columnName] = newValues;\n }\n break;\n }\n break;\n\n case \"filter-select-one\":\n newValues = [];\n\n value = clonedDataCollection.getFirstRecord();\n\n if (value) {\n // case: datacollection is a query\n // our field is a pointer to an object. we want to pull out that object\n // from the query data.\n if (\n clonedDataCollection.sourceType == \"query\" ||\n (op.valueType == \"exist\" && op.queryField)\n ) {\n let fieldWithValue =\n clonedDataCollection.datasource.fieldByID(\n op.queryField\n );\n\n newValue = value[fieldWithValue.columnName];\n\n if (typeof newValue == \"undefined\") {\n newValue = value[fieldWithValue.relationName()];\n if (Array.isArray(newValue)) {\n newValue = newValue[0];\n }\n if (newValue.id) newValue = newValue.id;\n }\n\n value = newValue;\n }\n // case: datacollection is an object\n // we want to set our field to this values\n else if (clonedDataCollection.sourceType == \"object\") {\n // NOTE: webix documentation issue: .getCursor() is supposed to return\n // the .id of the item. However it seems to be returning the {obj}\n\n // we need to use the objects indexField(2) if there is one\n // otherwise default to the id\n var lookup;\n if (field.indexField) {\n lookup = field.indexField.columnName;\n } else if (field.indexField2) {\n lookup = field.indexField2.columnName;\n }\n if (lookup && value[lookup]) {\n value = value[lookup];\n } else if (value.id) {\n value = value.id;\n }\n }\n }\n\n // QUESTION: if value returns undefined should we do something else?\n switch (op.op) {\n case \"set\":\n objectToUpdate[field.columnName] = value;\n break;\n }\n break;\n }\n\n isUpdated = true;\n\n // allPromises.push(connectedPromise);\n } else {\n // var setPromise = new Promise((resolve, reject) => {\n switch (op.op) {\n case \"set\":\n objectToUpdate[field.columnName] = value;\n break;\n }\n\n isUpdated = true;\n\n // resolve(isUpdated);\n // });\n\n // allPromises.push(setPromise);\n\n // console.log(\"finished\");\n }\n });\n\n return isUpdated;\n // Promise.all(allPromises).then(() => {\n // resolve(isUpdated);\n // });\n // });\n }\n\n // process\n // gets called when a form is submitted and the data passes the Query Builder Rules.\n // @param {obj} options\n // @return {Promise}\n process(options) {\n this._formData = options.data;\n\n return new Promise((resolve, reject) => {\n let isUpdated = this.processUpdateObject({}, options.data);\n if (!isUpdated) {\n resolve();\n } else {\n // get the model from the provided Form Obj:\n var dv = options.form.datacollection;\n if (!dv) return resolve();\n\n var model = dv.model;\n model\n .update(options.data.id, options.data)\n .then(resolve)\n .catch((err) => {\n this.currentForm.AB.notify.developer(err, {\n context:\n \"ABViewRuleActionObjectUpdater:process update error\",\n id: options.data.id,\n data: options.data,\n });\n reject(err);\n });\n }\n });\n }\n\n // objectLoad\n // save the current object this Action is associated with.\n objectLoad(object) {\n super.objectLoad(object);\n this.updateObjectLoad(object);\n }\n\n // updateObjectLoad\n // save the given object as the object we will update.\n updateObjectLoad(object) {\n // stash rules for old object\n if (this.updateObject) {\n this.stashRules[this.updateObject.id] = this.valueRules;\n }\n\n this.updateObject = object;\n\n // with a new updateObject, then reset our UI\n this._uiUpdater = null;\n\n // reload any stashed rules, or set to {}\n this.valueRules = this.stashRules[this.updateObject.id] || {};\n }\n\n // fromSettings\n // initialize this Action from a given set of setting values.\n // @param {obj} settings\n fromSettings(settings) {\n settings = settings || {};\n\n super.fromSettings(settings); // let the parent handle the QB\n\n // make sure UI is updated:\n // set our updateObject\n if (settings.updateObjectID) {\n this.updateObject = this.currentForm.AB.objectByID(\n settings.updateObjectID\n );\n } else {\n // DEPRECIATED method of resolving objects .urlResolve()\n if (settings.updateObjectURL) {\n var updateObject = this.currentForm.application.urlResolve(\n settings.updateObjectURL\n );\n this.updateObject = updateObject;\n }\n }\n\n // if we have a display component, then populate it:\n if (this._uiUpdater) {\n // now we handle our valueRules:{} object settings.\n // pass the settings off to our DisplayList component:\n this._uiUpdater.fromSettings(settings);\n }\n }\n\n // toSettings\n // return an object that represents the current state of this Action\n // @return {obj}\n toSettings() {\n // settings: {\n //\tvalueRules:{}\n // }\n\n // let our parent store our QB settings\n var settings = super.toSettings();\n\n settings.valueRules = this._uiUpdater.toSettings();\n settings.updateObjectURL = this.updateObject.urlPointer();\n\n return settings;\n }\n\n /**\n * @method isReady()\n * returns a promise that gets resolved once our action is ready to work.\n * Here we need to scan each of our field operations, and verify all\n * related data collections are initialized before we can continue.\n * @return {Promise}\n */\n isReady() {\n var allReady = [];\n let fieldOps = this.valueRules?.fieldOperations ?? [];\n fieldOps.forEach((op) => {\n let field = this.getUpdateObjectField(op.fieldID);\n if (!field) return;\n if (!field.isConnection && op.valueType !== \"exist\") return;\n\n // this references a DC\n let DC = this.currentForm.AB.datacollectionByID(op.value);\n if (DC?.dataStatus === DC?.dataStatusFlag.initialized) return;\n\n // not ready yet, so wait until the 'initializedData' event\n allReady.push(\n new Promise((resolve /*, reject */) => {\n DC.on(\"initializedData\", () => {\n resolve();\n });\n })\n );\n });\n return Promise.all(allReady);\n }\n};\n","/**\n * @class config\n *\n * Manage our configuration settings.\n */\n\nimport ConfigDesktop from \"./configDesktop\";\nimport ConfigMobile from \"./configMobile\";\nimport Icons from \"./icons\";\n\nexport default {\n config: function () {\n // TODO: decide which config file to return here:\n if (window.innerWidth < 768) {\n return ConfigMobile;\n }\n return ConfigDesktop;\n },\n icons: Icons.icons,\n};\n","/**\n * @class configDesktop\n *\n * Manage our configuration settings for Desktop styles.\n\n */\n\nexport default {\n // Application List\n appListRowHeight: 67,\n\n // button types\n buttonWidthLarge: 200,\n buttonWidthMedium: 150,\n buttonWidthSmall: 100,\n buttonWidthExtraSmall: 50,\n\n // tab types\n tabWidthLarge: 200,\n tabWidthMedium: 120,\n tabWidthSmall: 100,\n tabWidthExtraSmall: 50,\n\n // column types\n columnWidthXLarge: 350,\n columnWidthLarge: 250,\n columnWidthMedium: 200,\n columnWidthSmall: 150,\n columnWidthExtraSmall: 100,\n\n // spacers\n xSmallSpacer: 5,\n smallSpacer: 10,\n mediumSpacer: 25,\n largeSpacer: 50,\n xLargeSpacer: 100,\n xxLargeSpacer: 200,\n xxxLargeSpacer: 400,\n appListSpacerRowHeight: 100,\n appListSpacerColMinWidth: 100,\n appListSpacerColMaxWidth: 200,\n objectWorkspaceColWidth: 20,\n\n // labels\n labelWidthSmall: 50,\n labelWidthMedium: 80,\n labelWidthLarge: 120,\n labelWidthXLarge: 150,\n labelWidthXXLarge: 200,\n labelWidthXXXLarge: 280,\n labelWidthCheckbox: 0,\n\n // show elements on desktop\n hideMobile: false,\n};\n","/**\n * @class configMobile\n *\n * Manage our configuration settings for mobile styles.\n\n */\n\nexport default {\n // Application List\n appListRowHeight: 67,\n\n // button types\n buttonWidthLarge: 200,\n buttonWidthMedium: 150,\n buttonWidthSmall: 100,\n buttonWidthExtraSmall: 50,\n\n // tab types\n tabWidthLarge: 200,\n tabWidthMedium: 120,\n tabWidthSmall: 100,\n tabWidthExtraSmall: 50,\n\n // column types\n columnWidthLarge: 250,\n columnWidthMedium: 200,\n columnWidthSmall: 150,\n columnWidthExtraSmall: 100,\n\n // spacers\n xSmallSpacer: 1,\n smallSpacer: 1,\n mediumSpacer: 10,\n largeSpacer: 20,\n xLargeSpacer: 50,\n xxLargeSpacer: 100,\n xxxLargeSpacer: 120,\n appListSpacerRowHeight: 10,\n appListSpacerColMinWidth: 1,\n appListSpacerColMaxWidth: 1,\n objectWorkspaceColWidth: 1,\n\n // labels\n labelWidthSmall: 50,\n labelWidthMedium: 80,\n labelWidthLarge: 120,\n labelWidthXLarge: 120,\n labelWidthXXLarge: 120,\n labelWidthCheckbox: 0,\n\n // hide elements for mobile\n hideMobile: true,\n};\n","export default {\n icons: [\n \"500px\",\n \"address-book\",\n \"address-book-o\",\n \"address-card\",\n \"address-card-o\",\n \"adjust\",\n \"adn\",\n \"align-center\",\n \"align-justify\",\n \"align-left\",\n \"align-right\",\n \"amazon\",\n \"ambulance\",\n \"american-sign-language-interpreting\",\n \"anchor\",\n \"android\",\n \"angellist\",\n \"angle-double-down\",\n \"angle-double-left\",\n \"angle-double-right\",\n \"angle-double-up\",\n \"angle-down\",\n \"angle-left\",\n \"angle-right\",\n \"angle-up\",\n \"apple\",\n \"archive\",\n \"area-chart\",\n \"arrow-circle-down\",\n \"arrow-circle-left\",\n \"arrow-circle-o-down\",\n \"arrow-circle-o-left\",\n \"arrow-circle-o-right\",\n \"arrow-circle-o-up\",\n \"arrow-circle-right\",\n \"arrow-circle-up\",\n \"arrow-down\",\n \"arrow-left\",\n \"arrow-right\",\n \"arrow-up\",\n \"arrows\",\n \"arrows-alt\",\n \"arrows-h\",\n \"arrows-v\",\n \"asl-interpreting\",\n \"assistive-listening-systems\",\n \"asterisk\",\n \"at\",\n \"audio-description\",\n \"automobile\",\n \"backward\",\n \"balance-scale\",\n \"ban\",\n \"bandcamp\",\n \"bank\",\n \"bar-chart\",\n \"bar-chart-o\",\n \"barcode\",\n \"bars\",\n \"bath\",\n \"bathtub\",\n \"battery\",\n \"battery-0\",\n \"battery-1\",\n \"battery-2\",\n \"battery-3\",\n \"battery-4\",\n \"battery-empty\",\n \"battery-full\",\n \"battery-half\",\n \"battery-quarter\",\n \"battery-three-quarters\",\n \"bed\",\n \"beer\",\n \"behance\",\n \"behance-square\",\n \"bell\",\n \"bell-o\",\n \"bell-slash\",\n \"bell-slash-o\",\n \"bicycle\",\n \"binoculars\",\n \"birthday-cake\",\n \"bitbucket\",\n \"bitbucket-square\",\n \"bitcoin\",\n \"black-tie\",\n \"blind\",\n \"bluetooth\",\n \"bluetooth-b\",\n \"bold\",\n \"bolt\",\n \"bomb\",\n \"book\",\n \"bookmark\",\n \"bookmark-o\",\n \"braille\",\n \"briefcase\",\n \"btc\",\n \"bug\",\n \"building\",\n \"building-o\",\n \"bullhorn\",\n \"bullseye\",\n \"bus\",\n \"buysellads\",\n \"cab\",\n \"calculator\",\n \"calendar\",\n \"calendar-check-o\",\n \"calendar-minus-o\",\n \"calendar-o\",\n \"calendar-plus-o\",\n \"calendar-times-o\",\n \"camera\",\n \"camera-retro\",\n \"car\",\n \"caret-down\",\n \"caret-left\",\n \"caret-right\",\n \"caret-square-o-down\",\n \"caret-square-o-left\",\n \"caret-square-o-right\",\n \"caret-square-o-up\",\n \"caret-up\",\n \"cart-arrow-down\",\n \"cart-plus\",\n \"cc\",\n \"cc-amex\",\n \"cc-diners-club\",\n \"cc-discover\",\n \"cc-jcb\",\n \"cc-mastercard\",\n \"cc-paypal\",\n \"cc-stripe\",\n \"cc-visa\",\n \"certificate\",\n \"chain\",\n \"chain-broken\",\n \"check\",\n \"check-circle\",\n \"check-circle-o\",\n \"check-square\",\n \"check-square-o\",\n \"chevron-circle-down\",\n \"chevron-circle-left\",\n \"chevron-circle-right\",\n \"chevron-circle-up\",\n \"chevron-down\",\n \"chevron-left\",\n \"chevron-right\",\n \"chevron-up\",\n \"child\",\n \"chrome\",\n \"circle\",\n \"circle-o\",\n \"circle-o-notch\",\n \"circle-thin\",\n \"clipboard\",\n \"clock-o\",\n \"clone\",\n \"close\",\n \"cloud\",\n \"cloud-download\",\n \"cloud-upload\",\n \"cny\",\n \"code\",\n \"code-fork\",\n \"codepen\",\n \"codiepie\",\n \"coffee\",\n \"cog\",\n \"cogs\",\n \"columns\",\n \"comment\",\n \"comment-o\",\n \"commenting\",\n \"commenting-o\",\n \"comments\",\n \"comments-o\",\n \"compass\",\n \"compress\",\n \"connectdevelop\",\n \"contao\",\n \"copy\",\n \"copyright\",\n \"creative-commons\",\n \"credit-card\",\n \"credit-card-alt\",\n \"crop\",\n \"crosshairs\",\n \"css3\",\n \"cube\",\n \"cubes\",\n \"cut\",\n \"cutlery\",\n \"dashboard\",\n \"dashcube\",\n \"database\",\n \"deaf\",\n \"deafness\",\n \"dedent\",\n \"delicious\",\n \"desktop\",\n \"deviantart\",\n \"diamond\",\n \"digg\",\n \"dollar\",\n \"dot-circle-o\",\n \"download\",\n \"dribbble\",\n \"drivers-license\",\n \"drivers-license-o\",\n \"dropbox\",\n \"drupal\",\n \"edge\",\n \"edit\",\n \"eercast\",\n \"eject\",\n \"ellipsis-h\",\n \"ellipsis-v\",\n \"empire\",\n \"envelope\",\n \"envelope-o\",\n \"envelope-open\",\n \"envelope-open-o\",\n \"envelope-square\",\n \"envira\",\n \"eraser\",\n \"etsy\",\n \"eur\",\n \"euro\",\n \"exchange\",\n \"exclamation\",\n \"exclamation-circle\",\n \"exclamation-triangle\",\n \"expand\",\n \"expeditedssl\",\n \"external-link\",\n \"external-link-square\",\n \"eye\",\n \"eye-slash\",\n \"eyedropper\",\n \"fa\",\n \"facebook\",\n \"facebook-f\",\n \"facebook-official\",\n \"facebook-square\",\n \"fast-backward\",\n \"fast-forward\",\n \"fax\",\n \"feed\",\n \"female\",\n \"fighter-jet\",\n \"file\",\n \"file-archive-o\",\n \"file-audio-o\",\n \"file-code-o\",\n \"file-excel-o\",\n \"file-image-o\",\n \"file-movie-o\",\n \"file-o\",\n \"file-pdf-o\",\n \"file-photo-o\",\n \"file-picture-o\",\n \"file-powerpoint-o\",\n \"file-sound-o\",\n \"file-text\",\n \"file-text-o\",\n \"file-video-o\",\n \"file-word-o\",\n \"file-zip-o\",\n \"files-o\",\n \"film\",\n \"filter\",\n \"fire\",\n \"fire-extinguisher\",\n \"firefox\",\n \"first-order\",\n \"flag\",\n \"flag-checkered\",\n \"flag-o\",\n \"flash\",\n \"flask\",\n \"flickr\",\n \"floppy-o\",\n \"folder\",\n \"folder-o\",\n \"folder-open\",\n \"folder-open-o\",\n \"font\",\n \"font-awesome\",\n \"fonticons\",\n \"fort-awesome\",\n \"forumbee\",\n \"forward\",\n \"foursquare\",\n \"free-code-camp\",\n \"frown-o\",\n \"futbol-o\",\n \"gamepad\",\n \"gavel\",\n \"gbp\",\n \"ge\",\n \"gear\",\n \"gears\",\n \"genderless\",\n \"get-pocket\",\n \"gg\",\n \"gg-circle\",\n \"gift\",\n \"git\",\n \"git-square\",\n \"github\",\n \"github-alt\",\n \"github-square\",\n \"gitlab\",\n \"gittip\",\n \"glass\",\n \"glide\",\n \"glide-g\",\n \"globe\",\n \"google\",\n \"google-plus\",\n \"google-plus-circle\",\n \"google-plus-official\",\n \"google-plus-square\",\n \"google-wallet\",\n \"graduation-cap\",\n \"gratipay\",\n \"grav\",\n \"group\",\n \"h-square\",\n \"hacker-news\",\n \"hand-grab-o\",\n \"hand-lizard-o\",\n \"hand-o-down\",\n \"hand-o-left\",\n \"hand-o-right\",\n \"hand-o-up\",\n \"hand-paper-o\",\n \"hand-peace-o\",\n \"hand-pointer-o\",\n \"hand-rock-o\",\n \"hand-scissors-o\",\n \"hand-spock-o\",\n \"hand-stop-o\",\n \"handshake-o\",\n \"hard-of-hearing\",\n \"hashtag\",\n \"hdd-o\",\n \"header\",\n \"headphones\",\n \"heart\",\n \"heart-o\",\n \"heartbeat\",\n \"history\",\n \"home\",\n \"hospital-o\",\n \"hotel\",\n \"hourglass\",\n \"hourglass-1\",\n \"hourglass-2\",\n \"hourglass-3\",\n \"hourglass-end\",\n \"hourglass-half\",\n \"hourglass-o\",\n \"hourglass-start\",\n \"houzz\",\n \"html5\",\n \"i-cursor\",\n \"id-badge\",\n \"id-card\",\n \"id-card-o\",\n \"ils\",\n \"image\",\n \"imdb\",\n \"inbox\",\n \"indent\",\n \"industry\",\n \"info\",\n \"info-circle\",\n \"inr\",\n \"instagram\",\n \"institution\",\n \"internet-explorer\",\n \"intersex\",\n \"ioxhost\",\n \"italic\",\n \"joomla\",\n \"jpy\",\n \"jsfiddle\",\n \"key\",\n \"keyboard-o\",\n \"krw\",\n \"language\",\n \"laptop\",\n \"lastfm\",\n \"lastfm-square\",\n \"leaf\",\n \"leanpub\",\n \"legal\",\n \"lemon-o\",\n \"level-down\",\n \"level-up\",\n \"life-bouy\",\n \"life-buoy\",\n \"life-ring\",\n \"life-saver\",\n \"lightbulb-o\",\n \"line-chart\",\n \"link\",\n \"linkedin\",\n \"linkedin-square\",\n \"linode\",\n \"linux\",\n \"list\",\n \"list-alt\",\n \"list-ol\",\n \"list-ul\",\n \"location-arrow\",\n \"lock\",\n \"long-arrow-down\",\n \"long-arrow-left\",\n \"long-arrow-right\",\n \"long-arrow-up\",\n \"low-vision\",\n \"magic\",\n \"magnet\",\n \"mail-forward\",\n \"mail-reply\",\n \"mail-reply-all\",\n \"male\",\n \"map\",\n \"map-marker\",\n \"map-o\",\n \"map-pin\",\n \"map-signs\",\n \"mars\",\n \"mars-double\",\n \"mars-stroke\",\n \"mars-stroke-h\",\n \"mars-stroke-v\",\n \"maxcdn\",\n \"meanpath\",\n \"medium\",\n \"medkit\",\n \"meetup\",\n \"meh-o\",\n \"mercury\",\n \"microchip\",\n \"microphone\",\n \"microphone-slash\",\n \"minus\",\n \"minus-circle\",\n \"minus-square\",\n \"minus-square-o\",\n \"mixcloud\",\n \"mobile\",\n \"mobile-phone\",\n \"modx\",\n \"money\",\n \"moon-o\",\n \"mortar-board\",\n \"motorcycle\",\n \"mouse-pointer\",\n \"music\",\n \"navicon\",\n \"neuter\",\n \"newspaper-o\",\n \"object-group\",\n \"object-ungroup\",\n \"odnoklassniki\",\n \"odnoklassniki-square\",\n \"opencart\",\n \"openid\",\n \"opera\",\n \"optin-monster\",\n \"outdent\",\n \"pagelines\",\n \"paint-brush\",\n \"paper-plane\",\n \"paper-plane-o\",\n \"paperclip\",\n \"paragraph\",\n \"paste\",\n \"pause\",\n \"pause-circle\",\n \"pause-circle-o\",\n \"paw\",\n \"paypal\",\n \"pencil\",\n \"pencil-square\",\n \"pencil-square-o\",\n \"percent\",\n \"phone\",\n \"phone-square\",\n \"photo\",\n \"picture-o\",\n \"pie-chart\",\n \"pied-piper\",\n \"pied-piper-alt\",\n \"pied-piper-pp\",\n \"pinterest\",\n \"pinterest-p\",\n \"pinterest-square\",\n \"plane\",\n \"play\",\n \"play-circle\",\n \"play-circle-o\",\n \"plug\",\n \"plus\",\n \"plus-circle\",\n \"plus-square\",\n \"plus-square-o\",\n \"podcast\",\n \"power-off\",\n \"print\",\n \"product-hunt\",\n \"puzzle-piece\",\n \"qq\",\n \"qrcode\",\n \"question\",\n \"question-circle\",\n \"question-circle-o\",\n \"quora\",\n \"quote-left\",\n \"quote-right\",\n \"ra\",\n \"random\",\n \"ravelry\",\n \"rebel\",\n \"recycle\",\n \"reddit\",\n \"reddit-alien\",\n \"reddit-square\",\n \"refresh\",\n \"registered\",\n \"remove\",\n \"renren\",\n \"reorder\",\n \"repeat\",\n \"reply\",\n \"reply-all\",\n \"resistance\",\n \"retweet\",\n \"rmb\",\n \"road\",\n \"rocket\",\n \"rotate-left\",\n \"rotate-right\",\n \"rouble\",\n \"rss\",\n \"rss-square\",\n \"rub\",\n \"ruble\",\n \"rupee\",\n \"s15\",\n \"safari\",\n \"save\",\n \"scissors\",\n \"scribd\",\n \"search\",\n \"search-minus\",\n \"search-plus\",\n \"sellsy\",\n \"send\",\n \"send-o\",\n \"server\",\n \"share\",\n \"share-alt\",\n \"share-alt-square\",\n \"share-square\",\n \"share-square-o\",\n \"shekel\",\n \"sheqel\",\n \"shield\",\n \"ship\",\n \"shirtsinbulk\",\n \"shopping-bag\",\n \"shopping-basket\",\n \"shopping-cart\",\n \"shower\",\n \"sign-in\",\n \"sign-language\",\n \"sign-out\",\n \"signal\",\n \"signing\",\n \"simplybuilt\",\n \"sitemap\",\n \"skyatlas\",\n \"skype\",\n \"slack\",\n \"sliders\",\n \"slideshare\",\n \"smile-o\",\n \"snapchat\",\n \"snapchat-ghost\",\n \"snapchat-square\",\n \"snowflake-o\",\n \"soccer-ball-o\",\n \"sort\",\n \"sort-alpha-asc\",\n \"sort-alpha-desc\",\n \"sort-amount-asc\",\n \"sort-amount-desc\",\n \"sort-asc\",\n \"sort-desc\",\n \"sort-down\",\n \"sort-numeric-asc\",\n \"sort-numeric-desc\",\n \"sort-up\",\n \"soundcloud\",\n \"space-shuttle\",\n \"spinner\",\n \"spoon\",\n \"spotify\",\n \"square\",\n \"square-o\",\n \"stack-exchange\",\n \"stack-overflow\",\n \"star\",\n \"star-half\",\n \"star-half-empty\",\n \"star-half-full\",\n \"star-half-o\",\n \"star-o\",\n \"steam\",\n \"steam-square\",\n \"step-backward\",\n \"step-forward\",\n \"stethoscope\",\n \"sticky-note\",\n \"sticky-note-o\",\n \"stop\",\n \"stop-circle\",\n \"stop-circle-o\",\n \"street-view\",\n \"strikethrough\",\n \"stumbleupon\",\n \"stumbleupon-circle\",\n \"subscript\",\n \"subway\",\n \"suitcase\",\n \"sun-o\",\n \"superpowers\",\n \"superscript\",\n \"support\",\n \"table\",\n \"tablet\",\n \"tachometer\",\n \"tag\",\n \"tags\",\n \"tasks\",\n \"taxi\",\n \"telegram\",\n \"television\",\n \"tencent-weibo\",\n \"terminal\",\n \"text-height\",\n \"text-width\",\n \"th\",\n \"th-large\",\n \"th-list\",\n \"themeisle\",\n \"thermometer\",\n \"thermometer-0\",\n \"thermometer-1\",\n \"thermometer-2\",\n \"thermometer-3\",\n \"thermometer-4\",\n \"thermometer-empty\",\n \"thermometer-full\",\n \"thermometer-half\",\n \"thermometer-quarter\",\n \"thermometer-three-quarters\",\n \"thumb-tack\",\n \"thumbs-down\",\n \"thumbs-o-down\",\n \"thumbs-o-up\",\n \"thumbs-up\",\n \"ticket\",\n \"times\",\n \"times-circle\",\n \"times-circle-o\",\n \"times-rectangle\",\n \"times-rectangle-o\",\n \"tint\",\n \"toggle-down\",\n \"toggle-left\",\n \"toggle-off\",\n \"toggle-on\",\n \"toggle-right\",\n \"toggle-up\",\n \"trademark\",\n \"train\",\n \"transgender\",\n \"transgender-alt\",\n \"trash\",\n \"trash-o\",\n \"tree\",\n \"trello\",\n \"tripadvisor\",\n \"trophy\",\n \"truck\",\n \"try\",\n \"tty\",\n \"tumblr\",\n \"tumblr-square\",\n \"turkish-lira\",\n \"tv\",\n \"twitch\",\n \"twitter\",\n \"twitter-square\",\n \"umbrella\",\n \"underline\",\n \"undo\",\n \"universal-access\",\n \"university\",\n \"unlink\",\n \"unlock\",\n \"unlock-alt\",\n \"unsorted\",\n \"upload\",\n \"usb\",\n \"usd\",\n \"user\",\n \"user-circle\",\n \"user-circle-o\",\n \"user-md\",\n \"user-o\",\n \"user-plus\",\n \"user-secret\",\n \"user-times\",\n \"users\",\n \"vcard\",\n \"vcard-o\",\n \"venus\",\n \"venus-double\",\n \"venus-mars\",\n \"viacoin\",\n \"viadeo\",\n \"viadeo-square\",\n \"video-camera\",\n \"vimeo\",\n \"vimeo-square\",\n \"vine\",\n \"vk\",\n \"volume-control-phone\",\n \"volume-down\",\n \"volume-off\",\n \"volume-up\",\n \"warning\",\n \"wechat\",\n \"weibo\",\n \"weixin\",\n \"whatsapp\",\n \"wheelchair\",\n \"wheelchair-alt\",\n \"wifi\",\n \"wikipedia-w\",\n \"window-close\",\n \"window-close-o\",\n \"window-maximize\",\n \"window-minimize\",\n \"window-restore\",\n \"windows\",\n \"won\",\n \"wordpress\",\n \"wpbeginner\",\n \"wpexplorer\",\n \"wpforms\",\n \"wrench\",\n \"xing\",\n \"xing-square\",\n \"y-combinator\",\n \"y-combinator-square\",\n \"yahoo\",\n \"yc\",\n \"yc-square\",\n \"yelp\",\n \"yen\",\n \"yoast\",\n \"youtube\",\n \"youtube-play\",\n \"youtube-square\",\n ],\n};\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.ImageModule=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\n\\t\\t').replace(/\\t|\\n/g,\"\")},getImageXmlCentered:function getImageXmlCentered(rId,size){return('\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t').replace(/\\t|\\n/g,\"\")},getPptxImageXml:function getPptxImageXml(rId,size,offset){return('\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t').replace(/\\t|\\n/g,\"\")}}},{}],4:[function(require,module,exports){\"use strict\";function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}var memoize=require(\"./memoize\");var DOMParser=require(\"xmldom\").DOMParser;var XMLSerializer=require(\"xmldom\").XMLSerializer;var Errors=require(\"./errors\");var DocUtils={};function parser(tag){return _defineProperty({},\"get\",function get(scope){if(tag===\".\"){return scope}return scope[tag]})}DocUtils.defaults={nullGetter:function nullGetter(part){if(!part.module){return\"undefined\"}if(part.module===\"rawxml\"){return\"\"}return\"\"},parser:memoize(parser),fileType:\"docx\",delimiters:{start:\"{\",end:\"}\"}};DocUtils.mergeObjects=function(){var resObj={};var obj=void 0,keys=void 0;for(var i=0;i\":\">\"};var regexStripRegexp=/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g;DocUtils.escapeRegExp=function(str){return str.replace(regexStripRegexp,\"\\\\$&\")};DocUtils.charMapRegexes=Object.keys(DocUtils.charMap).map(function(endChar){var startChar=DocUtils.charMap[endChar];return{rstart:new RegExp(DocUtils.escapeRegExp(startChar),\"g\"),rend:new RegExp(DocUtils.escapeRegExp(endChar),\"g\"),start:startChar,end:endChar}});DocUtils.wordToUtf8=function(string){var r=void 0;for(var i=0,l=DocUtils.charMapRegexes.length;i\"){return i}}throwXmlTagNotFound({position:\"right\",element:element,parsed:parsed,index:index})};DocUtils.getLeft=function(parsed,element,index){var parts=parsed.slice(0,index);for(var i=parts.length-1;i>=0;i--){var part=parts[i];if(part.value.indexOf(\"<\"+element)===0&&[\">\",\" \"].indexOf(part.value[element.length+1])!==-1){return i}}throwXmlTagNotFound({position:\"left\",element:element,parsed:parsed,index:index})};module.exports=DocUtils;DocUtils.traits=require(\"./traits\");DocUtils.moduleWrapper=require(\"./module-wrapper\")},{\"./errors\":6,\"./memoize\":9,\"./module-wrapper\":11,\"./traits\":20,xmldom:23}],5:[function(require,module,exports){\"use strict\";var _createClass=function(){function defineProperties(target,props){for(var i=0;i0){throw new Error(\"The constructor with parameters have been removed in docxtemplater 3.0, please check the upgrade guide.\")}this.compiled={};this.modules=[];this.setOptions({})}_createClass(Docxtemplater,[{key:\"attachModule\",value:function attachModule(module){this.modules.push(wrapper(module));return this}},{key:\"setOptions\",value:function setOptions(options){var _this=this;this.options=options;Object.keys(DocUtils.defaults).forEach(function(key){var defaultValue=DocUtils.defaults[key];_this[key]=_this.options[key]!=null?_this.options[key]:defaultValue});if(this.fileType===\"docx\"||this.fileType===\"pptx\"){this.fileTypeConfig=Docxtemplater.FileTypeConfig[this.fileType]}this.fileTypeConfig=this.options.fileTypeConfig||this.fileTypeConfig;this.options.xmlFileNames=[];return this}},{key:\"loadZip\",value:function loadZip(zip){if(zip.loadAsync){throw new Error(\"Docxtemplater doesn't handle JSZip version >=3, see changelog\")}this.zip=zip;return this}},{key:\"compileFile\",value:function compileFile(fileName){var currentFile=this.createTemplateClass(fileName);currentFile.parse();this.compiled[fileName]=currentFile}},{key:\"compile\",value:function compile(){this.templatedFiles=this.fileTypeConfig.getTemplatedFiles(this.zip)}},{key:\"render\",value:function render(){var _this2=this;this.modules=this.fileTypeConfig.baseModules.map(function(moduleFunction){return moduleFunction()}).concat(this.modules);this.options=this.modules.reduce(function(options,module){return module.optionsTransformer(options,_this2)},this.options);this.xmlDocuments=this.options.xmlFileNames.reduce(function(xmlDocuments,fileName){var content=_this2.zip.files[fileName].asText();xmlDocuments[fileName]=DocUtils.str2xml(content);return xmlDocuments},{});this.modules.forEach(function(module){module.set({zip:_this2.zip,xmlDocuments:_this2.xmlDocuments,data:_this2.data})});this.compile();this.modules.forEach(function(module){module.set({compiled:_this2.compiled})});this.templatedFiles.forEach(function(fileName){if(_this2.zip.files[fileName]!=null){_this2.compileFile(fileName)}});this.mapper=this.modules.reduce(function(value,module){return module.getRenderedMap(value)},{});Object.keys(this.mapper).forEach(function(to){var mapped=_this2.mapper[to];var from=mapped.from;var currentFile=_this2.compiled[from];currentFile.setTags(mapped.data);currentFile.render();_this2.zip.file(to,currentFile.content)});Object.keys(this.xmlDocuments).forEach(function(fileName){_this2.zip.remove(fileName);var content=DocUtils.encodeUtf8(DocUtils.xml2str(_this2.xmlDocuments[fileName]));return _this2.zip.file(fileName,content,{})});return this}},{key:\"setData\",value:function setData(data){this.data=data;return this}},{key:\"getZip\",value:function getZip(){return this.zip}},{key:\"createTemplateClass\",value:function createTemplateClass(path){var usedData=this.zip.files[path].asText();return this.createTemplateClassFromContent(usedData,path)}},{key:\"createTemplateClassFromContent\",value:function createTemplateClassFromContent(content,filePath){var _this3=this;var xmltOptions={filePath:filePath};Object.keys(DocUtils.defaults).forEach(function(key){xmltOptions[key]=_this3[key]});xmltOptions.fileTypeConfig=this.fileTypeConfig;xmltOptions.modules=this.modules;return new Docxtemplater.XmlTemplater(content,xmltOptions)}},{key:\"getFullText\",value:function getFullText(path){return this.createTemplateClass(path||this.fileTypeConfig.textPath).getFullText()}},{key:\"getTemplatedFiles\",value:function getTemplatedFiles(){this.compile();return this.templatedFiles}}]);return Docxtemplater}();Docxtemplater.DocUtils=require(\"./doc-utils\");Docxtemplater.Errors=require(\"./errors\");Docxtemplater.XmlTemplater=require(\"./xml-templater\");Docxtemplater.FileTypeConfig=require(\"./file-type-config\");Docxtemplater.XmlMatcher=require(\"./xml-matcher\");module.exports=Docxtemplater},{\"./doc-utils\":4,\"./errors\":6,\"./file-type-config\":7,\"./xml-matcher\":21,\"./xml-templater\":22}],6:[function(require,module,exports){\"use strict\";function XTError(message){this.name=\"GenericError\";this.message=message;this.stack=new Error(message).stack}XTError.prototype=Error.prototype;function XTTemplateError(message){this.name=\"TemplateError\";this.message=message;this.stack=new Error(message).stack}XTTemplateError.prototype=new XTError;function XTScopeParserError(message){this.name=\"ScopeParserError\";this.message=message;this.stack=new Error(message).stack}XTScopeParserError.prototype=new XTError;function XTInternalError(message){this.name=\"InternalError\";this.properties={explanation:\"InternalError\"};this.message=message;this.stack=new Error(message).stack}XTInternalError.prototype=new XTError;module.exports={XTError:XTError,XTTemplateError:XTTemplateError,XTInternalError:XTInternalError,XTScopeParserError:XTScopeParserError}},{}],7:[function(require,module,exports){\"use strict\";var loopModule=require(\"./modules/loop\");var spacePreserveModule=require(\"./modules/space-preserve\");var rawXmlModule=require(\"./modules/rawxml\");var expandPairTrait=require(\"./modules/expand-pair-trait\");var render=require(\"./modules/render\");var PptXFileTypeConfig={getTemplatedFiles:function getTemplatedFiles(zip){var slideTemplates=zip.file(/ppt\\/(slides|slideMasters)\\/(slide|slideMaster)\\d+\\.xml/).map(function(file){return file.name});return slideTemplates.concat([\"ppt/presentation.xml\"])},textPath:\"ppt/slides/slide1.xml\",tagsXmlTextArray:[\"a:t\",\"m:t\"],tagsXmlLexedArray:[\"p:sp\",\"a:tc\",\"a:tr\",\"a:table\",\"a:p\",\"a:r\"],tagRawXml:\"p:sp\",tagTextXml:\"a:t\",baseModules:[render,expandPairTrait,rawXmlModule,loopModule]};var DocXFileTypeConfig={getTemplatedFiles:function getTemplatedFiles(zip){var slideTemplates=zip.file(/word\\/(header|footer)\\d+\\.xml/).map(function(file){return file.name});return slideTemplates.concat([\"word/document.xml\"])},textPath:\"word/document.xml\",tagsXmlTextArray:[\"w:t\",\"m:t\"],tagsXmlLexedArray:[\"w:tc\",\"w:tr\",\"w:table\",\"w:p\",\"w:r\"],tagRawXml:\"w:p\",tagTextXml:\"w:t\",baseModules:[render,spacePreserveModule,expandPairTrait,rawXmlModule,loopModule]};module.exports={docx:DocXFileTypeConfig,pptx:PptXFileTypeConfig}},{\"./modules/expand-pair-trait\":12,\"./modules/loop\":13,\"./modules/rawxml\":14,\"./modules/render\":15,\"./modules/space-preserve\":16}],8:[function(require,module,exports){\"use strict\";var Errors=require(\"./errors\");var DocUtils=require(\"./doc-utils\");function inRange(range,match){return range[0]<=match.offset&&match.offset\",cursor);var tagText=content.slice(offset,cursor+1);var _getTag=getTag(tagText),tag=_getTag.tag,position=_getTag.position;var text=allMatches[tag];if(text==null){continue}totalMatches.push({type:\"tag\",position:position,text:text,offset:offset,value:tagText})}return totalMatches}function throwUnopenedTagException(options){var err=new Errors.XTTemplateError(\"Unopened tag\");err.properties={xtag:options.xtag.split(\" \")[0],id:\"unopened_tag\",context:options.xtag,explanation:\"The tag beginning with '\"+options.xtag.substr(0,10)+\"' is unclosed\"};throw err}function throwUnclosedTagException(options){var err=new Errors.XTTemplateError(\"Unclosed tag\");err.properties={xtag:options.xtag.split(\" \")[0].substr(1),id:\"unclosed_tag\",context:options.xtag,explanation:\"The tag beginning with '\"+options.xtag.substr(0,10)+\"' is unclosed\"};throw err}function assertDelimiterOrdered(delimiterMatches,fullText){var inDelimiter=false;var lastDelimiterMatch={offset:0};var xtag=void 0;delimiterMatches.forEach(function(delimiterMatch){xtag=fullText.substr(lastDelimiterMatch.offset,delimiterMatch.offset-lastDelimiterMatch.offset);if(delimiterMatch.position===\"start\"&&inDelimiter||delimiterMatch.position===\"end\"&&!inDelimiter){if(delimiterMatch.position===\"start\"){throwUnclosedTagException({xtag:xtag})}else{throwUnopenedTagException({xtag:xtag})}}inDelimiter=!inDelimiter;lastDelimiterMatch=delimiterMatch});var delimiterMatch={offset:fullText.length};xtag=fullText.substr(lastDelimiterMatch.offset,delimiterMatch.offset-lastDelimiterMatch.offset);if(inDelimiter){throwUnclosedTagException({xtag:xtag})}}function getAllIndexes(arr,val,position){var indexes=[];var offset=-1;do{offset=arr.indexOf(val,offset+1);if(offset!==-1){indexes.push({offset:offset,position:position})}}while(offset!==-1);return indexes}function Reader(innerContentParts){var _this=this;this.innerContentParts=innerContentParts;this.full=\"\";this.parseDelimiters=function(delimiters){_this.full=_this.innerContentParts.join(\"\");var offset=0;_this.ranges=_this.innerContentParts.map(function(part){offset+=part.length;return offset-part.length});var delimiterMatches=DocUtils.concatArrays([getAllIndexes(_this.full,delimiters.start,\"start\"),getAllIndexes(_this.full,delimiters.end,\"end\")]).sort(offsetSort);assertDelimiterOrdered(delimiterMatches,_this.full);var delimiterLength={start:delimiters.start.length,end:delimiters.end.length};var cutNext=0;var delimiterIndex=0;_this.parsed=_this.ranges.map(function(offset,i){var range=[offset,offset+this.innerContentParts[i].length];var partContent=this.innerContentParts[i];var delimitersInOffset=[];while(delimiterIndex0){cursor=cutNext;cutNext=0}delimitersInOffset.forEach(function(delimiterInOffset){var value=partContent.substr(cursor,delimiterInOffset.offset-offset-cursor);if(value.length>0){parts.push({type:\"content\",value:value})}parts.push({type:\"delimiter\",position:delimiterInOffset.position});cursor=delimiterInOffset.offset-offset+delimiterLength[delimiterInOffset.position]});cutNext=cursor-partContent.length;var value=partContent.substr(cursor);if(value.length>0){parts.push({type:\"content\",value:value})}return parts},_this)}}module.exports={parse:function parse(xmlparsed,delimiters){var inTextTag=false;var innerContentParts=[];xmlparsed.forEach(function(part){inTextTag=updateInTextTag(part,inTextTag);if(inTextTag&&part.type===\"content\"){innerContentParts.push(part.value)}});var reader=new Reader(innerContentParts);reader.parseDelimiters(delimiters);var newArray=[];var index=0;xmlparsed.forEach(function(part){inTextTag=updateInTextTag(part,inTextTag);if(part.type===\"content\"){part.position=inTextTag?\"insidetag\":\"outsidetag\"}if(inTextTag&&part.type===\"content\"){Array.prototype.push.apply(newArray,reader.parsed[index].map(function(p){if(p.type===\"content\"){p.position=\"insidetag\"}return p}));index++}else{newArray.push(part)}});return newArray},xmlparse:function xmlparse(content,xmltags){var matches=tagMatcher(content,xmltags.text,xmltags.other);var cursor=0;var parsed=matches.reduce(function(parsed,match){var value=content.substr(cursor,match.offset-cursor);if(value.length>0){parsed.push({type:\"content\",value:value})}cursor=match.offset+match.value.length;delete match.offset;if(match.value.length>0){parsed.push(match)}return parsed},[]);var value=content.substr(cursor);if(value.length>0){parsed.push({type:\"content\",value:value})}return parsed}}},{\"./doc-utils\":4,\"./errors\":6}],9:[function(require,module,exports){\"use strict\";function memoize(func){var stringifyJson=JSON.stringify,cache={};function cachedfun(){var hash=stringifyJson(arguments);return hash in cache?cache[hash]:cache[hash]=func.apply(this,arguments)}return cachedfun}module.exports=memoize},{}],10:[function(require,module,exports){\"use strict\";function getMinFromArrays(arrays,state){var minIndex=-1;for(var i=0,l=arrays.length;i=arrays[i].length){continue}if(minIndex===-1||arrays[i][state[i]].offset0});var resultArray=new Array(totalLength);var state=arrays.map(function(){return 0});var i=0;while(i<=totalLength-1){var arrayIndex=getMinFromArrays(arrays,state);resultArray[i]=arrays[arrayIndex][state[arrayIndex]];state[arrayIndex]++;i++}return resultArray}},{}],11:[function(require,module,exports){\"use strict\";function emptyFun(){}function identity(i){return i}module.exports=function(module){var defaults={set:emptyFun,parse:emptyFun,render:emptyFun,getTraits:emptyFun,optionsTransformer:identity,getRenderedMap:identity,postparse:identity};if(Object.keys(defaults).every(function(key){return!module[key]})){throw new Error(\"This module cannot be wrapped, because it doesn't define any of the necessary functions\")}Object.keys(defaults).forEach(function(key){module[key]=module[key]||defaults[key]});return module}},{}],12:[function(require,module,exports){\"use strict\";var traitName=\"expandPair\";var mergeSort=require(\"../mergesort\");var DocUtils=require(\"../doc-utils\");var wrapper=require(\"../module-wrapper\");var _require=require(\"../traits\"),getExpandToDefault=_require.getExpandToDefault;var Errors=require(\"../errors\");function throwUnmatchedLoopException(options){var location=options.location;var t=location===\"start\"?\"unclosed\":\"unopened\";var T=location===\"start\"?\"Unclosed\":\"Unopened\";var err=new Errors.XTTemplateError(T+\" loop\");var tag=options.part.value;err.properties={id:t+\"_loop\",explanation:\"The loop with tag \"+tag+\" is \"+t,xtag:tag};throw err}function throwClosingTagNotMatchOpeningTag(options){var tags=options.tags;var err=new Errors.XTTemplateError(\"Closing tag does not match opening tag\");err.properties={id:\"closing_tag_does_not_match_opening_tag\",explanation:'The tag \"'+tags[0].value+'\" is closed by the tag \"'+tags[1].value+'\"',openingtag:tags[0].value,closingtag:tags[1].value};throw err}function getOpenCountChange(part){switch(part.location){case\"start\":return 1;case\"end\":return-1;default:throw new Error(\"Location should be one of 'start' or 'end' (given : \"+part.location+\")\")}}function getPairs(traits){if(traits.length===0){return[]}var countOpen=1;var firstTrait=traits[0];for(var i=1;i\"){inChunk=true}if(inChunk){if(part.type===\"placeholder\"&&!part.module){chunk[0].value=''}chunk.push(part)}else{parsed.push(part)}if(part.type===\"tag\"&&part.position===\"end\"&&part.text&&part.value===\"\"){Array.prototype.push.apply(parsed,chunk);inChunk=false;chunk=[]}return parsed},[]);Array.prototype.push.apply(result,chunk);return result}};module.exports=function(){return wrapper(spacePreserve)}},{\"../module-wrapper\":11}],17:[function(require,module,exports){\"use strict\";var DocUtils=require(\"./doc-utils\");var parser={postparse:function postparse(parsed,modules){function getTraits(traitName,parsed){return modules.map(function(module){return module.getTraits(traitName,parsed)})}function postparse(parsed){return modules.reduce(function(parsed,module){return module.postparse(parsed,{postparse:postparse,getTraits:getTraits})},parsed)}return postparse(parsed)},parse:function parse(lexed,modules){function moduleParse(placeHolderContent,parsed){var moduleParsed=void 0;for(var i=0,l=modules.length;i0){return this.getValue(tag,this.num-1)}return result}},{key:\"createSubScopeManager\",value:function createSubScopeManager(scope,tag){var options={scopePath:this.scopePath.slice(0),scopeList:this.scopeList.slice(0)};options.parser=this.parser;options.scopeList=this.scopeList.concat(scope);options.scopePath=this.scopePath.concat(tag);return new ScopeManager(options)}}]);return ScopeManager}();ScopeManager.createBaseScopeManager=function(_ref){var parser=_ref.parser,tags=_ref.tags;var options={parser:parser,tags:tags};options.scopePath=[];options.scopeList=[tags];return new ScopeManager(options)};module.exports=ScopeManager},{\"./errors\":6}],20:[function(require,module,exports){\"use strict\";var DocUtils=require(\"./doc-utils\");var Errors=require(\"./errors\");function throwRawTagNotInParagraph(options){var err=new Errors.XTTemplateError(\"Raw tag not in paragraph\");var tag=options.part.value;err.properties={id:\"raw_tag_outerxml_invalid\",explanation:'The tag \"'+tag+'\"',rootError:options.rootError,xtag:tag};throw err}function lastTagIsOpenTag(array,tag){if(array.length===0){return false}var lastTag=array[array.length-1];var innerLastTag=lastTag.tag.substr(1);var innerCurrentTag=tag.substr(2,tag.length-3);return innerLastTag.indexOf(innerCurrentTag)===0}function addTag(array,tag){array.push({tag:tag});return array}function getListXmlElements(parts){var tags=parts.filter(function(part){return part.type===\"tag\"}).map(function(part){return part.value});var result=[];for(var i=0,tag;i\")===-1){res.content.replace(/^()([^<>]*)$/,replacerUnshift)}var r=new RegExp(\"^()([^<]+)\");res.content.replace(r,replacerUnshift);function replacerPush(){var pn={array:Array.prototype.slice.call(arguments)};pn.array.pop();var offset=pn.array.pop();pn.offset=offset;pn.last=true;res.matches.push(pn);res.charactersAdded.push(0);return res.charactersAddedCumulative.push(0)}r=new RegExp(\"(<(?:\"+res.tagsXmlArrayJoined+\")[^>]*>)([^>]+)$\");res.content.replace(r,replacerPush);return res}function xmlMatcher(content,tagsXmlArray){var res={};res.content=content;res.tagsXmlArray=tagsXmlArray;res.tagsXmlArrayJoined=res.tagsXmlArray.join(\"|\");var regexp=new RegExp(\"(<(?:\"+res.tagsXmlArrayJoined+\")[^>]*>)([^<>]*)\",\"g\");res.matches=DocUtils.pregMatchAll(regexp,res.content);res.charactersAddedCumulative=res.matches.map(function(){return 0});res.charactersAdded=res.matches.map(function(){return 0});return handleRecursiveCase(res)}var memoized=memoize(xmlMatcher);module.exports=function(content,tagsXmlArray){return DocUtils.cloneDeep(memoized(content,tagsXmlArray))}},{\"./doc-utils\":4,\"./memoize\":9}],22:[function(require,module,exports){\"use strict\";var _createClass=function(){function defineProperties(target,props){for(var i=0;i\",amp:\"&\",quot:'\"',apos:\"'\"};if(locator){domBuilder.setDocumentLocator(locator)}sax.errorHandler=buildErrorHandler(errorHandler,domBuilder,locator);sax.domBuilder=options.domBuilder||domBuilder;if(/\\/x?html?$/.test(mimeType)){entityMap.nbsp=\" \";entityMap.copy=\"©\";defaultNSMap[\"\"]=\"http://www.w3.org/1999/xhtml\"}defaultNSMap.xml=defaultNSMap.xml||\"http://www.w3.org/XML/1998/namespace\";if(source){sax.parse(source,defaultNSMap,entityMap)}else{sax.errorHandler.error(\"invalid doc source\")}return domBuilder.doc};function buildErrorHandler(errorImpl,domBuilder,locator){if(!errorImpl){if(domBuilder instanceof DOMHandler){return domBuilder}errorImpl=domBuilder}var errorHandler={};var isCallback=errorImpl instanceof Function;locator=locator||{};function build(key){var fn=errorImpl[key];if(!fn&&isCallback){fn=errorImpl.length==2?function(msg){errorImpl(key,msg)}:errorImpl}errorHandler[key]=fn&&function(msg){fn(\"[xmldom \"+key+\"]\\t\"+msg+_locator(locator))}||function(){}}build(\"warning\");build(\"error\");build(\"fatalError\");return errorHandler}function DOMHandler(){this.cdata=false}function position(locator,node){node.lineNumber=locator.lineNumber;node.columnNumber=locator.columnNumber}DOMHandler.prototype={startDocument:function(){this.doc=(new DOMImplementation).createDocument(null,null,null);if(this.locator){this.doc.documentURI=this.locator.systemId}},startElement:function(namespaceURI,localName,qName,attrs){var doc=this.doc;var el=doc.createElementNS(namespaceURI,qName||localName);var len=attrs.length;appendElement(this,el);this.currentElement=el;this.locator&&position(this.locator,el);for(var i=0;i=start+length||start){return new java.lang.String(chars,start,length)+\"\"}return chars}}\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){DOMHandler.prototype[key]=function(){return null}});function appendElement(hander,node){if(!hander.currentElement){hander.doc.appendChild(node)}else{hander.currentElement.appendChild(node)}}var XMLReader=require(\"./sax\").XMLReader;var DOMImplementation=exports.DOMImplementation=require(\"./dom\").DOMImplementation;exports.XMLSerializer=require(\"./dom\").XMLSerializer;exports.DOMParser=DOMParser},{\"./dom\":24,\"./sax\":25}],24:[function(require,module,exports){function copy(src,dest){for(var p in src){dest[p]=src[p]}}function _extends(Class,Super){var pt=Class.prototype;if(Object.create){var ppt=Object.create(Super.prototype);pt.__proto__=ppt}if(!(pt instanceof Super)){function t(){}t.prototype=Super.prototype;t=new t;copy(pt,t);Class.prototype=pt=t}if(pt.constructor!=Class){if(typeof Class!=\"function\"){console.error(\"unknow Class:\"+Class)}pt.constructor=Class}}var htmlns=\"http://www.w3.org/1999/xhtml\";var NodeType={};var ELEMENT_NODE=NodeType.ELEMENT_NODE=1;var ATTRIBUTE_NODE=NodeType.ATTRIBUTE_NODE=2;var TEXT_NODE=NodeType.TEXT_NODE=3;var CDATA_SECTION_NODE=NodeType.CDATA_SECTION_NODE=4;var ENTITY_REFERENCE_NODE=NodeType.ENTITY_REFERENCE_NODE=5;var ENTITY_NODE=NodeType.ENTITY_NODE=6;var PROCESSING_INSTRUCTION_NODE=NodeType.PROCESSING_INSTRUCTION_NODE=7;var COMMENT_NODE=NodeType.COMMENT_NODE=8;var DOCUMENT_NODE=NodeType.DOCUMENT_NODE=9;var DOCUMENT_TYPE_NODE=NodeType.DOCUMENT_TYPE_NODE=10;var DOCUMENT_FRAGMENT_NODE=NodeType.DOCUMENT_FRAGMENT_NODE=11;var NOTATION_NODE=NodeType.NOTATION_NODE=12;var ExceptionCode={};var ExceptionMessage={};var INDEX_SIZE_ERR=ExceptionCode.INDEX_SIZE_ERR=(ExceptionMessage[1]=\"Index size error\",1);var DOMSTRING_SIZE_ERR=ExceptionCode.DOMSTRING_SIZE_ERR=(ExceptionMessage[2]=\"DOMString size error\",2);var HIERARCHY_REQUEST_ERR=ExceptionCode.HIERARCHY_REQUEST_ERR=(ExceptionMessage[3]=\"Hierarchy request error\",3);var WRONG_DOCUMENT_ERR=ExceptionCode.WRONG_DOCUMENT_ERR=(ExceptionMessage[4]=\"Wrong document\",4);var INVALID_CHARACTER_ERR=ExceptionCode.INVALID_CHARACTER_ERR=(ExceptionMessage[5]=\"Invalid character\",5);var NO_DATA_ALLOWED_ERR=ExceptionCode.NO_DATA_ALLOWED_ERR=(ExceptionMessage[6]=\"No data allowed\",6);var NO_MODIFICATION_ALLOWED_ERR=ExceptionCode.NO_MODIFICATION_ALLOWED_ERR=(ExceptionMessage[7]=\"No modification allowed\",7);var NOT_FOUND_ERR=ExceptionCode.NOT_FOUND_ERR=(ExceptionMessage[8]=\"Not found\",8);var NOT_SUPPORTED_ERR=ExceptionCode.NOT_SUPPORTED_ERR=(ExceptionMessage[9]=\"Not supported\",9);var INUSE_ATTRIBUTE_ERR=ExceptionCode.INUSE_ATTRIBUTE_ERR=(ExceptionMessage[10]=\"Attribute in use\",10);var INVALID_STATE_ERR=ExceptionCode.INVALID_STATE_ERR=(ExceptionMessage[11]=\"Invalid state\",11);var SYNTAX_ERR=ExceptionCode.SYNTAX_ERR=(ExceptionMessage[12]=\"Syntax error\",12);var INVALID_MODIFICATION_ERR=ExceptionCode.INVALID_MODIFICATION_ERR=(ExceptionMessage[13]=\"Invalid modification\",13);var NAMESPACE_ERR=ExceptionCode.NAMESPACE_ERR=(ExceptionMessage[14]=\"Invalid namespace\",14);var INVALID_ACCESS_ERR=ExceptionCode.INVALID_ACCESS_ERR=(ExceptionMessage[15]=\"Invalid access\",15);function DOMException(code,message){if(message instanceof Error){var error=message}else{error=this;Error.call(this,ExceptionMessage[code]);this.message=ExceptionMessage[code];if(Error.captureStackTrace)Error.captureStackTrace(this,DOMException)}error.code=code;if(message)this.message=this.message+\": \"+message;return error}DOMException.prototype=Error.prototype;copy(ExceptionCode,DOMException);function NodeList(){}NodeList.prototype={length:0,item:function(index){return this[index]||null},toString:function(isHTML,nodeFilter){for(var buf=[],i=0;i=0){var lastIndex=list.length-1;while(i0},lookupPrefix:function(namespaceURI){var el=this;while(el){var map=el._nsMap;if(map){for(var n in map){if(map[n]==namespaceURI){return n}}}el=el.nodeType==ATTRIBUTE_NODE?el.ownerDocument:el.parentNode}return null},lookupNamespaceURI:function(prefix){var el=this;while(el){var map=el._nsMap;if(map){if(prefix in map){return map[prefix]}}el=el.nodeType==ATTRIBUTE_NODE?el.ownerDocument:el.parentNode}return null},isDefaultNamespace:function(namespaceURI){var prefix=this.lookupPrefix(namespaceURI);return prefix==null}};function _xmlEncoder(c){return c==\"<\"&&\"<\"||c==\">\"&&\">\"||c==\"&\"&&\"&\"||c=='\"'&&\""\"||\"&#\"+c.charCodeAt()+\";\"}copy(NodeType,Node);copy(NodeType,Node.prototype);function _visitNode(node,callback){if(callback(node)){return true}if(node=node.firstChild){do{if(_visitNode(node,callback)){return true}}while(node=node.nextSibling)}}function Document(){}function _onAddAttribute(doc,el,newAttr){doc&&doc._inc++;var ns=newAttr.namespaceURI;if(ns==\"http://www.w3.org/2000/xmlns/\"){el._nsMap[newAttr.prefix?newAttr.localName:\"\"]=newAttr.value}}function _onRemoveAttribute(doc,el,newAttr,remove){doc&&doc._inc++;var ns=newAttr.namespaceURI;if(ns==\"http://www.w3.org/2000/xmlns/\"){delete el._nsMap[newAttr.prefix?newAttr.localName:\"\"]}}function _onUpdateChild(doc,el,newChild){if(doc&&doc._inc){doc._inc++;var cs=el.childNodes;if(newChild){cs[cs.length++]=newChild}else{var child=el.firstChild;var i=0;while(child){cs[i++]=child;child=child.nextSibling}cs.length=i}}}function _removeChild(parentNode,child){var previous=child.previousSibling;var next=child.nextSibling;if(previous){previous.nextSibling=next}else{parentNode.firstChild=next}if(next){next.previousSibling=previous}else{parentNode.lastChild=previous}_onUpdateChild(parentNode.ownerDocument,parentNode);return child}function _insertBefore(parentNode,newChild,nextChild){var cp=newChild.parentNode;if(cp){cp.removeChild(newChild)}if(newChild.nodeType===DOCUMENT_FRAGMENT_NODE){var newFirst=newChild.firstChild;if(newFirst==null){return newChild}var newLast=newChild.lastChild}else{newFirst=newLast=newChild}var pre=nextChild?nextChild.previousSibling:parentNode.lastChild;newFirst.previousSibling=pre;newLast.nextSibling=nextChild;if(pre){pre.nextSibling=newFirst}else{parentNode.firstChild=newFirst}if(nextChild==null){parentNode.lastChild=newLast}else{nextChild.previousSibling=newLast}do{newFirst.parentNode=parentNode}while(newFirst!==newLast&&(newFirst=newFirst.nextSibling));_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);if(newChild.nodeType==DOCUMENT_FRAGMENT_NODE){newChild.firstChild=newChild.lastChild=null}return newChild}function _appendSingleChild(parentNode,newChild){var cp=newChild.parentNode;if(cp){var pre=parentNode.lastChild;cp.removeChild(newChild);var pre=parentNode.lastChild}var pre=parentNode.lastChild;newChild.parentNode=parentNode;newChild.previousSibling=pre;newChild.nextSibling=null;if(pre){pre.nextSibling=newChild}else{parentNode.firstChild=newChild}parentNode.lastChild=newChild;_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);return newChild}Document.prototype={nodeName:\"#document\",nodeType:DOCUMENT_NODE,doctype:null,documentElement:null,_inc:1,insertBefore:function(newChild,refChild){if(newChild.nodeType==DOCUMENT_FRAGMENT_NODE){var child=newChild.firstChild;while(child){var next=child.nextSibling;this.insertBefore(child,refChild);child=next}return newChild}if(this.documentElement==null&&newChild.nodeType==ELEMENT_NODE){this.documentElement=newChild}return _insertBefore(this,newChild,refChild),newChild.ownerDocument=this,newChild},removeChild:function(oldChild){if(this.documentElement==oldChild){this.documentElement=null}return _removeChild(this,oldChild)},importNode:function(importedNode,deep){return importNode(this,importedNode,deep)},getElementById:function(id){var rtv=null;_visitNode(this.documentElement,function(node){if(node.nodeType==ELEMENT_NODE){if(node.getAttribute(\"id\")==id){rtv=node;return true}}});return rtv},createElement:function(tagName){var node=new Element;node.ownerDocument=this;node.nodeName=tagName;node.tagName=tagName;node.childNodes=new NodeList;var attrs=node.attributes=new NamedNodeMap;attrs._ownerElement=node;return node},createDocumentFragment:function(){var node=new DocumentFragment;node.ownerDocument=this;node.childNodes=new NodeList;return node},createTextNode:function(data){var node=new Text;node.ownerDocument=this;node.appendData(data);return node},createComment:function(data){var node=new Comment;node.ownerDocument=this;node.appendData(data);return node},createCDATASection:function(data){var node=new CDATASection;node.ownerDocument=this;node.appendData(data);return node},createProcessingInstruction:function(target,data){var node=new ProcessingInstruction;node.ownerDocument=this;node.tagName=node.target=target;node.nodeValue=node.data=data;return node},createAttribute:function(name){var node=new Attr;node.ownerDocument=this;node.name=name;node.nodeName=name;node.localName=name;node.specified=true;return node},createEntityReference:function(name){var node=new EntityReference;node.ownerDocument=this;node.nodeName=name;return node},createElementNS:function(namespaceURI,qualifiedName){var node=new Element;var pl=qualifiedName.split(\":\");var attrs=node.attributes=new NamedNodeMap;node.childNodes=new NodeList;node.ownerDocument=this;node.nodeName=qualifiedName;node.tagName=qualifiedName;node.namespaceURI=namespaceURI;if(pl.length==2){node.prefix=pl[0];node.localName=pl[1]}else{node.localName=qualifiedName}attrs._ownerElement=node;return node},createAttributeNS:function(namespaceURI,qualifiedName){var node=new Attr;var pl=qualifiedName.split(\":\");node.ownerDocument=this;node.nodeName=qualifiedName;node.name=qualifiedName;node.namespaceURI=namespaceURI;node.specified=true;if(pl.length==2){node.prefix=pl[0];node.localName=pl[1]}else{node.localName=qualifiedName}return node}};_extends(Document,Node);function Element(){this._nsMap={}}Element.prototype={nodeType:ELEMENT_NODE,hasAttribute:function(name){return this.getAttributeNode(name)!=null},getAttribute:function(name){var attr=this.getAttributeNode(name);return attr&&attr.value||\"\"},getAttributeNode:function(name){return this.attributes.getNamedItem(name)},setAttribute:function(name,value){var attr=this.ownerDocument.createAttribute(name);attr.value=attr.nodeValue=\"\"+value;this.setAttributeNode(attr)},removeAttribute:function(name){var attr=this.getAttributeNode(name);attr&&this.removeAttributeNode(attr)},appendChild:function(newChild){if(newChild.nodeType===DOCUMENT_FRAGMENT_NODE){return this.insertBefore(newChild,null)}else{return _appendSingleChild(this,newChild)}},setAttributeNode:function(newAttr){return this.attributes.setNamedItem(newAttr)},setAttributeNodeNS:function(newAttr){return this.attributes.setNamedItemNS(newAttr)},removeAttributeNode:function(oldAttr){return this.attributes.removeNamedItem(oldAttr.nodeName)},removeAttributeNS:function(namespaceURI,localName){var old=this.getAttributeNodeNS(namespaceURI,localName);old&&this.removeAttributeNode(old)},hasAttributeNS:function(namespaceURI,localName){return this.getAttributeNodeNS(namespaceURI,localName)!=null},getAttributeNS:function(namespaceURI,localName){var attr=this.getAttributeNodeNS(namespaceURI,localName);return attr&&attr.value||\"\"},setAttributeNS:function(namespaceURI,qualifiedName,value){var attr=this.ownerDocument.createAttributeNS(namespaceURI,qualifiedName);attr.value=attr.nodeValue=\"\"+value;this.setAttributeNode(attr)},getAttributeNodeNS:function(namespaceURI,localName){return this.attributes.getNamedItemNS(namespaceURI,localName)},getElementsByTagName:function(tagName){return new LiveNodeList(this,function(base){var ls=[];_visitNode(base,function(node){if(node!==base&&node.nodeType==ELEMENT_NODE&&(tagName===\"*\"||node.tagName==tagName)){ls.push(node)}});return ls})},getElementsByTagNameNS:function(namespaceURI,localName){return new LiveNodeList(this,function(base){var ls=[];_visitNode(base,function(node){if(node!==base&&node.nodeType===ELEMENT_NODE&&(namespaceURI===\"*\"||node.namespaceURI===namespaceURI)&&(localName===\"*\"||node.localName==localName)){ls.push(node)}});return ls})}};Document.prototype.getElementsByTagName=Element.prototype.getElementsByTagName;Document.prototype.getElementsByTagNameNS=Element.prototype.getElementsByTagNameNS;_extends(Element,Node);function Attr(){}Attr.prototype.nodeType=ATTRIBUTE_NODE;_extends(Attr,Node);function CharacterData(){}CharacterData.prototype={data:\"\",substringData:function(offset,count){return this.data.substring(offset,offset+count)},appendData:function(text){text=this.data+text;this.nodeValue=this.data=text;this.length=text.length},insertData:function(offset,text){this.replaceData(offset,0,text)},appendChild:function(newChild){throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])},deleteData:function(offset,count){this.replaceData(offset,count,\"\")},replaceData:function(offset,count,text){var start=this.data.substring(0,offset);var end=this.data.substring(offset+count);text=start+text+end;this.nodeValue=this.data=text;this.length=text.length}};_extends(CharacterData,Node);function Text(){}Text.prototype={nodeName:\"#text\",nodeType:TEXT_NODE,splitText:function(offset){var text=this.data;var newText=text.substring(offset);text=text.substring(0,offset);this.data=this.nodeValue=text;this.length=text.length;var newNode=this.ownerDocument.createTextNode(newText);if(this.parentNode){this.parentNode.insertBefore(newNode,this.nextSibling)}return newNode}};_extends(Text,CharacterData);function Comment(){}Comment.prototype={nodeName:\"#comment\",nodeType:COMMENT_NODE};_extends(Comment,CharacterData);function CDATASection(){}CDATASection.prototype={nodeName:\"#cdata-section\",nodeType:CDATA_SECTION_NODE};_extends(CDATASection,CharacterData);function DocumentType(){}DocumentType.prototype.nodeType=DOCUMENT_TYPE_NODE;_extends(DocumentType,Node);function Notation(){}Notation.prototype.nodeType=NOTATION_NODE;_extends(Notation,Node);function Entity(){}Entity.prototype.nodeType=ENTITY_NODE;_extends(Entity,Node);function EntityReference(){}EntityReference.prototype.nodeType=ENTITY_REFERENCE_NODE;_extends(EntityReference,Node);function DocumentFragment(){}DocumentFragment.prototype.nodeName=\"#document-fragment\";DocumentFragment.prototype.nodeType=DOCUMENT_FRAGMENT_NODE;_extends(DocumentFragment,Node);function ProcessingInstruction(){}ProcessingInstruction.prototype.nodeType=PROCESSING_INSTRUCTION_NODE;_extends(ProcessingInstruction,Node);function XMLSerializer(){}XMLSerializer.prototype.serializeToString=function(node,isHtml,nodeFilter){return nodeSerializeToString.call(node,isHtml,nodeFilter)};Node.prototype.toString=nodeSerializeToString;function nodeSerializeToString(isHtml,nodeFilter){var buf=[];var refNode=this.nodeType==9?this.documentElement:this;var prefix=refNode.prefix;var uri=refNode.namespaceURI;if(uri&&prefix==null){var prefix=refNode.lookupPrefix(uri);if(prefix==null){var visibleNamespaces=[{namespace:uri,prefix:null}]}}serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);return buf.join(\"\")}function needNamespaceDefine(node,isHTML,visibleNamespaces){var prefix=node.prefix||\"\";var uri=node.namespaceURI;if(!prefix&&!uri){return false}if(prefix===\"xml\"&&uri===\"http://www.w3.org/XML/1998/namespace\"||uri==\"http://www.w3.org/2000/xmlns/\"){return false}var i=visibleNamespaces.length;while(i--){var ns=visibleNamespaces[i];if(ns.prefix==prefix){return ns.namespace!=uri}}return true}function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){if(nodeFilter){node=nodeFilter(node);if(node){if(typeof node==\"string\"){buf.push(node);return}}else{return}}switch(node.nodeType){case ELEMENT_NODE:if(!visibleNamespaces)visibleNamespaces=[];var startVisibleNamespaces=visibleNamespaces.length;var attrs=node.attributes;var len=attrs.length;var child=node.firstChild;var nodeName=node.tagName;isHTML=htmlns===node.namespaceURI||isHTML;buf.push(\"<\",nodeName);for(var i=0;i\");if(isHTML&&/^script$/i.test(nodeName)){while(child){if(child.data){buf.push(child.data)}else{serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces)}child=child.nextSibling}}else{while(child){serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);child=child.nextSibling}}buf.push(\"\")}else{buf.push(\"/>\")}return;case DOCUMENT_NODE:case DOCUMENT_FRAGMENT_NODE:var child=node.firstChild;while(child){serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);child=child.nextSibling}return;case ATTRIBUTE_NODE:return buf.push(\" \",node.name,'=\"',node.value.replace(/[<&\"]/g,_xmlEncoder),'\"');case TEXT_NODE:return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));case CDATA_SECTION_NODE:return buf.push(\"\");case COMMENT_NODE:return buf.push(\"\");case DOCUMENT_TYPE_NODE:var pubid=node.publicId;var sysid=node.systemId;buf.push(\"')}else if(sysid&&sysid!=\".\"){buf.push(' SYSTEM \"',sysid,'\">')}else{var sub=node.internalSubset;if(sub){buf.push(\" [\",sub,\"]\")}buf.push(\">\")}return;case PROCESSING_INSTRUCTION_NODE:return buf.push(\"\");case ENTITY_REFERENCE_NODE:return buf.push(\"&\",node.nodeName,\";\");default:buf.push(\"??\",node.nodeName)}}function importNode(doc,node,deep){var node2;switch(node.nodeType){case ELEMENT_NODE:node2=node.cloneNode(false);node2.ownerDocument=doc;case DOCUMENT_FRAGMENT_NODE:break;case ATTRIBUTE_NODE:deep=true;break}if(!node2){node2=node.cloneNode(false)}node2.ownerDocument=doc;node2.parentNode=null;if(deep){var child=node.firstChild;while(child){node2.appendChild(importNode(doc,child,deep));child=child.nextSibling}}return node2}function cloneNode(doc,node,deep){var node2=new node.constructor;for(var n in node){var v=node[n];if(typeof v!=\"object\"){if(v!=node2[n]){node2[n]=v}}}if(node.childNodes){node2.childNodes=new NodeList}node2.ownerDocument=doc;switch(node2.nodeType){case ELEMENT_NODE:var attrs=node.attributes;var attrs2=node2.attributes=new NamedNodeMap;var len=attrs.length;attrs2._ownerElement=node2;for(var i=0;i65535){code-=65536;var surrogate1=55296+(code>>10),surrogate2=56320+(code&1023);return String.fromCharCode(surrogate1,surrogate2)}else{return String.fromCharCode(code)}}function entityReplacer(a){var k=a.slice(1,-1);if(k in entityMap){return entityMap[k]}else if(k.charAt(0)===\"#\"){return fixedFromCharCode(parseInt(k.substr(1).replace(\"x\",\"0x\")))}else{errorHandler.error(\"entity not found:\"+a);return a}}function appendText(end){if(end>start){var xt=source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);locator&&position(start);domBuilder.characters(xt,0,end-start);start=end}}function position(p,m){while(p>=lineEnd&&(m=linePattern.exec(source))){lineStart=m.index;lineEnd=lineStart+m[0].length;locator.lineNumber++}locator.columnNumber=p-lineStart+1}var lineStart=0;var lineEnd=0;var linePattern=/.*(?:\\r\\n?|\\n)|.*$/g;var locator=domBuilder.locator;var parseStack=[{currentNSMap:defaultNSMapCopy}];var closeMap={};var start=0;while(true){try{var tagStart=source.indexOf(\"<\",start);if(tagStart<0){if(!source.substr(start).match(/^\\s*$/)){var doc=domBuilder.doc;var text=doc.createTextNode(source.substr(start));doc.appendChild(text);domBuilder.currentElement=text}return}if(tagStart>start){appendText(tagStart)}switch(source.charAt(tagStart+1)){case\"/\":var end=source.indexOf(\">\",tagStart+3);var tagName=source.substring(tagStart+2,end);var config=parseStack.pop();if(end<0){tagName=source.substring(tagStart+2).replace(/[\\s<].*/,\"\");errorHandler.error(\"end tag name: \"+tagName+\" is not complete:\"+config.tagName);end=tagStart+1+tagName.length}else if(tagName.match(/\\sstart){start=end}else{appendText(Math.max(tagStart,start)+1)}}}function copyLocator(f,t){t.lineNumber=f.lineNumber;t.columnNumber=f.columnNumber;return t}function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){var attrName;var value;var p=++start;var s=S_TAG;while(true){var c=source.charAt(p);switch(c){case\"=\":if(s===S_ATTR){attrName=source.slice(start,p);s=S_EQ}else if(s===S_ATTR_SPACE){s=S_EQ}else{throw new Error(\"attribute equal must after attrName\")}break;case\"'\":case'\"':if(s===S_EQ||s===S_ATTR){if(s===S_ATTR){errorHandler.warning('attribute value must after \"=\"');attrName=source.slice(start,p)}start=p+1;p=source.indexOf(c,start);if(p>0){value=source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);el.add(attrName,value,start-1);s=S_ATTR_END}else{throw new Error(\"attribute value no end '\"+c+\"' match\")}}else if(s==S_ATTR_NOQUOT_VALUE){value=source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);el.add(attrName,value,start);errorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+\")!!\");start=p+1;s=S_ATTR_END}else{throw new Error('attribute value must after \"=\"')}break;case\"/\":switch(s){case S_TAG:el.setTagName(source.slice(start,p));case S_ATTR_END:case S_TAG_SPACE:case S_TAG_CLOSE:s=S_TAG_CLOSE;el.closed=true;case S_ATTR_NOQUOT_VALUE:case S_ATTR:case S_ATTR_SPACE:break;default:throw new Error(\"attribute invalid close char('/')\")}break;case\"\":errorHandler.error(\"unexpected end of input\");if(s==S_TAG){el.setTagName(source.slice(start,p))}return p;case\">\":switch(s){case S_TAG:el.setTagName(source.slice(start,p));case S_ATTR_END:case S_TAG_SPACE:case S_TAG_CLOSE:break;case S_ATTR_NOQUOT_VALUE:case S_ATTR:value=source.slice(start,p);if(value.slice(-1)===\"/\"){el.closed=true;value=value.slice(0,-1)}case S_ATTR_SPACE:if(s===S_ATTR_SPACE){value=attrName}if(s==S_ATTR_NOQUOT_VALUE){errorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');el.add(attrName,value.replace(/&#?\\w+;/g,entityReplacer),start)}else{if(currentNSMap[\"\"]!==\"http://www.w3.org/1999/xhtml\"||!value.match(/^(?:disabled|checked|selected)$/i)){errorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')}el.add(value,value,start)}break;case S_EQ:throw new Error(\"attribute value missed!!\")}return p;case\"€\":c=\" \";default:if(c<=\" \"){switch(s){case S_TAG:el.setTagName(source.slice(start,p));s=S_TAG_SPACE;break;case S_ATTR:attrName=source.slice(start,p);s=S_ATTR_SPACE;break;case S_ATTR_NOQUOT_VALUE:var value=source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);errorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');el.add(attrName,value,start);case S_ATTR_END:s=S_TAG_SPACE;break}}else{switch(s){case S_ATTR_SPACE:var tagName=el.tagName;if(currentNSMap[\"\"]!==\"http://www.w3.org/1999/xhtml\"||!attrName.match(/^(?:disabled|checked|selected)$/i)){errorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')}el.add(attrName,attrName,start);start=p;s=S_ATTR;break;case S_ATTR_END:errorHandler.warning('attribute space is required\"'+attrName+'\"!!');case S_TAG_SPACE:s=S_ATTR;start=p;break;case S_EQ:s=S_ATTR_NOQUOT_VALUE;start=p;break;case S_TAG_CLOSE:throw new Error(\"elements closed character '/' and '>' must be connected to\")}}}p++}}function appendElement(el,domBuilder,currentNSMap){var tagName=el.tagName;var localNSMap=null;var i=el.length;while(i--){var a=el[i];var qName=a.qName;var value=a.value;var nsp=qName.indexOf(\":\");if(nsp>0){var prefix=a.prefix=qName.slice(0,nsp);var localName=qName.slice(nsp+1);var nsPrefix=prefix===\"xmlns\"&&localName}else{localName=qName;prefix=null;nsPrefix=qName===\"xmlns\"&&\"\"}a.localName=localName;if(nsPrefix!==false){if(localNSMap==null){localNSMap={};_copy(currentNSMap,currentNSMap={})}currentNSMap[nsPrefix]=localNSMap[nsPrefix]=value;a.uri=\"http://www.w3.org/2000/xmlns/\";domBuilder.startPrefixMapping(nsPrefix,value)}}var i=el.length;while(i--){a=el[i];var prefix=a.prefix;if(prefix){if(prefix===\"xml\"){a.uri=\"http://www.w3.org/XML/1998/namespace\"}if(prefix!==\"xmlns\"){a.uri=currentNSMap[prefix||\"\"]}}}var nsp=tagName.indexOf(\":\");if(nsp>0){prefix=el.prefix=tagName.slice(0,nsp);localName=el.localName=tagName.slice(nsp+1)}else{prefix=null;localName=el.localName=tagName}var ns=el.uri=currentNSMap[prefix||\"\"];domBuilder.startElement(ns,localName,tagName,el);if(el.closed){domBuilder.endElement(ns,localName,tagName);if(localNSMap){for(prefix in localNSMap){domBuilder.endPrefixMapping(prefix)}}}else{el.currentNSMap=currentNSMap;el.localNSMap=localNSMap;return true}}function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){if(/^(?:script|textarea)$/i.test(tagName)){var elEndStart=source.indexOf(\"\",elStartEnd);var text=source.substring(elStartEnd+1,elEndStart);if(/[&<]/.test(text)){if(/^script$/i.test(tagName)){domBuilder.characters(text,0,text.length);return elEndStart}text=text.replace(/&#?\\w+;/g,entityReplacer);domBuilder.characters(text,0,text.length);return elEndStart}}return elStartEnd+1}function fixSelfClosed(source,elStartEnd,tagName,closeMap){var pos=closeMap[tagName];if(pos==null){pos=source.lastIndexOf(\"\");if(pos\",start+4);if(end>start){domBuilder.comment(source,start+4,end-start-4);return end+3}else{errorHandler.error(\"Unclosed comment\");return-1}}else{return-1}default:if(source.substr(start+3,6)==\"CDATA[\"){var end=source.indexOf(\"]]>\",start+9);domBuilder.startCDATA();domBuilder.characters(source,start+9,end-start-9);domBuilder.endCDATA();return end+3}var matchs=split(source,start);var len=matchs.length;if(len>1&&/!doctype/i.test(matchs[0][0])){var name=matchs[1][0];var pubid=len>3&&/^public$/i.test(matchs[2][0])&&matchs[3][0];var sysid=len>4&&matchs[4][0];var lastMatch=matchs[len-1];domBuilder.startDTD(name,pubid&&pubid.replace(/^(['\"])(.*?)\\1$/,\"$2\"),sysid&&sysid.replace(/^(['\"])(.*?)\\1$/,\"$2\"));domBuilder.endDTD();return lastMatch.index+lastMatch[0].length}}return-1}function parseInstruction(source,start,domBuilder){var end=source.indexOf(\"?>\",start);if(end){var match=source.substring(start,end).match(/^<\\?(\\S*)\\s*([\\s\\S]*?)\\s*$/);if(match){var len=match[0].length;domBuilder.processingInstruction(match[1],match[2]);return end+2}else{return-1}}return-1}function ElementAttributes(source){}ElementAttributes.prototype={setTagName:function(tagName){if(!tagNamePattern.test(tagName)){throw new Error(\"invalid tagName:\"+tagName)}this.tagName=tagName},add:function(qName,value,offset){if(!tagNamePattern.test(qName)){throw new Error(\"invalid attribute:\"+qName)}this[this.length++]={qName:qName,value:value,offset:offset}},length:0,getLocalName:function(i){return this[i].localName},getLocator:function(i){return this[i].locator},getQName:function(i){return this[i].qName},getURI:function(i){return this[i].uri},getValue:function(i){return this[i].value}};function _set_proto_(thiz,parent){thiz.__proto__=parent;return thiz}if(!(_set_proto_({},_set_proto_.prototype)instanceof _set_proto_)){_set_proto_=function(thiz,parent){function p(){}p.prototype=parent;p=new p;for(parent in thiz){p[parent]=thiz[parent]}return p}}function split(source,start){var match;var buf=[];var reg=/'[^']+'|\"[^\"]+\"|[^\\s<>\\/=]+=?|(\\/?\\s*>|<)/g;reg.lastIndex=start;reg.exec(source);while(match=reg.exec(source)){buf.push(match);if(match[1])return buf}}exports.XMLReader=XMLReader},{}],\"/src/js/index.js\":[function(require,module,exports){\"use strict\";var _createClass=function(){function defineProperties(target,props){for(var i=0;i\"+xmlString+\"\");var offset=xmlDoc.getElementsByTagName(\"a:off\");var ext=xmlDoc.getElementsByTagName(\"a:ext\");part.ext={cx:parseInt(ext[0].getAttribute(\"cx\"),10),cy:parseInt(ext[0].getAttribute(\"cy\"),10)};part.offset={x:parseInt(offset[0].getAttribute(\"x\"),10),y:parseInt(offset[0].getAttribute(\"y\"),10)};return part}var ImageModule=function(){function ImageModule(options){_classCallCheck(this,ImageModule);this.name=\"ImageModule\";this.options=options||{};this.imgManagers={};if(this.options.centered==null){this.options.centered=false}if(this.options.getImage==null){throw new Error(\"You should pass getImage\")}if(this.options.getSize==null){throw new Error(\"You should pass getSize\")}this.imageNumber=1}_createClass(ImageModule,[{key:\"optionsTransformer\",value:function optionsTransformer(options,docxtemplater){\nvar relsFiles=docxtemplater.zip.file(/\\.xml\\.rels/).concat(docxtemplater.zip.file(/\\[Content_Types\\].xml/)).map(function(file){return file.name});this.fileTypeConfig=docxtemplater.fileTypeConfig;this.fileType=docxtemplater.fileType;this.zip=docxtemplater.zip;options.xmlFileNames=options.xmlFileNames.concat(relsFiles);return options}},{key:\"set\",value:function set(options){if(options.zip){this.zip=options.zip}if(options.xmlDocuments){this.xmlDocuments=options.xmlDocuments}}},{key:\"parse\",value:function parse(placeHolderContent){var module=moduleName;var type=\"placeholder\";if(placeHolderContent.substring(0,2)===\"%%\"){return{type:type,value:placeHolderContent.substr(2),module:module,centered:true}}if(placeHolderContent.substring(0,1)===\"%\"){return{type:type,value:placeHolderContent.substr(1),module:module,centered:false}}return null}},{key:\"postparse\",value:function postparse(parsed){var expandTo=void 0;var getInner=void 0;if(this.fileType===\"pptx\"){expandTo=\"p:sp\";getInner=getInnerPptx}else{expandTo=this.options.centered?\"w:p\":\"w:t\";getInner=getInnerDocx}return DocUtils.traits.expandToOne(parsed,{moduleName:moduleName,getInner:getInner,expandTo:expandTo})}},{key:\"render\",value:function render(part,options){this.imgManagers[options.filePath]=this.imgManagers[options.filePath]||new ImgManager(this.zip,options.filePath,this.xmlDocuments,this.fileType);var imgManager=this.imgManagers[options.filePath];if(!part.type===\"placeholder\"||part.module!==moduleName){return null}try{var tagValue=options.scopeManager.getValue(part.value);if(!tagValue){throw new Error(\"tagValue is empty\")}var imgBuffer=this.options.getImage(tagValue,part.value);var rId=imgManager.addImageRels(this.getNextImageName(),imgBuffer);var sizePixel=this.options.getSize(imgBuffer,tagValue,part.value);return this.getRenderedPart(part,rId,sizePixel)}catch(e){return{value:this.fileTypeConfig.tagTextXml}}}},{key:\"getRenderedPart\",value:function getRenderedPart(part,rId,sizePixel){if(isNaN(rId)){throw new Error(\"rId is NaN, aborting\")}var size=[DocUtils.convertPixelsToEmus(sizePixel[0]),DocUtils.convertPixelsToEmus(sizePixel[1])];var centered=this.options.centered||part.centered;var newText=void 0;if(this.fileType===\"pptx\"){newText=this.getRenderedPartPptx(part,rId,size,centered)}else{newText=this.getRenderedPartDocx(rId,size,centered)}return{value:newText}}},{key:\"getRenderedPartPptx\",value:function getRenderedPartPptx(part,rId,size,centered){var offset={x:part.offset.x,y:part.offset.y};var cellCX=part.ext.cx;var cellCY=part.ext.cy;var imgW=size[0];var imgH=size[1];if(centered){offset.x+=cellCX/2-imgW/2;offset.y+=cellCY/2-imgH/2}return templates.getPptxImageXml(rId,[imgW,imgH],offset)}},{key:\"getRenderedPartDocx\",value:function getRenderedPartDocx(rId,size,centered){return centered?templates.getImageXmlCentered(rId,size):templates.getImageXml(rId,size)}},{key:\"getNextImageName\",value:function getNextImageName(){var name=\"image_generated_\"+this.imageNumber+\".png\";this.imageNumber++;return name}}]);return ImageModule}();module.exports=ImageModule},{\"./imgManager\":2,\"./templates\":3,docxtemplater:5,xmldom:23}]},{},[])(\"/src/js/index.js\")});","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Docxtemplater=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o\":\">\"};var regexStripRegexp=/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g;DocUtils.escapeRegExp=function(str){return str.replace(regexStripRegexp,\"\\\\$&\")};DocUtils.charMapRegexes=Object.keys(DocUtils.charMap).map(function(endChar){var startChar=DocUtils.charMap[endChar];return{rstart:new RegExp(DocUtils.escapeRegExp(startChar),\"g\"),rend:new RegExp(DocUtils.escapeRegExp(endChar),\"g\"),start:startChar,end:endChar}});DocUtils.wordToUtf8=function(string){var r=void 0;for(var i=0,l=DocUtils.charMapRegexes.length;i\"){return i}}throwXmlTagNotFound({position:\"right\",element:element,parsed:parsed,index:index})};DocUtils.getLeft=function(parsed,element,index){for(var i=index;i>=0;i--){var part=parsed[i];if(part.value.indexOf(\"<\"+element)===0&&[\">\",\" \"].indexOf(part.value[element.length+1])!==-1){return i}}throwXmlTagNotFound({position:\"left\",element:element,parsed:parsed,index:index})};module.exports=DocUtils},{\"./errors\":2,\"./memoize\":5,xmldom:19}],2:[function(require,module,exports){\"use strict\";function XTError(message){this.name=\"GenericError\";this.message=message;this.stack=new Error(message).stack}XTError.prototype=Error.prototype;function XTTemplateError(message){this.name=\"TemplateError\";this.message=message;this.stack=new Error(message).stack}XTTemplateError.prototype=new XTError;function XTScopeParserError(message){this.name=\"ScopeParserError\";this.message=message;this.stack=new Error(message).stack}XTScopeParserError.prototype=new XTError;function XTInternalError(message){this.name=\"InternalError\";this.properties={explanation:\"InternalError\"};this.message=message;this.stack=new Error(message).stack}XTInternalError.prototype=new XTError;module.exports={XTError:XTError,XTTemplateError:XTTemplateError,XTInternalError:XTInternalError,XTScopeParserError:XTScopeParserError}},{}],3:[function(require,module,exports){\"use strict\";var loopModule=require(\"./modules/loop\");var spacePreserveModule=require(\"./modules/space-preserve\");var rawXmlModule=require(\"./modules/rawxml\");var expandPairTrait=require(\"./modules/expand-pair-trait\");var render=require(\"./modules/render\");var PptXFileTypeConfig={getTemplatedFiles:function getTemplatedFiles(zip){var slideTemplates=zip.file(/ppt\\/(slides|slideMasters)\\/(slide|slideMaster)\\d+\\.xml/).map(function(file){return file.name});return slideTemplates.concat([\"ppt/presentation.xml\"])},textPath:\"ppt/slides/slide1.xml\",tagsXmlTextArray:[\"a:t\",\"m:t\"],tagsXmlLexedArray:[\"p:sp\",\"a:tc\",\"a:tr\",\"a:table\",\"a:p\",\"a:r\"],tagRawXml:\"p:sp\",tagTextXml:\"a:t\",baseModules:[render,expandPairTrait,rawXmlModule,loopModule]};var DocXFileTypeConfig={getTemplatedFiles:function getTemplatedFiles(zip){var slideTemplates=zip.file(/word\\/(header|footer)\\d+\\.xml/).map(function(file){return file.name});return slideTemplates.concat([\"word/document.xml\"])},textPath:\"word/document.xml\",tagsXmlTextArray:[\"w:t\",\"m:t\"],tagsXmlLexedArray:[\"w:tc\",\"w:tr\",\"w:table\",\"w:p\",\"w:r\"],tagRawXml:\"w:p\",tagTextXml:\"w:t\",baseModules:[render,spacePreserveModule,expandPairTrait,rawXmlModule,loopModule]};module.exports={docx:DocXFileTypeConfig,pptx:PptXFileTypeConfig}},{\"./modules/expand-pair-trait\":8,\"./modules/loop\":9,\"./modules/rawxml\":10,\"./modules/render\":11,\"./modules/space-preserve\":12}],4:[function(require,module,exports){\"use strict\";var Errors=require(\"./errors\");var DocUtils=require(\"./doc-utils\");function inRange(range,match){return range[0]<=match.offset&&match.offset\",cursor);var tagText=content.slice(offset,cursor+1);var _getTag=getTag(tagText),tag=_getTag.tag,position=_getTag.position;var text=allMatches[tag];if(text==null){continue}totalMatches.push({type:\"tag\",position:position,text:text,offset:offset,value:tagText})}return totalMatches}function throwUnopenedTagException(options){var err=new Errors.XTTemplateError(\"Unopened tag\");err.properties={xtag:options.xtag.split(\" \")[0],id:\"unopened_tag\",context:options.xtag,explanation:\"The tag beginning with '\"+options.xtag.substr(0,10)+\"' is unclosed\"};throw err}function throwUnclosedTagException(options){var err=new Errors.XTTemplateError(\"Unclosed tag\");err.properties={xtag:options.xtag.split(\" \")[0].substr(1),id:\"unclosed_tag\",context:options.xtag,explanation:\"The tag beginning with '\"+options.xtag.substr(0,10)+\"' is unclosed\"};throw err}function assertDelimiterOrdered(delimiterMatches,fullText){var inDelimiter=false;var lastDelimiterMatch={offset:0};var xtag=void 0;delimiterMatches.forEach(function(delimiterMatch){xtag=fullText.substr(lastDelimiterMatch.offset,delimiterMatch.offset-lastDelimiterMatch.offset);if(delimiterMatch.position===\"start\"&&inDelimiter||delimiterMatch.position===\"end\"&&!inDelimiter){if(delimiterMatch.position===\"start\"){throwUnclosedTagException({xtag:xtag})}else{throwUnopenedTagException({xtag:xtag})}}inDelimiter=!inDelimiter;lastDelimiterMatch=delimiterMatch});var delimiterMatch={offset:fullText.length};xtag=fullText.substr(lastDelimiterMatch.offset,delimiterMatch.offset-lastDelimiterMatch.offset);if(inDelimiter){throwUnclosedTagException({xtag:xtag})}}function getAllIndexes(arr,val,position){var indexes=[];var offset=-1;do{offset=arr.indexOf(val,offset+1);if(offset!==-1){indexes.push({offset:offset,position:position})}}while(offset!==-1);return indexes}function Reader(innerContentParts){var _this=this;this.innerContentParts=innerContentParts;this.full=\"\";this.parseDelimiters=function(delimiters){_this.full=_this.innerContentParts.join(\"\");var offset=0;_this.ranges=_this.innerContentParts.map(function(part){offset+=part.length;return offset-part.length});var delimiterMatches=DocUtils.concatArrays([getAllIndexes(_this.full,delimiters.start,\"start\"),getAllIndexes(_this.full,delimiters.end,\"end\")]).sort(offsetSort);assertDelimiterOrdered(delimiterMatches,_this.full);var delimiterLength={start:delimiters.start.length,end:delimiters.end.length};var cutNext=0;var delimiterIndex=0;_this.parsed=_this.ranges.map(function(offset,i){var range=[offset,offset+this.innerContentParts[i].length];var partContent=this.innerContentParts[i];var delimitersInOffset=[];while(delimiterIndex0){cursor=cutNext;cutNext=0}delimitersInOffset.forEach(function(delimiterInOffset){var value=partContent.substr(cursor,delimiterInOffset.offset-offset-cursor);if(value.length>0){parts.push({type:\"content\",value:value})}parts.push({type:\"delimiter\",position:delimiterInOffset.position});cursor=delimiterInOffset.offset-offset+delimiterLength[delimiterInOffset.position]});cutNext=cursor-partContent.length;var value=partContent.substr(cursor);if(value.length>0){parts.push({type:\"content\",value:value})}return parts},_this)}}module.exports={parse:function parse(xmlparsed,delimiters){var inTextTag=false;var innerContentParts=[];xmlparsed.forEach(function(part){inTextTag=updateInTextTag(part,inTextTag);if(inTextTag&&part.type===\"content\"){innerContentParts.push(part.value)}});var reader=new Reader(innerContentParts);reader.parseDelimiters(delimiters);var newArray=[];var index=0;xmlparsed.forEach(function(part){inTextTag=updateInTextTag(part,inTextTag);if(part.type===\"content\"){part.position=inTextTag?\"insidetag\":\"outsidetag\"}if(inTextTag&&part.type===\"content\"){Array.prototype.push.apply(newArray,reader.parsed[index].map(function(p){if(p.type===\"content\"){p.position=\"insidetag\"}return p}));index++}else{newArray.push(part)}});return newArray},xmlparse:function xmlparse(content,xmltags){var matches=tagMatcher(content,xmltags.text,xmltags.other);var cursor=0;var parsed=matches.reduce(function(parsed,match){var value=content.substr(cursor,match.offset-cursor);if(value.length>0){parsed.push({type:\"content\",value:value})}cursor=match.offset+match.value.length;delete match.offset;if(match.value.length>0){parsed.push(match)}return parsed},[]);var value=content.substr(cursor);if(value.length>0){parsed.push({type:\"content\",value:value})}return parsed}}},{\"./doc-utils\":1,\"./errors\":2}],5:[function(require,module,exports){\"use strict\";function memoize(func){var stringifyJson=JSON.stringify,cache={};function cachedfun(){var hash=stringifyJson(arguments);return hash in cache?cache[hash]:cache[hash]=func.apply(this,arguments)}return cachedfun}module.exports=memoize},{}],6:[function(require,module,exports){\"use strict\";function getMinFromArrays(arrays,state){var minIndex=-1;for(var i=0,l=arrays.length;i=arrays[i].length){continue}if(minIndex===-1||arrays[i][state[i]].offset0});var resultArray=new Array(totalLength);var state=arrays.map(function(){return 0});var i=0;while(i<=totalLength-1){var arrayIndex=getMinFromArrays(arrays,state);resultArray[i]=arrays[arrayIndex][state[arrayIndex]];state[arrayIndex]++;i++}return resultArray}},{}],7:[function(require,module,exports){\"use strict\";function emptyFun(){}function identity(i){return i}module.exports=function(module){var defaults={set:emptyFun,parse:emptyFun,render:emptyFun,getTraits:emptyFun,optionsTransformer:identity,getRenderedMap:identity,postparse:identity};if(Object.keys(defaults).every(function(key){return!module[key]})){throw new Error(\"This module cannot be wrapped, because it doesn't define any of the necessary functions\")}Object.keys(defaults).forEach(function(key){module[key]=module[key]||defaults[key]});return module}},{}],8:[function(require,module,exports){\"use strict\";var traitName=\"expandPair\";var mergeSort=require(\"../mergesort\");var DocUtils=require(\"../doc-utils\");var wrapper=require(\"../module-wrapper\");var _require=require(\"../traits\"),getExpandToDefault=_require.getExpandToDefault;var Errors=require(\"../errors\");function throwUnmatchedLoopException(options){var location=options.location;var t=location===\"start\"?\"unclosed\":\"unopened\";var T=location===\"start\"?\"Unclosed\":\"Unopened\";var err=new Errors.XTTemplateError(T+\" loop\");var tag=options.part.value;err.properties={id:t+\"_loop\",explanation:\"The loop with tag \"+tag+\" is \"+t,xtag:tag};throw err}function throwClosingTagNotMatchOpeningTag(options){var tags=options.tags;var err=new Errors.XTTemplateError(\"Closing tag does not match opening tag\");err.properties={id:\"closing_tag_does_not_match_opening_tag\",explanation:'The tag \"'+tags[0].value+'\" is closed by the tag \"'+tags[1].value+'\"',openingtag:tags[0].value,closingtag:tags[1].value};throw err}function getOpenCountChange(part){switch(part.location){case\"start\":return 1;case\"end\":return-1;default:throw new Error(\"Location should be one of 'start' or 'end' (given : \"+part.location+\")\")}}function getPairs(traits){if(traits.length===0){return[]}var countOpen=1;var firstTrait=traits[0];for(var i=1;i\"){inChunk=true}if(inChunk){if(part.type===\"placeholder\"&&!part.module){chunk[0].value=''}chunk.push(part)}else{parsed.push(part)}if(part.type===\"tag\"&&part.position===\"end\"&&part.text&&part.value===\"\"){Array.prototype.push.apply(parsed,chunk);inChunk=false;chunk=[]}return parsed},[]);Array.prototype.push.apply(result,chunk);return result}};module.exports=function(){return wrapper(spacePreserve)}},{\"../module-wrapper\":7}],13:[function(require,module,exports){\"use strict\";var DocUtils=require(\"./doc-utils\");var parser={postparse:function postparse(parsed,modules){function getTraits(traitName,parsed){return modules.map(function(module){return module.getTraits(traitName,parsed)})}function postparse(parsed){return modules.reduce(function(parsed,module){return module.postparse(parsed,{postparse:postparse,getTraits:getTraits})},parsed)}return postparse(parsed)},parse:function parse(lexed,modules){function moduleParse(placeHolderContent,parsed){var moduleParsed=void 0;for(var i=0,l=modules.length;i0){return this.getValue(tag,this.num-1)}return result}},{key:\"createSubScopeManager\",value:function createSubScopeManager(scope,tag){var options={scopePath:this.scopePath.slice(0),scopeList:this.scopeList.slice(0)};options.parser=this.parser;options.scopeList=this.scopeList.concat(scope);options.scopePath=this.scopePath.concat(tag);return new ScopeManager(options)}}]);return ScopeManager}();ScopeManager.createBaseScopeManager=function(_ref){var parser=_ref.parser,tags=_ref.tags;var options={parser:parser,tags:tags};options.scopePath=[];options.scopeList=[tags];return new ScopeManager(options)};module.exports=ScopeManager},{\"./errors\":2}],16:[function(require,module,exports){\"use strict\";var DocUtils=require(\"./doc-utils\");var Errors=require(\"./errors\");function throwRawTagNotInParagraph(options){var err=new Errors.XTTemplateError(\"Raw tag not in paragraph\");var tag=options.part.value;err.properties={id:\"raw_tag_outerxml_invalid\",explanation:'The tag \"'+tag+'\"',rootError:options.rootError,xtag:tag,postparsed:options.postparsed,expandTo:options.expandTo,index:options.index};throw err}function lastTagIsOpenTag(array,tag){if(array.length===0){return false}var lastTag=array[array.length-1];var innerLastTag=lastTag.tag.substr(1);var innerCurrentTag=tag.substr(2,tag.length-3);return innerLastTag.indexOf(innerCurrentTag)===0}function addTag(array,tag){array.push({tag:tag});return array}function getListXmlElements(parts){var tags=parts.filter(function(part){return part.type===\"tag\"}).map(function(part){return part.value});var result=[];for(var i=0,tag;i\")===-1){res.content.replace(/^()([^<>]*)$/,replacerUnshift)}var r=new RegExp(\"^()([^<]+)\");res.content.replace(r,replacerUnshift);function replacerPush(){var pn={array:Array.prototype.slice.call(arguments)};pn.array.pop();var offset=pn.array.pop();pn.offset=offset;pn.last=true;res.matches.push(pn);res.charactersAdded.push(0);return res.charactersAddedCumulative.push(0)}r=new RegExp(\"(<(?:\"+res.tagsXmlArrayJoined+\")[^>]*>)([^>]+)$\");res.content.replace(r,replacerPush);return res}function xmlMatcher(content,tagsXmlArray){var res={};res.content=content;res.tagsXmlArray=tagsXmlArray;res.tagsXmlArrayJoined=res.tagsXmlArray.join(\"|\");var regexp=new RegExp(\"(<(?:\"+res.tagsXmlArrayJoined+\")[^>]*>)([^<>]*)\",\"g\");res.matches=DocUtils.pregMatchAll(regexp,res.content);res.charactersAddedCumulative=res.matches.map(function(){return 0});res.charactersAdded=res.matches.map(function(){return 0});return handleRecursiveCase(res)}var memoized=memoize(xmlMatcher);module.exports=function(content,tagsXmlArray){return DocUtils.cloneDeep(memoized(content,tagsXmlArray))}},{\"./doc-utils\":1,\"./memoize\":5}],18:[function(require,module,exports){\"use strict\";var _createClass=function(){function defineProperties(target,props){for(var i=0;i\",amp:\"&\",quot:'\"',apos:\"'\"};if(locator){domBuilder.setDocumentLocator(locator)}sax.errorHandler=buildErrorHandler(errorHandler,domBuilder,locator);sax.domBuilder=options.domBuilder||domBuilder;if(/\\/x?html?$/.test(mimeType)){entityMap.nbsp=\" \";entityMap.copy=\"©\";defaultNSMap[\"\"]=\"http://www.w3.org/1999/xhtml\"}defaultNSMap.xml=defaultNSMap.xml||\"http://www.w3.org/XML/1998/namespace\";if(source){sax.parse(source,defaultNSMap,entityMap)}else{sax.errorHandler.error(\"invalid doc source\")}return domBuilder.doc};function buildErrorHandler(errorImpl,domBuilder,locator){if(!errorImpl){if(domBuilder instanceof DOMHandler){return domBuilder}errorImpl=domBuilder}var errorHandler={};var isCallback=errorImpl instanceof Function;locator=locator||{};function build(key){var fn=errorImpl[key];if(!fn&&isCallback){fn=errorImpl.length==2?function(msg){errorImpl(key,msg)}:errorImpl}errorHandler[key]=fn&&function(msg){fn(\"[xmldom \"+key+\"]\\t\"+msg+_locator(locator))}||function(){}}build(\"warning\");build(\"error\");build(\"fatalError\");return errorHandler}function DOMHandler(){this.cdata=false}function position(locator,node){node.lineNumber=locator.lineNumber;node.columnNumber=locator.columnNumber}DOMHandler.prototype={startDocument:function(){this.doc=(new DOMImplementation).createDocument(null,null,null);if(this.locator){this.doc.documentURI=this.locator.systemId}},startElement:function(namespaceURI,localName,qName,attrs){var doc=this.doc;var el=doc.createElementNS(namespaceURI,qName||localName);var len=attrs.length;appendElement(this,el);this.currentElement=el;this.locator&&position(this.locator,el);for(var i=0;i=start+length||start){return new java.lang.String(chars,start,length)+\"\"}return chars}}\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){DOMHandler.prototype[key]=function(){return null}});function appendElement(hander,node){if(!hander.currentElement){hander.doc.appendChild(node)}else{hander.currentElement.appendChild(node)}}var XMLReader=require(\"./sax\").XMLReader;var DOMImplementation=exports.DOMImplementation=require(\"./dom\").DOMImplementation;exports.XMLSerializer=require(\"./dom\").XMLSerializer;exports.DOMParser=DOMParser},{\"./dom\":20,\"./sax\":21}],20:[function(require,module,exports){function copy(src,dest){for(var p in src){dest[p]=src[p]}}function _extends(Class,Super){var pt=Class.prototype;if(Object.create){var ppt=Object.create(Super.prototype);pt.__proto__=ppt}if(!(pt instanceof Super)){function t(){}t.prototype=Super.prototype;t=new t;copy(pt,t);Class.prototype=pt=t}if(pt.constructor!=Class){if(typeof Class!=\"function\"){console.error(\"unknow Class:\"+Class)}pt.constructor=Class}}var htmlns=\"http://www.w3.org/1999/xhtml\";var NodeType={};var ELEMENT_NODE=NodeType.ELEMENT_NODE=1;var ATTRIBUTE_NODE=NodeType.ATTRIBUTE_NODE=2;var TEXT_NODE=NodeType.TEXT_NODE=3;var CDATA_SECTION_NODE=NodeType.CDATA_SECTION_NODE=4;var ENTITY_REFERENCE_NODE=NodeType.ENTITY_REFERENCE_NODE=5;var ENTITY_NODE=NodeType.ENTITY_NODE=6;var PROCESSING_INSTRUCTION_NODE=NodeType.PROCESSING_INSTRUCTION_NODE=7;var COMMENT_NODE=NodeType.COMMENT_NODE=8;var DOCUMENT_NODE=NodeType.DOCUMENT_NODE=9;var DOCUMENT_TYPE_NODE=NodeType.DOCUMENT_TYPE_NODE=10;var DOCUMENT_FRAGMENT_NODE=NodeType.DOCUMENT_FRAGMENT_NODE=11;var NOTATION_NODE=NodeType.NOTATION_NODE=12;var ExceptionCode={};var ExceptionMessage={};var INDEX_SIZE_ERR=ExceptionCode.INDEX_SIZE_ERR=(ExceptionMessage[1]=\"Index size error\",1);var DOMSTRING_SIZE_ERR=ExceptionCode.DOMSTRING_SIZE_ERR=(ExceptionMessage[2]=\"DOMString size error\",2);var HIERARCHY_REQUEST_ERR=ExceptionCode.HIERARCHY_REQUEST_ERR=(ExceptionMessage[3]=\"Hierarchy request error\",3);var WRONG_DOCUMENT_ERR=ExceptionCode.WRONG_DOCUMENT_ERR=(ExceptionMessage[4]=\"Wrong document\",4);var INVALID_CHARACTER_ERR=ExceptionCode.INVALID_CHARACTER_ERR=(ExceptionMessage[5]=\"Invalid character\",5);var NO_DATA_ALLOWED_ERR=ExceptionCode.NO_DATA_ALLOWED_ERR=(ExceptionMessage[6]=\"No data allowed\",6);var NO_MODIFICATION_ALLOWED_ERR=ExceptionCode.NO_MODIFICATION_ALLOWED_ERR=(ExceptionMessage[7]=\"No modification allowed\",7);var NOT_FOUND_ERR=ExceptionCode.NOT_FOUND_ERR=(ExceptionMessage[8]=\"Not found\",8);var NOT_SUPPORTED_ERR=ExceptionCode.NOT_SUPPORTED_ERR=(ExceptionMessage[9]=\"Not supported\",9);var INUSE_ATTRIBUTE_ERR=ExceptionCode.INUSE_ATTRIBUTE_ERR=(ExceptionMessage[10]=\"Attribute in use\",10);var INVALID_STATE_ERR=ExceptionCode.INVALID_STATE_ERR=(ExceptionMessage[11]=\"Invalid state\",11);var SYNTAX_ERR=ExceptionCode.SYNTAX_ERR=(ExceptionMessage[12]=\"Syntax error\",12);var INVALID_MODIFICATION_ERR=ExceptionCode.INVALID_MODIFICATION_ERR=(ExceptionMessage[13]=\"Invalid modification\",13);var NAMESPACE_ERR=ExceptionCode.NAMESPACE_ERR=(ExceptionMessage[14]=\"Invalid namespace\",14);var INVALID_ACCESS_ERR=ExceptionCode.INVALID_ACCESS_ERR=(ExceptionMessage[15]=\"Invalid access\",15);function DOMException(code,message){if(message instanceof Error){var error=message}else{error=this;Error.call(this,ExceptionMessage[code]);this.message=ExceptionMessage[code];if(Error.captureStackTrace)Error.captureStackTrace(this,DOMException)}error.code=code;if(message)this.message=this.message+\": \"+message;return error}DOMException.prototype=Error.prototype;copy(ExceptionCode,DOMException);function NodeList(){}NodeList.prototype={length:0,item:function(index){return this[index]||null},toString:function(isHTML,nodeFilter){for(var buf=[],i=0;i=0){var lastIndex=list.length-1;while(i0},lookupPrefix:function(namespaceURI){var el=this;while(el){var map=el._nsMap;if(map){for(var n in map){if(map[n]==namespaceURI){return n}}}el=el.nodeType==ATTRIBUTE_NODE?el.ownerDocument:el.parentNode}return null},lookupNamespaceURI:function(prefix){var el=this;while(el){var map=el._nsMap;if(map){if(prefix in map){return map[prefix]}}el=el.nodeType==ATTRIBUTE_NODE?el.ownerDocument:el.parentNode}return null},isDefaultNamespace:function(namespaceURI){var prefix=this.lookupPrefix(namespaceURI);return prefix==null}};function _xmlEncoder(c){return c==\"<\"&&\"<\"||c==\">\"&&\">\"||c==\"&\"&&\"&\"||c=='\"'&&\""\"||\"&#\"+c.charCodeAt()+\";\"}copy(NodeType,Node);copy(NodeType,Node.prototype);function _visitNode(node,callback){if(callback(node)){return true}if(node=node.firstChild){do{if(_visitNode(node,callback)){return true}}while(node=node.nextSibling)}}function Document(){}function _onAddAttribute(doc,el,newAttr){doc&&doc._inc++;var ns=newAttr.namespaceURI;if(ns==\"http://www.w3.org/2000/xmlns/\"){el._nsMap[newAttr.prefix?newAttr.localName:\"\"]=newAttr.value}}function _onRemoveAttribute(doc,el,newAttr,remove){doc&&doc._inc++;var ns=newAttr.namespaceURI;if(ns==\"http://www.w3.org/2000/xmlns/\"){delete el._nsMap[newAttr.prefix?newAttr.localName:\"\"]}}function _onUpdateChild(doc,el,newChild){if(doc&&doc._inc){doc._inc++;var cs=el.childNodes;if(newChild){cs[cs.length++]=newChild}else{var child=el.firstChild;var i=0;while(child){cs[i++]=child;child=child.nextSibling}cs.length=i}}}function _removeChild(parentNode,child){var previous=child.previousSibling;var next=child.nextSibling;if(previous){previous.nextSibling=next}else{parentNode.firstChild=next}if(next){next.previousSibling=previous}else{parentNode.lastChild=previous}_onUpdateChild(parentNode.ownerDocument,parentNode);return child}function _insertBefore(parentNode,newChild,nextChild){var cp=newChild.parentNode;if(cp){cp.removeChild(newChild)}if(newChild.nodeType===DOCUMENT_FRAGMENT_NODE){var newFirst=newChild.firstChild;if(newFirst==null){return newChild}var newLast=newChild.lastChild}else{newFirst=newLast=newChild}var pre=nextChild?nextChild.previousSibling:parentNode.lastChild;newFirst.previousSibling=pre;newLast.nextSibling=nextChild;if(pre){pre.nextSibling=newFirst}else{parentNode.firstChild=newFirst}if(nextChild==null){parentNode.lastChild=newLast}else{nextChild.previousSibling=newLast}do{newFirst.parentNode=parentNode}while(newFirst!==newLast&&(newFirst=newFirst.nextSibling));_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);if(newChild.nodeType==DOCUMENT_FRAGMENT_NODE){newChild.firstChild=newChild.lastChild=null}return newChild}function _appendSingleChild(parentNode,newChild){var cp=newChild.parentNode;if(cp){var pre=parentNode.lastChild;cp.removeChild(newChild);var pre=parentNode.lastChild}var pre=parentNode.lastChild;newChild.parentNode=parentNode;newChild.previousSibling=pre;newChild.nextSibling=null;if(pre){pre.nextSibling=newChild}else{parentNode.firstChild=newChild}parentNode.lastChild=newChild;_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);return newChild}Document.prototype={nodeName:\"#document\",nodeType:DOCUMENT_NODE,doctype:null,documentElement:null,_inc:1,insertBefore:function(newChild,refChild){if(newChild.nodeType==DOCUMENT_FRAGMENT_NODE){var child=newChild.firstChild;while(child){var next=child.nextSibling;this.insertBefore(child,refChild);child=next}return newChild}if(this.documentElement==null&&newChild.nodeType==ELEMENT_NODE){this.documentElement=newChild}return _insertBefore(this,newChild,refChild),newChild.ownerDocument=this,newChild},removeChild:function(oldChild){if(this.documentElement==oldChild){this.documentElement=null}return _removeChild(this,oldChild)},importNode:function(importedNode,deep){return importNode(this,importedNode,deep)},getElementById:function(id){var rtv=null;_visitNode(this.documentElement,function(node){if(node.nodeType==ELEMENT_NODE){if(node.getAttribute(\"id\")==id){rtv=node;return true}}});return rtv},createElement:function(tagName){var node=new Element;node.ownerDocument=this;node.nodeName=tagName;node.tagName=tagName;node.childNodes=new NodeList;var attrs=node.attributes=new NamedNodeMap;attrs._ownerElement=node;return node},createDocumentFragment:function(){var node=new DocumentFragment;node.ownerDocument=this;node.childNodes=new NodeList;return node},createTextNode:function(data){var node=new Text;node.ownerDocument=this;node.appendData(data);return node},createComment:function(data){var node=new Comment;node.ownerDocument=this;node.appendData(data);return node},createCDATASection:function(data){var node=new CDATASection;node.ownerDocument=this;node.appendData(data);return node},createProcessingInstruction:function(target,data){var node=new ProcessingInstruction;node.ownerDocument=this;node.tagName=node.target=target;node.nodeValue=node.data=data;return node},createAttribute:function(name){var node=new Attr;node.ownerDocument=this;node.name=name;node.nodeName=name;node.localName=name;node.specified=true;return node},createEntityReference:function(name){var node=new EntityReference;node.ownerDocument=this;node.nodeName=name;return node},createElementNS:function(namespaceURI,qualifiedName){var node=new Element;var pl=qualifiedName.split(\":\");var attrs=node.attributes=new NamedNodeMap;node.childNodes=new NodeList;node.ownerDocument=this;node.nodeName=qualifiedName;node.tagName=qualifiedName;node.namespaceURI=namespaceURI;if(pl.length==2){node.prefix=pl[0];node.localName=pl[1]}else{node.localName=qualifiedName}attrs._ownerElement=node;return node},createAttributeNS:function(namespaceURI,qualifiedName){var node=new Attr;var pl=qualifiedName.split(\":\");node.ownerDocument=this;node.nodeName=qualifiedName;node.name=qualifiedName;node.namespaceURI=namespaceURI;node.specified=true;if(pl.length==2){node.prefix=pl[0];node.localName=pl[1]}else{node.localName=qualifiedName}return node}};_extends(Document,Node);function Element(){this._nsMap={}}Element.prototype={nodeType:ELEMENT_NODE,hasAttribute:function(name){return this.getAttributeNode(name)!=null},getAttribute:function(name){var attr=this.getAttributeNode(name);return attr&&attr.value||\"\"},getAttributeNode:function(name){return this.attributes.getNamedItem(name)},setAttribute:function(name,value){var attr=this.ownerDocument.createAttribute(name);attr.value=attr.nodeValue=\"\"+value;this.setAttributeNode(attr)},removeAttribute:function(name){var attr=this.getAttributeNode(name);attr&&this.removeAttributeNode(attr)},appendChild:function(newChild){if(newChild.nodeType===DOCUMENT_FRAGMENT_NODE){return this.insertBefore(newChild,null)}else{return _appendSingleChild(this,newChild)}},setAttributeNode:function(newAttr){return this.attributes.setNamedItem(newAttr)},setAttributeNodeNS:function(newAttr){return this.attributes.setNamedItemNS(newAttr)},removeAttributeNode:function(oldAttr){return this.attributes.removeNamedItem(oldAttr.nodeName)},removeAttributeNS:function(namespaceURI,localName){var old=this.getAttributeNodeNS(namespaceURI,localName);old&&this.removeAttributeNode(old)},hasAttributeNS:function(namespaceURI,localName){return this.getAttributeNodeNS(namespaceURI,localName)!=null},getAttributeNS:function(namespaceURI,localName){var attr=this.getAttributeNodeNS(namespaceURI,localName);return attr&&attr.value||\"\"},setAttributeNS:function(namespaceURI,qualifiedName,value){var attr=this.ownerDocument.createAttributeNS(namespaceURI,qualifiedName);attr.value=attr.nodeValue=\"\"+value;this.setAttributeNode(attr)},getAttributeNodeNS:function(namespaceURI,localName){return this.attributes.getNamedItemNS(namespaceURI,localName)},getElementsByTagName:function(tagName){return new LiveNodeList(this,function(base){var ls=[];_visitNode(base,function(node){if(node!==base&&node.nodeType==ELEMENT_NODE&&(tagName===\"*\"||node.tagName==tagName)){ls.push(node)}});return ls})},getElementsByTagNameNS:function(namespaceURI,localName){return new LiveNodeList(this,function(base){var ls=[];_visitNode(base,function(node){if(node!==base&&node.nodeType===ELEMENT_NODE&&(namespaceURI===\"*\"||node.namespaceURI===namespaceURI)&&(localName===\"*\"||node.localName==localName)){ls.push(node)}});return ls})}};Document.prototype.getElementsByTagName=Element.prototype.getElementsByTagName;Document.prototype.getElementsByTagNameNS=Element.prototype.getElementsByTagNameNS;_extends(Element,Node);function Attr(){}Attr.prototype.nodeType=ATTRIBUTE_NODE;_extends(Attr,Node);function CharacterData(){}CharacterData.prototype={data:\"\",substringData:function(offset,count){return this.data.substring(offset,offset+count)},appendData:function(text){text=this.data+text;this.nodeValue=this.data=text;this.length=text.length},insertData:function(offset,text){this.replaceData(offset,0,text)},appendChild:function(newChild){throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])},deleteData:function(offset,count){this.replaceData(offset,count,\"\")},replaceData:function(offset,count,text){var start=this.data.substring(0,offset);var end=this.data.substring(offset+count);text=start+text+end;this.nodeValue=this.data=text;this.length=text.length}};_extends(CharacterData,Node);function Text(){}Text.prototype={nodeName:\"#text\",nodeType:TEXT_NODE,splitText:function(offset){var text=this.data;var newText=text.substring(offset);text=text.substring(0,offset);this.data=this.nodeValue=text;this.length=text.length;var newNode=this.ownerDocument.createTextNode(newText);if(this.parentNode){this.parentNode.insertBefore(newNode,this.nextSibling)}return newNode}};_extends(Text,CharacterData);function Comment(){}Comment.prototype={nodeName:\"#comment\",nodeType:COMMENT_NODE};_extends(Comment,CharacterData);function CDATASection(){}CDATASection.prototype={nodeName:\"#cdata-section\",nodeType:CDATA_SECTION_NODE};_extends(CDATASection,CharacterData);function DocumentType(){}DocumentType.prototype.nodeType=DOCUMENT_TYPE_NODE;_extends(DocumentType,Node);function Notation(){}Notation.prototype.nodeType=NOTATION_NODE;_extends(Notation,Node);function Entity(){}Entity.prototype.nodeType=ENTITY_NODE;_extends(Entity,Node);function EntityReference(){}EntityReference.prototype.nodeType=ENTITY_REFERENCE_NODE;_extends(EntityReference,Node);function DocumentFragment(){}DocumentFragment.prototype.nodeName=\"#document-fragment\";DocumentFragment.prototype.nodeType=DOCUMENT_FRAGMENT_NODE;_extends(DocumentFragment,Node);function ProcessingInstruction(){}ProcessingInstruction.prototype.nodeType=PROCESSING_INSTRUCTION_NODE;_extends(ProcessingInstruction,Node);function XMLSerializer(){}XMLSerializer.prototype.serializeToString=function(node,isHtml,nodeFilter){return nodeSerializeToString.call(node,isHtml,nodeFilter)};Node.prototype.toString=nodeSerializeToString;function nodeSerializeToString(isHtml,nodeFilter){var buf=[];var refNode=this.nodeType==9?this.documentElement:this;var prefix=refNode.prefix;var uri=refNode.namespaceURI;if(uri&&prefix==null){var prefix=refNode.lookupPrefix(uri);if(prefix==null){var visibleNamespaces=[{namespace:uri,prefix:null}]}}serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);return buf.join(\"\")}function needNamespaceDefine(node,isHTML,visibleNamespaces){var prefix=node.prefix||\"\";var uri=node.namespaceURI;if(!prefix&&!uri){return false}if(prefix===\"xml\"&&uri===\"http://www.w3.org/XML/1998/namespace\"||uri==\"http://www.w3.org/2000/xmlns/\"){return false}var i=visibleNamespaces.length;while(i--){var ns=visibleNamespaces[i];if(ns.prefix==prefix){return ns.namespace!=uri}}return true}function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){if(nodeFilter){node=nodeFilter(node);if(node){if(typeof node==\"string\"){buf.push(node);return}}else{return}}switch(node.nodeType){case ELEMENT_NODE:if(!visibleNamespaces)visibleNamespaces=[];var startVisibleNamespaces=visibleNamespaces.length;var attrs=node.attributes;var len=attrs.length;var child=node.firstChild;var nodeName=node.tagName;isHTML=htmlns===node.namespaceURI||isHTML;buf.push(\"<\",nodeName);for(var i=0;i\");if(isHTML&&/^script$/i.test(nodeName)){while(child){if(child.data){buf.push(child.data)}else{serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces)}child=child.nextSibling}}else{while(child){serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);child=child.nextSibling}}buf.push(\"\")}else{buf.push(\"/>\")}return;case DOCUMENT_NODE:case DOCUMENT_FRAGMENT_NODE:var child=node.firstChild;while(child){serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);child=child.nextSibling}return;case ATTRIBUTE_NODE:return buf.push(\" \",node.name,'=\"',node.value.replace(/[<&\"]/g,_xmlEncoder),'\"');case TEXT_NODE:return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));case CDATA_SECTION_NODE:return buf.push(\"\");case COMMENT_NODE:return buf.push(\"\\x3c!--\",node.data,\"--\\x3e\");case DOCUMENT_TYPE_NODE:var pubid=node.publicId;var sysid=node.systemId;buf.push(\"')}else if(sysid&&sysid!=\".\"){buf.push(' SYSTEM \"',sysid,'\">')}else{var sub=node.internalSubset;if(sub){buf.push(\" [\",sub,\"]\")}buf.push(\">\")}return;case PROCESSING_INSTRUCTION_NODE:return buf.push(\"\");case ENTITY_REFERENCE_NODE:return buf.push(\"&\",node.nodeName,\";\");default:buf.push(\"??\",node.nodeName)}}function importNode(doc,node,deep){var node2;switch(node.nodeType){case ELEMENT_NODE:node2=node.cloneNode(false);node2.ownerDocument=doc;case DOCUMENT_FRAGMENT_NODE:break;case ATTRIBUTE_NODE:deep=true;break}if(!node2){node2=node.cloneNode(false)}node2.ownerDocument=doc;node2.parentNode=null;if(deep){var child=node.firstChild;while(child){node2.appendChild(importNode(doc,child,deep));child=child.nextSibling}}return node2}function cloneNode(doc,node,deep){var node2=new node.constructor;for(var n in node){var v=node[n];if(typeof v!=\"object\"){if(v!=node2[n]){node2[n]=v}}}if(node.childNodes){node2.childNodes=new NodeList}node2.ownerDocument=doc;switch(node2.nodeType){case ELEMENT_NODE:var attrs=node.attributes;var attrs2=node2.attributes=new NamedNodeMap;var len=attrs.length;attrs2._ownerElement=node2;for(var i=0;i65535){code-=65536;var surrogate1=55296+(code>>10),surrogate2=56320+(code&1023);return String.fromCharCode(surrogate1,surrogate2)}else{return String.fromCharCode(code)}}function entityReplacer(a){var k=a.slice(1,-1);if(k in entityMap){return entityMap[k]}else if(k.charAt(0)===\"#\"){return fixedFromCharCode(parseInt(k.substr(1).replace(\"x\",\"0x\")))}else{errorHandler.error(\"entity not found:\"+a);return a}}function appendText(end){if(end>start){var xt=source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);locator&&position(start);domBuilder.characters(xt,0,end-start);start=end}}function position(p,m){while(p>=lineEnd&&(m=linePattern.exec(source))){lineStart=m.index;lineEnd=lineStart+m[0].length;locator.lineNumber++}locator.columnNumber=p-lineStart+1}var lineStart=0;var lineEnd=0;var linePattern=/.*(?:\\r\\n?|\\n)|.*$/g;var locator=domBuilder.locator;var parseStack=[{currentNSMap:defaultNSMapCopy}];var closeMap={};var start=0;while(true){try{var tagStart=source.indexOf(\"<\",start);if(tagStart<0){if(!source.substr(start).match(/^\\s*$/)){var doc=domBuilder.doc;var text=doc.createTextNode(source.substr(start));doc.appendChild(text);domBuilder.currentElement=text}return}if(tagStart>start){appendText(tagStart)}switch(source.charAt(tagStart+1)){case\"/\":var end=source.indexOf(\">\",tagStart+3);var tagName=source.substring(tagStart+2,end);var config=parseStack.pop();if(end<0){tagName=source.substring(tagStart+2).replace(/[\\s<].*/,\"\");errorHandler.error(\"end tag name: \"+tagName+\" is not complete:\"+config.tagName);end=tagStart+1+tagName.length}else if(tagName.match(/\\sstart){start=end}else{appendText(Math.max(tagStart,start)+1)}}}function copyLocator(f,t){t.lineNumber=f.lineNumber;t.columnNumber=f.columnNumber;return t}function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){var attrName;var value;var p=++start;var s=S_TAG;while(true){var c=source.charAt(p);switch(c){case\"=\":if(s===S_ATTR){attrName=source.slice(start,p);s=S_EQ}else if(s===S_ATTR_SPACE){s=S_EQ}else{throw new Error(\"attribute equal must after attrName\")}break;case\"'\":case'\"':if(s===S_EQ||s===S_ATTR){if(s===S_ATTR){errorHandler.warning('attribute value must after \"=\"');attrName=source.slice(start,p)}start=p+1;p=source.indexOf(c,start);if(p>0){value=source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);el.add(attrName,value,start-1);s=S_ATTR_END}else{throw new Error(\"attribute value no end '\"+c+\"' match\")}}else if(s==S_ATTR_NOQUOT_VALUE){value=source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);el.add(attrName,value,start);errorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+\")!!\");start=p+1;s=S_ATTR_END}else{throw new Error('attribute value must after \"=\"')}break;case\"/\":switch(s){case S_TAG:el.setTagName(source.slice(start,p));case S_ATTR_END:case S_TAG_SPACE:case S_TAG_CLOSE:s=S_TAG_CLOSE;el.closed=true;case S_ATTR_NOQUOT_VALUE:case S_ATTR:case S_ATTR_SPACE:break;default:throw new Error(\"attribute invalid close char('/')\")}break;case\"\":errorHandler.error(\"unexpected end of input\");if(s==S_TAG){el.setTagName(source.slice(start,p))}return p;case\">\":switch(s){case S_TAG:el.setTagName(source.slice(start,p));case S_ATTR_END:case S_TAG_SPACE:case S_TAG_CLOSE:break;case S_ATTR_NOQUOT_VALUE:case S_ATTR:value=source.slice(start,p);if(value.slice(-1)===\"/\"){el.closed=true;value=value.slice(0,-1)}case S_ATTR_SPACE:if(s===S_ATTR_SPACE){value=attrName}if(s==S_ATTR_NOQUOT_VALUE){errorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');el.add(attrName,value.replace(/&#?\\w+;/g,entityReplacer),start)}else{if(currentNSMap[\"\"]!==\"http://www.w3.org/1999/xhtml\"||!value.match(/^(?:disabled|checked|selected)$/i)){errorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')}el.add(value,value,start)}break;case S_EQ:throw new Error(\"attribute value missed!!\")}return p;case\"€\":c=\" \";default:if(c<=\" \"){switch(s){case S_TAG:el.setTagName(source.slice(start,p));s=S_TAG_SPACE;break;case S_ATTR:attrName=source.slice(start,p);s=S_ATTR_SPACE;break;case S_ATTR_NOQUOT_VALUE:var value=source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);errorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');el.add(attrName,value,start);case S_ATTR_END:s=S_TAG_SPACE;break}}else{switch(s){case S_ATTR_SPACE:var tagName=el.tagName;if(currentNSMap[\"\"]!==\"http://www.w3.org/1999/xhtml\"||!attrName.match(/^(?:disabled|checked|selected)$/i)){errorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')}el.add(attrName,attrName,start);start=p;s=S_ATTR;break;case S_ATTR_END:errorHandler.warning('attribute space is required\"'+attrName+'\"!!');case S_TAG_SPACE:s=S_ATTR;start=p;break;case S_EQ:s=S_ATTR_NOQUOT_VALUE;start=p;break;case S_TAG_CLOSE:throw new Error(\"elements closed character '/' and '>' must be connected to\")}}}p++}}function appendElement(el,domBuilder,currentNSMap){var tagName=el.tagName;var localNSMap=null;var i=el.length;while(i--){var a=el[i];var qName=a.qName;var value=a.value;var nsp=qName.indexOf(\":\");if(nsp>0){var prefix=a.prefix=qName.slice(0,nsp);var localName=qName.slice(nsp+1);var nsPrefix=prefix===\"xmlns\"&&localName}else{localName=qName;prefix=null;nsPrefix=qName===\"xmlns\"&&\"\"}a.localName=localName;if(nsPrefix!==false){if(localNSMap==null){localNSMap={};_copy(currentNSMap,currentNSMap={})}currentNSMap[nsPrefix]=localNSMap[nsPrefix]=value;a.uri=\"http://www.w3.org/2000/xmlns/\";domBuilder.startPrefixMapping(nsPrefix,value)}}var i=el.length;while(i--){a=el[i];var prefix=a.prefix;if(prefix){if(prefix===\"xml\"){a.uri=\"http://www.w3.org/XML/1998/namespace\"}if(prefix!==\"xmlns\"){a.uri=currentNSMap[prefix||\"\"]}}}var nsp=tagName.indexOf(\":\");if(nsp>0){prefix=el.prefix=tagName.slice(0,nsp);localName=el.localName=tagName.slice(nsp+1)}else{prefix=null;localName=el.localName=tagName}var ns=el.uri=currentNSMap[prefix||\"\"];domBuilder.startElement(ns,localName,tagName,el);if(el.closed){domBuilder.endElement(ns,localName,tagName);if(localNSMap){for(prefix in localNSMap){domBuilder.endPrefixMapping(prefix)}}}else{el.currentNSMap=currentNSMap;el.localNSMap=localNSMap;return true}}function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){if(/^(?:script|textarea)$/i.test(tagName)){var elEndStart=source.indexOf(\"\",elStartEnd);var text=source.substring(elStartEnd+1,elEndStart);if(/[&<]/.test(text)){if(/^script$/i.test(tagName)){domBuilder.characters(text,0,text.length);return elEndStart}text=text.replace(/&#?\\w+;/g,entityReplacer);domBuilder.characters(text,0,text.length);return elEndStart}}return elStartEnd+1}function fixSelfClosed(source,elStartEnd,tagName,closeMap){var pos=closeMap[tagName];if(pos==null){pos=source.lastIndexOf(\"\");if(posstart){domBuilder.comment(source,start+4,end-start-4);return end+3}else{errorHandler.error(\"Unclosed comment\");return-1}}else{return-1}default:if(source.substr(start+3,6)==\"CDATA[\"){var end=source.indexOf(\"]]>\",start+9);domBuilder.startCDATA();domBuilder.characters(source,start+9,end-start-9);domBuilder.endCDATA();return end+3}var matchs=split(source,start);var len=matchs.length;if(len>1&&/!doctype/i.test(matchs[0][0])){var name=matchs[1][0];var pubid=len>3&&/^public$/i.test(matchs[2][0])&&matchs[3][0];var sysid=len>4&&matchs[4][0];var lastMatch=matchs[len-1];domBuilder.startDTD(name,pubid&&pubid.replace(/^(['\"])(.*?)\\1$/,\"$2\"),sysid&&sysid.replace(/^(['\"])(.*?)\\1$/,\"$2\"));domBuilder.endDTD();return lastMatch.index+lastMatch[0].length}}return-1}function parseInstruction(source,start,domBuilder){var end=source.indexOf(\"?>\",start);if(end){var match=source.substring(start,end).match(/^<\\?(\\S*)\\s*([\\s\\S]*?)\\s*$/);if(match){var len=match[0].length;domBuilder.processingInstruction(match[1],match[2]);return end+2}else{return-1}}return-1}function ElementAttributes(source){}ElementAttributes.prototype={setTagName:function(tagName){if(!tagNamePattern.test(tagName)){throw new Error(\"invalid tagName:\"+tagName)}this.tagName=tagName},add:function(qName,value,offset){if(!tagNamePattern.test(qName)){throw new Error(\"invalid attribute:\"+qName)}this[this.length++]={qName:qName,value:value,offset:offset}},length:0,getLocalName:function(i){return this[i].localName},getLocator:function(i){return this[i].locator},getQName:function(i){return this[i].qName},getURI:function(i){return this[i].uri},getValue:function(i){return this[i].value}};function _set_proto_(thiz,parent){thiz.__proto__=parent;return thiz}if(!(_set_proto_({},_set_proto_.prototype)instanceof _set_proto_)){_set_proto_=function(thiz,parent){function p(){}p.prototype=parent;p=new p;for(parent in thiz){p[parent]=thiz[parent]}return p}}function split(source,start){var match;var buf=[];var reg=/'[^']+'|\"[^\"]+\"|[^\\s<>\\/=]+=?|(\\/?\\s*>|<)/g;reg.lastIndex=start;reg.exec(source);while(match=reg.exec(source)){buf.push(match);if(match[1])return buf}}exports.XMLReader=XMLReader},{}],\"/src/js/docxtemplater.js\":[function(require,module,exports){\"use strict\";var _createClass=function(){function defineProperties(target,props){for(var i=0;i0){throw new Error(\"The constructor with parameters have been removed in docxtemplater 3.0, please check the upgrade guide.\")}this.compiled={};this.modules=[];this.setOptions({})}_createClass(Docxtemplater,[{key:\"attachModule\",value:function attachModule(module){this.modules.push(wrapper(module));return this}},{key:\"setOptions\",value:function setOptions(options){var _this=this;this.options=options;Object.keys(DocUtils.defaults).forEach(function(key){var defaultValue=DocUtils.defaults[key];_this[key]=_this.options[key]!=null?_this.options[key]:defaultValue});if(this.zip){this.updateFileTypeConfig()}return this}},{key:\"loadZip\",value:function loadZip(zip){if(zip.loadAsync){throw new Error(\"Docxtemplater doesn't handle JSZip version >=3, see changelog\")}this.zip=zip;this.updateFileTypeConfig();return this}},{key:\"compileFile\",value:function compileFile(fileName){var currentFile=this.createTemplateClass(fileName);currentFile.parse();this.compiled[fileName]=currentFile}},{key:\"compile\",value:function compile(){this.templatedFiles=this.fileTypeConfig.getTemplatedFiles(this.zip);return this}},{key:\"updateFileTypeConfig\",value:function updateFileTypeConfig(){this.fileType=this.zip.files[\"word/document.xml\"]?\"docx\":\"pptx\";this.fileTypeConfig=this.options.fileTypeConfig||Docxtemplater.FileTypeConfig[this.fileType];return this}},{key:\"render\",value:function render(){var _this2=this;this.options.xmlFileNames=[];this.modules=this.fileTypeConfig.baseModules.map(function(moduleFunction){return moduleFunction()}).concat(this.modules);this.options=this.modules.reduce(function(options,module){return module.optionsTransformer(options,_this2)},this.options);this.xmlDocuments=this.options.xmlFileNames.reduce(function(xmlDocuments,fileName){var content=_this2.zip.files[fileName].asText();xmlDocuments[fileName]=DocUtils.str2xml(content);return xmlDocuments},{});this.modules.forEach(function(module){module.set({zip:_this2.zip,xmlDocuments:_this2.xmlDocuments,data:_this2.data})});this.compile();this.modules.forEach(function(module){module.set({compiled:_this2.compiled})});this.templatedFiles.forEach(function(fileName){if(_this2.zip.files[fileName]!=null){_this2.compileFile(fileName)}});this.mapper=this.modules.reduce(function(value,module){return module.getRenderedMap(value)},{});Object.keys(this.mapper).forEach(function(to){var mapped=_this2.mapper[to];var from=mapped.from;var currentFile=_this2.compiled[from];currentFile.setTags(mapped.data);currentFile.render(to);_this2.zip.file(to,currentFile.content)});Object.keys(this.xmlDocuments).forEach(function(fileName){_this2.zip.remove(fileName);var content=DocUtils.xml2str(_this2.xmlDocuments[fileName]);return _this2.zip.file(fileName,content,{})});return this}},{key:\"setData\",value:function setData(data){this.data=data;return this}},{key:\"getZip\",value:function getZip(){return this.zip}},{key:\"createTemplateClass\",value:function createTemplateClass(path){var usedData=this.zip.files[path].asText();return this.createTemplateClassFromContent(usedData,path)}},{key:\"createTemplateClassFromContent\",value:function createTemplateClassFromContent(content,filePath){var _this3=this;var xmltOptions={filePath:filePath};Object.keys(DocUtils.defaults).forEach(function(key){xmltOptions[key]=_this3[key]});xmltOptions.fileTypeConfig=this.fileTypeConfig;xmltOptions.modules=this.modules;return new Docxtemplater.XmlTemplater(content,xmltOptions)}},{key:\"getFullText\",value:function getFullText(path){return this.createTemplateClass(path||this.fileTypeConfig.textPath).getFullText()}},{key:\"getTemplatedFiles\",value:function getTemplatedFiles(){this.compile();return this.templatedFiles}}]);return Docxtemplater}();Docxtemplater.DocUtils=require(\"./doc-utils\");Docxtemplater.Errors=require(\"./errors\");Docxtemplater.XmlTemplater=require(\"./xml-templater\");Docxtemplater.FileTypeConfig=require(\"./file-type-config\");Docxtemplater.XmlMatcher=require(\"./xml-matcher\");module.exports=Docxtemplater},{\"./doc-utils\":1,\"./errors\":2,\"./file-type-config\":3,\"./module-wrapper\":7,\"./traits\":16,\"./xml-matcher\":17,\"./xml-templater\":18}]},{},[])(\"/src/js/docxtemplater.js\")});","/*!\n\nJSZip - A Javascript class for generating and reading zip files\n\n\n(c) 2009-2014 Stuart Knightley \nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/master/LICENSE\n*/\n!function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,b.JSZip=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f-this.zero;return-1},d.prototype.readData=function(a){if(this.checkOffset(a),0===a)return[];var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{\"./dataReader\":6}],2:[function(a,b,c){\"use strict\";var d=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";c.encode=function(a,b){for(var c,e,f,g,h,i,j,k=\"\",l=0;l>2,h=(3&c)<<4|e>>4,i=(15&e)<<2|f>>6,j=63&f,isNaN(e)?i=j=64:isNaN(f)&&(j=64),k=k+d.charAt(g)+d.charAt(h)+d.charAt(i)+d.charAt(j);return k},c.decode=function(a,b){var c,e,f,g,h,i,j,k=\"\",l=0;for(a=a.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");l>4,e=(15&h)<<4|i>>2,f=(3&i)<<6|j,k+=String.fromCharCode(c),64!=i&&(k+=String.fromCharCode(e)),64!=j&&(k+=String.fromCharCode(f));return k}},{}],3:[function(a,b,c){\"use strict\";function d(){this.compressedSize=0,this.uncompressedSize=0,this.crc32=0,this.compressionMethod=null,this.compressedContent=null}d.prototype={getContent:function(){return null},getCompressedContent:function(){return null}},b.exports=d},{}],4:[function(a,b,c){\"use strict\";c.STORE={magic:\"\\0\\0\",compress:function(a,b){return a},uncompress:function(a){return a},compressInputType:null,uncompressInputType:null},c.DEFLATE=a(\"./flate\")},{\"./flate\":9}],5:[function(a,b,c){\"use strict\";var d=a(\"./utils\"),e=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];b.exports=function(a,b){if(\"undefined\"==typeof a||!a.length)return 0;var c=\"string\"!==d.getTypeOf(a);\"undefined\"==typeof b&&(b=0);var f=0,g=0,h=0;b^=-1;for(var i=0,j=a.length;i>>8^f;return b^-1}},{\"./utils\":22}],6:[function(a,b,c){\"use strict\";function d(a){this.data=null,this.length=0,this.index=0,this.zero=0}var e=a(\"./utils\");d.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.length=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return e.transformTo(\"string\",this.readData(a))},readData:function(a){},lastIndexOfSignature:function(a){},readDate:function(){var a=this.readInt(4);return new Date((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1)}},b.exports=d},{\"./utils\":22}],7:[function(a,b,c){\"use strict\";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!1,c.date=null,c.compression=null,c.compressionOptions=null,c.comment=null,c.unixPermissions=null,c.dosPermissions=null},{}],8:[function(a,b,c){\"use strict\";var d=a(\"./utils\");c.string2binary=function(a){return d.string2binary(a)},c.string2Uint8Array=function(a){return d.transformTo(\"uint8array\",a)},c.uint8Array2String=function(a){return d.transformTo(\"string\",a)},c.string2Blob=function(a){var b=d.transformTo(\"arraybuffer\",a);return d.arrayBuffer2Blob(b)},c.arrayBuffer2Blob=function(a){return d.arrayBuffer2Blob(a)},c.transformTo=function(a,b){return d.transformTo(a,b)},c.getTypeOf=function(a){return d.getTypeOf(a)},c.checkSupport=function(a){return d.checkSupport(a)},c.MAX_VALUE_16BITS=d.MAX_VALUE_16BITS,c.MAX_VALUE_32BITS=d.MAX_VALUE_32BITS,c.pretty=function(a){return d.pretty(a)},c.findCompression=function(a){return d.findCompression(a)},c.isRegExp=function(a){return d.isRegExp(a)}},{\"./utils\":22}],9:[function(a,b,c){\"use strict\";var d=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,e=a(\"pako\");c.uncompressInputType=d?\"uint8array\":\"array\",c.compressInputType=d?\"uint8array\":\"array\",c.magic=\"\\b\\0\",c.compress=function(a,b){return e.deflateRaw(a,{level:b.level||-1})},c.uncompress=function(a){return e.inflateRaw(a)}},{pako:25}],10:[function(a,b,c){\"use strict\";function d(a,b){return this instanceof d?(this.files={},this.comment=null,this.root=\"\",a&&this.load(a,b),void(this.clone=function(){var a=new d;for(var b in this)\"function\"!=typeof this[b]&&(a[b]=this[b]);return a})):new d(a,b)}var e=a(\"./base64\");d.prototype=a(\"./object\"),d.prototype.load=a(\"./load\"),d.support=a(\"./support\"),d.defaults=a(\"./defaults\"),d.utils=a(\"./deprecatedPublicUtils\"),d.base64={encode:function(a){return e.encode(a)},decode:function(a){return e.decode(a)}},d.compressions=a(\"./compressions\"),b.exports=d},{\"./base64\":2,\"./compressions\":4,\"./defaults\":7,\"./deprecatedPublicUtils\":8,\"./load\":11,\"./object\":14,\"./support\":18}],11:[function(a,b,c){\"use strict\";var d=a(\"./base64\"),e=a(\"./utf8\"),f=a(\"./utils\"),g=a(\"./zipEntries\");b.exports=function(a,b){var c,h,i,j;for(b=f.extend(b||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:e.utf8decode}),b.base64&&(a=d.decode(a)),h=new g(a,b),c=h.files,i=0;i>>=8;return d},u=function(a){return a=a||{},a.base64!==!0||null!==a.binary&&void 0!==a.binary||(a.binary=!0),a=e.extend(a,h),a.date=a.date||new Date,null!==a.compression&&(a.compression=a.compression.toUpperCase()),a},v=function(a,b,c){var d,f=e.getTypeOf(b);if(c=u(c),\"string\"==typeof c.unixPermissions&&(c.unixPermissions=parseInt(c.unixPermissions,8)),c.unixPermissions&&16384&c.unixPermissions&&(c.dir=!0),c.dosPermissions&&16&c.dosPermissions&&(c.dir=!0),c.dir&&(a=x(a)),c.createFolders&&(d=w(a))&&y.call(this,d,!0),c.dir||null===b||\"undefined\"==typeof b)c.base64=!1,c.binary=!1,b=null,f=null;else if(\"string\"===f)c.binary&&!c.base64&&c.optimizedBinaryString!==!0&&(b=e.string2binary(b));else{if(c.base64=!1,c.binary=!0,!(f||b instanceof k))throw new Error(\"The data of '\"+a+\"' is in an unsupported format !\");\"arraybuffer\"===f&&(b=e.transformTo(\"uint8array\",b))}var g=new s(a,b,c);return this.files[a]=g,g},w=function(a){\"/\"==a.slice(-1)&&(a=a.substring(0,a.length-1));var b=a.lastIndexOf(\"/\");return b>0?a.substring(0,b):\"\"},x=function(a){return\"/\"!=a.slice(-1)&&(a+=\"/\"),a},y=function(a,b){return b=\"undefined\"!=typeof b&&b,a=x(a),this.files[a]||v.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},z=function(a,b,c){var d,g=new k;return a._data instanceof k?(g.uncompressedSize=a._data.uncompressedSize,g.crc32=a._data.crc32,0===g.uncompressedSize||a.dir?(b=j.STORE,g.compressedContent=\"\",g.crc32=0):a._data.compressionMethod===b.magic?g.compressedContent=a._data.getCompressedContent():(d=a._data.getContent(),g.compressedContent=b.compress(e.transformTo(b.compressInputType,d),c))):(d=q(a),d&&0!==d.length&&!a.dir||(b=j.STORE,d=\"\"),g.uncompressedSize=d.length,g.crc32=f(d),g.compressedContent=b.compress(e.transformTo(b.compressInputType,d),c)),g.compressedSize=g.compressedContent.length,g.compressionMethod=b.magic,g},A=function(a,b){var c=a;return a||(c=b?16893:33204),(65535&c)<<16},B=function(a,b){return 63&(a||0)},C=function(a,b,c,d,h,i){var j,k,l,n,o=(c.compressedContent,i!==m.utf8encode),p=e.transformTo(\"string\",i(b.name)),q=e.transformTo(\"string\",m.utf8encode(b.name)),r=b.comment||\"\",s=e.transformTo(\"string\",i(r)),u=e.transformTo(\"string\",m.utf8encode(r)),v=q.length!==b.name.length,w=u.length!==r.length,x=b.options,y=\"\",z=\"\",C=\"\";l=b._initialMetadata.dir!==b.dir?b.dir:x.dir,n=b._initialMetadata.date!==b.date?b.date:x.date;var D=0,E=0;l&&(D|=16),\"UNIX\"===h?(E=798,D|=A(b.unixPermissions,l)):(E=20,D|=B(b.dosPermissions,l)),j=n.getHours(),j<<=6,j|=n.getMinutes(),j<<=5,j|=n.getSeconds()/2,k=n.getFullYear()-1980,k<<=4,k|=n.getMonth()+1,k<<=5,k|=n.getDate(),v&&(z=t(1,1)+t(f(p),4)+q,y+=\"up\"+t(z.length,2)+z),w&&(C=t(1,1)+t(this.crc32(s),4)+u,y+=\"uc\"+t(C.length,2)+C);var F=\"\";F+=\"\\n\\0\",F+=o||!v&&!w?\"\\0\\0\":\"\\0\\b\",F+=c.compressionMethod,F+=t(j,2),F+=t(k,2),F+=t(c.crc32,4),F+=t(c.compressedSize,4),F+=t(c.uncompressedSize,4),F+=t(p.length,2),F+=t(y.length,2);var G=g.LOCAL_FILE_HEADER+F+p+y,H=g.CENTRAL_FILE_HEADER+t(E,2)+F+t(s.length,2)+\"\\0\\0\\0\\0\"+t(D,4)+t(d,4)+p+y+s;return{fileRecord:G,dirRecord:H,compressedObject:c}},D={load:function(a,b){throw new Error(\"Load method is not defined. Is the file jszip-load.js included ?\")},filter:function(a){var b,c,d,f,g=[];for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],f=new s(d.name,d._data,e.extend(d.options)),c=b.slice(this.root.length,b.length),b.slice(0,this.root.length)===this.root&&a(c,f)&&g.push(f));return g},file:function(a,b,c){if(1===arguments.length){if(e.isRegExp(a)){var d=a;return this.filter(function(a,b){return!b.dir&&d.test(a)})}return this.filter(function(b,c){return!c.dir&&b===a})[0]||null}return a=this.root+a,v.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(e.isRegExp(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=y.call(this,b),d=this.clone();return d.root=c.name,d},remove:function(a){a=this.root+a;var b=this.files[a];if(b||(\"/\"!=a.slice(-1)&&(a+=\"/\"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d=252?6:h>=248?5:h>=240?4:h>=224?3:h>=192?2:1;g[254]=g[254]=1;var i=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;f>>6,b[g++]=128|63&c):c<65536?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},j=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return c<0?b:0===c?b:c+g[a[c]]>b?c:b},k=function(a){var b,c,e,f,h=a.length,i=new Array(2*h);for(c=0,b=0;b4)i[c++]=65533,b+=f-1;else{for(e&=2===f?31:3===f?15:7;f>1&&b1?i[c++]=65533:e<65536?i[c++]=e:(e-=65536,i[c++]=55296|e>>10&1023,i[c++]=56320|1023&e)}return i.length!==c&&(i.subarray?i=i.subarray(0,c):i.length=c),d.applyFromCharCode(i)};c.utf8encode=function(a){return e.nodebuffer?f(a,\"utf-8\"):i(a)},c.utf8decode=function(a){if(e.nodebuffer)return d.transformTo(\"nodebuffer\",a).toString(\"utf-8\");a=d.transformTo(e.uint8array?\"uint8array\":\"array\",a);for(var b=[],c=0,f=a.length,g=65536;c1;)try{\"array\"===f||\"nodebuffer\"===f?d.push(String.fromCharCode.apply(null,a.slice(g,Math.min(g+b,e)))):d.push(String.fromCharCode.apply(null,a.subarray(g,Math.min(g+b,e)))),g+=b}catch(i){b=Math.floor(b/2)}return d.join(\"\")}function g(a,b){for(var c=0;c1)throw new Error(\"Multi-volumes zip are not supported\")},readLocalFiles:function(){var a,b;for(a=0;a0)this.isSignature(c,j.CENTRAL_FILE_HEADER)||(this.reader.zero=e);else if(e<0)throw new Error(\"Corrupted zip: missing \"+Math.abs(e)+\" bytes.\")},prepareReader:function(a){var b=i.getTypeOf(a);if(i.checkSupport(b),\"string\"!==b||l.uint8array)if(\"nodebuffer\"===b)this.reader=new f(a);else if(l.uint8array)this.reader=new g(i.transformTo(\"uint8array\",a));else{if(!l.array)throw new Error(\"Unexpected error: unsupported type '\"+b+\"'\");this.reader=new h(i.transformTo(\"array\",a))}else this.reader=new e(a,this.loadOptions.optimizedBinaryString)},load:function(a){this.prepareReader(a),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},b.exports=d},{\"./arrayReader\":1,\"./nodeBufferReader\":13,\"./object\":14,\"./signature\":15,\"./stringReader\":16,\"./support\":18,\"./uint8ArrayReader\":19,\"./utils\":22,\"./zipEntry\":24}],24:[function(a,b,c){\"use strict\";function d(a,b){this.options=a,this.loadOptions=b}var e=a(\"./stringReader\"),f=a(\"./utils\"),g=a(\"./compressedObject\"),h=a(\"./object\"),i=a(\"./support\"),j=0,k=3;d.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},prepareCompressedContent:function(a,b,c){return function(){var d=a.index;a.setIndex(b);var e=a.readData(c);return a.setIndex(d),e}},prepareContent:function(a,b,c,d,e){return function(){var a=f.transformTo(d.uncompressInputType,this.getCompressedContent()),b=d.uncompress(a);if(b.length!==e)throw new Error(\"Bug : uncompressed data size mismatch\");return b}},readLocalPart:function(a){var b,c;if(a.skip(22),this.fileNameLength=a.readInt(2),c=a.readInt(2),this.fileName=a.readData(this.fileNameLength),a.skip(c),this.compressedSize==-1||this.uncompressedSize==-1)throw new Error(\"Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize == -1 || uncompressedSize == -1)\");if(b=f.findCompression(this.compressionMethod),null===b)throw new Error(\"Corrupted zip : compression \"+f.pretty(this.compressionMethod)+\" unknown (inner file : \"+f.transformTo(\"string\",this.fileName)+\")\");if(this.decompressed=new g,this.decompressed.compressedSize=this.compressedSize,this.decompressed.uncompressedSize=this.uncompressedSize,this.decompressed.crc32=this.crc32,this.decompressed.compressionMethod=this.compressionMethod,this.decompressed.getCompressedContent=this.prepareCompressedContent(a,a.index,this.compressedSize,b),this.decompressed.getContent=this.prepareContent(a,a.index,this.compressedSize,b,this.uncompressedSize),this.loadOptions.checkCRC32&&(this.decompressed=f.transformTo(\"string\",this.decompressed.getContent()),h.crc32(this.decompressed)!==this.crc32))throw new Error(\"Corrupted zip : CRC32 mismatch\");\n},readCentralPart:function(a){if(this.versionMadeBy=a.readInt(2),this.versionNeeded=a.readInt(2),this.bitFlag=a.readInt(2),this.compressionMethod=a.readString(2),this.date=a.readDate(),this.crc32=a.readInt(4),this.compressedSize=a.readInt(4),this.uncompressedSize=a.readInt(4),this.fileNameLength=a.readInt(2),this.extraFieldsLength=a.readInt(2),this.fileCommentLength=a.readInt(2),this.diskNumberStart=a.readInt(2),this.internalFileAttributes=a.readInt(2),this.externalFileAttributes=a.readInt(4),this.localHeaderOffset=a.readInt(4),this.isEncrypted())throw new Error(\"Encrypted zip are not supported\");this.fileName=a.readData(this.fileNameLength),this.readExtraFields(a),this.parseZIP64ExtraField(a),this.fileComment=a.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var a=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),a===j&&(this.dosPermissions=63&this.externalFileAttributes),a===k&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(a){if(this.extraFields[1]){var b=new e(this.extraFields[1].value);this.uncompressedSize===f.MAX_VALUE_32BITS&&(this.uncompressedSize=b.readInt(8)),this.compressedSize===f.MAX_VALUE_32BITS&&(this.compressedSize=b.readInt(8)),this.localHeaderOffset===f.MAX_VALUE_32BITS&&(this.localHeaderOffset=b.readInt(8)),this.diskNumberStart===f.MAX_VALUE_32BITS&&(this.diskNumberStart=b.readInt(4))}},readExtraFields:function(a){var b,c,d,e=a.index;for(this.extraFields=this.extraFields||{};a.index0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var c=h.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==p)throw new Error(k[c]);if(b.header&&h.deflateSetHeader(this.strm,b.header),b.dictionary){var e;if(e=\"string\"==typeof b.dictionary?j.string2buf(b.dictionary):\"[object ArrayBuffer]\"===m.call(b.dictionary)?new Uint8Array(b.dictionary):b.dictionary,c=h.deflateSetDictionary(this.strm,e),c!==p)throw new Error(k[c]);this._dict_set=!0}}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}function g(a,b){return b=b||{},b.gzip=!0,e(a,b)}var h=a(\"./zlib/deflate\"),i=a(\"./utils/common\"),j=a(\"./utils/strings\"),k=a(\"./zlib/messages\"),l=a(\"./zlib/zstream\"),m=Object.prototype.toString,n=0,o=4,p=0,q=1,r=2,s=-1,t=0,u=8;d.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?o:n,\"string\"==typeof a?e.input=j.string2buf(a):\"[object ArrayBuffer]\"===m.call(a)?e.input=new Uint8Array(a):e.input=a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new i.Buf8(f),e.next_out=0,e.avail_out=f),c=h.deflate(e,d),c!==q&&c!==p)return this.onEnd(c),this.ended=!0,!1;0!==e.avail_out&&(0!==e.avail_in||d!==o&&d!==r)||(\"string\"===this.options.to?this.onData(j.buf2binstring(i.shrinkBuf(e.output,e.next_out))):this.onData(i.shrinkBuf(e.output,e.next_out)))}while((e.avail_in>0||0===e.avail_out)&&c!==q);return d===o?(c=h.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===p):d!==r||(this.onEnd(p),e.avail_out=0,!0)},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===p&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=d,c.deflate=e,c.deflateRaw=f,c.gzip=g},{\"./utils/common\":28,\"./utils/strings\":29,\"./zlib/deflate\":33,\"./zlib/messages\":38,\"./zlib/zstream\":40}],27:[function(a,b,c){\"use strict\";function d(a){if(!(this instanceof d))return new d(a);this.options=h.assign({chunkSize:16384,windowBits:0,to:\"\"},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0===(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var c=g.inflateInit2(this.strm,b.windowBits);if(c!==j.Z_OK)throw new Error(k[c]);this.header=new m,g.inflateGetHeader(this.strm,this.header)}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}var g=a(\"./zlib/inflate\"),h=a(\"./utils/common\"),i=a(\"./utils/strings\"),j=a(\"./zlib/constants\"),k=a(\"./zlib/messages\"),l=a(\"./zlib/zstream\"),m=a(\"./zlib/gzheader\"),n=Object.prototype.toString;d.prototype.push=function(a,b){var c,d,e,f,k,l,m=this.strm,o=this.options.chunkSize,p=this.options.dictionary,q=!1;if(this.ended)return!1;d=b===~~b?b:b===!0?j.Z_FINISH:j.Z_NO_FLUSH,\"string\"==typeof a?m.input=i.binstring2buf(a):\"[object ArrayBuffer]\"===n.call(a)?m.input=new Uint8Array(a):m.input=a,m.next_in=0,m.avail_in=m.input.length;do{if(0===m.avail_out&&(m.output=new h.Buf8(o),m.next_out=0,m.avail_out=o),c=g.inflate(m,j.Z_NO_FLUSH),c===j.Z_NEED_DICT&&p&&(l=\"string\"==typeof p?i.string2buf(p):\"[object ArrayBuffer]\"===n.call(p)?new Uint8Array(p):p,c=g.inflateSetDictionary(this.strm,l)),c===j.Z_BUF_ERROR&&q===!0&&(c=j.Z_OK,q=!1),c!==j.Z_STREAM_END&&c!==j.Z_OK)return this.onEnd(c),this.ended=!0,!1;m.next_out&&(0!==m.avail_out&&c!==j.Z_STREAM_END&&(0!==m.avail_in||d!==j.Z_FINISH&&d!==j.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(e=i.utf8border(m.output,m.next_out),f=m.next_out-e,k=i.buf2string(m.output,e),m.next_out=f,m.avail_out=o-f,f&&h.arraySet(m.output,m.output,e,f,0),this.onData(k)):this.onData(h.shrinkBuf(m.output,m.next_out)))),0===m.avail_in&&0===m.avail_out&&(q=!0)}while((m.avail_in>0||0===m.avail_out)&&c!==j.Z_STREAM_END);return c===j.Z_STREAM_END&&(d=j.Z_FINISH),d===j.Z_FINISH?(c=g.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===j.Z_OK):d!==j.Z_SYNC_FLUSH||(this.onEnd(j.Z_OK),m.avail_out=0,!0)},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===j.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=d,c.inflate=e,c.inflateRaw=f,c.ungzip=e},{\"./utils/common\":28,\"./utils/strings\":29,\"./zlib/constants\":31,\"./zlib/gzheader\":34,\"./zlib/inflate\":36,\"./zlib/messages\":38,\"./zlib/zstream\":40}],28:[function(a,b,c){\"use strict\";var d=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if(\"object\"!=typeof c)throw new TypeError(c+\"must be non-object\");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;f=252?6:j>=248?5:j>=240?4:j>=224?3:j>=192?2:1;i[254]=i[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;f>>6,b[g++]=128|63&c):c<65536?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;c4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&c1?j[e++]=65533:f<65536?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return c<0?b:0===c?b:c+i[a[c]]>b?c:b}},{\"./common\":28}],30:[function(a,b,c){\"use strict\";function d(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do e=e+b[d++]|0,f=f+e|0;while(--g);e%=65521,f%=65521}return e|f<<16|0}b.exports=d},{}],31:[function(a,b,c){\"use strict\";b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],32:[function(a,b,c){\"use strict\";function d(){for(var a,b=[],c=0;c<256;c++){a=c;for(var d=0;d<8;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function e(a,b,c,d){var e=f,g=d+c;a^=-1;for(var h=d;h>>8^e[255&(a^b[h])];return a^-1}var f=d();b.exports=e},{}],33:[function(a,b,c){\"use strict\";function d(a,b){return a.msg=I[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(E.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){F._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,E.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=G(a.adler,b,e,c):2===a.state.wrap&&(a.adler=H(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-la?a.strstart-(a.w_size-la):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ka,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do;while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&fg){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}while((b=l[b&k])>i&&0!==--e);return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-la)){E.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do d=a.head[--b],a.head[b]=d>=g?d-g:0;while(--c);c=g,b=c;do d=a.prev[--b],a.prev[b]=d>=g?d-g:0;while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=ja)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===J)return ua;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return ua;if(a.strstart-a.block_start>=a.w_size-la&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?ua:ua}function o(a,b){for(var c,d;;){if(a.lookahead=ja&&(a.ins_h=(a.ins_h<=ja)if(d=F._tr_tally(a,a.strstart-a.match_start,a.match_length-ja),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=ja){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<=ja&&(a.ins_h=(a.ins_h<4096)&&(a.match_length=ja-1)),a.prev_length>=ja&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-ja,d=F._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-ja),a.lookahead-=a.prev_length-1,a.prev_length-=2;do++a.strstart<=e&&(a.ins_h=(a.ins_h<=ja&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ka;do;while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&ea.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=ja?(c=F._tr_tally(a,1,a.match_length-ja),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===J)return ua;break}if(a.match_length=0,c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function s(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e}function t(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=D[a.level].max_lazy,a.good_match=D[a.level].good_length,a.nice_match=D[a.level].nice_length,a.max_chain_length=D[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=ja-1,a.match_available=0,a.ins_h=0}function u(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=$,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new E.Buf16(2*ha),this.dyn_dtree=new E.Buf16(2*(2*fa+1)),this.bl_tree=new E.Buf16(2*(2*ga+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new E.Buf16(ia+1),this.heap=new E.Buf16(2*ea+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new E.Buf16(2*ea+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function v(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=Z,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?na:sa,a.adler=2===b.wrap?0:1,b.last_flush=J,F._tr_init(b),O):d(a,Q)}function w(a){var b=v(a);return b===O&&t(a.state),b}function x(a,b){return a&&a.state?2!==a.state.wrap?Q:(a.state.gzhead=b,O):Q}function y(a,b,c,e,f,g){if(!a)return Q;var h=1;if(b===T&&(b=6),e<0?(h=0,e=-e):e>15&&(h=2,e-=16),f<1||f>_||c!==$||e<8||e>15||b<0||b>9||g<0||g>X)return d(a,Q);8===e&&(e=9);var i=new u;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<N||b<0)return a?d(a,Q):Q;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===ta&&b!==M)return d(a,0===a.avail_out?S:Q);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===na)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8),h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=V||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=H(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=oa):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=V||h.level<2?4:0),i(h,ya),h.status=sa);else{var m=$+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=V||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=ma),m+=31-m%31,h.status=sa,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===oa)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=pa)}else h.status=pa;if(h.status===pa)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=qa)}else h.status=qa;if(h.status===qa)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=ra)}else h.status=ra;if(h.status===ra&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=sa)):h.status=sa),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,O}else if(0===a.avail_in&&e(b)<=e(c)&&b!==M)return d(a,S);if(h.status===ta&&0!==a.avail_in)return d(a,S);if(0!==a.avail_in||0!==h.lookahead||b!==J&&h.status!==ta){var o=h.strategy===V?r(h,b):h.strategy===W?q(h,b):D[h.level].func(h,b);if(o!==wa&&o!==xa||(h.status=ta),o===ua||o===wa)return 0===a.avail_out&&(h.last_flush=-1),O;if(o===va&&(b===K?F._tr_align(h):b!==N&&(F._tr_stored_block(h,0,0,!1),b===L&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,O}return b!==M?O:h.wrap<=0?P:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?O:P)}function B(a){var b;return a&&a.state?(b=a.state.status,b!==na&&b!==oa&&b!==pa&&b!==qa&&b!==ra&&b!==sa&&b!==ta?d(a,Q):(a.state=null,b===sa?d(a,R):O)):Q}function C(a,b){var c,d,e,g,h,i,j,k,l=b.length;if(!a||!a.state)return Q;if(c=a.state,g=c.wrap,2===g||1===g&&c.status!==na||c.lookahead)return Q;for(1===g&&(a.adler=G(a.adler,b,l,0)),c.wrap=0,l>=c.w_size&&(0===g&&(f(c.head),c.strstart=0,c.block_start=0,c.insert=0),k=new E.Buf8(c.w_size),E.arraySet(k,b,l-c.w_size,c.w_size,0),b=k,l=c.w_size),h=a.avail_in,i=a.next_in,j=a.input,a.avail_in=l,a.next_in=0,a.input=b,m(c);c.lookahead>=ja;){d=c.strstart,e=c.lookahead-(ja-1);do c.ins_h=(c.ins_h<>>24,p>>>=w,q-=w,w=v>>>16&255,0===w)C[h++]=65535&v;else{if(!(16&w)){if(0===(64&w)){v=r[(65535&v)+(p&(1<>>=w,q-=w),q<15&&(p+=B[f++]<>>24,p>>>=w,q-=w,w=v>>>16&255,!(16&w)){if(0===(64&w)){v=s[(65535&v)+(p&(1<k){a.msg=\"invalid distance too far back\",c.mode=d;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&c.sane){a.msg=\"invalid distance too far back\",c.mode=d;break a}if(z=0,A=o,0===n){if(z+=l-w,w2;)C[h++]=A[z++],C[h++]=A[z++],C[h++]=A[z++],x-=3;x&&(C[h++]=A[z++],x>1&&(C[h++]=A[z++]))}else{z=h-y;do C[h++]=C[z++],C[h++]=C[z++],C[h++]=C[z++],x-=3;while(x>2);x&&(C[h++]=C[z++],x>1&&(C[h++]=C[z++]))}break}}break}}while(f>3,f-=x,q-=x<<3,p&=(1<>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new s.Buf16(320),this.work=new s.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg=\"\",b.wrap&&(a.adler=1&b.wrap),b.mode=L,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new s.Buf32(pa),b.distcode=b.distdyn=new s.Buf32(qa),b.sane=1,b.back=-1,D):G}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):G}function h(a,b){var c,d;return a&&a.state?(d=a.state,b<0?(c=0,b=-b):(c=(b>>4)+1,b<48&&(b&=15)),b&&(b<8||b>15)?G:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):G}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==D&&(a.state=null),c):G}function j(a){return i(a,sa)}function k(a){if(ta){var b;for(q=new s.Buf32(512),r=new s.Buf32(32),b=0;b<144;)a.lens[b++]=8;for(;b<256;)a.lens[b++]=9;for(;b<280;)a.lens[b++]=7;for(;b<288;)a.lens[b++]=8;for(w(y,a.lens,0,288,q,0,a.work,{bits:9}),b=0;b<32;)a.lens[b++]=5;w(z,a.lens,0,32,r,0,a.work,{bits:5}),ta=!1}a.lencode=q,a.lenbits=9,a.distcode=r,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<=f.wsize?(s.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),s.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(s.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whave>>8&255,c.check=u(c.check,Ba,2,0),m=0,n=0,c.mode=M;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg=\"incorrect header check\",c.mode=ma;break}if((15&m)!==K){a.msg=\"unknown compression method\",c.mode=ma;break}if(m>>>=4,n-=4,wa=(15&m)+8,0===c.wbits)c.wbits=wa;else if(wa>c.wbits){a.msg=\"invalid window size\",c.mode=ma;break}c.dmax=1<>8&1),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=N;case N:for(;n<32;){if(0===i)break a;i--,m+=e[g++]<>>8&255,Ba[2]=m>>>16&255,Ba[3]=m>>>24&255,c.check=u(c.check,Ba,4,0)),m=0,n=0,c.mode=O;case O:for(;n<16;){if(0===i)break a;i--,m+=e[g++]<>8),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=P;case P:if(1024&c.flags){for(;n<16;){if(0===i)break a;i--,m+=e[g++]<>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=Q;case Q:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wa=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),s.arraySet(c.head.extra,e,g,q,wa)),512&c.flags&&(c.check=u(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=R;case R:if(2048&c.flags){if(0===i)break a;q=0;do wa=e[g+q++],c.head&&wa&&c.length<65536&&(c.head.name+=String.fromCharCode(wa));while(wa&&q>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=W;break;case U:for(;n<32;){if(0===i)break a;i--,m+=e[g++]<>>=7&n,n-=7&n,c.mode=ja;break}for(;n<3;){if(0===i)break a;i--,m+=e[g++]<>>=1,n-=1,3&m){case 0:c.mode=Y;break;case 1:if(k(c),c.mode=ca,b===C){m>>>=2,n-=2;break a}break;case 2:c.mode=_;break;case 3:a.msg=\"invalid block type\",c.mode=ma}m>>>=2,n-=2;break;case Y:for(m>>>=7&n,n-=7&n;n<32;){if(0===i)break a;i--,m+=e[g++]<>>16^65535)){a.msg=\"invalid stored block lengths\",c.mode=ma;break}if(c.length=65535&m,m=0,n=0,c.mode=Z,b===C)break a;case Z:c.mode=$;case $:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;s.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=W;break;case _:for(;n<14;){if(0===i)break a;i--,m+=e[g++]<>>=5,n-=5,c.ndist=(31&m)+1,m>>>=5,n-=5,c.ncode=(15&m)+4,m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg=\"too many length or distance symbols\",c.mode=ma;break}c.have=0,c.mode=aa;case aa:for(;c.have>>=3,n-=3}for(;c.have<19;)c.lens[Ca[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,ya={bits:c.lenbits},xa=w(x,c.lens,0,19,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg=\"invalid code lengths set\",c.mode=ma;break}c.have=0,c.mode=ba;case ba:for(;c.have>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<>>=qa,n-=qa,c.lens[c.have++]=sa;else{if(16===sa){for(za=qa+2;n>>=qa,n-=qa,0===c.have){a.msg=\"invalid bit length repeat\",c.mode=ma;break}wa=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sa){for(za=qa+3;n>>=qa,n-=qa,wa=0,q=3+(7&m),m>>>=3,n-=3}else{for(za=qa+7;n>>=qa,n-=qa,wa=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg=\"invalid bit length repeat\",c.mode=ma;break}for(;q--;)c.lens[c.have++]=wa}}if(c.mode===ma)break;if(0===c.lens[256]){a.msg=\"invalid code -- missing end-of-block\",c.mode=ma;break}if(c.lenbits=9,ya={bits:c.lenbits},xa=w(y,c.lens,0,c.nlen,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg=\"invalid literal/lengths set\",c.mode=ma;break}if(c.distbits=6,c.distcode=c.distdyn,ya={bits:c.distbits},xa=w(z,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,ya),c.distbits=ya.bits,xa){a.msg=\"invalid distances set\",c.mode=ma;break}if(c.mode=ca,b===C)break a;case ca:c.mode=da;case da:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,v(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===W&&(c.back=-1);break}for(c.back=0;Aa=c.lencode[m&(1<>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(ta+qa<=n);){if(0===i)break a;i--,m+=e[g++]<>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,c.length=sa,0===ra){c.mode=ia;break}if(32&ra){c.back=-1,c.mode=W;break}if(64&ra){a.msg=\"invalid literal/length code\",c.mode=ma;break}c.extra=15&ra,c.mode=ea;case ea:if(c.extra){for(za=c.extra;n>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=fa;case fa:for(;Aa=c.distcode[m&(1<>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(ta+qa<=n);){if(0===i)break a;i--,m+=e[g++]<>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,64&ra){a.msg=\"invalid distance code\",c.mode=ma;break}c.offset=sa,c.extra=15&ra,c.mode=ga;case ga:if(c.extra){for(za=c.extra;n>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg=\"invalid distance too far back\",c.mode=ma;break}c.mode=ha;case ha:if(0===j)break a;if(q=p-j,c.offset>q){if(q=c.offset-q,q>c.whave&&c.sane){a.msg=\"invalid distance too far back\",c.mode=ma;break}q>c.wnext?(q-=c.wnext,r=c.wsize-q):r=c.wnext-q,q>c.length&&(q=c.length),pa=c.window}else pa=f,r=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pa[r++];while(--q);0===c.length&&(c.mode=da);break;case ia:if(0===j)break a;f[h++]=c.length,j--,c.mode=da;break;case ja:if(c.wrap){for(;n<32;){if(0===i)break a;i--,m|=e[g++]<=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return p[q++]=20971520,p[q++]=20971520,s.bits=1,0;for(F=1;F0&&(a===h||1!==G))return-1;for(Q[1]=0,D=1;Df||a===j&&L>g)return 1;for(var T=0;;){T++,z=D-J,r[E]y?(A=R[S+r[E]],B=N[O+r[E]]):(A=96,B=0),t=1<>J)+u]=z<<24|A<<16|B|0;while(0!==u);for(t=1<>=1;if(0!==t?(M&=t-1,M+=t):M=0,E++,0===--P[D]){if(D===G)break;D=b[c+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<f||a===j&&L>g)return 1;v=M&w,p[v]=H<<24|I<<16|x-q|0}}return 0!==M&&(p[x+M]=D-J<<24|64<<16|0),s.bits=H,0}},{\"../utils/common\":28}],38:[function(a,b,c){\"use strict\";b.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},{}],39:[function(a,b,c){\"use strict\";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length}function f(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b}function g(a){return a<256?ia[a]:ia[256+(a>>>7)]}function h(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function i(a,b,c){a.bi_valid>X-c?(a.bi_buf|=b<>X-a.bi_valid,a.bi_valid+=c-X):(a.bi_buf|=b<>>=1,c<<=1;while(--b>0);return c>>>1}function l(a){16===a.bi_valid?(h(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function m(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;f<=W;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;co&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)e=a.heap[--c],e>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function n(a,b,c){var d,e,f=new Array(W+1),g=0;for(d=1;d<=W;d++)f[d]=g=g+c[d-1]<<1;for(e=0;e<=b;e++){var h=a[2*e+1];0!==h&&(a[2*e]=k(f[h]++,h))}}function o(){var a,b,c,d,f,g=new Array(W+1);for(c=0,d=0;d>=7;d8?h(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function r(a,b,c,d){q(a),d&&(h(a,c),h(a,~c)),G.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function s(a,b,c,d){var e=2*b,f=2*c;return a[e]>1;c>=1;c--)t(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],t(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,t(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],m(a,b),n(f,j,a.bl_count)}function w(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;d<=c;d++)e=g,g=b[2*(d+1)+1],++h=3&&0===a.bl_tree[2*ea[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function z(a,b,c,d){var e;for(i(a,b-257,5),i(a,c-1,5),i(a,d-4,4),e=0;e>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return I;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return J;for(b=32;b0?(a.strm.data_type===K&&(a.strm.data_type=A(a)),v(a,a.l_desc),v(a,a.d_desc),g=y(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,f<=e&&(e=f)):e=f=c+5,c+4<=e&&b!==-1?C(a,b,c,d):a.strategy===H||f===e?(i(a,(M<<1)+(d?1:0),3),u(a,ga,ha)):(i(a,(N<<1)+(d?1:0),3),z(a,a.l_desc.max_code+1,a.d_desc.max_code+1,g+1),u(a,a.dyn_ltree,a.dyn_dtree)),p(a),d&&q(a)}function F(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(ja[c]+R+1)]++,a.dyn_dtree[2*g(b)]++),a.last_lit===a.lit_bufsize-1}var G=a(\"../utils/common\"),H=4,I=0,J=1,K=2,L=0,M=1,N=2,O=3,P=258,Q=29,R=256,S=R+1+Q,T=30,U=19,V=2*S+1,W=15,X=16,Y=7,Z=256,$=16,_=17,aa=18,ba=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],ca=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],da=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],ea=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],fa=512,ga=new Array(2*(S+2));d(ga);var ha=new Array(2*T);d(ha);var ia=new Array(fa);d(ia);var ja=new Array(P-O+1);d(ja);var ka=new Array(Q);d(ka);var la=new Array(T);d(la);var ma,na,oa,pa=!1;c._tr_init=B,c._tr_stored_block=C,c._tr_flush_block=E,c._tr_tally=F,c._tr_align=D},{\"../utils/common\":28}],40:[function(a,b,c){\"use strict\";function d(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}b.exports=d},{}]},{},[10])(10)});\n","var EventEmitter = require(\"events\").EventEmitter;\n\nclass Account extends EventEmitter {\n constructor() {\n super();\n\n this.isAuthenticated = false;\n this._config = null;\n\n this._listRoles = null;\n // {array}\n // a list of all the Defined Roles in the Tenant's system.\n\n this._listScopes = null;\n // {array | null}\n // a list of all the Defined Scopes in the Tenant's sytem.\n\n this._listUsers = null;\n // {array | null}\n // a list of all the Defined Users in the Tenant's system.\n }\n\n init(AB) {\n // {ABFactory} AB\n\n this.AB = AB;\n var UserConfig = this.AB.Config.userConfig();\n if (UserConfig) {\n this.isAuthenticated = true;\n this._config = UserConfig;\n }\n\n var MetaConfig = this.AB.Config.metaConfig();\n if (MetaConfig) {\n this._listRoles = MetaConfig.roles || [];\n this._listScopes = MetaConfig.scopes || [];\n this._listUsers = MetaConfig.users || [];\n }\n\n this.AB.Network.on(\"account.logout\", (context, err, data) => {\n if (err) {\n console.error(err);\n return;\n }\n this.emit(\"logout\", data);\n });\n\n return Promise.resolve();\n }\n\n canSwitcheroo() {\n return (\n this.roles((r) => r.uuid === \"320ef94a-73b5-476e-9db4-c08130c64bb8\")\n .length > 0\n );\n }\n\n isSwitcherood() {\n return this.AB.Config.userReal();\n }\n\n isSystemDesigner() {\n return (\n this.roles((r) => r.uuid === \"6cc04894-a61b-4fb5-b3e5-b8c3f78bd331\")\n .length > 0\n );\n }\n\n email() {\n return this._config?.email ?? \"\";\n }\n\n language() {\n return this._config?.languageCode ?? \"en\";\n }\n\n logout() {\n return this.AB.Network.post(\n {\n url: \"/auth/logout\",\n data: { tenantUrl: this.AB.Tenant.setting(\"url\") },\n },\n {\n key: \"account.logout\",\n context: {},\n }\n );\n }\n\n roles(fn = () => true) {\n return (this._config?.roles || []).filter(fn);\n }\n rolesAll() {\n return this._listRoles;\n }\n\n scopes() {\n return this._listScopes;\n }\n\n username() {\n return this._config?.username;\n }\n\n userList() {\n return this._listUsers;\n }\n\n uuid() {\n return this._config?.uuid;\n }\n\n imageID() {\n return this._config?.image_id;\n }\n\n sendEmailNotifications() {\n return this._config?.sendEmailNotifications;\n }\n}\n\nexport default new Account();\n","/*\n * Multilingual\n * manage our multilingual Translations/Labels/etc.\n */\n\nvar MLClass = require(\"../AppBuilder/platform/ABMLClass\");\n\nclass Multilingual extends MLClass {\n constructor() {\n super([], {});\n // super()\n // [] = no labels\n // {} = placeholder ABFactory entry until .init() is called.\n\n this.isAuthenticated = false;\n this._config = null;\n\n this._missingLabelID = false;\n this._missingLabels = {};\n this._pluginLabelsMissing = {};\n\n this.isLabelUpdateEnabled = false;\n // {bool}\n // we can only update labels on the server if this is enabled.\n // Only on a Developers environment should we enable this:\n // javascript console: > window.AB.Multilingual.enableLabelUpdates();\n }\n\n init(AB) {\n // {ABFactory} AB\n\n this.AB = AB;\n\n this.labels = this.AB.Config.labelConfig();\n this._languages = this.AB.Config.languageConfig();\n\n this.pluginLabels = {};\n\n // this isn't actually an Async operation, so just resolve()\n return Promise.resolve();\n }\n\n currentLanguage() {\n return this.AB.Account.language();\n }\n\n enableLabelUpdates() {\n this.isLabelUpdateEnabled = true;\n }\n\n label(key, altText, values = [], postMissing = true) {\n if (typeof key == \"undefined\") {\n return \"\";\n }\n\n // part of our transition: L(\"single string\") should start to work:\n if (typeof altText == \"undefined\" && key) {\n altText = key;\n }\n\n // other case: L(\"single string {0}\", [])\n if (arguments.length == 2 && Array.isArray(altText)) {\n values = altText;\n altText = key;\n }\n\n // We need to escape \" characters or else they will get added to the the lang.js\n // then we get errors next time we try to parse it as JSON (see appbuilder.label-missing)\n altText = altText.replace(/\"/g, '\\\\\"');\n key = key.replace(/\"/g, '\\\\\"');\n\n // NOTE: transition to new Labels\n // currently our code still uses the L(key, altText, values) format, but\n // the labels we get back are in L(altText, values) format.\n //\n // we are going to keep this like this until we have a well functioning\n // UI display of our Apps, which should flesh out most of the missing\n // labels to our files.\n //\n // After that, convert our L(k, t, v) to L(t, v)\n\n var newKey = altText;\n if (newKey[0] == \"*\") {\n newKey = newKey.slice(1);\n }\n var label = this.labels[newKey];\n if (!label) {\n if (postMissing) {\n this.postMissingLabel(key, altText);\n }\n label = altText;\n }\n\n values.forEach((v, i) => {\n var sub = `{${i}}`;\n label = label.replaceAll(sub, v);\n });\n label = label.replace(/\\\\\"/g, '\"'); // unescape \" in the label\n return label;\n }\n\n labelPlugin(plugin, altText, values = []) {\n // 1st check to see if it is a common label from platform:\n var label = this.label(altText, altText, values, false);\n if (!label) {\n // ok, so check to see if it is a Plugin Label:\n label = this.pluginLabels[plugin][altText];\n }\n if (!label) {\n // !! record it missing.\n this._pluginLabelsMissing[plugin] =\n this._pluginLabelsMissing[plugin] || {};\n this._pluginLabelsMissing[plugin][altText] = altText;\n label = altText;\n }\n values.forEach((v, i) => {\n var sub = `{${i}}`;\n label = label.replaceAll(sub, v);\n });\n return label;\n }\n\n languages() {\n return this._languages;\n\n // console.error(\n // \"Multilingual:languages(): Implement Language Storage/Retrieval.\"\n // );\n // return [];\n }\n\n pluginLoadLabels(key, labels) {\n this.pluginLabels[key] = labels;\n }\n pluginLabelReport(key) {\n console.warn(\"missing labels for plugin: \", key);\n console.warn(\"current language:\", this.currentLanguage());\n var labels = JSON.stringify(this._pluginLabelsMissing[key], null, 3);\n console.warn(labels);\n }\n\n postMissingLabel(key, altText) {\n if (!this.isLabelUpdateEnabled) return;\n\n if (this._missingLabelID) {\n clearTimeout(this._missingLabelID);\n }\n var batchLength = 50;\n var sendBatch = () => {\n var batchLabels = [];\n let missingLabels = Object.keys(this._missingLabels).map(\n (k) => this._missingLabels[k]\n );\n if (missingLabels.length <= batchLength) {\n batchLabels = missingLabels;\n this._missingLabels = {};\n } else {\n for (var i = 0; i <= batchLength; i++) {\n var l = missingLabels.shift();\n batchLabels.push(l);\n delete this._missingLabels[l.key];\n }\n }\n this.AB.Network.post({\n url: \"/multilingual/label-missing\",\n data: { labels: JSON.stringify(batchLabels) },\n })\n .then(() => {\n if (Object.keys(this._missingLabels).length > 0) {\n sendBatch();\n }\n })\n .catch((err) => {\n const strErr = err.toString();\n if (strErr.indexOf(\"unable to get\") > -1) {\n console.error(\n \"Missing language file for :\" + this.currentLanguage()\n );\n }\n });\n };\n this._missingLabelID = setTimeout(() => {\n sendBatch();\n }, 1000);\n\n this._missingLabels[key] = { key, altText };\n }\n ///\n /// Disable un-needed ABMLClass functionality\n ///\n /// NOTE: we are mainly Piggybacking on ABMLClass for it's\n /// .translate() and .unTranslate() capabilities. So disable these\n /// for good measure.\n destroy() {\n console.error(\"Multilingual:destroy(): Should not be called.\");\n return Promise.resolve();\n }\n save() {\n console.error(\"Multilingual:save(): Should not be called.\");\n return Promise.resolve();\n }\n toObj() {\n console.error(\"Multilingual:toObj(): Should not be called.\");\n return {};\n }\n toDefinition() {\n console.error(\"Multilingual:toDefinition(): Should not be called.\");\n return {};\n }\n}\n\nexport default new Multilingual();\n","/*\n * Network.js\n * A network manager for interfacing with our AppBuilder server.\n */\n/* global Connection */\nvar EventEmitter = require(\"events\").EventEmitter;\nimport performance from \"../utils/performance\";\nimport NetworkRest from \"./NetworkRest\";\nimport NetworkRestSocket from \"./NetworkRestSocket\";\n// import NetworkRelay from \"./NetworkRelay\";\n\nclass Network extends EventEmitter {\n constructor() {\n super();\n\n this.setMaxListeners(0);\n // we'll have > 10 for sure!\n\n this.queueLock = null;\n // {Lock} .queueLock\n // our semaphore for coordinating our access to our local storage.\n\n this._config = null;\n this._network = null;\n // {NetworkRelay | NetworkRest | NetworkSocket}\n // the underlying Network connection object actually performing the\n // communications with the Server.\n // Which one is specified in the config.appbuilder.networkType setting\n\n this._queueCount = 0;\n // {int} _queueCount\n // the # of network operations currently queued, pending Network\n // reconnect.\n\n this.cachJobResponse = {};\n // { jobID : { jobResponse } }\n // hash of the queued jobResponses for network requests that are in\n // our queue.\n // We need to keep our own cache that isn't serialized so that once\n // we complete the request, we can resume the resolve() promise chains\n }\n\n init(AB) {\n // {ABFactory} AB\n\n this.AB = AB;\n\n this.queueLock = new this.AB.Lock();\n\n this._config = this.AB.Config.siteConfig();\n if (this._config) {\n switch (this._config.appbuilder.networkType) {\n case \"relay\":\n // this._network = new NetworkRelay();\n break;\n\n case \"socket\":\n this._network = new NetworkRestSocket(this);\n break;\n\n case \"rest\":\n default:\n this._network = new NetworkRest(this);\n break;\n }\n\n return this._network.init(AB);\n } else {\n console.error(\"??? Why No site config ???\");\n }\n\n //\n // Handle reconnections and flushing the Queue:\n //\n if (io && io.socket) {\n // When our Socket reconnects, be sure to flush any pending transactions.\n io.socket.on(\"connected\", () => {\n this.queueFlush();\n if (this.idConnectionCheck) {\n clearTimeout(this.idConnectionCheck);\n this.idConnectionCheck = null;\n }\n });\n } else {\n console.error(\"!!! Network.init() : Did not find io.socket\");\n window.addEventListener(\"online\", () => this.queueFlush());\n }\n\n return Promise.resolve();\n }\n\n //\n // Interface API\n //\n /**\n * Network.isRealTime\n * indicates wether or not the current network connection supports\n * RealTime updates.\n * @return {bool}\n */\n get isRealTime() {\n return this._network.isRealTime;\n }\n\n /**\n * Network.get(options, jobResponse)\n * perform a GET request back to the AppBuilder server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n get(...params) {\n return this._network.get(...params).then((data) => {\n return this.normalizeData(data);\n });\n }\n\n /**\n * Network.post()\n * perform an AJAX POST request to the AppBuilder server.\n * this is a CREATE operation.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n post(...params) {\n return this._network.post(...params).then((data) => {\n return this.normalizeData(data);\n });\n }\n\n /**\n * Network.put()\n * perform a PUT request to the AppBuilder server.\n * This is for UPDATE/REPLACE operations to data on the server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n put(...params) {\n return this._network.put(...params).then((data) => {\n return this.normalizeData(data);\n });\n }\n\n /**\n * Network.delete()\n * perform an AJAX DELETE request to the AppBuilder server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n delete(...params) {\n return this._network.delete(...params).then((data) => {\n return this.normalizeData(data);\n });\n }\n\n ////\n //// Network Utilities\n ////\n\n _connectionCheck() {\n // if (!this.idConnectionCheck) {\n if (this.isNetworkConnected()) {\n this.queueFlush().catch(() => {\n // on an error, we are still having connection issues\n this.idConnectionCheck = setTimeout(() => {\n this._connectionCheck();\n }, 250);\n });\n this.idConnectionCheck = null;\n } else {\n this.idConnectionCheck = setTimeout(() => {\n this._connectionCheck();\n }, 250);\n }\n // }\n }\n\n /**\n * Check whether the network is slow\n * @returns {Boolean}\n */\n isNetworkSlow() {\n return !!this._networkSlow;\n }\n\n /**\n * Register the network speed test worker\n * @param {Worker} worker\n * @param {boolean} slow is the current state slow?\n */\n registerNetworkTestWorker(worker, slow) {\n this._networkTestWorker = worker;\n this._networkSlow = slow;\n this._networkTestWorker.onmessage = ({ data }) => {\n if (this._networkSlow !== data) {\n this._networkSlow = data;\n this.emit(\"networkslow\", this._networkSlow);\n // Tell sentry our network speed changed\n performance.setContext(\"breadcrumb\", {\n category: \"network\",\n message: this._networkSlow\n ? \"Slow network detected\"\n : \"Network speed restored\",\n level: \"info\",\n });\n }\n };\n }\n\n /**\n * @method networkStatus\n * return the connection type currently registered with the network\n * plugin.\n * @return {string}\n */\n networkStatus() {\n return navigator.connection.type;\n }\n\n /**\n * @method isNetworkConnected\n * return true/false if the device is currently connected to the\n * internet.\n * @return {bool}\n */\n isNetworkConnected() {\n // if this is a Web Client and using sails.socket.io\n if (typeof io != \"undefined\" && io.socket && io.socket.isConnected) {\n return io.socket.isConnected();\n }\n\n // if this isn't a Cordova Plugin, then return navigator data:\n if (typeof Connection == \"undefined\") {\n // NOTE: this technically only detects if we are connected to a\n // network. It doesn't guarantee we can communicate across the 'net\n return navigator.onLine;\n }\n\n // Cordova Plugin:\n return this.networkStatus() != Connection.NONE;\n }\n\n /**\n * publishResponse()\n * emit the requested response for this network operation.\n * @param {obj} jobResponse\n * @param {obj} error\n * @param {obj} data\n */\n publishResponse(jobResponse, error, data) {\n if (data) {\n data = this.normalizeData(data);\n }\n this.emit(jobResponse.key, jobResponse.context, error, data);\n }\n\n normalizeData(data) {\n // Data returning from our server is wrapped in an outer layer of\n // information that is for our Networking API.\n // the outer wrapper should be:\n // on success :\n // {\n // status: \"success\",\n // data:{Data For App}\n // }\n // on Error:\n // {\n // status: \"error\",\n // id: {int} error code\n // ... other data here\n // }\n\n // we have physically received a data packet from the server,\n // but we are informed that our transaction was problematic\n // (400 level USER problem?)\n if (data.status === \"error\") {\n // TODO: review Error procedure here\n return data;\n }\n\n // on success\n // make sure we return the Application Level Data packet:\n return data.data || data;\n }\n\n ////\n //// Queued Requests\n ////\n\n /**\n * refQueue()\n * sub classes can override this for their own separate Queue Data\n * @return {string}\n */\n refQueue() {\n return \"networkQueue\";\n }\n\n /**\n * queueCount()\n * return the # of messages in the queue.\n * @return {int}\n */\n queueCount() {\n return this._queueCount;\n }\n\n /**\n * Adds a request to the outgoing queue.\n *\n * @param {object} data\n * @param {object} jobResponse\n * @return {Promise}\n */\n queue(data, jobResponse) {\n var refQueue = this.refQueue();\n\n return new Promise((resolve, reject) => {\n this.queueLock\n .acquire()\n .then(() => {\n return this.AB.Storage.get(refQueue);\n })\n .then((queue) => {\n queue = queue || [];\n let jID = this.AB.jobID();\n this.cachJobResponse[jID] = jobResponse;\n queue.push({ data, jobResponse: jID });\n this.AB.log(\n `:::: ${queue.length} request${\n queue.length > 1 ? \"s\" : \"\"\n } queued`\n );\n this._queueCount = queue.length;\n return this.AB.Storage.set(refQueue, queue);\n })\n .then(() => {\n this.emit(\"queued\");\n // if we are not already polling the network, start\n if (!this.idConnectionCheck) {\n this._connectionCheck();\n }\n this.queueLock.release();\n resolve();\n })\n .catch((err) => {\n this.AB.notify.developer(err, {\n message: \"Error while queueing data\",\n });\n this.AB.Analytics.logError(err);\n reject(err);\n\n this.queueLock.release();\n });\n });\n }\n\n /**\n * queueFlush()\n * Flush the queue and send the contents to the relay server.\n */\n queueFlush() {\n var refQueue = this.refQueue();\n\n // if we are not connected, then stop\n if (!this.isNetworkConnected()) {\n var error = new Error(\"Not connected to the internet.\");\n error.code = \"E_NOTCONNECTED\";\n return Promise.reject(error);\n }\n\n // otherwise, attempt to flush the queue:\n return new Promise((resolve, reject) => {\n this.queueLock\n .acquire()\n\n //\n // Get queue contents\n //\n .then(() => {\n return this.AB.Storage.get(refQueue);\n })\n\n //\n // Send off each queued request\n //\n .then((queue) => {\n // default to [] if not found\n queue = queue || [];\n\n let hasResponded = false;\n let resCount = 0;\n let resNumber = queue.length;\n\n let done = (res, rej, err) => {\n if (!hasResponded) {\n if (err) {\n rej(err);\n hasResponded = true;\n return;\n }\n resCount++;\n if (resCount >= resNumber) {\n hasResponded = true;\n res();\n }\n }\n };\n // recursively process each pending queue request\n var processRequest = (cb) => {\n if (queue.length == 0) {\n cb();\n } else {\n var entry = queue.shift();\n var params = entry.data;\n let job = this.cachJobResponse[entry.jobResponse];\n // var job = entry.jobResponse;\n this._network\n .resend(params, job)\n .then(() => {\n delete this.cachJobResponse[entry.jobResponse];\n // processRequest(cb);\n cb();\n })\n .catch((err) => {\n // if the err was due to a network connection error\n if (err && err.code == \"E_TOMANYRETRIES\") {\n cb(err);\n return;\n }\n // otherwise, try the next\n // processRequest(cb);\n });\n processRequest(cb);\n }\n };\n\n return new Promise((res, rej) => {\n processRequest((err) => {\n done(res, rej, err);\n // if (err) {\n // rej(err);\n // } else {\n // res();\n // }\n });\n });\n })\n\n //\n // Clear queue contents\n //\n .then(() => {\n this.cachJobResponse = {};\n this._queueCount = 0;\n return this.AB.Storage.set(refQueue, []);\n })\n\n // release the Lock\n .then(() => {\n this.emit(\"queue.synced\");\n return this.queueLock.release();\n })\n\n // all done.\n .then(() => {\n resolve();\n })\n\n // respond to errors:\n .catch((err) => {\n this.AB.notify.developer(err, {\n message: \"commAPI queueFlush error\",\n });\n this.AB.Analytics.logError(err);\n\n this.queueLock.release().then(() => {\n reject(err);\n });\n });\n });\n }\n\n /**\n * Reset credentials to a blank state.\n * @return {Promise}\n */\n reset() {\n return Promise.resolve();\n }\n\n /**\n * type()\n * return the type of network connection we are using.\n * [\"rest\", \"socket\", \"relay\"]\n * @return {string}\n */\n type() {\n return this._config.appbuilder.networkType;\n }\n\n // uuid() {\n // return this.AB.uuid();\n // }\n\n getTokens() {\n // called in appPage.js : openRelayLoader()\n return {};\n }\n}\n\nexport default new Network();\n","/*\n * NetworkRest.js\n * The base Networking class. This class is responsible for job submissions\n * and outlines the basic Network interface.\n */\n\n/* global Connection */\n// import Account from \"./Account\";\n// import analytics from \"./Analytics\";\n// import EventEmitter from \"eventemitter2\";\nvar EventEmitter = require(\"events\").EventEmitter;\n// import Lock from \"./Lock\";\n\n// import { storage } from \"./Storage\";\n// import Tenant from \"./Tenant\";\n// import { v4 as uuidv4 } from \"uuid\";\n\n// Temp placeholders until Resources are implemented:\n\n// End Temp\n\nconst Atomic = require(\"atomicjs/dist/atomic.min.js\");\n// Atomic : a small $.ajax() replacement\n\nvar Config = null;\n// {} Config\n// the site specific configuration information\n\nclass NetworkRest extends EventEmitter {\n constructor(parent) {\n // {Network} parent\n\n super({\n wildcard: true,\n newListener: false,\n maxListeners: 0,\n });\n\n this.baseURL = null;\n // {string} .baseURL\n // the url of our site.\n\n this.numRetries = 3;\n // {int} .numRetries\n // the number or times we should attempt to issue a network request.\n\n this._network = parent;\n // {Network} ._network\n // the Parent Network Resource that the rest of the Platform actually\n // works with.\n\n this.isRealTime = false;\n // {bool}\n // does this Network type support RealTime updates. (socket = true);\n }\n\n /**\n * @method init\n * @param {ABFactory} AB\n * @param {object} options\n * @param {string} options.baseURL\n * @return {Promise}\n */\n init(AB, options) {\n this.AB = AB;\n\n Config = this.AB.Config.siteConfig();\n options = options || {};\n if (options) {\n this.baseURL = options.baseURL || Config.appbuilder.urlCoreServer;\n this.numRetries =\n options.networkNumRetries || Config.appbuilder.networkNumRetries;\n }\n return Promise.resolve();\n }\n\n //\n // Interface API\n //\n /**\n * Network.get(options, jobResponse)\n * perform a GET request back to the AppBuilder server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n get(params, jobResponse) {\n params.type = params.type || \"GET\";\n\n // data sent to params on a \"GET\" request need to be converted to\n // uri querystring values:\n var data = params.data || params.params;\n if (data) {\n var useThese = [\"string\", \"number\", \"boolean\"];\n var search = Object.keys(data)\n .map(function (key) {\n var val = data[key];\n if (useThese.indexOf(typeof val) == -1) {\n val = JSON.stringify(val);\n }\n return key + \"=\" + encodeURIComponent(val);\n })\n .join(\"&\");\n\n var join = \"?\";\n if (params.url.indexOf(\"?\") > -1) {\n join = \"&\";\n }\n params.url = [params.url, search].join(join);\n }\n\n return this._request(params, jobResponse);\n }\n\n /**\n * Network.post()\n * perform an AJAX POST request to the AppBuilder server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n post(params, jobResponse) {\n params.type = params.type || \"POST\";\n return this._request(params, jobResponse);\n }\n\n /**\n * Network.put()\n * perform a PUT request to the AppBuilder server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n put(params, jobResponse) {\n params.type = params.type || \"PUT\";\n return this._request(params, jobResponse);\n }\n\n /**\n * Network.delete()\n * perform an AJAX DELETE request to the AppBuilder server.\n * @param {obj} params the request parameters that need to be executed on\n * the AppBuilder Server\n * @param {obj} jobResponse the callback info for handling the response.\n * {\n * key:'unique.key',\n * context:{ obj data }\n * }\n * @return {Promise}\n */\n delete(params, jobResponse) {\n params.type = params.type || \"DELETE\";\n return this._request(params, jobResponse);\n }\n\n ////\n //// Network Utilities\n ////\n\n isNetworkConnected() {\n return this._network.isNetworkConnected();\n }\n\n salSend(params) {\n return Atomic(params.url, params).then((packet) => {\n // {json} packet\n // the response from Atomic is in format:\n // {data: {…}, xhr: XMLHttpRequest}\n // we just want to send back our { status:\"\", data:xxx } packet.\n return packet.data;\n });\n }\n\n /**\n * _request()\n * perform the actual AJAX request for this operation.\n * @param {obj} params the jQuery.ajax() formatted params\n * @param {obj} jobRequest the information about the request's response.\n * @return {Promise}\n */\n _request(params, jobResponse) {\n // make sure we don't process too many retries:\n params._retry = params._retry || 0;\n if (params._retry >= this.numRetries) {\n var err = new Error(\n `Too many retries (${this.numRetries}) for ${params.url}`\n );\n err.code = \"E_TOMANYRETRIES\";\n this.AB.notify.developer(err, {\n context: \"NetworkRest:_request: Too Many Retries\",\n });\n // this.AB.Analytics.logError(err);\n if (jobResponse) {\n this._network.publishResponse(jobResponse, err);\n }\n\n return Promise.reject(err);\n }\n\n return new Promise((resolve, reject) => {\n params.url = params.url || \"/\";\n if (params.url[0] == \"/\") {\n params.url = this.baseURL + params.url;\n }\n\n params.headers = params.headers || {};\n if (this.AB.Account.authToken) {\n params.headers.Authorization = this.AB.Account.authToken;\n }\n // Fix: don't set content-type if passed in data is a FormData object.\n if (\n Object.prototype.toString.call(params.data) !== \"[object FormData]\"\n ) {\n params.headers[\"Content-type\"] = \"application/json\";\n }\n\n var tenantID = this.AB.Tenant.id();\n if (tenantID) {\n params.headers[\"tenant-token\"] = tenantID;\n }\n\n // params.timeout = params.timeout || 6000;\n\n if (this.isNetworkConnected()) {\n params.method = params.method || params.type;\n params.timeout = 6000; // ??\n params.data = params.data || params.params;\n delete params.params;\n\n this.salSend(params)\n .then((packet) => {\n // TODO: check if packet.status == \"error\"\n // and then .publishResponse() as an error\n\n //\n var data = packet;\n if (jobResponse) {\n this._network.publishResponse(jobResponse, null, data);\n }\n resolve(data);\n })\n .catch((err) => {\n // err.status\n // err.statusText\n // err.responseText\n // err.message {socket}\n // err.stack {socket}\n\n // if this is a network connection error, send the attempt again:\n if (\n err.statusText == \"Request timeout\" ||\n (err.message && err.message.indexOf(\"disconnected\") > -1)\n ) {\n //// Network Error: conneciton refused, access denied, etc...\n this.AB.Analytics.log(\n \"NetworkRest._request():network connection error detected. Trying again\"\n );\n\n params._retry++;\n\n // retry the attempt:\n this._request(params, jobResponse)\n .then((data) => {\n // console.log('--- timeout.then():',data);\n this.AB.warn(\n \"*** NetworkRest._request().then(): attempt resolved.\"\n );\n resolve(data);\n })\n .catch((_err) => {\n this.AB.notify.developer(_err, {\n message:\n \"*** NetworkRest._request().catch(): retry failed:\",\n });\n reject(_err);\n });\n\n return;\n } else {\n // Else attempt to emit() some common Error types for\n // additional Platform Handling.\n if (err.status == 403) {\n this.emit(\"error.badAuth\", err);\n } else if (err.status >= 400 && err.status < 500) {\n this.emit(\"error.badRequest\", err);\n } else if (err.status >= 500) {\n this.emit(\"error.badServer\", err);\n }\n }\n\n var packet = null;\n if (err.responseText) {\n try {\n packet = JSON.parse(err.responseText);\n } catch (e) {\n /* ignore */\n }\n }\n // if this is an req.ab.error() response:\n if (packet && packet.status == \"error\") {\n // check if REAUTH Error:\n if (packet.id == 5 || packet.code == \"E_REAUTH\") {\n this._network.emit(\"reauth\");\n return;\n }\n\n this.AB.notify.developer(new Error(packet.message), {\n context:\n \"NetworkRest:_request:Error returned from Server (req.ab.error())\",\n data: packet.data,\n status: packet.status,\n });\n // this.AB.Analytics.logError(packet.data);\n // this.AB.error(packet.data);\n if (jobResponse) {\n this._network.publishResponse(\n jobResponse,\n packet,\n null\n );\n }\n let error = new Error(packet.message ?? packet.data);\n error.response = packet;\n error.text = packet.message;\n error.url = `${params.method} ${params.url}`;\n return reject(error);\n } else {\n // unknown/unexpected error:\n let error = new Error(\n `${err.status} ${err.statusText || err.message}: ${\n params.method\n } ${params.url}`\n );\n error.response = err.responseText;\n error.text = err.statusText;\n error.err = err;\n error.url = `${params.method} ${params.url}`;\n this.AB.notify.developer(error, {\n context:\n \"NetworkRest:_request:Unknown Error returned from server\",\n err,\n response: err.responseText,\n text: err.statusText || err.message,\n url: error.url,\n });\n // this.AB.Analytics.logError(error);\n // this.AB.error(error);\n if (jobResponse) {\n this._network.publishResponse(jobResponse, error);\n }\n return reject(error);\n }\n });\n } else {\n // now Queue this request params.\n this.AB.Analytics.log(\n \"NetworkRest:_request(): Network is offline. Queuing request.\"\n );\n this._network\n .queue(params, jobResponse)\n .then(() => {\n resolve({ status: \"queued\" });\n })\n .catch(reject);\n }\n });\n }\n\n /**\n * resend()\n * processes messages that were queued due to network connectivity\n * issues.\n * @param {obj} params the jQuery.ajax() formatted params\n * @param {obj} jobRequest the information about the request's response.\n * @return {Promise}\n */\n resend(params, jobResponse) {\n // var op = params.type.toLowerCase();\n return this._request(params, jobResponse);\n }\n}\n\nexport default NetworkRest;\n","/*\n * NetworkRest.js\n * The base Networking class. This class is responsible for job submissions\n * and outlines the basic Network interface.\n */\n\nimport performance from \"../utils/performance\";\nimport NetworkRest from \"./NetworkRest\";\n\nconst listSocketEvents = [\n // NOTE: ABFactory.definitionXXX() will manage emitting these\n // events internally:\n // \"ab.abdefinition.create\",\n // \"ab.abdefinition.update\",\n // \"ab.abdefinition.delete\",\n \"ab.datacollection.create\",\n \"ab.datacollection.update\",\n \"ab.datacollection.stale\",\n \"ab.datacollection.delete\",\n \"ab.inbox.create\",\n \"ab.inbox.update\",\n \"ab.task.userform\",\n // \"ab.object.update\",\n];\n// {array}\n// The io.socket.* events we are listening for that relate to our datacollection\n// maintainence.\n\nfunction socketDataSave(key, length) {\n if (!HashSocketJobs[key]) {\n HashSocketJobs[key] = {\n packets: 0,\n length: 0,\n };\n }\n\n HashSocketJobs[key].packets++;\n HashSocketJobs[key].length += length;\n}\nfunction socketDataLog(AB, key, data) {\n let length = \"??\";\n try {\n length = JSON.stringify(data).length;\n data.__length = length;\n } catch (e) {\n console.log(e);\n //\n }\n\n if (data.objectId) {\n let obj = AB.objectByID(data.objectId);\n if (!obj) {\n console.warn(`socket: ${key} unkown object (${length})`, data);\n } else {\n console.warn(\n `socket: ${key} ${obj.label ?? obj.name}(${length})`,\n data\n );\n }\n } else {\n console.warn(`socket: ${key} (${length})`, data);\n }\n\n if (data.jobID) {\n socketDataSave(data.jobID, length);\n socketDataSave(`${data.jobID}-${key}`, length);\n }\n}\n\nlet HashSocketJobs = {\n /* jobID : { #packets, length } */\n};\n\nlet keyBlacklist = {\n /* key : true */\n};\n// a list of incoming message keys, that indicate wether or not we have\n// processed this message. If a message has been processed, we skip it.\n\n/**\n * @function blacklistKey()\n * create a unique key for this network event.\n * @param {event} ev\n * the incoming network event key (ab.datacollection.create)\n * @param {obj} data\n * the related network packet of the incoming event.\n * @return {string}\n */\nfunction blacklistKey(AB, ev, data) {\n let parts = [ev];\n\n if (data.jobID) {\n parts.push(data.jobID);\n }\n\n if (data.data) {\n let PK = \"uuid\";\n let obj = AB.objectByID(data.objectId);\n if (obj) {\n PK = obj.PK();\n }\n parts.push(data.data[PK] || data.data.id);\n }\n\n if (data.__length) {\n parts.push(data.__length);\n } else {\n let length = \"??\";\n try {\n length = JSON.stringify(data).length;\n } catch (e) {\n // ignore\n }\n parts.push(length);\n }\n\n return parts.join(\"-\");\n}\n\n/**\n * @function isBlacklisted()\n * return True/False if a given key is already blacklisted.\n * @param {string} key\n * the () we are checking\n * @return {bool}\n */\nfunction isBlacklisted(key) {\n return keyBlacklist[key] ?? false;\n}\n\n/**\n * @function blacklist()\n * mark a given key as blacklisted. This prevents additional calls with\n * the same key from being processed.\n * A Key is only blacklisted for a given amount of time (1s by default).\n * @param {string} key\n * the blacklistKey() we are checking\n * @param {int} time\n * The duration in ms of how long to keep the key blacklisted.\n */\nfunction blacklist(key, time = 1000) {\n keyBlacklist[key] = true;\n setTimeout(() => {\n delete keyBlacklist[key];\n }, time);\n}\n\nclass NetworkRestSocket extends NetworkRest {\n constructor(parent) {\n // {Network} parent\n\n super(parent);\n\n this.isRealTime = true;\n // {bool}\n // does this Network type support RealTime updates. (socket = true);\n\n // Pass the io.socket.on(*) events to our AB factory.\n listSocketEvents.forEach((ev) => {\n io.socket.on(ev, (data) => {\n // data should be in the format:\n // {\n // objectId: {uuid},\n // data: {object}\n // }\n socketDataLog(this.AB, ev, data);\n\n // ensure we only process a network update 1x\n let blKey = blacklistKey(this.AB, ev, data);\n if (isBlacklisted(blKey)) return;\n blacklist(blKey, 5000); // now prevent additional ones\n\n // check if the ev contains 'datacollection'\n // and do a single normalizeData() on the incoming data here\n // before sending it off to be processed.\n if (ev.indexOf(\"ab.datacollection\") > -1) {\n let values = data.data;\n if (values) {\n let obj = this.AB.objectByID(data.objectId);\n if (obj) {\n if (ev != \"ab.datacollection.delete\") {\n // if data is packed, then unpack it\n let model = obj.model();\n if (model.isCsvPacked(values)) {\n let lengthPacked = data.__length;\n delete data.__length;\n values = model.csvUnpack(values);\n data.data = values.data;\n let lengthUnpacked = JSON.stringify(data).length;\n data.__length = lengthUnpacked;\n data.__lengthPacked = lengthPacked;\n console.log(\n `CSV Pack: ${lengthUnpacked} -> ${lengthPacked} (${(\n (lengthPacked / lengthUnpacked) *\n 100\n ).toFixed(2)}%)`\n );\n }\n\n let jobID = this.AB.jobID();\n performance.mark(`${ev}:normalization`, {\n op: \"function\",\n data: { jobID },\n });\n model.normalizeData(data.data);\n performance.measure(`${ev}:normalization`);\n }\n }\n }\n }\n this.AB.emit(ev, data);\n });\n });\n }\n\n //\n // Interface API\n //\n\n socketLog() {\n console.warn(JSON.stringify(HashSocketJobs, null, 4));\n }\n\n socketLogClear() {\n HashSocketJobs = {};\n }\n\n ////\n //// Network Utilities\n ////\n\n isNetworkConnected() {\n return io.socket.isConnected();\n }\n\n salSend(params) {\n let route, query;\n try {\n // Extract paramitized route (ex: `/app_builder/model/:ID`) for performance tracking\n [, route, query] = params.url.match(\n /https?:\\/\\/[^/]+(\\/[^?]+)\\??(.*)/\n );\n route = route.replace(/\\b[a-fA-F\\d-]{36}\\b/g, \":ID\");\n performance.mark(route, {\n op: \"websocket.client\",\n data: {\n http: {\n query: query || undefined,\n method: params.method,\n },\n url: params.url,\n },\n });\n } catch (err) {\n this.AB.notify.developer(err, {\n context: `salSend() create performance.mark`,\n });\n }\n\n return new Promise((resolve, reject) => {\n params.method = params.method.toLowerCase();\n\n io.socket.request(params, (data, jwres) => {\n // {json} data\n // the data response from the request\n // {json} jwres\n // A JSON WebSocket Response object.\n // {json} jwres.headers : header values\n // {int} jwres.statusCode : http response code\n // {json} jwres.body === resData\n\n // if this is an error\n if (jwres.statusCode >= 400) {\n // Our NetworkRest.error( err ) should be in this format:\n // err.status\n // err.statusText\n // err.responseText\n\n var errStr = jwres.error ? jwres.error.toString() : jwres.body;\n\n var err = new Error(`Socket Error: ${errStr}`);\n err.status = jwres.statusCode;\n err.statusText = errStr;\n err.responseText = jwres.body;\n\n // on RequestTimeout:\n // err.statusText == \"Request timeout\"\n\n reject(err);\n } else {\n // some errors like socket disconnected return an Error for data\n if (data instanceof Error) {\n reject(data);\n return;\n }\n\n if (typeof data == \"string\") {\n performance.mark(\"JSON.parse\", { op: \"serialize\" });\n data = JSON.parse(data);\n performance.measure(\"JSON.parse\");\n }\n\n // Got a JSON response but was the service response an error?\n // this would be a strange case where the .statusCode < 400\n if (data?.status == \"error\") {\n // make sure to reject an err.responseText = data\n reject({\n status: jwres.statusCode,\n responseText: JSON.Stringify(data),\n });\n }\n // Success!\n else {\n performance.measure(route);\n resolve(data);\n }\n }\n });\n });\n }\n}\n\nexport default NetworkRestSocket;\n","var EventEmitter = require(\"events\").EventEmitter;\n\nimport StorageLocal from \"./StorageLocal.js\";\n\nclass Storage extends EventEmitter {\n constructor() {\n super();\n\n this.tenantStorage = null;\n this._config = null;\n this._storage = null;\n }\n\n init(AB) {\n // {ABFactory} AB\n\n this.AB = AB;\n var config = this.AB.Config.siteConfig();\n if (config) {\n if (config.storage && config.storage.encrypted) {\n console.error(\"TODO: Implement Encrypted Storage\");\n // this._storage = StorageEncrypted;\n this._storage = StorageLocal;\n } else {\n this._storage = StorageLocal;\n }\n\n return this._storage.init(AB);\n } else {\n console.error(\"??? Why No site config ???\");\n }\n\n return Promise.resolve();\n }\n\n set(...params) {\n return this._storage.set(...params);\n }\n\n get(...params) {\n return this._storage.get(...params);\n }\n\n clear(...params) {\n return this._storage.clear(...params);\n }\n\n clearAll(...params) {\n return this._storage.clearAll(...params);\n }\n}\n\nexport default new Storage();\n","/*\n * StorageLocal\n *\n * An interface for storing and retrieving Client Side data. Data stored\n * in StorageLoacal is NOT encrypted.\n *\n * This implementation is based upon the webix.storage.local library.\n * See: https://docs.webix.com/api__refs__storage.local.html\n *\n */\n\nvar EventEmitter = require(\"events\").EventEmitter;\n\nclass StorageLocal extends EventEmitter {\n constructor() {\n super();\n\n this.tenantStorage = null;\n // {Webix.storage} object.\n // We divide the storage data according to the tenant we are working\n // with. This way Users who can move between different Tenants can\n // keep their local data separated.\n }\n\n init(AB) {\n // {ABFactory} AB\n\n this.AB = AB;\n var tenantID = this.AB.Tenant.id();\n if (!tenantID) {\n tenantID = \"noAuth\";\n // \"noAuth\" is considered the tenant on our Login sequence\n // which should have a minimum of data stored (language maybe?)\n }\n\n this.tenantStorage = this.AB.Webix.storage.prefix(\n tenantID,\n this.AB.Webix.storage.local\n );\n\n // this isn't actually an Async operation, so just resolve()\n return Promise.resolve();\n }\n\n set(key, value /* , options = {} */) {\n return Promise.resolve().then(() => {\n return this.tenantStorage.put(key, value);\n });\n }\n\n get(key /*, options = {} */) {\n return Promise.resolve().then(() => {\n return this.tenantStorage.get(key);\n });\n }\n\n clear(key) {\n return Promise.resolve().then(() => {\n return this.tenantStorage.remove(key);\n });\n }\n\n clearAll() {\n return Promise.resolve().then(() => {\n return this.tenantStorage.clear();\n });\n }\n}\n\nexport default new StorageLocal();\n","var EventEmitter = require(\"events\").EventEmitter;\n\nimport Config from \"../config/Config.js\";\n\nclass Tenant extends EventEmitter {\n constructor() {\n super();\n\n this.text = false;\n this._config = null;\n this.textClickToEnter = null;\n }\n\n init() {\n var config = Config.tenantConfig();\n if (config) {\n // check if we have options that are stored as a string\n if (\n typeof config.options === \"string\" ||\n config.options instanceof String\n ) {\n // if we do try to parse them into a JSON object\n try {\n config.options = JSON.parse(config.options);\n } catch (error) {\n console.error(error);\n }\n }\n this._config = config;\n this.textClickToEnter = config.options.textClickToEnter;\n }\n\n // this isn't actually an Async operation, so just resolve()\n return Promise.resolve();\n }\n\n id() {\n if (!this._config || this._config.id == \"??\") {\n return null;\n }\n return this._config.id;\n }\n\n setting(key, value) {\n if (this._config) {\n if (value) {\n this._config.options[key] = value;\n return;\n }\n return this._config.options[key];\n }\n }\n}\n\nexport default new Tenant();\n","/*\n * custom_activelist\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomActiveList {\n get key() {\n return \"activelist\";\n }\n\n constructor(App, key) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.ui.list, webix.ActiveContent);\n }\n};\n","/*\n * countfooter\n *\n * Add the count footer to the webix's datatable.\n *\n */\n\nmodule.exports = class ABCountFooter {\n get key() {\n return \"countfooter\";\n }\n\n constructor(App, key) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {};\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {};\n\n // Our webix UI definition:\n var _ui = {};\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix :\n webix.ui.datafilter.countColumn = webix.extend(\n {\n refresh: function (datatable, node, info) {\n var result = 0;\n\n var rowData = datatable.find({}) || [];\n rowData.forEach((row) => {\n if (row == null) return;\n\n var data =\n row[info.columnId] || row[info.columnId + \"__relation\"];\n\n // array\n if (data && Array.isArray(data)) {\n result += data.length;\n } else if (\n data != null &&\n data != \"\" &&\n data != false &&\n data != \"false\" &&\n data != \"0\"\n ) {\n result += 1;\n }\n });\n\n node.innerHTML = result;\n },\n },\n webix.ui.datafilter.summColumn\n );\n }\n};\n","/*\n * Custom Component Manager\n * Make sure our {ABComponent}s are initialized with our custom\n * Webix Components.\n */\n\n// Import our Custom Components here:\nvar componentList = [\n require(\"./activelist\"),\n require(\"./countfooter\"),\n require(\"./datetimepicker\"),\n require(\"./editlist\"),\n require(\"./edittree\"),\n require(\"./editunitlist\"),\n require(\"./focusableTemplate\"),\n require(\"./formioPreview\"),\n require(\"./formioBuilder\").default,\n require(\"./numbertext\"),\n require(\"./thaicalendar\"),\n require(\"./timepicker\"),\n require(\"./tinyMce\").default,\n require(\"./totalfooter\"),\n require(\"./treesuggest\"),\n // require('./savablelayout')\n];\n\nmodule.exports = class ABCustomComponentManager {\n constructor() {}\n\n initComponents(App) {\n App.custom = App.custom || {};\n\n componentList.forEach((Component) => {\n var component = new Component(App);\n App.custom[component.key] = component;\n });\n\n // Transition to v2:\n App.AB.custom = App.custom;\n }\n};\n","/*\n * custom_datetimepicker\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomDateTimePicker {\n //.extend(ComponentKey, function(App, componentKey ) {\n\n get key() {\n return \"datetimepicker\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // componentKey {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: App.unique(\"custom_datetimepicker\"), // keep this unique for this App instance.\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.editors.$popup.datetime = {\n view: \"popup\",\n width: 250,\n height: 250,\n padding: 0,\n body: {\n view: \"calendar\",\n icons: true,\n borderless: true,\n timepicker: true,\n },\n };\n\n webix.editors.datetime = webix.extend(\n {\n popupType: \"datetime\",\n },\n webix.editors.date\n );\n }\n};\n","/*\n * custom_editlist\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomEditList {\n // .extend(ComponentKey, function(App, componentKey ) {\n\n get key() {\n return \"editlist\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.EditAbility, webix.ui.list);\n }\n};\n","/*\n * custom_edittree\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomEditTree {\n // .extend(ComponentKey, function(App, componentKey ) {\n\n get key() {\n return \"edittree\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.EditAbility, webix.ui.tree);\n }\n};\n","/*\n * custom_editunitlist\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomEditUnitList {\n // .extend(ComponentKey, function(App, componentKey ) {\n\n get key() {\n return \"editunitlist\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n /*\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n*/\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.EditAbility, webix.ui.unitlist);\n }\n};\n","/*\n * custom_activelist\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomFocusableTemplate {\n get key() {\n return \"focusabletemplate\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n focus: function () {\n return false;\n },\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.ui.template, webix.UIManager);\n }\n};\n","/*\n * formioBuilder\n *\n * Create a custom webix component.\n *\n * Note: Moved from ABDesigner to prevent loading formIO library globally or\n * duplicating it. Revisit when formIOv5 releases as it should then be possible\n * to package the form renderer without the builder.\n *\n * Note: This component is lazy loaded and requires calling .init() before using\n */\nimport ABLazyCustomComponent from \"./lazyComponent.js\";\nexport default class ABCustomFormBuilderBuilder extends ABLazyCustomComponent {\n get key() {\n return \"formiobuilder\";\n }\n\n constructor(App) {\n super(App);\n this.label = this.AB.Label();\n this.view = this.key;\n }\n\n /**\n * Load the FormIO dependency and add the component to webix\n * @returns {Promise}\n */\n async init() {\n if (this.initialized) return;\n const { FormBuilder } = await import(\n /* webpackPrefetch: true */\n /* webpackFetchPrioirtiy: \"low\" */\n \"../init/formio.js\"\n );\n this.FormBuilder = FormBuilder;\n // Tell Webix to create an INSTANCE of our custom component:\n this.AB.Webix.protoUI(this.ui(), this.AB.Webix.ui.popup);\n this.initialized = true;\n }\n\n /**\n * Generate the custom webix ui\n * @method ui\n * @returns {Object} custom webix ui\n */\n ui() {\n const _this = this;\n\n return {\n name: this.key,\n defaults: {\n css: \"scrolly forceOpen\",\n hidden: false,\n autofit: true,\n },\n $init: async function (config) {\n let comp = {},\n defaultComponent;\n if (config.dataFields)\n Object.assign(\n comp,\n this.parseDataFields(config.dataFields, {\n isCommonForm: config.isCommonForm,\n })\n );\n if (config.isCommonForm) {\n Object.assign(comp, _this.inputComponents());\n defaultComponent = comp.saveButton.schema;\n } else defaultComponent = comp.approveButton.schema;\n\n const formComponents = config.formComponents\n ? config.formComponents\n : { components: [defaultComponent] };\n\n try {\n this.builder = new this.FormBuilder(this.$view, formComponents, {\n noDefaultSubmitButton: true,\n noNewEdit: true,\n builder: {\n basic: false,\n advanced: false,\n customBasic: false,\n premium: false,\n custom: {\n title: this.label(\"Fields\"),\n weight: 0,\n default: true,\n components: comp,\n },\n layout: {\n components: {\n table: true,\n },\n },\n },\n });\n await this.builder.ready;\n } catch (err) {\n this.notify(\"Error initializing formio builder\", err);\n }\n },\n // set up a function that can be called to request the form schema\n getFormData: function () {\n return this.builder.schema ?? this.builder.form;\n },\n // Pass functions into the Webix component to be use in $init\n label: this.label,\n parseDataFields: this.parseDataFields,\n notify: this.AB.notify.developer,\n FormBuilder: this.FormBuilder,\n };\n }\n\n /**\n * Generate the formio custom components based on the fields.\n * Used internally in the webix component.\n * @method parseDataFields\n * @param {object[]} fields {field: ABField, key, label, object: ABObject}\n * @returns {object} each key is a formio component\n */\n parseDataFields(fields, { isCommonForm } = { isCommonForm: true }) {\n const components = {};\n fields?.forEach(({ field, key, label }) => {\n if (!field) {\n components[key] = {\n title: label,\n key,\n schema: {\n label: label.split(\"->\")[1],\n disabled: true,\n key,\n _key: key,\n type: \"textarea\",\n input: true,\n },\n };\n return;\n }\n\n const schema = {\n abFieldID: field.id,\n label: field.label,\n disabled: true,\n key,\n _key: key,\n type: \"textfield\",\n input: true,\n };\n\n switch (field.key) {\n case \"boolean\":\n schema.type = \"checkbox\";\n break;\n case \"calculate\":\n schema.inputType = \"text\";\n schema.calculateValue = `value = ${field.settings.formula\n .replace(/{/g, \"data['\")\n .replace(/}/g, \"']\")}`;\n break;\n case \"connectObject\":\n schema.inputType = \"text\";\n schema.calculateValue = `value = data['${key}.format']`;\n break;\n case \"date\":\n schema.type = \"datetime\";\n schema.format = \"MMMM d, yyyy\";\n break;\n case \"datetime\":\n schema.type = \"datetime\";\n schema.format = \"MMMM d, yyyy h:mm a\";\n break;\n case \"email\":\n schema.type = \"email\";\n break;\n case \"file\":\n schema.type = \"htmlelement\";\n schema.tag = \"a\";\n schema.className = \"btn btn-primary btn-block\";\n schema.content = ` {{data['${key}']?.filename ?? \"No File\"}}`;\n schema.attrs = [\n {\n attr: \"href\",\n value: field.urlFile(`{{data['${key}'].uuid}}`),\n },\n {\n attr: \"target\",\n value: \"_blank\",\n },\n ];\n schema.refreshOnChange = true;\n schema.input = false;\n break;\n case \"image\":\n schema.type = \"htmlelement\";\n schema.tag = \"img\";\n schema.className = \"img-thumbnail max100\";\n schema.content = \"\";\n (schema.attrs = [\n {\n attr: \"src\",\n value: field.urlImage(`{{data['${key}']}}`),\n },\n ]),\n (schema.refreshOnChange = true);\n schema.input = false;\n break;\n case \"list\":\n var values = [];\n field.settings.options.forEach((opt) => {\n values.push({\n label: opt.text,\n value: opt.id,\n });\n });\n schema.type = \"select\";\n schema.data = { values };\n schema.multiple = field.settings.isMultiple;\n break;\n case \"LongText\":\n schema.type = \"textarea\";\n break;\n case \"number\":\n schema.type = \"number\";\n break;\n case \"TextFormula\":\n schema.inputType = \"text\";\n schema.calculateValue = `value = '${field.settings.textFormula}'`;\n break;\n default:\n break;\n }\n components[key] = {\n title: label,\n key,\n icon: field.icon,\n schema,\n };\n });\n\n if (!isCommonForm) {\n components[\"approveButton\"] = {\n title: this.label(\"Approve Button\"),\n key: \"approve\",\n icon: \"check-square\",\n schema: {\n label: this.label(\"Approve\"),\n type: \"button\",\n key: \"approve\",\n event: \"approve\",\n block: true,\n size: \"lg\",\n input: false,\n leftIcon: \"fa fa-thumbs-up\",\n action: \"event\",\n theme: \"success\",\n },\n };\n components[\"denyButton\"] = {\n title: this.label(\"Deny Button\"),\n key: \"deny\",\n icon: \"ban\",\n schema: {\n label: this.label(\"Deny\"),\n type: \"button\",\n key: \"deny\",\n event: \"deny\",\n block: true,\n size: \"lg\",\n input: false,\n leftIcon: \"fa fa-thumbs-down\",\n action: \"event\",\n theme: \"danger\",\n },\n };\n components[\"customButton\"] = {\n title: this.label(\"Custom Action Button\"),\n key: \"custom\",\n icon: \"cog\",\n schema: {\n label: this.label(\"Custom Name\"),\n type: \"button\",\n key: \"custom\",\n event: \"yourEvent\",\n block: true,\n size: \"lg\",\n input: false,\n leftIcon: \"fa fa-cog\",\n action: \"event\",\n theme: \"primary\",\n },\n };\n }\n\n return components;\n }\n\n inputComponents() {\n return {\n textbox: {\n title: \"Textbox\",\n key: \"YOUR_KEY\",\n icon: \"font\",\n schema: {\n type: \"textfield\",\n key: \"YOUR_KEY\",\n label: \"[YOUR LABEL]\",\n placeholder: \"Enter your information.\",\n input: true,\n },\n },\n textarea: {\n title: \"Textarea\",\n key: \"YOUR_KEY\",\n icon: \"bold\",\n schema: {\n type: \"textarea\",\n key: \"YOUR_KEY\",\n label: \"[YOUR LABEL]\",\n placeholder: \"Enter your information.\",\n },\n },\n saveButton: {\n title: \"Submit Button\",\n key: \"submit\",\n icon: \"check-square\",\n schema: {\n label: \"Submit\",\n type: \"button\",\n key: \"submit\",\n event: \"submit\",\n block: true,\n size: \"lg\",\n input: false,\n leftIcon: \"fa fa-check-square\",\n action: \"event\",\n theme: \"success\",\n },\n },\n };\n }\n}\n","/*\n * formioBuilder\n *\n * Create a custom webix component.\n *\n * Note: This component is lazy loaded and requires calling .init() before using\n *\n */\nconst ABLazyCustomComponent = require(\"./lazyComponent.js\");\nmodule.exports = class ABCustomFormIOPreview extends ABLazyCustomComponent {\n get key() {\n return \"formiopreview\";\n }\n\n async init() {\n if (this.initialized) return;\n const { Form } = await import(\n /* webpackPrefetch: true */\n /* webpackFetchPrioirtiy: \"low\" */\n \"../init/formio.js\"\n );\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n defaults: {\n css: \"scrolly\",\n borderless: true,\n },\n $init: async function (config) {\n this.$ready.push(() => this.initForm(config));\n },\n\n initForm: async (config) => {\n var formComponents = config.formComponents ?? {};\n var formData = config.formData ?? {};\n const component = $$(config.id);\n\n // JOHNNY: we now have formio designs where we need to pull out\n // more than just an .id from connected fields. Let's no longer\n // do this:\n // // we need to find out when we are passing an array of objects and reduce it down to an array of IDs\n // for (var data in formData) {\n // if (\n // Array.isArray(formData[data]) &&\n // typeof formData[data][0] == \"object\"\n // ) {\n // formData[data] = formData[data].map((item) => item.id);\n // }\n // }\n\n const form = new Form(component.$view, formComponents);\n component._formio = form;\n // readOnly: true\n // sanitizeConfig: {\n // addTags: [\"a\", \"label\", \"img\", \"i\"],\n // addAttr: [\"src\", \"href\", \"class\", \"target\"]\n // }\n // }).then(function (form) {\n await form.build();\n // now that it is set up we can push it into the global var\n // formBuilder = builder;\n // Provide a default submission.\n form.instance.submission = {\n data: formData,\n };\n (formComponents.components || []).forEach((comp) => {\n if (\n comp.type == \"button\" &&\n comp.action == \"event\" &&\n comp.event\n ) {\n form.instance.once(comp.event, function (/* click */) {\n config?.onButton(comp.event);\n // _this.emit(\"button\", comp.event);\n });\n }\n });\n // });\n },\n };\n this.view = this.key;\n\n // our internal business logic\n this._logic = {};\n\n // Tell Webix to create an INSTANCE of our custom component:\n this.AB.Webix.protoUI(_ui, this.AB.Webix.ui.view);\n this.initialized = true;\n }\n};\n","/**\n * Base class for any custom webix component that we want to initalize lazily,\n * usually to reduce the dependency size required on load.\n */\nvar ABEmitter = require(\"../AppBuilder/platform/ABEmitter.js\");\nmodule.exports = class ABLazyCustomComponent extends ABEmitter {\n constructor({ AB }) {\n super();\n this.initialized = false;\n this.AB = AB;\n this.setDefaultUI();\n }\n\n /**\n * Sets a default UI used before the actual webix component is ready. Meant as\n * a helper to future developers.\n */\n setDefaultUI() {\n this.AB.Webix.protoUI(\n {\n name: this.key,\n defaults: {\n template:\n \"This custom webix component has not been initialized.
    Call AB.custom.#key#.init() before using this component.\",\n data: { key: this.key },\n },\n $init: () =>\n console.warn(\n `${this.key} custom webix component used before being initalized`\n ),\n },\n this.AB.Webix.ui.template\n );\n }\n};\n","/*\n * numbertext\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomNumberText {\n get key() {\n return \"numbertext\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n\n defaults: {\n css: \"webix_el_text\",\n },\n\n // override this function to return number value type\n $getValue: function () {\n var val = this.getInputNode().value;\n if (val) return JSON.parse(val);\n // Convert to number\n else return \"\";\n },\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.ui.text);\n }\n};\n","/*\n * Thai Calendar\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomThaiCalendar {\n get key() {\n return \"thaicalendar\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // componentKey {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n this.view = this.key;\n\n const i18n = webix.i18n;\n\n // Our webix UI definition:\n const _ui = {\n name: this.key,\n defaults: {\n calendarHeader: function (d) {\n return `${i18n.calendar.monthFull[d.getMonth()]} ${\n d.getFullYear() + 543\n }`;\n },\n },\n };\n\n if (webix.ui.calendar.$protoWait[0]._zoom_logic) {\n _ui._zoom_logic = AB.cloneDeep(\n webix.ui.calendar.$protoWait[0]._zoom_logic\n );\n _ui._zoom_logic[1] = Object.assign(_ui._zoom_logic[1], {\n _getTitle: this._getYearTitle,\n });\n _ui._zoom_logic[2] = Object.assign(_ui._zoom_logic[2], {\n _getTitle: this._getYearRangeTitle,\n _getContent: this._getYearContent,\n _setContent: this._setYear,\n });\n }\n\n if (webix.ui.calendar.$protoWait[0].Qd) {\n _ui.Qd = AB.cloneDeep(webix.ui.calendar.$protoWait[0].Qd);\n _ui.Qd[1] = Object.assign(_ui.Qd[1], {\n Jv: this._getYearTitle,\n });\n _ui.Qd[2] = Object.assign(_ui.Qd[2], {\n Jv: this._getYearRangeTitle,\n Zv: this._getYearContent,\n Xv: this._setYear,\n });\n }\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.ui.calendar);\n\n webix.editors.$popup.thaidate = {\n view: \"popup\",\n width: 250,\n height: 250,\n padding: 0,\n body: {\n view: this.key,\n icons: true,\n borderless: true,\n timepicker: false,\n },\n };\n\n webix.editors.$popup.thaidatetime = {\n view: \"popup\",\n width: 250,\n height: 250,\n padding: 0,\n body: {\n view: this.key,\n icons: true,\n borderless: true,\n timepicker: true,\n },\n };\n\n webix.editors.thaidate = webix.extend(\n {\n popupType: \"thaidate\",\n },\n webix.editors.date\n );\n\n webix.editors.thaidatetime = webix.extend(\n {\n popupType: \"thaidatetime\",\n },\n webix.editors.date\n );\n }\n\n _getYearTitle(date) {\n return date.getFullYear() + 543;\n }\n\n _getYearRangeTitle(date, calendar) {\n let start = date.getFullYear() + 543;\n calendar._zoom_start_date = start = start - (start % 10) - 1;\n return start + \" - \" + (start + 10 + 1);\n }\n\n _getYearContent(i, calendar) {\n return calendar._zoom_start_date + i;\n }\n\n _setYear(next, i, calendar) {\n next.setFullYear(calendar._zoom_start_date - 543 + i);\n }\n};\n","/*\n * custom_timepicker\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomTimePicker {\n //.extend(ComponentKey, function(App, componentKey ) {\n\n get key() {\n return \"timepicker\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // componentKey {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: App.unique(\"custom_timepicker\"), // keep this unique for this App instance.\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.editors.$popup.time = {\n view: \"popup\",\n body: {\n view: \"calendar\",\n width: 220,\n height: 200,\n type: \"time\",\n },\n };\n\n webix.editors.time = webix.extend(\n {\n popupType: \"time\",\n },\n webix.editors.date\n );\n }\n};\n","/*\n * tinyMce\n *\n * Create a custom webix component.\n *\n * Note: This component is lazy loaded and requires calling .init() before using\n */\nimport ABLazyCustomComponent from \"./lazyComponent.js\";\nexport default class ABCustomTinyMCE extends ABLazyCustomComponent {\n get key() {\n return \"tinymce-editor\";\n }\n\n async init() {\n if (this.initialized) return;\n\n await import(\n /* webpackPrefetch: true */\n \"../js/webix/extras/tinymce.js\"\n );\n this.initialized = true;\n }\n}\n","/*\n * totalfooter\n *\n * Add the contents of records to show in footer of the webix's datatable.\n *\n */\n\nmodule.exports = class ABTotalFooter {\n get key() {\n return \"totalfooter\";\n }\n\n constructor(App, key) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {};\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {};\n\n // Our webix UI definition:\n var _ui = {};\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix :\n webix.ui.datafilter.totalColumn = webix.extend(\n {\n refresh: function (datatable, node, info) {\n var result = 0;\n\n datatable.eachRow(function (row) {\n var record = datatable.getItem(row);\n\n var data = info.field.format(record);\n\n // array\n if (data) {\n result += parseFloat(data); // we need to use parseFloat because numbers could be decimals\n }\n });\n\n node.innerHTML = result;\n },\n },\n webix.ui.datafilter.summColumn\n );\n }\n};\n","/*\n * custom_editlist\n *\n * Create a custom webix component.\n *\n */\n\nmodule.exports = class ABCustomEditList {\n // .extend(ComponentKey, function(App, componentKey ) {\n\n get key() {\n return \"treesuggest\";\n }\n\n constructor(App) {\n // App \t{obj}\tour application instance object.\n // key {string}\tthe destination key in App.custom[componentKey] for the instance of this component:\n\n // super(App, key);\n\n var L = App.Label;\n\n var labels = {\n common: App.labels,\n\n component: {},\n };\n\n // internal list of Webix IDs to reference our UI components.\n var ids = {\n component: App.unique(this.key),\n };\n\n // Our webix UI definition:\n var _ui = {\n name: this.key,\n defaults: {\n type: \"tree\",\n width: 0,\n body: {\n borderless: true,\n select: true,\n template: function (obj, common) {\n return (\n \"\" +\n (obj.$count ? \"\" + obj.value + \"\" : obj.value) +\n \"\"\n );\n },\n ready: function () {\n this.openAll();\n },\n on: {\n onAfterSelect: function (id, e) {\n if (this.getItem(id).$count) {\n this.getParentView().setMasterValue(\"\");\n this.show(\n $$(this.getParentView().config.master).getInputNode()\n );\n }\n },\n },\n },\n },\n };\n this.view = this.key;\n\n // our internal business logic\n var _logic = {};\n this._logic = _logic;\n\n // Tell Webix to create an INSTANCE of our custom component:\n webix.protoUI(_ui, webix.ui.suggest);\n }\n};\n","/* (ignored) */","/* (ignored) */","/* (ignored) */"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/assets/app.65b73d1b748f10aa7e0c.js b/assets/app.1e08e19a0c513985b067.js similarity index 99% rename from assets/app.65b73d1b748f10aa7e0c.js rename to assets/app.1e08e19a0c513985b067.js index 44ceea99..0d089106 100644 --- a/assets/app.65b73d1b748f10aa7e0c.js +++ b/assets/app.1e08e19a0c513985b067.js @@ -922,6 +922,188 @@ class Bootstrap extends EventEmitter { networkTestWorker, networkIsSlow ); + + const loadPlugin = async (purl) => { + // Helper to load script with proper MIME type headers + const loadScriptWithMimeType = async (url) => { + try { + // Fetch with Accept header to request JavaScript MIME type + const response = await fetch(url, { + headers: { + Accept: + "application/javascript, text/javascript, */*;q=0.8", + }, + }); + + if (!response.ok) { + throw new Error( + `Failed to load script: ${response.status} ${response.statusText}` + ); + } + + // Verify we got JavaScript content type + const contentType = response.headers.get("content-type"); + if ( + contentType && + !contentType.includes("javascript") && + !contentType.includes("ecmascript") + ) { + console.warn( + `Unexpected content type for ${url}: ${contentType}` + ); + } + + const text = await response.text(); + // Create a blob URL with explicit JavaScript MIME type + const blob = new Blob([text], { + type: "application/javascript", + }); + return URL.createObjectURL(blob); + } catch (e) { + console.error(`Error loading script with fetch: ${url}`, e); + return null; + } + }; + + // try ESM dynamic import first; fall back to UMD global + const tryImport = async (url) => { + try { + // Try direct import first (may work if server is configured correctly) + try { + const mod = await import(/* webpackIgnore: true */ url); + // Try multiple ways to get the function + let fn = mod?.default || mod?.registerService; + if (!fn && typeof mod === "object") { + // If still not found, try to find any function export + const values = Object.values(mod); + fn = values.find((v) => typeof v === "function"); + } + if (fn) return fn; + } catch (directImportError) { + // If direct import fails, try with fetch + blob URL + const blobUrl = await loadScriptWithMimeType(url); + if (blobUrl) { + try { + const mod = await import( + /* webpackIgnore: true */ blobUrl + ); + URL.revokeObjectURL(blobUrl); // Clean up + let fn = mod?.default || mod?.registerService; + if (!fn && typeof mod === "object") { + const values = Object.values(mod); + fn = values.find((v) => typeof v === "function"); + } + if (fn) return fn; + } catch (blobImportError) { + URL.revokeObjectURL(blobUrl); // Clean up on error + throw blobImportError; + } + } + } + return null; + } catch (e) { + return null; + } + }; + + const tryUMD = async (url) => { + // Load script with proper MIME type, then inject as script tag + const blobUrl = await loadScriptWithMimeType(url); + if (!blobUrl) { + // Fallback to original scriptLoad if available + if (this.AB.scriptLoad) { + await this.AB.scriptLoad(url); + // Look for global export after script loads + const globalExport = window.Plugin; + return ( + (globalExport && + (globalExport.default || + globalExport.registerService || + globalExport)) || + null + ); + } else { + // Manual script tag creation with explicit type + return new Promise((resolve, reject) => { + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = url; + script.onload = () => resolve(); + script.onerror = () => + reject(new Error(`Failed to load script: ${url}`)); + document.head.appendChild(script); + }).then(() => { + // Look for global export after script loads + const globalExport = window.Plugin; + return ( + (globalExport && + (globalExport.default || + globalExport.registerService || + globalExport)) || + null + ); + }); + } + } + + // Load via blob URL with explicit type + return new Promise((resolve, reject) => { + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = blobUrl; + script.onload = () => { + URL.revokeObjectURL(blobUrl); // Clean up + // Conventional UMD name used by our plugin builds + const globalExport = window.Plugin; + resolve( + (globalExport && + (globalExport.default || + globalExport.registerService || + globalExport)) || + null + ); + }; + script.onerror = () => { + URL.revokeObjectURL(blobUrl); // Clean up on error + reject(new Error(`Failed to load script: ${url}`)); + }; + document.head.appendChild(script); + }).catch(() => { + // Fallback to original scriptLoad if available + if (this.AB.scriptLoad) { + return this.AB.scriptLoad(url).then(() => { + const globalExport = window.Plugin; + return ( + (globalExport && + (globalExport.default || + globalExport.registerService || + globalExport)) || + null + ); + }); + } + return null; + }); + }; + + let registerFn = await tryImport(purl); + if (!registerFn) { + registerFn = await tryUMD(purl); + } + if (typeof registerFn === "function") { + // Register with the ABFactory core (expects a function taking PluginAPI) + this.AB.pluginRegister(registerFn); + } else { + console.warn("Plugin did not export a function:", purl); + } + }; + const loadPlugins = async (plugins) => { + const urls = plugins || []; + await Promise.all(urls.map((p) => loadPlugin(p))); + }; + // load our installed plugins here: + await loadPlugins(window.__AB_plugins_v1); + await this.AB.init(); await webixLoading; // NOTE: special case: User has no Roles defined. @@ -1172,14 +1354,14 @@ __webpack_require__.r(__webpack_exports__); __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ "default": () => (/* binding */ ClassUI) /* harmony export */ }); /* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ 64785); /* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__); class ClassUI extends events__WEBPACK_IMPORTED_MODULE_0__.EventEmitter { - constructor(base, ids) { + constructor(base, ids, AB = null) { super(); this.ids = {}; @@ -1234,6 +1416,10 @@ class ClassUI extends events__WEBPACK_IMPORTED_MODULE_0__.EventEmitter { // and make sure there is a .component set: this.ids.component = this.ids.component || base; + + if (AB) { + this.AB = AB; + } } /** @@ -1339,8 +1525,6 @@ class ClassUI extends events__WEBPACK_IMPORTED_MODULE_0__.EventEmitter { } } -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ClassUI); - /***/ }), @@ -9974,7 +10158,7 @@ try { /* global WEBPACK_MODE SENTRY_DSN VERSION */ webpackMode = "development"; dsn = undefined; - version = "1.15.19"; + version = "1.16.0"; } catch (err) { console.warn( "Error reading from webpack, check the DefinePlugin is working correctly", @@ -10525,4 +10709,4 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js /******/ var __webpack_exports__ = __webpack_require__.O(); /******/ } ]); -//# sourceMappingURL=app.65b73d1b748f10aa7e0c.js.map \ No newline at end of file +//# sourceMappingURL=app.1e08e19a0c513985b067.js.map \ No newline at end of file diff --git a/assets/app.1e08e19a0c513985b067.js.map b/assets/app.1e08e19a0c513985b067.js.map new file mode 100644 index 00000000..93155823 --- /dev/null +++ b/assets/app.1e08e19a0c513985b067.js.map @@ -0,0 +1 @@ +{"version":3,"file":"app.1e08e19a0c513985b067.js","mappings":"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Y,MAAM,MAAM,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,MAAM,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,SAAS,UAAU,MAAM,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,QAAQ,UAAU,KAAK,SAAS,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,KAAK,MAAM,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,SAAS,UAAU,MAAM,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,KAAK,MAAM,UAAU,UAAU,KAAK,KAAK,UAAU,cAAc,OAAO,MAAM,UAAU,KAAK,KAAK,UAAU,cAAc,OAAO,MAAM,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,cAAc,OAAO,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,cAAc,OAAO,MAAM,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,cAAc,OAAO,KAAK,cAAc,OAAO,KAAK,cAAc,OAAO,MAAM,UAAU,KAAK,KAAK,cAAc,OAAO,MAAM,UAAU,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,UAAU,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,WAAW,UAAU,KAAK,YAAY,MAAM,YAAY,aAAa,aAAa,aAAa,MAAM,YAAY,MAAM,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,YAAY,MAAM,YAAY,aAAa,WAAW,UAAU,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,UAAU,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,MAAM,KAAK,UAAU,YAAY,WAAW,MAAM,UAAU,KAAK,UAAU,UAAU,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,MAAM,UAAU,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,aAAa,MAAM,UAAU,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,YAAY,WAAW,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,UAAU,YAAY,WAAW,YAAY,WAAW,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,MAAM,MAAM,UAAU,MAAM,UAAU,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,cAAc,cAAc,aAAa,aAAa,WAAW,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,MAAM,MAAM,UAAU,YAAY,aAAa,aAAa,WAAW,UAAU,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,YAAY,WAAW,UAAU,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,WAAW,KAAK,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,YAAY,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,aAAa,MAAM,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,WAAW,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,WAAW,UAAU,KAAK,MAAM,UAAU,YAAY,MAAM,SAAS,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,MAAM,UAAU,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,KAAK,YAAY,YAAY,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,MAAM,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,MAAM,YAAY,MAAM,YAAY,aAAa,MAAM,YAAY,OAAO,YAAY,aAAa,MAAM,MAAM,YAAY,aAAa,MAAM,YAAY,OAAO,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,YAAY,OAAO,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,MAAM,YAAY,QAAQ,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,aAAa,MAAM,UAAU,OAAO,UAAU,YAAY,MAAM,OAAO,YAAY,MAAM,YAAY,MAAM,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,YAAY,aAAa,MAAM,YAAY,MAAM,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,WAAW,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,WAAW,KAAK,MAAM,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,MAAM,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,WAAW,KAAK,MAAM,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,YAAY,aAAa,aAAa,MAAM,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,UAAU,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,QAAQ,YAAY,MAAM,MAAM,UAAU,UAAU,KAAK,MAAM,UAAU,UAAU,KAAK,QAAQ,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,UAAU,KAAK,UAAU,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,aAAa,aAAa,WAAW,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,OAAO,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,aAAa,MAAM,UAAU,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,UAAU,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,KAAK,OAAO,UAAU,YAAY,MAAM,MAAM,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,SAAS,UAAU,MAAM,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,YAAY,MAAM,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,YAAY,WAAW,UAAU,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,KAAK,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,WAAW,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,YAAY,WAAW,MAAM,UAAU,KAAK,YAAY,aAAa,WAAW,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,KAAK,KAAK,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,WAAW,KAAK,KAAK,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,KAAK,MAAM,UAAU,YAAY,MAAM,UAAU,KAAK,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,UAAU,YAAY,MAAM,UAAU,YAAY,MAAM,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,MAAM,UAAU,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,MAAM,UAAU,UAAU,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,UAAU,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,UAAU,YAAY,WAAW,MAAM,SAAS,YAAY,WAAW,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,OAAO,UAAU,KAAK,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,MAAM,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,KAAK,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,WAAW,MAAM,MAAM,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,WAAW,MAAM,MAAM,UAAU,UAAU,KAAK,MAAM,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,KAAK,KAAK,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,WAAW,UAAU,UAAU,KAAK,KAAK,UAAU,YAAY,MAAM,MAAM,UAAU,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,KAAK,MAAM,UAAU,MAAM,OAAO,UAAU,MAAM,KAAK,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,WAAW,KAAK,OAAO,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,MAAM,SAAS,UAAU,UAAU,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,WAAW,MAAM,OAAO,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,MAAM,UAAU,YAAY,MAAM,OAAO,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,OAAO,YAAY,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,UAAU,UAAU,KAAK,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,UAAU,YAAY,aAAa,aAAa,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,UAAU,YAAY,aAAa,aAAa,MAAM,aAAa,YAAY,aAAa,MAAM,aAAa,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,WAAW,KAAK,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM,YAAY,MAAM,UAAU,MAAM,YAAY,MAAM,UAAU,MAAM,SAAS,UAAU,MAAM,cAAc,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,KAAK,KAAK,UAAU,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,YAAY,MAAM,UAAU,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,MAAM,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,YAAY,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,QAAQ,UAAU,MAAM,UAAU,UAAU,YAAY,aAAa,MAAM,SAAS,UAAU,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,QAAQ,UAAU,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,YAAY,MAAM,MAAM,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,WAAW,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,WAAW,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,WAAW,KAAK,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,KAAK,OAAO,UAAU,YAAY,MAAM,OAAO,YAAY,aAAa,WAAW,KAAK,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,OAAO,UAAU,YAAY,aAAa,MAAM,UAAU,YAAY,MAAM,MAAM,UAAU,YAAY,aAAa,WAAW,KAAK,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,UAAU,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,WAAW,UAAU,KAAK,UAAU,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,SAAS,UAAU,MAAM,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,UAAU,YAAY,WAAW,YAAY,WAAW,UAAU,UAAU,UAAU,KAAK,OAAO,UAAU,YAAY,WAAW,KAAK,MAAM,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,cAAc,OAAO,KAAK,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,YAAY,eAAe,cAAc,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,KAAK,MAAM,UAAU,UAAU,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,WAAW,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,MAAM,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,KAAK,MAAM,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,YAAY,WAAW,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,WAAW,MAAM,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,KAAK,YAAY,MAAM,KAAK,MAAM,UAAU,MAAM,MAAM,YAAY,aAAa,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,YAAY,aAAa,aAAa,WAAW,KAAK,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,WAAW,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,UAAU,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,KAAK,SAAS,UAAU,YAAY,aAAa,WAAW,YAAY,WAAW,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,MAAM,UAAU,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,UAAU,KAAK,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,YAAY,MAAM,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,KAAK,KAAK,UAAU,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,YAAY,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,aAAa,MAAM,MAAM,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,WAAW,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,QAAQ,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,YAAY,OAAO,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,YAAY,MAAM,UAAU,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,YAAY,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,KAAK,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,WAAW,KAAK,KAAK,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,WAAW,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,MAAM,KAAK,UAAU,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,WAAW,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,SAAS,UAAU,MAAM,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,SAAS,UAAU,MAAM,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,QAAQ,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,QAAQ,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,WAAW,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,MAAM,YAAY,aAAa,MAAM,MAAM,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,UAAU,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,KAAK,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,MAAM,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,YAAY,WAAW,UAAU,UAAU,MAAM,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,MAAM,SAAS,YAAY,MAAM,SAAS,YAAY,MAAM,OAAO,YAAY,aAAa,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM,OAAO,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,WAAW,KAAK,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,UAAU,UAAU,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,aAAa,MAAM,MAAM,UAAU,MAAM,MAAM,UAAU,YAAY,aAAa,MAAM,QAAQ,UAAU,KAAK,MAAM,UAAU,UAAU,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,MAAM,OAAO,UAAU,YAAY,MAAM,OAAO,UAAU,MAAM,QAAQ,YAAY,MAAM,QAAQ,UAAU,MAAM,YAAY,YAAY,MAAM,UAAU,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,SAAS,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,OAAO,YAAY,aAAa,WAAW,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,OAAO,UAAU,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,WAAW,UAAU,MAAM,KAAK,UAAU,MAAM,OAAO,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,UAAU,YAAY,WAAW,MAAM,OAAO,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,MAAM,UAAU,MAAM,MAAM,YAAY,WAAW,UAAU,YAAY,WAAW,MAAM,QAAQ,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,UAAU,YAAY,WAAW,MAAM,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,UAAU,UAAU,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,WAAW,KAAK,KAAK,YAAY,WAAW,YAAY,MAAM,OAAO,UAAU,KAAK,QAAQ,YAAY,MAAM,QAAQ,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,UAAU,UAAU,MAAM,MAAM,UAAU,UAAU,MAAM,MAAM,UAAU,YAAY,aAAa,MAAM,QAAQ,UAAU,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,WAAW,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,WAAW,KAAK,SAAS,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,QAAQ,UAAU,YAAY,MAAM,QAAQ,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,SAAS,UAAU,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,QAAQ,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,YAAY,aAAa,aAAa,WAAW,UAAU,YAAY,MAAM,QAAQ,YAAY,aAAa,MAAM,MAAM,UAAU,YAAY,aAAa,WAAW,UAAU,YAAY,aAAa,MAAM,QAAQ,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAA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AK,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,MAAM,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,MAAM,MAAM,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,QAAQ,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,MAAM,MAAM,YAAY,OAAO,KAAK,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,OAAO,UAAU,UAAU,UAAU,KAAK,OAAO,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,UAAU,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,WAAW,UAAU,YAAY,aAAa,WAAW,KAAK,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,OAAO,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,MAAM,YAAY,MAAM,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,OAAO,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,OAAO,YAAY,MAAM,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,WAAW,KAAK,KAAK,YAAY,aAAa,WAAW,KAAK,OAAO,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,YAAY,MAAM,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,YAAY,SAAS,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,UAAU,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,UAAU,YAAY,aAAa,MAAM,SAAS,YAAY,aAAa,MAAM,QAAQ,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,QAAQ,UAAU,YAAY,aAAa,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,WAAW,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,OAAO,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,OAAO,UAAU,MAAM,aAAa,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,WAAW,UAAU,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,YAAY,MAAM,QAAQ,YAAY,aAAa,WAAW,MAAM,QAAQ,UAAU,KAAK,QAAQ,YAAY,MAAM,KAAK,UAAU,OAAO,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,UAAU,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,OAAO,YAAY,MAAM,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,OAAO,KAAK,UAAU,UAAU,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,WAAW,UAAU,YAAY,OAAO,KAAK,YAAY,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,YAAY,OAAO,KAAK,YAAY,OAAO,KAAK,YAAY,aAAa,aAAa,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,UAAU,OAAO,KAAK,YAAY,aAAa,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,YAAY,aAAa,aAAa,aAAa,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,OAAO,OAAO,YAAY,WAAW,UAAU,MAAM,MAAM,YAAY,aAAa,OAAO,MAAM,YAAY,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,KAAK,YAAY,OAAO,KAAK,KAAK,YAAY,WAAW,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,KAAK,YAAY,OAAO,KAAK,KAAK,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,WAAW,UAAU,KAAK,KAAK,YAAY,WAAW,KAAK,MAAM,KAAK,YAAY,OAAO,KAAK,YAAY,aAAa,aAAa,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,WAAW,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,mBAAmB,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,YAAY,aAAa,WAAW,UAAU,YAAY,aAAa,WAAW,YAAY,aAAa,WAAW,UAAU,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,2BAA2B,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,OAAO,KAAK,UAAU,YAAY,WAAW,UAAU,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,OAAO,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,YAAY,OAAO,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,YAAY,WAAW,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,UAAU,KAAK,YAAY,aAAa,SAAS,KAAK,KAAK,OAAO,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,cAAc,MAAM,KAAK,UAAU,KAAK,KAAK,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,MAAM,KAAK,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,UAAU,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,OAAO,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,WAAW,KAAK,KAA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,oCAAoC,GAAG,wBAAwB,wBAAwB,GAAG,6BAA6B,0BAA0B,gBAAgB,wBAAwB,cAAc,eAAe,sCAAsC,0CAA0C,wBAAwB,GAAG,qCAAqC,kBAAkB,GAAG,wDAAwD,kBAAkB,GAAG,qBAAqB;AAC50lG;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPK;AACF;;AAE1C;AACsC;;AAEtC;AACA;AACA,OAAO,MAAM;AACb;AACA;;AAEA;AACA,OAAO,MAAM;AACb;AACA;;AAEA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,aAAa,MAAM;AACnB,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,UAAU,KAAK;AACf;AACA;;AAEA;AACA,UAAU,KAAK;AACf;AACA,mBAAmB,MAAM;AACzB,uBAAuB,MAAM;;AAE7B;AACA,UAAU,KAAK;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM,oDAAY;AAClB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf,iBAAiB,mBAAmB,iBAAiB;AACrD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,yBAAyB;AAC1C,iBAAiB,QAAQ;AACzB,iBAAiB,SAAS;AAC1B,iBAAiB,QAAQ;AACzB,iBAAiB,SAAS;AAC1B,iBAAiB,OAAO,0BAA0B,GAAG;AACrD,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,qDAAY;AAC5B;AACA,aAAa,sDAAa;AAC1B;;AAEA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iEAAe,YAAY,EAAC;;;;;;;;;;;;;;;ACzO5B;AACA;AACA;AACA;;AAEA;;AAEA,iEAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC,EAAC;;;;;;;;;;;;;;;ACtDF;AACA;AACA;AACA;;AAEA;;AAEA,iEAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC,EAAC;;;;;;;;;;;;;;;;;;;;;;;;ACpDF;AAC6B;AACC;AACqB;AACI;AACJ;AACQ;AACM;AACpB;AACpB;AACzB;AACA;AACuC;;AAEO;AAC9C,2DAAW;;AAEiC;AAC5C;;AAEA;AACA,qBAAqB,sJAIpB;AACD;AACA;AACA;AACA,GAAG,sKAIC;AACJ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,GAAG,2DAAS;AACZ;AACA;;AAEA;;AAEA,MAAM,2DAAS;AACf;AACA;AACA;AACA,OAAO;;AAEP,MAAM,2DAAS;AACf,IAAI;AACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;ACvDD;AACA;AACA;AACA;AACA;AACA;;AAE4B;;AAE5B,qBAAqB,4DAAmB;;AAEC;;AAEM;AACN;AACA;AACE;AAC3C;;AAEA;;AAEA;AACA;;AAE6B;AACqB;;AAEA;;AAElD;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,yDAAM;;AAE1B;AACA;AACA;;AAEA;AACA,UAAU,IAAI;AACd;AACA;AACA;;AAEA;AACA,UAAU,OAAO;AACjB;;AAEA;AACA,UAAU,KAAK;AACf;;AAEA;AACA,SAAS,6DAAW;AACpB,OAAO;AACP;;AAEA;AACA,cAAc,SAAS;AACvB;AACA;AACA,4BAA4B,uRAIrB;AACP,iBAAiB,SAAS;AAC1B;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,gHAA0C;AAC3D;AACA;AACA,uCAAuC,MAAM;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6DAAW;AACvB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA,MAAM,6DAAW,qBAAqB,gBAAgB;AACtD;AACA;AACA;AACA;AACA,MAAM,6DAAW,mBAAmB,iBAAiB;AACrD,YAAY,wDAAO;AACnB,MAAM,6DAAW;;AAEjB;AACA,MAAM,6DAAW,sBAAsB,gBAAgB;AACvD;AACA,YAAY,2DAAU;AACtB,MAAM,6DAAW;;AAEjB,YAAY,yDAAQ;AACpB,uBAAuB,yDAAM;;AAE7B;AACA;AACA,SAAS,6DAAW;AACpB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,eAAe,wBAAwB,EAAE,yDAAM;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,6DAAW,uBAAuB,gBAAgB;;AAExD;AACA;AACA;AACA,OAAO;AACP,MAAM,6DAAW;;AAEjB;AACA,aAAa,WAAW;AACxB,MAAM,6DAAW,2BAA2B,gBAAgB;AAC5D;;AAEA,cAAc,qBAAqB;AACnC,wBAAwB,yDAAM;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA,+CAA+C,iBAAiB,EAAE,oBAAoB;AACtF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,IAAI,IAAI,YAAY;AACxE;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,cAAc;AACd,iEAAiE,IAAI;AACrE;AACA;AACA;;AAEA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,IAAI;AACvE;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD,6DAA6D,IAAI;AACjE;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,6DAAW;AACpB,SAAS,2DAAa;AACtB,SAAS,2DAAa;AACtB,SAAS,2DAAa;AACtB,aAAa,yDAAM;AACnB,YAAY,2DAAa,gBAAgB,yDAAM;AAC/C;AACA;AACA,iBAAiB,2DAAa;;AAE9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM,6DAAW;;AAEjB,sDAAsD;AACtD,MAAM,6DAAW,kBAAkB,iBAAiB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,eAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,SAAS,iDAAE;AACX;AACA,iBAAiB,iDAAE;AACnB;AACA;AACA;AACA,eAAe,6DAAW;AAC1B,eAAe,6DAAW;AAC1B,aAAa;AACb;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,eAAe,EAAC;;;;;;;;;;;;;;;AC1d/B,iEAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,CAAC,EAAC;;;;;;;;;;;;;;;ACnBF;AACA;AACA;AACA;AACA,iEAAe;AACf;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,sCAAsC,aAAa,aAAa;AAC3H;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,4BAA4B;AAC5B,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA,OAAO;AACP,IAAI;AACJ,CAAC,EAAC;;;;;;;;;;;;;;;AChDF,iEAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,CAAC,EAAC;;;;;;;;;;;;;;;;;ACpBoC;;AAEvB,sBAAsB,gDAAY;AACjD;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,KAAK,EAAE,IAAI;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,KAAK,GAAG,EAAE;AACvC,UAAU;AACV;;AAEA;AACA;AACA,yCAAyC,KAAK,GAAG,EAAE;AACnD,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,sCAAsC;AACpD;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACrKgC;;AAEhC,0BAA0B,gDAAO;AACjC;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,UAAU;AACV,4BAA4B,eAAe;AAC3C;AACA;;AAEA;AACA,UAAU,SAAS;AACnB;AACA;;AAEA;AACA,UAAU,SAAS;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,wBAAwB;AAC3C;AACA,2CAA2C,aAAa,oBAAoB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;;AAEA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kCAAkC,MAAM;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,MAAM;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,mEAAmE,WAAW,EAAE,QAAQ;AACxF;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,iBAAiB,eAAe;AAChC,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kEAAkE,OAAO;AACzE;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,WAAW,EAAC;;;;;;;;;;;;;;;;;ACrgBQ;;AAEuB;;AAE1D,4BAA4B,mDAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,6DAA6D,iBAAiB;AAC9E;AACA;AACA;AACA;AACA;AACA,2BAA2B,uEAAU;AACrC,2BAA2B,uEAAU;AACrC;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,eAAe;AACjG,yCAAyC;AACzC;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB,0BAA0B;AAC1B;AACA,mBAAmB;AACnB,oBAAoB;AACpB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,EAAE;AAC9C;AACA;;AAEA;AACA,2CAA2C,MAAM;AACjD;AACA;AACA;AACA;AACA;;AAEA,iEAAe,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;ACzGA;AACa;AACN;AACA;;AAE1C,qBAAqB,mDAAO;AAC5B;AACA;;AAEA;AACA,UAAU,WAAW;AACrB;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,0DAAa,OAAO,uDAAU,OAAO,uDAAU;AAClE,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA,UAAU,OAAO;AACjB,0BAA0B,QAAQ;AAClC;;AAEA,oBAAoB,uDAAU;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,UAAU;;AAEV,SAAS,uDAAU;AACnB;AACA;AACA,UAAU;;AAEV;AACA,uBAAuB,0DAAa;AACpC,uBAAuB,uDAAU;AACjC;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,8BAA8B,uDAAU;AACxC,SAAS,uDAAU;AACnB,4BAA4B,uDAAU;AACtC;AACA;;AAEA;AACA;AACA,iCAAiC,uDAAU;AAC3C;AACA,YAAY,uDAAU;AACtB,+BAA+B,uDAAU;AACzC;AACA,QAAQ;AACR;AACA;AACA,YAAY,0DAAa;AACzB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,kBAAkB,0DAAa;AAC/B;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,YAAY,EAAC;;;;;;;;;;;;;;;;ACnJO;;AAEnC,uCAAuC,mDAAO;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,4DAA4D,kBAAkB,wBAAwB,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAC3P,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,6BAA6B;AAC7B;AACA,sBAAsB;AACtB,uBAAuB;AACvB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,KAAK;AAClE,4DAA4D,KAAK;AACjE;AACA,mCAAmC;AACnC;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,KAAK;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B,mDAAmD,KAAK;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,KAAK;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,KAAK;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2CAA2C,OAAO;AAClD,0CAA0C,MAAM;AAChD;AACA,uBAAuB;AACvB,6BAA6B,UAAU;AACvC;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,2CAA2C,KAAK;AAChD,4DAA4D,KAAK;AACjE;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA,2CAA2C,KAAK;AAChD;AACA;AACA,gBAAgB;AAChB;AACA;AACA,2BAA2B,kBAAkB,uBAAuB,aAAa,WAAW,QAAQ;AACpG;AACA,aAAa;AACb;AACA,2CAA2C,KAAK;AAChD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,oCAAoC,kBAAkB,uBAAuB,aAAa,WAAW,QAAQ;AAC7G;AACA;AACA;AACA,mBAAmB;AACnB;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;;AAEA;AACA,oCAAoC,kBAAkB,uBAAuB,mBAAmB,WAAW,QAAQ;AACnH;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA,kCAAkC,KAAK;AACvC;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA,2DAA2D;AAC3D;AACA,sBAAsB,IAAI,kBAAkB;AAC5C;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA,oCAAoC,KAAK;AACzC;;AAEA,qBAAqB,KAAK;AAC1B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA,iEAAe,8BAA8B,EAAC;;;;;;;;;;;;;;;;;ACllBX;;AAEnC;AACqD;;AAErD,yBAAyB,mDAAO;AAChC;AACA;;AAEA;AACA,UAAU,eAAe;AACzB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,6DAAe;AAChC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,6DAAe;AAC/C;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,gBAAgB,EAAC;;;;;;;;;;;;;;;;;;;AChEG;AAC2B;AACkB;AACF;;AAE9E,8BAA8B,mDAAO;AACrC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,kEAAmB;AAC/B,YAAY,2EAA4B;AACxC,YAAY,0EAA2B;AACvC;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,kEAAmB;AACvC,MAAM,kEAAmB;AACzB,SAAS,0EAA2B;AACpC,OAAO;;AAEP,oBAAoB,0EAA2B;AAC/C,MAAM,0EAA2B;AACjC,SAAS,kEAAmB;AAC5B,OAAO;;AAEP,oBAAoB,2EAA4B;AAChD,MAAM,2EAA4B;AAClC;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,2EAA4B;AAC3C;;AAEA;AACA;AACA,eAAe,kEAAmB;AAClC;AACA;AACA;AACA;;AAEA;AACA,MAAM,kEAAmB;AACzB;AACA;;AAEA,iEAAe,qBAAqB,EAAC;;;;;;;;;;;;;;;;ACxEF;;AAEnC,kCAAkC,mDAAO;AACzC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,iBAAiB,mBAAmB,oCAAoC,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAClS;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,wCAAwC,sCAAsC;AAC9E;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iEAAiE;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA,iGAAiG;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA,8CAA8C;AAC9C;AACA;AACA,mDAAmD,mDAAO;AAC1D,iDAAiD;AACjD,8CAA8C;AAC9C,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,4CAA4C;AAC5C;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,mDAAmD,mDAAO;AAC1D,iDAAiD;AACjD,8CAA8C;AAC9C,2CAA2C;AAC3C,4CAA4C;AAC5C;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,mDAAO;AACpD,2CAA2C;AAC3C,wCAAwC;AACxC,qCAAqC;AACrC;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB,0BAA0B;AAC1B;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,gCAAgC,WAAW;AAC3C;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB,oBAAoB;AACpB;AACA,aAAa;AACb,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sFAAsF,QAAQ;AAC9F;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA,eAAe,8CAA8C;AAC7D;AACA;;AAEA;AACA;;AAEA,oBAAoB;;AAEpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,gBAAgB;AAChB,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,yBAAyB,EAAC;;;;;;;;;;;;;;;;ACxTN;;AAEnC;;AAEA,2CAA2C,mDAAO;AAClD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,iBAAiB,mBAAmB,oCAAoC,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAClS;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,wCAAwC,sCAAsC;AAC9E;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA,qDAAqD,yBAAyB;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D,uDAAuD;AACvD;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA,oDAAoD;AACpD;AACA,8CAA8C;AAC9C;AACA;AACA,mDAAmD,mDAAO;AAC1D,iDAAiD;AACjD,8CAA8C;AAC9C,2CAA2C;AAC3C,4CAA4C;AAC5C;AACA,qCAAqC;AACrC;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB,oBAAoB;AACpB;AACA,aAAa;AACb,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;;AAExC,iDAAiD;AACjD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,kCAAkC,EAAC;;;;;;;;;;;;;;;;ACjMf;;AAEnC;;AAEA,0CAA0C,mDAAO;AACjD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,iBAAiB,mBAAmB,oCAAoC,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAClS;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,wCAAwC,sCAAsC;AAC9E;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA,uDAAuD;AACvD;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA,kDAAkD,wBAAwB;AAC1E,kDAAkD,yBAAyB;AAC3E;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE,6DAA6D;AAC7D;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA,0DAA0D;AAC1D;AACA,oDAAoD;AACpD;AACA;AACA,yDAAyD,mDAAO;AAChE;AACA;AACA,uDAAuD;AACvD,oDAAoD;AACpD,iDAAiD;AACjD,kDAAkD;AAClD;AACA,2CAA2C;AAC3C;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB,oBAAoB;AACpB;AACA,aAAa;AACb,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;;AAExC;AACA,iGAAiG,EAAE;AACnG;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,iCAAiC,EAAC;;;;;;;;;;;;;;;;ACrPd;;AAEnC,4BAA4B,mDAAO;AACnC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,mBAAmB,EAAC;;;;;;;;;;;;;;;;AC1BA;;AAEnC,oCAAoC,mDAAO;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,mDAAmD,oBAAoB;AACvE,2BAA2B;AAC3B,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,qCAAqC,oBAAoB;AACzD;AACA,+CAA+C;AAC/C;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,mCAAmC,oBAAoB;AACvD;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,yCAAyC,oBAAoB;AAC7D;AACA,qDAAqD,oBAAoB;AACzE;AACA,mBAAmB;AACnB,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,oBAAoB;AAC1E;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,gCAAgC,oBAAoB;AACpD;AACA;AACA,aAAa;AACb,gCAAgC,oBAAoB;AACpD;AACA,gCAAgC,oBAAoB;AACpD;AACA;AACA;AACA,aAAa;AACb;AACA,gCAAgC,oBAAoB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,UAAU;;AAEV;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA,iCAAiC,oBAAoB;AACrD;;AAEA;AACA,iCAAiC,oBAAoB;AACrD;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B,oBAAoB;AAC9C,8BAA8B,oBAAoB;AAClD;AACA,0BAA0B,oBAAoB;AAC9C,8BAA8B,oBAAoB;AAClD;AACA,0BAA0B,oBAAoB;AAC9C,8BAA8B,oBAAoB;AAClD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA,UAAU;AACV;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oBAAoB;AACvD;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E,gEAAgE,OAAO;AACvE,+DAA+D,UAAU;AACzE;AACA;AACA;AACA;AACA;AACA,2BAA2B,UAAU;AACrC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,+CAA+C,oBAAoB;AACnE;AACA;AACA;AACA,iDAAiD,oBAAoB;AACrE;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD,gBAAgB;AAChB;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,uBAAuB;AACvB;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C,oBAAoB;AAC/D;AACA;AACA;;AAEA;AACA,2CAA2C,SAAS;AACpD,6CAA6C,SAAS;AACtD;AACA;AACA,oBAAoB;AACpB,2CAA2C,SAAS;AACpD,6CAA6C,SAAS;AACtD;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA,UAAU;AACV;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oBAAoB;AACvD;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA,6EAA6E;AAC7E,gEAAgE,OAAO;AACvE,+DAA+D,UAAU;AACzE;AACA;AACA;AACA;AACA;AACA,2BAA2B,UAAU;AACrC;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA,6CAA6C,oBAAoB;AACjE;AACA;AACA,+CAA+C,oBAAoB;AACnE;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD,gBAAgB;AAChB;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,oBAAoB;AACpB;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,oBAAoB;AAC7D;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD,6CAA6C,SAAS;AACtD;AACA;AACA,oBAAoB;AACpB,2CAA2C,SAAS;AACpD,6CAA6C,SAAS;AACtD;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA,yCAAyC,oBAAoB;AAC7D;AACA,UAAU;AACV;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oBAAoB;AACvD;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E,gEAAgE,OAAO;AACvE,+DAA+D,UAAU;AACzE;AACA;AACA;AACA;AACA;AACA,2BAA2B,UAAU;AACrC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,kDAAkD,oBAAoB;AACtE;AACA;AACA;AACA,oDAAoD,oBAAoB;AACxE;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD,gBAAgB;AAChB;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,SAAS,IAAI,MAAM;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,SAAS,IAAI,MAAM;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,oBAAoB;AAClE;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD,6CAA6C,SAAS;AACtD;AACA;AACA,oBAAoB;AACpB,2CAA2C,SAAS;AACpD,6CAA6C,SAAS;AACtD;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA,kCAAkC,oBAAoB;AACtD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,kCAAkC,oBAAoB;AACtD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,kCAAkC,oBAAoB;AACtD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C,8BAA8B,oBAAoB;AAClD,8BAA8B,oBAAoB;AAClD,sCAAsC,oBAAoB;;AAE1D,qBAAqB,oBAAoB;AACzC,qBAAqB,oBAAoB;AACzC,qBAAqB,oBAAoB;AACzC;;AAEA;AACA;AACA;AACA,8CAA8C,MAAM;AACpD;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,yCAAyC,MAAM;AAC/C;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,0BAA0B,SAAS;AACnC;AACA;AACA;AACA,+BAA+B,cAAc;AAC7C;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,SAAS;AAC1B,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ,GAAG,MAAM;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA,OAAO;;AAEP;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,MAAM;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA,iDAAiD,MAAM;AACvD;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,MAAM;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;;AAEP;AACA,oDAAoD,MAAM;AAC1D;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA,iEAAe,2BAA2B,EAAC;;;;;;;;;;;;;;;;ACttCR;;AAEnC;;AAEA,oCAAoC,mDAAO;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,mBAAmB;AACnB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,4BAA4B;AAC5B;AACA;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,4DAA4D,kBAAkB,wBAAwB,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAC3P,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,6BAA6B;AAC7B;AACA,sBAAsB;AACtB,uBAAuB;AACvB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA,4BAA4B;AAC5B,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,4DAA4D,iBAAiB,wBAAwB,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAC1P,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,6BAA6B;AAC7B;AACA,sBAAsB;AACtB,uBAAuB;AACvB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,sBAAsB,0BAA0B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,SAAS;AAClE;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,2CAA2C;AAC3C;AACA,qCAAqC;AACrC;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C,+BAA+B;AAC/B;AACA;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,MAAM;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC,0DAA0D,YAAY;AACtE;AACA;AACA;AACA;AACA;AACA,yBAAyB,QAAQ,kBAAkB,KAAK,SAAS,aAAa;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,cAAc;AACnC,OAAO;AACP;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,iEAAe,2BAA2B,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxlCR;AACQ;;AAEU;AACqB;AACK;AACP;AACH;AACA;AACA;AACG;AACb;AACA;;AAE3D,yBAAyB,mDAAO;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,oBAAoB,UAAU;AAC9B;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,6DAA6D,iBAAiB;AAC9E;AACA;AACA;AACA;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB;AACA;AACA,iCAAiC,uEAAwB;AACzD;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6DAAe;AACvC,sBAAsB;AACtB;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,mDAAO;AACpD;AACA;AACA;AACA,2CAA2C;AAC3C,wCAAwC;AACxC;AACA;AACA,wCAAwC;AACxC;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA,eAAe,8CAA8C;AAC7D;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,oBAAoB,2EAA2B;AAC/C,oBAAoB,uEAAwB;AAC5C,MAAM,sEAAsB;;AAE5B,UAAU,SAAS;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,4BAA4B;AAClD;AACA;AACA;;AAEA,YAAY,uBAAuB;AACnC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA,MAAM,sEAAsB;;AAE5B;AACA,WAAW,4DAA4D;AACvE,WAAW,oDAAoD;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,cAAc,kCAAkC,EAAE;AAClD;AACA,eAAe;AACf;AACA;AACA;AACA,iBAAiB,iCAAiC;AAClD;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA,mBAAmB,QAAQ;AAC3B,mBAAmB,QAAQ;AAC3B,mBAAmB,UAAU;AAC7B,mBAAmB,QAAQ;AAC3B,mBAAmB,iBAAiB;AACpC,mBAAmB,QAAQ;AAC3B,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA,cAAc,kDAAkD;AAChE;AACA,UAAU;AACV;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA,gFAAgF;AAChF;AACA,cAAc;AACd;AACA,UAAU;AACV;AACA;AACA,cAAc,6DAA6D;AAC3E;AACA;AACA;AACA;AACA,aAAa;AACb,sEAAsE;AACtE;AACA,cAAc;AACd;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2EAA2B;AACnD;AACA;AACA,wBAAwB,uEAAwB;AAChD;AACA;AACA;AACA;AACA;AACA,wBAAwB,sEAAsB;AAC9C,wBAAwB,sEAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA,2BAA2B,sEAAsB;AACjD,2BAA2B,sEAAsB;AACjD,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA,0CAA0C,WAAW;AACrD,wCAAwC,QAAQ;AAChD;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA,qBAAqB,mDAAO;AAC5B,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,QAAQ;AAC3B,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ,wEAAwE,SAAS;AAC7G;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,SAAS;AACxE,WAAW;AACX;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;;AAEtB,sBAAsB;AACtB,aAAa,SAAS;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,sBAAsB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,4BAA4B;AAClD;;AAEA,yBAAyB,kBAAkB;AAC3C;;AAEA;AACA;AACA,kCAAkC,gCAAgC;AAClE,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,uDAAW;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,4BAA4B;AAClD;;AAEA,yBAAyB,kBAAkB;AAC3C;;AAEA;AACA,gCAAgC,uDAAW;AAC3C;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM,6DAAe;AACrB,uBAAuB,6DAAe;AACtC,mCAAmC,8BAA8B;AACjE;AACA,OAAO;;AAEP,YAAY,6DAAe;;AAE3B;AACA;AACA;AACA,oBAAoB,wEAAyB;;AAE7C;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,SAAS,mDAAO;AAChB,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,mCAAmC,EAAE,aAAa;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA,eAAe;AACf;AACA;AACA,qBAAqB,gBAAgB;AACrC;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU,MAAM;AAChB;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,OAAO;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA,kBAAkB,mDAAO;AACzB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6DAA6D;AAC7D,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA,qBAAqB,SAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uEAAwB;AAChD,wBAAwB,uEAAwB;AAChD;AACA;AACA,wBAAwB,oEAAe;AACvC,wBAAwB,oEAAe;AACvC;AACA;AACA,wBAAwB,oEAAe;AACvC,wBAAwB,oEAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,WAAW;AACrD,wCAAwC,QAAQ;AAChD;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA,qBAAqB,mDAAO;AAC5B,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,gBAAgB,EAAC;;;;;;;;;;;;;;;;;;AC/oCG;AACgC;AACO;;AAE1E,8BAA8B,mDAAO;AACrC;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU,SAAS,UAAU;AAC7B;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA,+CAA+C;AAC/C;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,4DAA4D,kBAAkB,wBAAwB,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAC3P,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uBAAuB;AACvB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA,qBAAqB,cAAc;AACnC;AACA,4BAA4B,sBAAsB;AAClD;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA,UAAU,SAAS;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,iEAAiE,MAAM;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wBAAwB;AACrD,mBAAmB;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA,+BAA+B,uEAAmB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,wEAAyB;AAClC,OAAO;;AAEP;AACA;AACA;AACA,SAAS,wEAAyB;AAClC;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe,MAAM;AACrB,yBAAyB,MAAM;AAC/B,mBAAmB,QAAQ;AAC3B;AACA;AACA,WAAW,wBAAwB;AACnC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,qBAAqB,EAAC;;;;;;;;;;;;;;;;ACrVF;;AAEnC,uCAAuC,mDAAO;AAC9C;AACA;;AAEA;AACA,8CAA8C,YAAY;AAC1D,+CAA+C,YAAY;AAC3D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,MAAM;AAC3C;AACA,gBAAgB;AAChB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB,gBAAgB;;AAEhB;AACA,aAAa;AACb;AACA;AACA,kBAAkB,mDAAO;AACzB;AACA,qBAAqB,mDAAO;AAC5B;AACA,2BAA2B,QAAQ,GAAG,KAAK;AAC3C;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,mCAAmC,UAAU;AAC7C,oBAAoB,iBAAiB;AACrC,UAAU;AACV;AACA;AACA,uBAAuB,yBAAyB;AAChD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,wBAAwB,EAAC;;;;;;;;;;;;;;;;AC5ML;;AAEnC,wCAAwC,mDAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,mBAAmB,GAAG,iBAAiB,gBAAgB,iBAAiB,gBAAgB,cAAc;AAC9J;AACA;AACA;AACA,8BAA8B,mDAAO;AACrC;AACA;AACA;AACA,0CAA0C,QAAQ,GAAG,KAAK;AAC1D;AACA,kCAAkC;AAClC,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,+BAA+B,EAAC;;;;;;;;;;;;;;;;AC9NZ;;AAEnC,qCAAqC,mDAAO;AAC5C;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC,gBAAgB;AAChB;AACA;AACA;AACA;AACA,mBAAmB;AACnB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,UAAU,GAAG,OAAO;AACvD;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;;AAEA,iEAAe,4BAA4B,EAAC;;;;;;;;;;;;;;;;AClJT;;AAEnC,qCAAqC,mDAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA,mBAAmB,wBAAwB;AAC3C;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE,gBAAgB;AAChB;AACA;AACA;AACA,yDAAyD,gBAAgB,IAAI;AAC7E,2GAA2G,GAAG;AAC9G,oBAAoB;AACpB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,cAAc;AAC5F,gBAAgB;;AAEhB,iBAAiB;AACjB;AACA;AACA,2DAA2D,gBAAgB,gBAAgB,IAAI;AAC/F;AACA,uBAAuB;AACvB,mBAAmB;AACnB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB,IAAI,gBAAgB;AAC1E;AACA;;AAEA;AACA;AACA;AACA,sCAAsC,gBAAgB,IAAI;AAC1D,kGAAkG,GAAG;AACrG;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA,iCAAiC,OAAO,gCAAgC,cAAc;AACtF;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,4BAA4B,EAAC;;;;;;;;;;;;;;;;ACnKT;;AAEnC,0CAA0C,mDAAO;AACjD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,0CAA0C,YAAY,sCAAsC,8DAA8D,sDAAsD,mBAAmB,gBAAgB,wBAAwB;AAC3Q,oEAAoE,cAAc,eAAe,qBAAqB,oBAAoB,mBAAmB,wBAAwB,iDAAiD,cAAc,sBAAsB;;AAE1Q;AACA,0BAA0B,YAAY,EAAE,YAAY,GAAG;AACvD,QAAQ;AACR,iDAAiD,UAAU,IAAI;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,2CAA2C,GAAG,uBAAuB;AACrE;AACA;AACA,2CAA2C;AAC3C,wCAAwC;AACxC;AACA;AACA;AACA;AACA,wCAAwC;;AAExC;;AAEA;AACA,yDAAyD,0BAA0B,sCAAsC,8DAA8D,sDAAsD,mBAAmB,gBAAgB,wBAAwB,+CAA+C,cAAc,eAAe,qBAAqB,oBAAoB,mBAAmB,wBAAwB,iDAAiD,cAAc,sBAAsB;AAC7hB;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,qCAAqC;AACrC;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B,6BAA6B;AAC7B;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mDAAO;AACjD;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mDAAO;AACjD;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mDAAO;AACjD;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,8CAA8C;AAC9C,2CAA2C;AAC3C,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,0DAA0D,GAAG,uBAAuB;AACpF;AACA;AACA,0DAA0D;AAC1D,uDAAuD;AACvD;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,2CAA2C;AAC3C,wCAAwC;AACxC;AACA,kCAAkC;AAClC;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mDAAO;AACjD;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA,8CAA8C;AAC9C,2CAA2C;AAC3C,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0DAA0D,GAAG,uBAAuB;AACpF;AACA;AACA,0DAA0D;AAC1D,uDAAuD;AACvD;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8CAA8C;AAC9C,2CAA2C;AAC3C,wCAAwC;AACxC;AACA,kCAAkC;AAClC;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,+CAA+C;AAC/C;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE,gEAAgE;AAChE;AACA;AACA,6EAA6E;AAC7E;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD,iDAAiD;AACjD,8CAA8C;AAC9C;AACA,wCAAwC;AACxC;AACA,kCAAkC;AAClC;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,GAAG,uBAAuB;AACpF;AACA;AACA,0DAA0D;AAC1D,uDAAuD;;AAEvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,2CAA2C;AAC3C,wCAAwC;AACxC;AACA,kCAAkC;AAClC;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,sBAAsB,sBAAsB;AAC5C;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,0BAA0B;AACnD;AACA;AACA;AACA,aAAa;AACb,QAAQ;AACR;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iEAAe,iCAAiC,EAAC;;;;;;;;;;;;;;;;AC/7Bd;;AAEnC,qCAAqC,mDAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA,mBAAmB,wBAAwB;AAC3C;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA,yDAAyD,gBAAgB,IAAI;AAC7E;AACA,oBAAoB;AACpB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gEAAgE,qBAAqB,gCAAgC,cAAc;AACnI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA,wDAAwD,gBAAgB,gBAAgB,IAAI;AAC5F;AACA,oBAAoB;AACpB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,4BAA4B,EAAC;;;;;;;;;;;;;;;;AC3HT;;AAEnC;AACA;AACA;;AAEA;AACA,oDAAoD,mDAAO;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mEAAmE,gBAAgB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,mDAAO;AACxC;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B,aAAa;AACb,WAAW;AACX;AACA,wCAAwC,UAAU;AAClD,0BAA0B;AAC1B,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E,UAAU;AACvF,mEAAmE,UAAU,IAAI,UAAU;AAC3F,sBAAsB;AACtB,mBAAmB;AACnB;AACA,gBAAgB;AAChB;AACA;AACA,qBAAqB,mDAAO;AAC5B,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAe,aAAa,EAAC;;;;;;;;;;;;;;;;;AC1NM;AACF;;AAEjC,iBAAiB,mDAAO;AACxB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA,mBAAmB,kDAAM;;AAEzB;AACA;AACA,UAAU;;AAEV,aAAa,kDAAM;AACnB;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,QAAQ,EAAC;;;;;;;;;;;;;;;;;;;AC3DxB;AACA;AACA;AACA;AACA;AACA;;AAE0C;AAC1C;AACA;AACA;AACA;AACA;AACA,iBAAiB,aAAY;AAC7B,SAAS,SAAU;AACnB,aAAa,QAAO;AACpB,EAAE;AACF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,OAAO,IAAI,qBAAqB;AACvE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM,iDAAW;AACjB;AACA;AACA;AACA,4BAA4B,2DAAqB;AACjD;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,MAAM,6DAAuB;AAC7B;;AAEA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB,6DAAuB;AAChD,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,kDAAY;AACpC;AACA;AACA;AACA;AACA,MAAM,6DAAuB;AAC7B;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,oDAAc;AAC1B;AACA;AACA,YAAY,oDAAc;AAC1B;AACA;AACA,YAAY,0DAAoB;AAChC;AACA;AACA,YAAY,uDAAiB;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,kBAAkB,cAAc,cAAc,kBAAkB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,OAAO;AACrB,cAAc,MAAM;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,gBAAgB,EAAC;;;;;;;;;;;;;;;;;;AChQkE;AAClG,YAA8G;;AAE9G;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,oGAAO;;;;AAIxB,iEAAe,oGAAO,aAAa;;;;;;;;;;;;;;;;;ACZ+D;AAClG,YAAyG;;AAEzG;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,+FAAO;;;;AAIxB,iEAAe,+FAAO,aAAa;;;;;;;;;;;;;;;;;ACZ+D;AAClG,YAA8G;;AAE9G;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,oGAAO;;;;AAIxB,iEAAe,oGAAO,aAAa;;;;;;;;;;;;;;;;;ACZ+D;AAClG,YAAqH;;AAErH;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,2GAAO;;;;AAIxB,iEAAe,2GAAO,aAAa;;;;;;;;;;;;;;;;;ACZ+D;AAClG,YAAgH;;AAEhH;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,sGAAO;;;;AAIxB,iEAAe,sGAAO,aAAa;;;;;;;;;;;;;;;;;ACZ+D;AAClG,YAAkH;;AAElH;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,wGAAO;;;;AAIxB,iEAAe,wGAAO,aAAa;;;;;;;;;;;;;;;;;ACZyD;AAC5F,YAAoG;;AAEpG;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,gGAAO;;;;AAIxB,iEAAe,gGAAO,aAAa;;;;;;;;;;;;;;;;;ACZsD;AACzF,YAA4G;;AAE5G;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,2GAAO;;;;AAIxB,iEAAe,2GAAO,aAAa;;;;;;;;;;;;;;;;;ACZsD;AACzF,YAAkG;;AAElG;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,iGAAO;;;;AAIxB,iEAAe,iGAAO,aAAa;;;;;;;;;;;;;;;;;ACZsD;AACzF,YAA8F;;AAE9F;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,6FAAO;;;;AAIxB,iEAAe,6FAAO,aAAa;;;;;;;;UCZnC;UACA;UACA;UACA,CAAC","sources":["webpack://ab_platform_web/./js/webix/components/gantt/gantt.min.css","webpack://ab_platform_web/./js/webix/components/hint/hint.css","webpack://ab_platform_web/./js/webix/components/query/query.min.css","webpack://ab_platform_web/./js/webix/components/querybuilder/querybuilder.min.css","webpack://ab_platform_web/./js/webix/components/reports/reports.min.css","webpack://ab_platform_web/./js/webix/components/scheduler/scheduler.min.css","webpack://ab_platform_web/./js/webix/webix.css","webpack://ab_platform_web/./styles/font-awesome.min.css","webpack://ab_platform_web/./styles/loader.css","webpack://ab_platform_web/./styles/ui.css","webpack://ab_platform_web/./config/Config.js","webpack://ab_platform_web/./config/configDesktop.js","webpack://ab_platform_web/./config/configMobile.js","webpack://ab_platform_web/./index.js","webpack://ab_platform_web/./init/Bootstrap.js","webpack://ab_platform_web/./init/initConfig.js","webpack://ab_platform_web/./init/initDiv.js","webpack://ab_platform_web/./init/initUser.js","webpack://ab_platform_web/./ui/ClassUI.js","webpack://ab_platform_web/./ui/ClassUIPage.js","webpack://ab_platform_web/./ui/error_noDefs.js","webpack://ab_platform_web/./ui/portal.js","webpack://ab_platform_web/./ui/portal_access_level_manager.js","webpack://ab_platform_web/./ui/portal_auth.js","webpack://ab_platform_web/./ui/portal_auth_login.js","webpack://ab_platform_web/./ui/portal_auth_login_form.js","webpack://ab_platform_web/./ui/portal_auth_login_resetPassword.js","webpack://ab_platform_web/./ui/portal_auth_login_resetRequest.js","webpack://ab_platform_web/./ui/portal_loading.js","webpack://ab_platform_web/./ui/portal_translation_tool.js","webpack://ab_platform_web/./ui/portal_tutorial_manager.js","webpack://ab_platform_web/./ui/portal_work.js","webpack://ab_platform_web/./ui/portal_work_inbox.js","webpack://ab_platform_web/./ui/portal_work_inbox_accordion.js","webpack://ab_platform_web/./ui/portal_work_inbox_taskWindow.js","webpack://ab_platform_web/./ui/portal_work_task_user_form.js","webpack://ab_platform_web/./ui/portal_work_user_mobile_qr.js","webpack://ab_platform_web/./ui/portal_work_user_profile_window.js","webpack://ab_platform_web/./ui/portal_work_user_qr_window.js","webpack://ab_platform_web/./ui/portal_work_user_switcheroo.js","webpack://ab_platform_web/./ui/ui.js","webpack://ab_platform_web/./utils/performance.js","webpack://ab_platform_web/./js/webix/components/gantt/gantt.min.css?01a8","webpack://ab_platform_web/./js/webix/components/hint/hint.css?8c20","webpack://ab_platform_web/./js/webix/components/query/query.min.css?5ecb","webpack://ab_platform_web/./js/webix/components/querybuilder/querybuilder.min.css?d1c4","webpack://ab_platform_web/./js/webix/components/reports/reports.min.css?71d1","webpack://ab_platform_web/./js/webix/components/scheduler/scheduler.min.css?b355","webpack://ab_platform_web/./js/webix/webix.css?40ef","webpack://ab_platform_web/./styles/font-awesome.min.css?4c12","webpack://ab_platform_web/./styles/loader.css?2e54","webpack://ab_platform_web/./styles/ui.css?95be","webpack://ab_platform_web/webpack/runtime/startup prefetch"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@charset \\\"UTF-8\\\";.webix_gantt_tree .wxi-plus,.webix_gantt_tree .wxi-plus-circle{line-height:42px;font-size:22px}.webix_gantt_link{top:6px;width:16px;height:16px}.webix_gantt_milestone .webix_gantt_link{top:2px}.webix_gantt_milestone .webix_gantt_link_left.webix_gantt_link{left:-24px}.webix_gantt_milestone .webix_gantt_link_right.webix_gantt_link{right:-24px}.webix_gantt_scale .webix_template{padding:0}.webix_gantt_scale_row{display:flex;box-sizing:border-box}.webix_gantt_scale_row:not(:last-child){border-bottom:1px solid #dadee0}.webix_gantt_scale_cell{display:flex;flex:0 0 auto;justify-content:center;align-items:center;border-right:1px solid #dadee0;box-sizing:border-box;background-color:#f4f5f9}.webix_gantt_layer{position:absolute;top:0;left:0;width:100%;height:100%}.webix_gantt_task_base{position:absolute;box-sizing:border-box;border-radius:2px;color:#fff;cursor:pointer}.webix_gantt_project{background-color:#38aea2}.webix_gantt_task{background-color:#6ba8cb}.webix_gantt_project:hover,.webix_gantt_task:hover{z-index:3;box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_gantt_milestone{background-color:transparent}.webix_gantt_in_action .webix_gantt_task_base,.webix_gantt_task_in_action{pointer-events:none}.webix_drag_zone.webix_gantt_task_base{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_drag_zone.webix_gantt_task_base.webix_gantt_milestone{box-shadow:none}.webix_drag_zone.webix_gantt_task_base.webix_gantt_milestone .webix_gantt_content{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_gantt_progress{height:100%;background-color:#4d96c0;border-radius:2px 0 0 2px}.webix_gantt_project .webix_gantt_progress{background-color:#2e8f85}.webix_gantt_milestone .webix_gantt_content{transform:rotate(45deg);background-color:#cf89d5;border-radius:inherit;padding:0;width:100%;text-overflow:clip}.webix_gantt_milestone .webix_gantt_content span{visibility:hidden}.webix_gantt_milestone:hover .webix_gantt_content,.webix_gantt_milestone .webix_gantt_content:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_gantt_progress_drag{position:absolute;z-index:1;cursor:ew-resize;top:100%;border:10px solid transparent;border-bottom:10px solid #dadee0;margin-top:-19px;margin-left:-10px;visibility:hidden}.webix_gantt_task_base:hover .webix_gantt_progress_drag,.webix_gantt_mode_progress .webix_gantt_progress_drag{visibility:visible}.webix_gantt_progress_drag::before{content:\\\"\\\";position:absolute;border:8px solid transparent;border-bottom:8px solid #fff;top:-7px;left:-8px}.webix_gantt_progress_percent{position:absolute;left:-10px;top:9px;display:inline-block;line-height:14px;width:20px;border:1px solid #dadee0;border-top:0;border-radius:2px 2px 4px 4px;box-sizing:border-box;background:#fff;color:#1ca1c1;text-align:center;font-size:10px}.webix_gantt_content{text-align:center;line-height:30px;position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 12px}.webix_gantt_link{position:absolute;z-index:2;border-radius:50%;border:1px solid #dadee0;background-color:#fff;cursor:pointer;user-select:none;opacity:0}.webix_gantt_link_visible .webix_gantt_content:hover,.webix_gantt_task_base.webix_gantt_link_visible:hover,.webix_gantt_task_base.webix_gantt_link_visible:hover .webix_gantt_content{box-shadow:none}.webix_gantt_task,.webix_gantt_project{box-shadow:#fff 1px 0 0}.webix_gantt_milestone .webix_gantt_content{box-shadow:#fff 1px -1px 0}.webix_gantt_task.webix_gantt_link_visible .webix_gantt_progress_drag{visibility:hidden}.webix_gantt_link_visible .webix_gantt_link{opacity:1}.webix_gantt_link_left{left:-9px}.webix_gantt_link_right{right:-9px}.webix_gantt_task_base:hover .webix_gantt_link,.webix_gantt_link:hover{opacity:1}.webix_gantt_readonly .webix_gantt_task_base .webix_gantt_link{display:none}.webix_gantt_group.webix_gantt_project{cursor:default}.webix_gantt_group.webix_gantt_project .webix_gantt_link{display:none}.webix_gantt_touch_bars .webix_gantt_task .webix_gantt_content{padding:0 32px}.webix_gantt_touch_bars .webix_gantt_task::before,.webix_gantt_touch_bars .webix_gantt_task::after{content:\\\"\\\";font-size:20px;font-family:\\\"Webix Material Icons\\\";position:absolute;visibility:hidden;top:50%;margin-top:-10px}.webix_gantt_touch_bars .webix_gantt_task::before{left:12px}.webix_gantt_touch_bars .webix_gantt_task::after{right:12px}.webix_gantt_touch_bars .webix_gantt_task_base .webix_gantt_progress_drag{visibility:hidden}.webix_gantt_touch_bars .webix_gantt_mode_start::before,.webix_gantt_touch_bars .webix_gantt_mode_end::after,.webix_gantt_touch_bars .webix_gantt_task:hover::before,.webix_gantt_touch_bars .webix_gantt_task:hover::after{visibility:visible}.webix_gantt_task_base.webix_gantt_last::after{content:\\\"\\\";display:block;height:7px}.webix_gantt_task_base.webix_gantt_last .webix_gantt_progress_drag{transform:rotate(180deg);top:unset;bottom:100%;margin-bottom:-19px}.webix_gantt_task_base.webix_gantt_last .webix_gantt_progress_percent{transform:rotate(180deg);top:8.5px;border-radius:4px 4px 2px 2px;border:1px solid #dadee0;border-bottom:0}.webix_gantt_bars,.webix_gantt_touch_bars,.webix_gantt_links,.webix_gantt_holidays{background:transparent}.webix_gantt_bars,.webix_gantt_touch_bars{border-color:#fff}.webix_gantt_links .webix_template{position:relative;padding:0}.webix_gantt_links polyline{stroke:orange;fill:transparent;stroke-width:2}.webix_gantt_temp_line{pointer-events:none;position:absolute;z-index:1;top:0;left:0}.webix_gantt_bar_selection{background-color:rgba(195,200,222,0.2);position:absolute;top:-100px;pointer-events:none}.webix_gantt_markers{pointer-events:none;position:absolute}.webix_gantt_marker{position:absolute;left:-100px;top:0;width:2px;height:inherit;margin-left:-1px;background-color:#1ca1c1;opacity:.6}.webix_gantt_marker_text{display:inline-block;padding:4px 8px;line-height:16px;white-space:nowrap;border-bottom-right-radius:4px;background-color:inherit;color:#fff}.webix_gantt_marker.webix_gantt_today_marker{background-color:#ff5c4c}.webix_gantt_holidays .webix_template{position:relative;padding:0}.webix_gantt_bar_holidays,.webix_gantt_bar_resource_holidays{position:absolute;pointer-events:none}.webix_gantt_holiday{position:absolute;background-color:rgba(97,120,151,0.12)}.webix_gantt_bar_resource_holidays .webix_gantt_holiday{background-color:rgba(97,120,151,0.12)}.webix_gantt_bar_resource_holidays .webix_gantt_work_day{position:absolute;background-color:#fff}.webix_gantt_bar_holidays .webix_gantt_holiday{top:0;height:inherit}.webix_gantt_scale_cell.webix_gantt_holiday_scale{background-color:rgba(97,120,151,0.12)}.webix_gantt_critical.webix_gantt_task{background:#ff5c4c}.webix_gantt_critical.webix_gantt_task .webix_gantt_progress{background:#ff3723}.webix_gantt_critical.webix_gantt_milestone{background-color:transparent}.webix_gantt_critical.webix_gantt_milestone .webix_gantt_content{background:#ff5c4c}.webix_gantt_critical.webix_gantt_project{background-color:#f50}.webix_gantt_critical.webix_gantt_project .webix_gantt_progress{background-color:#d64700}.webix_gantt_links polyline.webix_gantt_line_critical{stroke:#ff5c4c}.webix_gantt_split_selection{position:absolute;z-index:2;background-color:rgba(107,168,203,0.2);border:1px solid #6ba8cb;border-radius:2px}.webix_gantt_split_task .webix_tree_close{visibility:hidden}.webix_gantt_split_container{position:absolute;pointer-events:none;background-image:linear-gradient(to right,#1ca1c1 50%,rgba(255,255,255,0) 0);background-position:bottom;background-size:14px 2px;background-repeat:repeat-x}.webix_gantt_baseline_task,.webix_gantt_baseline_project{position:absolute;height:5px;border-radius:2px}.webix_gantt_baseline_task{background-color:rgba(24,80,111,0.75)}.webix_gantt_baseline_project{background-color:rgba(7,80,73,0.8)}.webix_gantt_task_info ul{margin:0;padding:5px 0 0 15px}.webix_gantt_task_info .webix_template{overflow:auto;padding:0 0 0 2px;line-height:20px}ul.webix_gantt_info_list_resources{padding:5px 0 0}.webix_gantt_info_resource{display:flex;align-items:stretch;padding:0 0 1px;line-height:normal}.webix_gantt_info_list_text_row{display:flex;align-items:baseline;padding-top:4px}.webix_gantt_info_list_text{min-width:130px;margin-left:8px;margin-right:8px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.webix_gantt_info_list_text.webix_gantt_resource_section{padding-left:0}.webix_gantt_task_title{color:#313131;font-weight:500;font-size:16px}.webix_gantt_task_text{line-height:20px}.webix_gantt_info_list_planned{padding-top:5px}.webix_gantt_form_tree .webix_gantt_title .webix_cell{padding-left:8px}.webix_gantt_form_tree .webix_gantt_action .wxi-trash{margin-left:-10px;height:20px;font-size:18px}.webix_gantt_form_tree .webix_cell{border-bottom-color:transparent}.webix_gantt_form_tree .webix_gantt_type .webix_cell,.webix_gantt_form_tree .webix_gantt_value .webix_cell{padding-right:4px;text-align:right}.webix_gantt_form_tree .webix_dt_editor input{text-align:right}.webix_gantt_form_counter .webix_inp_counter_value{width:calc(50% - 60px)}.webix_list .webix_gantt_resource_section{float:right;text-align:right}.webix_gantt_resource_section{padding-left:5px;color:#888;width:80px;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.webix_gantt_resource_table .webix_gantt_title .webix_cell.webix_gantt_select_editor{box-shadow:inset 0 0 0 1px #1ca1c1;border-radius:2px;padding-left:8px;background:#fff}.webix_gantt_select_editor_popup .webix_selected{box-shadow:none}.webix_gantt_select_editor_popup .webix_list_item,.webix_gantt_select_editor_popup .webix_list_item.webix_selected{padding:0 8px;line-height:36px}.webix_gantt_form_unit_title{padding-right:12px}.webix_gantt_table_hover[aria-level=\\\"2\\\"],.webix_gantt_link_table_hover[aria-level=\\\"2\\\"]{background:rgba(244,245,249,0.6)}.webix_gantt .webix_transparent .webix_button{color:#1ca1c1}.webix_gantt .webix_transparent .webix_el_box:not(.webix_disabled_box) .webix_icon_btn{color:#1ca1c1}.webix_gantt_select_editor_popup .webix_scroll_cont:empty:before{content:attr(placeholder);font-size:12px;font-style:italic;color:#888;text-align:center;display:inline-block;width:100%;line-height:28px}.webix_gantt_datepicker .webix_cal_icon_clear{display:none}.webix_gantt_tree .webix_gantt_action .webix_icon{cursor:pointer}.webix_gantt_tree .webix_gantt_action .webix_icon:hover{color:#1ca1c1}.webix_gantt_tree .webix_column.webix_gantt_action>div,.webix_gantt_tree .webix_hcell.webix_gantt_action{padding:0 11px}.webix_gantt_tree .webix_gantt_title .webix_cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.webix_gantt_tree .webix_column>div.webix_row_select{background-color:#f4f5f9;color:#475466}.webix_gantt_tree .webix_ss_body .webix_column>div{border-right-color:transparent;border-left-color:transparent}.webix_gantt_resizer{background-color:#ebedf0}.webix_gantt_resizer.webix_resizer_x{z-index:5;position:relative;overflow:visible}.webix_gantt_resizer.webix_resizer_x:after{position:absolute;left:-4px;height:100%;content:\\\"\\\";width:9px}.webix_drag_zone .webix_dd_drag.webix_gantt_tree_no_icon .webix_tree_close{visibility:hidden}@font-face{font-family:\\\"gantt-webfont\\\";src:url(\\\"fonts/gantt-webfont.woff2\\\") format(\\\"woff2\\\"),url(\\\"fonts/gantt-webfont.woff\\\") format(\\\"woff\\\");font-weight:normal;font-style:normal}[class^=gti-]:before,[class*=gti-]:before{font-family:\\\"gantt-webfont\\\";display:inline-block;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.gti-menu:before{content:\\\"\\\"}.webix_gantt_accordion .webix_accordionitem{border-color:transparent}.webix_gantt_accordion .webix_accordionitem_header{border-color:transparent;font-size:inherit}.webix_gantt_accordion .webix_accordionitem_header .webix_accordionitem_button{color:#94a1b3}.webix_gantt_accordion .webix_accordionitem.collapsed .webix_accordionitem_header .webix_accordionitem_button{color:#94a1b3}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header.collapsed .webix_accordionitem_button:before{content:\\\"\\\"}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button{margin:0 6px 0 1px}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button:before{content:\\\"\\\"}.webix_gantt_accordion .webix_accordionitem.collapsed .webix_accordionitem_header:hover,.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header:hover{background-color:rgba(195,200,222,0.2)}.webix_gantt_accordion .webix_accordionitem_label{color:#313131}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header{background-color:#f4f5f9}.webix_gantt_person_avatar,.webix_gantt_cell_remain_num{vertical-align:middle;margin:4px 4px 4px 0;height:24px;line-height:24px;flex-shrink:0;width:24px;font-size:12px;border-radius:50%;display:inline-block;text-align:center;color:rgba(255,255,255,0.9)}.webix_gantt_person_avatar_big{height:32px;line-height:32px;width:32px;font-size:14px}.webix_gantt_person_avatar_0{background:#00a037}.webix_gantt_person_avatar_1{background:#13a1aa}.webix_gantt_person_avatar_2{background:#fd772c}.webix_gantt_person_avatar_3{background:#b26bd3}.webix_gantt_person_avatar_4{background:#c87095}.webix_gantt_person_avatar_5{background:#eb2f89}.webix_gantt_person_avatar_6{background:#9bb402}.webix_gantt_person_avatar_7{background:#e7a90b}.webix_gantt_person_avatar_8{background:#0bbed7}.webix_gantt_person_avatar_9{background:#038cd9}.webix_gantt_tree_column_resources .webix_cell{padding:0 8px}.webix_gantt_cell_assigned_text{font-size:12px}.webix_gantt_cell_assigned_last{width:24px;display:inline-block}.webix_gantt_cell_remain_num{position:relative;left:-28px;z-index:1;background:rgba(0,0,0,0.5)}.webix_gantt_avatar_box{height:100%;display:flex;align-items:center}.webix_gantt_avatar_box .webix_icon{flex-basis:20px}.webix_gantt_avatar_box_inline{display:inline-flex;align-items:center}.webix_gantt_avatar_option_box{display:flex;align-items:center;justify-content:space-between}.webix_gantt_editor_avatar_name{max-width:170px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-left:2px}.webix_popup .webix_gantt_editor_avatar_name{max-width:190px}.webix_gantt_absbutton{border-radius:50%;z-index:91}.webix_gantt_absbutton .webix_el_box{background-color:#1ca1c1}.webix_gantt_absbutton .webix_el_box .webix_icon_button:hover:before{background-color:#1992af}.webix_gantt_absbutton .webix_el_box .webix_icon{color:#fff}.webix_gantt_resdiagram_tree .webix_tree_none,.webix_gantt_resdiagram_tree .webix_tree_folder_open{cursor:default}.webix_gantt_resdiagram_tree .webix_cell{text-overflow:ellipsis}.webix_gantt_resdiagram_tree .webix_ss_body .webix_column>div{border-right-color:transparent;border-left-color:transparent}.webix_gantt_resdiagram_chart.webix_tree .webix_scroll_cont>.webix_tree_leaves{padding:0}.webix_gantt_resdiagram_chart.webix_tree .webix_scroll_cont>.webix_tree_leaves:last-child::after{content:\\\"\\\";display:block;height:2px}.webix_gantt_diagram_marker{display:inline-block;position:absolute;color:#fff;text-align:center;background-color:#55cd97;border-radius:32px;width:32px;height:32px;line-height:32px}.webix_gantt_diagram_marker.webix_gantt_overload{background-color:#ff5c4c}.webix_gantt_diagram_line.webix_tree_item{padding:4px}.webix_gantt .webix_progress_top{z-index:10000}.webix_gantt_scale{border-bottom-color:#5ccce7}.webix_gantt_danger .webix_button{color:#ff5c4c;background-color:#fff1ef}.webix_gantt_danger .webix_button:hover,.webix_gantt_danger .webix_button:focus{background-color:#ffe7e5}.webix_gantt_danger .webix_button:active{background-color:#ffdedb}\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/components/gantt/gantt.min.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@charset \\\"UTF-8\\\";.webix_gantt_tree .wxi-plus,.webix_gantt_tree .wxi-plus-circle{line-height:42px;font-size:22px}.webix_gantt_link{top:6px;width:16px;height:16px}.webix_gantt_milestone .webix_gantt_link{top:2px}.webix_gantt_milestone .webix_gantt_link_left.webix_gantt_link{left:-24px}.webix_gantt_milestone .webix_gantt_link_right.webix_gantt_link{right:-24px}.webix_gantt_scale .webix_template{padding:0}.webix_gantt_scale_row{display:flex;box-sizing:border-box}.webix_gantt_scale_row:not(:last-child){border-bottom:1px solid #dadee0}.webix_gantt_scale_cell{display:flex;flex:0 0 auto;justify-content:center;align-items:center;border-right:1px solid #dadee0;box-sizing:border-box;background-color:#f4f5f9}.webix_gantt_layer{position:absolute;top:0;left:0;width:100%;height:100%}.webix_gantt_task_base{position:absolute;box-sizing:border-box;border-radius:2px;color:#fff;cursor:pointer}.webix_gantt_project{background-color:#38aea2}.webix_gantt_task{background-color:#6ba8cb}.webix_gantt_project:hover,.webix_gantt_task:hover{z-index:3;box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_gantt_milestone{background-color:transparent}.webix_gantt_in_action .webix_gantt_task_base,.webix_gantt_task_in_action{pointer-events:none}.webix_drag_zone.webix_gantt_task_base{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_drag_zone.webix_gantt_task_base.webix_gantt_milestone{box-shadow:none}.webix_drag_zone.webix_gantt_task_base.webix_gantt_milestone .webix_gantt_content{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_gantt_progress{height:100%;background-color:#4d96c0;border-radius:2px 0 0 2px}.webix_gantt_project .webix_gantt_progress{background-color:#2e8f85}.webix_gantt_milestone .webix_gantt_content{transform:rotate(45deg);background-color:#cf89d5;border-radius:inherit;padding:0;width:100%;text-overflow:clip}.webix_gantt_milestone .webix_gantt_content span{visibility:hidden}.webix_gantt_milestone:hover .webix_gantt_content,.webix_gantt_milestone .webix_gantt_content:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_gantt_progress_drag{position:absolute;z-index:1;cursor:ew-resize;top:100%;border:10px solid transparent;border-bottom:10px solid #dadee0;margin-top:-19px;margin-left:-10px;visibility:hidden}.webix_gantt_task_base:hover .webix_gantt_progress_drag,.webix_gantt_mode_progress .webix_gantt_progress_drag{visibility:visible}.webix_gantt_progress_drag::before{content:\\\"\\\";position:absolute;border:8px solid transparent;border-bottom:8px solid #fff;top:-7px;left:-8px}.webix_gantt_progress_percent{position:absolute;left:-10px;top:9px;display:inline-block;line-height:14px;width:20px;border:1px solid #dadee0;border-top:0;border-radius:2px 2px 4px 4px;box-sizing:border-box;background:#fff;color:#1ca1c1;text-align:center;font-size:10px}.webix_gantt_content{text-align:center;line-height:30px;position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 12px}.webix_gantt_link{position:absolute;z-index:2;border-radius:50%;border:1px solid #dadee0;background-color:#fff;cursor:pointer;user-select:none;opacity:0}.webix_gantt_link_visible .webix_gantt_content:hover,.webix_gantt_task_base.webix_gantt_link_visible:hover,.webix_gantt_task_base.webix_gantt_link_visible:hover .webix_gantt_content{box-shadow:none}.webix_gantt_task,.webix_gantt_project{box-shadow:#fff 1px 0 0}.webix_gantt_milestone .webix_gantt_content{box-shadow:#fff 1px -1px 0}.webix_gantt_task.webix_gantt_link_visible .webix_gantt_progress_drag{visibility:hidden}.webix_gantt_link_visible .webix_gantt_link{opacity:1}.webix_gantt_link_left{left:-9px}.webix_gantt_link_right{right:-9px}.webix_gantt_task_base:hover .webix_gantt_link,.webix_gantt_link:hover{opacity:1}.webix_gantt_readonly .webix_gantt_task_base .webix_gantt_link{display:none}.webix_gantt_group.webix_gantt_project{cursor:default}.webix_gantt_group.webix_gantt_project .webix_gantt_link{display:none}.webix_gantt_touch_bars .webix_gantt_task .webix_gantt_content{padding:0 32px}.webix_gantt_touch_bars .webix_gantt_task::before,.webix_gantt_touch_bars .webix_gantt_task::after{content:\\\"\\\";font-size:20px;font-family:\\\"Webix Material Icons\\\";position:absolute;visibility:hidden;top:50%;margin-top:-10px}.webix_gantt_touch_bars .webix_gantt_task::before{left:12px}.webix_gantt_touch_bars .webix_gantt_task::after{right:12px}.webix_gantt_touch_bars .webix_gantt_task_base .webix_gantt_progress_drag{visibility:hidden}.webix_gantt_touch_bars .webix_gantt_mode_start::before,.webix_gantt_touch_bars .webix_gantt_mode_end::after,.webix_gantt_touch_bars .webix_gantt_task:hover::before,.webix_gantt_touch_bars .webix_gantt_task:hover::after{visibility:visible}.webix_gantt_task_base.webix_gantt_last::after{content:\\\"\\\";display:block;height:7px}.webix_gantt_task_base.webix_gantt_last .webix_gantt_progress_drag{transform:rotate(180deg);top:unset;bottom:100%;margin-bottom:-19px}.webix_gantt_task_base.webix_gantt_last .webix_gantt_progress_percent{transform:rotate(180deg);top:8.5px;border-radius:4px 4px 2px 2px;border:1px solid #dadee0;border-bottom:0}.webix_gantt_bars,.webix_gantt_touch_bars,.webix_gantt_links,.webix_gantt_holidays{background:transparent}.webix_gantt_bars,.webix_gantt_touch_bars{border-color:#fff}.webix_gantt_links .webix_template{position:relative;padding:0}.webix_gantt_links polyline{stroke:orange;fill:transparent;stroke-width:2}.webix_gantt_temp_line{pointer-events:none;position:absolute;z-index:1;top:0;left:0}.webix_gantt_bar_selection{background-color:rgba(195,200,222,0.2);position:absolute;top:-100px;pointer-events:none}.webix_gantt_markers{pointer-events:none;position:absolute}.webix_gantt_marker{position:absolute;left:-100px;top:0;width:2px;height:inherit;margin-left:-1px;background-color:#1ca1c1;opacity:.6}.webix_gantt_marker_text{display:inline-block;padding:4px 8px;line-height:16px;white-space:nowrap;border-bottom-right-radius:4px;background-color:inherit;color:#fff}.webix_gantt_marker.webix_gantt_today_marker{background-color:#ff5c4c}.webix_gantt_holidays .webix_template{position:relative;padding:0}.webix_gantt_bar_holidays,.webix_gantt_bar_resource_holidays{position:absolute;pointer-events:none}.webix_gantt_holiday{position:absolute;background-color:rgba(97,120,151,0.12)}.webix_gantt_bar_resource_holidays .webix_gantt_holiday{background-color:rgba(97,120,151,0.12)}.webix_gantt_bar_resource_holidays .webix_gantt_work_day{position:absolute;background-color:#fff}.webix_gantt_bar_holidays .webix_gantt_holiday{top:0;height:inherit}.webix_gantt_scale_cell.webix_gantt_holiday_scale{background-color:rgba(97,120,151,0.12)}.webix_gantt_critical.webix_gantt_task{background:#ff5c4c}.webix_gantt_critical.webix_gantt_task .webix_gantt_progress{background:#ff3723}.webix_gantt_critical.webix_gantt_milestone{background-color:transparent}.webix_gantt_critical.webix_gantt_milestone .webix_gantt_content{background:#ff5c4c}.webix_gantt_critical.webix_gantt_project{background-color:#f50}.webix_gantt_critical.webix_gantt_project .webix_gantt_progress{background-color:#d64700}.webix_gantt_links polyline.webix_gantt_line_critical{stroke:#ff5c4c}.webix_gantt_split_selection{position:absolute;z-index:2;background-color:rgba(107,168,203,0.2);border:1px solid #6ba8cb;border-radius:2px}.webix_gantt_split_task .webix_tree_close{visibility:hidden}.webix_gantt_split_container{position:absolute;pointer-events:none;background-image:linear-gradient(to right,#1ca1c1 50%,rgba(255,255,255,0) 0);background-position:bottom;background-size:14px 2px;background-repeat:repeat-x}.webix_gantt_baseline_task,.webix_gantt_baseline_project{position:absolute;height:5px;border-radius:2px}.webix_gantt_baseline_task{background-color:rgba(24,80,111,0.75)}.webix_gantt_baseline_project{background-color:rgba(7,80,73,0.8)}.webix_gantt_task_info ul{margin:0;padding:5px 0 0 15px}.webix_gantt_task_info .webix_template{overflow:auto;padding:0 0 0 2px;line-height:20px}ul.webix_gantt_info_list_resources{padding:5px 0 0}.webix_gantt_info_resource{display:flex;align-items:stretch;padding:0 0 1px;line-height:normal}.webix_gantt_info_list_text_row{display:flex;align-items:baseline;padding-top:4px}.webix_gantt_info_list_text{min-width:130px;margin-left:8px;margin-right:8px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.webix_gantt_info_list_text.webix_gantt_resource_section{padding-left:0}.webix_gantt_task_title{color:#313131;font-weight:500;font-size:16px}.webix_gantt_task_text{line-height:20px}.webix_gantt_info_list_planned{padding-top:5px}.webix_gantt_form_tree .webix_gantt_title .webix_cell{padding-left:8px}.webix_gantt_form_tree .webix_gantt_action .wxi-trash{margin-left:-10px;height:20px;font-size:18px}.webix_gantt_form_tree .webix_cell{border-bottom-color:transparent}.webix_gantt_form_tree .webix_gantt_type .webix_cell,.webix_gantt_form_tree .webix_gantt_value .webix_cell{padding-right:4px;text-align:right}.webix_gantt_form_tree .webix_dt_editor input{text-align:right}.webix_gantt_form_counter .webix_inp_counter_value{width:calc(50% - 60px)}.webix_list .webix_gantt_resource_section{float:right;text-align:right}.webix_gantt_resource_section{padding-left:5px;color:#888;width:80px;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.webix_gantt_resource_table .webix_gantt_title .webix_cell.webix_gantt_select_editor{box-shadow:inset 0 0 0 1px #1ca1c1;border-radius:2px;padding-left:8px;background:#fff}.webix_gantt_select_editor_popup .webix_selected{box-shadow:none}.webix_gantt_select_editor_popup .webix_list_item,.webix_gantt_select_editor_popup .webix_list_item.webix_selected{padding:0 8px;line-height:36px}.webix_gantt_form_unit_title{padding-right:12px}.webix_gantt_table_hover[aria-level=\\\"2\\\"],.webix_gantt_link_table_hover[aria-level=\\\"2\\\"]{background:rgba(244,245,249,0.6)}.webix_gantt .webix_transparent .webix_button{color:#1ca1c1}.webix_gantt .webix_transparent .webix_el_box:not(.webix_disabled_box) .webix_icon_btn{color:#1ca1c1}.webix_gantt_select_editor_popup .webix_scroll_cont:empty:before{content:attr(placeholder);font-size:12px;font-style:italic;color:#888;text-align:center;display:inline-block;width:100%;line-height:28px}.webix_gantt_datepicker .webix_cal_icon_clear{display:none}.webix_gantt_tree .webix_gantt_action .webix_icon{cursor:pointer}.webix_gantt_tree .webix_gantt_action .webix_icon:hover{color:#1ca1c1}.webix_gantt_tree .webix_column.webix_gantt_action>div,.webix_gantt_tree .webix_hcell.webix_gantt_action{padding:0 11px}.webix_gantt_tree .webix_gantt_title .webix_cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.webix_gantt_tree .webix_column>div.webix_row_select{background-color:#f4f5f9;color:#475466}.webix_gantt_tree .webix_ss_body .webix_column>div{border-right-color:transparent;border-left-color:transparent}.webix_gantt_resizer{background-color:#ebedf0}.webix_gantt_resizer.webix_resizer_x{z-index:5;position:relative;overflow:visible}.webix_gantt_resizer.webix_resizer_x:after{position:absolute;left:-4px;height:100%;content:\\\"\\\";width:9px}.webix_drag_zone .webix_dd_drag.webix_gantt_tree_no_icon .webix_tree_close{visibility:hidden}@font-face{font-family:\\\"gantt-webfont\\\";src:url(\\\"fonts/gantt-webfont.woff2\\\") format(\\\"woff2\\\"),url(\\\"fonts/gantt-webfont.woff\\\") format(\\\"woff\\\");font-weight:normal;font-style:normal}[class^=gti-]:before,[class*=gti-]:before{font-family:\\\"gantt-webfont\\\";display:inline-block;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.gti-menu:before{content:\\\"\\\"}.webix_gantt_accordion .webix_accordionitem{border-color:transparent}.webix_gantt_accordion .webix_accordionitem_header{border-color:transparent;font-size:inherit}.webix_gantt_accordion .webix_accordionitem_header .webix_accordionitem_button{color:#94a1b3}.webix_gantt_accordion .webix_accordionitem.collapsed .webix_accordionitem_header .webix_accordionitem_button{color:#94a1b3}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header.collapsed .webix_accordionitem_button:before{content:\\\"\\\"}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button{margin:0 6px 0 1px}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button:before{content:\\\"\\\"}.webix_gantt_accordion .webix_accordionitem.collapsed .webix_accordionitem_header:hover,.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header:hover{background-color:rgba(195,200,222,0.2)}.webix_gantt_accordion .webix_accordionitem_label{color:#313131}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header{background-color:#f4f5f9}.webix_gantt_person_avatar,.webix_gantt_cell_remain_num{vertical-align:middle;margin:4px 4px 4px 0;height:24px;line-height:24px;flex-shrink:0;width:24px;font-size:12px;border-radius:50%;display:inline-block;text-align:center;color:rgba(255,255,255,0.9)}.webix_gantt_person_avatar_big{height:32px;line-height:32px;width:32px;font-size:14px}.webix_gantt_person_avatar_0{background:#00a037}.webix_gantt_person_avatar_1{background:#13a1aa}.webix_gantt_person_avatar_2{background:#fd772c}.webix_gantt_person_avatar_3{background:#b26bd3}.webix_gantt_person_avatar_4{background:#c87095}.webix_gantt_person_avatar_5{background:#eb2f89}.webix_gantt_person_avatar_6{background:#9bb402}.webix_gantt_person_avatar_7{background:#e7a90b}.webix_gantt_person_avatar_8{background:#0bbed7}.webix_gantt_person_avatar_9{background:#038cd9}.webix_gantt_tree_column_resources .webix_cell{padding:0 8px}.webix_gantt_cell_assigned_text{font-size:12px}.webix_gantt_cell_assigned_last{width:24px;display:inline-block}.webix_gantt_cell_remain_num{position:relative;left:-28px;z-index:1;background:rgba(0,0,0,0.5)}.webix_gantt_avatar_box{height:100%;display:flex;align-items:center}.webix_gantt_avatar_box .webix_icon{flex-basis:20px}.webix_gantt_avatar_box_inline{display:inline-flex;align-items:center}.webix_gantt_avatar_option_box{display:flex;align-items:center;justify-content:space-between}.webix_gantt_editor_avatar_name{max-width:170px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-left:2px}.webix_popup .webix_gantt_editor_avatar_name{max-width:190px}.webix_gantt_absbutton{border-radius:50%;z-index:91}.webix_gantt_absbutton .webix_el_box{background-color:#1ca1c1}.webix_gantt_absbutton .webix_el_box .webix_icon_button:hover:before{background-color:#1992af}.webix_gantt_absbutton .webix_el_box .webix_icon{color:#fff}.webix_gantt_resdiagram_tree .webix_tree_none,.webix_gantt_resdiagram_tree .webix_tree_folder_open{cursor:default}.webix_gantt_resdiagram_tree .webix_cell{text-overflow:ellipsis}.webix_gantt_resdiagram_tree .webix_ss_body .webix_column>div{border-right-color:transparent;border-left-color:transparent}.webix_gantt_resdiagram_chart.webix_tree .webix_scroll_cont>.webix_tree_leaves{padding:0}.webix_gantt_resdiagram_chart.webix_tree .webix_scroll_cont>.webix_tree_leaves:last-child::after{content:\\\"\\\";display:block;height:2px}.webix_gantt_diagram_marker{display:inline-block;position:absolute;color:#fff;text-align:center;background-color:#55cd97;border-radius:32px;width:32px;height:32px;line-height:32px}.webix_gantt_diagram_marker.webix_gantt_overload{background-color:#ff5c4c}.webix_gantt_diagram_line.webix_tree_item{padding:4px}.webix_gantt .webix_progress_top{z-index:10000}.webix_gantt_scale{border-bottom-color:#5ccce7}.webix_gantt_danger .webix_button{color:#ff5c4c;background-color:#fff1ef}.webix_gantt_danger .webix_button:hover,.webix_gantt_danger .webix_button:focus{background-color:#ffe7e5}.webix_gantt_danger .webix_button:active{background-color:#ffdedb}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".webix_hint_view.webix_hint_animated .webix_hint_overlay_hole_el {\\n fill: #000;\\n -webkit-transition: fill 0.4s ease-in;\\n -o-transition: fill 0.4s ease-in;\\n transition: fill 0.4s ease-in;\\n}\\n.webix_hint_view.webix_hint_animated .webix_hint {\\n opacity: 1;\\n -webkit-transition: opacity 0.4s ease-in;\\n -o-transition: opacity 0.4s ease-in;\\n transition: opacity 0.4s ease-in;\\n}\\n.webix_hint_overlay {\\n position: fixed;\\n width: 100%;\\n height: 100%;\\n top: 0;\\n left: 0;\\n z-index: 1010;\\n pointer-events: none;\\n overflow: hidden;\\n opacity: 0.6;\\n}\\n.webix_hint_view svg {\\n position: absolute;\\n height: 100%;\\n width: 100%;\\n left: 0;\\n top: 0;\\n}\\n.webix_hint_overflow {\\n pointer-events: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n position: relative;\\n height: 100%;\\n width: 100%;\\n min-width: 100%;\\n}\\n.webix_hint_overflow .webix_window,\\n.webix_hint_overflow .webix_popup {\\n pointer-events: all;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n.webix_hint {\\n position: fixed;\\n pointer-events: all;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n display: block;\\n z-index: 1012;\\n width: 310px;\\n border-radius: 2px;\\n background-color: #FFFFFF;\\n padding: 22px 50px 80px 22px;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n -webkit-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.1);\\n box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.1);\\n opacity: 0;\\n}\\n.webix_hint .webix_hint_label {\\n color: rgba(0, 0, 0, 0.54);\\n font-size: 16px;\\n line-height: 24px;\\n margin: -5px 0;\\n}\\n.webix_hint .webix_hint_title {\\n color: rgba(0, 0, 0, 0.87);\\n font-size: 20px;\\n font-weight: 500;\\n line-height: 1;\\n margin-bottom: 15px;\\n}\\n.webix_hint_buttons {\\n position: absolute;\\n bottom: 11px;\\n right: 22px;\\n}\\n.webix_hint_buttons .webix_hint_button {\\n display: inline-block;\\n pointer-events: all;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n cursor: pointer;\\n margin: 0 auto;\\n height: 32px;\\n padding: 0px 16px;\\n border: none;\\n border-radius: 2px;\\n font-size: 14px;\\n font-weight: 500;\\n line-height: 16px;\\n text-transform: uppercase;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_next {\\n margin-left: 17px;\\n background-color: #00BFC7;\\n color: #fff;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_next:hover {\\n background-color: #27D6DD;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_prev {\\n color: #0097A7;\\n background-color: #fff;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_prev:hover {\\n background-color: rgba(0, 191, 199, 0.1);\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_prev.webix_hint_button_hidden {\\n display: none;\\n}\\n.webix_hint_progress {\\n position: absolute;\\n bottom: 17px;\\n left: 22px;\\n color: rgba(0, 0, 0, 0.54);\\n font-size: 14px;\\n}\\n.webix_hint_button_close {\\n position: absolute;\\n right: 22px;\\n top: 20px;\\n z-index: 1012;\\n background: transparent;\\n border: none;\\n font-size: 22px;\\n color: rgba(0, 0, 0, 0.54);\\n pointer-events: all;\\n cursor: pointer;\\n padding: 0;\\n line-height: 1;\\n}\\n.webix_hint_button_close:hover {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/components/hint/hint.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,UAAU;EACV,qCAAqC;EACrC,gCAAgC;EAChC,6BAA6B;AAC/B;AACA;EACE,UAAU;EACV,wCAAwC;EACxC,mCAAmC;EACnC,gCAAgC;AAClC;AACA;EACE,eAAe;EACf,WAAW;EACX,YAAY;EACZ,MAAM;EACN,OAAO;EACP,aAAa;EACb,oBAAoB;EACpB,gBAAgB;EAChB,YAAY;AACd;AACA;EACE,kBAAkB;EAClB,YAAY;EACZ,WAAW;EACX,OAAO;EACP,MAAM;AACR;AACA;EACE,oBAAoB;EACpB,yBAAyB;EACzB,sBAAsB;EACtB,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;EAClB,YAAY;EACZ,WAAW;EACX,eAAe;AACjB;AACA;;EAEE,mBAAmB;EACnB,yBAAyB;EACzB,sBAAsB;EACtB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,eAAe;EACf,mBAAmB;EACnB,yBAAyB;EACzB,sBAAsB;EACtB,qBAAqB;EACrB,iBAAiB;EACjB,cAAc;EACd,aAAa;EACb,YAAY;EACZ,kBAAkB;EAClB,yBAAyB;EACzB,4BAA4B;EAC5B,8BAA8B;EAC9B,sBAAsB;EACtB,kFAAkF;EAClF,0EAA0E;EAC1E,UAAU;AACZ;AACA;EACE,0BAA0B;EAC1B,eAAe;EACf,iBAAiB;EACjB,cAAc;AAChB;AACA;EACE,0BAA0B;EAC1B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,kBAAkB;EAClB,YAAY;EACZ,WAAW;AACb;AACA;EACE,qBAAqB;EACrB,mBAAmB;EACnB,+BAA+B;EAC/B,uBAAuB;EACvB,eAAe;EACf,cAAc;EACd,YAAY;EACZ,iBAAiB;EACjB,YAAY;EACZ,kBAAkB;EAClB,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,yBAAyB;AAC3B;AACA;EACE,iBAAiB;EACjB,yBAAyB;EACzB,WAAW;AACb;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,sBAAsB;AACxB;AACA;EACE,wCAAwC;AAC1C;AACA;EACE,aAAa;AACf;AACA;EACE,kBAAkB;EAClB,YAAY;EACZ,UAAU;EACV,0BAA0B;EAC1B,eAAe;AACjB;AACA;EACE,kBAAkB;EAClB,WAAW;EACX,SAAS;EACT,aAAa;EACb,uBAAuB;EACvB,YAAY;EACZ,eAAe;EACf,0BAA0B;EAC1B,mBAAmB;EACnB,eAAe;EACf,UAAU;EACV,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B\",\"sourcesContent\":[\".webix_hint_view.webix_hint_animated .webix_hint_overlay_hole_el {\\n fill: #000;\\n -webkit-transition: fill 0.4s ease-in;\\n -o-transition: fill 0.4s ease-in;\\n transition: fill 0.4s ease-in;\\n}\\n.webix_hint_view.webix_hint_animated .webix_hint {\\n opacity: 1;\\n -webkit-transition: opacity 0.4s ease-in;\\n -o-transition: opacity 0.4s ease-in;\\n transition: opacity 0.4s ease-in;\\n}\\n.webix_hint_overlay {\\n position: fixed;\\n width: 100%;\\n height: 100%;\\n top: 0;\\n left: 0;\\n z-index: 1010;\\n pointer-events: none;\\n overflow: hidden;\\n opacity: 0.6;\\n}\\n.webix_hint_view svg {\\n position: absolute;\\n height: 100%;\\n width: 100%;\\n left: 0;\\n top: 0;\\n}\\n.webix_hint_overflow {\\n pointer-events: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n position: relative;\\n height: 100%;\\n width: 100%;\\n min-width: 100%;\\n}\\n.webix_hint_overflow .webix_window,\\n.webix_hint_overflow .webix_popup {\\n pointer-events: all;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n.webix_hint {\\n position: fixed;\\n pointer-events: all;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n display: block;\\n z-index: 1012;\\n width: 310px;\\n border-radius: 2px;\\n background-color: #FFFFFF;\\n padding: 22px 50px 80px 22px;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n -webkit-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.1);\\n box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.1);\\n opacity: 0;\\n}\\n.webix_hint .webix_hint_label {\\n color: rgba(0, 0, 0, 0.54);\\n font-size: 16px;\\n line-height: 24px;\\n margin: -5px 0;\\n}\\n.webix_hint .webix_hint_title {\\n color: rgba(0, 0, 0, 0.87);\\n font-size: 20px;\\n font-weight: 500;\\n line-height: 1;\\n margin-bottom: 15px;\\n}\\n.webix_hint_buttons {\\n position: absolute;\\n bottom: 11px;\\n right: 22px;\\n}\\n.webix_hint_buttons .webix_hint_button {\\n display: inline-block;\\n pointer-events: all;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n cursor: pointer;\\n margin: 0 auto;\\n height: 32px;\\n padding: 0px 16px;\\n border: none;\\n border-radius: 2px;\\n font-size: 14px;\\n font-weight: 500;\\n line-height: 16px;\\n text-transform: uppercase;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_next {\\n margin-left: 17px;\\n background-color: #00BFC7;\\n color: #fff;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_next:hover {\\n background-color: #27D6DD;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_prev {\\n color: #0097A7;\\n background-color: #fff;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_prev:hover {\\n background-color: rgba(0, 191, 199, 0.1);\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_prev.webix_hint_button_hidden {\\n display: none;\\n}\\n.webix_hint_progress {\\n position: absolute;\\n bottom: 17px;\\n left: 22px;\\n color: rgba(0, 0, 0, 0.54);\\n font-size: 14px;\\n}\\n.webix_hint_button_close {\\n position: absolute;\\n right: 22px;\\n top: 20px;\\n z-index: 1012;\\n background: transparent;\\n border: none;\\n font-size: 22px;\\n color: rgba(0, 0, 0, 0.54);\\n pointer-events: all;\\n cursor: pointer;\\n padding: 0;\\n line-height: 1;\\n}\\n.webix_hint_button_close:hover {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".wbq-query_list .wbq-field-value,.wbq-query_bar .wbq-field-value{color:#1ca1c1}.wbq-query_list .wbq-field-name,.wbq-query_bar .wbq-field-name{font-weight:500}.wbq-query_list .action-close,.wbq-query_list .action-menu{cursor:pointer;margin-top:10px;right:4px;position:absolute}.wbq-query_bar .action-close,.wbq-query_bar .action-menu{cursor:pointer;margin:8px -10px 0 8px}.wbq-query_list .webix_scroll_cont>.webix_tree_leaves{padding:8px 0}.wbq-query_list .webix_tree_item{height:auto;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_list .webix_tree_item.active-editor{line-height:32px;padding:0;margin-left:4px;margin-right:4px;background-color:#fff}.wbq-query_list .webix_tree_item+.webix_tree_leaves{padding-top:10px;border-left:1px solid #ccd7e6;margin-left:20px;padding-left:16px}.wbq-query_list .webix_tree_item.group{margin:0}.wbq-filter_join{position:absolute;z-index:2;top:-24px;height:20px;line-height:20px;left:0;width:40px;border-radius:20px;text-align:center;display:block;cursor:pointer}.wbq-filter_join_and{color:#fff;background:#fdbf4c}.wbq-filter_join_or{color:#fff;background:#55cd97}.wbq-query_list .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-query_bar .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-field-box{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:250px}.wbq-query_bar .webix_scroll_cont>.webix_tree_leaves{padding:0;white-space:nowrap;padding:4px 0 4px 0}.wbq-query_bar .webix_tree_leaves,.wbq-query_bar .webix_tree_leaves div{display:inline-block}.wbq-query_bar .webix_tree_item{height:32px;line-height:32px;margin:0 52px 0 0;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:after{color:#a78fd5}.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:after{color:#68ccd2}.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:after{color:#999}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\"(\\\";margin:0 2px 0 -4px;display:inline-block;transform:scaleX(0.75);font-size:30px;line-height:0;position:relative}.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\")\\\";margin:0 -4px 0 2px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{border-radius:2px;margin-left:0;margin-right:52px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves .webix_tree_item{background:#fff;margin-top:0;line-height:32px}.wbq-query_bar .webix_tree_leaves>div:last-child>div{margin-right:0}.wbq-query_bar .webix_tree_leaves>.webix_tree_branch_1>.webix_tree_leaves{padding:4px;margin-top:-4px;margin-bottom:-4px}.wbq-query_bar .wbq-filter_join{top:6px;left:-44px;width:36px}.wbq-query_bar .group{padding:0;height:20px;margin-right:0;background:transparent}.webix_toolbar .wbq-query_bar{background-color:transparent}.wbq-query_list.webix_tree .webix_scroll_cont>.webix_tree_leaves{display:block}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{display:inline-block}.wbq-filter_join_disabled{cursor:default;pointer-events:none}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{background:#f4f5f9}.wbq-query_list .webix_tree_item{line-height:36px;margin-bottom:32px}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{top:4px}.wbq-field-box{margin-bottom:-13px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/components/query/query.min.css\"],\"names\":[],\"mappings\":\"AAAA,iEAAiE,aAAa,CAAC,+DAA+D,eAAe,CAAC,2DAA2D,cAAc,CAAC,eAAe,CAAC,SAAS,CAAC,iBAAiB,CAAC,yDAAyD,cAAc,CAAC,sBAAsB,CAAC,sDAAsD,aAAa,CAAC,iCAAiC,WAAW,CAAC,cAAc,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,+CAA+C,gBAAgB,CAAC,SAAS,CAAC,eAAe,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,oDAAoD,gBAAgB,CAAC,6BAA6B,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,uCAAuC,QAAQ,CAAC,iBAAiB,iBAAiB,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,aAAa,CAAC,cAAc,CAAC,qBAAqB,UAAU,CAAC,kBAAkB,CAAC,oBAAoB,UAAU,CAAC,kBAAkB,CAAC,oFAAoF,YAAY,CAAC,mFAAmF,YAAY,CAAC,eAAe,oBAAoB,CAAC,eAAe,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,eAAe,CAAC,qDAAqD,SAAS,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,wEAAwE,oBAAoB,CAAC,gCAAgC,WAAW,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,cAAc,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,2HAA2H,aAAa,CAAC,2HAA2H,aAAa,CAAC,2HAA2H,UAAU,CAAC,+FAA+F,WAAW,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,+CAA+C,WAAW,CAAC,mBAAmB,CAAC,qDAAqD,iBAAiB,CAAC,aAAa,CAAC,iBAAiB,CAAC,sEAAsE,eAAe,CAAC,YAAY,CAAC,gBAAgB,CAAC,qDAAqD,cAAc,CAAC,0EAA0E,WAAW,CAAC,eAAe,CAAC,kBAAkB,CAAC,gCAAgC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,sBAAsB,SAAS,CAAC,WAAW,CAAC,cAAc,CAAC,sBAAsB,CAAC,8BAA8B,4BAA4B,CAAC,iEAAiE,aAAa,CAAC,qDAAqD,oBAAoB,CAAC,0BAA0B,cAAc,CAAC,mBAAmB,CAAC,qDAAqD,kBAAkB,CAAC,iCAAiC,gBAAgB,CAAC,kBAAkB,CAAC,+FAA+F,OAAO,CAAC,eAAe,mBAAmB\",\"sourcesContent\":[\".wbq-query_list .wbq-field-value,.wbq-query_bar .wbq-field-value{color:#1ca1c1}.wbq-query_list .wbq-field-name,.wbq-query_bar .wbq-field-name{font-weight:500}.wbq-query_list .action-close,.wbq-query_list .action-menu{cursor:pointer;margin-top:10px;right:4px;position:absolute}.wbq-query_bar .action-close,.wbq-query_bar .action-menu{cursor:pointer;margin:8px -10px 0 8px}.wbq-query_list .webix_scroll_cont>.webix_tree_leaves{padding:8px 0}.wbq-query_list .webix_tree_item{height:auto;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_list .webix_tree_item.active-editor{line-height:32px;padding:0;margin-left:4px;margin-right:4px;background-color:#fff}.wbq-query_list .webix_tree_item+.webix_tree_leaves{padding-top:10px;border-left:1px solid #ccd7e6;margin-left:20px;padding-left:16px}.wbq-query_list .webix_tree_item.group{margin:0}.wbq-filter_join{position:absolute;z-index:2;top:-24px;height:20px;line-height:20px;left:0;width:40px;border-radius:20px;text-align:center;display:block;cursor:pointer}.wbq-filter_join_and{color:#fff;background:#fdbf4c}.wbq-filter_join_or{color:#fff;background:#55cd97}.wbq-query_list .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-query_bar .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-field-box{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:250px}.wbq-query_bar .webix_scroll_cont>.webix_tree_leaves{padding:0;white-space:nowrap;padding:4px 0 4px 0}.wbq-query_bar .webix_tree_leaves,.wbq-query_bar .webix_tree_leaves div{display:inline-block}.wbq-query_bar .webix_tree_item{height:32px;line-height:32px;margin:0 52px 0 0;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:after{color:#a78fd5}.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:after{color:#68ccd2}.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:after{color:#999}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\"(\\\";margin:0 2px 0 -4px;display:inline-block;transform:scaleX(0.75);font-size:30px;line-height:0;position:relative}.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\")\\\";margin:0 -4px 0 2px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{border-radius:2px;margin-left:0;margin-right:52px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves .webix_tree_item{background:#fff;margin-top:0;line-height:32px}.wbq-query_bar .webix_tree_leaves>div:last-child>div{margin-right:0}.wbq-query_bar .webix_tree_leaves>.webix_tree_branch_1>.webix_tree_leaves{padding:4px;margin-top:-4px;margin-bottom:-4px}.wbq-query_bar .wbq-filter_join{top:6px;left:-44px;width:36px}.wbq-query_bar .group{padding:0;height:20px;margin-right:0;background:transparent}.webix_toolbar .wbq-query_bar{background-color:transparent}.wbq-query_list.webix_tree .webix_scroll_cont>.webix_tree_leaves{display:block}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{display:inline-block}.wbq-filter_join_disabled{cursor:default;pointer-events:none}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{background:#f4f5f9}.wbq-query_list .webix_tree_item{line-height:36px;margin-bottom:32px}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{top:4px}.wbq-field-box{margin-bottom:-13px}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@font-face{font-family:Webix Querybuilder Icons;font-style:normal;font-weight:400;src:url(fonts/querybuilder-webfont.woff2) format(\\\"woff2\\\"),url(fonts/querybuilder-webfont.woff) format(\\\"woff\\\"),url(fonts/querybuilder-webfont.ttf) format(\\\"truetype\\\"),url(fonts/querybuilder-webfont.svg) format(\\\"svg\\\")}.webix_qb_filter_icon{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:inherit;cursor:pointer;display:inline-block;font:400 400 400 24px/1 \\\"Webix Querybuilder Icons\\\";font-size:18px;line-height:inherit;text-rendering:auto}.webix_qb_filter_icon:hover{color:#1992af}.webix_qb_filter_icon:before{content:\\\"\\\\F001\\\"}.webix_qb_filter{text-align:center}.webix_qb_wrap{background-color:#ebedf0;position:relative}.webix_qb_wrap .webix_view{background-color:transparent}.webix_qb_wrap .webix_template{padding:0}.webix_qb_wrap .webix_el_combo span.webix_input_icon,.webix_qb_wrap .webix_el_datepicker span.webix_input_icon,.webix_qb_wrap .webix_el_richselect .webix_inp_static,.webix_qb_wrap .webix_el_richselect span.webix_input_icon,.webix_qb_wrap .webix_el_select select{border-radius:0}.webix_qb_wrap .webix_qb_wrap{border-left:1px solid #ccd7e6!important}.webix_qb_add{white-space:nowrap}.webix_qb_add_group,.webix_qb_add_rule{background:transparent;border:0;box-shadow:none;color:#1ca1c1;font-size:14px;line-height:1pc;margin:0 10px 0 0;outline:0;text-transform:uppercase}.webix_qb_add_group:active,.webix_qb_add_group:focus,.webix_qb_add_group:hover,.webix_qb_add_rule:active,.webix_qb_add_rule:focus,.webix_qb_add_rule:hover{color:#1992af}.webix_qb_line .webix_qb_close{cursor:pointer;right:25px;top:0}.webix_qb_line .webix_qb_close button{background-color:transparent;border:0;color:#94a1b3;padding:2px 1px;width:20px}.webix_qb_line .webix_qb_close button:active,.webix_qb_line .webix_qb_close button:focus,.webix_qb_line .webix_qb_close button:hover{box-shadow:none;color:#ff5c4c;outline:0}.webix_qb_buttons{background-color:#606060;border-radius:2px;height:26px;margin-top:2px;padding:3px 0;text-align:center;width:87px}.webix_qb_buttons button{background-color:#606060;border:0;border-radius:0;color:#ccc;cursor:pointer;font-size:14px;height:26px;padding:0;text-transform:capitalize;width:38px}.webix_qb_and{margin-right:3px}.webix_qb_and.webix_active,.webix_qb_or.webix_active{background-color:#1ca1c1;color:#fff}.webix_qb_line{position:relative}.webix_qb_line .webix_control,.webix_qb_line .webix_inp_static,.webix_qb_line input{border-radius:0}.webix_qb_line .webix_el_slider.webix_invalid .webix_el_box{background-color:rgba(254,165,168,.2392)}.webix_qb_line .webix_qb_rule_input,.webix_qb_line .webix_qb_rule_select,.webix_qb_line .webix_qb_value_select{display:inline-block;font-size:14px}.webix_qb_line .webix_qb_rule_input .webix_input_icon,.webix_qb_line .webix_qb_rule_select .webix_input_icon,.webix_qb_line .webix_qb_value_select .webix_input_icon{display:none}.webix_column_qb .webix_qb_rule_input,.webix_column_qb .webix_qb_rule_select,.webix_column_qb .webix_qb_value_select{display:block}.webix_qb_sorting{position:absolute;right:7px;top:9px;width:390px;z-index:2}.webix_qb_sorting .webix_control{display:inline-block;margin-right:10px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/components/querybuilder/querybuilder.min.css\"],\"names\":[],\"mappings\":\"AAAA,WAAW,oCAAoC,CAAC,iBAAiB,CAAC,eAAe,CAAC,sNAAsN,CAAC,sBAAsB,iCAAiC,CAAC,kCAAkC,CAAC,aAAa,CAAC,cAAc,CAAC,oBAAoB,CAAC,kDAAkD,CAAC,cAAc,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,4BAA4B,aAAa,CAAC,6BAA6B,eAAe,CAAC,iBAAiB,iBAAiB,CAAC,eAAe,wBAAwB,CAAC,iBAAiB,CAAC,2BAA2B,4BAA4B,CAAC,+BAA+B,SAAS,CAAC,sQAAsQ,eAAe,CAAC,8BAA8B,uCAAuC,CAAC,cAAc,kBAAkB,CAAC,uCAAuC,sBAAsB,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,CAAC,cAAc,CAAC,eAAe,CAAC,iBAAiB,CAAC,SAAS,CAAC,wBAAwB,CAAC,2JAA2J,aAAa,CAAC,+BAA+B,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,sCAAsC,4BAA4B,CAAC,QAAQ,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC,qIAAqI,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,kBAAkB,wBAAwB,CAAC,iBAAiB,CAAC,WAAW,CAAC,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,UAAU,CAAC,yBAAyB,wBAAwB,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,yBAAyB,CAAC,UAAU,CAAC,cAAc,gBAAgB,CAAC,qDAAqD,wBAAwB,CAAC,UAAU,CAAC,eAAe,iBAAiB,CAAC,oFAAoF,eAAe,CAAC,4DAA4D,wCAAwC,CAAC,+GAA+G,oBAAoB,CAAC,cAAc,CAAC,qKAAqK,YAAY,CAAC,qHAAqH,aAAa,CAAC,kBAAkB,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,iCAAiC,oBAAoB,CAAC,iBAAiB\",\"sourcesContent\":[\"@font-face{font-family:Webix Querybuilder Icons;font-style:normal;font-weight:400;src:url(fonts/querybuilder-webfont.woff2) format(\\\"woff2\\\"),url(fonts/querybuilder-webfont.woff) format(\\\"woff\\\"),url(fonts/querybuilder-webfont.ttf) format(\\\"truetype\\\"),url(fonts/querybuilder-webfont.svg) format(\\\"svg\\\")}.webix_qb_filter_icon{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:inherit;cursor:pointer;display:inline-block;font:400 400 400 24px/1 \\\"Webix Querybuilder Icons\\\";font-size:18px;line-height:inherit;text-rendering:auto}.webix_qb_filter_icon:hover{color:#1992af}.webix_qb_filter_icon:before{content:\\\"\\\\F001\\\"}.webix_qb_filter{text-align:center}.webix_qb_wrap{background-color:#ebedf0;position:relative}.webix_qb_wrap .webix_view{background-color:transparent}.webix_qb_wrap .webix_template{padding:0}.webix_qb_wrap .webix_el_combo span.webix_input_icon,.webix_qb_wrap .webix_el_datepicker span.webix_input_icon,.webix_qb_wrap .webix_el_richselect .webix_inp_static,.webix_qb_wrap .webix_el_richselect span.webix_input_icon,.webix_qb_wrap .webix_el_select select{border-radius:0}.webix_qb_wrap .webix_qb_wrap{border-left:1px solid #ccd7e6!important}.webix_qb_add{white-space:nowrap}.webix_qb_add_group,.webix_qb_add_rule{background:transparent;border:0;box-shadow:none;color:#1ca1c1;font-size:14px;line-height:1pc;margin:0 10px 0 0;outline:0;text-transform:uppercase}.webix_qb_add_group:active,.webix_qb_add_group:focus,.webix_qb_add_group:hover,.webix_qb_add_rule:active,.webix_qb_add_rule:focus,.webix_qb_add_rule:hover{color:#1992af}.webix_qb_line .webix_qb_close{cursor:pointer;right:25px;top:0}.webix_qb_line .webix_qb_close button{background-color:transparent;border:0;color:#94a1b3;padding:2px 1px;width:20px}.webix_qb_line .webix_qb_close button:active,.webix_qb_line .webix_qb_close button:focus,.webix_qb_line .webix_qb_close button:hover{box-shadow:none;color:#ff5c4c;outline:0}.webix_qb_buttons{background-color:#606060;border-radius:2px;height:26px;margin-top:2px;padding:3px 0;text-align:center;width:87px}.webix_qb_buttons button{background-color:#606060;border:0;border-radius:0;color:#ccc;cursor:pointer;font-size:14px;height:26px;padding:0;text-transform:capitalize;width:38px}.webix_qb_and{margin-right:3px}.webix_qb_and.webix_active,.webix_qb_or.webix_active{background-color:#1ca1c1;color:#fff}.webix_qb_line{position:relative}.webix_qb_line .webix_control,.webix_qb_line .webix_inp_static,.webix_qb_line input{border-radius:0}.webix_qb_line .webix_el_slider.webix_invalid .webix_el_box{background-color:rgba(254,165,168,.2392)}.webix_qb_line .webix_qb_rule_input,.webix_qb_line .webix_qb_rule_select,.webix_qb_line .webix_qb_value_select{display:inline-block;font-size:14px}.webix_qb_line .webix_qb_rule_input .webix_input_icon,.webix_qb_line .webix_qb_rule_select .webix_input_icon,.webix_qb_line .webix_qb_value_select .webix_input_icon{display:none}.webix_column_qb .webix_qb_rule_input,.webix_column_qb .webix_qb_rule_select,.webix_column_qb .webix_qb_value_select{display:block}.webix_qb_sorting{position:absolute;right:7px;top:9px;width:390px;z-index:2}.webix_qb_sorting .webix_control{display:inline-block;margin-right:10px}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@charset \\\"UTF-8\\\";.wbq-query_list .wbq-field-value,.wbq-query_bar .wbq-field-value{color:#1ca1c1}.wbq-query_list .wbq-field-name,.wbq-query_bar .wbq-field-name{font-weight:500}.wbq-query_list .action-close,.wbq-query_list .action-menu{cursor:pointer;margin-top:10px;right:4px;position:absolute}.wbq-query_bar .action-close,.wbq-query_bar .action-menu{cursor:pointer;margin:8px -10px 0 8px}.wbq-query_list .webix_scroll_cont>.webix_tree_leaves{padding:8px 0}.wbq-query_list .webix_tree_item{height:auto;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_list .webix_tree_item.active-editor{line-height:32px;padding:0;margin-left:4px;margin-right:4px;background-color:#fff}.wbq-query_list .webix_tree_item+.webix_tree_leaves{padding-top:10px;border-left:1px solid #ccd7e6;margin-left:20px;padding-left:16px}.wbq-query_list .webix_tree_item.group{margin:0}.wbq-filter_join{position:absolute;z-index:2;top:-24px;height:20px;line-height:20px;left:0;width:40px;border-radius:20px;text-align:center;display:block;cursor:pointer}.wbq-filter_join_and{color:#fff;background:#fdbf4c}.wbq-filter_join_or{color:#fff;background:#55cd97}.wbq-query_list .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-query_bar .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-field-box{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:250px}.wbq-query_bar .webix_scroll_cont>.webix_tree_leaves{padding:0;white-space:nowrap;padding:4px 0 4px 0}.wbq-query_bar .webix_tree_leaves,.wbq-query_bar .webix_tree_leaves div{display:inline-block}.wbq-query_bar .webix_tree_item{height:32px;line-height:32px;margin:0 52px 0 0;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:after{color:#a78fd5}.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:after{color:#68ccd2}.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:after{color:#999}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\"(\\\";margin:0 2px 0 -4px;display:inline-block;transform:scaleX(0.75);font-size:30px;line-height:0;position:relative}.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\")\\\";margin:0 -4px 0 2px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{border-radius:2px;margin-left:0;margin-right:52px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves .webix_tree_item{background:#fff;margin-top:0;line-height:32px}.wbq-query_bar .webix_tree_leaves>div:last-child>div{margin-right:0}.wbq-query_bar .webix_tree_leaves>.webix_tree_branch_1>.webix_tree_leaves{padding:4px;margin-top:-4px;margin-bottom:-4px}.wbq-query_bar .wbq-filter_join{top:6px;left:-44px;width:36px}.wbq-query_bar .group{padding:0;height:20px;margin-right:0;background:transparent}.webix_toolbar .wbq-query_bar{background-color:transparent}.wbq-query_list.webix_tree .webix_scroll_cont>.webix_tree_leaves{display:block}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{display:inline-block}.wbq-filter_join_disabled{cursor:default;pointer-events:none}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{background:#f4f5f9}.wbq-query_list .webix_tree_item{line-height:36px;margin-bottom:32px}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{top:4px}.wbq-field-box{margin-bottom:-13px}.webix_el_label.webix_rpt_not_saved .webix_el_box{color:#ff5c4c}.webix_reports .webix_pressed .webix_button{box-shadow:none}.webix_rpt_found_record{background:#f9eab3}.webix_rpt_list .webix_scroll_cont:empty:before{content:attr(placeholder);color:#8693a5;text-align:center;display:inline-block;width:100%;line-height:60px}.webix_rpt_empty{position:relative;background:transparent}.webix_rpt_empty .webix_template{display:flex;justify-content:center;flex-flow:row wrap}.webix_rpt_empty_placeholder{color:#8693a5;font-size:16px;font-weight:500;position:absolute;top:15%}.webix_rpt_empty svg{width:80%;height:80%;display:block;margin:auto;max-width:390px}.webix_rpt_query .webix_el_toggle button,.webix_rpt_query .webix_el_toggle .webix_pressed button{box-shadow:none}.webix_rpt_query .webix_el_toggle{text-align:center}.webix_rpt_query .webix_el_toggle button{width:300px}.webix_rpt_query .webix_el_toggle .wxi-checkbox-blank{color:#94a1b3}.webix_rpt_query .webix_tree .webix_scroll_cont>.webix_tree_leaves{display:block}@font-face{font-family:\\\"report-webfont\\\";src:url(\\\"fonts/report-webfont.woff2?1597778382139\\\") format(\\\"woff2\\\"),url(\\\"fonts/report-webfont.woff?1597778382139\\\") format(\\\"woff\\\");font-weight:normal;font-style:normal}[class^=rpi-]:before,[class*=rpi-]:before{font-family:\\\"report-webfont\\\";display:inline-block;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.rpi-plus:before{content:\\\"\\\"}.rpi-delete:before{content:\\\"\\\"}.rpi-content-copy:before{content:\\\"\\\"}.rpi-export:before{content:\\\"\\\"}.rpi-sort-alphabetical-descending:before{content:\\\"\\\"}.rpi-sort-alphabetical-ascending:before{content:\\\"\\\"}.rpi-sort-calendar-descending:before{content:\\\"\\\"}.rpi-sort-calendar-ascending:before{content:\\\"\\\"}.rpi-pencil:before{content:\\\"\\\"}.rpi-square-edit-outline:before{content:\\\"\\\"}.rpi-menu:before{content:\\\"\\\"}.rpi-menu-open:before{content:\\\"\\\"}.rpi-dots-vertical:before{content:\\\"\\\"}.rpi-magnify:before{content:\\\"\\\"}.rpi-close:before{content:\\\"\\\"}.rpi-drag-vertical:before{content:\\\"\\\"}.rpi-eye:before{content:\\\"\\\"}.rpi-eye-off-outline:before{content:\\\"\\\"}.rpi-arrow-horizontal-lock:before{content:\\\"\\\"}.rpi-cog:before{content:\\\"\\\"}.rpi-arrow-up:before{content:\\\"\\\"}.rpi-arrow-down:before{content:\\\"\\\"}.rpi-table:before{content:\\\"\\\"}.rpi-poll:before{content:\\\"\\\"}.rpi-chart-tree:before{content:\\\"\\\"}.rpi-chart-line:before{content:\\\"\\\"}.rpi-chart-bell-curve-cumulative:before{content:\\\"\\\"}.rpi-chart-areaspline:before{content:\\\"\\\"}.rpi-chart-line-stacked:before{content:\\\"\\\"}.rpi-chart-areaspline-variant:before{content:\\\"\\\"}.rpi-chart-bar-stacked:before{content:\\\"\\\"}.rpi-vector-triangle:before{content:\\\"\\\"}.rpi-chart-bar:before{content:\\\"\\\"}.rpi-circle-outline:before{content:\\\"\\\"}.rpi-square-outline:before{content:\\\"\\\"}.rpi-triangle-outline:before{content:\\\"\\\"}.rpi-rhombus-outline:before{content:\\\"\\\"}.rpi-trash-can-outline:before{content:\\\"\\\"}.rpi-pail-outline:before{content:\\\"\\\"}.wbx-mark_frozen{text-align:center;cursor:ns-resize}.wbx-mark_frozen .webix_rpt_config_row_name{width:100%;font-size:13px}.wbx-mark_frozen .webix_rpt_config_row_name .webix_icon{vertical-align:middle}.wbx-mark_frozen.webix_dd_drag div{border-color:transparent;background:inherit}.webix_rpt_config_row,.webix_rpt_item_suggest{display:flex;justify-content:space-between;align-items:center}.webix_rpt_config_row .webix_icon,.webix_rpt_item_suggest .webix_icon{line-height:inherit}.webix_rpt_config_row_name{width:310px}.webix_rpt_chart_config .webix_rpt_config_row_name{padding-left:10px}.webix_rpt_columns_list .rpi-drag-vertical{color:#94a1b3;cursor:ns-resize}.webix_rpt_columns_list .webix_cell:not(.webix_dtable_subview):hover{background:#f4f5f9}.webix_rpt_columns_list .webix_cell:not(.webix_dtable_subview):hover .rpi-drag-vertical{color:#475466}.webix_rpt_columns_list .webix_dtable_subview .webix_view{border-left-width:0}.webix_rpt_columns_list .webix_dtable_subview{background-color:transparent}.webix_rpt_columns_list .webix_dtable_subview .webix_inp_label{font-weight:normal}.webix_rpt_drag{cursor:ns-resize}.webix_drag_zone .webix_rpt_config_row .rpi-drag-vertical,.webix_drag_zone .webix_rpt_config_row .webix_tree_close{visibility:hidden}.webix_rpt_delete .webix_button{color:#ff5c4c}.webix_rpt_title{color:#313131;font-weight:500}.webix_rpt_subtitle .webix_inp_label,.webix_rpt_subtitle .webix_el_box{color:#475466;font-weight:normal}.webix_rpt_date_selector{color:#1ca1c1;display:inline-block;line-height:1}.webix_rpt_date_selector .webix_rpt_sort_selector .webix_rpt_date_selector .webix_icon{cursor:pointer}.webix_rpt_grouppopup .webix_icon{padding-top:6px;float:right}.webix_rpt_grouppopup .wxi-radiobox-marked{color:#1ca1c1}.webix_rpt_grouppopup .wxi-radiobox-blank{color:#94a1b3}.webix_rpt_groupselect_delete,.webix_rpt_multicombo .webix_multicombo_delete{font-size:16px;width:20px;line-height:20px}.webix_rpt_groupselect_delete:after,.webix_rpt_multicombo .webix_multicombo_delete:after{content:\\\"\\\"}.webix_rpt_summary_form{border-color:transparent}.webix_rpt_chart_color{width:24px;height:24px;border-radius:2px;margin-left:10px}.webix_rpt_config_row_hover{background:#f4f5f9}.webix_rpt_colorpicker .webix_input_icon{position:absolute;right:32px}.webix_rpt_colorpicker .webix_input_icon:before{font-size:20px;content:\\\"\\\";left:30px;position:absolute;color:#94a1b3;top:2px}.webix_rpt_markerselect .webix_icon{font-size:18px;margin-right:2px}.webix_rpt_markerselect_list .webix_icon{font-size:18px;margin-right:17px}.webix_rpt_action_remove{color:#94a1b3;margin-top:6px}.webix_rpt_description .webix_template{padding-left:2px;font-size:13px}.webix_rpt_qselect_icon{padding-top:7px;float:right;color:#94a1b3}.webix_rpt_qselect_suggest .webix_scroll_cont:empty:before{content:attr(placeholder);font-size:13px;font-style:italic;color:#8693a5;text-align:center;display:inline-block;width:100%;line-height:25px}.webix_rpt_groupselect .webix_multicombo_value{display:flex;align-items:center;padding-right:6px}.webix_rpt_groupselect .webix_multicombo_value .webix_rpt_groupselect_delete{margin-top:0;position:static;line-height:1;margin-left:5px;height:auto}.webix_rpt_groupselect .webix_multicombo_value>span{vertical-align:middle}.webix_rpt_groupselect_sep{padding:0 6px 0 3px}.webix_rpt_bcols .webix_dtable_subview{padding-left:0}.webix_rpt_bucket_values .webix_list_item{display:flex;align-items:center}.webix_rpt_bucket_values .webix_list_item .webix_rpt_bucket_value{width:170px}.webix_rpt_multicombo .webix_multicombo_text{display:flex;align-items:center}.webix_rpt_bucket_value{max-width:170px;text-overflow:ellipsis;display:inline-block;overflow:hidden}.webix_multicombo_value .webix_rpt_bucket_icon{display:none}.webix_rpt_bucket_icon{width:25px;text-align:right;color:#94a1b3}.webix_rpt_bucket_sublabel{font-size:13px;color:#8693a5}.webix_rpt_bucket_sublabel.webix_icon{font-size:15px}.webix_rpt_buckets_num{margin-right:15px}.webix_rpt_subview .webix_invalid .webix_el_box input,.webix_rpt_subview .webix_invalid .webix_el_box .webix_inp_static{background:#fff;color:#475466}.webix_rpt_bucket_delete{width:40px;color:#94a1b3}.webix_rpt_bucket_delete:hover{color:#475466}.webix_rpt_bucket_value_selected{color:#8693a5}.webix_el_search .webix_badge{cursor:default;padding-left:4px}.webix_rpt .webix_treemap_item.l0{background-color:#42a5f5}.webix_rpt .webix_treemap_item.l1{background-color:#64b5f6}.webix_rpt .webix_treemap_item.l2{background-color:#90caf9}.webix_rpt .webix_treemap_item.l3{background-color:#bbdefb}.webix_rpt_list_btn .webix_cell{padding:0}.webix_rpt_list_btn .webix_icon{line-height:38px;border-radius:50%;width:38px;height:38px;color:#8693a5}.webix_rpt_list_btn .webix_icon:hover{background:rgba(0,0,0,0.07);color:#475466}.webix_rpt_list .webix_selected .webix_rpt_list_report_date,.webix_rpt_list .webix_selected .webix_icon,.webix_rpt_list .webix_selected:focus .webix_rpt_list_report_date,.webix_rpt_list .webix_selected:focus .webix_icon{color:#8693a5}.webix_rpt_list .webix_selected .webix_icon:hover,.webix_rpt_list .webix_selected:focus .webix_icon:hover{color:#475466}.webix_rpt_list_block{position:relative;padding-top:6px}.webix_rpt_list_report_date,.webix_rpt_list_report_name{width:260px;line-height:22px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.webix_rpt_list_report_date{color:#8693a5;font-size:13px;line-height:20px;height:20px;overflow:hidden}.webix_rpt_action_menu{position:absolute;right:0;top:50%;color:#94a1b3;margin-top:-8px}.webix_rpt_action_menu:hover{color:#475466}.webix_rpt_btn_active.webix_rpt_sort_icon .webix_icon,.webix_rpt_btn_active.webix_rpt_sort_icon button:hover .webix_icon{color:#1ca1c1}.webix_rpt_sort_icon .webix_icon{color:#94a1b3}.webix_rpt_sources_path{float:right;color:#888;font-size:12px}.webix_multicombo_value .webix_rpt_sources_path{display:none}.wbq-field-name .webix_rpt_sources_path{position:absolute;right:30px}.webix_rpt_popup_menu .webix_list_item{padding-left:7px}.webix_rpt_popup_menu .webix_icon{color:#94a1b3;float:left;font-size:19px;margin-top:6px;margin-right:5px}.webix_rpt_popup_menu .webix_disabled .webix_icon{color:#bfccdf}.webix_rpt_popup_menu .webix_list_item:active,.webix_rpt_popup_menu .webix_list_item:focus{background:transparent}.webix_rpt_vertical_chart_labels .webix_axis_item_x{transform:rotate(-45deg);text-align:right;transform-origin:75% 320%}.webix_rpt_vertical_chart_labels .webix_rpt_chart_label{width:80px}.webix_rpt_chart_label{max-width:80px}.webix_rpt_vertical_chart_labels .webix_rpt_chart_label0{left:40px !important}.webix_el_search .webix_badge{top:9px;right:29px}.webix_rpt_cls1{fill:#9dbabf;fill-opacity:.25}.webix_rpt_cls2{fill:#edeff0}.webix_rpt_cls3{fill:#b4dfea}.webix_rpt_cls4{fill:#fafbff}.webix_rpt_cls5{fill:#dedede}.webix_rpt_cls6{fill:#f2f2f2}.webix_rpt_cls7{fill:#fff}.webix_rpt_cls8{fill:#b4dfea}.webix_rpt_cls9{fill:#f4f5f9}\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/components/reports/reports.min.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@charset \\\"UTF-8\\\";.wbq-query_list .wbq-field-value,.wbq-query_bar .wbq-field-value{color:#1ca1c1}.wbq-query_list .wbq-field-name,.wbq-query_bar .wbq-field-name{font-weight:500}.wbq-query_list .action-close,.wbq-query_list .action-menu{cursor:pointer;margin-top:10px;right:4px;position:absolute}.wbq-query_bar .action-close,.wbq-query_bar .action-menu{cursor:pointer;margin:8px -10px 0 8px}.wbq-query_list .webix_scroll_cont>.webix_tree_leaves{padding:8px 0}.wbq-query_list .webix_tree_item{height:auto;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_list .webix_tree_item.active-editor{line-height:32px;padding:0;margin-left:4px;margin-right:4px;background-color:#fff}.wbq-query_list .webix_tree_item+.webix_tree_leaves{padding-top:10px;border-left:1px solid #ccd7e6;margin-left:20px;padding-left:16px}.wbq-query_list .webix_tree_item.group{margin:0}.wbq-filter_join{position:absolute;z-index:2;top:-24px;height:20px;line-height:20px;left:0;width:40px;border-radius:20px;text-align:center;display:block;cursor:pointer}.wbq-filter_join_and{color:#fff;background:#fdbf4c}.wbq-filter_join_or{color:#fff;background:#55cd97}.wbq-query_list .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-query_bar .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-field-box{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:250px}.wbq-query_bar .webix_scroll_cont>.webix_tree_leaves{padding:0;white-space:nowrap;padding:4px 0 4px 0}.wbq-query_bar .webix_tree_leaves,.wbq-query_bar .webix_tree_leaves div{display:inline-block}.wbq-query_bar .webix_tree_item{height:32px;line-height:32px;margin:0 52px 0 0;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:after{color:#a78fd5}.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:after{color:#68ccd2}.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:after{color:#999}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\"(\\\";margin:0 2px 0 -4px;display:inline-block;transform:scaleX(0.75);font-size:30px;line-height:0;position:relative}.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\")\\\";margin:0 -4px 0 2px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{border-radius:2px;margin-left:0;margin-right:52px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves .webix_tree_item{background:#fff;margin-top:0;line-height:32px}.wbq-query_bar .webix_tree_leaves>div:last-child>div{margin-right:0}.wbq-query_bar .webix_tree_leaves>.webix_tree_branch_1>.webix_tree_leaves{padding:4px;margin-top:-4px;margin-bottom:-4px}.wbq-query_bar .wbq-filter_join{top:6px;left:-44px;width:36px}.wbq-query_bar .group{padding:0;height:20px;margin-right:0;background:transparent}.webix_toolbar .wbq-query_bar{background-color:transparent}.wbq-query_list.webix_tree .webix_scroll_cont>.webix_tree_leaves{display:block}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{display:inline-block}.wbq-filter_join_disabled{cursor:default;pointer-events:none}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{background:#f4f5f9}.wbq-query_list .webix_tree_item{line-height:36px;margin-bottom:32px}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{top:4px}.wbq-field-box{margin-bottom:-13px}.webix_el_label.webix_rpt_not_saved .webix_el_box{color:#ff5c4c}.webix_reports .webix_pressed .webix_button{box-shadow:none}.webix_rpt_found_record{background:#f9eab3}.webix_rpt_list .webix_scroll_cont:empty:before{content:attr(placeholder);color:#8693a5;text-align:center;display:inline-block;width:100%;line-height:60px}.webix_rpt_empty{position:relative;background:transparent}.webix_rpt_empty .webix_template{display:flex;justify-content:center;flex-flow:row wrap}.webix_rpt_empty_placeholder{color:#8693a5;font-size:16px;font-weight:500;position:absolute;top:15%}.webix_rpt_empty svg{width:80%;height:80%;display:block;margin:auto;max-width:390px}.webix_rpt_query .webix_el_toggle button,.webix_rpt_query .webix_el_toggle .webix_pressed button{box-shadow:none}.webix_rpt_query .webix_el_toggle{text-align:center}.webix_rpt_query .webix_el_toggle button{width:300px}.webix_rpt_query .webix_el_toggle .wxi-checkbox-blank{color:#94a1b3}.webix_rpt_query .webix_tree .webix_scroll_cont>.webix_tree_leaves{display:block}@font-face{font-family:\\\"report-webfont\\\";src:url(\\\"fonts/report-webfont.woff2?1597778382139\\\") format(\\\"woff2\\\"),url(\\\"fonts/report-webfont.woff?1597778382139\\\") format(\\\"woff\\\");font-weight:normal;font-style:normal}[class^=rpi-]:before,[class*=rpi-]:before{font-family:\\\"report-webfont\\\";display:inline-block;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.rpi-plus:before{content:\\\"\\\"}.rpi-delete:before{content:\\\"\\\"}.rpi-content-copy:before{content:\\\"\\\"}.rpi-export:before{content:\\\"\\\"}.rpi-sort-alphabetical-descending:before{content:\\\"\\\"}.rpi-sort-alphabetical-ascending:before{content:\\\"\\\"}.rpi-sort-calendar-descending:before{content:\\\"\\\"}.rpi-sort-calendar-ascending:before{content:\\\"\\\"}.rpi-pencil:before{content:\\\"\\\"}.rpi-square-edit-outline:before{content:\\\"\\\"}.rpi-menu:before{content:\\\"\\\"}.rpi-menu-open:before{content:\\\"\\\"}.rpi-dots-vertical:before{content:\\\"\\\"}.rpi-magnify:before{content:\\\"\\\"}.rpi-close:before{content:\\\"\\\"}.rpi-drag-vertical:before{content:\\\"\\\"}.rpi-eye:before{content:\\\"\\\"}.rpi-eye-off-outline:before{content:\\\"\\\"}.rpi-arrow-horizontal-lock:before{content:\\\"\\\"}.rpi-cog:before{content:\\\"\\\"}.rpi-arrow-up:before{content:\\\"\\\"}.rpi-arrow-down:before{content:\\\"\\\"}.rpi-table:before{content:\\\"\\\"}.rpi-poll:before{content:\\\"\\\"}.rpi-chart-tree:before{content:\\\"\\\"}.rpi-chart-line:before{content:\\\"\\\"}.rpi-chart-bell-curve-cumulative:before{content:\\\"\\\"}.rpi-chart-areaspline:before{content:\\\"\\\"}.rpi-chart-line-stacked:before{content:\\\"\\\"}.rpi-chart-areaspline-variant:before{content:\\\"\\\"}.rpi-chart-bar-stacked:before{content:\\\"\\\"}.rpi-vector-triangle:before{content:\\\"\\\"}.rpi-chart-bar:before{content:\\\"\\\"}.rpi-circle-outline:before{content:\\\"\\\"}.rpi-square-outline:before{content:\\\"\\\"}.rpi-triangle-outline:before{content:\\\"\\\"}.rpi-rhombus-outline:before{content:\\\"\\\"}.rpi-trash-can-outline:before{content:\\\"\\\"}.rpi-pail-outline:before{content:\\\"\\\"}.wbx-mark_frozen{text-align:center;cursor:ns-resize}.wbx-mark_frozen .webix_rpt_config_row_name{width:100%;font-size:13px}.wbx-mark_frozen .webix_rpt_config_row_name .webix_icon{vertical-align:middle}.wbx-mark_frozen.webix_dd_drag div{border-color:transparent;background:inherit}.webix_rpt_config_row,.webix_rpt_item_suggest{display:flex;justify-content:space-between;align-items:center}.webix_rpt_config_row .webix_icon,.webix_rpt_item_suggest .webix_icon{line-height:inherit}.webix_rpt_config_row_name{width:310px}.webix_rpt_chart_config .webix_rpt_config_row_name{padding-left:10px}.webix_rpt_columns_list .rpi-drag-vertical{color:#94a1b3;cursor:ns-resize}.webix_rpt_columns_list .webix_cell:not(.webix_dtable_subview):hover{background:#f4f5f9}.webix_rpt_columns_list .webix_cell:not(.webix_dtable_subview):hover .rpi-drag-vertical{color:#475466}.webix_rpt_columns_list .webix_dtable_subview .webix_view{border-left-width:0}.webix_rpt_columns_list .webix_dtable_subview{background-color:transparent}.webix_rpt_columns_list .webix_dtable_subview .webix_inp_label{font-weight:normal}.webix_rpt_drag{cursor:ns-resize}.webix_drag_zone .webix_rpt_config_row .rpi-drag-vertical,.webix_drag_zone .webix_rpt_config_row .webix_tree_close{visibility:hidden}.webix_rpt_delete .webix_button{color:#ff5c4c}.webix_rpt_title{color:#313131;font-weight:500}.webix_rpt_subtitle .webix_inp_label,.webix_rpt_subtitle .webix_el_box{color:#475466;font-weight:normal}.webix_rpt_date_selector{color:#1ca1c1;display:inline-block;line-height:1}.webix_rpt_date_selector .webix_rpt_sort_selector .webix_rpt_date_selector .webix_icon{cursor:pointer}.webix_rpt_grouppopup .webix_icon{padding-top:6px;float:right}.webix_rpt_grouppopup .wxi-radiobox-marked{color:#1ca1c1}.webix_rpt_grouppopup .wxi-radiobox-blank{color:#94a1b3}.webix_rpt_groupselect_delete,.webix_rpt_multicombo .webix_multicombo_delete{font-size:16px;width:20px;line-height:20px}.webix_rpt_groupselect_delete:after,.webix_rpt_multicombo .webix_multicombo_delete:after{content:\\\"\\\"}.webix_rpt_summary_form{border-color:transparent}.webix_rpt_chart_color{width:24px;height:24px;border-radius:2px;margin-left:10px}.webix_rpt_config_row_hover{background:#f4f5f9}.webix_rpt_colorpicker .webix_input_icon{position:absolute;right:32px}.webix_rpt_colorpicker .webix_input_icon:before{font-size:20px;content:\\\"\\\";left:30px;position:absolute;color:#94a1b3;top:2px}.webix_rpt_markerselect .webix_icon{font-size:18px;margin-right:2px}.webix_rpt_markerselect_list .webix_icon{font-size:18px;margin-right:17px}.webix_rpt_action_remove{color:#94a1b3;margin-top:6px}.webix_rpt_description .webix_template{padding-left:2px;font-size:13px}.webix_rpt_qselect_icon{padding-top:7px;float:right;color:#94a1b3}.webix_rpt_qselect_suggest .webix_scroll_cont:empty:before{content:attr(placeholder);font-size:13px;font-style:italic;color:#8693a5;text-align:center;display:inline-block;width:100%;line-height:25px}.webix_rpt_groupselect .webix_multicombo_value{display:flex;align-items:center;padding-right:6px}.webix_rpt_groupselect .webix_multicombo_value .webix_rpt_groupselect_delete{margin-top:0;position:static;line-height:1;margin-left:5px;height:auto}.webix_rpt_groupselect .webix_multicombo_value>span{vertical-align:middle}.webix_rpt_groupselect_sep{padding:0 6px 0 3px}.webix_rpt_bcols .webix_dtable_subview{padding-left:0}.webix_rpt_bucket_values .webix_list_item{display:flex;align-items:center}.webix_rpt_bucket_values .webix_list_item .webix_rpt_bucket_value{width:170px}.webix_rpt_multicombo .webix_multicombo_text{display:flex;align-items:center}.webix_rpt_bucket_value{max-width:170px;text-overflow:ellipsis;display:inline-block;overflow:hidden}.webix_multicombo_value .webix_rpt_bucket_icon{display:none}.webix_rpt_bucket_icon{width:25px;text-align:right;color:#94a1b3}.webix_rpt_bucket_sublabel{font-size:13px;color:#8693a5}.webix_rpt_bucket_sublabel.webix_icon{font-size:15px}.webix_rpt_buckets_num{margin-right:15px}.webix_rpt_subview .webix_invalid .webix_el_box input,.webix_rpt_subview .webix_invalid .webix_el_box .webix_inp_static{background:#fff;color:#475466}.webix_rpt_bucket_delete{width:40px;color:#94a1b3}.webix_rpt_bucket_delete:hover{color:#475466}.webix_rpt_bucket_value_selected{color:#8693a5}.webix_el_search .webix_badge{cursor:default;padding-left:4px}.webix_rpt .webix_treemap_item.l0{background-color:#42a5f5}.webix_rpt .webix_treemap_item.l1{background-color:#64b5f6}.webix_rpt .webix_treemap_item.l2{background-color:#90caf9}.webix_rpt .webix_treemap_item.l3{background-color:#bbdefb}.webix_rpt_list_btn .webix_cell{padding:0}.webix_rpt_list_btn .webix_icon{line-height:38px;border-radius:50%;width:38px;height:38px;color:#8693a5}.webix_rpt_list_btn .webix_icon:hover{background:rgba(0,0,0,0.07);color:#475466}.webix_rpt_list .webix_selected .webix_rpt_list_report_date,.webix_rpt_list .webix_selected .webix_icon,.webix_rpt_list .webix_selected:focus .webix_rpt_list_report_date,.webix_rpt_list .webix_selected:focus .webix_icon{color:#8693a5}.webix_rpt_list .webix_selected .webix_icon:hover,.webix_rpt_list .webix_selected:focus .webix_icon:hover{color:#475466}.webix_rpt_list_block{position:relative;padding-top:6px}.webix_rpt_list_report_date,.webix_rpt_list_report_name{width:260px;line-height:22px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.webix_rpt_list_report_date{color:#8693a5;font-size:13px;line-height:20px;height:20px;overflow:hidden}.webix_rpt_action_menu{position:absolute;right:0;top:50%;color:#94a1b3;margin-top:-8px}.webix_rpt_action_menu:hover{color:#475466}.webix_rpt_btn_active.webix_rpt_sort_icon .webix_icon,.webix_rpt_btn_active.webix_rpt_sort_icon button:hover .webix_icon{color:#1ca1c1}.webix_rpt_sort_icon .webix_icon{color:#94a1b3}.webix_rpt_sources_path{float:right;color:#888;font-size:12px}.webix_multicombo_value .webix_rpt_sources_path{display:none}.wbq-field-name .webix_rpt_sources_path{position:absolute;right:30px}.webix_rpt_popup_menu .webix_list_item{padding-left:7px}.webix_rpt_popup_menu .webix_icon{color:#94a1b3;float:left;font-size:19px;margin-top:6px;margin-right:5px}.webix_rpt_popup_menu .webix_disabled .webix_icon{color:#bfccdf}.webix_rpt_popup_menu .webix_list_item:active,.webix_rpt_popup_menu .webix_list_item:focus{background:transparent}.webix_rpt_vertical_chart_labels .webix_axis_item_x{transform:rotate(-45deg);text-align:right;transform-origin:75% 320%}.webix_rpt_vertical_chart_labels .webix_rpt_chart_label{width:80px}.webix_rpt_chart_label{max-width:80px}.webix_rpt_vertical_chart_labels .webix_rpt_chart_label0{left:40px !important}.webix_el_search .webix_badge{top:9px;right:29px}.webix_rpt_cls1{fill:#9dbabf;fill-opacity:.25}.webix_rpt_cls2{fill:#edeff0}.webix_rpt_cls3{fill:#b4dfea}.webix_rpt_cls4{fill:#fafbff}.webix_rpt_cls5{fill:#dedede}.webix_rpt_cls6{fill:#f2f2f2}.webix_rpt_cls7{fill:#fff}.webix_rpt_cls8{fill:#b4dfea}.webix_rpt_cls9{fill:#f4f5f9}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@charset \\\"UTF-8\\\";@font-face{font-family:\\\"scheduler-webfont\\\";src:url(\\\"fonts/scheduler-webfont.woff2\\\") format(\\\"woff2\\\"),url(\\\"fonts/scheduler-webfont.woff\\\") format(\\\"woff\\\");font-weight:normal;font-style:normal}[class^=shi-]:before,[class*=shi-]:before{font-family:\\\"scheduler-webfont\\\";display:inline-block;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.shi-agenda:before{content:\\\"\\\"}.shi-day:before{content:\\\"\\\"}.shi-month:before{content:\\\"\\\"}.shi-week:before{content:\\\"\\\"}.shi-back:before{content:\\\"\\\"}.shi-menu:before{content:\\\"\\\"}.shi-timeline:before{content:\\\"\\\"}.shi-units:before{content:\\\"\\\"}.shi-content-copy:before{content:\\\"\\\"}.shi-year:before{content:\\\"\\\"}.webix_scheduler_info .webix_template{overflow:auto;padding:0 0 0 2px}.webix_scheduler_info .webix_template .webix_scheduler_event_title{color:#313131;font-weight:500;margin-top:7px;margin-bottom:20px}.webix_scheduler_info .webix_template .webix_scheduler_event_from_to,.webix_scheduler_info .webix_template .webix_scheduler_event_recurring_pattern{margin-bottom:20px;line-height:20px}.webix_scheduler_info .webix_template .webix_scheduler_event_details_title,.webix_scheduler_info .webix_template .webix_scheduler_event_units_title{color:#313131;font-weight:500;margin-bottom:10px}.webix_scheduler_info .webix_template .webix_scheduler_event_text{line-height:20px}.webix_scheduler_info .webix_template .webix_scheduler_event_units{margin-bottom:10px}.webix_scheduler_info .webix_template .webix_scheduler_event_units .webix_scheduler_event_unit_item{display:inline-block;margin-right:6px}.webix_scheduler_section_tpl{margin-top:20px;margin-bottom:20px}.webix_scheduler_section_tpl .webix_scheduler_section_title{font-weight:500;color:#313131}.webix_scheduler_cal_color .webix_inp_static{padding-right:50px}.webix_scheduler_cal_color_suggest .webix_list_item,.webix_scheduler_cal_color_suggest .webix_list_item.webix_selected{position:relative;padding-right:32px}.webix_scheduler_cal_color_suggest .webix_scheduler_cal_marker{right:4px}.webix_scheduler_cal_marker{display:block;width:24px;height:24px;border-radius:2px;position:absolute;right:26px;top:50%;margin-top:-12px}.webix_scheduler_counter .webix_inp_counter_value{width:calc(100% - 60px)}.webix_scheduler_subform_popup{border-width:1px}.webix_scheduler_subform_popup .webix_win_head{border-bottom-color:transparent}.webix_scheduler_cal_disabled{color:#94a1b3}.webix_scheduler_cal_disabled .webix_scheduler_calendar_marker{opacity:.6}.webix_scheduler_day_events{border-color:#edeff0;position:relative}.webix_scheduler_day_events .webix_list_item{padding:0;cursor:default;padding:0}.webix_scheduler_day_event{padding:8px 8px 16px;overflow:hidden;cursor:pointer;position:absolute;border-radius:2px;border-left:3px solid;box-sizing:border-box;transition:box-shadow .15s}.webix_scheduler_day_event:hover{z-index:1;box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_day_event:hover .webix_scheduler_resizer{visibility:visible}.webix_active_resize .webix_scheduler_day_events .webix_scheduler_day_event,.webix_active_resize .webix_scheduler_day_events .webix_list_item{cursor:ns-resize}.webix_drag_event,.webix_drag_event:hover{border-radius:2px;box-shadow:3px 3px 7px rgba(0,0,0,0.3),2px 2px 4px rgba(0,0,0,0.2)}.webix_active_resize .webix_scheduler_day_event:hover,.webix_noselect .webix_scheduler_day_event:hover{box-shadow:none}.webix_active_resize .webix_scheduler_day_event:hover .webix_scheduler_resizer,.webix_noselect .webix_scheduler_day_event:hover .webix_scheduler_resizer{visibility:hidden}.webix_active_resize .webix_scheduler_day_event.webix_resize_event:hover .webix_scheduler_resizer{visibility:visible}.webix_resize_event{border-radius:2px;box-shadow:3px 3px 7px rgba(0,0,0,0.3),2px 2px 4px rgba(0,0,0,0.2)}.webix_resize_event .webix_scheduler_resizer{visibility:visible}.webix_scheduler_resizer{position:absolute;bottom:0;left:0;width:100%;height:16px;font-size:16px;visibility:hidden;cursor:ns-resize}.webix_scheduler_resizer::before{content:\\\"\\\";transform:rotate(90deg);position:absolute;margin-left:-10px}.webix_scheduler_multilist{border-left-color:#edeff0;border-bottom-color:transparent}.webix_scheduler_multilist .webix_list_item{cursor:default;padding:0;line-height:normal;font-weight:500;position:relative;border-color:transparent}.webix_scheduler_multilist .webix_scheduler_multi_more .webix_scheduler_multiday_event{transition:background-color .3s;background-color:#f4f5f9;text-align:center;border:0}.webix_scheduler_multilist .webix_scheduler_multi_more .webix_scheduler_multiday_event:hover{background-color:#e7e9f2;box-shadow:none}.webix_scheduler_multilist .webix_scheduler_multiday_event{top:4px;left:1px}.webix_scheduler_multiday_event{cursor:pointer;position:absolute;border-radius:2px;border-left:3px solid;padding:0 8px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:box-shadow .15s}.webix_scheduler_multiday_event:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_event_break_left.webix_scheduler_event_break_right:hover,.webix_scheduler_event_break_left.webix_scheduler_event_break_right.webix_scheduler_event_selected{box-shadow:3px 9px 5px -7px rgba(0,0,0,0.3),2px 8px 2px -7px rgba(0,0,0,0.2)}.webix_scheduler_event_name{display:inline-block;line-height:20px;font-weight:500;font-size:14px}.webix_scheduler_event_time{line-height:14px;margin-top:4px;font-size:12px}.webix_scheduler_scale .webix_list_item{cursor:default;padding:0;border-bottom-color:transparent;text-align:center}.webix_scheduler_inner_day{height:100%;overflow:hidden}.webix_scheduler_day_scroll{border-top-color:#edeff0;position:relative}.webix_scheduler_day_header .webix_template{font-weight:500;line-height:32px;text-align:center;padding:0 0 0 50px}.webix_scheduler_today_marker{z-index:2;position:absolute;background-color:#ea764f;width:100%;height:2px;margin-top:-1px;pointer-events:none}.webix_scheduler_today_marker:before{content:\\\"\\\";display:block;background:inherit;width:12px;height:12px;margin-top:-5px;border-radius:50%}.webix_scheduler_multilist .webix_drag_event.webix_list_item{box-shadow:none;background:transparent}.webix_scheduler_multilist .webix_drag_event.webix_list_item .webix_scheduler_multiday_event{box-shadow:3px 3px 7px rgba(0,0,0,0.3),2px 2px 4px rgba(0,0,0,0.2)}.webix_scheduler_day_header .webix_dataview_item{border-color:transparent;text-align:center;line-height:31px;padding:0;cursor:default}.webix_scheduler_day_header .webix_dataview_item .webix_scheduler_weekday{font-size:12px}.webix_scheduler_day_header .webix_dataview_item .webix_scheduler_monthday{font-size:16px;font-weight:500}.webix_scheduler_day_header .webix_dataview_item.webix_scheduler_list_today .webix_scheduler_monthday{width:22px;height:22px;line-height:22px}.webix_scheduler_week_days{border-top-color:#edeff0;position:relative}.webix_scheduler_week .webix_unit_header{color:#313131;border-color:transparent;font-weight:normal;line-height:28px}.webix_scheduler_week .webix_unit_header_inner{margin-right:8px}.webix_scheduler_week .webix_scheduler_monthday{font-size:16px;font-weight:500}.webix_scheduler_week .webix_scheduler_monthday.webix_scheduler_today{width:22px;height:22px;line-height:22px}.webix_scheduler_multidays{border-left-color:#edeff0;border-bottom-color:transparent}.webix_scheduler_multidays .webix_dataview_item{border-color:transparent;cursor:default}.webix_scheduler_multidays .webix_scheduler_multiday_event{font-weight:500}.webix_scheduler_multidays .webix_scheduler_multi_more{transition:background-color .3s;background-color:#f4f5f9;text-align:center;border:0}.webix_scheduler_multidays .webix_scheduler_multi_more:hover{background-color:#e7e9f2;box-shadow:none}.webix_drag_event .webix_scheduler_multiday_event:hover,.webix_noselect .webix_scheduler_multiday_event:hover{box-shadow:none}.webix_drag_event .webix_scheduler_multiday_event.webix_scheduler_multi_more,.webix_noselect .webix_scheduler_multiday_event.webix_scheduler_multi_more{background-color:#e7e9f2}.webix_scheduler_list_today .webix_scheduler_monthday,.webix_scheduler_monthday.webix_scheduler_today{display:inline-block;width:20px;height:20px;line-height:20px;border-radius:50%;border:1px solid #1ca1c1;text-align:center}.webix_cal_day_with_event .webix_cal_day_inner{position:relative}.webix_cal_day_with_event .webix_cal_day_inner::after{content:\\\"\\\";position:absolute;display:block;top:70%;left:50%;width:4px;height:4px;margin-left:-2px;border-radius:50%;background-color:#1ca1c1}.webix_cal_select.webix_cal_day_with_event .webix_cal_day_inner::after{background-color:#fff}.webix_cal_outside.webix_cal_day_with_event .webix_cal_day_inner::after{background-color:#94a1b3}.webix_scheduler_calendar .webix_cal_day{position:relative;padding:2px 0 0 2px;line-height:20px;font-size:14px;cursor:default}.webix_scheduler_calendar .webix_cal_day:nth-child(7n){border-right-color:transparent}.webix_scheduler_calendar .webix_cal_event{color:#1ca1c1;font-weight:normal}.webix_scheduler_calendar .webix_event_marker{width:16px;margin-right:2px}.webix_scheduler_calendar .webix_event_marker_inner{margin:0 3px;vertical-align:middle}.webix_scheduler_calendar .webix_cal_date{display:inline-block;line-height:24px;height:24px;width:24px;border:1px solid transparent;cursor:pointer;text-align:center;border-radius:50%}.webix_scheduler_calendar .webix_cal_date:hover{background-color:#f4f5f9;color:#1ca1c1;font-weight:500}.webix_scheduler_calendar .webix_cal_today .webix_cal_date{border-color:#1ca1c1}.webix_scheduler_calendar .webix_event_time{font-weight:500;margin-right:4px}.webix_drag_event .webix_scheduler_month_event:hover,.webix_noselect .webix_scheduler_month_event:hover{box-shadow:none}.webix_drag_event .webix_scheduler_month_event_single:hover,.webix_noselect .webix_scheduler_month_event_single:hover{background-color:transparent}.webix_drag_event.webix_scheduler_more_list .webix_scheduler_month_event,.webix_drag_event.webix_scheduler_more_list .webix_scheduler_month_event_single{width:100%}.webix_scheduler_calendar_header .webix_dataview_item{text-align:center;line-height:32px;border-color:transparent;cursor:default}.webix_scheduler_month_events{position:relative}.webix_scheduler_month_event,.webix_scheduler_month_event_single{z-index:1;position:absolute;box-sizing:border-box;border-radius:2px;padding:0 8px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;user-select:none;cursor:pointer}.webix_scheduler_month_event.webix_scheduler_past_event,.webix_scheduler_month_event_single.webix_scheduler_past_event{color:#8393a9}.webix_scheduler_month_event{border-left:3px solid;transition:box-shadow .15s}.webix_scheduler_month_event_single{transition:background .15s;padding:0 8px 0 4px}.webix_scheduler_month_event:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_month_event_single:hover{background-color:#f4f5f9}.webix_scheduler_more{display:inline-block;border-radius:20px;height:20px;width:auto;padding:0 8px;color:#475466;font-size:14px;font-weight:500;transition:background .15s;position:absolute;right:8px;top:5px}.webix_scheduler_more:hover{background-color:#f4f5f9}.webix_scheduler_more_list .webix_scheduler_month_event,.webix_scheduler_more_list .webix_scheduler_month_event_single{box-sizing:border-box;width:calc(100% - 8px);display:block;border-radius:2px;line-height:20px}.webix_scheduler_more_list .webix_scheduler_month_event{padding:4px 8px}.webix_scheduler_more_list .webix_scheduler_month_event .webix_event_text{width:100%;padding:0}.webix_scheduler_more_list .webix_scheduler_month_event_single{padding:4px 8px 4px 4px}.webix_scheduler_more_list .webix_scheduler_month_event_single .webix_event_text{width:calc(100% - 14px)}.webix_scheduler_more_list .webix_list_item{padding:4px;border:0}.webix_scheduler_more_list .webix_event_marker{float:left;height:40px;margin-right:4px}.webix_scheduler_more_list .webix_event_marker_inner{margin-top:4px}.webix_scheduler_more_list .webix_event_text{float:left;font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.webix_scheduler_more_list .webix_event_time{float:left;font-size:12px;line-height:16px;margin-top:4px}.webix_scheduler_month_event_single.webix_scheduler_event_selected{background-color:#f4f5f9;box-shadow:none}.webix_scheduler_event_break_left::before,.webix_scheduler_event_break_right::after{content:\\\"\\\";height:100%;display:block;position:absolute;top:0;box-sizing:border-box;border-top:12px solid transparent;border-bottom:12px solid transparent;border-right:8px solid}.webix_scheduler_event_break_left{border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0;padding-left:11px}.webix_scheduler_event_break_left::before{left:0;border-right-color:inherit;border-top-color:#fff;border-bottom-color:#fff}.webix_scheduler_event_break_right::after{right:0;border-right-color:#fff}.webix_scheduler_event_break_left:hover,.webix_scheduler_event_break_left.webix_scheduler_event_selected{box-shadow:6px 6px 5px -4px rgba(0,0,0,0.3),5px 5px 2px -4px rgba(0,0,0,0.2)}.webix_scheduler_event_break_right:hover,.webix_scheduler_event_break_right.webix_scheduler_event_selected{box-shadow:-1px 5px 5px -3px rgba(0,0,0,0.3),-2px 4px 2px -3px rgba(0,0,0,0.2)}.webix_drag_zone .webix_scheduler_event_break_left::before,.webix_drag_zone .webix_scheduler_event_break_right::after{visibility:hidden}.webix_drag_zone .webix_scheduler_event_break_left{border-radius:2px;border-left-width:3px;padding-left:8px}.webix_scheduler_dnd_1 .webix_scheduler_event_break_left::before{border-top-color:#f4f5f9;border-bottom-color:#f4f5f9}.webix_scheduler_dnd_n .webix_scheduler_event_break_right::after{border-right-color:#f4f5f9}.webix_scheduler_year{justify-content:space-evenly}.webix_scheduler_year .webix_cal_month,.webix_scheduler_year .webix_cal_month .webix_cal_month_name{cursor:pointer}.webix_scheduler_year .webix_cal_month:hover .webix_cal_month_name{color:#1ca1c1}.webix_scheduler_year .webix_cal_outside{visibility:hidden}.webix_scheduler_absbutton{border-radius:50%;z-index:91}.webix_scheduler_absbutton .webix_el_box{background-color:#1ca1c1}.webix_scheduler_absbutton .webix_el_box .webix_icon_button:hover:before{background-color:#1992af}.webix_scheduler_absbutton .webix_el_box .webix_icon{color:#fff}.webix_scheduler_navlist .webix_icon{color:#94a1b3}.webix_scheduler_navlist .webix_selected .webix_icon{color:#1ca1c1}.webix_scheduler_navlist .webix_list_item,.webix_scheduler_navlist .webix_list_item.webix_selected{border-bottom-color:transparent}.webix_scheduler_navlist .webix_list_item:hover,.webix_scheduler_navlist .webix_list_item.webix_selected:hover{background-color:#f4f5f9}.webix_scheduler_navlist .webix_list_item.webix_selected{color:#475466;background-color:#f4f5f9}.webix_scheduler_cal_list .webix_list_item{padding:2px 8px 2px 0}.webix_scheduler_cal_list .webix_list_item span{float:left}.webix_scheduler_cal_list .webix_list_item .webix_icon{line-height:inherit}.webix_scheduler_cal_list .webix_list_item:hover .webix_scheduler_cal_edit{color:#94a1b3}.webix_scheduler_cal_list .webix_list_item.webix_selected{box-shadow:none;padding:2px 8px 2px 0;background-color:transparent}.webix_scheduler_cal_list .webix_list_item.webix_selected .webix_scheduler_cal_edit{color:#1ca1c1}.webix_scheduler_cal_list .webix_list_item.webix_selected .webix_scheduler_cal_edit::before{content:\\\"\\\"}.webix_scheduler_cal_list .webix_dt_editor input{padding-left:23px;border-color:transparent;border-bottom-color:#1ca1c1}.webix_scheduler_cal_popup .webix_win_head{border-bottom-color:transparent}.webix_scheduler_active{margin-right:4px}.webix_scheduler_cal_title{overflow:hidden;width:calc(100% - 24px - 29px - 4px);white-space:nowrap;text-overflow:ellipsis}.webix_scheduler_cal_edit{color:transparent;font-size:18px;width:31px;line-height:31px;border-radius:50%}.webix_scheduler_cal_edit:hover{color:#1ca1c1;background-color:#f4f5f9}.webix_scheduler_cal_edit.webix_scheduler_cal_visible{color:#94a1b3}.webix_scheduler_settings .webix_template{padding:0;text-align:center;font-weight:500;line-height:38px}.webix_scheduler_settings .webix_template:hover{background-color:#f4f5f9}.webix_event_overall{padding:0 8px 0 20px;height:100%;line-height:49px;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center}.webix_event_overall.webix_scheduler_past_event{color:#8393a9}.webix_event_overall.webix_scheduler_past_event .webix_event_time .end{color:#8393a9}.webix_event_overall .webix_event_time{flex-basis:70px;flex-shrink:0;display:block;text-align:center}.webix_event_overall .webix_event_time .start,.webix_event_overall .webix_event_time .end{font-size:12px;line-height:16px}.webix_event_overall .webix_event_time .end{color:#94a1b3}.webix_list_item .webix_event_text{padding-left:10px;display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;white-space:nowrap;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis}.webix_event_marker{display:inline-block;width:10px}.webix_event_marker_inner{display:inline-block;border-radius:50%;width:10px;height:10px}.webix_scheduler_event_selected{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_multi_space{text-align:center}.webix_scheduler_multi_space .webix_template{padding:0}.webix_scheduler_multi_space .webix_scheduler_more_icon{cursor:pointer;color:#94a1b3;transition:color .3s;position:relative;top:calc(100% - 26px);height:26px;width:26px}.webix_scheduler_multi_space .webix_scheduler_more_icon:hover{color:#475466}.webix_scheduler_multi_space .webix_scheduler_more_icon:after{content:\\\"\\\";transition:background-color .3s;height:26px;width:26px;border-radius:50%;position:absolute;top:-4px;left:0;z-index:-1}.webix_scheduler_multi_space .webix_scheduler_more_icon:hover:after{background-color:rgba(148,161,179,0.1)}.webix_scheduler_agenda .webix_scroll_cont{padding-left:120px}.webix_scheduler_agenda .webix_list_item{border-color:transparent;padding:0;width:calc(100% - 120px) !important}.webix_scheduler_agenda .webix_event_overall{line-height:40px;height:40px}.webix_scheduler_agenda .webix_event_overall:hover{background-color:#f4f5f9}.webix_scheduler_agenda .webix_event_overall.webix_scheduler_past_event{color:#8393a9}.webix_scheduler_agenda .webix_event_first{padding-top:8px}.webix_scheduler_agenda .webix_event_last{padding-bottom:8px}.webix_scheduler_agenda .webix_event_last:not(:last-child){border-color:#edeff0}.webix_scheduler_agenda .webix_agenda_selected{background-color:#f4f5f9}.webix_scheduler_agenda .webix_unit_header{float:left;margin-left:-120px;width:120px !important;background-color:transparent;border-bottom-width:0;line-height:18px;padding:6px 8px;box-sizing:border-box}.webix_scheduler_agenda .webix_unit_header:not(:first-child){border-top:1px solid #edeff0;margin-top:-1px}.webix_scheduler_agenda .webix_unit_header .webix_scheduler_dayofweek{color:#94a1b3;font-weight:normal;font-size:12px}.webix_scheduler_timeline_scale .webix_template{padding:0}.webix_scheduler_timeline_scale_row{display:flex;box-sizing:border-box}.webix_scheduler_timeline_scale_row:not(:last-child){border-bottom:1px solid #dadee0}.webix_scheduler_timeline_scale_cell{display:flex;flex:0 0 auto;justify-content:center;align-items:center;border-right:1px solid #dadee0;box-sizing:border-box;background-color:#f4f5f9}.webix_scheduler_timeline_event{position:absolute;box-sizing:border-box;border-radius:2px;color:#fff;cursor:pointer;border-left:3px solid;transition:box-shadow .15s;overflow:hidden}.webix_scheduler_timeline_event:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_timeline_content{text-align:center;line-height:30px;position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 12px}.webix_scheduler_timeline_task .webix_scheduler_timeline_content{padding:0 32px}.webix_scheduler_timeline_bars .webix_list_item,.webix_scheduler_timeline_sections .webix_cell{border-color:#dadee0;text-overflow:ellipsis}.webix_scheduler_timeline_bars .webix_list_item{cursor:default}.webix_scheduler_timeline_sections .webix_c_scroll_y div{color:transparent;background-color:transparent}.webix_scheduler_timeline_space{background-color:#f4f5f9}.webix_scheduler_timeline_event.webix_scheduler_multi_more{transition:background-color .3s;background-color:#f4f5f9}.webix_scheduler_timeline_event.webix_scheduler_multi_more .webix_scheduler_timeline_content{text-align:left;color:#475466}.webix_scheduler_timeline_event.webix_scheduler_multi_more:hover{background-color:#e7e9f2;box-shadow:none}.webix_scheduler_timeline_event.webix_scheduler_event_break_left{border-left-width:0;border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.webix_scheduler_timeline_event.webix_scheduler_event_break_left:hover{box-shadow:6px 6px 5px -4px rgba(0,0,0,0.2),5px 5px 2px -4px rgba(0,0,0,0.2)}.webix_scheduler_timeline_event.webix_scheduler_event_break_right:hover{box-shadow:-1px 5px 5px -3px rgba(0,0,0,0.3),-2px 4px 2px -3px rgba(0,0,0,0.2)}.webix_scheduler_copy.webix_scheduler_day_event.webix_scheduler_event_selected,.webix_scheduler_copy.webix_scheduler_day_event,.webix_scheduler_copy.webix_scheduler_month_event.webix_scheduler_event_selected,.webix_scheduler_copy.webix_scheduler_month_event,.webix_scheduler_copy.webix_scheduler_multiday_event,.webix_scheduler_copy.webix_scheduler_timeline_event.webix_scheduler_event_selected,.webix_scheduler_copy.webix_scheduler_timeline_event{box-shadow:2px 2px 5px #1ca1c1,1px 1px 2px #1ca1c1}.webix_scheduler_copy.webix_scheduler_multiday_event.webix_scheduler_event_break_right,.webix_scheduler_copy.webix_scheduler_month_event.webix_scheduler_event_break_right,.webix_scheduler_copy.webix_scheduler_timeline_event.webix_scheduler_event_break_right{box-shadow:3px 9px 5px -7px #1ca1c1,-6px 9px 3px -7px #1ca1c1}.webix_scheduler_copy.webix_scheduler_multiday_event.webix_scheduler_event_break_left,.webix_scheduler_copy.webix_scheduler_month_event.webix_scheduler_event_break_left,.webix_scheduler_copy.webix_scheduler_timeline_event.webix_scheduler_event_break_left{box-shadow:3px 9px 5px -7px #1ca1c1,2px 8px 2px -7px #1ca1c1}.webix_scheduler_copy .webix_scheduler_multiday_event.webix_scheduler_event_break_right{box-shadow:3px 9px 5px -7px #1ca1c1,-6px 9px 3px -7px #1ca1c1}.webix_scheduler_copy .webix_scheduler_multiday_event.webix_scheduler_event_break_left{box-shadow:3px 9px 5px -7px #1ca1c1,2px 8px 2px -7px #1ca1c1}.webix_scheduler_cut{opacity:.5}.webix_scheduler_month_event_single.webix_scheduler_event_selected.webix_scheduler_copy,.webix_scheduler_month_event_single.webix_scheduler_copy{background-color:rgba(28,161,193,0.2)}.webix_scheduler_paste_target{box-shadow:inset 0 2px 0 0 #1ca1c1,inset 0 -2px 0 0 #1ca1c1}.webix_scheduler_clipboard_target.webix_scheduler_calendar .webix_cal_day,.webix_scheduler_clipboard_target.webix_scheduler_timeline_bars .webix_list_item,.webix_scheduler_clipboard_target.webix_scheduler_day_events .webix_list_item,.webix_scheduler_clipboard_target.webix_scheduler_multilist{cursor:pointer}.webix_scheduler .webix_progress_top{z-index:10000}.webix_scheduler_action_popup .webix_win_head{border-bottom-color:transparent}.webix_scheduler_sidemenu{z-index:1 !important}.webix_toolbar.webix_scheduler_toolbar .webix_view,.webix_toolbar.webix_scheduler_toolbar .webix_control.webix_el_tabbar{background-color:transparent}.webix_toolbar.webix_scheduler_toolbar .webix_item_tab{background:transparent;color:#fff}.webix_toolbar.webix_scheduler_toolbar .webix_item_tab:hover{background-color:rgba(0,0,0,0.2)}.webix_toolbar.webix_scheduler_toolbar .webix_item_tab.webix_selected,.webix_toolbar.webix_scheduler_toolbar .webix_item_tab.webix_selected:focus{color:#fff;box-shadow:inset 0 -2px #fff}.webix_scheduler_cal_title{width:calc(100% - 24px - 31px - 4px)}.webix_scheduler_danger .webix_button{color:#ff5c4c;background-color:#fff1ef}.webix_scheduler_danger .webix_button:hover,.webix_scheduler_danger .webix_button:focus{background-color:#ffe7e5}.webix_scheduler_danger .webix_button:active{background-color:#ffdedb}.webix_scheduler_checkbox_allday .webix_custom_checkbox::before{margin-left:-2px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/components/scheduler/scheduler.min.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@charset \\\"UTF-8\\\";@font-face{font-family:\\\"scheduler-webfont\\\";src:url(\\\"fonts/scheduler-webfont.woff2\\\") format(\\\"woff2\\\"),url(\\\"fonts/scheduler-webfont.woff\\\") format(\\\"woff\\\");font-weight:normal;font-style:normal}[class^=shi-]:before,[class*=shi-]:before{font-family:\\\"scheduler-webfont\\\";display:inline-block;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.shi-agenda:before{content:\\\"\\\"}.shi-day:before{content:\\\"\\\"}.shi-month:before{content:\\\"\\\"}.shi-week:before{content:\\\"\\\"}.shi-back:before{content:\\\"\\\"}.shi-menu:before{content:\\\"\\\"}.shi-timeline:before{content:\\\"\\\"}.shi-units:before{content:\\\"\\\"}.shi-content-copy:before{content:\\\"\\\"}.shi-year:before{content:\\\"\\\"}.webix_scheduler_info .webix_template{overflow:auto;padding:0 0 0 2px}.webix_scheduler_info .webix_template .webix_scheduler_event_title{color:#313131;font-weight:500;margin-top:7px;margin-bottom:20px}.webix_scheduler_info .webix_template .webix_scheduler_event_from_to,.webix_scheduler_info .webix_template .webix_scheduler_event_recurring_pattern{margin-bottom:20px;line-height:20px}.webix_scheduler_info .webix_template .webix_scheduler_event_details_title,.webix_scheduler_info .webix_template .webix_scheduler_event_units_title{color:#313131;font-weight:500;margin-bottom:10px}.webix_scheduler_info .webix_template .webix_scheduler_event_text{line-height:20px}.webix_scheduler_info .webix_template .webix_scheduler_event_units{margin-bottom:10px}.webix_scheduler_info .webix_template .webix_scheduler_event_units .webix_scheduler_event_unit_item{display:inline-block;margin-right:6px}.webix_scheduler_section_tpl{margin-top:20px;margin-bottom:20px}.webix_scheduler_section_tpl .webix_scheduler_section_title{font-weight:500;color:#313131}.webix_scheduler_cal_color .webix_inp_static{padding-right:50px}.webix_scheduler_cal_color_suggest .webix_list_item,.webix_scheduler_cal_color_suggest .webix_list_item.webix_selected{position:relative;padding-right:32px}.webix_scheduler_cal_color_suggest .webix_scheduler_cal_marker{right:4px}.webix_scheduler_cal_marker{display:block;width:24px;height:24px;border-radius:2px;position:absolute;right:26px;top:50%;margin-top:-12px}.webix_scheduler_counter .webix_inp_counter_value{width:calc(100% - 60px)}.webix_scheduler_subform_popup{border-width:1px}.webix_scheduler_subform_popup .webix_win_head{border-bottom-color:transparent}.webix_scheduler_cal_disabled{color:#94a1b3}.webix_scheduler_cal_disabled .webix_scheduler_calendar_marker{opacity:.6}.webix_scheduler_day_events{border-color:#edeff0;position:relative}.webix_scheduler_day_events .webix_list_item{padding:0;cursor:default;padding:0}.webix_scheduler_day_event{padding:8px 8px 16px;overflow:hidden;cursor:pointer;position:absolute;border-radius:2px;border-left:3px solid;box-sizing:border-box;transition:box-shadow .15s}.webix_scheduler_day_event:hover{z-index:1;box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_day_event:hover .webix_scheduler_resizer{visibility:visible}.webix_active_resize .webix_scheduler_day_events .webix_scheduler_day_event,.webix_active_resize .webix_scheduler_day_events .webix_list_item{cursor:ns-resize}.webix_drag_event,.webix_drag_event:hover{border-radius:2px;box-shadow:3px 3px 7px rgba(0,0,0,0.3),2px 2px 4px rgba(0,0,0,0.2)}.webix_active_resize .webix_scheduler_day_event:hover,.webix_noselect .webix_scheduler_day_event:hover{box-shadow:none}.webix_active_resize .webix_scheduler_day_event:hover .webix_scheduler_resizer,.webix_noselect .webix_scheduler_day_event:hover .webix_scheduler_resizer{visibility:hidden}.webix_active_resize .webix_scheduler_day_event.webix_resize_event:hover .webix_scheduler_resizer{visibility:visible}.webix_resize_event{border-radius:2px;box-shadow:3px 3px 7px rgba(0,0,0,0.3),2px 2px 4px rgba(0,0,0,0.2)}.webix_resize_event .webix_scheduler_resizer{visibility:visible}.webix_scheduler_resizer{position:absolute;bottom:0;left:0;width:100%;height:16px;font-size:16px;visibility:hidden;cursor:ns-resize}.webix_scheduler_resizer::before{content:\\\"\\\";transform:rotate(90deg);position:absolute;margin-left:-10px}.webix_scheduler_multilist{border-left-color:#edeff0;border-bottom-color:transparent}.webix_scheduler_multilist .webix_list_item{cursor:default;padding:0;line-height:normal;font-weight:500;position:relative;border-color:transparent}.webix_scheduler_multilist .webix_scheduler_multi_more .webix_scheduler_multiday_event{transition:background-color .3s;background-color:#f4f5f9;text-align:center;border:0}.webix_scheduler_multilist .webix_scheduler_multi_more .webix_scheduler_multiday_event:hover{background-color:#e7e9f2;box-shadow:none}.webix_scheduler_multilist .webix_scheduler_multiday_event{top:4px;left:1px}.webix_scheduler_multiday_event{cursor:pointer;position:absolute;border-radius:2px;border-left:3px solid;padding:0 8px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:box-shadow .15s}.webix_scheduler_multiday_event:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_event_break_left.webix_scheduler_event_break_right:hover,.webix_scheduler_event_break_left.webix_scheduler_event_break_right.webix_scheduler_event_selected{box-shadow:3px 9px 5px -7px rgba(0,0,0,0.3),2px 8px 2px -7px rgba(0,0,0,0.2)}.webix_scheduler_event_name{display:inline-block;line-height:20px;font-weight:500;font-size:14px}.webix_scheduler_event_time{line-height:14px;margin-top:4px;font-size:12px}.webix_scheduler_scale .webix_list_item{cursor:default;padding:0;border-bottom-color:transparent;text-align:center}.webix_scheduler_inner_day{height:100%;overflow:hidden}.webix_scheduler_day_scroll{border-top-color:#edeff0;position:relative}.webix_scheduler_day_header .webix_template{font-weight:500;line-height:32px;text-align:center;padding:0 0 0 50px}.webix_scheduler_today_marker{z-index:2;position:absolute;background-color:#ea764f;width:100%;height:2px;margin-top:-1px;pointer-events:none}.webix_scheduler_today_marker:before{content:\\\"\\\";display:block;background:inherit;width:12px;height:12px;margin-top:-5px;border-radius:50%}.webix_scheduler_multilist .webix_drag_event.webix_list_item{box-shadow:none;background:transparent}.webix_scheduler_multilist .webix_drag_event.webix_list_item .webix_scheduler_multiday_event{box-shadow:3px 3px 7px rgba(0,0,0,0.3),2px 2px 4px rgba(0,0,0,0.2)}.webix_scheduler_day_header .webix_dataview_item{border-color:transparent;text-align:center;line-height:31px;padding:0;cursor:default}.webix_scheduler_day_header .webix_dataview_item .webix_scheduler_weekday{font-size:12px}.webix_scheduler_day_header .webix_dataview_item .webix_scheduler_monthday{font-size:16px;font-weight:500}.webix_scheduler_day_header .webix_dataview_item.webix_scheduler_list_today .webix_scheduler_monthday{width:22px;height:22px;line-height:22px}.webix_scheduler_week_days{border-top-color:#edeff0;position:relative}.webix_scheduler_week .webix_unit_header{color:#313131;border-color:transparent;font-weight:normal;line-height:28px}.webix_scheduler_week .webix_unit_header_inner{margin-right:8px}.webix_scheduler_week .webix_scheduler_monthday{font-size:16px;font-weight:500}.webix_scheduler_week .webix_scheduler_monthday.webix_scheduler_today{width:22px;height:22px;line-height:22px}.webix_scheduler_multidays{border-left-color:#edeff0;border-bottom-color:transparent}.webix_scheduler_multidays .webix_dataview_item{border-color:transparent;cursor:default}.webix_scheduler_multidays .webix_scheduler_multiday_event{font-weight:500}.webix_scheduler_multidays .webix_scheduler_multi_more{transition:background-color .3s;background-color:#f4f5f9;text-align:center;border:0}.webix_scheduler_multidays .webix_scheduler_multi_more:hover{background-color:#e7e9f2;box-shadow:none}.webix_drag_event .webix_scheduler_multiday_event:hover,.webix_noselect .webix_scheduler_multiday_event:hover{box-shadow:none}.webix_drag_event .webix_scheduler_multiday_event.webix_scheduler_multi_more,.webix_noselect .webix_scheduler_multiday_event.webix_scheduler_multi_more{background-color:#e7e9f2}.webix_scheduler_list_today .webix_scheduler_monthday,.webix_scheduler_monthday.webix_scheduler_today{display:inline-block;width:20px;height:20px;line-height:20px;border-radius:50%;border:1px solid #1ca1c1;text-align:center}.webix_cal_day_with_event .webix_cal_day_inner{position:relative}.webix_cal_day_with_event .webix_cal_day_inner::after{content:\\\"\\\";position:absolute;display:block;top:70%;left:50%;width:4px;height:4px;margin-left:-2px;border-radius:50%;background-color:#1ca1c1}.webix_cal_select.webix_cal_day_with_event .webix_cal_day_inner::after{background-color:#fff}.webix_cal_outside.webix_cal_day_with_event .webix_cal_day_inner::after{background-color:#94a1b3}.webix_scheduler_calendar .webix_cal_day{position:relative;padding:2px 0 0 2px;line-height:20px;font-size:14px;cursor:default}.webix_scheduler_calendar .webix_cal_day:nth-child(7n){border-right-color:transparent}.webix_scheduler_calendar .webix_cal_event{color:#1ca1c1;font-weight:normal}.webix_scheduler_calendar .webix_event_marker{width:16px;margin-right:2px}.webix_scheduler_calendar .webix_event_marker_inner{margin:0 3px;vertical-align:middle}.webix_scheduler_calendar .webix_cal_date{display:inline-block;line-height:24px;height:24px;width:24px;border:1px solid transparent;cursor:pointer;text-align:center;border-radius:50%}.webix_scheduler_calendar .webix_cal_date:hover{background-color:#f4f5f9;color:#1ca1c1;font-weight:500}.webix_scheduler_calendar .webix_cal_today .webix_cal_date{border-color:#1ca1c1}.webix_scheduler_calendar .webix_event_time{font-weight:500;margin-right:4px}.webix_drag_event .webix_scheduler_month_event:hover,.webix_noselect .webix_scheduler_month_event:hover{box-shadow:none}.webix_drag_event .webix_scheduler_month_event_single:hover,.webix_noselect .webix_scheduler_month_event_single:hover{background-color:transparent}.webix_drag_event.webix_scheduler_more_list .webix_scheduler_month_event,.webix_drag_event.webix_scheduler_more_list .webix_scheduler_month_event_single{width:100%}.webix_scheduler_calendar_header .webix_dataview_item{text-align:center;line-height:32px;border-color:transparent;cursor:default}.webix_scheduler_month_events{position:relative}.webix_scheduler_month_event,.webix_scheduler_month_event_single{z-index:1;position:absolute;box-sizing:border-box;border-radius:2px;padding:0 8px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;user-select:none;cursor:pointer}.webix_scheduler_month_event.webix_scheduler_past_event,.webix_scheduler_month_event_single.webix_scheduler_past_event{color:#8393a9}.webix_scheduler_month_event{border-left:3px solid;transition:box-shadow .15s}.webix_scheduler_month_event_single{transition:background .15s;padding:0 8px 0 4px}.webix_scheduler_month_event:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_month_event_single:hover{background-color:#f4f5f9}.webix_scheduler_more{display:inline-block;border-radius:20px;height:20px;width:auto;padding:0 8px;color:#475466;font-size:14px;font-weight:500;transition:background .15s;position:absolute;right:8px;top:5px}.webix_scheduler_more:hover{background-color:#f4f5f9}.webix_scheduler_more_list .webix_scheduler_month_event,.webix_scheduler_more_list .webix_scheduler_month_event_single{box-sizing:border-box;width:calc(100% - 8px);display:block;border-radius:2px;line-height:20px}.webix_scheduler_more_list .webix_scheduler_month_event{padding:4px 8px}.webix_scheduler_more_list .webix_scheduler_month_event .webix_event_text{width:100%;padding:0}.webix_scheduler_more_list .webix_scheduler_month_event_single{padding:4px 8px 4px 4px}.webix_scheduler_more_list .webix_scheduler_month_event_single .webix_event_text{width:calc(100% - 14px)}.webix_scheduler_more_list .webix_list_item{padding:4px;border:0}.webix_scheduler_more_list .webix_event_marker{float:left;height:40px;margin-right:4px}.webix_scheduler_more_list .webix_event_marker_inner{margin-top:4px}.webix_scheduler_more_list .webix_event_text{float:left;font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.webix_scheduler_more_list .webix_event_time{float:left;font-size:12px;line-height:16px;margin-top:4px}.webix_scheduler_month_event_single.webix_scheduler_event_selected{background-color:#f4f5f9;box-shadow:none}.webix_scheduler_event_break_left::before,.webix_scheduler_event_break_right::after{content:\\\"\\\";height:100%;display:block;position:absolute;top:0;box-sizing:border-box;border-top:12px solid transparent;border-bottom:12px solid transparent;border-right:8px solid}.webix_scheduler_event_break_left{border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0;padding-left:11px}.webix_scheduler_event_break_left::before{left:0;border-right-color:inherit;border-top-color:#fff;border-bottom-color:#fff}.webix_scheduler_event_break_right::after{right:0;border-right-color:#fff}.webix_scheduler_event_break_left:hover,.webix_scheduler_event_break_left.webix_scheduler_event_selected{box-shadow:6px 6px 5px -4px rgba(0,0,0,0.3),5px 5px 2px -4px rgba(0,0,0,0.2)}.webix_scheduler_event_break_right:hover,.webix_scheduler_event_break_right.webix_scheduler_event_selected{box-shadow:-1px 5px 5px -3px rgba(0,0,0,0.3),-2px 4px 2px -3px rgba(0,0,0,0.2)}.webix_drag_zone .webix_scheduler_event_break_left::before,.webix_drag_zone .webix_scheduler_event_break_right::after{visibility:hidden}.webix_drag_zone .webix_scheduler_event_break_left{border-radius:2px;border-left-width:3px;padding-left:8px}.webix_scheduler_dnd_1 .webix_scheduler_event_break_left::before{border-top-color:#f4f5f9;border-bottom-color:#f4f5f9}.webix_scheduler_dnd_n .webix_scheduler_event_break_right::after{border-right-color:#f4f5f9}.webix_scheduler_year{justify-content:space-evenly}.webix_scheduler_year .webix_cal_month,.webix_scheduler_year .webix_cal_month .webix_cal_month_name{cursor:pointer}.webix_scheduler_year .webix_cal_month:hover .webix_cal_month_name{color:#1ca1c1}.webix_scheduler_year .webix_cal_outside{visibility:hidden}.webix_scheduler_absbutton{border-radius:50%;z-index:91}.webix_scheduler_absbutton .webix_el_box{background-color:#1ca1c1}.webix_scheduler_absbutton .webix_el_box .webix_icon_button:hover:before{background-color:#1992af}.webix_scheduler_absbutton .webix_el_box .webix_icon{color:#fff}.webix_scheduler_navlist .webix_icon{color:#94a1b3}.webix_scheduler_navlist .webix_selected .webix_icon{color:#1ca1c1}.webix_scheduler_navlist .webix_list_item,.webix_scheduler_navlist .webix_list_item.webix_selected{border-bottom-color:transparent}.webix_scheduler_navlist .webix_list_item:hover,.webix_scheduler_navlist .webix_list_item.webix_selected:hover{background-color:#f4f5f9}.webix_scheduler_navlist .webix_list_item.webix_selected{color:#475466;background-color:#f4f5f9}.webix_scheduler_cal_list .webix_list_item{padding:2px 8px 2px 0}.webix_scheduler_cal_list .webix_list_item span{float:left}.webix_scheduler_cal_list .webix_list_item .webix_icon{line-height:inherit}.webix_scheduler_cal_list .webix_list_item:hover .webix_scheduler_cal_edit{color:#94a1b3}.webix_scheduler_cal_list .webix_list_item.webix_selected{box-shadow:none;padding:2px 8px 2px 0;background-color:transparent}.webix_scheduler_cal_list .webix_list_item.webix_selected .webix_scheduler_cal_edit{color:#1ca1c1}.webix_scheduler_cal_list .webix_list_item.webix_selected .webix_scheduler_cal_edit::before{content:\\\"\\\"}.webix_scheduler_cal_list .webix_dt_editor input{padding-left:23px;border-color:transparent;border-bottom-color:#1ca1c1}.webix_scheduler_cal_popup .webix_win_head{border-bottom-color:transparent}.webix_scheduler_active{margin-right:4px}.webix_scheduler_cal_title{overflow:hidden;width:calc(100% - 24px - 29px - 4px);white-space:nowrap;text-overflow:ellipsis}.webix_scheduler_cal_edit{color:transparent;font-size:18px;width:31px;line-height:31px;border-radius:50%}.webix_scheduler_cal_edit:hover{color:#1ca1c1;background-color:#f4f5f9}.webix_scheduler_cal_edit.webix_scheduler_cal_visible{color:#94a1b3}.webix_scheduler_settings .webix_template{padding:0;text-align:center;font-weight:500;line-height:38px}.webix_scheduler_settings .webix_template:hover{background-color:#f4f5f9}.webix_event_overall{padding:0 8px 0 20px;height:100%;line-height:49px;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center}.webix_event_overall.webix_scheduler_past_event{color:#8393a9}.webix_event_overall.webix_scheduler_past_event .webix_event_time .end{color:#8393a9}.webix_event_overall .webix_event_time{flex-basis:70px;flex-shrink:0;display:block;text-align:center}.webix_event_overall .webix_event_time .start,.webix_event_overall .webix_event_time .end{font-size:12px;line-height:16px}.webix_event_overall .webix_event_time .end{color:#94a1b3}.webix_list_item .webix_event_text{padding-left:10px;display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;white-space:nowrap;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis}.webix_event_marker{display:inline-block;width:10px}.webix_event_marker_inner{display:inline-block;border-radius:50%;width:10px;height:10px}.webix_scheduler_event_selected{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_multi_space{text-align:center}.webix_scheduler_multi_space .webix_template{padding:0}.webix_scheduler_multi_space .webix_scheduler_more_icon{cursor:pointer;color:#94a1b3;transition:color .3s;position:relative;top:calc(100% - 26px);height:26px;width:26px}.webix_scheduler_multi_space .webix_scheduler_more_icon:hover{color:#475466}.webix_scheduler_multi_space .webix_scheduler_more_icon:after{content:\\\"\\\";transition:background-color .3s;height:26px;width:26px;border-radius:50%;position:absolute;top:-4px;left:0;z-index:-1}.webix_scheduler_multi_space .webix_scheduler_more_icon:hover:after{background-color:rgba(148,161,179,0.1)}.webix_scheduler_agenda .webix_scroll_cont{padding-left:120px}.webix_scheduler_agenda .webix_list_item{border-color:transparent;padding:0;width:calc(100% - 120px) !important}.webix_scheduler_agenda .webix_event_overall{line-height:40px;height:40px}.webix_scheduler_agenda .webix_event_overall:hover{background-color:#f4f5f9}.webix_scheduler_agenda .webix_event_overall.webix_scheduler_past_event{color:#8393a9}.webix_scheduler_agenda .webix_event_first{padding-top:8px}.webix_scheduler_agenda .webix_event_last{padding-bottom:8px}.webix_scheduler_agenda .webix_event_last:not(:last-child){border-color:#edeff0}.webix_scheduler_agenda .webix_agenda_selected{background-color:#f4f5f9}.webix_scheduler_agenda .webix_unit_header{float:left;margin-left:-120px;width:120px !important;background-color:transparent;border-bottom-width:0;line-height:18px;padding:6px 8px;box-sizing:border-box}.webix_scheduler_agenda .webix_unit_header:not(:first-child){border-top:1px solid #edeff0;margin-top:-1px}.webix_scheduler_agenda .webix_unit_header .webix_scheduler_dayofweek{color:#94a1b3;font-weight:normal;font-size:12px}.webix_scheduler_timeline_scale .webix_template{padding:0}.webix_scheduler_timeline_scale_row{display:flex;box-sizing:border-box}.webix_scheduler_timeline_scale_row:not(:last-child){border-bottom:1px solid #dadee0}.webix_scheduler_timeline_scale_cell{display:flex;flex:0 0 auto;justify-content:center;align-items:center;border-right:1px solid #dadee0;box-sizing:border-box;background-color:#f4f5f9}.webix_scheduler_timeline_event{position:absolute;box-sizing:border-box;border-radius:2px;color:#fff;cursor:pointer;border-left:3px solid;transition:box-shadow .15s;overflow:hidden}.webix_scheduler_timeline_event:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_timeline_content{text-align:center;line-height:30px;position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 12px}.webix_scheduler_timeline_task .webix_scheduler_timeline_content{padding:0 32px}.webix_scheduler_timeline_bars .webix_list_item,.webix_scheduler_timeline_sections .webix_cell{border-color:#dadee0;text-overflow:ellipsis}.webix_scheduler_timeline_bars .webix_list_item{cursor:default}.webix_scheduler_timeline_sections .webix_c_scroll_y div{color:transparent;background-color:transparent}.webix_scheduler_timeline_space{background-color:#f4f5f9}.webix_scheduler_timeline_event.webix_scheduler_multi_more{transition:background-color .3s;background-color:#f4f5f9}.webix_scheduler_timeline_event.webix_scheduler_multi_more .webix_scheduler_timeline_content{text-align:left;color:#475466}.webix_scheduler_timeline_event.webix_scheduler_multi_more:hover{background-color:#e7e9f2;box-shadow:none}.webix_scheduler_timeline_event.webix_scheduler_event_break_left{border-left-width:0;border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.webix_scheduler_timeline_event.webix_scheduler_event_break_left:hover{box-shadow:6px 6px 5px -4px rgba(0,0,0,0.2),5px 5px 2px -4px rgba(0,0,0,0.2)}.webix_scheduler_timeline_event.webix_scheduler_event_break_right:hover{box-shadow:-1px 5px 5px -3px rgba(0,0,0,0.3),-2px 4px 2px -3px rgba(0,0,0,0.2)}.webix_scheduler_copy.webix_scheduler_day_event.webix_scheduler_event_selected,.webix_scheduler_copy.webix_scheduler_day_event,.webix_scheduler_copy.webix_scheduler_month_event.webix_scheduler_event_selected,.webix_scheduler_copy.webix_scheduler_month_event,.webix_scheduler_copy.webix_scheduler_multiday_event,.webix_scheduler_copy.webix_scheduler_timeline_event.webix_scheduler_event_selected,.webix_scheduler_copy.webix_scheduler_timeline_event{box-shadow:2px 2px 5px #1ca1c1,1px 1px 2px #1ca1c1}.webix_scheduler_copy.webix_scheduler_multiday_event.webix_scheduler_event_break_right,.webix_scheduler_copy.webix_scheduler_month_event.webix_scheduler_event_break_right,.webix_scheduler_copy.webix_scheduler_timeline_event.webix_scheduler_event_break_right{box-shadow:3px 9px 5px -7px #1ca1c1,-6px 9px 3px -7px #1ca1c1}.webix_scheduler_copy.webix_scheduler_multiday_event.webix_scheduler_event_break_left,.webix_scheduler_copy.webix_scheduler_month_event.webix_scheduler_event_break_left,.webix_scheduler_copy.webix_scheduler_timeline_event.webix_scheduler_event_break_left{box-shadow:3px 9px 5px -7px #1ca1c1,2px 8px 2px -7px #1ca1c1}.webix_scheduler_copy .webix_scheduler_multiday_event.webix_scheduler_event_break_right{box-shadow:3px 9px 5px -7px #1ca1c1,-6px 9px 3px -7px #1ca1c1}.webix_scheduler_copy .webix_scheduler_multiday_event.webix_scheduler_event_break_left{box-shadow:3px 9px 5px -7px #1ca1c1,2px 8px 2px -7px #1ca1c1}.webix_scheduler_cut{opacity:.5}.webix_scheduler_month_event_single.webix_scheduler_event_selected.webix_scheduler_copy,.webix_scheduler_month_event_single.webix_scheduler_copy{background-color:rgba(28,161,193,0.2)}.webix_scheduler_paste_target{box-shadow:inset 0 2px 0 0 #1ca1c1,inset 0 -2px 0 0 #1ca1c1}.webix_scheduler_clipboard_target.webix_scheduler_calendar .webix_cal_day,.webix_scheduler_clipboard_target.webix_scheduler_timeline_bars .webix_list_item,.webix_scheduler_clipboard_target.webix_scheduler_day_events .webix_list_item,.webix_scheduler_clipboard_target.webix_scheduler_multilist{cursor:pointer}.webix_scheduler .webix_progress_top{z-index:10000}.webix_scheduler_action_popup .webix_win_head{border-bottom-color:transparent}.webix_scheduler_sidemenu{z-index:1 !important}.webix_toolbar.webix_scheduler_toolbar .webix_view,.webix_toolbar.webix_scheduler_toolbar .webix_control.webix_el_tabbar{background-color:transparent}.webix_toolbar.webix_scheduler_toolbar .webix_item_tab{background:transparent;color:#fff}.webix_toolbar.webix_scheduler_toolbar .webix_item_tab:hover{background-color:rgba(0,0,0,0.2)}.webix_toolbar.webix_scheduler_toolbar .webix_item_tab.webix_selected,.webix_toolbar.webix_scheduler_toolbar .webix_item_tab.webix_selected:focus{color:#fff;box-shadow:inset 0 -2px #fff}.webix_scheduler_cal_title{width:calc(100% - 24px - 31px - 4px)}.webix_scheduler_danger .webix_button{color:#ff5c4c;background-color:#fff1ef}.webix_scheduler_danger .webix_button:hover,.webix_scheduler_danger .webix_button:focus{background-color:#ffe7e5}.webix_scheduler_danger .webix_button:active{background-color:#ffdedb}.webix_scheduler_checkbox_allday .webix_custom_checkbox::before{margin-left:-2px}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".webix_view {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n -webkit-font-smoothing: antialiased;\\n cursor: default;\\n overflow: hidden;\\n border: 0px solid #DADEE0;\\n background-color: #FFFFFF;\\n white-space: normal;\\n -webkit-appearance: none;\\n}\\n.webix_view.webix_form {\\n background-color: #FFFFFF;\\n}\\nbody {\\n -webkit-tap-highlight-color: transparent !important;\\n}\\n/*\\n\\twebix_layout_{type}\\n\\tknown types are: line, clean, wide, space;\\n*/\\n.webix_abslayout {\\n position: relative;\\n}\\n.webix_abslayout > .webix_view {\\n position: absolute !important;\\n z-index: 0;\\n}\\n.webix_layout_space {\\n background-color: #EBEDF0;\\n}\\n.webix_layout_wide {\\n background-color: #EBEDF0;\\n}\\n.webix_layout_line,\\n.webix_multiview,\\n.webix_layout_clean,\\n.webix_layout_accordion {\\n background: transparent;\\n}\\n.webix_overlay {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n z-index: 90;\\n text-align: center;\\n padding-top: 10px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_view > .webix_disabled {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n left: 0;\\n background-color: #ddd;\\n opacity: 0.4;\\n z-index: 92;\\n cursor: not-allowed;\\n}\\n.webix_disabled_view {\\n overflow: hidden !important;\\n position: relative;\\n}\\nbody.webix_full_screen {\\n margin: 0;\\n padding: 0;\\n overflow: hidden;\\n}\\nbody.webix_noselect {\\n overscroll-behavior: none;\\n}\\n.webix_noselect,\\n.webix_noselect div {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_selectable {\\n -moz-user-select: text;\\n -webkit-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n.webix_template {\\n height: 100%;\\n padding: 4px 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_clean {\\n background: transparent;\\n}\\n.webix_clean .webix_template {\\n padding: 0px;\\n}\\n.webix_section {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background-color: transparent;\\n position: relative;\\n color: #444;\\n font-size: 10px;\\n text-transform: uppercase;\\n line-height: 44px;\\n}\\n.webix_section:before {\\n content: '';\\n display: block;\\n width: 100%;\\n height: 1px;\\n background-color: #DADEE0;\\n position: absolute;\\n top: 50%;\\n}\\n.webix_section > .webix_template {\\n padding: 0px 8px;\\n margin-left: 30px;\\n background-color: #FFFFFF;\\n display: inline;\\n position: relative;\\n}\\n.webix_layout_space > .webix_section > .webix_template {\\n padding: 0px 8px;\\n background-color: #EBEDF0;\\n}\\n.webix_layout_wide > .webix_section > .webix_template {\\n padding: 0px 8px;\\n background-color: #EBEDF0;\\n}\\n.webix_layout_line > .webix_section > .webix_template,\\n.webix_layout_clean > .webix_section > .webix_template {\\n padding: 0px 8px;\\n background-color: #FFFFFF;\\n}\\n.webix_header {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n line-height: 42px;\\n}\\n.webix_header .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_header.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_header.webix_dark .webix_el_button,\\n.webix_header.webix_dark .webix_el_label .webix_el_box,\\n.webix_header.webix_dark .webix_inp_label,\\n.webix_header.webix_dark .webix_inp_top_label,\\n.webix_header.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_secondary .webix_icon,\\n.webix_header.webix_dark .webix_transparent .webix_icon,\\n.webix_header.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_header.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_header.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_header.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_transparent button:hover,\\n.webix_header.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_header.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_header.webix_dark .webix_secondary button,\\n.webix_header.webix_dark .webix_inp_counter_next,\\n.webix_header.webix_dark .webix_inp_counter_prev,\\n.webix_header.webix_dark .webix_segment_0,\\n.webix_header.webix_dark .webix_segment_1,\\n.webix_header.webix_dark .webix_segment_N,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_header.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_header.webix_dark .webix_secondary button:hover,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_header.webix_dark .webix_inp_counter_next:hover,\\n.webix_header.webix_dark .webix_inp_counter_prev:hover,\\n.webix_header.webix_dark .webix_segment_0:hover,\\n.webix_header.webix_dark .webix_segment_1:hover,\\n.webix_header.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_header.webix_dark .webix_secondary button:focus,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_header.webix_dark .webix_inp_counter_next:focus,\\n.webix_header.webix_dark .webix_inp_counter_prev:focus,\\n.webix_header.webix_dark .webix_segment_0:focus,\\n.webix_header.webix_dark .webix_segment_1:focus,\\n.webix_header.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_secondary button:active,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_header.webix_dark .webix_inp_counter_next:active,\\n.webix_header.webix_dark .webix_inp_counter_prev:active,\\n.webix_header.webix_dark .webix_segment_0:active,\\n.webix_header.webix_dark .webix_segment_1:active,\\n.webix_header.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_inp_static,\\n.webix_header.webix_dark input[type=text],\\n.webix_header.webix_dark input[type=combo],\\n.webix_header.webix_dark input[type=datepicker],\\n.webix_header.webix_dark textarea,\\n.webix_header.webix_dark select,\\n.webix_header.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_header.webix_dark .webix_el_texthighlight input,\\n.webix_header.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_header.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_header.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_multicombo_value,\\n.webix_header.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_header.webix_dark .webix_inp_static:focus,\\n.webix_header.webix_dark input[type=text]:focus,\\n.webix_header.webix_dark input[type=combo]:focus,\\n.webix_header.webix_dark input[type=datepicker]:focus,\\n.webix_header.webix_dark textarea:focus,\\n.webix_header.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_header.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_header.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_header.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0,\\n.webix_header.webix_dark .webix_selected.webix_segment_1,\\n.webix_header.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_header.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_header.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_header.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_header.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_header.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_header.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_header.webix_dark .webix_el_icon,\\n.webix_header.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_header.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_header.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_header.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_header.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_header.webix_dark .webix_custom_checkbox,\\n.webix_header.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_custom_checkbox:focus,\\n.webix_header.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_header.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_header.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_header.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_invalid .webix_el_box input,\\n.webix_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_header.webix_dark .webix_invalid .webix_el_box select,\\n.webix_header.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_header.webix_dark input.webix_invalid,\\n.webix_header.webix_dark select.webix_invalid,\\n.webix_header.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_header.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_header.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_header.webix_dark {\\n color: #FFFFFF;\\n}\\n.webix_header > div {\\n line-height: 44px;\\n padding-left: 10px;\\n padding-top: 0;\\n padding-bottom: 0;\\n}\\n.webix_spacer {\\n background: transparent;\\n}\\n.webix_view_animate {\\n position: relative;\\n width: 100%;\\n height: 100%;\\n}\\nx\\\\:ui {\\n display: none;\\n}\\n.webix_view.webix_flexlayout {\\n display: flex !important;\\n flex-wrap: wrap;\\n flex-direction: row;\\n overflow: hidden;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_flexlayout > div {\\n display: block !important;\\n}\\n.webix_view_align {\\n background: transparent;\\n}\\n.webix_view div,\\n.webix_view span,\\n.webix_view a.webix_list_item,\\n.webix_view.webix_window {\\n outline: none;\\n}\\ntextarea,\\ninput,\\nselect,\\nbutton,\\n.webix_view div.webix_inp_static:focus {\\n outline: none;\\n}\\n.webix_resize_area {\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n width: 100%;\\n height: 100%;\\n}\\n.webix_resize_handle_x .webix_handle_content,\\n.webix_resize_handle_y .webix_handle_content {\\n width: 100%;\\n height: 100%;\\n background: rgba(100, 100, 100, 0.1);\\n border: 1px dotted #ebebeb;\\n}\\n.webix_resize_handle_x {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n cursor: ew-resize;\\n width: 1px;\\n height: 100%;\\n position: absolute;\\n z-index: 2;\\n top: 0px;\\n}\\n.webix_resize_handle_x .webix_handle_content {\\n border-width: 0px 1px;\\n}\\n.webix_resize_origin_x {\\n cursor: ew-resize;\\n width: 3px;\\n height: 100%;\\n position: absolute;\\n z-index: 2;\\n top: 0px;\\n}\\n.webix_resize_handle_y {\\n cursor: ns-resize;\\n height: 1px;\\n width: 100%;\\n position: absolute;\\n z-index: 2;\\n left: 0px;\\n}\\n.webix_resize_handle_y .webix_handle_content {\\n border-width: 1px 0px;\\n}\\n.webix_resize_origin_y {\\n cursor: ns-resize;\\n height: 3px;\\n width: 100%;\\n position: absolute;\\n z-index: 2;\\n left: 0px;\\n}\\n.webix_resizer {\\n position: relative;\\n}\\n.webix_resizer.webix_disabled_view {\\n cursor: default;\\n}\\n.webix_resizer_vy {\\n cursor: ns-resize;\\n margin-top: 0px !important;\\n border: 0px !important;\\n padding: 0px !important;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAADAQMAAABCowZuAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA9JREFUCB1jXMUABoxAGgAJaAFXPIkJqAAAAABJRU5ErkJggg==\\\") no-repeat center center;\\n}\\n.webix_resizer_vx {\\n cursor: ew-resize;\\n margin-left: 0px !important;\\n border: 0px !important;\\n padding: 0px !important;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAXAQMAAAD0oWdxAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA5JREFUeF5jWMDAQDwGAKyuB4FpGQdzAAAAAElFTkSuQmCC\\\") no-repeat center center;\\n}\\n.webix_resizer_y {\\n cursor: ns-resize;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAADAQMAAABCowZuAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA9JREFUCB1jXMUABoxAGgAJaAFXPIkJqAAAAABJRU5ErkJggg==\\\") no-repeat center center;\\n background-color: #ffffff;\\n}\\n.webix_resizer_x {\\n cursor: ew-resize;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAXAQMAAAD0oWdxAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA5JREFUeF5jWMDAQDwGAKyuB4FpGQdzAAAAAElFTkSuQmCC\\\") no-repeat center center;\\n background-color: #ffffff;\\n}\\n.webix_accordionitem_body {\\n position: relative;\\n}\\n.webix_accordionitem_body > div {\\n border-width: 0px!important;\\n}\\n.webix_accordionitem_header {\\n border-bottom: 1px solid #DADEE0;\\n position: relative;\\n z-index: 2;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n line-height: 42px;\\n cursor: pointer;\\n overflow: hidden;\\n}\\n.webix_accordionitem_header.webix_dark {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_accordionitem_header.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_button,\\n.webix_accordionitem_header.webix_dark .webix_el_label .webix_el_box,\\n.webix_accordionitem_header.webix_dark .webix_inp_label,\\n.webix_accordionitem_header.webix_dark .webix_inp_top_label,\\n.webix_accordionitem_header.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_transparent .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_accordionitem_header.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_accordionitem_header.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_accordionitem_header.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_transparent button:hover,\\n.webix_accordionitem_header.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_accordionitem_header.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev,\\n.webix_accordionitem_header.webix_dark .webix_segment_0,\\n.webix_accordionitem_header.webix_dark .webix_segment_1,\\n.webix_accordionitem_header.webix_dark .webix_segment_N,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button:hover,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next:hover,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev:hover,\\n.webix_accordionitem_header.webix_dark .webix_segment_0:hover,\\n.webix_accordionitem_header.webix_dark .webix_segment_1:hover,\\n.webix_accordionitem_header.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button:focus,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next:focus,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev:focus,\\n.webix_accordionitem_header.webix_dark .webix_segment_0:focus,\\n.webix_accordionitem_header.webix_dark .webix_segment_1:focus,\\n.webix_accordionitem_header.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button:active,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next:active,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev:active,\\n.webix_accordionitem_header.webix_dark .webix_segment_0:active,\\n.webix_accordionitem_header.webix_dark .webix_segment_1:active,\\n.webix_accordionitem_header.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_inp_static,\\n.webix_accordionitem_header.webix_dark input[type=text],\\n.webix_accordionitem_header.webix_dark input[type=combo],\\n.webix_accordionitem_header.webix_dark input[type=datepicker],\\n.webix_accordionitem_header.webix_dark textarea,\\n.webix_accordionitem_header.webix_dark select,\\n.webix_accordionitem_header.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_texthighlight input,\\n.webix_accordionitem_header.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_accordionitem_header.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_multicombo_value,\\n.webix_accordionitem_header.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_accordionitem_header.webix_dark .webix_inp_static:focus,\\n.webix_accordionitem_header.webix_dark input[type=text]:focus,\\n.webix_accordionitem_header.webix_dark input[type=combo]:focus,\\n.webix_accordionitem_header.webix_dark input[type=datepicker]:focus,\\n.webix_accordionitem_header.webix_dark textarea:focus,\\n.webix_accordionitem_header.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_icon,\\n.webix_accordionitem_header.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_accordionitem_header.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_accordionitem_header.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_accordionitem_header.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_accordionitem_header.webix_dark .webix_custom_checkbox,\\n.webix_accordionitem_header.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_custom_checkbox:focus,\\n.webix_accordionitem_header.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_accordionitem_header.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_accordionitem_header.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_accordionitem_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_accordionitem_header.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box input,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box select,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_accordionitem_header.webix_dark input.webix_invalid,\\n.webix_accordionitem_header.webix_dark select.webix_invalid,\\n.webix_accordionitem_header.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_accordionitem_label {\\n height: 100%;\\n padding-left: 10px;\\n}\\n.webix_accordionitem_button {\\n float: right;\\n position: relative;\\n height: 11px;\\n width: 11px;\\n margin: 14.5px 13px;\\n}\\n.webix_carousel {\\n position: relative;\\n}\\n.webix_nav_panel {\\n bottom: 16px;\\n height: 14px;\\n line-height: 14px;\\n overflow: hidden;\\n position: absolute;\\n text-align: center;\\n padding: 2px 0;\\n}\\n.webix_nav_item {\\n display: inline-block;\\n height: 10px;\\n margin: 0 2px;\\n width: 10px;\\n cursor: pointer;\\n border-radius: 50%;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n}\\n.webix_nav_inactive {\\n border: 2px solid rgba(0, 0, 0, 0.15);\\n opacity: 0.6;\\n background: #fff;\\n}\\n.webix_nav_active {\\n border: 2px solid rgba(0, 0, 0, 0.1);\\n background: #fff;\\n}\\n.webix_nav_active:hover,\\n.webix_nav_active:focus {\\n box-shadow: 0 0 2px #fff;\\n}\\n.webix_nav_button_prev,\\n.webix_nav_button_next {\\n cursor: pointer;\\n display: block;\\n height: 32px;\\n line-height: 32px;\\n position: absolute;\\n width: 32px;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_nav_button_next .webix_nav_button_inner {\\n height: 100%;\\n width: 100%;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowNDNEOTBEMTYyNzQxMUUzOEU1N0MyQTEyMzIxMDVFQSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowNDNEOTBEMjYyNzQxMUUzOEU1N0MyQTEyMzIxMDVFQSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA0M0Q5MENGNjI3NDExRTM4RTU3QzJBMTIzMjEwNUVBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA0M0Q5MEQwNjI3NDExRTM4RTU3QzJBMTIzMjEwNUVBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+yGPRLgAAAPBJREFUeNpi+P//vycQP/tPfQAy05MRxGBgYJBkoA14DrLgPwMNARMDjcGgteAINN5CCaokI3UcB2I+UNQBsTghxaRacAaI+aH62IB4MzUtuAjEwlA9zEC8hhhNxFpwFYhFkQxfTqyriLHgFhBLQtWC8s18UsKUkAV3gVgGyfBZpKYIQhbYQtWAcBg5BRIhC26j+WAOtS0AgRvQ9A6L4IXUtgAELqOlopXUtgAEzgOxIFQPKxCvo7YFIHAKLSdvo7YFIHAUiHmgeiUIKSanNLUC4i1ALAHENoQUD48a7TkNzX8BsiAFxKCB4U+BOBkgwAAsAiGcWMs58QAAAABJRU5ErkJggg==\\\");\\n}\\n.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEODJBRDc2RTYyNzMxMUUzQTMxN0IxNjAwN0JBOUE4OSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEODJBRDc2RjYyNzMxMUUzQTMxN0IxNjAwN0JBOUE4OSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ4MkFENzZDNjI3MzExRTNBMzE3QjE2MDA3QkE5QTg5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ4MkFENzZENjI3MzExRTNBMzE3QjE2MDA3QkE5QTg5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+crpRPgAAAOhJREFUeNpi+P//vycQP/tPfQAy05MRxGBgYJBkoA14DrLgPwMNARMDjcGgsCAMGkdHyLKBiNQgDoomIOYH4uOkJiViLNgMxGxIlpyhtgUgsAaImaHqhYH4IrUtAIHlSJaIAvFValsAAvOBmBGqTxKIb1HbAhCYhWSJDBDfobYFIBAO1QvCNtS2YA6SD6SB+DY1LViIFNFiQHydmnGwEi0VXaZmKloHxKxQ9YJAfJ6a+WAbWk4+Re2cLAFVxwPER0lNEcSUpjZALAHEW4DYitTCdHjUaM9paP4LkAUpIAYNDH8KxMkAAQYAlwMhmq8XxigAAAAASUVORK5CYII=\\\");\\n}\\n.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_panel_corner {\\n right: 80px;\\n}\\n.webix_nav_button_corner.webix_nav_button_prev {\\n bottom: 9px;\\n right: 44px;\\n}\\n.webix_nav_button_corner.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_corner.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_button_corner.webix_nav_button_next {\\n bottom: 9px;\\n right: 8px;\\n}\\n.webix_nav_button_corner.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_corner.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_panel_side {\\n margin: 0 auto;\\n left: 0;\\n width: 100%;\\n}\\n.webix_nav_button_side {\\n height: 86px;\\n line-height: 86px;\\n width: 56px;\\n top: 50%;\\n margin-top: -43px;\\n}\\n.webix_nav_button_side.webix_nav_button_next {\\n left: auto;\\n right: 16px;\\n}\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTc4MTkxODY2MzBGMTFFMzk1MUQ4RTNCRjNCMUVFRUMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTc4MTkxODU2MzBGMTFFMzk1MUQ4RTNCRjNCMUVFRUMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4NjlGM0NFNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA4NjlGM0NGNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+D/KEcQAAAOhJREFUeNqs1jsOwjAMBuCKhR2uxsLGxg1a+hD0wVGYGJC4DgssnAFVQjLukKWk/WM7lv4OqfQ1UdLWCRGtOTdOz3lwtpzEkuFyp/9KreiX/JVa0DdNV6ZF9zRfmQYdcgbwQYNGhccDXQzYN4jgXIOa4bkntgAuNKgaDtlNMRx69hoAlxpUBEvfawRXGnRIjeBFIq8e3F9KZ5mDWXbS5QeBEjQYDEULALbSwy8GEYrARvpBUYNTaGkBfagZHKMIrKU/vioW6NANAE+aZuIVE3RoHxN06NUDHq2t5Ipz4Xw4T87O2vT+BBgAeQQKvezNqP0AAAAASUVORK5CYII=\\\");\\n}\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_button_side.webix_nav_button_prev {\\n left: 16px;\\n right: auto;\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjIzRTVCQkY2MzBGMTFFM0FDNTBDNzdDRkQ0NTI0NzciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjIzRTVCQkU2MzBGMTFFM0FDNTBDNzdDRkQ0NTI0NzciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4NjlGM0NFNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA4NjlGM0NGNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+wRT1eAAAAM9JREFUeNqs1jsKwlAQBdDBxlL3ZmVlmRXYaaVbCYg7kti4BQu1e85AhBDfZz73wm1ewsmfDKWUKNgNd+C+uVfuOgoe0n8uaFDyQoOSOxqU7NDgUfaDgxZUDWpRE6hBzWALdYE11A2W0BCYQ8PgHIWAUxQG/lAoKF0Q0ZLq+ZA1o35qnO3eevlweL4AgXOL5yhc2hCCa0d0w63744I1T9MMa989E2z5/NSw9Retgj3DRAveeseeGnyLDGgl+BkdJXNwH0WlHfcxDr09d/UVYADVjwptZ8mPvQAAAABJRU5ErkJggg==\\\");\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_carousel > .webix_scroll_x,\\n.webix_carousel > .webix_scroll_y {\\n background-color: rgba(0, 0, 0, 0);\\n}\\n.webix_dark .webix_nav_inactive {\\n background-color: #95a5a6;\\n}\\n.webix_dark .webix_nav_active {\\n background-color: #7f8c8d;\\n}\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSIURgotfwAAASxJREFUSMfNlbErhlEUh5/vJZOSQSijshgsFiklhdj0lcHw5SP7uX+A8we4d1c+g2RgsIjIxmCxGCzKRO9bMjCSWE5WpXPrO9MZbs9T5577u7XNrTgPtIBBfKsEmkUmOMZsFZngv5KCzNW2gmsbbT2H4AZY0CAVcOUtuAXmNMi7xtQF7HgK7oBZDfKmMXUAB8Cil+AemNEgrwbfB5a8LvnB4C8aU83Gsuy1RY/AtAYpDb4NNDzXtKFBnqyvA+ve72BXYxqy/shyy1UwDFxqTP0a5BvYAPa8X/KISfo0yBewChx6R8UocKEx9ZpkBTj2zqIx4Fxj6tEgn7aqZ95RMQ6cakzdGuTDxuUedhPAicY0AEz+dbjzn3E9ZX9ue3w4ZUZ+VQBrQJUB/gw0fwC/UlVpnH2f9AAAAABJRU5ErkJggg==\\\");\\n}\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSENCUzWfAAAAS1JREFUSMfN1TFLXEEUhuFnr8FKCBaGiK2FRQobG7GSgBG2E8IWFmE3wX7uD3B+QOb2QpaAiMWmsAkJBtMEizQ2FmmCXcIuhBRpDZI0g7XCXNhTD+8L53znTGf/ddrGEIvK1hiDqiW4zBxWLcFvJZWWayoEz3Mbz9sSfIl1mKCLr20I3sTUzMY6/MEzXJQWdHEcUzOTJVu4LD3kHRxlyW88xbfSKerldnViHX5lyffSMX2BgywZYxNXpffgVY6uWIcfWVpUMMQIYmqW8Lak4BB7sQ7/Ymoe4QzLpQQj9GMdbmJqFvAZK6WGfILdDJ/HJzwpFdOP6MU6/I2peYhTrJZctH6sw3VMzRw+YK30qdiIqXmM91i/b+Qe3OHNu6n/cMYt8icVXmLSAvwnBv8B+EFU7qlZ1xIAAAAASUVORK5CYII=\\\");\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSI77dsQJgAAARxJREFUSMet1jFqAkEUxvH/rkIqLVN5ES2CjScQG6tUESx3SWOMLKgggt7BC6SxsnIr9w4ewAsEEis3RTBE3N3ZmfemHB4/HsPMm89L0xTJilbrLrAAGsAWeKkKwTEw/bfVAy6ea6cZ4HV9+8ogwMm6UwMI8Owrg5MoDDa+MjgF8LXBUqgtaERdwELUFcxFJWAmKgXvUA3wBtUC/1BNEKBCra4KXjt9MNScbadYJd7t9nGSVIGnnJpOnCRf7VbzYNMpURi8A7OCumW0Wr9aodrw7T39hedS+P5FhcFYCme/fSGcP6UEcPE8dYTNk98BLvdHWcLlf1ML2CVMzIC3gpK+U5YywEdJQMuDP50CmuGMt55C6B0AI+AR+ACGPw26r6m12WOpAAAAAElFTkSuQmCC\\\");\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSE1IU5u4gAAAW1JREFUSMet1rtOwzAUgOG/5jbBwsQD8BAwIAa2TggegjmRgELbuFeo1GRlQEJMMDN264CUiYdgg0dolzIkFUEk9nHSbLGtT76cc+xaMA53gUegDnwCgfa9Vyp8CngCToFNYB940WF0WRWt57SPqsAK+C7oG+kwuiqLdg3992Xgtelk8jGN4w3gqGDMyTSOZ8eHB+8uM0X7XhMYGMbd6TC6dkIzcH8VsMr+aN9rCeCGEyqEhzZY5TWmcM8C3zihKdy2wIMiWJmWURZWtk1P4a4FvnVCUziwwP0srKQBLYSbALXFYuGU1zqMNBAYhrRUiSI0s/RvKcdZNoChcQt8Tz5TKSg/fQdQFqdJcJvAXha0Z1QCDixgW577drCbBxZXKRkYyOtpkm6lwf+VPwH7VcC/d5Qd7EjA39s0KQQ2UIvvfbZ3zoEHU2Rp3+u4vlDGqwSX6N4qwSX6ltMelAUB1oELYA6cAV/poTxXeZ/+AOFqn1e/Gh7yAAAAAElFTkSuQmCC\\\");\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_list_item {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 2px 12px;\\n line-height: 31px;\\n cursor: pointer;\\n border-bottom: 1px solid #EDEFF0;\\n text-align: left;\\n border-color: #EDEFF0;\\n}\\n.webix_list_icon {\\n vertical-align: middle;\\n margin-right: 4px;\\n}\\n.webix_list_item.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_list_item.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_list_item.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_list .webix_list_item.webix_selected {\\n border-bottom: 1px solid #EDEFF0;\\n padding: 2px 12px;\\n}\\n.webix_group {\\n position: relative;\\n}\\n.webix_group_back,\\n.webix_group_back.webix_selected {\\n position: relative;\\n background: #F4F5F9;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_arrow_icon {\\n position: absolute;\\n top: 50%;\\n bottom: 50%;\\n margin-top: -10px;\\n right: 8px;\\n width: 20px;\\n height: 20px;\\n line-height: 20px;\\n color: #475466;\\n font-size: 20px;\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_arrow_icon:before {\\n content: '\\\\F003';\\n}\\n.webix_group_back {\\n padding-left: 33px;\\n}\\n.webix_group_back .webix_arrow_icon {\\n left: 8px;\\n}\\n.webix_group_back .webix_arrow_icon:before {\\n content: '\\\\F002';\\n}\\n.dhx_pagelist {\\n position: relative;\\n}\\n.webix_list_count {\\n float: right;\\n width: 25px;\\n font-size: 14px;\\n text-align: center;\\n margin-right: 45px;\\n box-shadow: 0 1px 0 #000000;\\n text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.6);\\n}\\n.webix_unit_header {\\n padding: 0 12px;\\n line-height: 35px;\\n text-align: left;\\n background-color: #F4F5F9;\\n}\\n.webix_list-x .webix_list_item {\\n display: inline-block;\\n vertical-align: top;\\n border-right: 1px solid #EDEFF0;\\n border-bottom: none;\\n border-color: #EDEFF0;\\n}\\n.webix_list-x .webix_list_item.webix_selected {\\n border-left: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n padding-left: 11px;\\n}\\n.webix_list-x .webix_scroll_cont {\\n display: inline-block;\\n}\\n.webix_view.webix_list-x {\\n white-space: nowrap;\\n}\\n/* Style for disabled items */\\n.webix_list_item.webix_disabled {\\n color: #8b949e;\\n background-color: #FFFFFF;\\n cursor: not-allowed;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_list_item.webix_disabled:focus {\\n background-color: #FFFFFF;\\n}\\n.webix_list_item.webix_disabled .webix_badge {\\n background-color: #eab993;\\n}\\n.webix_list_item.webix_disabled .webix_submenu_icon {\\n visibility: hidden;\\n}\\n/*button of pager*/\\n.webix_view.webix_pager {\\n padding: 3px 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background-color: transparent;\\n}\\n.webix_pager_item,\\n.webix_pager_item_selected {\\n padding: 0 6px;\\n text-align: center;\\n height: 100%;\\n width: auto;\\n min-width: 32px;\\n margin: 0 2px;\\n cursor: pointer;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border-radius: 2px;\\n}\\n.webix_pager_item .webix_icon,\\n.webix_pager_item_selected .webix_icon {\\n line-height: 0;\\n font-size: 17px;\\n}\\n.webix_pager_item {\\n background: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_pager_item:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:active {\\n background-color: #daddeb;\\n}\\n.webix_pager_item:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:active {\\n background-color: #daddeb;\\n}\\n/*selected button of pager*/\\n.webix_pager_item_selected {\\n cursor: default;\\n}\\n.webix_pager_item_selected:hover {\\n background-color: #1992af;\\n}\\n.webix_pager_item_selected:focus {\\n background-color: #1992af;\\n}\\n.webix_pager_item_selected:active {\\n background-color: #17839d;\\n}\\n.webix_animation .webix_ss_header {\\n position: relative;\\n z-index: 1;\\n}\\n.webix_animation .webix_ss_vscroll_header {\\n z-index: 1;\\n}\\n.webix_animation .webix_ss_footer,\\n.webix_animation .webix_vscroll_x {\\n position: absolute;\\n bottom: 0px;\\n z-index: 1;\\n}\\n/*helper for allowing selection*/\\n.webix_allow_selection {\\n -moz-user-select: text;\\n -webkit-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n/*default item in dataview*/\\n.webix_dataview_item {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 2px 12px;\\n line-height: 31px;\\n cursor: pointer;\\n border-bottom: 1px solid #EDEFF0;\\n text-align: left;\\n border-color: #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_dataview_item.webix_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_dataview_item.webix_disabled {\\n color: #94A1B3;\\n}\\n.webix_dataview_item.webix_selected.webix_disabled {\\n box-shadow: inset 2px 0 #94A1B3;\\n}\\n.webix_dataview_item .webix_icon {\\n font-size: 20px;\\n}\\n/*default item in selected state*/\\n.webix_dataview_item.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n border-bottom: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_dataview_item.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_dataview_item.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_dataview_item.tiles {\\n border: 1px solid #EDEFF0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_drag_zone > .webix_dataview_item.tiles {\\n margin: 0 !important;\\n}\\n.webix_dataview .webix_scroll_cont {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n/*chart container*/\\n.webix_chart {\\n position: relative;\\n font-family: Roboto, sans-serif;\\n font-size: 13px;\\n color: #475466;\\n overflow: hidden;\\n z-index: 1;\\n}\\n.webix_chart canvas {\\n position: absolute;\\n}\\n/*labels*/\\n.webix_canvas_text {\\n position: absolute;\\n text-align: center;\\n overflow: hidden;\\n white-space: nowrap;\\n font-size: 12px;\\n z-index: 80;\\n}\\n.webix_chart .webix_canvas_text {\\n border-radius: 4px;\\n}\\n.webix_chart .webix_canvas_text.webix_inner_text_dark {\\n color: #475466;\\n text-shadow: 0 0 4px #ffffff;\\n padding: 0 2px;\\n}\\n.webix_chart .webix_canvas_text.webix_inner_text_light {\\n color: #ffffff;\\n text-shadow: 0 0 4px #475466;\\n padding: 0 2px;\\n}\\n/*map*/\\n.webix_map_img {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n border: 0px;\\n opacity: 0;\\n -webkit-user-select: none;\\n}\\n/*scales*/\\n.webix_axis_item_y {\\n position: absolute;\\n height: 18px;\\n line-height: 18px;\\n margin-top: -4px;\\n text-align: right;\\n}\\n.webix_axis_item_x {\\n padding-top: 2px;\\n}\\n.webix_axis_title_x {\\n text-align: center;\\n font-size: 13px;\\n}\\n.webix_axis_title_y {\\n text-align: center;\\n font-family: Verdana;\\n font-size: 13px;\\n transform: rotate(-90deg);\\n padding-left: 3px;\\n}\\n/*legend block*/\\n.webix_chart_legend {\\n position: absolute;\\n z-index: 81;\\n}\\n.webix_chart_legend_item {\\n height: 18px;\\n line-height: 18px;\\n padding: 2px;\\n cursor: pointer;\\n}\\n.webix_chart_legend_item.hidden {\\n color: #cfd5dd;\\n}\\n.webix_axis_item_y.webix_radar {\\n color: #555;\\n font-size: 11px;\\n padding-right: 3px;\\n height: 13px;\\n line-height: 13px;\\n margin-top: 0px;\\n}\\n.webix_canvas_text.webix_axis_radar_title {\\n margin-top: 0px;\\n padding-top: 0px;\\n color: #74869f;\\n font-size: 12px;\\n}\\n.webix_axis_item_y,\\n.webix_axis_item_x {\\n color: #74869f;\\n}\\n/*data frame*/\\n.webix_chart_frame {\\n background-color: #a0cfef;\\n height: 100%;\\n opacity: 0.3;\\n position: absolute;\\n top: 0;\\n z-index: 82;\\n border-left: 1px solid #3498db;\\n border-right: 1px solid #3498db;\\n cursor: w-resize;\\n}\\n.webix_chart_resizer {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAYAAAAx8TU7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTJCMjdFNENBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTJCMjdFNERBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5MkIyN0U0QUFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5MkIyN0U0QkFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Powz/icAAAAaSURBVHjaYmBgYDBjgAA4zcSABQysIECAAQBn+ACx2PqtbAAAAABJRU5ErkJggg==\\\");\\n background-position: 3px center;\\n background-repeat: no-repeat;\\n border-radius: 2px;\\n height: 20px;\\n bottom: 0;\\n width: 11px;\\n z-index: 83;\\n position: absolute;\\n background-color: #fff;\\n border: 1px solid #cccccc;\\n cursor: w-resize;\\n}\\n.webix_chart_resizer:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_wresize_cursor {\\n cursor: w-resize;\\n}\\n/* donut center text */\\n.webix_donut_center_text {\\n display: inline-block;\\n line-height: normal;\\n white-space: normal;\\n vertical-align: middle;\\n}\\n.webix_dt_editor {\\n position: absolute;\\n z-index: 2;\\n overflow: visible;\\n background: #FFFFFF;\\n}\\n.webix_dt_editor input,\\n.webix_dt_editor select {\\n width: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 0 11px;\\n margin: 0;\\n border: 1px solid #ffd700;\\n height: 100%;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_dt_editor input[type=\\\"checkbox\\\"] {\\n margin: 11px 13px 0px;\\n height: auto;\\n width: auto;\\n}\\n.webix_dt_editor select {\\n padding: 0 7px;\\n}\\n.webix_clipbuffer {\\n width: 2000px;\\n height: 1px;\\n padding: 0;\\n margin: 0;\\n border: 0;\\n left: 0px;\\n top: 0px;\\n white-space: pre-wrap;\\n position: fixed;\\n opacity: 0;\\n pointer-events: none;\\n cursor: default;\\n}\\n.webix_dt_editor.webix_password_editor {\\n overflow: hidden;\\n}\\n.webix_password_editor input {\\n padding-right: 26px;\\n}\\n.webix_password_editor .webix_icon {\\n position: absolute;\\n right: 4px;\\n top: 50%;\\n margin-top: -9px;\\n font-size: 18px;\\n cursor: pointer;\\n color: #94A1B3;\\n}\\n.webix_password_editor .webix_icon:hover {\\n color: #1CA1C1;\\n}\\n.webix_column,\\n.webix_hcolumn {\\n position: absolute;\\n top: 0px;\\n}\\n.webix_cell {\\n overflow: hidden;\\n line-height: 33px;\\n white-space: nowrap;\\n}\\n.webix_hcell {\\n width: 100%;\\n overflow: hidden;\\n}\\n.webix_cell,\\n.webix_hcell {\\n background: inherit;\\n font: inherit;\\n text-align: inherit;\\n color: inherit;\\n}\\n.webix_ss_body {\\n overflow: hidden;\\n position: relative;\\n}\\n.webix_hs_center,\\n.webix_hs_right,\\n.webix_hs_left,\\n.webix_ss_center,\\n.webix_ss_right,\\n.webix_ss_left {\\n overflow: hidden;\\n float: left;\\n position: relative;\\n}\\n.webix_ss_center_scroll {\\n height: 100%;\\n position: relative;\\n overflow: hidden;\\n min-height: 1px;\\n}\\n.webix_ss_hscroll {\\n bottom: 0px;\\n}\\n.webix_ss_vscroll {\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n z-index: 2;\\n}\\n.webix_ss_vscroll_footer {\\n position: absolute;\\n bottom: 0px;\\n right: 0px;\\n border-left: 1px solid #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n z-index: 1;\\n}\\n.webix_ss_vscroll_header {\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n border-left: 1px solid #DADEE0;\\n border-bottom: 1px solid #DADEE0;\\n z-index: 1;\\n}\\n.webix_dtable {\\n position: relative;\\n cursor: default;\\n z-index: 0;\\n}\\n.webix_ss_footer,\\n.webix_ss_header {\\n clear: both;\\n overflow: hidden;\\n}\\n.webix_table_cell,\\n.webix_view.webix_table_cell,\\n.webix_block_selection,\\n.webix_hcell,\\n.webix_cell {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_table_cell {\\n font-size: 14px;\\n}\\n.webix_block_selection {\\n position: absolute;\\n}\\n.webix_ss_sort_asc,\\n.webix_ss_sort_desc {\\n position: absolute;\\n top: 50%;\\n right: 2px;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 20px;\\n width: 24px;\\n height: 24px;\\n line-height: 24px;\\n margin-top: -12px;\\n float: none;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_ss_sort_asc.webix_ss_sort_single,\\n.webix_ss_sort_desc.webix_ss_sort_single {\\n width: 20px;\\n text-align: center;\\n}\\n.webix_ss_sort_asc:before {\\n content: '\\\\F004';\\n}\\n.webix_ss_sort_desc:before {\\n content: '\\\\F001';\\n}\\n.webix_ss_sort_num {\\n position: absolute;\\n top: 0;\\n right: 0;\\n height: 12px;\\n line-height: 12px;\\n font-family: Roboto, sans-serif;\\n font-size: 10px;\\n text-align: right;\\n color: #1CA1C1;\\n}\\n.webix_ss_sort_single .webix_ss_sort_num {\\n display: none;\\n}\\n.webix_hcell .webix_excel_filter {\\n position: absolute;\\n top: 50%;\\n right: 2px;\\n width: 20px;\\n height: 20px;\\n line-height: 20px;\\n margin-top: -10px;\\n vertical-align: middle;\\n text-align: center;\\n cursor: pointer;\\n color: #94A1B3;\\n}\\n.webix_hcell .webix_excel_filter:hover {\\n color: #1CA1C1;\\n}\\n.webix_excel_filter ~ .webix_ss_sort_asc,\\n.webix_excel_filter ~ .webix_ss_sort_desc {\\n right: 24px;\\n}\\n.webix_hcell.webix_ss_excel_filter {\\n position: relative;\\n}\\n.webix_hcell.webix_ss_filter_active .webix_excel_filter {\\n color: #1CA1C1;\\n}\\n.webix_hcell.webix_ss_filter_active .webix_excel_filter:hover {\\n color: #17839d;\\n}\\n.webix_hcell.webix_ss_filter {\\n padding: 3px 5px 3px 5px;\\n}\\n.webix_hcell .webix_tree_close,\\n.webix_hcell .webix_tree_open {\\n margin-right: 5px;\\n}\\n.webix_table_checkbox,\\n.webix_hcell input[type=\\\"checkbox\\\"] {\\n margin: 0px 1px 2px;\\n vertical-align: middle;\\n}\\n.webix_ss_filter select,\\n.webix_ss_filter input {\\n width: 100%;\\n font-size: inherit;\\n color: #475466 !important;\\n height: 38px;\\n margin-top: -2px;\\n padding: 0 3px;\\n vertical-align: top;\\n border: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-family: Roboto, sans-serif;\\n}\\n.webix_richfilter {\\n margin-top: 1px;\\n line-height: 32px;\\n}\\n.webix_ss_filter select {\\n padding: 3px;\\n}\\n/*headers and footers*/\\n.webix_ss_header,\\n.webix_hcolumn,\\n.webix_ss_vscroll_header,\\n.webix_dd_drag_column,\\n.webix_hs_left,\\n.webix_hs_center,\\n.webix_hs_right {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n background: #F4F5F9;\\n}\\n.webix_ss_footer,\\n.webix_ss_footer .webix_hcolumn,\\n.webix_ss_footer .webix_hs_left,\\n.webix_ss_footer .webix_hs_center,\\n.webix_ss_footer .webix_hs_right,\\n.webix_ss_footer div.webix_ss_vscroll_footer {\\n background: #fafafa;\\n}\\n.webix_hcell.webix_measure_size {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n/*content in header and footer*/\\n.webix_hcell {\\n padding: 0px 12px 0px 12px;\\n text-align: left;\\n}\\n/*borders in header and footer*/\\n.webix_ss_header .webix_hcolumn .webix_hcell,\\n.webix_ss_header .webix_span {\\n border-right: 1px solid #DADEE0;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_ss_footer .webix_hcolumn .webix_hcell,\\n.webix_ss_footer .webix_span {\\n border-right: 1px solid #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n}\\n/*remove rightmost borders*/\\n.webix_hs_right .webix_hcell.webix_last,\\n.webix_hs_center .webix_hcell.webix_last {\\n border-right-width: 0px;\\n}\\n/*right inner border*/\\n.webix_column.webix_last > div {\\n border-right-width: 0px;\\n}\\n/*borders between split areas*/\\n.webix_ss_right .webix_column.webix_first > div,\\n.webix_hs_right .webix_first {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_ss_left .webix_column.webix_last > div {\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_last_topcell.webix_cell {\\n border-bottom: 1px solid #DADEE0;\\n}\\n/*normal data cell of the table*/\\n.webix_column > div,\\n.webix_table_cell {\\n border-right: 1px solid #EDEFF0;\\n padding: 0 12px;\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_column,\\n.webix_hcolumn {\\n text-align: left;\\n}\\n/*header selection in column mode, column dnd*/\\n.webix_ss_header .webix_sel_hcell,\\n.webix_ss_footer .webix_sel_hcell,\\n.webix_ss_header .webix_dd_over_column {\\n background-color: #c9eaf5;\\n}\\n.webix_block_selection {\\n z-index: 2;\\n background: rgba(0, 0, 0, 0.1);\\n border: 2px solid #EDEFF0;\\n}\\n.webix_dd_drag {\\n white-space: nowrap;\\n overflow: hidden;\\n border-left: 1px solid #EDEFF0;\\n height: 36px;\\n}\\n.webix_dd_drag > div {\\n display: inline-block;\\n vertical-align: top;\\n background: #FFFFFF;\\n border-top: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n border-bottom: 1px solid #EDEFF0;\\n padding: 5px 12px;\\n height: 36px;\\n line-height: 28px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_dd_drag_column {\\n padding: 5px 10px 5px 10px;\\n}\\n.webix_column > .webix_drag_over.webix_cell {\\n background-color: #e6e6e6;\\n color: #475466;\\n}\\n.webix_column > .webix_drag_over.webix_cell.webix_row_select,\\n.webix_column > .webix_drag_over.webix_cell.webix_cell_select {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_column > .webix_drag_over.webix_cell.webix_row_select:focus,\\n.webix_column > .webix_drag_over.webix_cell.webix_cell_select:focus {\\n background: #edeff5;\\n}\\n.webix_cell.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_invalid_cell {\\n position: relative;\\n}\\n.webix_invalid_cell:after {\\n content: \\\"\\\";\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n width: 0px;\\n height: 1px;\\n border-top: 8px solid #f44;\\n border-left: 8px solid transparent;\\n}\\n/*selection*/\\n.webix_column > div.webix_cell_select,\\n.webix_column > div.webix_column_select,\\n.webix_column > div.webix_row_select {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_column > div.webix_cell_select:focus,\\n.webix_column > div.webix_column_select:focus,\\n.webix_column > div.webix_row_select:focus {\\n background: #edeff5;\\n}\\n/*extra borders, for selection in cell mode*/\\n.webix_column > div.webix_cell_select {\\n border-bottom: 1px solid #EDEFF0;\\n border-left: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n padding-top: 0px;\\n padding-left: 11px;\\n}\\n.webix_ss_right .webix_column.webix_first > div.webix_cell_select {\\n padding-left: 12px;\\n}\\n/*extra borders, for selection in row mode*/\\n.webix_column > div.webix_row_select {\\n border-bottom: 1px solid #EDEFF0;\\n padding-top: 0px;\\n}\\n/*extra borders for selection in column mode*/\\n.webix_column > div.webix_column_select {\\n border-left: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n padding-left: 11px;\\n}\\n.webix_cell.webix_dtable_colrow,\\n.webix_cell.webix_dtable_subrow,\\n.webix_dtable_subview {\\n position: absolute;\\n left: 0px;\\n top: 0px;\\n background-color: #FFFFFF;\\n width: 100%;\\n padding-right: 30px;\\n padding-left: 12px;\\n padding-top: 1px;\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_cell.webix_dtable_colrow.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_cell.webix_dtable_colrow.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_dtable_subrow {\\n border-top: 1px solid #EDEFF0;\\n text-align: right;\\n}\\n.webix_dtable_subview {\\n background: #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n padding: 0px 0px 0px 0px;\\n padding-left: 10px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.number .webix_cell {\\n text-align: right;\\n}\\n.webix_rotate {\\n transform: rotate(-90deg);\\n line-height: normal;\\n}\\n.webix_measure_rotate {\\n line-height: normal;\\n white-space: normal;\\n padding: 10px;\\n}\\n.webix_span_layer,\\n.webix_span_layer_top {\\n background: transparent;\\n position: absolute;\\n left: 0px;\\n top: 0px;\\n height: 0px;\\n width: 0px;\\n overflow: visible;\\n}\\n.webix_span_layer_top {\\n z-index: 1;\\n}\\n.webix_ss_right .webix_span_layer,\\n.webix_ss_right .webix_span_layer_top {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_dtable_span {\\n position: absolute;\\n background: #FFFFFF;\\n text-align: left;\\n}\\n.webix_dtable_span.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_dtable_span.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_hcell .webix_input_icon {\\n background-color: #DADEE0;\\n}\\n.webix_area_selection_layer {\\n position: absolute;\\n z-index: 2;\\n}\\n.webix_area_selection {\\n position: absolute;\\n background: #475466;\\n}\\n.webix_dtable_focused .webix_area_selection {\\n background-color: #3f4a5a;\\n}\\n.webix_area_selection_top,\\n.webix_area_selection_bottom {\\n height: 2px;\\n}\\n.webix_area_selection_left,\\n.webix_area_selection_right {\\n width: 2px;\\n}\\n.webix_area_selection_handle {\\n position: absolute;\\n width: 6px;\\n height: 6px;\\n border: 1px solid #fff;\\n background: #475466;\\n cursor: crosshair;\\n margin: -6px 0 0 -6px;\\n}\\n.webix_topcell {\\n position: relative;\\n background: #FFFFFF;\\n z-index: 1;\\n}\\n.webix_dtable .webix_resize_handle_x .webix_handle_content,\\n.webix_dtable .webix_resize_handle_y .webix_handle_content {\\n border: none;\\n background-color: #1CA1C1;\\n}\\n.webix_dtable_focused .webix_column > div.webix_row_select,\\n.webix_dtable_focused .webix_column > div.webix_column_select {\\n background: #edeff5;\\n}\\n.webix_window {\\n position: absolute;\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_window:focus {\\n box-shadow: 0 1px 14px 0 rgba(0, 0, 0, 0.12), 0 4px 10px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_win_body {\\n overflow: hidden;\\n}\\n.webix_window,\\n.webix_win_content,\\n.webix_win_body,\\n.webix_win_body > .webix_view {\\n border-radius: 0px;\\n}\\n.webix_win_body > .webix_view .webix_cal_month {\\n border-radius: 0px;\\n}\\n.webix_win_head {\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_win_title {\\n text-align: center;\\n}\\n/*----------------------------*/\\n/* DO NOT CHANGE STYLES BELOW */\\n/*----------------------------*/\\n.webix_win_content {\\n height: auto;\\n width: auto;\\n overflow: hidden;\\n}\\n.webix_modal {\\n width: 100%;\\n height: 100%;\\n position: fixed;\\n top: 0;\\n left: 0;\\n background-color: black;\\n opacity: 0.2;\\n}\\n.webix_modalbox_inside {\\n pointer-events: none;\\n}\\n.webix_point_top,\\n.webix_point_right,\\n.webix_point_bottom,\\n.webix_point_left {\\n position: absolute;\\n}\\n.webix_point_top,\\n.webix_point_bottom {\\n width: 13px;\\n height: 7px;\\n}\\n.webix_point_left,\\n.webix_point_right {\\n width: 7px;\\n height: 13px;\\n}\\n.webix_point_top,\\n.webix_point_bottom,\\n.webix_point_right,\\n.webix_point_left {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAArCAIAAADHSy4DAAAABnRSTlMAAAAAAABupgeRAAAACXBIWXMAAABPAAAATwFjiv3XAAAAhElEQVR4nMXVQQoAIQhAUe9/FC/pLAYayUm/EeT6YWGmoqpWharKG7n+XK5nt9L/LurMeV27oZHrReN0M6Oupr5S1GU0vhN1J7L27hp1QYXX1WtE5UxnNXI0ep7+pEGRpr95ooWObbXUm1npXWkFaF3vTqj9c+h8pVOb7gK6Yeje4tvwARi4FgcAh2V/AAAAAElFTkSuQmCC\\\");\\n}\\n.webix_point_top {\\n background-position: 0 -36px;\\n}\\n.webix_point_bottom {\\n background-position: 0 0;\\n}\\n.webix_point_right {\\n background-position: 0 -22px;\\n}\\n.webix_point_left {\\n background-position: 0 -9px;\\n}\\n.webix_resize_handle {\\n position: absolute;\\n z-index: 2;\\n width: 15px;\\n height: 15px;\\n bottom: 0px;\\n line-height: 15px;\\n right: -1px;\\n text-align: center;\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);\\n cursor: nw-resize;\\n}\\n.webix_resize_frame {\\n position: absolute;\\n opacity: 0.1;\\n background: #1CA1C1;\\n display: block;\\n border: 1px solid #0f5768;\\n box-shadow: 1px 3px 6px #000;\\n}\\n.webix_resize_cursor {\\n cursor: nw-resize;\\n}\\n.webix_shadow_medium,\\n.webix_shadow_small,\\n.webix_shadow_big {\\n position: relative;\\n}\\n.webix_shadow_medium {\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_shadow_small {\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_shadow_big {\\n box-shadow: 0 1px 14px 0 rgba(0, 0, 0, 0.12), 0 4px 10px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_shadow_none {\\n box-shadow: none !important;\\n}\\n.webix_toolbar.webix_shadow_small,\\n.webix_toolbar.webix_shadow_medium,\\n.webix_toolbar.webix_shadow_big {\\n z-index: 1;\\n}\\n/*basis*/\\n.webix_tree .webix_scroll_cont > .webix_tree_leaves {\\n display: inline-block;\\n padding: 8px;\\n}\\n.webix_tree_item {\\n clear: both;\\n height: 24px;\\n line-height: 24px;\\n white-space: nowrap;\\n}\\n.webix_tree_item.webix_selected {\\n background: transparent;\\n}\\n.webix_tree_item.webix_selected span {\\n padding: 4px 10px 4px 4px;\\n margin-left: -4px;\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_tree_item.webix_selected span:focus {\\n background: #edeff5;\\n}\\n.webix_tree_item.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_tree_checkbox {\\n margin: 0px;\\n padding: 0px;\\n vertical-align: top;\\n height: 100%;\\n width: 13px;\\n}\\n.webix_indeterminate {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAZUlEQVR4nGPw8Mhldw9ObXAPTp1JBG4AqWcAawhNs2QgArgFp1q5haTVgzTNZCABuIekzSJdU3DqTOpoqq+vZ3IPSfsPwyD+INJECNBREzSeGkAxTYwG16B0a3CKICXtgTSA0h4ApZxpTQmN4jEAAAAASUVORK5CYII=\\\");\\n background-repeat: no-repeat;\\n background-position: left center;\\n height: 100%;\\n width: 13px;\\n margin-top: 0 !important;\\n display: inline-block;\\n}\\n.webix_measure_size {\\n font-family: Roboto, sans-serif;\\n}\\n.webix_measure_size input,\\n.webix_measure_size textarea,\\n.webix_measure_size select {\\n width: 5px;\\n}\\n.webix_measure_size div {\\n float: none;\\n}\\n.webix_measure_size div,\\n.webix_measure_size a {\\n display: inline-block !important;\\n position: static !important;\\n}\\n.webix_tree_close,\\n.webix_tree_open,\\n.webix_tree_none,\\n.webix_tree_folder,\\n.webix_tree_file,\\n.webix_tree_folder_open {\\n display: inline-block;\\n vertical-align: top;\\n width: 20px;\\n height: 100%;\\n cursor: pointer;\\n margin: 0;\\n background-repeat: no-repeat;\\n}\\n.webix_tree_close,\\n.webix_tree_open,\\n.webix_tree_none {\\n background-position: center center;\\n}\\n.webix_cell .webix_tree_close,\\n.webix_cell .webix_tree_open,\\n.webix_cell .webix_tree_none {\\n background-color: transparent;\\n}\\n.webix_tree_folder,\\n.webix_tree_file,\\n.webix_tree_folder_open {\\n background-position: 0 center ;\\n}\\n.webix_tree_file,\\n.webix_tree_folder,\\n.webix_tree_folder_open {\\n margin: 0px 2px;\\n}\\n.webix_tree_leaves .webix_tree_leaves {\\n display: block;\\n margin-left: 20px;\\n}\\n.webix_line_tree .webix_tree_leaves {\\n margin-left: 0px;\\n}\\n.webix_tree_file {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAInjI+JwM26XAtPyTnTfU5veGyXJ2ZhaRpoSq0AicKlLNJftNojyCMFADs=\\\");\\n}\\n.webix_tree_folder {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAIhjI+py90AI3Syvoqj27mfnn2gZYxkYEpiCqypa27yTC8FADs=\\\");\\n}\\n.webix_tree_folder_open {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAIjjI+py90AI3SyvorjkQ7pDAJBSJaTaGpjKq7pxsJmR9c2UwAAOw==\\\");\\n}\\n.webix_tree_img {\\n background-color: #FFFFFF;\\n float: left;\\n width: 24px;\\n height: 24px;\\n background-position: 0 0;\\n}\\n.webix_tree_line1 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIxjI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKrKg68GbjNGVTeGZmeiRP+IphBbi0EgrAAA7\\\");\\n}\\n.webix_tree_line2 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIpjI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKgLuC7/mTNf2jef6zvc+XgAAOw==\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_tree_line3 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAI1jI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKgLuC78VC9KeveGYPpsJTwFmfCeixahABoQRXQEAOw==\\\");\\n}\\n.webix_tree_line4 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIjjI+py+0Po5y02ouz3rxDAIZi+HGAiW6nmmqr22avHGMzUwAAOw==\\\");\\n}\\n.webix_cal_month {\\n height: 24px;\\n line-height: 24px;\\n text-align: center;\\n position: relative;\\n font-size: 14px;\\n font-weight: bold;\\n padding: 0 0 6px;\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n}\\n.webix_cal_prev_button,\\n.webix_cal_next_button {\\n cursor: pointer;\\n position: absolute;\\n top: 0;\\n width: 24px;\\n height: 24px;\\n background-repeat: no-repeat;\\n background-position: 8px 6px;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_cal_prev_button {\\n left: 0;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAASUlEQVR42p2QMQoAQQgD79EZ0Mqn5xCu2cPdYgUbJ0rMMxXgLeiuKq8gsJAz8weQ0QiwJEfECnr4wdlEnwJ68+yyhReC+c85oRecj0Um+pmo9wAAAABJRU5ErkJggg==\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_cal_next_button {\\n right: 0;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAARElEQVR42qXPsQoAIAhF0T76PdDJT7cUmtQhcmk4N8QVQ9JXN2bmgWOgqp+BiCRG2AYAMoi3/LxYdyagAnhA6G93TrABZaJFJjrFY8IAAAAASUVORK5CYII=\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_view > .webix_cal_header {\\n height: 24px;\\n}\\n.webix_view > .webix_cal_header div {\\n float: left;\\n text-align: center;\\n height: 19px;\\n font-size: 11px;\\n color: #475466;\\n border-bottom: #DADEE0 1px solid;\\n}\\n.webix_cal_body .webix_cal_row > div {\\n float: left;\\n text-align: center;\\n height: 100%;\\n}\\n.webix_cal_body .webix_selected,\\n.webix_cal_body .webix_cal_select,\\n.webix_cal_body .webix_cal_select.webix_cal_today {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_cal_day,\\n.webix_cal_week_num {\\n cursor: pointer;\\n font-size: 12px;\\n color: #475466;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_cal_week_num {\\n color: #a2adbe;\\n cursor: default;\\n margin-right: 0px;\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_cal_event {\\n font-weight: bold;\\n color: #C66200;\\n}\\n.webix_cal_outside {\\n color: #b1bbc8;\\n}\\n.webix_cal_inactive {\\n background: #888;\\n}\\n.webix_cal_inactive {\\n background: #888;\\n}\\n.webix_cal_day_disabled,\\n.webix_cal_day_disabled.webix_cal_event {\\n color: #b1bbc8;\\n background: #f0f0f0;\\n}\\n.webix_cal_day_disabled.webix_cal_day,\\n.webix_cal_day_disabled.webix_cal_block {\\n cursor: not-allowed;\\n}\\n.webix_hours .webix_cal_day_disabled,\\n.webix_minutes .webix_cal_day_disabled,\\n.webix_hours .webix_cal_day_disabled.webix_cal_event,\\n.webix_minutes .webix_cal_day_disabled.webix_cal_event {\\n background: #FFFFFF;\\n font-weight: normal;\\n text-decoration: line-through;\\n}\\n.webix_cal_month_name {\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_cal_block {\\n float: left;\\n text-align: center;\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_selected {\\n background: #F4F5F9;\\n color: #475466;\\n}\\n.webix_cal_footer {\\n text-align: center;\\n font-size: 12px;\\n color: #444;\\n height: 24px;\\n padding: 6px 0 0;\\n cursor: pointer;\\n}\\n.webix_cal_icons {\\n float: right;\\n height: 20px;\\n line-height: 20px;\\n padding: 4px 4px 0;\\n}\\n.webix_cal_time {\\n height: 20px;\\n line-height: 20px;\\n padding: 4px 4px 0;\\n}\\n.webix_cal_time_icons {\\n float: left;\\n}\\n.webix_cal_icons .webix_cal_icon {\\n text-align: center;\\n padding: 0 4px;\\n}\\n.webix_cal_icon:hover,\\n.webix_cal_time:hover,\\n.webix_cal_month_name:hover {\\n text-decoration: underline;\\n color: #1CA1C1;\\n}\\n.webix_cal_icon:focus,\\n.webix_cal_time:focus,\\n.webix_cal_month_name:focus {\\n color: #1CA1C1;\\n}\\n.webix_cal_month_name.webix_readonly {\\n cursor: default;\\n}\\n.webix_cal_month_name.webix_readonly:hover,\\n.webix_cal_month_name.webix_readonly:focus {\\n text-decoration: none;\\n color: inherit;\\n}\\n.webix_time_header {\\n padding: 0 0 6px;\\n}\\n.webix_time_header .webix_cal_hours,\\n.webix_time_header .webix_cal_minutes {\\n display: inline-block;\\n font-size: 14px;\\n text-align: center;\\n height: 24px;\\n line-height: 24px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_time_header .webix_cal_minutes {\\n padding-left: 1px;\\n border-left: none;\\n}\\n.webix_time_header .webix_cal_hours {\\n border-right: none !important;\\n}\\n.webix_cal_body .webix_hours {\\n float: left;\\n border-right: 1px solid #DADEE0;\\n padding-right: 1px;\\n}\\n.webix_cal_body .webix_minutes {\\n float: left;\\n padding-left: 1px;\\n}\\n.webix_cal_block_empty {\\n float: left;\\n text-align: center;\\n}\\n.webix_time_footer {\\n text-align: center;\\n font-size: 12px;\\n height: 24px;\\n padding: 6px 0 0;\\n cursor: pointer;\\n}\\n.webix_cal_done {\\n height: 24px;\\n padding: 2px 8px;\\n font-size: 12px;\\n border-radius: 2px;\\n border: 1px solid #DADEE0;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n outline: none;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n float: right;\\n}\\n.webix_cal_done:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_cal_done:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_cal_done:active {\\n background-color: #daddeb;\\n}\\n.webix_cal_blurred_hours {\\n background-color: #f7f7f7;\\n}\\n.webix_property_line {\\n width: 100%;\\n height: auto;\\n line-height: 0;\\n}\\n.webix_property_line.webix_focused > div,\\n.webix_property_line:focus > div {\\n background-color: #f7f8fb;\\n}\\n.webix_property_label,\\n.webix_property_value {\\n display: inline-block;\\n padding-left: 12px;\\n border-bottom: 1px solid #EDEFF0;\\n overflow: hidden;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_property_label {\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_property_label_line {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n line-height: 42px;\\n padding-left: 12px;\\n border-bottom: 1px solid #EDEFF0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_property_label_line .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_property_label_line.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_property_label_line.webix_dark .webix_el_button,\\n.webix_property_label_line.webix_dark .webix_el_label .webix_el_box,\\n.webix_property_label_line.webix_dark .webix_inp_label,\\n.webix_property_label_line.webix_dark .webix_inp_top_label,\\n.webix_property_label_line.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_secondary .webix_icon,\\n.webix_property_label_line.webix_dark .webix_transparent .webix_icon,\\n.webix_property_label_line.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_property_label_line.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_property_label_line.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_property_label_line.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_transparent button:hover,\\n.webix_property_label_line.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_property_label_line.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev,\\n.webix_property_label_line.webix_dark .webix_segment_0,\\n.webix_property_label_line.webix_dark .webix_segment_1,\\n.webix_property_label_line.webix_dark .webix_segment_N,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button:hover,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next:hover,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev:hover,\\n.webix_property_label_line.webix_dark .webix_segment_0:hover,\\n.webix_property_label_line.webix_dark .webix_segment_1:hover,\\n.webix_property_label_line.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button:focus,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next:focus,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev:focus,\\n.webix_property_label_line.webix_dark .webix_segment_0:focus,\\n.webix_property_label_line.webix_dark .webix_segment_1:focus,\\n.webix_property_label_line.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button:active,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next:active,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev:active,\\n.webix_property_label_line.webix_dark .webix_segment_0:active,\\n.webix_property_label_line.webix_dark .webix_segment_1:active,\\n.webix_property_label_line.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_inp_static,\\n.webix_property_label_line.webix_dark input[type=text],\\n.webix_property_label_line.webix_dark input[type=combo],\\n.webix_property_label_line.webix_dark input[type=datepicker],\\n.webix_property_label_line.webix_dark textarea,\\n.webix_property_label_line.webix_dark select,\\n.webix_property_label_line.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_property_label_line.webix_dark .webix_el_texthighlight input,\\n.webix_property_label_line.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_property_label_line.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_property_label_line.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_multicombo_value,\\n.webix_property_label_line.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_property_label_line.webix_dark .webix_inp_static:focus,\\n.webix_property_label_line.webix_dark input[type=text]:focus,\\n.webix_property_label_line.webix_dark input[type=combo]:focus,\\n.webix_property_label_line.webix_dark input[type=datepicker]:focus,\\n.webix_property_label_line.webix_dark textarea:focus,\\n.webix_property_label_line.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_property_label_line.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_property_label_line.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_property_label_line.webix_dark .webix_el_icon,\\n.webix_property_label_line.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_property_label_line.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_property_label_line.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_property_label_line.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_property_label_line.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_property_label_line.webix_dark .webix_custom_checkbox,\\n.webix_property_label_line.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_custom_checkbox:focus,\\n.webix_property_label_line.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_property_label_line.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_property_label_line.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_property_label_line.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_property_label_line.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_property_label_line.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box input,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box select,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_property_label_line.webix_dark input.webix_invalid,\\n.webix_property_label_line.webix_dark select.webix_invalid,\\n.webix_property_label_line.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_property_label_line.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_property_label_line.webix_dark {\\n color: #FFFFFF;\\n}\\n.webix_property_col_ind {\\n float: right;\\n cursor: pointer;\\n margin: 0 8px 0 0;\\n border: 1px solid #DADEE0;\\n background: #ffffff;\\n border-radius: 3px;\\n width: 16px;\\n height: 16px;\\n}\\n.webix_property_value {\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.webix_property_check {\\n margin: 0;\\n vertical-align: middle;\\n}\\n/*style used by tooltip's container*/\\n.webix_tooltip {\\n display: none;\\n position: absolute;\\n z-index: 10000;\\n background-color: #FFFFFF;\\n padding: 5px 10px;\\n border: 1px solid #DADEE0;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n border-radius: 0px;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n.webix_global_tooltip {\\n pointer-events: none;\\n}\\n/*comments list*/\\n.webix_comments .webix_list .webix_list_item {\\n margin-top: 24px;\\n border: none;\\n cursor: default;\\n}\\n.webix_comments .webix_list .webix_comments_more_item {\\n margin-top: 12px;\\n}\\n/* comments list templates */\\n.webix_comments_name {\\n margin-left: 16px;\\n font-weight: 500;\\n color: rgba(0, 0, 0, 0.7);\\n}\\n.webix_comments_menu.webix_icon {\\n line-height: 30px;\\n width: 6px;\\n visibility: hidden;\\n float: right;\\n cursor: pointer;\\n color: #94A1B3;\\n margin: 0 4px 0 0;\\n}\\n.webix_comments_current:hover .webix_comments_menu,\\n.webix_comments_current.active_menu .webix_comments_menu {\\n visibility: visible;\\n}\\n.webix_comments_message {\\n white-space: pre-wrap;\\n line-height: 20px;\\n margin-left: 70px;\\n margin-right: 10px;\\n}\\n.webix_comments_message a {\\n color: #1CA1C1;\\n text-decoration: none;\\n word-break: break-all;\\n}\\n.webix_comments_message a:hover {\\n text-decoration: underline;\\n}\\n.webix_comments_message a:visited {\\n color: #7e57c2;\\n}\\n.webix_comments_message .webix_comments_mention {\\n font-weight: 500;\\n white-space: nowrap;\\n}\\n.webix_comments_mention {\\n color: #1CA1C1;\\n}\\n.webix_comments_avatar {\\n margin-left: 14px;\\n float: left;\\n position: relative;\\n width: 40px;\\n height: 40px;\\n}\\n.webix_comments_status {\\n z-index: 1;\\n top: 30px;\\n left: 30px;\\n border-radius: 50%;\\n border: 2px solid #FFFFFF;\\n position: absolute;\\n height: 12px;\\n width: 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_comments_status.active {\\n background-color: #55CD97;\\n}\\n.webix_comments_status.busy {\\n background-color: #FF5C4C;\\n}\\n.webix_comments_status.away {\\n background-color: #FDBF4C;\\n}\\n.webix_comments_status.none {\\n background-color: #d0d5dd;\\n}\\n.webix_comments_avatar_image {\\n width: 100%;\\n height: 100%;\\n overflow: hidden;\\n border-radius: 50%;\\n float: left;\\n position: relative;\\n}\\n.webix_comments_photo {\\n width: auto;\\n height: 100%;\\n margin: 0 auto;\\n}\\n.webix_comments_avatar_text {\\n font-size: 16px;\\n color: #1CA1C1;\\n line-height: 40px;\\n text-align: center;\\n background-color: #DFE2E6;\\n}\\n.webix_comments_avatar_text .webix_icon {\\n margin: 0;\\n}\\n.webix_comments_date {\\n float: right;\\n color: #94A1B3;\\n font-size: 12px;\\n}\\n.webix_comments_image {\\n max-width: 100%;\\n max-height: 300px;\\n display: block;\\n}\\n/* buttons*/\\n.webix_comments_more {\\n font-weight: 500;\\n text-align: center;\\n cursor: pointer;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n border: none;\\n border-radius: 2px;\\n}\\n.webix_comments_more:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_comments_send .webix_el_box {\\n float: right !important;\\n}\\n.webix_message_area {\\n position: fixed;\\n right: 5px;\\n width: 250px;\\n z-index: 1000;\\n}\\n.webix_message {\\n min-width: 120px;\\n font-family: Roboto, sans-serif;\\n z-index: 10000;\\n overflow: hidden;\\n margin: 4px 4px 12px;\\n transition: all 0.5s ease;\\n}\\n.webix_message.hidden {\\n height: 0px;\\n min-height: 0px;\\n padding-top: 0px;\\n padding-bottom: 0px;\\n border-width: 0px;\\n margin-top: 0px;\\n margin-bottom: 0px;\\n box-shadow: none;\\n overflow: hidden;\\n}\\n.webix_modal_box {\\n pointer-events: auto;\\n overflow: hidden;\\n display: inline-block;\\n min-width: 250px;\\n width: 250px;\\n text-align: center;\\n position: fixed;\\n background-color: #FFFFFF;\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n font-family: Roboto, sans-serif;\\n z-index: 20000;\\n border-radius: 0px;\\n border: 1px solid #DADEE0;\\n outline: none;\\n}\\n.webix_modal_box .webix_popup_button {\\n margin-top: 8px;\\n}\\n.webix_message,\\n.webix_popup_button {\\n cursor: pointer;\\n}\\n.webix_popup_controls {\\n padding: 4px 12px 12px;\\n}\\n.webix_popup_button {\\n height: 30px;\\n line-height: 30px;\\n display: inline-block;\\n margin: 0 4px;\\n border-radius: 2px;\\n}\\n.webix_popup_button {\\n min-width: 100px;\\n}\\ndiv.webix_modal_cover {\\n background-color: #000;\\n cursor: default;\\n opacity: 0.1;\\n position: fixed;\\n z-index: 19999;\\n left: 0px;\\n top: 0px;\\n width: 100%;\\n height: 100%;\\n border: none;\\n zoom: 1;\\n}\\n.webix_message img,\\n.webix_modal_box img {\\n float: left;\\n margin-right: 8px;\\n}\\n/*Skin section*/\\n.webix_popup_button {\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n outline: none;\\n}\\n.webix_popup_button:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_popup_button:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_popup_button:active {\\n background-color: #daddeb;\\n}\\n.webix_popup_button.confirm {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_popup_button.confirm:hover {\\n background-color: #1992af;\\n}\\n.webix_popup_button.confirm:focus {\\n background-color: #1992af;\\n}\\n.webix_popup_button.confirm:active {\\n background-color: #17839d;\\n}\\n.webix_popup_input.webix_el_text {\\n outline: none;\\n overflow: hidden;\\n padding: 3px 2px;\\n}\\n.webix_popup_input.webix_el_text input {\\n width: 100%;\\n height: 30px;\\n font-size: 14px;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_popup_input.webix_el_text.webix_required::before {\\n position: absolute;\\n right: 18px;\\n padding-top: 1px;\\n content: \\\"*\\\";\\n color: #FF5C4C;\\n}\\n.webix_popup_input.webix_el_text.webix_popup_invalid input {\\n background-color: #ffedee;\\n border-color: #fea5a8;\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n}\\n.webix_popup_title {\\n color: #475466;\\n line-height: 20px;\\n padding: 20px 16px 12px 16px;\\n font-size: 16px;\\n font-weight: 500;\\n}\\n.webix_popup_title + div.webix_popup_text {\\n padding-top: 0;\\n box-shadow: none;\\n}\\n.webix_popup_text {\\n overflow: hidden;\\n padding: 24px 16px 0px 16px;\\n font-size: 14px;\\n color: #475466;\\n line-height: 20px;\\n}\\n.webix_popup_text.webix_popup_label {\\n text-align: left;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_alert .webix_popup_title,\\n.webix_confirm .webix_popup_title,\\n.webix_prompt .webix_popup_title,\\n.webix_alert .webix_popup_text,\\n.webix_confirm .webix_popup_text,\\n.webix_prompt .webix_popup_text {\\n box-shadow: inset 0 4px #1CA1C1;\\n}\\n.webix_alert-warning .webix_popup_title,\\n.webix_confirm-warning .webix_popup_title,\\n.webix_prompt-warning .webix_popup_title,\\n.webix_alert-warning .webix_popup_text,\\n.webix_confirm-warning .webix_popup_text,\\n.webix_prompt-warning .webix_popup_text {\\n box-shadow: inset 0 4px #FDBF4C;\\n}\\n.webix_alert-error .webix_popup_title,\\n.webix_confirm-error .webix_popup_title,\\n.webix_prompt-error .webix_popup_title,\\n.webix_alert-error .webix_popup_text,\\n.webix_confirm-error .webix_popup_text,\\n.webix_prompt-error .webix_popup_text {\\n box-shadow: inset 0 4px #FF5C4C;\\n}\\n.webix_message {\\n font-size: 14px;\\n color: #475466;\\n box-shadow: 0 1px 14px 0 rgba(0, 0, 0, 0.12), 0 4px 10px 0 rgba(0, 0, 0, 0.1);\\n line-height: 20px;\\n border-radius: 2px;\\n border: 1px solid #DADEE0;\\n background-color: #FFFFFF;\\n}\\n.webix_message.webix_debug {\\n color: #313131;\\n border-color: #fed282;\\n background-color: #fff2db;\\n}\\n.webix_message.webix_error {\\n color: #313131;\\n border-color: #ff8d82;\\n background-color: #ffdedb;\\n}\\n.webix_message.webix_success {\\n color: #313131;\\n border-color: #88dcb6;\\n background-color: #ddf5ea;\\n}\\n.webix_message div {\\n padding: 11px 12px;\\n}\\n.webix_color_row {\\n clear: both;\\n white-space: nowrap;\\n}\\n.webix_color_palette {\\n text-align: left;\\n padding: 4px;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_color_palette.webix_palette_classic {\\n padding: 0;\\n}\\n.webix_color_row,\\n.webix_color_row div {\\n line-height: 0;\\n font-size: 0;\\n}\\n.webix_color_row div {\\n display: inline-block;\\n position: relative;\\n}\\n.webix_color_row div > * {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_color_row .webix_color_selected > * {\\n border: 1px solid;\\n border-color: #FFFFFF;\\n border-radius: 2px;\\n box-shadow: rgba(28, 161, 193, 0.6) 0 0 0 2px;\\n}\\n.webix_color_row .webix_color_selected:focus > * {\\n box-shadow: #1CA1C1 0 0 0 2px;\\n}\\n.webix_palette_classic .webix_color_row .webix_color_selected > * {\\n border: 2px solid #f3f3f3;\\n border-radius: 0px;\\n box-shadow: none;\\n}\\n.webix_palette_classic .webix_color_row .webix_color_selected:focus > * {\\n box-shadow: inset 0 0 15px #fff;\\n}\\n.webix_palette_classic .webix_color_item {\\n width: 100%;\\n height: 100%;\\n cursor: pointer;\\n}\\n.webix_palette_material .webix_color_item {\\n display: inline-block;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border-radius: 2px;\\n cursor: pointer;\\n width: 100%;\\n height: 100%;\\n}\\n.webix_palette_material .webix_color_row > div {\\n margin: 0 4px 4px 0;\\n}\\n.webix_color_area {\\n width: 100%;\\n height: 100%;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_color_block {\\n position: relative;\\n border-radius: 2px;\\n margin: 12px 12px 14px;\\n}\\n.webix_color_block:before,\\n.webix_color_block:after {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n left: 0;\\n}\\n.webix_color_block:before {\\n background-image: linear-gradient(0deg, #000, hsla(0, 0%, 100%, 0));\\n z-index: 2;\\n}\\n.webix_color_block:after {\\n background-image: linear-gradient(90deg, #fff, hsla(20, 42%, 65%, 0));\\n z-index: 1;\\n}\\n.webix_color_line {\\n position: relative;\\n height: 8px;\\n margin: 0 12px;\\n border-radius: 8px;\\n background-image: linear-gradient(90deg, red, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red);\\n}\\n.webix_color_circle {\\n width: 8px;\\n height: 8px;\\n margin: -6px 0 0 -6px;\\n border: 2px solid #FFFFFF;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\\n border-radius: 50%;\\n position: absolute;\\n left: 0;\\n top: 0;\\n z-index: 3;\\n}\\n.webix_color_circle:focus,\\n.webix_color_area_active .webix_color_circle {\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 0 4px #FFFFFF;\\n}\\n.webix_color_line_circle {\\n width: 12px;\\n height: 12px;\\n margin: -4px 0 0 -8px;\\n border: 2px solid #FFFFFF;\\n border-radius: 50%;\\n position: absolute;\\n left: 0;\\n top: 0;\\n background: #12FF08;\\n}\\n.webix_color_line_circle:focus,\\n.webix_color_area_active .webix_color_line_circle {\\n box-shadow: inset 0 0 8px #FFFFFF;\\n}\\n.webix_color_area_active .webix_color_circle,\\n.webix_color_area_active .webix_color_line_circle {\\n pointer-events: none;\\n}\\n.webix_color_out_block,\\n.webix_color_out_text {\\n height: 32px;\\n float: left;\\n border: 1px solid #CCD7E6;\\n margin: 12px 0px 12px 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_color_out_text {\\n color: #475466;\\n font-size: 14px;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n padding: 0px 12px;\\n}\\n.webix_color_out_text:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_color_area .webix_button {\\n width: calc(100% - 12px*2);\\n height: 32px;\\n margin: 0px 0px 12px 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_daterange .webix_view {\\n background-color: #FFFFFF;\\n}\\n.webix_daterange .webix_range_0 .webix_cal_next_button,\\n.webix_daterange .webix_range_N .webix_cal_prev_button {\\n visibility: hidden;\\n}\\n.webix_daterange .webix_range_1 .webix_cal_next_button,\\n.webix_daterange .webix_range_1 .webix_cal_prev_button {\\n visibility: hidden;\\n}\\n.webix_daterange .webix_range_1 .webix_cal_next_button:hover,\\n.webix_daterange .webix_range_1 .webix_cal_prev_button:hover {\\n cursor: default;\\n}\\n.webix_daterange .webix_range_left .webix_cal_next_button:hover,\\n.webix_daterange .webix_range_right .webix_cal_prev_button:hover {\\n cursor: default;\\n}\\n.webix_cal_range {\\n background-color: #ffffff;\\n}\\n.webix_cal_range_start {\\n border-radius: 3px 0 0 3px;\\n}\\n.webix_cal_range_end {\\n border-radius: 0 3px 3px 0;\\n}\\n.webix_cal_range_start,\\n.webix_cal_range_end,\\n.webix_cal_event.webix_cal_range_start,\\n.webix_cal_event.webix_cal_range_end,\\n.webix_cal_body .webix_cal_today.webix_cal_range_start,\\n.webix_cal_body .webix_cal_today.webix_cal_range_end {\\n background-color: #F4F5F9;\\n color: #475466;\\n}\\n.webix_cal_outside.webix_cal_range,\\n.webix_cal_body .webix_cal_outside.webix_cal_range_start,\\n.webix_cal_body .webix_cal_outside.webix_cal_range_end,\\n.webix_cal_body .webix_cal_outside.webix_cal_today.webix_cal_range_start,\\n.webix_cal_body .webix_cal_outside.webix_cal_today.webix_cal_range_end {\\n background-color: transparent;\\n color: #b1bbc8;\\n}\\n.webix_daterange .webix_cal_icons {\\n text-align: right;\\n padding: 0 4px;\\n}\\n.webix_daterange .webix_cal_icons .webix_cal_icon {\\n border-top: 1px solid #DADEE0;\\n}\\n.webix_daterange .webix_cal_time {\\n display: none;\\n}\\n.webix_daterange .webix_cal_timepicker .webix_range_time_start {\\n display: block;\\n}\\n.webix_daterange .webix_range_timepicker .webix_cal_time {\\n display: block;\\n padding: 5px 15px;\\n}\\n.webix_daterange .webix_range_timepicker .webix_range_time_start {\\n float: left;\\n}\\n.webix_daterange .webix_range_timepicker .webix_range_time_end {\\n float: right;\\n}\\n.webix_daterange .webix_range_footer .webix_cal_footer {\\n padding: 0;\\n}\\n.webix_timeboard .webix_slider_title {\\n text-align: left;\\n margin-left: 10px;\\n}\\n.webix_timeboard .webix_colon_template .webix_template {\\n padding: 0;\\n text-align: center;\\n line-height: 100%;\\n font-size: 30px;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_timeboard .webix_day_part .webix_el_box {\\n padding-left: 6px;\\n color: #1CA1C1;\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_timeboard .webix_day_part .webix_el_box:hover,\\n.webix_timeboard .webix_day_part .webix_el_box:focus {\\n color: #17839d;\\n}\\n.webix_drag_zone {\\n position: absolute;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n background-color: #FFFFFF;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n pointer-events: none;\\n}\\n.webix_drag_zone .webix_tree_item {\\n padding: 0 8px;\\n}\\n.webix_drag_zone .webix_tree_item .webix_tree_open,\\n.webix_drag_zone .webix_tree_item .webix_tree_close,\\n.webix_drag_zone .webix_tree_item .webix_tree_none {\\n display: none;\\n}\\n.webix_drag_zone .webix_ss_hscroll,\\n.webix_drag_zone .webix_ss_vscroll {\\n display: none !important;\\n}\\n.webix_drag_over,\\n.webix_drop_zone {\\n background-color: #e6e6e6;\\n}\\n.webix_drag_main {\\n position: relative;\\n background-color: #FFFFFF;\\n}\\n.webix_drag_main .webix_tree_item,\\n.webix_drag_main .webix_list_item,\\n.webix_drag_main .webix_dataview_item {\\n border: 1px solid #EDEFF0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_drag_multiple,\\n.webix_drag_multiple_last {\\n height: 100%;\\n width: 100%;\\n position: absolute;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border: 1px solid #EDEFF0;\\n background-color: #FFFFFF;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_drag_multiple {\\n bottom: 8px;\\n left: 8px;\\n}\\n.webix_drag_multiple_last {\\n bottom: 16px;\\n left: 16px;\\n}\\n.webix_drag_zone > .webix_badge {\\n top: -14px;\\n right: -14px;\\n}\\n.webix_invisible {\\n display: none !important;\\n}\\n.webix_drop_area,\\n.webix_drop_area_inner {\\n height: 36px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background-color: #f1f2f7;\\n}\\n.webix_list-x .webix_drop_area {\\n display: inline-block;\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_tree .webix_drop_area {\\n height: 24px;\\n}\\n.webix_list .webix_drop_area {\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_dataview .webix_drop_area {\\n float: left;\\n background-color: transparent;\\n}\\n.webix_dataview .webix_drop_area_inner {\\n border-right: 1px solid #EDEFF0;\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_vscroll_x {\\n height: 0px;\\n width: 100%;\\n overflow-y: hidden;\\n overflow-x: scroll;\\n}\\n.webix_vscroll_y {\\n width: 0px;\\n height: 100%;\\n overflow-x: hidden;\\n overflow-y: scroll;\\n}\\n.webix_vscroll_body {\\n width: 16px;\\n height: 16px;\\n}\\n.webix_scroll_x {\\n width: 50px;\\n height: 4px !important;\\n left: 1px;\\n bottom: 3px;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n position: absolute;\\n border-radius: 4px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_scroll_y {\\n width: 4px !important;\\n height: 50px;\\n top: 1px;\\n right: 3px;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n position: absolute;\\n border-radius: 4px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_custom_scroll {\\n -ms-overflow-style: none;\\n /* IE, Edge */\\n scrollbar-width: none;\\n /* Firefox */\\n}\\n.webix_custom_scroll::-webkit-scrollbar {\\n display: none;\\n /* Chrome, Edge(chromium), Opera, Safari, all browsers on iOS */\\n}\\n.webix_c_scroll_y {\\n position: absolute;\\n z-index: 3;\\n width: 10px;\\n right: 0px;\\n}\\n.webix_c_scroll_y > div {\\n transition: width 0.3s 0.2s, margin 0.3s 0.2s;\\n width: 4px;\\n height: 100%;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n border-radius: 4px;\\n margin: 0px 3px;\\n}\\n.webix_c_scroll_y:hover > div,\\n.webix_c_scroll_y.webix_scroll_active div {\\n width: 10px;\\n margin: 0px;\\n}\\n.webix_c_scroll_x {\\n position: absolute;\\n z-index: 3;\\n height: 10px;\\n bottom: 0px;\\n}\\n.webix_c_scroll_x > div {\\n transition: height 0.3s 0.2s, margin 0.3s 0.2s;\\n height: 4px;\\n width: 100%;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n border-radius: 4px;\\n margin: 3px 0px;\\n}\\n.webix_c_scroll_x:hover > div,\\n.webix_c_scroll_x.webix_scroll_active div {\\n height: 10px;\\n margin: 0px;\\n}\\n.webix_c_scroll_bar_y,\\n.webix_c_scroll_bar_x {\\n position: absolute;\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.webix_c_scroll_bar_y {\\n height: 100%;\\n width: 10px;\\n right: 0px;\\n}\\n.webix_c_scroll_bar_x {\\n width: 100%;\\n height: 10px;\\n bottom: 0px;\\n}\\n.webix_scroll_cont {\\n width: 100%;\\n height: auto;\\n clear: both;\\n position: relative;\\n}\\n.webix_secondary .webix_button {\\n background: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_secondary .webix_button:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_secondary .webix_button:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_secondary .webix_button:active {\\n background-color: #daddeb;\\n}\\n.webix_secondary .webix_button .webix_icon,\\n.webix_secondary .webix_button .webix_img_btn_text,\\n.webix_secondary .webix_button .webix_icon_btn {\\n color: #1CA1C1;\\n}\\n.webix_secondary .webix_pressed .webix_button {\\n background-color: #daddeb;\\n}\\n.webix_primary .webix_button {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_primary .webix_button:hover {\\n background-color: #1992af;\\n}\\n.webix_primary .webix_button:focus {\\n background-color: #1992af;\\n}\\n.webix_primary .webix_button:active {\\n background-color: #17839d;\\n}\\n.webix_primary .webix_button .webix_icon,\\n.webix_primary .webix_button .webix_img_btn_text,\\n.webix_primary .webix_button .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_primary .webix_pressed .webix_button {\\n background-color: #17839d;\\n}\\n.webix_danger .webix_button {\\n background: #FF5C4C;\\n color: #ffffff;\\n}\\n.webix_danger .webix_button:hover {\\n background-color: #ff4938;\\n}\\n.webix_danger .webix_button:focus {\\n background-color: #ff4938;\\n}\\n.webix_danger .webix_button:active {\\n background-color: #ff3723;\\n}\\n.webix_danger .webix_button .webix_icon,\\n.webix_danger .webix_button .webix_img_btn_text,\\n.webix_danger .webix_button .webix_icon_btn {\\n color: #ffffff;\\n}\\n.webix_danger .webix_pressed .webix_button {\\n background-color: #ff3723;\\n}\\n.webix_transparent .webix_button {\\n color: #475466;\\n background: transparent;\\n border: none;\\n}\\n.webix_transparent .webix_button .webix_img_btn_text {\\n color: #475466;\\n}\\n.webix_transparent .webix_button .webix_icon,\\n.webix_transparent .webix_button .webix_icon_btn {\\n color: #94A1B3;\\n}\\n.webix_transparent .webix_button:hover {\\n background-color: rgba(0, 0, 0, 0.04);\\n}\\n.webix_transparent .webix_button:focus {\\n background-color: rgba(0, 0, 0, 0.04);\\n}\\n.webix_transparent .webix_button:active {\\n background-color: rgba(0, 0, 0, 0.05);\\n}\\n.webix_transparent .webix_pressed .webix_button {\\n background-color: rgba(0, 0, 0, 0.05);\\n}\\n.webix_button,\\n.webixbutton {\\n border-radius: 2px;\\n height: 100%;\\n width: 100%;\\n cursor: pointer;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n -webkit-appearance: none;\\n padding: 0 6px;\\n}\\n.webix_el_button .webix_el_box,\\n.webix_el_toggle .webix_el_box {\\n position: relative;\\n}\\n.webix_img_btn,\\n.webix_img_btn_top {\\n vertical-align: top;\\n border: none;\\n width: 100%;\\n padding: 0;\\n}\\n.webix_img_btn .webix_icon {\\n color: #1CA1C1;\\n margin-right: 4px;\\n}\\n.webix_img_btn_top .webix_icon,\\n.webix_img_btn_top .webix_image {\\n font-size: 20px;\\n position: absolute;\\n top: 8px;\\n display: inline-block;\\n left: 50%;\\n transform: translateX(-50%);\\n}\\n.webix_img_btn .webix_image {\\n display: inline-block;\\n margin-right: 4px;\\n vertical-align: middle;\\n}\\n.webix_img_btn_text {\\n position: absolute;\\n left: 0;\\n bottom: 4px;\\n width: 100%;\\n text-align: center;\\n cursor: pointer;\\n color: #1CA1C1;\\n}\\n.webix_pressed .webix_button {\\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_button {\\n color: #94A1B3;\\n background: #f4f5f9;\\n border-color: #f4f5f9;\\n text-shadow: none;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: #94A1B3;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_image {\\n opacity: 0.4;\\n}\\n.webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_disabled_view.webix_control .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: #94A1B3;\\n}\\n.webixbutton {\\n width: auto;\\n height: auto;\\n padding: 8px 15px;\\n}\\n.webix_richtext_editor {\\n height: 100%;\\n}\\n.webix_template .webix_richtext_editor:focus {\\n outline: none;\\n}\\n.webix_richtext_container .webix_template {\\n padding: 10px;\\n overflow-x: auto;\\n border: solid #DADEE0;\\n border-width: 0px 1px 1px;\\n border-radius: 0px 0px 6px 6px;\\n}\\n.webix_richtext_inp_label .webix_template {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n color: #475466;\\n text-transform: none;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n float: left;\\n padding-top: 1px;\\n padding-left: 0;\\n padding-right: 9px;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n padding-right: 8px;\\n margin-bottom: 0px;\\n padding-top: 10px;\\n float: none;\\n}\\n.webix_richtext .wxi-underline,\\n.webix_richtext .wxi-italic,\\n.webix_richtext .wxi-bold {\\n vertical-align: sub;\\n font-size: 24px;\\n width: 24px;\\n}\\n.webix_control {\\n background: transparent;\\n}\\n.webix_control input,\\n.webix_control button,\\n.webix_control textarea,\\n.webix_el_label,\\n.webix_inp_label,\\n.webix_inp_top_label,\\n.webix_inp_bottom_label {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-family: Roboto, sans-serif;\\n}\\n.webix_el_box {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 3px 2px;\\n height: 100%;\\n width: 100%;\\n font-size: 14px;\\n overflow: hidden;\\n}\\n.webixtoolbarlabel {\\n font-size: 16px;\\n}\\n.webix_el_text input,\\n.webix_el_search input,\\n.webix_el_combo input,\\n.webix_el_datepicker input,\\n.webix_el_colorpicker input {\\n font-size: 14px;\\n height: 100%;\\n padding: 0px 12px;\\n border: 1px solid #DADEE0;\\n color: #475466;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n -webkit-appearance: none;\\n border-radius: 0;\\n}\\n.webix_multitext_icon:hover,\\n.webix_multitext_icon:active {\\n color: #1CA1C1;\\n background: inherit;\\n cursor: pointer;\\n}\\n.webix_inp_label,\\n.webix_inp_top_label,\\n.webix_label_right {\\n color: #475466;\\n text-transform: none;\\n font-size: 14px;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n}\\n.webix_inp_label {\\n float: left;\\n padding-top: 1px;\\n padding-left: 0;\\n padding-right: 9px;\\n}\\n.webix_inp_top_label {\\n float: none;\\n padding: 3px 2px;\\n padding-bottom: 0px;\\n}\\n.webix_inp_bottom_label {\\n font-size: 12px;\\n color: #516075;\\n}\\n.webix_label_right {\\n padding-left: 9px;\\n}\\n.webix_el_checkbox .webix_label_right {\\n display: inline-block;\\n padding-top: 1px;\\n}\\n.webix_el_label {\\n color: #475466;\\n}\\n.webix_toolbar .webix_el_label {\\n text-transform: none;\\n}\\n.webix_el_select select {\\n height: 100%;\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n border: 1px solid #DADEE0;\\n}\\nbody:not(:-moz-handler-blocked) .webix_el_select select {\\n padding: 0.2em;\\n}\\n.webix_el_group,\\n.webix_all_segments {\\n height: 100%;\\n white-space: nowrap;\\n}\\n.webix_inp_counter_next,\\n.webix_inp_counter_prev,\\n.webix_inp_counter_value {\\n border: 1px solid #DADEE0;\\n cursor: pointer;\\n -webkit-appearance: none;\\n width: 20px;\\n height: 100%;\\n vertical-align: top;\\n}\\n.webix_inp_counter_value {\\n font-size: 14px;\\n width: 50px;\\n color: #475466;\\n text-align: center;\\n border-left-width: 0px;\\n border-right-width: 0px;\\n -webkit-appearance: none;\\n border-radius: 0;\\n}\\n.webix_inp_counter_prev {\\n padding: 0;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.webix_inp_counter_prev:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_prev:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_prev:active {\\n background-color: #daddeb;\\n}\\n.webix_inp_counter_next {\\n padding: 0;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_inp_counter_next:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:active {\\n background-color: #daddeb;\\n}\\n.webix_el_textarea textarea,\\n.webix_textarea_measure {\\n border: 1px solid #DADEE0;\\n height: 100%;\\n margin: 0;\\n padding: 5px;\\n color: #475466;\\n resize: none;\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n padding-left: 12px;\\n padding-right: 12px;\\n}\\n.webix_textarea_measure {\\n box-sizing: border-box;\\n overflow: hidden;\\n}\\n.webix_el_textarea .webix_inp_label {\\n padding-top: 10px;\\n}\\n.webix_noscroll.webix_el_textarea textarea {\\n overflow: hidden;\\n}\\n.webix_segment_0,\\n.webix_segment_1 {\\n border: 1px solid #DADEE0;\\n border-right-width: 0px;\\n height: 100%;\\n}\\n.webix_segment_0 {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.webix_segment_N {\\n border: 1px solid #DADEE0;\\n height: 100%;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_segment_N:first-child {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_segment_0,\\n.webix_segment_1,\\n.webix_segment_N {\\n -webkit-appearance: none;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n outline: none;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n cursor: pointer;\\n padding: 0;\\n}\\n.webix_segment_0:hover,\\n.webix_segment_1:hover,\\n.webix_segment_N:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:focus,\\n.webix_segment_1:focus,\\n.webix_segment_N:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:active,\\n.webix_segment_1:active,\\n.webix_segment_N:active {\\n background-color: #daddeb;\\n}\\n.webix_segment_0.webix_selected,\\n.webix_segment_1.webix_selected,\\n.webix_segment_N.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n border-color: #1CA1C1;\\n background-color: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_segment_0.webix_selected:focus,\\n.webix_segment_1.webix_selected:focus,\\n.webix_segment_N.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_segment_0.webix_disabled,\\n.webix_segment_1.webix_disabled,\\n.webix_segment_N.webix_disabled {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n border-color: transparent;\\n cursor: not-allowed;\\n}\\n.webix_segment_0.webix_disabled:hover,\\n.webix_segment_1.webix_disabled:hover,\\n.webix_segment_N.webix_disabled:hover,\\n.webix_segment_0.webix_disabled:focus,\\n.webix_segment_1.webix_disabled:focus,\\n.webix_segment_N.webix_disabled:focus,\\n.webix_segment_0.webix_disabled:active,\\n.webix_segment_1.webix_disabled:active,\\n.webix_segment_N.webix_disabled:active {\\n box-shadow: none;\\n background-color: #fbfbfd;\\n}\\n.webix_segment_0.webix_disabled.webix_selected,\\n.webix_segment_1.webix_disabled.webix_selected,\\n.webix_segment_N.webix_disabled.webix_selected,\\n.webix_segment_0.webix_disabled.webix_selected:hover,\\n.webix_segment_1.webix_disabled.webix_selected:hover,\\n.webix_segment_N.webix_disabled.webix_selected:hover,\\n.webix_segment_0.webix_disabled.webix_selected:focus,\\n.webix_segment_1.webix_disabled.webix_selected:focus,\\n.webix_segment_N.webix_disabled.webix_selected:focus {\\n background-color: #dde0ec;\\n}\\n.webix_inp_static {\\n border: 1px solid #DADEE0;\\n overflow: hidden;\\n padding: 0px 12px;\\n height: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n float: left;\\n}\\n.webix_placeholder {\\n color: #94A1B3;\\n}\\n::-webkit-input-placeholder {\\n color: #94A1B3;\\n}\\n::-moz-placeholder {\\n color: #94A1B3;\\n}\\n/* Firefox 19+ */\\n:-moz-placeholder {\\n color: #94A1B3;\\n}\\n/* Firefox 18- */\\n:-ms-input-placeholder {\\n color: #94A1B3;\\n}\\n.webix_el_combo,\\n.webix_el_richselect,\\n.webix_el_datepicker,\\n.webix_el_colorpicker,\\n.webix_el_search {\\n font-size: 14px;\\n}\\n.webix_el_combo input,\\n.webix_el_richselect input,\\n.webix_el_datepicker input,\\n.webix_el_colorpicker input,\\n.webix_el_search input,\\n.webix_el_combo .webix_inp_static,\\n.webix_el_richselect .webix_inp_static,\\n.webix_el_datepicker .webix_inp_static,\\n.webix_el_colorpicker .webix_inp_static,\\n.webix_el_search .webix_inp_static {\\n color: #475466;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n -webkit-appearance: none;\\n}\\n.webix_el_combo .webix_el_box,\\n.webix_el_richselect .webix_el_box,\\n.webix_el_datepicker .webix_el_box,\\n.webix_el_colorpicker .webix_el_box,\\n.webix_el_search .webix_el_box,\\n.webix_el_text .webix_el_box,\\n.webix_el_texthighlight .webix_el_box {\\n color: #475466;\\n position: relative;\\n}\\n.webix_el_combo .webix_input_icon,\\n.webix_el_richselect .webix_input_icon,\\n.webix_el_datepicker .webix_input_icon,\\n.webix_el_colorpicker .webix_input_icon,\\n.webix_el_search .webix_input_icon,\\n.webix_el_text .webix_input_icon,\\n.webix_el_texthighlight .webix_input_icon {\\n background-color: transparent;\\n position: absolute;\\n z-index: 1;\\n padding-left: 4px;\\n width: 24px;\\n}\\n.webix_clear_icon:hover {\\n color: #FF5C4C;\\n cursor: pointer;\\n}\\n.webix_clear_icon:hover::before {\\n content: \\\"\\\\F011\\\";\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_view input::-ms-clear {\\n display: none;\\n}\\n/*Remove button padding in FF*/\\n.webix_view button::-moz-focus-inner {\\n padding: 0;\\n border: 0;\\n}\\n.webix_el_radio .webix_inp_label {\\n line-height: normal !important;\\n padding-top: 7px;\\n}\\n.webix_inp_radio_border input,\\n.webix_el_checkbox input {\\n margin: 0px;\\n padding: 0px;\\n float: left;\\n}\\n.webix_line_break {\\n clear: both;\\n}\\n.webix_custom_checkbox,\\n.webix_custom_radio {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_radio_option.webix_disabled .webix_label_right,\\n.webix_radio_option.webix_disabled .webix_inp_radio_border {\\n color: #94A1B3;\\n cursor: not-allowed;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_el_radio .webix_radio_option.webix_disabled .webix_custom_radio {\\n color: #94A1B3;\\n cursor: not-allowed;\\n}\\n.webix_radio_option {\\n display: table;\\n float: left;\\n height: 32px;\\n margin-right: 20px;\\n}\\n.webix_inp_radio_border,\\n.webix_el_radio .webix_label_right {\\n display: table-cell;\\n vertical-align: middle;\\n}\\n.webix_measure_size .webix_inp_radio_border,\\n.webix_measure_size.webix_el_radio .webix_label_right {\\n display: table-cell !important;\\n}\\n.webix_measure_size .webix_radio_option {\\n display: table !important;\\n float: left !important;\\n}\\n.webix_measure_size .webix_line_break {\\n display: block !important;\\n}\\n.webix_invalid .webix_el_box input,\\n.webix_invalid .webix_custom_radio,\\n.webix_invalid .webix_el_box .webix_inp_static,\\n.webix_invalid .webix_el_box select,\\n.webix_invalid .webix_el_box textarea,\\ninput.webix_invalid,\\nselect.webix_invalid,\\ntextarea.webix_invalid {\\n background-color: #fff6f6;\\n border-color: #fea5a8;\\n}\\n.webix_invalid .webix_inp_bottom_label {\\n font-size: 12px;\\n color: #fd595f;\\n}\\n.webix_el_colorpicker .webix_input_icon {\\n padding-left: 0;\\n width: 24px;\\n height: 24px;\\n border-radius: 2px;\\n}\\n.webix_el_search .webix_el_box {\\n position: relative;\\n}\\n.webix_el_search input {\\n padding-right: 30px;\\n}\\n.webix_el_search span {\\n position: absolute;\\n right: 19px;\\n cursor: pointer;\\n padding-left: 7px;\\n}\\n.webix_view.webix_control > .webix_disabled {\\n opacity: 0;\\n}\\n.webix_disabled_view.webix_control .webix_image {\\n -webkit-filter: grayscale(100%);\\n filter: grayscale(100%);\\n}\\n.webix_el_label.webix_disabled_view {\\n color: #94A1B3;\\n}\\n.webix_view.webix_control .webix_disabled_box label,\\n.webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_view.webix_control .webix_disabled_box button,\\n.webix_view.webix_control .webix_disabled_box .webix_slider_title {\\n color: #94A1B3;\\n}\\n.webix_view.webix_control .webix_disabled_box input,\\n.webix_view.webix_control .webix_disabled_box select,\\n.webix_view.webix_control .webix_disabled_box textarea,\\n.webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_view.webix_control .webix_disabled_box .webix_slider_right,\\n.webix_view.webix_control .webix_disabled_box .webix_slider_handle {\\n color: #94A1B3;\\n background: #fbfbfd;\\n border-color: #EDEFF0;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_view.webix_control .webix_disabled_box .webix_inp_counter_next,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_N {\\n color: #94A1B3;\\n background: #f4f5f9;\\n border-color: #f4f5f9;\\n text-shadow: none;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: #dde0ec;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_slider_left {\\n background-color: #94A1B3;\\n}\\n.webix_disabled_top_label {\\n color: #94A1B3;\\n}\\nlabel.webix_required:after,\\nlegend.webix_required:after,\\n.webix_measure_size.webix_required:after,\\n.webix_richtext_inp_label.webix_required .webix_template:after {\\n content: \\\"*\\\";\\n padding-left: 4px;\\n color: #FF5C4C;\\n}\\n.webix_multicombo .webix_inp_static {\\n padding: 0 3px 0 0;\\n}\\n.webix_el_text .webix_multicombo_input {\\n background-color: transparent;\\n border: 0;\\n float: left;\\n vertical-align: middle;\\n font-size: 14px;\\n padding: 0px;\\n color: #475466;\\n font-family: Roboto, sans-serif;\\n margin-left: 9px;\\n}\\n.webix_el_text .webix_multicombo_input:focus {\\n border: 0;\\n box-shadow: none;\\n}\\n.webix_multicombo_listbox {\\n width: auto;\\n line-height: 1;\\n margin: 0;\\n padding: 0;\\n list-style: none;\\n}\\n.webix_multicombo_value,\\n.webix_multicombo_tag {\\n float: left;\\n position: relative;\\n background-color: #f2f2f2;\\n display: inline-block;\\n margin: 3px 0 0 3px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n border-radius: 2px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_multicombo_value {\\n padding: 0 20px 0 5px;\\n}\\n.webix_multicombo_tag {\\n min-width: 15px;\\n text-align: center;\\n}\\n.webix_multicombo_tag,\\n.webix_multicombo_value.webix_readonly {\\n padding: 0 5px 0 5px;\\n}\\n.webix_multicombo_delete {\\n position: absolute;\\n top: 50%;\\n right: 4px;\\n margin-top: -8px;\\n font-size: 16px;\\n height: 16px;\\n line-height: 1;\\n color: #475466;\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_multicombo_delete::after {\\n content: \\\"\\\\F011\\\";\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_multilist .webix_list_item {\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n}\\n.webix_multilist .webix_selected {\\n background: #f2f2f2;\\n color: #475466;\\n}\\n.webix_multilist .wxi-checkbox-marked,\\n.webix_multilist .wxi-checkbox-blank {\\n vertical-align: middle;\\n font-size: 24px;\\n width: 24px;\\n margin-right: 4px;\\n}\\n.webix_checksuggest_select_all {\\n border-color: transparent;\\n border-bottom: 1px solid #DADEE0;\\n margin-bottom: 1px;\\n}\\n.webix_checksuggest_select_all .webix_label_right {\\n text-transform: capitalize;\\n display: block;\\n padding: 4px 12px 0 12px;\\n}\\n.webix_checksuggest_select_all input {\\n display: none;\\n}\\n.webix_checksuggest_select_all:hover {\\n cursor: pointer;\\n}\\n.webix_checksuggest_select_all:hover .webix_label_right {\\n cursor: pointer;\\n color: #F4F5F9;\\n}\\n.webix_el_texthighlight {\\n position: relative;\\n}\\n.webix_el_texthighlight.webix_el_text .webix_text_highlight_value {\\n position: relative;\\n top: 50%;\\n transform: translate(0, -50%);\\n overflow: hidden;\\n white-space: pre;\\n}\\n.webix_el_texthighlight.webix_el_text input,\\n.webix_el_texthighlight.webix_el_text .webix_text_highlight {\\n -ms-overflow-style: -ms-autohiding-scrollbar;\\n padding: 0 12px;\\n}\\n.webix_el_texthighlight.webix_el_text .webix_input_icon {\\n top: 3px;\\n}\\n.webix_el_texthighlight.webix_el_textarea textarea {\\n padding: 5px 12px;\\n}\\n.webix_el_texthighlight.webix_el_textarea .webix_text_highlight_value {\\n word-wrap: break-word;\\n margin: 5px 12px;\\n white-space: pre-wrap;\\n}\\n.webix_el_texthighlight.webix_disabled_view .webix_text_highlight {\\n background-color: #fbfbfd;\\n}\\n.webix_el_texthighlight .webix_text_highlight,\\n.webix_el_texthighlight input,\\n.webix_el_texthighlight textarea {\\n line-height: normal;\\n letter-spacing: normal;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_el_texthighlight .webix_text_highlight {\\n -webkit-text-size-adjust: none;\\n height: 100%;\\n position: absolute;\\n border: 1px solid transparent;\\n border-radius: 2px;\\n background-color: #fff;\\n overflow: auto;\\n}\\n.webix_el_texthighlight .webix_text_highlight .webix_text_highlight_value {\\n text-align: left;\\n}\\n.webix_el_texthighlight.webix_control .webix_el_box input,\\n.webix_el_texthighlight.webix_control .webix_el_box textarea {\\n display: block;\\n position: relative;\\n z-index: 1;\\n color: transparent;\\n caret-color: #475466;\\n background: transparent;\\n resize: none;\\n}\\n.webix_el_texthighlight textarea {\\n overflow: auto;\\n}\\n.webix_el_tabbar {\\n background: transparent;\\n}\\n.webix_all_tabs {\\n height: 100%;\\n display: table;\\n}\\n.webix_tab_filler {\\n display: table-cell;\\n background: transparent;\\n font-size: 1px;\\n border-bottom: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_tab_filler:first-child {\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_item_tab:first-child {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_item_tab {\\n display: table-cell;\\n text-align: center;\\n vertical-align: middle;\\n overflow: hidden;\\n cursor: pointer;\\n border: 1px solid #DADEE0;\\n border-left-width: 0px;\\n background: #FFFFFF;\\n color: #1CA1C1;\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 0px;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 0px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webixtype_bottom .webix_item_tab {\\n border-radius: 0;\\n}\\n.webix_item_tab.webix_selected {\\n border-bottom-width: 0px;\\n background: #FFFFFF;\\n color: #1CA1C1;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected {\\n border-bottom-width: 1px;\\n}\\n.webix_before_all_tabs {\\n width: 100%;\\n}\\n.webix_after_all_tabs {\\n width: 100%;\\n border-left: 1px solid #DADEE0;\\n border-right: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: #94A1B3;\\n background: #f4f5f9;\\n border-color: #f4f5f9;\\n text-shadow: none;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin: 0 auto;\\n text-align: center;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin: 0 3px;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab,\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab,\\n.webix_el_tabbar .webixtype_image .webix_item_tab {\\n padding: 3px 0;\\n border-radius: 0;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn_top,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top {\\n background-position: center 0;\\n position: relative;\\n height: 100%;\\n}\\n.webix_tab_more_icon {\\n cursor: pointer;\\n display: table-cell;\\n overflow: hidden;\\n text-align: center;\\n vertical-align: middle;\\n padding: 0 3px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_tab_more_icon .webix_icon {\\n width: 100%;\\n}\\n.webix_tab_list .webix_list_item:last-child {\\n border-bottom: none;\\n}\\n.webix_icon.webix_tab_close {\\n font-size: 12px;\\n float: right;\\n padding: 4px;\\n margin-top: -4px;\\n}\\n.webix_icon.webix_tab_close:focus {\\n color: #FF5C4C;\\n}\\n.webix_all_tabs .webix_item_tab.webix_disabled {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n border-color: transparent;\\n cursor: not-allowed;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_all_tabs .webix_item_tab.webix_disabled:hover,\\n.webix_all_tabs .webix_item_tab.webix_disabled.webix_selected,\\n.webix_all_tabs .webix_item_tab.webix_disabled.webix_selected:hover {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n border-color: transparent;\\n}\\n.webix_menu .webix_list_item:hover,\\n.webix_menu-x .webix_list_item:hover,\\n.webix_menu .webix_list_item:active,\\n.webix_menu-x .webix_list_item:active,\\n.webix_menu .webix_list_item:focus,\\n.webix_menu-x .webix_list_item:focus {\\n background: rgba(100, 100, 100, 0.1);\\n}\\n.webix_menu .webix_list_item,\\n.webix_menu-x .webix_list_item {\\n border: none;\\n text-decoration: none;\\n background: #FFFFFF;\\n height: 36px;\\n}\\n.webix_menu .webix_list_item .webix_submenu_icon,\\n.webix_menu-x .webix_list_item .webix_submenu_icon {\\n float: right;\\n text-align: right;\\n position: relative;\\n margin-left: 4px;\\n}\\n.webix_menu-x {\\n border-color: transparent;\\n background: transparent;\\n color: #FFFFFF;\\n}\\n.webix_menu-x .webix_list_item:first-child {\\n margin-left: 0;\\n}\\n.webix_menu-x .webix_submenu_icon {\\n top: 14px;\\n}\\n.webix_menu-x .webix_list_item {\\n display: inline-block;\\n line-height: 32px;\\n}\\n.webix_menu-x .webix_list_item {\\n border-right: 1px solid #fff;\\n border-left: 0px;\\n background: #1CA1C1;\\n color: #fff;\\n font-size: 14px;\\n}\\n.webix_menu-x .webix_list_item .webix_submenu_icon:before {\\n content: '\\\\F001';\\n}\\n.webix_menu-x .webix_list_item .webix_icon_btn {\\n color: #fff;\\n text-align: left;\\n}\\n.webix_menu-x .webix_list_item.webix_selected {\\n box-shadow: none;\\n}\\n.webix_menu-x .webix_list_item:hover,\\n.webix_menu-x .webix_list_item:active,\\n.webix_menu-x .webix_list_item:focus {\\n background-color: #1992af;\\n}\\n.webix_menu-x .webix_list_item:first-child {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.webix_menu-x .webix_list_item:last-child {\\n border-right: none;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_menu-x .webix_list_item.webix_disabled {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n}\\n.webix_menu-x.webix_disabled_view .webix_disabled {\\n background-color: transparent;\\n}\\n.webix_menu-x.webix_disabled_view .webix_list_item.menu {\\n color: #94A1B3;\\n background: #f4f5f9;\\n}\\n/* Submenu */\\n.webix_menu {\\n background: #FFFFFF;\\n border: 1px solid #DADEE0;\\n border-radius: 0px;\\n}\\n.webix_menu .webix_list_item {\\n display: block;\\n}\\n.webix_menu .webix_context_separator {\\n height: 3px;\\n padding: 1px 3px 0 3px;\\n}\\n.webix_menu .webix_context_separator .sep_line {\\n height: 1px;\\n border-top: 1px solid #DADEE0;\\n}\\n.webix_menu .webix_submenu_icon {\\n top: 12px;\\n}\\n.webix_menu .webix_context_spacer {\\n height: 36px;\\n}\\n.webix_menu_link {\\n color: inherit;\\n text-decoration: none;\\n display: block;\\n height: 100%;\\n}\\n/* Toolbar */\\n.webix_toolbar.webix_layout_subbar .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_button,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_label .webix_el_box,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_label,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_top_label,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_static,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=text],\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=combo],\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=datepicker],\\n.webix_toolbar.webix_layout_subbar.webix_dark textarea,\\n.webix_toolbar.webix_layout_subbar.webix_dark select,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_texthighlight input,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_multicombo_value,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_static:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=text]:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=combo]:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=datepicker]:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark textarea:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_checkbox,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_checkbox:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box input,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box select,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_toolbar.webix_layout_subbar.webix_dark input.webix_invalid,\\n.webix_toolbar.webix_layout_subbar.webix_dark select.webix_invalid,\\n.webix_toolbar.webix_layout_subbar.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar .webix_layout_line,\\n.webix_toolbar .webix_layout_clean {\\n background: transparent;\\n}\\n.webix_hidden_upload,\\n.webix_el_button .webix_hidden_upload {\\n height: 1px;\\n width: 1px;\\n border: 0 !important;\\n font-size: 1px;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n z-index: -1;\\n opacity: 0;\\n}\\n.webix_upload_client,\\n.webix_upload_error,\\n.webix_upload_server {\\n width: 60px;\\n text-align: center;\\n float: right;\\n}\\n.webix_error_icon,\\n.webix_cancel_icon {\\n display: inline-block;\\n background-repeat: no-repeat;\\n}\\n.webix_error_icon {\\n width: 18px;\\n height: 16px;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAYAAAAbBi9cAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZFMDdENjlDNjE2QzExRTI5QzhBQUU2OUI3RDY4RTFCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjZFMDdENjlENjE2QzExRTI5QzhBQUU2OUI3RDY4RTFCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NkUwN0Q2OUE2MTZDMTFFMjlDOEFBRTY5QjdENjhFMUIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NkUwN0Q2OUI2MTZDMTFFMjlDOEFBRTY5QjdENjhFMUIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4ZJnE7AAABdklEQVR42mK80aLPgAcwA/EcIOYB4mgg/oWuQL36AphmYcAPYvl5WBOYmBgY3n/6fQTIn4hLIRMeQ0CuaBHgY2EQ4GMF8euAWIgcg6qF+NmkOdiZGdhYmRiEBdhAhrSQapAKEBcJC7DCBUQE2UBUGhAbkGLQBDEhdjYmJkaGtHVMDD4LmBk+/2RgEBdhBwX+ZGINcuLiZPYW5Ie45tknRrAhIFqAl5WBh4vFBijsR8ggkI29IA0wwMsOo/+DaWjA9wIxGz6D0oAKDXi5EalCkvc/2DApPgifm5OZQZCPFRyGuAwCxwqya0AAZADMVTAgyA92TDUQS2MzqAUUxcAgRjPoP9hVyICVhREUi6B01g4TY4RmES0gvqSuyMPMQAK4ef/LXyBlAswmF2DWd4kJs2M1pGgLIvrRAXJyAIWqNzcXi7cgHysDqQAUnt9//LW52WoQBfLaDRlxDnWgYQzkAKBBDI+ef38E0n3nycsf6gyUgUcAAQYA9DZJKVXGocQAAAAASUVORK5CYII=\\\");\\n}\\n.webix_upload_server {\\n color: #55CD97;\\n}\\n.webix_remove_upload {\\n float: right;\\n}\\n.webix_cancel_icon {\\n margin-top: 9px;\\n width: 14px;\\n height: 14px;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAQAAAC1QeVaAAAAsElEQVR4XoVQUQbDQBScAywIuUcpKCWglBJCDlBKf0vpbymhd5mDhIDcoAcoJQSEsn2G5KmWzMDsPG92ZyGAgVfWfBtrUwEOZnwwOu2UjaPCbScLAEzYmzxyxafMgaUlRXMTsJJ1B7jgy0Y7gHt5FdgyimeAS+a6ZpDTQkLkCQbmk9OBHaPv+p6x99jLFFuOsTMPSlXl8FVlrSopFBP/sIQAbn6+bwsHA29sNGhMBQgf1cri4JYEbDkAAAAASUVORK5CYII=\\\");\\n}\\n.webix_upload_flash {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n bottom: 0;\\n left: 0;\\n background: #fff;\\n}\\n.webix_drop_file {\\n background: #f4f4f4;\\n position: relative;\\n}\\n.webix_drop_file::before {\\n position: absolute;\\n bottom: 10px;\\n left: 0px;\\n width: 100%;\\n text-align: center;\\n pointer-events: none;\\n}\\n.webix_fieldset > fieldset {\\n border: 1px solid #DADEE0;\\n margin: 0px;\\n padding: 5px 8px;\\n}\\n.webix_fieldset_label {\\n color: #475466;\\n font-size: 12px;\\n padding: 0px 8px;\\n text-transform: uppercase;\\n}\\n.webix_forminput > fieldset {\\n border: none;\\n margin: 0px;\\n padding: 0px;\\n}\\n.webix_forminput_label {\\n color: #475466;\\n font-family: Roboto, sans-serif;\\n float: left;\\n line-height: 32px;\\n padding: 3px 2px;\\n padding-right: 9px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\nlegend.webix_forminput_label_top {\\n width: 100%;\\n padding: 3px 2px 0;\\n}\\n.webix_slider_box {\\n position: relative;\\n padding: 0px 10px;\\n height: 100%;\\n float: left;\\n border-radius: 5px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin-top: -11px;\\n padding-top: 15px;\\n}\\n.webix_slider_box .webix_slider_left {\\n height: 10px;\\n float: left;\\n width: 100px;\\n background: #cbeff7;\\n border: 1px solid #e8eaec;\\n border-top-left-radius: 5px;\\n border-bottom-left-radius: 5px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_slider_box .webix_slider_right {\\n height: 10px;\\n float: left;\\n width: 100px;\\n background: #fff;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 5px;\\n border-bottom-right-radius: 5px;\\n border: 1px solid #e8eaec;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_slider_box .webix_slider_handle {\\n z-index: 1;\\n position: absolute;\\n width: 14px;\\n height: 14px;\\n top: 12px;\\n border-radius: 8px;\\n}\\n.webix_slider_box .webix_slider_handle:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_slider_box .webix_slider_left {\\n height: 6px;\\n border: 1px solid #CCD7E6;\\n background: #1CA1C1;\\n}\\n.webix_slider_box .webix_slider_right {\\n height: 6px;\\n border-color: #CCD7E6;\\n}\\n.webix_slider_box .webix_slider_handle {\\n width: 14px;\\n height: 14px;\\n border: 1px solid #CCD7E6;\\n background-color: #FFFFFF;\\n top: 10px;\\n}\\n.webix_rangeslider .webix_slider_box .webix_slider_left {\\n position: absolute;\\n}\\n.webix_rangeslider .webix_slider_box .webix_slider_active {\\n z-index: 2;\\n}\\n.webix_rangeslider .webix_slider_box .webix_slider_right {\\n border-radius: 5px;\\n}\\n.webix_rangeslider .webix_slider_title_box {\\n position: relative;\\n float: left;\\n height: 18px;\\n width: 1px;\\n}\\n.webix_rangeslider .webix_slider_title.webix_slider_move {\\n position: absolute;\\n}\\n.webix_rangeslider.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n border-top-left-radius: 5px;\\n border-bottom-left-radius: 5px;\\n border-top-right-radius: 5px;\\n border-bottom-right-radius: 5px;\\n}\\n.webix_rangeslider.webix_slider_vertical .webix_slider_title.webix_slider_move {\\n display: block;\\n position: relative;\\n}\\n.webix_slider_alt.webix_slider_vertical .webix_slider_box .webix_slider_handle {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFAQMAAABCXz8WAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAZQTFRFAAAAAAAApWe5zwAAAAJ0Uk5TNgD/j1xNAAAADklEQVR4nGNgYPjPAMYACgAB/xSLTywAAAAASUVORK5CYII=\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_left {\\n border: 1px solid #e1e1e1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_right {\\n border: 1px solid #e1e1e1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_handle {\\n width: 11px;\\n margin: 0 2px;\\n height: 14px;\\n top: 12px;\\n border-radius: 2px;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAYAAAAx8TU7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTJCMjdFNENBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTJCMjdFNERBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5MkIyN0U0QUFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5MkIyN0U0QkFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Powz/icAAAAaSURBVHjaYmBgYDBjgAA4zcSABQysIECAAQBn+ACx2PqtbAAAAABJRU5ErkJggg==\\\");\\n background-repeat: no-repeat;\\n background-position: 3px center;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_handle:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_left {\\n border: 1px solid #CCD7E6;\\n background: #1CA1C1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_right {\\n border-color: #CCD7E6;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_handle {\\n background-color: #FFFFFF;\\n border: 1px solid #CCD7E6;\\n top: 10px;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_left,\\n.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n width: 10px;\\n float: none;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_left {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 5px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 5px;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n border-top-left-radius: 5px;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 5px;\\n border-bottom-right-radius: 0;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_handle {\\n left: 7px;\\n}\\n.webix_slider_vertical .webix_slider_title {\\n padding-top: 1px;\\n text-align: left;\\n}\\n.webix_slider_vertical.webix_slider_alt .webix_slider_handle {\\n height: 11px;\\n width: 14px;\\n left: 5px;\\n}\\n.webix_slider_title {\\n text-align: center;\\n}\\n.webix_slider_title.webix_slider_move {\\n position: relative;\\n text-align: left;\\n display: inline-block;\\n width: auto;\\n white-space: nowrap;\\n}\\n.webix_switch_toggle {\\n position: absolute;\\n visibility: hidden;\\n}\\n.webix_switch_box {\\n display: block;\\n position: relative;\\n top: 50%;\\n margin-top: -12px;\\n height: 24px;\\n cursor: pointer;\\n background-color: #f1f1f1;\\n border: 1px solid #DADEE0;\\n border-radius: 60px;\\n transition: background-color 0.4s ease;\\n color: #666;\\n text-align: center;\\n float: left;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_el_switch .webix_label_right {\\n display: block;\\n padding-top: 3px;\\n margin-top: 4px;\\n}\\n.webix_switch_handle {\\n height: 22px;\\n width: 22px;\\n border-radius: 100%;\\n box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3);\\n border: 1px solid #eee;\\n position: absolute;\\n top: 0px;\\n background-color: #fff;\\n transition: left 0.3s ease;\\n cursor: pointer;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_switch_handle:focus,\\n.webix_switch_box:active .webix_switch_handle {\\n box-shadow: 0 0px 2px 2px rgba(0, 0, 0, 0.2);\\n}\\n.webix_switch_text {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n padding: 1px 0 0 18px;\\n display: inline-block;\\n width: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_switch_on .webix_switch_text {\\n padding: 1px 18px 0 0;\\n}\\n.webix_switch_box.webix_switch_on {\\n background-color: #F4F5F9;\\n color: #fff;\\n}\\n.webix_progress_top,\\n.webix_progress_bottom {\\n width: 100%;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n height: 6px;\\n overflow: hidden;\\n z-index: 95;\\n background: #f2f2f2;\\n}\\n.webix_progress_bottom {\\n bottom: 0px;\\n top: auto;\\n height: 17px;\\n}\\n.webix_progress_top .webix_progress_state,\\n.webix_progress_bottom .webix_progress_state {\\n width: 0px;\\n height: 6px;\\n background: #F4F5F9;\\n transition: width 3s;\\n}\\n.webix_progress_bottom .webix_progress_state {\\n height: 17px;\\n}\\n.webix_progress_icon {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n z-index: 95;\\n}\\n.webix_progress_icon .webix_progress_state {\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 50px;\\n position: absolute;\\n left: 50%;\\n top: 50%;\\n margin-left: -25px;\\n margin-top: -25px;\\n display: inline-block;\\n color: #93a0b3;\\n}\\n.webix_gage_box {\\n display: table;\\n height: 100%;\\n width: 100%;\\n}\\n.webix_gage_box > div {\\n display: table-cell;\\n vertical-align: middle;\\n}\\n.webix_gage_body {\\n height: 100%;\\n width: 100%;\\n transform: rotate(180deg);\\n}\\n.webix_gage_label {\\n font-size: 0.9em;\\n text-align: center;\\n margin-top: 10px;\\n}\\n.webix_gage_placeholder {\\n margin-top: -20px;\\n}\\n.webix_gage_info {\\n text-align: center;\\n font-size: 0.7em;\\n position: relative;\\n margin: 0 auto 10px auto;\\n}\\n.webix_gage_min_range {\\n left: -23%;\\n}\\n.webix_gage_max_range {\\n right: -23%;\\n}\\n.webix_gage_min_range,\\n.webix_gage_max_range {\\n display: inline-block;\\n margin-top: 20px;\\n position: absolute;\\n text-align: center;\\n width: 46%;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_gage_range_info {\\n font-size: 1.2em;\\n line-height: 1;\\n}\\n.webix_gage_value {\\n font-size: 2.2em;\\n color: #475466;\\n}\\n.webix_gage_value,\\n.webix_gage_range_info {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_gage_gradient_point_animated {\\n transition: transform 1.3s linear;\\n}\\n.webix_gage_animated {\\n stroke: hsl(120, 100%, 50%);\\n animation: gage_dash 1.3s linear forwards;\\n transition: stroke 1.3s linear, stroke-dasharray 1.3s linear;\\n}\\n@keyframes gage_dash {\\n to {\\n stroke-dashoffset: 0;\\n }\\n}\\n.webix_gage_small_font .webix_gage_info,\\n.webix_gage_small_font .webix_gage_range_info {\\n font-size: 1em;\\n}\\n.webix_gage_small_font .webix_gage_label,\\n.webix_gage_small_font .webix_gage_value {\\n font-weight: 500;\\n font-size: 1.2em;\\n}\\n.webix_gage_small_font .webix_gage_min_range,\\n.webix_gage_small_font .webix_gage_max_range {\\n margin-top: 0;\\n}\\n.webix_gage_small_font .webix_gage_placeholder {\\n margin-top: 0;\\n padding-top: 20px;\\n}\\n.webix_bullet_header {\\n font-weight: 500;\\n}\\n.webix_bullet_header,\\n.webix_bullet_subheader {\\n font-size: 14px;\\n fill: #475466;\\n}\\n.webix_bullet_scale {\\n fill: #74869f;\\n font-size: 12px;\\n font-weight: 500;\\n stroke: none;\\n text-anchor: middle;\\n}\\n.webix_bullet_scale_lines {\\n stroke: #74869f;\\n}\\n.webix_bullet_marker {\\n y: 5px;\\n width: 3px;\\n}\\n.webix_timeline .webix_scroll_cont {\\n padding-top: 28px;\\n}\\n.webix_timeline_item {\\n line-height: 0;\\n padding: 0 12px;\\n position: relative;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_timeline_date,\\n.webix_timeline_event {\\n line-height: 20px;\\n overflow: hidden;\\n position: absolute;\\n top: 0px;\\n}\\n.webix_timeline_left .webix_timeline_date,\\n.webix_timeline_right .webix_timeline_details,\\n.webix_timeline_right .webix_timeline_value {\\n text-align: right;\\n}\\n.webix_timeline_value {\\n font-weight: 500;\\n}\\n.webix_timeline_details {\\n color: #94A1B3;\\n padding-top: 2px;\\n}\\n.webix_timeline_date {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_timeline_horizontal .webix_scroll_cont {\\n white-space: nowrap;\\n display: inline-block;\\n padding-left: 28px;\\n height: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_timeline_horizontal .webix_timeline_item {\\n display: inline-block;\\n height: 100%;\\n padding: 12px 0 12px 0;\\n white-space: normal;\\n}\\n.webix_timeline_horizontal .webix_timeline_item .webix_timeline_date,\\n.webix_timeline_horizontal .webix_timeline_item .webix_timeline_event {\\n left: 0px;\\n}\\n.webix_timeline_horizontal .webix_timeline_item.webix_timeline_bottom .webix_timeline_event {\\n top: initial;\\n}\\n.webix_treemap {\\n background-color: #f5f5f5;\\n}\\n.webix_treemap .webix_scroll_cont {\\n position: relative;\\n height: 100%;\\n width: 100%;\\n}\\n.webix_treemap_item {\\n position: absolute;\\n color: #444;\\n overflow: hidden;\\n text-align: left;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 3px 5px;\\n border-width: 0px 1px 1px 0;\\n border-style: solid;\\n border-color: rgba(0, 0, 0, 0.2);\\n background: transparent;\\n cursor: pointer;\\n}\\n.webix_treemap_level_top {\\n z-index: 1;\\n border-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_treemap_item_bottom {\\n border-bottom-width: 0;\\n}\\n.webix_treemap_item_right {\\n border-right-width: 0;\\n}\\n.webix_treemap_item:hover {\\n box-shadow: inset 0 0 5px #666;\\n}\\n.webix_treemap_item.webix_selected {\\n border-color: #F4F5F9;\\n box-shadow: inset 0 0 1px 2px #F4F5F9;\\n}\\n.webix_treemap_header {\\n width: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_treemap_header {\\n padding: 0 10px;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_treemap_header_item {\\n cursor: pointer;\\n}\\n.webix_treemap_header_item:last-child {\\n cursor: default;\\n}\\n.webix_treemap_reset {\\n float: right;\\n width: 25px;\\n text-align: center;\\n}\\n.webix_treemap_reset:before {\\n content: \\\"\\\\F011\\\";\\n color: #475466;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 16px;\\n display: block;\\n cursor: pointer;\\n}\\n.webix_treemap_path_icon {\\n width: 20px;\\n text-align: center;\\n}\\n.webix_barcode {\\n position: relative;\\n}\\n.webix_barcode .webix_canvas_text {\\n font-size: 14px;\\n padding: 0 2px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.portlet_drag {\\n position: absolute;\\n z-index: 1;\\n top: 5px;\\n right: 5px;\\n width: 18px;\\n opacity: 0.5;\\n cursor: pointer;\\n}\\n.portlet_in_drag {\\n opacity: 0.4;\\n}\\n.portlet_marker,\\n.portlet_markertop,\\n.portlet_markerbottom,\\n.portlet_markerleft,\\n.portlet_markerright {\\n opacity: 0.5;\\n background: #9169BE;\\n position: absolute;\\n z-index: 2;\\n transition: top 0.5s, left 0.5s, width 0.5s, height 0.5s;\\n top: 0px;\\n left: 0px;\\n width: 100%;\\n height: 100%;\\n}\\n.portlet_markertop {\\n height: 50%;\\n}\\n.portlet_markerbottom {\\n height: 50%;\\n top: 50%;\\n}\\n.portlet_markerleft {\\n width: 50%;\\n}\\n.portlet_markerright {\\n width: 50%;\\n left: 50%;\\n}\\n.panel_icon {\\n position: absolute;\\n z-index: 93;\\n top: 5px;\\n right: 5px;\\n line-height: normal;\\n font-size: 13px;\\n width: 18px;\\n opacity: 0.5;\\n cursor: pointer;\\n}\\n.webix_disabled_view .panel_icon {\\n z-index: 91;\\n}\\n.panel_target {\\n position: absolute;\\n z-index: 3;\\n background: rgba(0, 0, 0, 0.04);\\n border: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_left {\\n border-width: 0 1px 0 0;\\n box-shadow: 2px 0 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_left.webix_animate {\\n transition: left 0.6s;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_right {\\n left: auto;\\n border-width: 0 0 0 1px;\\n box-shadow: -2px 0px 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_right.webix_animate {\\n transition: right 0.6s;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_top {\\n border-width: 0 0 1px 0 ;\\n box-shadow: 0 2px 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_top .webix_win_body {\\n position: relative;\\n}\\n.webix_sidemenu_top .webix_win_body > .webix_view {\\n position: absolute;\\n top: auto;\\n left: 0;\\n bottom: 0;\\n}\\n.webix_sidemenu_top.webix_animate,\\n.webix_sidemenu_top.webix_animate .webix_win_body {\\n transition: height 0.6s;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_bottom {\\n border-width: 1px 0 0 0 ;\\n top: auto;\\n box-shadow: 0 -2px 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_bottom.webix_animate,\\n.webix_sidemenu_bottom.webix_animate .webix_win_body {\\n transition: height 0.6s;\\n}\\n/* SideBar*/\\n.webix_sidebar {\\n background: #ECEFF1;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected:focus span {\\n background: transparent;\\n}\\n.webix_sidebar .webix_tree_item {\\n color: #454545;\\n height: 44px;\\n line-height: 43px;\\n}\\n.webix_sidebar .webix_scroll_cont > .webix_tree_leaves {\\n display: block;\\n padding: 0;\\n}\\n.webix_sidebar .webix_tree_leaves .webix_tree_leaves {\\n margin-left: 0px;\\n}\\n.webix_sidebar_selected,\\n.webix_sidebar_expanded .webix_tree_item:hover {\\n background-color: rgba(0, 0, 0, 0.02);\\n}\\n.webix_sidebar .webix_tree_item.webix_selected,\\n.webix_sidebar .webix_tree_item.webix_selected span {\\n background-color: #F4F5F9;\\n padding-right: 0;\\n}\\n.webix_sidebar .webix_tree_branch_1 .webix_tree_item {\\n padding-left: 44px;\\n}\\n.webix_sidebar .webix_tree_branch_1 > .webix_tree_item {\\n height: 44px;\\n line-height: 44px;\\n padding-left: 0;\\n}\\n.webix_sidebar .webix_tree_branch_1 {\\n border-bottom: 1px solid #e5e5e5;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected span,\\n.webix_sidebar .webix_tree_item span {\\n margin: 0;\\n padding: 0px;\\n}\\n.webix_icon.webix_sidebar_icon {\\n width: 44px;\\n text-align: center;\\n}\\nspan.webix_sidebar_dir_icon {\\n float: right;\\n line-height: inherit;\\n}\\n/*SubMenu (Popup) */\\n.webix_sidebar_popup {\\n border: none !important;\\n box-shadow: 2px 3px 3px #ddd;\\n}\\n.webix_sidebar_popup,\\n.webix_sidebar_popup .webix_list_item {\\n border-radius: 0;\\n}\\n.webix_sidebar_popup_right {\\n box-shadow: -3px 3px 3px #ddd;\\n}\\n.webix_sidebar_popup_list.webix_sidebar_popup_left .webix_icon {\\n float: right;\\n line-height: inherit;\\n width: 8px;\\n}\\n.webix_sidebar_popup_list.webix_sidebar_popup_right .webix_icon {\\n float: left;\\n line-height: inherit;\\n}\\n/*SubMenu: title*/\\n.webix_sidebar_popup_title {\\n background: #ECEFF1;\\n}\\n.webix_sidebar_popup_title.webix_selected {\\n border-left-color: #F4F5F9;\\n background: #F4F5F9;\\n}\\n.webix_sidebar_popup_title .webix_template {\\n line-height: 44px;\\n padding: 0 10px;\\n border: 1px solid #E5E5E5;\\n border-left: none;\\n}\\n.webix_sidebar_popup_right .webix_sidebar_popup_title .webix_template {\\n border: 1px solid #E5E5E5;\\n border-right: none;\\n}\\n.webix_sidebar_selected.webix_sidebar_popup_title .webix_template {\\n background: rgba(0, 0, 0, 0.03);\\n border-left: none;\\n}\\n.webix_sidebar_popup_list .webix_list_item {\\n border-left: 1px solid #E5E5E5;\\n border-right: 1px solid #E5E5E5;\\n}\\n/*SubMenu: list*/\\n.webix_sidebar_popup_list .webix_list_item:first-child {\\n border-top: 1px solid #E5E5E5;\\n}\\n.webix_sidebar_popup_list .webix_list_item:hover {\\n background: #f6f9fb;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_selected:hover {\\n background: #F4F5F9;\\n}\\n.webix_menu .webix_list_item.webix_sidebar_selected {\\n background: rgba(0, 0, 0, 0.02);\\n}\\n.webix_menu .webix_list_item.webix_sidebar_selected:hover {\\n background: rgba(0, 0, 0, 0.02) !important;\\n}\\n.webix_view.webix_pdf {\\n background-color: #404040;\\n overflow: auto;\\n}\\n.webix_pdf .canvas_wrapper {\\n margin: 0px auto;\\n box-shadow: 5px 5px 15px #1c1c1c;\\n width: 100%;\\n height: 100%;\\n}\\n.webix_toolbar.pdf_bar .webix_img_btn {\\n text-align: center;\\n}\\n.webix_toolbar.pdf_bar .webix_view {\\n background-color: transparent;\\n}\\n.webix_toolbar.pdf_bar .webix_icon_btn {\\n margin: 0;\\n}\\n.webix_toolbar.pdf_bar .webix_template {\\n background-color: transparent;\\n color: #fff;\\n line-height: 2em;\\n}\\n.webix_toolbar.pdf_bar .webix_el_box input,\\n.webix_toolbar.pdf_bar .webix_inp_static {\\n background-color: #5c5c5c;\\n color: #fff;\\n border-color: #404040;\\n}\\n.webix_toolbar.pdf_bar .webix_el_box input:focus,\\n.webix_toolbar.pdf_bar .webix_inp_static:focus {\\n border-color: #333;\\n}\\n.webix_toolbar.pdf_bar .webix_el_box .webix_input_icon {\\n color: #fff;\\n}\\n.webix_view.webix_popup.pdf_opt_list {\\n border: none;\\n}\\n.pdf_opt_list .webix_list {\\n background-color: #404040;\\n color: #fff;\\n}\\n.pdf_opt_list .webix_list .webix_list_item {\\n border-color: #474747;\\n line-height: 1.5em;\\n}\\n.pdf_opt_list .webix_list .webix_list_item.webix_selected,\\n.pdf_opt_list .webix_list .webix_list_item:hover {\\n color: #404040;\\n background-color: #fff;\\n}\\n.webix_dbllist .bottom_label {\\n text-align: center;\\n font-size: 10px;\\n}\\n.webix_dbllist .webix_list,\\n.webix_dbllist .bottom_label {\\n background: #ededed;\\n}\\n.webix_dbllist .webix_list_item {\\n background: #FFFFFF;\\n margin: 3px 4px 0px 4px;\\n border: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_dbllist .webix_list_item.webix_selected {\\n border-bottom-color: #DADEE0;\\n background-color: #F4F5F9;\\n color: #475466;\\n}\\n.webix_dbllist .dbllist_button {\\n width: 45%;\\n height: 30px;\\n margin-top: 4px;\\n padding: 0;\\n border-radius: 2px;\\n border: 1px solid #DADEE0;\\n cursor: pointer;\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n background-color: #F4F5F9;\\n}\\n.webix_dbllist .dbllist_button .webix_icon {\\n color: #1CA1C1;\\n font-size: 20px;\\n width: 26px;\\n}\\n.webix_dbllist .dbllist_button:first-child {\\n margin-top: 36px;\\n margin-right: 4px;\\n}\\n.webix_dbllist .dbllist_button:last-child {\\n margin-left: 4px;\\n}\\n.webix_dbllist .dbllist_button:hover,\\n.webix_dbllist .dbllist_button:focus,\\n.webix_dbllist .dbllist_button:active {\\n background-color: #e7e9f2;\\n}\\n.webix_invalid .webix_list {\\n background: #f8e2e2;\\n}\\n.dbllist_buttons .webix_template {\\n padding: 0 0 0 4px;\\n}\\n.webix_sparklines {\\n padding: 1px 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_sparklines svg {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_sparklines_line {\\n stroke: #3498db;\\n stroke-width: 1;\\n fill: transparent;\\n stroke-linecap: round;\\n}\\n.webix_sparklines_item {\\n fill: #3498db;\\n stroke-width: 1;\\n}\\n.webix_sparklines_bar {\\n fill: #6dbcf0;\\n}\\n.webix_sparklines_bar_negative {\\n fill: #d86c79;\\n}\\n.webix_sparklines_area {\\n fill: #e5eef4;\\n opacity: 0.5;\\n}\\n.webix_sparklines_origin {\\n stroke: #888;\\n stroke-width: 1;\\n fill: transparent;\\n}\\n.webix_sparklines_event_area {\\n fill: transparent;\\n}\\n.webix_sparklines_donut_hole {\\n fill: #FFFFFF;\\n}\\n.webix_sparklines_line_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_area_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_splinearea_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_radar_chart .webix_sparklines_event_area:hover {\\n fill: rgba(220, 220, 220, 0.4);\\n stroke: rgba(255, 255, 255, 0.6);\\n}\\n.webix_sparklines_pie_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_bar_chart .webix_sparklines_event_area:hover {\\n fill: rgba(255, 255, 255, 0.3);\\n}\\n/* print css rules*/\\n.webix_ui_print,\\n.webix_print_pdf {\\n display: none;\\n}\\nbody.webix_print {\\n margin-top: 0px;\\n}\\n@media print {\\n body.webix_print {\\n overflow: visible !important;\\n background-color: none !important;\\n }\\n body.webix_print > * {\\n display: none;\\n }\\n body.webix_print * {\\n visibility: hidden;\\n }\\n .webix_ui_print {\\n display: block !important;\\n margin: 0 0 0 0!important;\\n visibility: visible !important;\\n }\\n .webix_ui_print * {\\n visibility: visible !important;\\n }\\n .webix_print_noscroll {\\n height: auto !important;\\n width: auto !important;\\n }\\n .webix_print_noscroll,\\n .webix_print_noscroll .webix_scroll_cont {\\n overflow: visible !important;\\n }\\n .webix_print_pagebreak {\\n page-break-after: always;\\n }\\n .webix_print_header,\\n .webix_print_footer {\\n display: block !important;\\n padding: 20px 0px;\\n text-align: center;\\n height: auto !important;\\n visibility: visible !important;\\n }\\n .webix_print_header *,\\n .webix_print_footer * {\\n visibility: visible !important;\\n }\\n /*datatable specific*/\\n .webix_table_print {\\n display: table;\\n visibility: visible !important;\\n table-layout: fixed;\\n width: 100%;\\n border: 1px solid #ebebeb;\\n margin-bottom: 20px;\\n position: initial;\\n }\\n .webix_table_print td {\\n overflow: hidden;\\n }\\n .webix_table_print tr {\\n page-break-inside: avoid;\\n }\\n .webix_table_print .webix_print_top_split .webix_cell {\\n border-bottom: 1px solid #d2d2d2;\\n }\\n .webix_table_print .webix_cell {\\n display: table-cell !important;\\n border-right: 1px solid #ebebeb;\\n border-bottom: 1px solid #ebebeb;\\n padding: 0px 10px;\\n white-space: nowrap;\\n }\\n .webix_table_print .webix_header_cell {\\n display: table-cell;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n background: #F4F5F9;\\n border-right: 1px solid #DADEE0;\\n border-bottom: 1px solid #DADEE0;\\n }\\n .webix_table_print .webix_footer_cell {\\n display: table-cell;\\n background: #fafafa;\\n border-right: 1px solid #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n border-bottom: 1px solid #EDEFF0;\\n }\\n .webix_table_print .webix_cell.webix_dtable_span {\\n position: initial !important;\\n white-space: normal;\\n }\\n .webix_table_print .webix_rotate {\\n transform-origin: center 40% !important;\\n }\\n .webix_table_print.borderless,\\n .webix_table_print.borderless .webix_cell {\\n border: none;\\n }\\n /* x-list specific*/\\n .webix_table_print.webix_view.webix_list-x {\\n white-space: normal;\\n }\\n .webix_table_print.webix_view.webix_list-x .webix_list_item {\\n display: table-cell;\\n }\\n}\\n.webix_fullscreen_html .webix_template > * {\\n width: 100% !important;\\n height: 100% !important;\\n margin: 0px !important;\\n}\\n.webix_icon,\\n.webix_icon_btn,\\n.webix_input_icon {\\n display: inline-block;\\n font-family: \\\"Webix Material Icons\\\";\\n font-style: normal;\\n font-weight: normal;\\n line-height: 1;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n transform: translate(0, 0);\\n}\\n.webix_icon,\\n.webix_input_icon {\\n font-size: 17px;\\n display: inline-block;\\n width: 20px;\\n}\\n.webix_input_icon {\\n float: right;\\n font-size: 20px;\\n color: #94A1B3;\\n}\\n.webix_icon_button {\\n background-color: transparent;\\n border: none;\\n padding: 0;\\n cursor: pointer;\\n vertical-align: middle;\\n}\\n.webix_el_icon .webix_el_box {\\n padding: 0;\\n margin: 0 auto;\\n text-align: center;\\n position: relative;\\n overflow: visible;\\n cursor: pointer;\\n}\\n.webix_icon_button .webix_icon {\\n font-size: 20px;\\n height: 20px;\\n width: 20px;\\n display: inline-block;\\n text-align: center;\\n color: #94A1B3;\\n}\\n.webix_icon_btn {\\n font-size: 20px;\\n display: inline-block;\\n text-align: center;\\n width: 20px;\\n margin-right: 4px;\\n color: #94A1B3;\\n}\\n.webix_icon {\\n text-align: center;\\n}\\n.webix_badge {\\n background-color: #ff8839;\\n color: #FFFFFF;\\n border-radius: 11px;\\n font-size: 12px;\\n height: 22px;\\n min-width: 22px;\\n padding: 0 4px;\\n text-align: center;\\n line-height: 22px;\\n position: absolute;\\n right: 0;\\n top: 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_badge.webix_measure_size {\\n right: auto;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_list_item .webix_badge {\\n position: static;\\n float: right;\\n margin: 4px -5px 0 12px;\\n}\\n@font-face {\\n font-family: Roboto;\\n src: url('fonts/Roboto-Regular-webfont.woff2') format('woff2'), url('fonts/Roboto-Regular-webfont.woff') format('woff');\\n font-weight: normal;\\n font-style: normal;\\n}\\n@font-face {\\n font-family: Roboto;\\n src: url('fonts/Roboto-Medium-webfont.woff2') format('woff2'), url('fonts/Roboto-Medium-webfont.woff') format('woff');\\n font-style: normal;\\n font-weight: 500;\\n}\\n.mainFont {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.buttonFont {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n}\\n.selectFocusRule {\\n background: #edeff5;\\n}\\n.layoutBarBG .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.layoutBarBG.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.layoutBarBG.webix_dark .webix_el_button,\\n.layoutBarBG.webix_dark .webix_el_label .webix_el_box,\\n.layoutBarBG.webix_dark .webix_inp_label,\\n.layoutBarBG.webix_dark .webix_inp_top_label,\\n.layoutBarBG.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_secondary .webix_icon,\\n.layoutBarBG.webix_dark .webix_transparent .webix_icon,\\n.layoutBarBG.webix_dark .webix_secondary .webix_img_btn_text,\\n.layoutBarBG.webix_dark .webix_transparent .webix_img_btn_text,\\n.layoutBarBG.webix_dark .webix_secondary .webix_icon_btn,\\n.layoutBarBG.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_transparent button:hover,\\n.layoutBarBG.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.layoutBarBG.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_secondary button,\\n.layoutBarBG.webix_dark .webix_inp_counter_next,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev,\\n.layoutBarBG.webix_dark .webix_segment_0,\\n.layoutBarBG.webix_dark .webix_segment_1,\\n.layoutBarBG.webix_dark .webix_segment_N,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.layoutBarBG.webix_dark .webix_secondary button:hover,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item:hover,\\n.layoutBarBG.webix_dark .webix_inp_counter_next:hover,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev:hover,\\n.layoutBarBG.webix_dark .webix_segment_0:hover,\\n.layoutBarBG.webix_dark .webix_segment_1:hover,\\n.layoutBarBG.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_secondary button:focus,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item:focus,\\n.layoutBarBG.webix_dark .webix_inp_counter_next:focus,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev:focus,\\n.layoutBarBG.webix_dark .webix_segment_0:focus,\\n.layoutBarBG.webix_dark .webix_segment_1:focus,\\n.layoutBarBG.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_secondary button:active,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item:active,\\n.layoutBarBG.webix_dark .webix_inp_counter_next:active,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev:active,\\n.layoutBarBG.webix_dark .webix_segment_0:active,\\n.layoutBarBG.webix_dark .webix_segment_1:active,\\n.layoutBarBG.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_inp_static,\\n.layoutBarBG.webix_dark input[type=text],\\n.layoutBarBG.webix_dark input[type=combo],\\n.layoutBarBG.webix_dark input[type=datepicker],\\n.layoutBarBG.webix_dark textarea,\\n.layoutBarBG.webix_dark select,\\n.layoutBarBG.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.layoutBarBG.webix_dark .webix_el_texthighlight input,\\n.layoutBarBG.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.layoutBarBG.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.layoutBarBG.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_multicombo_value,\\n.layoutBarBG.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.layoutBarBG.webix_dark .webix_inp_static:focus,\\n.layoutBarBG.webix_dark input[type=text]:focus,\\n.layoutBarBG.webix_dark input[type=combo]:focus,\\n.layoutBarBG.webix_dark input[type=datepicker]:focus,\\n.layoutBarBG.webix_dark textarea:focus,\\n.layoutBarBG.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.layoutBarBG.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.layoutBarBG.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0:hover,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1:hover,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0:focus,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1:focus,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0:active,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1:active,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.layoutBarBG.webix_dark .webix_el_icon,\\n.layoutBarBG.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.layoutBarBG.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.layoutBarBG.webix_dark .webix_icon_button:hover .webix_icon,\\n.layoutBarBG.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.layoutBarBG.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.layoutBarBG.webix_dark .webix_custom_checkbox,\\n.layoutBarBG.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_custom_checkbox:focus,\\n.layoutBarBG.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.layoutBarBG.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.layoutBarBG.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.layoutBarBG.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.layoutBarBG.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.layoutBarBG.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box input,\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box select,\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box textarea,\\n.layoutBarBG.webix_dark input.webix_invalid,\\n.layoutBarBG.webix_dark select.webix_invalid,\\n.layoutBarBG.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.layoutBarBG.webix_dark .webix_invalid .webix_multicombo_value,\\n.layoutBarBG.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_toolbar.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_toolbar.webix_dark .webix_el_button,\\n.webix_toolbar.webix_dark .webix_el_label .webix_el_box,\\n.webix_toolbar.webix_dark .webix_inp_label,\\n.webix_toolbar.webix_dark .webix_inp_top_label,\\n.webix_toolbar.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_secondary .webix_icon,\\n.webix_toolbar.webix_dark .webix_transparent .webix_icon,\\n.webix_toolbar.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_toolbar.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_toolbar.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_toolbar.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_transparent button:hover,\\n.webix_toolbar.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_secondary button,\\n.webix_toolbar.webix_dark .webix_inp_counter_next,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev,\\n.webix_toolbar.webix_dark .webix_segment_0,\\n.webix_toolbar.webix_dark .webix_segment_1,\\n.webix_toolbar.webix_dark .webix_segment_N,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_toolbar.webix_dark .webix_secondary button:hover,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_toolbar.webix_dark .webix_inp_counter_next:hover,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev:hover,\\n.webix_toolbar.webix_dark .webix_segment_0:hover,\\n.webix_toolbar.webix_dark .webix_segment_1:hover,\\n.webix_toolbar.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_secondary button:focus,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_toolbar.webix_dark .webix_inp_counter_next:focus,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev:focus,\\n.webix_toolbar.webix_dark .webix_segment_0:focus,\\n.webix_toolbar.webix_dark .webix_segment_1:focus,\\n.webix_toolbar.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_secondary button:active,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_toolbar.webix_dark .webix_inp_counter_next:active,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev:active,\\n.webix_toolbar.webix_dark .webix_segment_0:active,\\n.webix_toolbar.webix_dark .webix_segment_1:active,\\n.webix_toolbar.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_inp_static,\\n.webix_toolbar.webix_dark input[type=text],\\n.webix_toolbar.webix_dark input[type=combo],\\n.webix_toolbar.webix_dark input[type=datepicker],\\n.webix_toolbar.webix_dark textarea,\\n.webix_toolbar.webix_dark select,\\n.webix_toolbar.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_dark .webix_el_texthighlight input,\\n.webix_toolbar.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_multicombo_value,\\n.webix_toolbar.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_toolbar.webix_dark .webix_inp_static:focus,\\n.webix_toolbar.webix_dark input[type=text]:focus,\\n.webix_toolbar.webix_dark input[type=combo]:focus,\\n.webix_toolbar.webix_dark input[type=datepicker]:focus,\\n.webix_toolbar.webix_dark textarea:focus,\\n.webix_toolbar.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_toolbar.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_toolbar.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_toolbar.webix_dark .webix_el_icon,\\n.webix_toolbar.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_toolbar.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_toolbar.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_toolbar.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_toolbar.webix_dark .webix_custom_checkbox,\\n.webix_toolbar.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_custom_checkbox:focus,\\n.webix_toolbar.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_toolbar.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_toolbar.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_toolbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_toolbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_toolbar.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box input,\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box select,\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_toolbar.webix_dark input.webix_invalid,\\n.webix_toolbar.webix_dark select.webix_invalid,\\n.webix_toolbar.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_toolbar.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_toolbar.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_layout_space > .webix_toolbar {\\n border-radius: 2px;\\n}\\n.webix_view.webix_layout_accordion {\\n background-color: #EBEDF0;\\n}\\n.webix_accordionitem .webix_accordionitem_button {\\n float: right;\\n position: relative;\\n height: 19px;\\n width: 19px;\\n margin: 13.5px 13px;\\n}\\n.webix_accordionitem .webix_accordionitem_header {\\n line-height: 44px;\\n}\\n.webix_accordionitem .webix_accordionitem_header:hover,\\n.webix_accordionitem .webix_accordionitem_header:focus {\\n background-color: #fafafa;\\n}\\n.webix_accordionitem.collapsed .webix_accordionitem_button {\\n float: right;\\n position: relative;\\n margin-top: 12.5px;\\n}\\n.webix_accordionitem.horizontal.collapsed,\\n.webix_accordionitem.collapsed {\\n background-color: #F4F5F9;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header,\\n.webix_accordionitem.collapsed .webix_accordionitem_header {\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header .webix_accordionitem_button,\\n.webix_accordionitem.collapsed .webix_accordionitem_header .webix_accordionitem_button {\\n color: #1CA1C1;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header .webix_accordionitem_label .webix_icon,\\n.webix_accordionitem.collapsed .webix_accordionitem_header .webix_accordionitem_label .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:hover,\\n.webix_accordionitem.collapsed .webix_accordionitem_header:hover,\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:focus,\\n.webix_accordionitem.collapsed .webix_accordionitem_header:focus {\\n background-color: #edeff5;\\n}\\n.webix_accordionitem_label {\\n padding-left: 12px;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header .webix_accordionitem_button {\\n color: #FFFFFF;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header.collapsed {\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header.collapsed .webix_accordionitem_button {\\n color: #1CA1C1;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header:hover,\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header:focus {\\n background-color: #61707e;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:hover,\\n.webix_layout_accordion.webix_dark .webix_accordionitem.collapsed .webix_accordionitem_header:hover,\\n.webix_layout_accordion.webix_dark .webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:focus,\\n.webix_layout_accordion.webix_dark .webix_accordionitem.collapsed .webix_accordionitem_header:focus {\\n background-color: #edeff5;\\n}\\n.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button {\\n color: #94A1B3;\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n text-align: center;\\n width: 24px;\\n height: 43px;\\n margin: 0 10px 0 10px;\\n}\\n.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_label .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F002';\\n}\\n.webix_accordionitem .webix_accordionitem_header.collapsed .webix_accordionitem_button:before {\\n content: '\\\\F004';\\n}\\n.webix_accordionitem.horizontal:last-child > .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F003';\\n}\\n.webix_accordionitem.horizontal.collapsed:last-child > .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F001';\\n}\\n.webix_accordionitem.vertical > .webix_accordionitem_header .webix_accordionitem_button {\\n height: 43px;\\n margin: 0px 10px 0 10px;\\n}\\n.webix_accordionitem.vertical > .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F004';\\n}\\n.webix_accordionitem.vertical > .webix_accordionitem_header.collapsed .webix_accordionitem_button:before {\\n content: '\\\\F001';\\n}\\n.webix_toolbar.webix_layout_subbar {\\n background: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar .webix_view {\\n color: #475466;\\n}\\n.webix_el_tabbar + .webix_multiview {\\n background-color: #FFFFFF;\\n}\\n.webix_layout_space > .webix_view,\\n.webix_layout_wide > .webix_view {\\n border-radius: 2px;\\n}\\n.webix_layout_space .webix_layout_accordion .webix_accordionitem,\\n.webix_layout_wide .webix_layout_accordion .webix_accordionitem {\\n border-radius: 2px;\\n}\\n.webix_popup_button {\\n border-color: #F4F5F9;\\n}\\n.webix_popup_button.confirm {\\n border-color: #1CA1C1;\\n}\\n.webix_popup_button div {\\n border-radius: 0;\\n}\\n.dataHeaderFont {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_dtable .webix_ss_header .webix_hcell,\\n.webix_dtable .webix_ss_footer .webix_hcell {\\n border-color: transparent;\\n}\\n.webix_dtable .webix_ss_body .webix_column > div,\\n.webix_dtable .webix_ss_body .webix_table_cell {\\n border-right-color: transparent;\\n border-left-color: transparent;\\n}\\n.webix_dtable.webix_header_border .webix_ss_header .webix_hcolumn > div,\\n.webix_dtable.webix_header_border .webix_ss_header .webix_span {\\n border-right-color: #DADEE0;\\n border-bottom-color: #DADEE0;\\n}\\n.webix_dtable.webix_footer_border .webix_ss_footer .webix_hcolumn > div,\\n.webix_dtable.webix_footer_border .webix_ss_footer .webix_span {\\n border-right-color: #DADEE0;\\n border-top-color: #DADEE0;\\n}\\n.webix_dtable.webix_data_border .webix_ss_body .webix_column > div,\\n.webix_dtable.webix_data_border .webix_table_cell {\\n border-right-color: #EDEFF0;\\n}\\n.webix_dtable .webix_ss_left .webix_column.webix_last > div,\\n.webix_dtable .webix_table_cell.webix_last_rightcell {\\n border-right: 1px solid #ccd2d4;\\n}\\n.webix_dtable div.webix_last_topcell {\\n border-bottom: 1px solid #ccd2d4;\\n}\\n.webix_dtable .webix_ss_right .webix_column.webix_first > div {\\n border-left: 1px solid #ccd2d4;\\n}\\n.webix_dtable .webix_hs_right .webix_hcell.webix_first {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_dtable .webix_hs_left .webix_hcell.webix_last {\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_dtable .webix_hcell.webix_ss_filter {\\n padding: 0px 4px;\\n}\\n.webix_dtable .webix_hcell.webix_div_filter {\\n padding: 1px 4px;\\n}\\n.webix_dtable .webix_dtable_subview {\\n background: #FFFFFF;\\n}\\n.webix_dtable .webix_dtable_subview .webix_view {\\n border-left-width: 1px;\\n border-right-width: 1px;\\n border-color: #EDEFF0;\\n}\\n.webix_dtable .webix_ss_filter select,\\n.webix_dtable .webix_ss_filter input {\\n height: 32px;\\n vertical-align: middle;\\n border-radius: 2px;\\n border-color: #CCD7E6;\\n}\\n.webix_dtable .webix_ss_filter select:focus,\\n.webix_dtable .webix_ss_filter input:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_dtable .webix_select_mark > div.webix_row_select {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_dtable .webix_ss_header .webix_hcolumn div.webix_last_row,\\n.webix_dtable .webix_ss_header .webix_span.webix_last_row {\\n border-bottom: 1px solid #5ccce7;\\n}\\n.webix_dtable .webix_ss_footer .webix_hcolumn > div:first-child,\\n.webix_dtable .webix_ss_footer .webix_hcell[row=\\\"0\\\"] {\\n border-top: 1px solid #5ccce7;\\n}\\n.webix_dtable .webix_ss_footer,\\n.webix_dtable .webix_ss_footer .webix_hcolumn,\\n.webix_dtable .webix_ss_footer .webix_hs_left,\\n.webix_dtable .webix_ss_footer .webix_hs_center,\\n.webix_dtable .webix_ss_footer .webix_hs_right,\\n.webix_dtable .webix_ss_footer div.webix_ss_vscroll_footer {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n background: #F4F5F9;\\n}\\n.webix_dtable .webix_column > .webix_drag_over.webix_cell {\\n background-color: #F4F5F9;\\n}\\n.webix_block_selection {\\n border: none;\\n background: #1CA1C1;\\n opacity: 0.1;\\n}\\n.webix_area_selection,\\n.webix_area_selection_handle {\\n background: #1CA1C1;\\n}\\n.webix_dtable_focused .webix_area_selection,\\n.webix_dtable_focused .webix_area_selection_handle {\\n background-color: #1992af;\\n}\\n.dtBodyCell {\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_dtable div.webix_ss_vscroll_header {\\n border-bottom-color: #5ccce7;\\n}\\n.webix_dtable div.webix_ss_vscroll_footer {\\n border-top-color: #5ccce7;\\n border-left-color: #DADEE0;\\n}\\n.webix_view .webix_dt_editor input,\\n.webix_view .webix_dt_editor select {\\n border-color: #1CA1C1;\\n border-radius: 2px;\\n}\\n.dataItemStyle {\\n border-color: #EDEFF0;\\n}\\n.webix_list_item.webix_group_back {\\n color: #313131;\\n background: #F4F5F9;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_dataview_item {\\n border-right-color: #EDEFF0;\\n line-height: 24px;\\n}\\n.webix_dataview_item.webix_selected {\\n box-shadow: none;\\n}\\n.webix_dataview_item.tiles.webix_selected {\\n border-color: #5ccce7;\\n}\\n.webix_view .webix_pager_item {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n outline: none;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_view .webix_pager_item:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_view .webix_pager_item:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_view .webix_pager_item:active {\\n background-color: #daddeb;\\n}\\n.webix_view .webix_pager_item_selected {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_view .webix_pager_item_selected:hover {\\n background-color: #1992af;\\n}\\n.webix_view .webix_pager_item_selected:focus {\\n background-color: #1992af;\\n}\\n.webix_view .webix_pager_item_selected:active {\\n background-color: #17839d;\\n}\\n.webix_view .webix_pager_item,\\n.webix_view .webix_pager_item_selected {\\n border-radius: 2px;\\n border-width: 0px;\\n}\\n.webix_list .webix_unit_header {\\n font-weight: normal;\\n text-shadow: none;\\n border-bottom: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background: #F4F5F9;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_list .webix_unit_header:not(:first-child) {\\n border-top: 1px solid #DADEE0;\\n margin-top: -1px;\\n}\\n.webix_tree .webix_tree_item.webix_selected {\\n background-color: #F4F5F9;\\n}\\n.webix_tree .webix_tree_item.webix_selected:focus {\\n background-color: #edeff5;\\n}\\n.webix_tree .webix_tree_item.webix_selected span {\\n background-color: transparent;\\n padding: 0;\\n margin: 0;\\n}\\n.webix_tree .webix_tree_item.webix_selected div {\\n background-color: transparent;\\n}\\n.webix_tree .webix_tree_item,\\n.webix_tree .webix_tree_item.webix_selected {\\n padding-right: 12px;\\n}\\n.webix_tree_open,\\n.webix_tree_close {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n text-align: center;\\n color: #94A1B3;\\n}\\n.webix_tree_open:before {\\n margin-left: -2px;\\n content: \\\"\\\\F027\\\";\\n}\\n.webix_tree_close:before {\\n margin-left: -2px;\\n content: \\\"\\\\F028\\\";\\n}\\n.webix_tree_folder,\\n.webix_tree_folder_open,\\n.webix_tree_file {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 20px;\\n margin: 0 4px 0 0;\\n width: 24px;\\n text-align: center;\\n color: #DADEE0;\\n}\\n.webix_tree_folder:before {\\n content: \\\"\\\\F030\\\";\\n}\\n.webix_tree_folder_open:before {\\n content: \\\"\\\\F031\\\";\\n}\\n.webix_tree_file:before {\\n content: \\\"\\\\F032\\\";\\n}\\n.webix_menu-x .webix_list_item .webix_submenu_icon,\\n.webix_view.webix_menu .webix_list_item .webix_submenu_icon {\\n font-size: 14px;\\n font-family: \\\"Webix Material Icons\\\";\\n width: 6px;\\n top: 0;\\n margin-left: 0;\\n}\\n.webix_view.webix_popup.webix_menu {\\n border: none;\\n}\\n.webix_menu.webix_view .webix_list_item:hover,\\n.webix_menu.webix_view .webix_list_item:active {\\n background-color: #edeff5;\\n}\\n.webix_menu.webix_view .webix_list_item .webix_submenu_icon:before {\\n content: '\\\\F003';\\n}\\n.webix_menu.webix_view .webix_list_item.webix_selected {\\n background: #F4F5F9;\\n}\\n.webix_menu.webix_view .webix_list_item.webix_disabled {\\n background-color: #FFFFFF;\\n}\\n.webix_menu.webix_view .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_property .webix_property_label_line {\\n background-color: #F4F5F9;\\n}\\n.webix_drag_over,\\n.webix_drop_zone {\\n background-color: #F4F5F9;\\n}\\n.webix_view button,\\n.webix_view input[type=button] {\\n -webkit-appearance: none;\\n}\\n.focusStyle {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_search input,\\n.webix_el_combo input,\\n.webix_el_colorpicker input {\\n padding-right: 28px;\\n}\\n.webix_el_search input,\\n.webix_el_text input,\\n.webix_el_combo input,\\n.webix_el_colorpicker input,\\n.webix_el_datepicker input {\\n border-radius: 2px;\\n}\\n.webix_el_search input:focus,\\n.webix_el_text input:focus,\\n.webix_el_combo input:focus,\\n.webix_el_colorpicker input:focus,\\n.webix_el_datepicker input:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_richselect .webix_inp_static,\\n.webix_el_datepicker .webix_inp_static,\\n.webix_el_colorpicker .webix_inp_static {\\n border-radius: 2px;\\n padding-right: 28px;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n}\\n.webix_el_richselect .webix_inp_static:focus,\\n.webix_el_datepicker .webix_inp_static:focus,\\n.webix_el_colorpicker .webix_inp_static:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_textarea textarea:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_select select:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_select select,\\n.webix_el_textarea textarea {\\n border-radius: 2px;\\n}\\n.webix_el_text .webix_inp_static {\\n border-radius: 2px;\\n white-space: nowrap;\\n}\\n.webix_focused .webix_inp_static {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_multilist .wxi-checkbox-marked {\\n color: #1CA1C1;\\n}\\n.webix_multilist .wxi-checkbox-blank {\\n color: #94A1B3;\\n}\\n.webix_multicombo_value,\\n.webix_multicombo_tag,\\n.webix_multicombo_value.webix_readonly {\\n background-color: #EBEDF0;\\n border-radius: 100px;\\n padding: 0 12px 0 12px;\\n}\\n.webix_multicombo_value:has(> .webix_multicombo_delete) {\\n padding: 0 26px 0 12px;\\n}\\n.webix_multicombo_delete {\\n color: #94A1B3;\\n margin-top: -10px;\\n font-size: 20px;\\n height: 20px;\\n}\\n.webix_multicombo_delete::after {\\n content: \\\"\\\\F033\\\";\\n}\\n.webix_checksuggest_select_all:hover {\\n background-color: #F4F5F9;\\n border-radius: 2px;\\n}\\n.webix_checksuggest_select_all:hover .webix_label_right {\\n color: #1CA1C1;\\n}\\n.webix_checksuggest_select_all .webix_label_right {\\n text-align: center;\\n font-size: 16px;\\n color: #1CA1C1;\\n}\\n.webix_checksuggest_select_all.webix_el_checkbox .webix_label_right {\\n padding-top: 5px;\\n}\\n.buttonStyle {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n}\\n.webix_el_colorpicker div.webix_inp_static div {\\n margin: 2.5px -20px 0px -5px;\\n}\\ndiv.webix_inp_static,\\n.webix_el_textarea textarea {\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n}\\n.webix_el_select select {\\n font-family: Roboto, sans-serif;\\n border-color: #DADEE0;\\n}\\n.webix_el_checkbox input {\\n border-color: #DADEE0;\\n}\\n.webix_el_counter .webix_inp_counter_value {\\n width: 42px;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n}\\n.webix_el_counter .webix_inp_counter_prev,\\n.webix_el_counter .webix_inp_counter_next {\\n background: #F4F5F9;\\n width: 30px;\\n border: 1px solid #CCD7E6;\\n font-weight: bold;\\n font-family: \\\"Courier New\\\", Courier, monospace;\\n}\\n.webix_el_counter .webix_inp_counter_prev {\\n font-size: 20px;\\n border-right: none;\\n}\\n.webix_el_counter .webix_inp_counter_next {\\n font-size: 20px;\\n border-left: none;\\n}\\n.webix_view.webix_control.webix_el_tabbar {\\n background: #FFFFFF;\\n}\\n.webix_all_tabs .webix_item_tab {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n border: none;\\n}\\n.webix_all_tabs .webix_item_tab:hover {\\n background-color: #F4F5F9;\\n}\\n.webix_all_tabs .webix_item_tab .webix_icon.webix_tab_close {\\n width: 28px;\\n font-size: 20px;\\n padding: 0;\\n margin-top: 1px;\\n color: #94A1B3;\\n}\\n.webix_all_tabs .webix_item_tab .webix_icon.webix_tab_close:focus {\\n color: #FF5C4C;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected {\\n box-shadow: inset 0 -2px #1CA1C1;\\n padding-bottom: 0;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected:hover {\\n background-color: transparent;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected:focus {\\n color: #17839d;\\n box-shadow: inset 0 -2px #17839d;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected.webix_disabled {\\n box-shadow: inset 0 -2px #94A1B3;\\n}\\n.webix_all_tabs .webix_tab_filler {\\n border: none;\\n}\\n.webix_all_tabs .webix_tab_more_icon .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_all_tabs .webix_tab_more_icon:hover,\\n.webix_all_tabs .webix_tab_more_icon:focus {\\n background-color: #F4F5F9;\\n}\\n.webixtype_bottom .webix_item_tab,\\n.webixtype_bottom .webix_item_tab.webix_selected {\\n background: #FFFFFF;\\n padding: 0;\\n}\\n.webixtype_bottom .webix_item_tab:last-child,\\n.webixtype_bottom .webix_item_tab.webix_selected:last-child {\\n border-right: none;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected {\\n box-shadow: inset 0 2px #1CA1C1;\\n background: #FFFFFF;\\n color: #1CA1C1;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected:focus {\\n box-shadow: inset 0 2px #17839d;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected.webix_disabled {\\n box-shadow: inset 0 2px #94A1B3;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin: 0 auto;\\n text-align: center;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-size: 24px;\\n margin: 0 3px;\\n height: 100%;\\n line-height: inherit;\\n vertical-align: top;\\n width: 100%;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab.webix_selected {\\n background: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn:active,\\n.webix_el_tabbar .webixtype_icon .webix_img_btn_top:active {\\n background-color: #FFFFFF;\\n}\\n.webix_accordionitem_label .webix_icon {\\n margin-right: 8px;\\n}\\n.webix_el_tabbar .webixtype_iconTop,\\n.webix_el_tabbar .webixtype_image {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab,\\n.webix_el_tabbar .webixtype_image .webix_item_tab {\\n font-size: 14px;\\n padding-top: 2px;\\n padding-bottom: 2px;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top .webix_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top .webix_image,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top .webix_image {\\n top: 0;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_text,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_text {\\n bottom: 0px;\\n font-size: 14px;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected {\\n background: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_img_btn_text,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_img_btn_text {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_icon_btn,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_icon_btn {\\n background-color: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_img_btn,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_img_btn {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab,\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab,\\n.webix_el_tabbar .webixtype_image .webix_item_tab {\\n padding: 0;\\n border-radius: 0;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab .webix_img_btn,\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab .webix_img_btn,\\n.webix_el_tabbar .webixtype_image .webix_item_tab .webix_img_btn {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon {\\n background: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon .webix_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon .webix_icon,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon:focus,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon:focus,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon:focus,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon:focus {\\n background-color: #F4F5F9;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn:hover,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn:hover,\\n.webix_el_tabbar .webixtype_image .webix_img_btn:hover,\\n.webix_el_tabbar .webixtype_icon .webix_img_btn_top:hover,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top:hover,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top:hover {\\n background-color: transparent;\\n}\\n.webix_tab_filler:first-child {\\n border-right: 0;\\n}\\n.passiveBarBG {\\n background: #FFFFFF;\\n color: #1CA1C1;\\n}\\n.webix_cancel_icon {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 17px;\\n margin: 0;\\n height: auto;\\n width: 20px;\\n}\\n.webix_cancel_icon:hover {\\n color: #FF5C4C;\\n}\\n.webix_cancel_icon:before {\\n content: \\\"\\\\F011\\\";\\n}\\n.webix_error_icon {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 20px;\\n height: auto;\\n width: 20px;\\n color: #FF5C4C;\\n}\\n.webix_error_icon:before {\\n content: \\\"\\\\F034\\\";\\n}\\n.webix_inp_counter_next:hover,\\n.webix_inp_counter_prev:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:focus,\\n.webix_inp_counter_prev:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:active,\\n.webix_inp_counter_prev:active {\\n background-color: #daddeb;\\n}\\n.webix_el_button button,\\n.webix_el_toggle button,\\n.webixbutton,\\n.webix_view button,\\n.webix_view input[type=button] {\\n border-width: 0px;\\n}\\n.webix_segment_0:hover,\\n.webix_segment_1:hover,\\n.webix_segment_N:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:focus,\\n.webix_segment_1:focus,\\n.webix_segment_N:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:active,\\n.webix_segment_1:active,\\n.webix_segment_N:active {\\n background-color: #daddeb;\\n}\\n.webix_selected.webix_segment_0:hover,\\n.webix_selected.webix_segment_1:hover,\\n.webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_selected.webix_segment_0:focus,\\n.webix_selected.webix_segment_1:focus,\\n.webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_selected.webix_segment_0:active,\\n.webix_selected.webix_segment_1:active,\\n.webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_all_segments .webix_segment_1,\\n.webix_all_segments .webix_segment_N {\\n margin-left: 1px;\\n border-left: none;\\n}\\n.webix_segment_0,\\n.webix_segment_1,\\n.webix_segment_N {\\n border-color: #F4F5F9;\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_left,\\n.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n width: 6px;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_handle {\\n left: 5px;\\n}\\n.webix_slider_vertical.webix_slider_alt .webix_slider_handle {\\n left: 3px;\\n}\\n.webix_section > .webix_template {\\n font-family: Roboto, sans-serif;\\n font-size: 12px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_view.webix_control .webix_disabled_box .webix_custom_checkbox,\\n.webix_view.webix_control .webix_disabled_box .webix_custom_radio {\\n color: #DADEE0;\\n}\\n.webix_view > .webix_disabled {\\n background-color: #EBEDF0;\\n opacity: 0.6;\\n}\\n.webix_disabled_view .webix_disabled_top_label {\\n color: #94A1B3;\\n}\\n.webix_custom_checkbox:before {\\n content: \\\"\\\\F013\\\";\\n font-family: \\\"Webix Material Icons\\\";\\n cursor: pointer;\\n}\\n.webix_checkbox_1 .webix_custom_checkbox:before {\\n content: \\\"\\\\F012\\\";\\n}\\n.webix_checkbox_1 .webix_custom_checkbox {\\n color: #1CA1C1;\\n}\\n.webix_custom_checkbox {\\n float: left;\\n position: relative;\\n font-size: 24px;\\n height: 100%;\\n padding: 0;\\n margin-top: 1px;\\n border: none;\\n background-color: transparent;\\n color: #94A1B3;\\n}\\n.webix_custom_checkbox:focus {\\n color: #188ba6;\\n}\\n.webix_el_radio .webix_custom_radio:before {\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n content: \\\"\\\\F035\\\";\\n display: block;\\n}\\n.webix_el_radio .webix_radio_1 .webix_custom_radio {\\n color: #1CA1C1;\\n}\\n.webix_el_radio .webix_radio_1 .webix_custom_radio:before {\\n content: \\\"\\\\F036\\\";\\n}\\n.webix_el_radio .webix_custom_radio {\\n padding: 0;\\n display: block;\\n background-color: transparent;\\n border-color: transparent;\\n color: #94A1B3;\\n cursor: pointer;\\n}\\n.webix_el_radio .webix_custom_radio:focus {\\n color: #188ba6;\\n}\\n.webix_cal_icon,\\n.webix_cal_time,\\n.webix_cal_month_name {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_cal_icon:hover,\\n.webix_cal_time:hover,\\n.webix_cal_month_name:hover,\\n.webix_cal_icon:focus,\\n.webix_cal_time:focus,\\n.webix_cal_month_name:focus {\\n text-decoration: none;\\n color: #1CA1C1;\\n}\\n.webix_cal_month_name,\\n.webix_time_header .webix_cal_hours,\\n.webix_time_header .webix_cal_minutes {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_cal_month_name.webix_readonly:hover,\\n.webix_cal_month_name.webix_readonly:focus {\\n color: #313131;\\n}\\n.webix_cal_prev_button,\\n.webix_cal_next_button {\\n background-image: none;\\n width: 24px;\\n font-size: 24px;\\n font-family: \\\"Webix Material Icons\\\";\\n color: #94A1B3;\\n}\\n.webix_cal_prev_button:hover,\\n.webix_cal_next_button:hover,\\n.webix_cal_prev_button:focus,\\n.webix_cal_next_button:focus {\\n color: #1CA1C1;\\n}\\n.webix_cal_prev_button:before {\\n content: \\\"\\\\F029\\\";\\n}\\n.webix_cal_next_button:before {\\n content: \\\"\\\\F028\\\";\\n}\\n.webix_time_header .webix_cal_hours,\\n.webix_time_header .webix_cal_minutes,\\n.webix_cal_body .webix_cal_block_empty {\\n font-weight: 500;\\n border-bottom: none;\\n}\\n.webix_view > .webix_cal_header {\\n height: 18px;\\n}\\n.webix_view > .webix_cal_header div {\\n height: 17px;\\n line-height: 18px;\\n font-size: 12px;\\n border-bottom-color: transparent;\\n}\\n.webix_cal_body .webix_cal_week_num {\\n color: #475466;\\n}\\n.webix_cal_body .webix_cal_today .webix_cal_day_inner {\\n box-shadow: inset 0 0 0 1px #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_day_inner {\\n display: inline-block;\\n font-size: 12px;\\n border-radius: 50%;\\n}\\n.webix_cal_body .webix_cal_day_inner:hover {\\n background-color: #F4F5F9;\\n}\\n.webix_cal_body .webix_cal_event {\\n font-weight: 500;\\n color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_outside {\\n color: #94A1B3;\\n font-weight: normal;\\n}\\n.webix_cal_body .webix_cal_select,\\n.webix_cal_body .webix_cal_today.webix_cal_select {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_select .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_select .webix_cal_day_inner {\\n color: #FFFFFF;\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_select .webix_cal_day_inner:hover,\\n.webix_cal_body .webix_cal_today.webix_cal_select .webix_cal_day_inner:hover {\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_select:focus .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_select:focus .webix_cal_day_inner {\\n background-color: #1992af;\\n}\\n.webix_cal_body .webix_cal_block {\\n font-family: Roboto, sans-serif;\\n font-size: 12px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected span {\\n background-color: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected span:hover {\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected:focus span {\\n background-color: #1992af;\\n}\\n.webix_cal_body .webix_cal_block span {\\n border-radius: 50%;\\n}\\n.webix_cal_body .webix_cal_block span:hover {\\n background-color: #F4F5F9;\\n}\\n.webix_cal_body .webix_hours .webix_cal_day_disabled,\\n.webix_cal_body .webix_hours .webix_cal_day_disabled.webix_cal_event,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled.webix_cal_event,\\n.webix_cal_body .webix_cal_day_disabled,\\n.webix_cal_body .webix_cal_day_disabled.webix_cal_event {\\n background-color: #fbfbfd;\\n color: #94A1B3;\\n}\\n.webix_cal_body .webix_hours .webix_cal_day_disabled span:hover,\\n.webix_cal_body .webix_hours .webix_cal_day_disabled.webix_cal_event span:hover,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled span:hover,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled.webix_cal_event span:hover,\\n.webix_cal_body .webix_cal_day_disabled span:hover,\\n.webix_cal_body .webix_cal_day_disabled.webix_cal_event span:hover {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_range_first,\\n.webix_cal_body .webix_cal_range_last {\\n position: relative;\\n}\\n.webix_cal_body .webix_cal_range_last + .webix_cal_outside {\\n background-color: #FFFFFF;\\n}\\n.webix_cal_body .webix_cal_range_first:before,\\n.webix_cal_body .webix_cal_range_last:after {\\n content: \\\"\\\";\\n display: block;\\n width: 50%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n background: #e1f6fb;\\n}\\n.webix_cal_body .webix_cal_range_first:before {\\n right: 100%;\\n}\\n.webix_cal_body .webix_cal_range_last:after {\\n left: 100%;\\n}\\n.webix_cal_body .webix_cal_range_start,\\n.webix_cal_body .webix_cal_range_end {\\n position: relative;\\n z-index: 1;\\n}\\n.webix_cal_body .webix_cal_range_last + .webix_cal_outside {\\n position: relative;\\n z-index: 1;\\n background-color: #FFFFFF;\\n}\\n.webix_cal_body .webix_cal_range:first-child:before,\\n.webix_cal_body .webix_cal_range:last-child:after,\\n.webix_cal_body .webix_cal_outside + .webix_cal_range_first:before {\\n width: 0;\\n}\\n.webix_cal_body .webix_cal_range_start,\\n.webix_cal_body .webix_cal_range_end,\\n.webix_cal_body .webix_cal_today.webix_cal_range_start,\\n.webix_cal_body .webix_cal_today.webix_cal_range_end {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_range_start .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_range_end .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_range_start .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_range_end .webix_cal_day_inner {\\n color: #FFFFFF;\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_range {\\n background-color: #e1f6fb;\\n}\\n.webix_daterange .webix_range_timepicker .webix_cal_time {\\n padding: 4px;\\n}\\n.webix_daterange .webix_cal_icons .webix_cal_icon {\\n border-top: none;\\n}\\n.webix_progress_top .webix_progress_state,\\n.webix_progress_bottom .webix_progress_state {\\n background: #1CA1C1;\\n background-image: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0.1) 75%, transparent 75%, transparent);\\n}\\n.webix_progress_top .webix_progress_state {\\n background-size: 10px 10px;\\n}\\n.webix_progress_bottom .webix_progress_state {\\n background-size: 14px 14px;\\n}\\n.webix_switch_box {\\n color: #475466;\\n background-color: #F4F5F9;\\n}\\n.webix_switch_box.webix_switch_on {\\n background-color: #1CA1C1;\\n}\\n.webix_switch_box .webix_switch_text {\\n padding-top: 2px;\\n}\\n.webix_sidebar {\\n background-color: #FFFFFF;\\n}\\n.webix_sidebar .webix_tree_item:hover {\\n background-color: #edeff5;\\n}\\n.webix_sidebar.webix_sidebar_left .webix_tree_item.webix_sidebar_selected + .webix_tree_leaves .webix_tree_item,\\n.webix_sidebar.webix_sidebar_left .webix_tree_item.webix_selected,\\n.webix_sidebar.webix_sidebar_left .webix_tree_item.webix_sidebar_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_sidebar.webix_sidebar_right .webix_tree_item.webix_sidebar_selected + .webix_tree_leaves .webix_tree_item,\\n.webix_sidebar.webix_sidebar_right .webix_tree_item.webix_selected,\\n.webix_sidebar.webix_sidebar_right .webix_tree_item.webix_sidebar_selected {\\n box-shadow: inset -2px 0 #1CA1C1;\\n}\\n.webix_sidebar .webix_tree_branch_1 {\\n border: none;\\n}\\n.webix_sidebar .webix_tree_branch_1 .webix_tree_item {\\n padding-right: 12px;\\n}\\n.webix_sidebar .webix_tree_branch_1 > .webix_tree_item {\\n padding-left: 12px;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected .webix_sidebar_icon,\\n.webix_sidebar .webix_tree_item .webix_sidebar_icon {\\n margin-right: 8px;\\n}\\n.webix_sidebar .webix_sidebar_icon {\\n width: 20px;\\n vertical-align: middle;\\n}\\n.webix_sidebar .webix_sidebar_icon,\\n.webix_sidebar .webix_sidebar_dir_icon {\\n color: #94A1B3;\\n font-size: 20px;\\n}\\n.webix_sidebar .webix_tree_item,\\n.webix_sidebar .webix_tree_branch_1 > .webix_tree_item {\\n color: #475466;\\n cursor: pointer;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected,\\n.webix_sidebar .webix_tree_item.webix_sidebar_selected {\\n color: #1CA1C1;\\n background-color: #F4F5F9;\\n font-weight: 500;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected .webix_sidebar_icon,\\n.webix_sidebar .webix_tree_item.webix_sidebar_selected .webix_sidebar_icon,\\n.webix_sidebar .webix_tree_item.webix_selected .webix_sidebar_dir_icon,\\n.webix_sidebar .webix_tree_item.webix_sidebar_selected .webix_sidebar_dir_icon {\\n color: #1CA1C1;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected span {\\n background-color: transparent;\\n color: #1CA1C1;\\n}\\n.webix_sidebar.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected {\\n background-color: transparent;\\n}\\n.webix_sidebar.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected:hover {\\n background-color: #edeff5;\\n}\\n.webix_sidebar_popup_list .webix_list_item,\\n.webix_sidebar_popup_list .webix_list_item:first-child {\\n border-width: 0px;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_sidebar_selected {\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_sidebar_selected:hover {\\n background-color: #F4F5F9 !important;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_selected {\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_sidebar_popup_list .webix_tree_branch_1 > .webix_tree_item {\\n height: 44px;\\n line-height: 44px;\\n}\\n.webix_sidebar_popup_left .webix_list_item.webix_selected,\\n.webix_sidebar_popup_left .webix_list_item.webix_sidebar_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_sidebar_popup_right .webix_list_item.webix_selected,\\n.webix_sidebar_popup_right .webix_list_item.webix_sidebar_selected {\\n box-shadow: inset -2px 0 #1CA1C1;\\n}\\n.webix_sidebar_popup_list.webix_sidebar_popup_right .webix_icon {\\n margin-left: -8px;\\n}\\n.webix_sidebar_popup.webix_sidebar_popup_left,\\n.webix_sidebar_popup.webix_sidebar_popup_right {\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_sidebar_popup.webix_sidebar_popup_right .webix_sidebar_popup_right {\\n box-shadow: none;\\n}\\n.webix_sidebar_popup .webix_sidebar_popup_title {\\n background-color: #F4F5F9;\\n}\\n.webix_sidebar_popup .webix_sidebar_popup_title .webix_template {\\n border: none;\\n line-height: 44px;\\n}\\n.webix_sidebar_popup .webix_sidebar_popup_title.webix_selected {\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_sidebar_popup_right {\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_sidebar.webix_dark {\\n border-color: #4A4E58;\\n background-color: #4A4E58;\\n}\\n.webix_sidebar.webix_dark .webix_tree_item {\\n color: #FFFFFF;\\n}\\n.webix_sidebar.webix_dark .webix_tree_item:hover {\\n background-color: #33353c;\\n}\\n.webix_sidebar.webix_dark .webix_tree_item.webix_selected,\\n.webix_sidebar.webix_dark .webix_tree_item.webix_sidebar_selected {\\n color: #1CA1C1;\\n background-color: #373a42;\\n}\\n.webix_sidebar.webix_dark.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected {\\n background-color: transparent;\\n}\\n.webix_sidebar.webix_dark.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected:hover {\\n background-color: #33353c;\\n}\\n.webix_sidebar_popup.webix_dark .webix_sidebar_popup_title {\\n background-color: #373a42;\\n}\\n.webix_sidebar_popup.webix_dark .webix_sidebar_popup_title .webix_template {\\n border-color: #373a42;\\n color: #FFFFFF;\\n}\\n.webix_sidebar_popup.webix_dark .webix_sidebar_popup_title.webix_selected .webix_template {\\n color: #1CA1C1;\\n}\\n.webix_sidebar_popup_list.webix_dark {\\n background-color: #4A4E58;\\n border-color: #373a42;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item {\\n background: #4A4E58;\\n color: #FFFFFF;\\n border-color: #373a42;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_selected,\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_sidebar_selected {\\n background-color: #373a42;\\n color: #1CA1C1;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item:hover {\\n background-color: #33353c;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_selected {\\n background-color: #373a42;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_sidebar_selected:hover {\\n background-color: #373a42 !important;\\n}\\n.webix_sidebar_popup.webix_dark {\\n border-color: #373a42;\\n}\\n.webix_list_item.webix_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_list_item.webix_disabled {\\n color: #94A1B3;\\n}\\n.webix_list_item.webix_selected.webix_disabled {\\n box-shadow: inset 2px 0 #94A1B3;\\n}\\n.webix_list_item .webix_icon {\\n font-size: 20px;\\n}\\n.webix_list-x .webix_list_item.webix_selected {\\n box-shadow: none;\\n border-left: none;\\n padding-left: 12px;\\n}\\n.webix_header > div {\\n padding-left: 12px;\\n}\\n.webix_icon,\\n.webix_icon_btn,\\n.webix_input_icon {\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_icon_button {\\n position: relative;\\n z-index: 0;\\n}\\n.webix_icon_button:before {\\n content: '';\\n opacity: 0;\\n position: absolute;\\n transition-duration: 0.15s;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n z-index: -1;\\n bottom: 0px;\\n left: 0px;\\n right: 0px;\\n top: 0px;\\n border-radius: 50%;\\n transform: scale(0);\\n transition-property: transform, opacity;\\n}\\n.webix_icon_button:hover .webix_icon,\\n.webix_icon_button:focus .webix_icon {\\n color: #475466;\\n}\\n.webix_icon_button:hover:before {\\n background-color: #F4F5F9;\\n opacity: 1;\\n transform: scale(1);\\n}\\n.webix_icon_btn,\\n.webix_input_icon {\\n width: 20px;\\n}\\n.webix_img_btn_top .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_icon_btn {\\n vertical-align: text-bottom;\\n}\\n.webix_resize_frame {\\n box-shadow: 0 2px 6px 0 #000, 0 1px 4px 0 #000;\\n}\\n.webix_tooltip {\\n padding: 4px 8px;\\n background-color: #475466;\\n color: #FFFFFF;\\n font-weight: 500;\\n line-height: 20px;\\n border-radius: 2px;\\n border: none;\\n}\\n.portlet_marker,\\n.portlet_markertop,\\n.portlet_markerbottom,\\n.portlet_markerleft,\\n.portlet_markerright {\\n background: #1CA1C1;\\n}\\n.webix_treemap_item:hover {\\n box-shadow: inset 0 0 0 1px #5ccce7;\\n}\\n.webix_treemap_item.webix_selected {\\n border-color: inherit;\\n box-shadow: inset 0 0 0 2px #1CA1C1;\\n}\\n.webixlabel {\\n font-weight: 500;\\n}\\n.webixtoolbarlabel {\\n letter-spacing: 0;\\n}\\n.webix_inp_label,\\n.webix_inp_top_label,\\nlegend.webix_forminput_label,\\n.webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_inp_label,\\n.webix_forminput_label {\\n padding-right: 8px;\\n}\\n.webix_label_right {\\n padding-left: 4px;\\n}\\n.webix_el_checkbox .webix_label_right {\\n display: block;\\n}\\n.webix_richtext .webix_richtext_container {\\n box-shadow: inset 0 1px #DADEE0;\\n}\\n.webix_dbllist .bottom_label {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #94A1B3;\\n letter-spacing: 0.2px;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_left,\\n.webix_popup.webix_sidemenu.webix_sidemenu_right,\\n.webix_popup.webix_sidemenu.webix_sidemenu_top,\\n.webix_popup.webix_sidemenu.webix_sidemenu_bottom {\\n border: none;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_chart .webix_chart_legend_item,\\n.webix_chart .webix_canvas_text,\\n.webix_chart .webix_axis_title_x,\\n.webix_chart .webix_axis_title_y {\\n font-family: Roboto, sans-serif;\\n font-size: 12px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_chart .webix_canvas_text.webix_axis_item_x,\\n.webix_chart .webix_canvas_text.webix_axis_item_y,\\n.webix_chart .webix_axis_title_x,\\n.webix_chart .webix_axis_title_y,\\n.webix_chart .webix_canvas_text.webix_axis_radar_title {\\n color: #94A1B3;\\n}\\n.webix_bullet_scale {\\n fill: #94A1B3;\\n font-size: 12px;\\n}\\n.webix_bullet_scale_lines {\\n stroke: #94A1B3;\\n}\\n.webix_toolbar.pdf_bar {\\n background-color: #474747;\\n}\\n.webix_toolbar.pdf_bar .webix_icon_btn {\\n font-size: 20px;\\n vertical-align: middle;\\n}\\n.webix_toolbar.pdf_bar .webix_img_btn:focus,\\n.webix_toolbar.pdf_bar .webix_img_btn:hover {\\n background-color: #333333;\\n}\\n.invalidStyle {\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n}\\n.webix_list_item.webix_invalid,\\n.webix_tree_item.webix_invalid,\\n.webix_dataview_item.webix_invalid,\\n.webix_cell.webix_invalid {\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n}\\n.webix_invalid .webix_el_box input,\\n.webix_invalid .webix_el_box .webix_inp_static,\\n.webix_invalid .webix_el_box select,\\n.webix_invalid .webix_el_box textarea,\\ninput.webix_invalid,\\nselect.webix_invalid,\\ntextarea.webix_invalid {\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n border-color: #ff8d82;\\n}\\n.webix_invalid .webix_inp_bottom_label {\\n color: #FF5C4C;\\n}\\n.webix_nav_panel .webix_nav_item {\\n background-color: transparent;\\n border-color: rgba(255, 255, 255, 0.4);\\n opacity: 1;\\n}\\n.webix_nav_panel .webix_nav_item:hover {\\n border-color: rgba(255, 255, 255, 0.6);\\n}\\n.webix_nav_panel .webix_nav_active {\\n background-color: #FFFFFF;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 1;\\n background-image: none;\\n text-align: center;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n color: #FFFFFF;\\n border-radius: 50%;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_nav_button_next .webix_nav_button_inner:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n transition: 0.15s;\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 1;\\n text-align: center;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 48px;\\n color: #FFFFFF;\\n background: rgba(0, 0, 0, 0.2);\\n border-radius: 2px;\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n background: rgba(0, 0, 0, 0.4);\\n}\\n.webix_nav_button_side.webix_nav_button_next {\\n right: 0;\\n}\\n.webix_nav_button_side.webix_nav_button_prev {\\n left: 0;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner:before {\\n content: \\\"\\\\F002\\\";\\n}\\n.webix_nav_button_next .webix_nav_button_inner:before {\\n content: \\\"\\\\F003\\\";\\n}\\n.webix_dark .webix_nav_item {\\n border-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_dark .webix_nav_item:hover {\\n border-color: rgba(0, 0, 0, 0.6);\\n}\\n.webix_dark .webix_nav_inactive {\\n background-color: transparent;\\n}\\n.webix_dark .webix_nav_active {\\n background-color: #000000;\\n}\\n.webix_dark .webix_nav_active:hover,\\n.webix_dark .webix_nav_active:focus {\\n box-shadow: 0 0 2px #000;\\n}\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner,\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner {\\n background-image: none;\\n color: #313131;\\n}\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner:focus {\\n background-color: rgba(255, 255, 255, 0.2);\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n background: rgba(255, 255, 255, 0.2);\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n background: rgba(255, 255, 255, 0.4);\\n}\\n.webix_skin_mark {\\n height: 230px;\\n}\\n/* based on MaterialDesignIcons.com */\\n@font-face {\\n font-family: \\\"Webix Material Icons\\\";\\n src: url('fonts/webixmdi-webfont.woff2') format('woff2'), url('fonts/webixmdi-webfont.woff') format('woff');\\n font-weight: normal;\\n font-style: normal;\\n}\\n/* icons collection common for above fonts*/\\n.wxi-angle-down:before {\\n content: \\\"\\\\F001\\\";\\n}\\n.wxi-angle-left:before {\\n content: \\\"\\\\F002\\\";\\n}\\n.wxi-angle-right:before {\\n content: \\\"\\\\F003\\\";\\n}\\n.wxi-angle-up:before {\\n content: \\\"\\\\F004\\\";\\n}\\n.wxi-angle-double-right:before {\\n content: \\\"\\\\F005\\\";\\n}\\n.wxi-angle-double-left:before {\\n content: \\\"\\\\F006\\\";\\n}\\n.wxi-clock:before {\\n content: \\\"\\\\F007\\\";\\n}\\n.wxi-calendar:before {\\n content: \\\"\\\\F008\\\";\\n}\\n.wxi-search:before {\\n content: \\\"\\\\F009\\\";\\n}\\n.wxi-dots:before {\\n content: \\\"\\\\F010\\\";\\n}\\n.wxi-close:before {\\n content: \\\"\\\\F011\\\";\\n}\\n.wxi-checkbox-marked:before {\\n content: \\\"\\\\F012\\\";\\n}\\n.wxi-checkbox-blank:before {\\n content: \\\"\\\\F013\\\";\\n}\\n.wxi-trash:before {\\n content: \\\"\\\\F014\\\";\\n}\\n.wxi-pencil:before {\\n content: \\\"\\\\F015\\\";\\n}\\n.wxi-eye:before {\\n content: \\\"\\\\F016\\\";\\n}\\n.wxi-eye-slash:before {\\n content: \\\"\\\\F017\\\";\\n}\\n.wxi-columns:before {\\n content: \\\"\\\\F018\\\";\\n}\\n.wxi-drag:before {\\n content: \\\"\\\\F019\\\";\\n}\\n.wxi-check:before {\\n content: \\\"\\\\F020\\\";\\n}\\n.wxi-underline:before {\\n content: \\\"\\\\F021\\\";\\n}\\n.wxi-bold:before {\\n content: \\\"\\\\F022\\\";\\n}\\n.wxi-italic:before {\\n content: \\\"\\\\F023\\\";\\n}\\n.wxi-sync:before {\\n content: \\\"\\\\F024\\\";\\n}\\n.wxi-plus-square:before {\\n content: \\\"\\\\F025\\\";\\n}\\n.wxi-minus-square:before {\\n content: \\\"\\\\F026\\\";\\n}\\n.wxi-menu-down:before {\\n content: \\\"\\\\F027\\\";\\n}\\n.wxi-menu-right:before {\\n content: \\\"\\\\F028\\\";\\n}\\n.wxi-menu-left:before {\\n content: \\\"\\\\F029\\\";\\n}\\n.wxi-folder:before {\\n content: \\\"\\\\F030\\\";\\n}\\n.wxi-folder-open:before {\\n content: \\\"\\\\F031\\\";\\n}\\n.wxi-file:before {\\n content: \\\"\\\\F032\\\";\\n}\\n.wxi-close-circle:before {\\n content: \\\"\\\\F033\\\";\\n}\\n.wxi-alert:before {\\n content: \\\"\\\\F034\\\";\\n}\\n.wxi-radiobox-blank:before {\\n content: \\\"\\\\F035\\\";\\n}\\n.wxi-radiobox-marked:before {\\n content: \\\"\\\\F036\\\";\\n}\\n.wxi-angle-double-down:before {\\n content: \\\"\\\\F037\\\";\\n}\\n.wxi-angle-double-up:before {\\n content: \\\"\\\\F038\\\";\\n}\\n.wxi-plus-circle:before {\\n content: \\\"\\\\F039\\\";\\n}\\n.wxi-minus-circle:before {\\n content: \\\"\\\\F040\\\";\\n}\\n.wxi-plus:before {\\n content: \\\"\\\\F041\\\";\\n}\\n.wxi-minus:before {\\n content: \\\"\\\\F042\\\";\\n}\\n.wxi-download:before {\\n content: \\\"\\\\F043\\\";\\n}\\n.wxi-user:before {\\n content: \\\"\\\\F044\\\";\\n}\\n.wxi-filter:before {\\n content: \\\"\\\\F045\\\";\\n}\\n.wxi-menu-up:before {\\n content: \\\"\\\\F046\\\";\\n}\\n/*predefined styles for text lables inside a item*/\\n.webix_strong {\\n font-weight: 500;\\n white-space: nowrap;\\n}\\n.webix_light {\\n color: #b3b3b3;\\n}\\n/*contr-styles for bootstrap*/\\n.webix_view,\\n.webix_input_icon {\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n}\\n.webix_view.webix_el_label {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_inp_label,\\n.webix_inp_top_label,\\n.webix_label_right {\\n margin-bottom: 0px;\\n}\\n.webix_view table {\\n border-collapse: initial;\\n}\\n/* Spin*/\\n.webix_spin {\\n animation: webix_spin 2s infinite linear;\\n}\\n@-webkit-keyframes webix_spin {\\n 0% {\\n transform: rotate(0deg);\\n }\\n 100% {\\n transform: rotate(359deg);\\n }\\n}\\n@keyframes webix_spin {\\n 0% {\\n transform: rotate(0deg);\\n }\\n 100% {\\n transform: rotate(359deg);\\n }\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/webix.css\"],\"names\":[],\"mappings\":\"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AEE,qCAAqC;AACvC;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;;;;;EAME,qBAAqB;EACrB,gBAAgB;AAClB;AACA;EACE,oCAAoC;AACtC;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;;;EAGE,mBAAmB;EACnB,cAAc;AAChB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;EAEE,cAAc;AAChB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,oCAAoC;AACtC;AACA;;EAEE,UAAU;AACZ;AACA;EACE,cAAc;EACd,YAAY;AACd;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;EACE,+BAA+B;AACjC;AACA;;EAEE,+BAA+B;AACjC;AACA;EACE,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;;;;EAME,+BAA+B;EAC/B,oCAAoC;EACpC,yBAAyB;AAC3B;AACA;EACE,6BAA6B;AAC/B;AACA;;;;EAIE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;;;EAGE,qCAAqC;AACvC;AACA;EACE,+BAA+B;AACjC;AACA;;;;;;;EAOE,cAAc;EACd,wCAAwC;EACxC,qBAAqB;AACvB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,YAAY;EACZ,kBAAkB;AACpB;AACA;EACE,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ,WAAW;EACX,mBAAmB;AACrB;AACA;EACE,kBAAkB;AACpB;AACA;E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CrB;AACA;;EAEE,eAAe;EACf,eAAe;EACf,cAAc;EACd,sBAAsB;EACtB,yBAAyB;EACzB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,cAAc;EACd,eAAe;EACf,iBAAiB;EACjB,+BAA+B;AACjC;AACA;EACE,iBAAiB;EACjB,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;;EAEE,cAAc;EACd,mBAAmB;AACrB;AACA;;EAEE,mBAAmB;AACrB;AACA;;;;EAIE,mBAAmB;EACnB,mBAAmB;EACnB,6BAA6B;AAC/B;AACA;EACE,eAAe;EACf,sBAAsB;EACtB,yBAAyB;EACzB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,WAAW;EACX,kBAAkB;EAClB,eAAe;EACf,sBAAsB;EACtB,yBAAyB;EACzB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,mBAAmB;EACnB,cAAc;AAChB;AACA;EACE,kBAAkB;EAClB,eAAe;EACf,WAAW;EACX,YAAY;EACZ,gBAAgB;EAChB,eAAe;AACjB;AACA;EACE,YAAY;EACZ,YAAY;EACZ,iBAAiB;EACjB,kBAAkB;AACpB;AACA;EACE,YAAY;EACZ,iBAAiB;EACjB,kBAAkB;AACpB;AACA;EACE,WAAW;AACb;AACA;EACE,kBAAkB;EAClB,cAAc;AAChB;AACA;;;EAGE,0BAA0B;EAC1B,cAAc;AAChB;AACA;;;EAGE,cAAc;AAChB;AACA;EACE,eAAe;AACjB;AACA;;EAEE,qBAAqB;EACrB,cAAc;AAChB;AACA;EACE,gBAAgB;AAClB;AACA;;EAEE,qBAAqB;EACrB,eAAe;EACf,kBAAkB;EAClB,YAAY;EACZ,iBAAiB;EACjB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;EACtB,gCAAgC;AAClC;AACA;EACE,iBAAiB;EACjB,iBAAiB;AACnB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,WAAW;EACX,+BAA+B;EAC/B,kBAAkB;AACpB;AACA;EACE,WAAW;EACX,iBAAiB;AACnB;AACA;EACE,WAAW;EACX,kBAAkB;AACpB;AACA;EACE,kBAAkB;EAClB,eAAe;EACf,YAAY;EACZ,gBAAgB;EAChB,eAAe;AACjB;AACA;EACE,YAAY;EACZ,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,yBAAyB;EACzB,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,mBAAmB;EACnB,aAAa;EACb,mBAAmB;EACnB,cAAc;EACd,YAAY;AACd;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,WAAW;EACX,YAAY;EACZ,cAAc;AAChB;AACA;;EAEE,yBAAyB;AAC3B;AACA;;EAEE,qBAAqB;EACrB,kBAAkB;EAClB,gCAAgC;EAChC,gBAAgB;EAChB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;EACnB,iBAAiB;EACjB,kBAAkB;EAClB,gCAAgC;EAChC,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,mBAAmB;EACnB,qBAAqB;AACvB;AACA;;;;;EAKE,cAAc;AAChB;AACA;;;;;;EAME,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;;EAEE,oCAAoC;AACtC;AACA;EACE,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;EACd,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,yBAAyB;AAC3B;AACA;;;;;;;EAOE,cAAc;EACd,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,yBAAyB;EACzB,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;EAEE,qCAAqC;AACvC;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;;;;;EAME,qBAAqB;EACrB,gBAAgB;AAClB;AACA;EACE,oCAAoC;AACtC;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;;;EAGE,mBAAmB;EACnB,cAAc;AAChB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;EAEE,cAAc;AAChB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,oCAAoC;AACtC;AACA;;EAEE,UAAU;AACZ;AACA;EACE,cAAc;EACd,YAAY;AACd;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;EACE,+BAA+B;AACjC;AACA;;EAEE,+BAA+B;AACjC;AACA;EACE,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;;;;EAME,+BAA+B;EAC/B,oCAAoC;EACpC,yBAAyB;AAC3B;AACA;EACE,6BAA6B;AAC/B;AACA;;;;EAIE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;;;EAGE,qCAAqC;AACvC;AACA;EACE,+BAA+B;AACjC;AACA;;;;;;;EAOE,cAAc;EACd,wCAAwC;EACxC,qBAAqB;AACvB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,cAAc;AAChB;AACA;EACE,YAAY;EACZ,eAAe;EACf,iBAAiB;EACjB,yBAAyB;EACzB,mBAAmB;EACnB,kBAAkB;EAClB,WAAW;EACX,YAAY;AACd;AACA;EACE,uBAAuB;EACvB,mBAAmB;AACrB;AACA;EACE,SAAS;EACT,sBAAsB;AACxB;AACA,oCAAoC;AACpC;EACE,aAAa;EACb,kBAAkB;EAClB,cAAc;EACd,yBAAyB;EACzB,iBAAiB;EACjB,yBAAyB;EACzB,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;EACrB,kBAAkB;EAClB,0CAA0C;EAC1C,mCAAmC;EACnC,kCAAkC;AACpC;AACA;EACE,oBAAoB;AACtB;AACA,gBAAgB;AAChB;EACE,gBAAgB;EAChB,YAAY;EACZ,eAAe;AACjB;AACA;EACE,gBAAgB;AAClB;AACA,4BAA4B;AAC5B;EACE,iBAAiB;EACjB,gBAAgB;EAChB,yBAAyB;AAC3B;AACA;EACE,iBAAiB;EACjB,UAAU;EACV,kBAAkB;EAClB,YAAY;EACZ,eAAe;EACf,cAAc;EACd,iBAAiB;AACnB;AACA;;EAEE,mBAAmB;AACrB;AACA;EACE,qBAAqB;EACrB,iBAAiB;EACjB,iBAAiB;EACjB,kBAAkB;AACpB;AACA;EACE,cAAc;EACd,qBAAqB;EACrB,qBAAqB;AACvB;AACA;EACE,0BAA0B;AAC5B;AACA;EACE,cAAc;AAChB;AACA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;AACA;EACE,cAAc;AAChB;AACA;EACE,iBAAiB;EACjB,WAAW;EACX,kBAAkB;EAClB,WAAW;EACX,YAAY;AACd;AACA;EACE,UAAU;EACV,SAAS;EACT,UAAU;EACV,kBAAkB;EAClB,yBAAyB;EACzB,kBAAkB;EAClB,YAAY;EACZ,WAAW;EACX,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,WAAW;EACX,YAAY;EACZ,gBAAgB;EAChB,kBAAkB;EAClB,WAAW;EACX,kBAAkB;AACpB;AACA;EACE,WAAW;EACX,YAAY;EACZ,cAAc;AAChB;AACA;EACE,eAAe;EACf,cAAc;EACd,iBAAiB;EACjB,kBAAkB;E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AA8B;AAC9B;EACE,UAAU;EACV,SAAS;AACX;AACA;EACE,8BAA8B;EAC9B,gBAAgB;AAClB;AACA;;EAEE,WAAW;EACX,YAAY;EACZ,WAAW;AACb;AACA;EACE,WAAW;AACb;AACA;;EAEE,sBAAsB;EACtB,yBAAyB;EACzB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;;EAEE,cAAc;EACd,mBAAmB;EACnB,sBAAsB;EACtB,yBAAyB;EACzB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,cAAc;EACd,WAAW;EACX,YAAY;EACZ,kBAAkB;AACpB;AACA;;EAEE,mBAAmB;EACnB,sBAAsB;AACxB;AACA;;EAEE,8BAA8B;AAChC;AACA;EACE,yBAAyB;EACzB,sBAAsB;AACxB;AACA;EACE,yBAAyB;AAC3B;AACA;;;;;;;;EAQE,yBAAyB;EACzB,qBAAqB;AACvB;AACA;EACE,eAAe;EACf,cAAc;AAChB;AACA;EACE,eAAe;EACf,WAAW;EACX,YAAY;EACZ,kBAAkB;AACpB;AACA;EACE,kBAAkB;AACpB;AACA;EACE,mBAAmB;AACrB;AACA;EACE,kBAAkB;EAClB,WAAW;EACX,eAAe;EACf,iBAAiB;AACnB;AACA;EACE,UAAU;AACZ;AACA;EACE,+BAA+B;EAC/B,uBAAuB;AACzB;AACA;EACE,cAAc;AAChB;AACA;;;;EAIE,cAAc;AAChB;AACA;;;;;;EAME,cAAc;EACd,mBAAmB;EACnB,qBAAqB;AACvB;AACA;;;;;EAKE,cAAc;EACd,mBAAmB;EACnB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,cAAc;AAChB;AACA;;;;EAIE,YAAY;EACZ,iBAAiB;EACjB,cAAc;AAChB;AACA;EACE,kBAAkB;AACpB;AACA;EACE,6BAA6B;EAC7B,SAAS;EACT,WAAW;EACX,sBAAsB;EACtB,eAAe;EACf,YAAY;EACZ,cAAc;EACd,+BAA+B;EAC/B,gBAAgB;AAClB;AACA;EACE,SAAS;EA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AAmB;AACrB;AACA;EACE,eAAe;EACf,YAAY;EACZ,YAAY;EACZ,gBAAgB;AAClB;AACA;EACE,cAAc;AAChB;AACA;EACE,cAAc;EACd,yBAAyB;EACzB,yBAAyB;EACzB,mBAAmB;EACnB,sBAAsB;EACtB,yBAAyB;EACzB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;;;EAGE,cAAc;EACd,yBAAyB;EACzB,yBAAyB;AAC3B;AACA;;;;;;EAME,oCAAoC;AACtC;AACA;;EAEE,YAAY;EACZ,qBAAqB;EACrB,mBAAmB;EACnB,YAAY;AACd;AACA;;EAEE,YAAY;EACZ,iBAAiB;EACjB,kBAAkB;EAClB,gBAAgB;AAClB;AACA;EACE,yBAAyB;EACzB,uBAAuB;EACvB,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,SAAS;AACX;AACA;EACE,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,4BAA4B;EAC5B,gBAAgB;EAChB,mBAAmB;EACnB,WAAW;EACX,eAAe;AACjB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,WAAW;EACX,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;EACE,2BAA2B;EAC3B,8BAA8B;EAC9B,0BAA0B;EAC1B,6BAA6B;AAC/B;AACA;EACE,kBAAkB;EAClB,yBAAyB;EACzB,4BAA4B;EAC5B,4BAA4B;EAC5B,+BAA+B;AACjC;AACA;EACE,cAAc;EACd,yBAAyB;AAC3B;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,cAAc;EACd,mBAAmB;AACrB;AACA,YAAY;AACZ;EACE,mBAAmB;EACnB,yBAAyB;EACzB,kBAAkB;AACpB;AACA;EACE,cAAc;AAChB;AACA;EACE,WAAW;EACX,sBAAsB;AACxB;AACA;EACE,WAAW;EACX,6BAA6B;AAC/B;AACA;EACE,SAAS;AACX;AACA;EACE,YAAY;AACd;AACA;EACE,cAAc;EACd,qBAAqB;EACrB,cAAc;EACd,YAAY;AACd;AACA,YAAY;AACZ;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,mBAAmB;EACnB,qBAAqB;AACvB;AACA;;;;;EAKE,cAAc;AAChB;AACA;;;;;;EAME,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;;EAEE,oCAAoC;AACtC;AACA;EACE,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;EACd,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,yBAAyB;AAC3B;AACA;;;;;;;EAOE,cAAc;EACd,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,yBAAyB;EACzB,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;EAEE,qCAAqC;AACvC;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;;;;;EAME,qBAAqB;EACrB,gBAAgB;AAClB;AACA;EACE,oCAAoC;AACtC;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;;;EAGE,mBAAmB;EACnB,cAAc;AAChB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;EAEE,cAAc;AAChB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,oCAAoC;AACtC;AACA;;EAEE,UAAU;AACZ;AACA;EACE,cAAc;EACd,YAAY;AACd;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;EACE,+BAA+B;AACjC;AACA;;EAEE,+BAA+B;AACjC;AACA;EACE,oCAAoC;EACpC,+BAA+B;AACjC;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B,oBAAoB;AACtB;AACA;EACE,YAAY;AACd;AACA;EACE,WAAW;EACX,YAAY;EACZ,kBAAkB;EAClB,QAAQ;EACR,SAAS;EACT,WAAW;AACb;AACA;EACE,mCAAmC;EACnC,eAAe;EACf,kBAAkB;EAClB,SAAS;EACT,QAAQ;EACR,kBAAkB;EAClB,iBAAiB;EACjB,qBAAqB;EACrB,cAAc;AAChB;AACA;EACE,cAAc;EACd,YAAY;EACZ,WAAW;AACb;AACA;EACE,mBAAmB;EACnB,sBAAsB;AACxB;AACA;EACE,YAAY;EACZ,WAAW;EACX,yBAAyB;AAC3B;AACA;EACE,gBAAgB;EAChB,kBAAkB;EAClB,gBAAgB;AAClB;AACA;EACE,iBAAiB;AACnB;AACA;EACE,kBAAkB;EAClB,gBAAgB;EAChB,kBAAkB;EAClB,wBAAwB;AAC1B;AACA;EACE,UAAU;AACZ;AACA;EACE,WAAW;AACb;AACA;;EAEE,qBAAqB;EACrB,gBAAgB;EAChB,kBAAkB;EAClB,kBAAkB;EAClB,UAAU;EACV,gBAAgB;EAChB,uBAAuB;AACzB;AACA;EACE,gBAAgB;EAChB,cAAc;AAChB;AACA;EACE,gBAAgB;EAChB,cAAc;AAChB;AACA;;EAEE,gBAAgB;EAChB,uBAAuB;AACzB;AACA;EACE,iCAAiC;AACnC;AACA;EACE,2BAA2B;EAC3B,yCAAyC;EACzC,4DAA4D;AAC9D;AACA;EACE;IACE,oBAAoB;EACtB;AACF;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,gBAAgB;EAChB,gBAAgB;AAClB;AACA;;EAEE,aAAa;AACf;AACA;EACE,aAAa;EACb,iBAAiB;AACnB;AACA;EACE,gBAAgB;AAClB;AACA;;EAEE,eAAe;EACf,aAAa;AACf;AACA;EACE,aAAa;EACb,eAAe;EACf,gBAAgB;EAChB,YAAY;EACZ,mBAAmB;AACrB;AACA;EACE,eAAe;AACjB;AACA;EACE,MAAM;EACN,UAAU;AACZ;AACA;EACE,iBAAiB;AACnB;AACA;EACE,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;;EAEE,iBAAiB;EACjB,gBAAgB;EAChB,kBAAkB;EAClB,QAAQ;AACV;AACA;;;EAGE,iBAAiB;AACnB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,cAAc;EACd,gBAAgB;AAClB;AACA;EACE,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;AACA;EACE,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,qBAAqB;EACrB,YAAY;EACZ,sBAAsB;EACtB,mBAAmB;AACrB;AACA;;EAEE,SAAS;AACX;AACA;EACE,YAAY;AACd;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,kBAAkB;EAClB,YAAY;EACZ,WAAW;AACb;AACA;EACE,kBAAkB;EAClB,WAAW;EACX,gBAAgB;EAChB,gBAAgB;EAChB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;EACtB,gBAAgB;EAChB,2BAA2B;EAC3B,mBAAmB;EACnB,gCAAgC;EAChC,uBAAuB;EACvB,eAAe;AACjB;AACA;EACE,UAAU;EACV,gCAAgC;AAClC;AACA;EACE,sBAAsB;AACxB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,8BAA8B;AAChC;AACA;EACE,qBAAqB;EACrB,qCAAqC;AACvC;AACA;EACE,WAAW;EACX,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,eAAe;EACf,gCAAgC;AAClC;AACA;EACE,eAAe;AACjB;AACA;EACE,eAAe;AACjB;AACA;EACE,YAAY;EACZ,WAAW;EACX,kBAAkB;AACpB;AACA;EACE,gBAAgB;EAChB,cAAc;EACd,mCAAmC;EACnC,eAAe;EACf,cAAc;EACd,eAAe;AACjB;AACA;EACE,WAAW;EACX,kBAAkB;AACpB;AACA;EACE,kBAAkB;AACpB;AACA;EACE,eAAe;EACf,cAAc;EACd,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,kBAAkB;EAClB,UAAU;EACV,QAAQ;EACR,UAAU;EACV,WAAW;EACX,YAAY;EACZ,eAAe;AACjB;AACA;EACE,YAAY;AACd;AACA;;;;;EAKE,YAAY;EACZ,mBAAmB;EACnB,kBAAkB;EAClB,UAAU;EACV,wDAAwD;EACxD,QAAQ;EACR,SAAS;EACT,WAAW;EACX,YAAY;AACd;AACA;EACE,WAAW;AACb;AACA;EACE,WAAW;EACX,QAAQ;AACV;AACA;EACE,UAAU;AACZ;AACA;EACE,UAAU;EACV,SAAS;AACX;AACA;EACE,kBAAkB;EAClB,WAAW;EACX,QAAQ;EACR,UAAU;EACV,mBAAmB;EACnB,eAAe;EACf,WAAW;EACX,YAAY;EACZ,eAAe;AACjB;AACA;EACE,WAAW;AACb;AACA;EACE,kBAAkB;EAClB,UAAU;EACV,+BAA+B;EAC/B,yBAAyB;EACzB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,uBAAuB;EACvB,yCAAyC;AAC3C;AACA;EACE,qBAAqB;AACvB;AACA;EACE,UAAU;EACV,uBAAuB;EACvB,4CAA4C;AAC9C;AACA;EACE,sBAAsB;AACxB;AACA;EACE,wBAAwB;EACxB,yCAAyC;AAC3C;AACA;EACE,kBAAkB;AACpB;AACA;EACE,kBAAkB;EAClB,SAAS;EACT,OAAO;EACP,SAAS;AACX;AACA;;EAEE,uBAAuB;AACzB;AACA;EACE,wBAAwB;EACxB,SAAS;EACT,0CAA0C;AAC5C;AACA;;EAEE,uBAAuB;AACzB;AACA,WAAW;AACX;EACE,mBAAmB;AACrB;AACA;EACE,uBAAuB;AACzB;AACA;EACE,cAAc;EACd,YAAY;EACZ,iBAAiB;AACnB;AACA;EACE,cAAc;EACd,UAAU;AACZ;AACA;EACE,gBAAgB;AAClB;AACA;;EAEE,qCAAqC;AACvC;AACA;;EAEE,yBAAyB;EACzB,gBAAgB;AAClB;AACA;EACE,kBAAkB;AACpB;AACA;EACE,YAAY;EACZ,iBAAiB;EACjB,eAAe;AACjB;AACA;EACE,gCAAgC;AAClC;AACA;;EAEE,SAAS;EACT,YAAY;AACd;AACA;EACE,WAAW;EACX,kBAAkB;AACpB;AACA;EACE,YAAY;EACZ,oBAAoB;AACtB;AACA,mBAAmB;AACnB;EACE,uBAAuB;EACvB,4BAA4B;AAC9B;AACA;;EAEE,gBAAgB;AAClB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,YAAY;EACZ,oBAAoB;EACpB,UAAU;AACZ;AACA;EACE,WAAW;EACX,oBAAoB;AACtB;AACA,iBAAiB;AACjB;EACE,mBAAmB;AACrB;AACA;EACE,0BAA0B;EAC1B,mBAAmB;AACrB;AACA;EACE,iBAAiB;EACjB,eAAe;EACf,yBAAyB;EACzB,iBAAiB;AACnB;AACA;EACE,yBAAyB;EACzB,kBAAkB;AACpB;AACA;EACE,+BAA+B;EAC/B,iBAAiB;AACnB;AACA;EACE,8BAA8B;EAC9B,+BAA+B;AACjC;AACA,gBAAgB;AAChB;EACE,6BAA6B;AAC/B;AACA;EACE,mBAAmB;AACrB;AACA;EACE,mBAAmB;AACrB;AACA;EACE,+BAA+B;AACjC;AACA;EACE,0CAA0C;AAC5C;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;EACE,gBAAgB;EAChB,gCAAgC;EAChC,WAAW;EACX,YAAY;AACd;AACA;EACE,kBAAkB;AACpB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,SAAS;AACX;AACA;EACE,6BAA6B;EAC7B,WAAW;EACX,gBAAgB;AAClB;AACA;;EAEE,yBAAyB;EACzB,WAAW;EACX,qBAAqB;AACvB;AACA;;EAEE,kBAAkB;AACpB;AACA;EACE,WAAW;AACb;AACA;EACE,YAAY;AACd;AACA;EACE,yBAAyB;EACzB,WAAW;AACb;AACA;EACE,qBAAqB;EACrB,kBAAkB;AACpB;AACA;;EAEE,cAAc;EACd,sBAAsB;AACxB;AACA;EACE,kBAAkB;EAClB,eAAe;AACjB;AACA;;EAEE,mBAAmB;AACrB;AACA;EACE,mBAAmB;EACnB,uBAAuB;EACvB,yBAAyB;EACzB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,4BAA4B;EAC5B,yBAAyB;EACzB,cAAc;AAChB;AACA;EACE,UAAU;EACV,YAAY;EACZ,eAAe;EACf,UAAU;EACV,kBAAkB;EAClB,yBAAyB;EACzB,eAAe;EACf,eAAe;EACf,+BAA+B;EAC/B,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,eAAe;EACf,WAAW;AACb;AACA;EACE,gBAAgB;EAChB,iBAAiB;AACnB;AACA;EACE,gBAAgB;AAClB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;EACE,mBAAmB;AACrB;AACA;EACE,kBAAkB;AACpB;AACA;EACE,cAAc;EACd,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,eAAe;EACf,eAAe;EACf,iBAAiB;EACjB,qBAAqB;AACvB;AACA;EACE,aAAa;EACb,eAAe;AACjB;AACA;EACE,aAAa;AACf;AACA;EACE,aAAa;AACf;AACA;EACE,aAAa;EACb,YAAY;AACd;AACA;EACE,YAAY;EACZ,eAAe;EACf,iBAAiB;AACnB;AACA;EACE,iBAAiB;AACnB;AACA;EACE,aAAa;AACf;AACA;;;;EAIE,8BAA8B;EAC9B,gCAAgC;AAClC;AACA;;EAEE,8BAA8B;AAChC;AACA,mBAAmB;AACnB;;EAEE,aAAa;AACf;AACA;EACE,eAAe;AACjB;AACA;EACE;IACE,4BAA4B;IAC5B,iCAAiC;EACnC;EACA;IACE,aAAa;EACf;EACA;IACE,kBAAkB;EACpB;EACA;IACE,yBAAyB;IACzB,yBAAyB;IACzB,8BAA8B;EAChC;EACA;IACE,8BAA8B;EAChC;EACA;IACE,uBAAuB;IACvB,sBAAsB;EACxB;EACA;;IAEE,4BAA4B;EAC9B;EACA;IACE,wBAAwB;EAC1B;EACA;;IAEE,yBAAyB;IACzB,iBAAiB;IACjB,kBAAkB;IAClB,uBAAuB;IACvB,8BAA8B;EAChC;EACA;;IAEE,8BAA8B;EAChC;EACA,qBAAqB;EACrB;IACE,cAAc;IACd,8BAA8B;IAC9B,mBAAmB;IACnB,WAAW;IACX,yBAAyB;IACzB,mBAAmB;IACnB,iBAAiB;EACnB;EACA;IACE,gBAAgB;EAClB;EACA;IACE,wBAAwB;EAC1B;EACA;IACE,gCAAgC;EAClC;EACA;IACE,8BAA8B;IAC9B,+BAA+B;IAC/B,gCAAgC;IAChC,iBAAiB;IACjB,mBAAmB;EACrB;EACA;IACE,mBAAmB;IACnB,+BAA+B;IAC/B,eAAe;IACf,gBAAgB;IAChB,cAAc;IACd,qBAAqB;IACrB,mBAAmB;IACnB,+BAA+B;IAC/B,gCAAgC;EAClC;EACA;IACE,mBAAmB;IACnB,mBAAmB;IACnB,+BAA+B;IAC/B,6BAA6B;IAC7B,gCAAgC;EAClC;EACA;IACE,4BAA4B;IAC5B,mBAAmB;EACrB;EACA;IACE,uCAAuC;EACzC;EACA;;IAEE,YAAY;EACd;EACA,mBAAmB;EACnB;IACE,mBAAmB;EACrB;EACA;IACE,mBAAmB;EACrB;AACF;AACA;EACE,sBAAsB;EACtB,uBAAuB;EACvB,sBAAsB;AACxB;AACA;;;EAGE,qBAAqB;EACrB,mCAAmC;EACnC,kBAAkB;EAClB,mBAAmB;EACnB,cAAc;EACd,mCAAmC;EACnC,kCAAkC;EAClC,0BAA0B;AAC5B;AACA;;EAEE,eAAe;EACf,qBAAqB;EACrB,WAAW;AACb;AACA;EACE,YAAY;EACZ,eAAe;EACf,cAAc;AAChB;AACA;EACE,6BAA6B;EAC7B,YAAY;EACZ,UAAU;EACV,eAAe;EACf,sBAAsB;AACxB;AACA;EACE,UAAU;EACV,cAAc;EACd,kBAAkB;EAClB,kBAAkB;EAClB,iBAAiB;EACjB,eAAe;AACjB;AACA;EACE,eAAe;EACf,YAAY;EACZ,WAAW;EACX,qBAAqB;EACrB,kBAAkB;EAClB,cAAc;AAChB;AACA;EACE,eAAe;EACf,qBAAqB;EACrB,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,cAAc;AAChB;AACA;EACE,kBAAkB;AACpB;AACA;EACE,yBAAyB;EACzB,cAAc;EACd,mBAAmB;EACnB,eAAe;EACf,YAAY;EACZ,eAAe;EACf,cAAc;EACd,kBAAkB;EAClB,iBAAiB;EACjB,kBAAkB;EAClB,QAAQ;EACR,MAAM;EACN,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,WAAW;EACX,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,gBAAgB;EAChB,YAAY;EACZ,uBAAuB;AACzB;AACA;EACE,mBAAmB;EACnB,uHAAuH;EACvH,mBAAmB;EACnB,kBAAkB;AACpB;AACA;EACE,mBAAmB;EACnB,qHAAqH;EACrH,kBAAkB;EAClB,gBAAgB;AAClB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,mBAAmB;AACrB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,mBAAmB;EACnB,qBAAqB;AACvB;AACA;;;;;EAKE,cAAc;AAChB;AACA;;;;;;EAME,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;;EAEE,oCAAoC;AACtC;AACA;EACE,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;EACd,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,yBAAyB;AAC3B;AACA;;;;;;;EAOE,cAAc;EACd,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,yBAAyB;EACzB,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;EAEE,qCAAqC;AACvC;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;;;;;EAME,qBAAqB;EACrB,gBAAgB;AAClB;AACA;EACE,oCAAoC;AACtC;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;;;EAGE,mBAAmB;EACnB,cAAc;AAChB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;EAEE,cAAc;AAChB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,oCAAoC;AACtC;AACA;;EAEE,UAAU;AACZ;AACA;EACE,cAAc;EACd,YAAY;AACd;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;EACE,+BAA+B;AACjC;AACA;;EAEE,+BAA+B;AACjC;AACA;EACE,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;;;;EAME,+BAA+B;EAC/B,oCAAoC;EACpC,yBAAyB;AAC3B;AACA;EACE,6BAA6B;AAC/B;AACA;;;;EAIE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;;;EAGE,qCAAqC;AACvC;AACA;EACE,+BAA+B;AACjC;AACA;;;;;;;EAOE,cAAc;EACd,wCAAwC;EACxC,qBAAqB;AACvB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,mBAAmB;EACnB,qBAAqB;AACvB;AACA;;;;;EAKE,cAAc;AAChB;AACA;;;;;;EAME,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;;EAEE,oCAAoC;AACtC;AACA;EACE,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;EACd,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,yBAAyB;AAC3B;AACA;;;;;;;EAOE,cAAc;EACd,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,yBAAyB;EACzB,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;EAEE,qCAAqC;AACvC;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;;;;;EAME,qBAAqB;EACrB,gBAAgB;AAClB;AACA;EACE,oCAAoC;AACtC;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;;;EAGE,mBAAmB;EACnB,cAAc;AAChB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;EAEE,cAAc;AAChB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,oCAAoC;AACtC;AACA;;EAEE,UAAU;AACZ;AACA;EACE,cAAc;EACd,YAAY;AACd;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;EACE,+BAA+B;AACjC;AACA;;EAEE,+BAA+B;AACjC;AACA;EACE,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;;;;EAME,+BAA+B;EAC/B,oCAAoC;EACpC,yBAAyB;AAC3B;AACA;EACE,6BAA6B;AAC/B;AACA;;;;EAIE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;;;EAGE,qCAAqC;AACvC;AACA;EACE,+BAA+B;AACjC;AACA;;;;;;;EAOE,cAAc;EACd,wCAAwC;EACxC,qBAAqB;AACvB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,kBAAkB;AACpB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ,WAAW;EACX,mBAAmB;AACrB;AACA;EACE,iBAAiB;AACnB;AACA;;EAEE,yBAAyB;AAC3B;AACA;EACE,YAAY;EACZ,kBAAkB;EAClB,kBAAkB;AACpB;AACA;;EAEE,yBAAyB;AAC3B;AACA;;EAEE,yBAAyB;EACzB,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;;;EAIE,yBAAyB;AAC3B;AACA;EACE,kBAAkB;AACpB;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;;EAEE,yBAAyB;AAC3B;AACA;;;;EAIE,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,sBAAsB;EACtB,mCAAmC;EACnC,eAAe;EACf,kBAAkB;EAClB,WAAW;EACX,YAAY;EACZ,qBAAqB;AACvB;AACA;EACE,cAAc;AAChB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,YAAY;EACZ,uBAAuB;AACzB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,uBAAuB;AACzB;AACA;EACE,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,kBAAkB;AACpB;AACA;;EAEE,kBAAkB;AACpB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB;AACA;;EAEE,yBAAyB;AAC3B;AACA;;EAEE,+BAA+B;EAC/B,8BAA8B;AAChC;AACA;;EAEE,2BAA2B;EAC3B,4BAA4B;AAC9B;AACA;;EAEE,2BAA2B;EAC3B,yBAAyB;AAC3B;AACA;;EAEE,2BAA2B;AAC7B;AACA;;EAEE,+BAA+B;AACjC;AACA;EACE,gCAAgC;AAClC;AACA;EACE,8BAA8B;AAChC;AACA;EACE,8BAA8B;AAChC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,mBAAmB;AACrB;AACA;EACE,sBAAsB;EACtB,uBAAuB;EACvB,qBAAqB;AACvB;AACA;;EAEE,YAAY;EACZ,sBAAsB;EACtB,kBAAkB;EAClB,qBAAqB;AACvB;AACA;;EAEE,qBAAqB;AACvB;AACA;EACE,+BAA+B;AACjC;AACA;;EAEE,gCAAgC;AAClC;AACA;;EAEE,6BAA6B;AAC/B;AACA;;;;;;EAME,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;EACrB,mBAAmB;AACrB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,YAAY;EACZ,mBAAmB;EACnB,YAAY;AACd;AACA;;EAEE,mBAAmB;AACrB;AACA;;EAEE,yBAAyB;AAC3B;AACA;EACE,gCAAgC;AAClC;AACA;EACE,4BAA4B;AAC9B;AACA;EACE,yBAAyB;EACzB,0BAA0B;AAC5B;AACA;;EAEE,qBAAqB;EACrB,kBAAkB;AACpB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,cAAc;EACd,mBAAmB;EACnB,gCAAgC;AAClC;AACA;EACE,2BAA2B;EAC3B,iBAAiB;AACnB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,mBAAmB;EACnB,aAAa;EACb,mBAAmB;EACnB,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;EACnB,aAAa;EACb,mBAAmB;EACnB,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,kBAAkB;EAClB,iBAAiB;AACnB;AACA;EACE,mBAAmB;EACnB,iBAAiB;EACjB,gCAAgC;EAChC,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;EACtB,mBAAmB;EACnB,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB;AACA;EACE,6BAA6B;EAC7B,gBAAgB;AAClB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,6BAA6B;EAC7B,UAAU;EACV,SAAS;AACX;AACA;EACE,6BAA6B;AAC/B;AACA;;EAEE,mBAAmB;AACrB;AACA;;EAEE,sBAAsB;EACtB,mCAAmC;EACnC,eAAe;EACf,kBAAkB;EAClB,cAAc;AAChB;AACA;EACE,iBAAiB;EACjB,gBAAgB;AAClB;AACA;EACE,iBAAiB;EACjB,gBAAgB;AAClB;AACA;;;EAGE,sBAAsB;EACtB,mCAAmC;EACnC,eAAe;EACf,iBAAiB;EACjB,WAAW;EACX,kBAAkB;EAClB,cAAc;AAChB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;;EAEE,eAAe;EACf,mCAAmC;EACnC,UAAU;EACV,MAAM;EACN,cAAc;AAChB;AACA;EACE,YAAY;AACd;AACA;;EAEE,yBAAyB;AAC3B;AACA;EACE,gBAAgB;AAClB;AACA;EACE,mBAAmB;AACrB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,yBAAyB;AAC3B;AACA;;EAEE,wBAAwB;AAC1B;AACA;EACE,yBAAyB;AAC3B;AACA;;;EAGE,mBAAmB;AACrB;AACA;;;;;EAKE,kBAAkB;AACpB;AACA;;;;;EAKE,yBAAyB;AAC3B;AACA;;;EAGE,kBAAkB;EAClB,mBAAmB;EACnB,mBAAmB;EACnB,uBAAuB;AACzB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,kBAAkB;AACpB;AACA;EACE,kBAAkB;EAClB,mBAAmB;AACrB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;;;EAGE,yBAAyB;EACzB,oBAAoB;EACpB,sBAAsB;AACxB;AACA;EACE,sBAAsB;AACxB;AACA;EACE,cAAc;EACd,iBAAiB;EACjB,eAAe;EACf,YAAY;AACd;AACA;EACE,gBAAgB;AAClB;AACA;EACE,yBAAyB;EACzB,kBAAkB;AACpB;AACA;EACE,cAAc;AAChB;AACA;EACE,kBAAkB;EAClB,eAAe;EACf,cAAc;AAChB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;EACnB,aAAa;AACf;AACA;EACE,4BAA4B;AAC9B;AACA;;EAEE,mBAAmB;EACnB,+BAA+B;EAC/B,qBAAqB;AACvB;AACA;EACE,+BAA+B;EAC/B,qBAAqB;AACvB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,WAAW;EACX,mBAAmB;EACnB,+BAA+B;EAC/B,qBAAqB;AACvB;AACA;;EAEE,mBAAmB;EACnB,WAAW;EACX,yBAAyB;EACzB,iBAAiB;EACjB,8CAA8C;AAChD;AACA;EACE,eAAe;EACf,kBAAkB;AACpB;AACA;EACE,eAAe;EACf,iBAAiB;AACnB;AACA;EACE,mBAAmB;AACrB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;EACnB,YAAY;AACd;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,WAAW;EACX,eAAe;EACf,UAAU;EACV,eAAe;EACf,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,gCAAgC;EAChC,iBAAiB;AACnB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,cAAc;EACd,gCAAgC;AAClC;AACA;EACE,gCAAgC;AAClC;AACA;EACE,YAAY;AACd;AACA;EACE,cAAc;AAChB;AACA;;EAEE,yBAAyB;AAC3B;AACA;;EAEE,mBAAmB;EACnB,UAAU;AACZ;AACA;;EAEE,kBAAkB;AACpB;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EACd,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,gBAAgB;AAClB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;EAGE,gCAAgC;AAClC;AACA;EACE,YAAY;AACd;AACA;EACE,mBAAmB;AACrB;AACA;EACE,kBAAkB;AACpB;AACA;;EAEE,iBAAiB;AACnB;AACA;EACE,WAAW;EACX,sBAAsB;AACxB;AACA;;EAEE,cAAc;EACd,eAAe;AACjB;AACA;;EAEE,cAAc;EACd,eAAe;AACjB;AACA;;EAEE,cAAc;EACd,yBAAyB;EACzB,gBAAgB;AAClB;AACA;;;;EAIE,cAAc;AAChB;AACA;EACE,6BAA6B;EAC7B,cAAc;AAChB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,iBAAiB;AACnB;AACA;EACE,yBAAyB;EACzB,cAAc;EACd,gBAAgB;AAClB;AACA;EACE,oCAAoC;AACtC;AACA;EACE,cAAc;EACd,gBAAgB;AAClB;AACA;EACE,YAAY;EACZ,iBAAiB;AACnB;AACA;;EAEE,+BAA+B;AACjC;AACA;;EAEE,gCAAgC;AAClC;AACA;EACE,iBAAiB;AACnB;AACA;;EAEE,2EAA2E;AAC7E;AACA;EACE,gBAAgB;AAClB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,YAAY;EACZ,iBAAiB;AACnB;AACA;EACE,cAAc;EACd,gBAAgB;AAClB;AACA;EACE,2EAA2E;AAC7E;AACA;EACE,qBAAqB;EACrB,yBAAyB;AAC3B;AACA;EACE,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,cAAc;EACd,yBAAyB;AAC3B;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,qBAAqB;EACrB,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,yBAAyB;EACzB,qBAAqB;AACvB;AACA;EACE,mBAAmB;EACnB,cAAc;EACd,qBAAqB;AACvB;AACA;;EAEE,yBAAyB;EACzB,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,oCAAoC;AACtC;AACA;EACE,qBAAqB;AACvB;AACA;EACE,+BAA+B;AACjC;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;AACjC;AACA;EACE,eAAe;AACjB;AACA;EACE,gBAAgB;EAChB,iBAAiB;EACjB,kBAAkB;AACpB;AACA;EACE,kBAAkB;AACpB;AACA;;;EAGE,mCAAmC;AACrC;AACA;EACE,kBAAkB;EAClB,UAAU;AACZ;AACA;EACE,WAAW;EACX,UAAU;EACV,kBAAkB;EAClB,0BAA0B;EAC1B,wDAAwD;EACxD,WAAW;EACX,WAAW;EACX,SAAS;EACT,UAAU;EACV,QAAQ;EACR,kBAAkB;EAClB,mBAAmB;EACnB,uCAAuC;AACzC;AACA;;EAEE,cAAc;AAChB;AACA;EACE,yBAAyB;EACzB,UAAU;EACV,mBAAmB;AACrB;AACA;;EAEE,WAAW;AACb;AACA;EACE,cAAc;AAChB;AACA;EACE,2BAA2B;AAC7B;AACA;EACE,8CAA8C;AAChD;AACA;EACE,gBAAgB;EAChB,yBAAyB;EACzB,cAAc;EACd,gBAAgB;EAChB,iBAAiB;EACjB,kBAAkB;EAClB,YAAY;AACd;AACA;;;;;EAKE,mBAAmB;AACrB;AACA;EACE,mCAAmC;AACrC;AACA;EACE,qBAAqB;EACrB,mCAAmC;AACrC;AACA;EACE,gBAAgB;AAClB;AACA;EACE,iBAAiB;AACnB;AACA;;;;EAIE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB;AACA;;EAEE,kBAAkB;AACpB;AACA;EACE,iBAAiB;AACnB;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB;AACA;;;;EAIE,YAAY;EACZ,0CAA0C;AAC5C;AACA;;;;EAIE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB;AACA;;;;;EAKE,cAAc;AAChB;AACA;EACE,aAAa;EACb,eAAe;AACjB;AACA;EACE,eAAe;AACjB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,eAAe;EACf,sBAAsB;AACxB;AACA;;EAEE,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,yBAAyB;AAC3B;AACA;;;;EAIE,cAAc;EACd,yBAAyB;AAC3B;AACA;;;;;;;EAOE,cAAc;EACd,yBAAyB;EACzB,qBAAqB;AACvB;AACA;EACE,cAAc;AAChB;AACA;EACE,6BAA6B;EAC7B,sCAAsC;EACtC,UAAU;AACZ;AACA;EACE,sCAAsC;AACxC;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,UAAU;EACV,sBAAsB;EACtB,kBAAkB;EAClB,mCAAmC;EACnC,eAAe;EACf,cAAc;EACd,kBAAkB;AACpB;AACA;;;;EAIE,oCAAoC;EACpC,iBAAiB;AACnB;AACA;;EAEE,UAAU;EACV,kBAAkB;EAClB,mCAAmC;EACnC,eAAe;EACf,cAAc;EACd,8BAA8B;EAC9B,kBAAkB;AACpB;AACA;;;;EAIE,8BAA8B;AAChC;AACA;EACE,QAAQ;AACV;AACA;EACE,OAAO;AACT;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gCAAgC;AAClC;AACA;EACE,gCAAgC;AAClC;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,wBAAwB;AAC1B;AACA;;EAEE,sBAAsB;EACtB,cAAc;AAChB;AACA;;;;EAIE,0CAA0C;AAC5C;AACA;;EAEE,oCAAoC;AACtC;AACA;;;;EAIE,oCAAoC;AACtC;AACA;EACE,aAAa;AACf;AACA,qCAAqC;AACrC;EACE,mCAAmC;EACnC,2GAA2G;EAC3G,mBAAmB;EACnB,kBAAkB;AACpB;AACA,2CAA2C;AAC3C;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA,kDAAkD;AAClD;EACE,gBAAgB;EAChB,mBAAmB;AACrB;AACA;EACE,cAAc;AAChB;AACA,6BAA6B;AAC7B;;EAEE,4BAA4B;EAC5B,+BAA+B;EAC/B,uBAAuB;AACzB;AACA;EACE,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;;;EAGE,kBAAkB;AACpB;AACA;EACE,wBAAwB;AAC1B;AACA,QAAQ;AACR;EACE,wCAAwC;AAC1C;AACA;EACE;IACE,uBAAuB;EACzB;EACA;IACE,yBAAyB;EAC3B;AACF;AACA;EACE;IACE,uBAAuB;EACzB;EACA;IACE,yBAAyB;EAC3B;AACF\",\"sourcesContent\":[\".webix_view {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n -webkit-font-smoothing: antialiased;\\n cursor: default;\\n overflow: hidden;\\n border: 0px solid #DADEE0;\\n background-color: #FFFFFF;\\n white-space: normal;\\n -webkit-appearance: none;\\n}\\n.webix_view.webix_form {\\n background-color: #FFFFFF;\\n}\\nbody {\\n -webkit-tap-highlight-color: transparent !important;\\n}\\n/*\\n\\twebix_layout_{type}\\n\\tknown types are: line, clean, wide, space;\\n*/\\n.webix_abslayout {\\n position: relative;\\n}\\n.webix_abslayout > .webix_view {\\n position: absolute !important;\\n z-index: 0;\\n}\\n.webix_layout_space {\\n background-color: #EBEDF0;\\n}\\n.webix_layout_wide {\\n background-color: #EBEDF0;\\n}\\n.webix_layout_line,\\n.webix_multiview,\\n.webix_layout_clean,\\n.webix_layout_accordion {\\n background: transparent;\\n}\\n.webix_overlay {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n z-index: 90;\\n text-align: center;\\n padding-top: 10px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_view > .webix_disabled {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n left: 0;\\n background-color: #ddd;\\n opacity: 0.4;\\n z-index: 92;\\n cursor: not-allowed;\\n}\\n.webix_disabled_view {\\n overflow: hidden !important;\\n position: relative;\\n}\\nbody.webix_full_screen {\\n margin: 0;\\n padding: 0;\\n overflow: hidden;\\n}\\nbody.webix_noselect {\\n overscroll-behavior: none;\\n}\\n.webix_noselect,\\n.webix_noselect div {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_selectable {\\n -moz-user-select: text;\\n -webkit-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n.webix_template {\\n height: 100%;\\n padding: 4px 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_clean {\\n background: transparent;\\n}\\n.webix_clean .webix_template {\\n padding: 0px;\\n}\\n.webix_section {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background-color: transparent;\\n position: relative;\\n color: #444;\\n font-size: 10px;\\n text-transform: uppercase;\\n line-height: 44px;\\n}\\n.webix_section:before {\\n content: '';\\n display: block;\\n width: 100%;\\n height: 1px;\\n background-color: #DADEE0;\\n position: absolute;\\n top: 50%;\\n}\\n.webix_section > .webix_template {\\n padding: 0px 8px;\\n margin-left: 30px;\\n background-color: #FFFFFF;\\n display: inline;\\n position: relative;\\n}\\n.webix_layout_space > .webix_section > .webix_template {\\n padding: 0px 8px;\\n background-color: #EBEDF0;\\n}\\n.webix_layout_wide > .webix_section > .webix_template {\\n padding: 0px 8px;\\n background-color: #EBEDF0;\\n}\\n.webix_layout_line > .webix_section > .webix_template,\\n.webix_layout_clean > .webix_section > .webix_template {\\n padding: 0px 8px;\\n background-color: #FFFFFF;\\n}\\n.webix_header {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n line-height: 42px;\\n}\\n.webix_header .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_header.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_header.webix_dark .webix_el_button,\\n.webix_header.webix_dark .webix_el_label .webix_el_box,\\n.webix_header.webix_dark .webix_inp_label,\\n.webix_header.webix_dark .webix_inp_top_label,\\n.webix_header.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_secondary .webix_icon,\\n.webix_header.webix_dark .webix_transparent .webix_icon,\\n.webix_header.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_header.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_header.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_header.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_transparent button:hover,\\n.webix_header.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_header.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_header.webix_dark .webix_secondary button,\\n.webix_header.webix_dark .webix_inp_counter_next,\\n.webix_header.webix_dark .webix_inp_counter_prev,\\n.webix_header.webix_dark .webix_segment_0,\\n.webix_header.webix_dark .webix_segment_1,\\n.webix_header.webix_dark .webix_segment_N,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_header.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_header.webix_dark .webix_secondary button:hover,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_header.webix_dark .webix_inp_counter_next:hover,\\n.webix_header.webix_dark .webix_inp_counter_prev:hover,\\n.webix_header.webix_dark .webix_segment_0:hover,\\n.webix_header.webix_dark .webix_segment_1:hover,\\n.webix_header.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_header.webix_dark .webix_secondary button:focus,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_header.webix_dark .webix_inp_counter_next:focus,\\n.webix_header.webix_dark .webix_inp_counter_prev:focus,\\n.webix_header.webix_dark .webix_segment_0:focus,\\n.webix_header.webix_dark .webix_segment_1:focus,\\n.webix_header.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_secondary button:active,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_header.webix_dark .webix_inp_counter_next:active,\\n.webix_header.webix_dark .webix_inp_counter_prev:active,\\n.webix_header.webix_dark .webix_segment_0:active,\\n.webix_header.webix_dark .webix_segment_1:active,\\n.webix_header.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_inp_static,\\n.webix_header.webix_dark input[type=text],\\n.webix_header.webix_dark input[type=combo],\\n.webix_header.webix_dark input[type=datepicker],\\n.webix_header.webix_dark textarea,\\n.webix_header.webix_dark select,\\n.webix_header.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_header.webix_dark .webix_el_texthighlight input,\\n.webix_header.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_header.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_header.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_multicombo_value,\\n.webix_header.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_header.webix_dark .webix_inp_static:focus,\\n.webix_header.webix_dark input[type=text]:focus,\\n.webix_header.webix_dark input[type=combo]:focus,\\n.webix_header.webix_dark input[type=datepicker]:focus,\\n.webix_header.webix_dark textarea:focus,\\n.webix_header.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_header.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_header.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_header.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0,\\n.webix_header.webix_dark .webix_selected.webix_segment_1,\\n.webix_header.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_header.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_header.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_header.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_header.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_header.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_header.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_header.webix_dark .webix_el_icon,\\n.webix_header.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_header.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_header.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_header.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_header.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_header.webix_dark .webix_custom_checkbox,\\n.webix_header.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_custom_checkbox:focus,\\n.webix_header.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_header.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_header.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_header.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_invalid .webix_el_box input,\\n.webix_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_header.webix_dark .webix_invalid .webix_el_box select,\\n.webix_header.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_header.webix_dark input.webix_invalid,\\n.webix_header.webix_dark select.webix_invalid,\\n.webix_header.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_header.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_header.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_header.webix_dark {\\n color: #FFFFFF;\\n}\\n.webix_header > div {\\n line-height: 44px;\\n padding-left: 10px;\\n padding-top: 0;\\n padding-bottom: 0;\\n}\\n.webix_spacer {\\n background: transparent;\\n}\\n.webix_view_animate {\\n position: relative;\\n width: 100%;\\n height: 100%;\\n}\\nx\\\\:ui {\\n display: none;\\n}\\n.webix_view.webix_flexlayout {\\n display: flex !important;\\n flex-wrap: wrap;\\n flex-direction: row;\\n overflow: hidden;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_flexlayout > div {\\n display: block !important;\\n}\\n.webix_view_align {\\n background: transparent;\\n}\\n.webix_view div,\\n.webix_view span,\\n.webix_view a.webix_list_item,\\n.webix_view.webix_window {\\n outline: none;\\n}\\ntextarea,\\ninput,\\nselect,\\nbutton,\\n.webix_view div.webix_inp_static:focus {\\n outline: none;\\n}\\n.webix_resize_area {\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n width: 100%;\\n height: 100%;\\n}\\n.webix_resize_handle_x .webix_handle_content,\\n.webix_resize_handle_y .webix_handle_content {\\n width: 100%;\\n height: 100%;\\n background: rgba(100, 100, 100, 0.1);\\n border: 1px dotted #ebebeb;\\n}\\n.webix_resize_handle_x {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n cursor: ew-resize;\\n width: 1px;\\n height: 100%;\\n position: absolute;\\n z-index: 2;\\n top: 0px;\\n}\\n.webix_resize_handle_x .webix_handle_content {\\n border-width: 0px 1px;\\n}\\n.webix_resize_origin_x {\\n cursor: ew-resize;\\n width: 3px;\\n height: 100%;\\n position: absolute;\\n z-index: 2;\\n top: 0px;\\n}\\n.webix_resize_handle_y {\\n cursor: ns-resize;\\n height: 1px;\\n width: 100%;\\n position: absolute;\\n z-index: 2;\\n left: 0px;\\n}\\n.webix_resize_handle_y .webix_handle_content {\\n border-width: 1px 0px;\\n}\\n.webix_resize_origin_y {\\n cursor: ns-resize;\\n height: 3px;\\n width: 100%;\\n position: absolute;\\n z-index: 2;\\n left: 0px;\\n}\\n.webix_resizer {\\n position: relative;\\n}\\n.webix_resizer.webix_disabled_view {\\n cursor: default;\\n}\\n.webix_resizer_vy {\\n cursor: ns-resize;\\n margin-top: 0px !important;\\n border: 0px !important;\\n padding: 0px !important;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAADAQMAAABCowZuAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA9JREFUCB1jXMUABoxAGgAJaAFXPIkJqAAAAABJRU5ErkJggg==\\\") no-repeat center center;\\n}\\n.webix_resizer_vx {\\n cursor: ew-resize;\\n margin-left: 0px !important;\\n border: 0px !important;\\n padding: 0px !important;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAXAQMAAAD0oWdxAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA5JREFUeF5jWMDAQDwGAKyuB4FpGQdzAAAAAElFTkSuQmCC\\\") no-repeat center center;\\n}\\n.webix_resizer_y {\\n cursor: ns-resize;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAADAQMAAABCowZuAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA9JREFUCB1jXMUABoxAGgAJaAFXPIkJqAAAAABJRU5ErkJggg==\\\") no-repeat center center;\\n background-color: #ffffff;\\n}\\n.webix_resizer_x {\\n cursor: ew-resize;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAXAQMAAAD0oWdxAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA5JREFUeF5jWMDAQDwGAKyuB4FpGQdzAAAAAElFTkSuQmCC\\\") no-repeat center center;\\n background-color: #ffffff;\\n}\\n.webix_accordionitem_body {\\n position: relative;\\n}\\n.webix_accordionitem_body > div {\\n border-width: 0px!important;\\n}\\n.webix_accordionitem_header {\\n border-bottom: 1px solid #DADEE0;\\n position: relative;\\n z-index: 2;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n line-height: 42px;\\n cursor: pointer;\\n overflow: hidden;\\n}\\n.webix_accordionitem_header.webix_dark {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_accordionitem_header.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_button,\\n.webix_accordionitem_header.webix_dark .webix_el_label .webix_el_box,\\n.webix_accordionitem_header.webix_dark .webix_inp_label,\\n.webix_accordionitem_header.webix_dark .webix_inp_top_label,\\n.webix_accordionitem_header.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_transparent .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_accordionitem_header.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_accordionitem_header.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_accordionitem_header.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_transparent button:hover,\\n.webix_accordionitem_header.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_accordionitem_header.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev,\\n.webix_accordionitem_header.webix_dark .webix_segment_0,\\n.webix_accordionitem_header.webix_dark .webix_segment_1,\\n.webix_accordionitem_header.webix_dark .webix_segment_N,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button:hover,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next:hover,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev:hover,\\n.webix_accordionitem_header.webix_dark .webix_segment_0:hover,\\n.webix_accordionitem_header.webix_dark .webix_segment_1:hover,\\n.webix_accordionitem_header.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button:focus,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next:focus,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev:focus,\\n.webix_accordionitem_header.webix_dark .webix_segment_0:focus,\\n.webix_accordionitem_header.webix_dark .webix_segment_1:focus,\\n.webix_accordionitem_header.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button:active,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next:active,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev:active,\\n.webix_accordionitem_header.webix_dark .webix_segment_0:active,\\n.webix_accordionitem_header.webix_dark .webix_segment_1:active,\\n.webix_accordionitem_header.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_inp_static,\\n.webix_accordionitem_header.webix_dark input[type=text],\\n.webix_accordionitem_header.webix_dark input[type=combo],\\n.webix_accordionitem_header.webix_dark input[type=datepicker],\\n.webix_accordionitem_header.webix_dark textarea,\\n.webix_accordionitem_header.webix_dark select,\\n.webix_accordionitem_header.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_texthighlight input,\\n.webix_accordionitem_header.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_accordionitem_header.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_multicombo_value,\\n.webix_accordionitem_header.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_accordionitem_header.webix_dark .webix_inp_static:focus,\\n.webix_accordionitem_header.webix_dark input[type=text]:focus,\\n.webix_accordionitem_header.webix_dark input[type=combo]:focus,\\n.webix_accordionitem_header.webix_dark input[type=datepicker]:focus,\\n.webix_accordionitem_header.webix_dark textarea:focus,\\n.webix_accordionitem_header.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_icon,\\n.webix_accordionitem_header.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_accordionitem_header.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_accordionitem_header.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_accordionitem_header.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_accordionitem_header.webix_dark .webix_custom_checkbox,\\n.webix_accordionitem_header.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_custom_checkbox:focus,\\n.webix_accordionitem_header.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_accordionitem_header.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_accordionitem_header.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_accordionitem_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_accordionitem_header.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box input,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box select,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_accordionitem_header.webix_dark input.webix_invalid,\\n.webix_accordionitem_header.webix_dark select.webix_invalid,\\n.webix_accordionitem_header.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_accordionitem_label {\\n height: 100%;\\n padding-left: 10px;\\n}\\n.webix_accordionitem_button {\\n float: right;\\n position: relative;\\n height: 11px;\\n width: 11px;\\n margin: 14.5px 13px;\\n}\\n.webix_carousel {\\n position: relative;\\n}\\n.webix_nav_panel {\\n bottom: 16px;\\n height: 14px;\\n line-height: 14px;\\n overflow: hidden;\\n position: absolute;\\n text-align: center;\\n padding: 2px 0;\\n}\\n.webix_nav_item {\\n display: inline-block;\\n height: 10px;\\n margin: 0 2px;\\n width: 10px;\\n cursor: pointer;\\n border-radius: 50%;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n}\\n.webix_nav_inactive {\\n border: 2px solid rgba(0, 0, 0, 0.15);\\n opacity: 0.6;\\n background: #fff;\\n}\\n.webix_nav_active {\\n border: 2px solid rgba(0, 0, 0, 0.1);\\n background: #fff;\\n}\\n.webix_nav_active:hover,\\n.webix_nav_active:focus {\\n box-shadow: 0 0 2px #fff;\\n}\\n.webix_nav_button_prev,\\n.webix_nav_button_next {\\n cursor: pointer;\\n display: block;\\n height: 32px;\\n line-height: 32px;\\n position: absolute;\\n width: 32px;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_nav_button_next .webix_nav_button_inner {\\n height: 100%;\\n width: 100%;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowNDNEOTBEMTYyNzQxMUUzOEU1N0MyQTEyMzIxMDVFQSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowNDNEOTBEMjYyNzQxMUUzOEU1N0MyQTEyMzIxMDVFQSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA0M0Q5MENGNjI3NDExRTM4RTU3QzJBMTIzMjEwNUVBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA0M0Q5MEQwNjI3NDExRTM4RTU3QzJBMTIzMjEwNUVBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+yGPRLgAAAPBJREFUeNpi+P//vycQP/tPfQAy05MRxGBgYJBkoA14DrLgPwMNARMDjcGgteAINN5CCaokI3UcB2I+UNQBsTghxaRacAaI+aH62IB4MzUtuAjEwlA9zEC8hhhNxFpwFYhFkQxfTqyriLHgFhBLQtWC8s18UsKUkAV3gVgGyfBZpKYIQhbYQtWAcBg5BRIhC26j+WAOtS0AgRvQ9A6L4IXUtgAELqOlopXUtgAEzgOxIFQPKxCvo7YFIHAKLSdvo7YFIHAUiHmgeiUIKSanNLUC4i1ALAHENoQUD48a7TkNzX8BsiAFxKCB4U+BOBkgwAAsAiGcWMs58QAAAABJRU5ErkJggg==\\\");\\n}\\n.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEODJBRDc2RTYyNzMxMUUzQTMxN0IxNjAwN0JBOUE4OSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEODJBRDc2RjYyNzMxMUUzQTMxN0IxNjAwN0JBOUE4OSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ4MkFENzZDNjI3MzExRTNBMzE3QjE2MDA3QkE5QTg5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ4MkFENzZENjI3MzExRTNBMzE3QjE2MDA3QkE5QTg5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+crpRPgAAAOhJREFUeNpi+P//vycQP/tPfQAy05MRxGBgYJBkoA14DrLgPwMNARMDjcGgsCAMGkdHyLKBiNQgDoomIOYH4uOkJiViLNgMxGxIlpyhtgUgsAaImaHqhYH4IrUtAIHlSJaIAvFValsAAvOBmBGqTxKIb1HbAhCYhWSJDBDfobYFIBAO1QvCNtS2YA6SD6SB+DY1LViIFNFiQHydmnGwEi0VXaZmKloHxKxQ9YJAfJ6a+WAbWk4+Re2cLAFVxwPER0lNEcSUpjZALAHEW4DYitTCdHjUaM9paP4LkAUpIAYNDH8KxMkAAQYAlwMhmq8XxigAAAAASUVORK5CYII=\\\");\\n}\\n.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_panel_corner {\\n right: 80px;\\n}\\n.webix_nav_button_corner.webix_nav_button_prev {\\n bottom: 9px;\\n right: 44px;\\n}\\n.webix_nav_button_corner.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_corner.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_button_corner.webix_nav_button_next {\\n bottom: 9px;\\n right: 8px;\\n}\\n.webix_nav_button_corner.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_corner.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_panel_side {\\n margin: 0 auto;\\n left: 0;\\n width: 100%;\\n}\\n.webix_nav_button_side {\\n height: 86px;\\n line-height: 86px;\\n width: 56px;\\n top: 50%;\\n margin-top: -43px;\\n}\\n.webix_nav_button_side.webix_nav_button_next {\\n left: auto;\\n right: 16px;\\n}\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTc4MTkxODY2MzBGMTFFMzk1MUQ4RTNCRjNCMUVFRUMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTc4MTkxODU2MzBGMTFFMzk1MUQ4RTNCRjNCMUVFRUMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4NjlGM0NFNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA4NjlGM0NGNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+D/KEcQAAAOhJREFUeNqs1jsOwjAMBuCKhR2uxsLGxg1a+hD0wVGYGJC4DgssnAFVQjLukKWk/WM7lv4OqfQ1UdLWCRGtOTdOz3lwtpzEkuFyp/9KreiX/JVa0DdNV6ZF9zRfmQYdcgbwQYNGhccDXQzYN4jgXIOa4bkntgAuNKgaDtlNMRx69hoAlxpUBEvfawRXGnRIjeBFIq8e3F9KZ5mDWXbS5QeBEjQYDEULALbSwy8GEYrARvpBUYNTaGkBfagZHKMIrKU/vioW6NANAE+aZuIVE3RoHxN06NUDHq2t5Ipz4Xw4T87O2vT+BBgAeQQKvezNqP0AAAAASUVORK5CYII=\\\");\\n}\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_button_side.webix_nav_button_prev {\\n left: 16px;\\n right: auto;\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjIzRTVCQkY2MzBGMTFFM0FDNTBDNzdDRkQ0NTI0NzciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjIzRTVCQkU2MzBGMTFFM0FDNTBDNzdDRkQ0NTI0NzciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4NjlGM0NFNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA4NjlGM0NGNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+wRT1eAAAAM9JREFUeNqs1jsKwlAQBdDBxlL3ZmVlmRXYaaVbCYg7kti4BQu1e85AhBDfZz73wm1ewsmfDKWUKNgNd+C+uVfuOgoe0n8uaFDyQoOSOxqU7NDgUfaDgxZUDWpRE6hBzWALdYE11A2W0BCYQ8PgHIWAUxQG/lAoKF0Q0ZLq+ZA1o35qnO3eevlweL4AgXOL5yhc2hCCa0d0w63744I1T9MMa989E2z5/NSw9Retgj3DRAveeseeGnyLDGgl+BkdJXNwH0WlHfcxDr09d/UVYADVjwptZ8mPvQAAAABJRU5ErkJggg==\\\");\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_carousel > .webix_scroll_x,\\n.webix_carousel > .webix_scroll_y {\\n background-color: rgba(0, 0, 0, 0);\\n}\\n.webix_dark .webix_nav_inactive {\\n background-color: #95a5a6;\\n}\\n.webix_dark .webix_nav_active {\\n background-color: #7f8c8d;\\n}\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSIURgotfwAAASxJREFUSMfNlbErhlEUh5/vJZOSQSijshgsFiklhdj0lcHw5SP7uX+A8we4d1c+g2RgsIjIxmCxGCzKRO9bMjCSWE5WpXPrO9MZbs9T5577u7XNrTgPtIBBfKsEmkUmOMZsFZngv5KCzNW2gmsbbT2H4AZY0CAVcOUtuAXmNMi7xtQF7HgK7oBZDfKmMXUAB8Cil+AemNEgrwbfB5a8LvnB4C8aU83Gsuy1RY/AtAYpDb4NNDzXtKFBnqyvA+ve72BXYxqy/shyy1UwDFxqTP0a5BvYAPa8X/KISfo0yBewChx6R8UocKEx9ZpkBTj2zqIx4Fxj6tEgn7aqZ95RMQ6cakzdGuTDxuUedhPAicY0AEz+dbjzn3E9ZX9ue3w4ZUZ+VQBrQJUB/gw0fwC/UlVpnH2f9AAAAABJRU5ErkJggg==\\\");\\n}\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSENCUzWfAAAAS1JREFUSMfN1TFLXEEUhuFnr8FKCBaGiK2FRQobG7GSgBG2E8IWFmE3wX7uD3B+QOb2QpaAiMWmsAkJBtMEizQ2FmmCXcIuhBRpDZI0g7XCXNhTD+8L53znTGf/ddrGEIvK1hiDqiW4zBxWLcFvJZWWayoEz3Mbz9sSfIl1mKCLr20I3sTUzMY6/MEzXJQWdHEcUzOTJVu4LD3kHRxlyW88xbfSKerldnViHX5lyffSMX2BgywZYxNXpffgVY6uWIcfWVpUMMQIYmqW8Lak4BB7sQ7/Ymoe4QzLpQQj9GMdbmJqFvAZK6WGfILdDJ/HJzwpFdOP6MU6/I2peYhTrJZctH6sw3VMzRw+YK30qdiIqXmM91i/b+Qe3OHNu6n/cMYt8icVXmLSAvwnBv8B+EFU7qlZ1xIAAAAASUVORK5CYII=\\\");\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSI77dsQJgAAARxJREFUSMet1jFqAkEUxvH/rkIqLVN5ES2CjScQG6tUESx3SWOMLKgggt7BC6SxsnIr9w4ewAsEEis3RTBE3N3ZmfemHB4/HsPMm89L0xTJilbrLrAAGsAWeKkKwTEw/bfVAy6ea6cZ4HV9+8ogwMm6UwMI8Owrg5MoDDa+MjgF8LXBUqgtaERdwELUFcxFJWAmKgXvUA3wBtUC/1BNEKBCra4KXjt9MNScbadYJd7t9nGSVIGnnJpOnCRf7VbzYNMpURi8A7OCumW0Wr9aodrw7T39hedS+P5FhcFYCme/fSGcP6UEcPE8dYTNk98BLvdHWcLlf1ML2CVMzIC3gpK+U5YywEdJQMuDP50CmuGMt55C6B0AI+AR+ACGPw26r6m12WOpAAAAAElFTkSuQmCC\\\");\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSE1IU5u4gAAAW1JREFUSMet1rtOwzAUgOG/5jbBwsQD8BAwIAa2TggegjmRgELbuFeo1GRlQEJMMDN264CUiYdgg0dolzIkFUEk9nHSbLGtT76cc+xaMA53gUegDnwCgfa9Vyp8CngCToFNYB940WF0WRWt57SPqsAK+C7oG+kwuiqLdg3992Xgtelk8jGN4w3gqGDMyTSOZ8eHB+8uM0X7XhMYGMbd6TC6dkIzcH8VsMr+aN9rCeCGEyqEhzZY5TWmcM8C3zihKdy2wIMiWJmWURZWtk1P4a4FvnVCUziwwP0srKQBLYSbALXFYuGU1zqMNBAYhrRUiSI0s/RvKcdZNoChcQt8Tz5TKSg/fQdQFqdJcJvAXha0Z1QCDixgW577drCbBxZXKRkYyOtpkm6lwf+VPwH7VcC/d5Qd7EjA39s0KQQ2UIvvfbZ3zoEHU2Rp3+u4vlDGqwSX6N4qwSX6ltMelAUB1oELYA6cAV/poTxXeZ/+AOFqn1e/Gh7yAAAAAElFTkSuQmCC\\\");\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_list_item {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 2px 12px;\\n line-height: 31px;\\n cursor: pointer;\\n border-bottom: 1px solid #EDEFF0;\\n text-align: left;\\n border-color: #EDEFF0;\\n}\\n.webix_list_icon {\\n vertical-align: middle;\\n margin-right: 4px;\\n}\\n.webix_list_item.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_list_item.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_list_item.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_list .webix_list_item.webix_selected {\\n border-bottom: 1px solid #EDEFF0;\\n padding: 2px 12px;\\n}\\n.webix_group {\\n position: relative;\\n}\\n.webix_group_back,\\n.webix_group_back.webix_selected {\\n position: relative;\\n background: #F4F5F9;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_arrow_icon {\\n position: absolute;\\n top: 50%;\\n bottom: 50%;\\n margin-top: -10px;\\n right: 8px;\\n width: 20px;\\n height: 20px;\\n line-height: 20px;\\n color: #475466;\\n font-size: 20px;\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_arrow_icon:before {\\n content: '\\\\F003';\\n}\\n.webix_group_back {\\n padding-left: 33px;\\n}\\n.webix_group_back .webix_arrow_icon {\\n left: 8px;\\n}\\n.webix_group_back .webix_arrow_icon:before {\\n content: '\\\\F002';\\n}\\n.dhx_pagelist {\\n position: relative;\\n}\\n.webix_list_count {\\n float: right;\\n width: 25px;\\n font-size: 14px;\\n text-align: center;\\n margin-right: 45px;\\n box-shadow: 0 1px 0 #000000;\\n text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.6);\\n}\\n.webix_unit_header {\\n padding: 0 12px;\\n line-height: 35px;\\n text-align: left;\\n background-color: #F4F5F9;\\n}\\n.webix_list-x .webix_list_item {\\n display: inline-block;\\n vertical-align: top;\\n border-right: 1px solid #EDEFF0;\\n border-bottom: none;\\n border-color: #EDEFF0;\\n}\\n.webix_list-x .webix_list_item.webix_selected {\\n border-left: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n padding-left: 11px;\\n}\\n.webix_list-x .webix_scroll_cont {\\n display: inline-block;\\n}\\n.webix_view.webix_list-x {\\n white-space: nowrap;\\n}\\n/* Style for disabled items */\\n.webix_list_item.webix_disabled {\\n color: #8b949e;\\n background-color: #FFFFFF;\\n cursor: not-allowed;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_list_item.webix_disabled:focus {\\n background-color: #FFFFFF;\\n}\\n.webix_list_item.webix_disabled .webix_badge {\\n background-color: #eab993;\\n}\\n.webix_list_item.webix_disabled .webix_submenu_icon {\\n visibility: hidden;\\n}\\n/*button of pager*/\\n.webix_view.webix_pager {\\n padding: 3px 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background-color: transparent;\\n}\\n.webix_pager_item,\\n.webix_pager_item_selected {\\n padding: 0 6px;\\n text-align: center;\\n height: 100%;\\n width: auto;\\n min-width: 32px;\\n margin: 0 2px;\\n cursor: pointer;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border-radius: 2px;\\n}\\n.webix_pager_item .webix_icon,\\n.webix_pager_item_selected .webix_icon {\\n line-height: 0;\\n font-size: 17px;\\n}\\n.webix_pager_item {\\n background: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_pager_item:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:active {\\n background-color: #daddeb;\\n}\\n.webix_pager_item:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:active {\\n background-color: #daddeb;\\n}\\n/*selected button of pager*/\\n.webix_pager_item_selected {\\n cursor: default;\\n}\\n.webix_pager_item_selected:hover {\\n background-color: #1992af;\\n}\\n.webix_pager_item_selected:focus {\\n background-color: #1992af;\\n}\\n.webix_pager_item_selected:active {\\n background-color: #17839d;\\n}\\n.webix_animation .webix_ss_header {\\n position: relative;\\n z-index: 1;\\n}\\n.webix_animation .webix_ss_vscroll_header {\\n z-index: 1;\\n}\\n.webix_animation .webix_ss_footer,\\n.webix_animation .webix_vscroll_x {\\n position: absolute;\\n bottom: 0px;\\n z-index: 1;\\n}\\n/*helper for allowing selection*/\\n.webix_allow_selection {\\n -moz-user-select: text;\\n -webkit-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n/*default item in dataview*/\\n.webix_dataview_item {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 2px 12px;\\n line-height: 31px;\\n cursor: pointer;\\n border-bottom: 1px solid #EDEFF0;\\n text-align: left;\\n border-color: #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_dataview_item.webix_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_dataview_item.webix_disabled {\\n color: #94A1B3;\\n}\\n.webix_dataview_item.webix_selected.webix_disabled {\\n box-shadow: inset 2px 0 #94A1B3;\\n}\\n.webix_dataview_item .webix_icon {\\n font-size: 20px;\\n}\\n/*default item in selected state*/\\n.webix_dataview_item.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n border-bottom: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_dataview_item.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_dataview_item.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_dataview_item.tiles {\\n border: 1px solid #EDEFF0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_drag_zone > .webix_dataview_item.tiles {\\n margin: 0 !important;\\n}\\n.webix_dataview .webix_scroll_cont {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n/*chart container*/\\n.webix_chart {\\n position: relative;\\n font-family: Roboto, sans-serif;\\n font-size: 13px;\\n color: #475466;\\n overflow: hidden;\\n z-index: 1;\\n}\\n.webix_chart canvas {\\n position: absolute;\\n}\\n/*labels*/\\n.webix_canvas_text {\\n position: absolute;\\n text-align: center;\\n overflow: hidden;\\n white-space: nowrap;\\n font-size: 12px;\\n z-index: 80;\\n}\\n.webix_chart .webix_canvas_text {\\n border-radius: 4px;\\n}\\n.webix_chart .webix_canvas_text.webix_inner_text_dark {\\n color: #475466;\\n text-shadow: 0 0 4px #ffffff;\\n padding: 0 2px;\\n}\\n.webix_chart .webix_canvas_text.webix_inner_text_light {\\n color: #ffffff;\\n text-shadow: 0 0 4px #475466;\\n padding: 0 2px;\\n}\\n/*map*/\\n.webix_map_img {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n border: 0px;\\n opacity: 0;\\n -webkit-user-select: none;\\n}\\n/*scales*/\\n.webix_axis_item_y {\\n position: absolute;\\n height: 18px;\\n line-height: 18px;\\n margin-top: -4px;\\n text-align: right;\\n}\\n.webix_axis_item_x {\\n padding-top: 2px;\\n}\\n.webix_axis_title_x {\\n text-align: center;\\n font-size: 13px;\\n}\\n.webix_axis_title_y {\\n text-align: center;\\n font-family: Verdana;\\n font-size: 13px;\\n transform: rotate(-90deg);\\n padding-left: 3px;\\n}\\n/*legend block*/\\n.webix_chart_legend {\\n position: absolute;\\n z-index: 81;\\n}\\n.webix_chart_legend_item {\\n height: 18px;\\n line-height: 18px;\\n padding: 2px;\\n cursor: pointer;\\n}\\n.webix_chart_legend_item.hidden {\\n color: #cfd5dd;\\n}\\n.webix_axis_item_y.webix_radar {\\n color: #555;\\n font-size: 11px;\\n padding-right: 3px;\\n height: 13px;\\n line-height: 13px;\\n margin-top: 0px;\\n}\\n.webix_canvas_text.webix_axis_radar_title {\\n margin-top: 0px;\\n padding-top: 0px;\\n color: #74869f;\\n font-size: 12px;\\n}\\n.webix_axis_item_y,\\n.webix_axis_item_x {\\n color: #74869f;\\n}\\n/*data frame*/\\n.webix_chart_frame {\\n background-color: #a0cfef;\\n height: 100%;\\n opacity: 0.3;\\n position: absolute;\\n top: 0;\\n z-index: 82;\\n border-left: 1px solid #3498db;\\n border-right: 1px solid #3498db;\\n cursor: w-resize;\\n}\\n.webix_chart_resizer {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAYAAAAx8TU7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTJCMjdFNENBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTJCMjdFNERBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5MkIyN0U0QUFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5MkIyN0U0QkFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Powz/icAAAAaSURBVHjaYmBgYDBjgAA4zcSABQysIECAAQBn+ACx2PqtbAAAAABJRU5ErkJggg==\\\");\\n background-position: 3px center;\\n background-repeat: no-repeat;\\n border-radius: 2px;\\n height: 20px;\\n bottom: 0;\\n width: 11px;\\n z-index: 83;\\n position: absolute;\\n background-color: #fff;\\n border: 1px solid #cccccc;\\n cursor: w-resize;\\n}\\n.webix_chart_resizer:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_wresize_cursor {\\n cursor: w-resize;\\n}\\n/* donut center text */\\n.webix_donut_center_text {\\n display: inline-block;\\n line-height: normal;\\n white-space: normal;\\n vertical-align: middle;\\n}\\n.webix_dt_editor {\\n position: absolute;\\n z-index: 2;\\n overflow: visible;\\n background: #FFFFFF;\\n}\\n.webix_dt_editor input,\\n.webix_dt_editor select {\\n width: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 0 11px;\\n margin: 0;\\n border: 1px solid #ffd700;\\n height: 100%;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_dt_editor input[type=\\\"checkbox\\\"] {\\n margin: 11px 13px 0px;\\n height: auto;\\n width: auto;\\n}\\n.webix_dt_editor select {\\n padding: 0 7px;\\n}\\n.webix_clipbuffer {\\n width: 2000px;\\n height: 1px;\\n padding: 0;\\n margin: 0;\\n border: 0;\\n left: 0px;\\n top: 0px;\\n white-space: pre-wrap;\\n position: fixed;\\n opacity: 0;\\n pointer-events: none;\\n cursor: default;\\n}\\n.webix_dt_editor.webix_password_editor {\\n overflow: hidden;\\n}\\n.webix_password_editor input {\\n padding-right: 26px;\\n}\\n.webix_password_editor .webix_icon {\\n position: absolute;\\n right: 4px;\\n top: 50%;\\n margin-top: -9px;\\n font-size: 18px;\\n cursor: pointer;\\n color: #94A1B3;\\n}\\n.webix_password_editor .webix_icon:hover {\\n color: #1CA1C1;\\n}\\n.webix_column,\\n.webix_hcolumn {\\n position: absolute;\\n top: 0px;\\n}\\n.webix_cell {\\n overflow: hidden;\\n line-height: 33px;\\n white-space: nowrap;\\n}\\n.webix_hcell {\\n width: 100%;\\n overflow: hidden;\\n}\\n.webix_cell,\\n.webix_hcell {\\n background: inherit;\\n font: inherit;\\n text-align: inherit;\\n color: inherit;\\n}\\n.webix_ss_body {\\n overflow: hidden;\\n position: relative;\\n}\\n.webix_hs_center,\\n.webix_hs_right,\\n.webix_hs_left,\\n.webix_ss_center,\\n.webix_ss_right,\\n.webix_ss_left {\\n overflow: hidden;\\n float: left;\\n position: relative;\\n}\\n.webix_ss_center_scroll {\\n height: 100%;\\n position: relative;\\n overflow: hidden;\\n min-height: 1px;\\n}\\n.webix_ss_hscroll {\\n bottom: 0px;\\n}\\n.webix_ss_vscroll {\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n z-index: 2;\\n}\\n.webix_ss_vscroll_footer {\\n position: absolute;\\n bottom: 0px;\\n right: 0px;\\n border-left: 1px solid #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n z-index: 1;\\n}\\n.webix_ss_vscroll_header {\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n border-left: 1px solid #DADEE0;\\n border-bottom: 1px solid #DADEE0;\\n z-index: 1;\\n}\\n.webix_dtable {\\n position: relative;\\n cursor: default;\\n z-index: 0;\\n}\\n.webix_ss_footer,\\n.webix_ss_header {\\n clear: both;\\n overflow: hidden;\\n}\\n.webix_table_cell,\\n.webix_view.webix_table_cell,\\n.webix_block_selection,\\n.webix_hcell,\\n.webix_cell {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_table_cell {\\n font-size: 14px;\\n}\\n.webix_block_selection {\\n position: absolute;\\n}\\n.webix_ss_sort_asc,\\n.webix_ss_sort_desc {\\n position: absolute;\\n top: 50%;\\n right: 2px;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 20px;\\n width: 24px;\\n height: 24px;\\n line-height: 24px;\\n margin-top: -12px;\\n float: none;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_ss_sort_asc.webix_ss_sort_single,\\n.webix_ss_sort_desc.webix_ss_sort_single {\\n width: 20px;\\n text-align: center;\\n}\\n.webix_ss_sort_asc:before {\\n content: '\\\\F004';\\n}\\n.webix_ss_sort_desc:before {\\n content: '\\\\F001';\\n}\\n.webix_ss_sort_num {\\n position: absolute;\\n top: 0;\\n right: 0;\\n height: 12px;\\n line-height: 12px;\\n font-family: Roboto, sans-serif;\\n font-size: 10px;\\n text-align: right;\\n color: #1CA1C1;\\n}\\n.webix_ss_sort_single .webix_ss_sort_num {\\n display: none;\\n}\\n.webix_hcell .webix_excel_filter {\\n position: absolute;\\n top: 50%;\\n right: 2px;\\n width: 20px;\\n height: 20px;\\n line-height: 20px;\\n margin-top: -10px;\\n vertical-align: middle;\\n text-align: center;\\n cursor: pointer;\\n color: #94A1B3;\\n}\\n.webix_hcell .webix_excel_filter:hover {\\n color: #1CA1C1;\\n}\\n.webix_excel_filter ~ .webix_ss_sort_asc,\\n.webix_excel_filter ~ .webix_ss_sort_desc {\\n right: 24px;\\n}\\n.webix_hcell.webix_ss_excel_filter {\\n position: relative;\\n}\\n.webix_hcell.webix_ss_filter_active .webix_excel_filter {\\n color: #1CA1C1;\\n}\\n.webix_hcell.webix_ss_filter_active .webix_excel_filter:hover {\\n color: #17839d;\\n}\\n.webix_hcell.webix_ss_filter {\\n padding: 3px 5px 3px 5px;\\n}\\n.webix_hcell .webix_tree_close,\\n.webix_hcell .webix_tree_open {\\n margin-right: 5px;\\n}\\n.webix_table_checkbox,\\n.webix_hcell input[type=\\\"checkbox\\\"] {\\n margin: 0px 1px 2px;\\n vertical-align: middle;\\n}\\n.webix_ss_filter select,\\n.webix_ss_filter input {\\n width: 100%;\\n font-size: inherit;\\n color: #475466 !important;\\n height: 38px;\\n margin-top: -2px;\\n padding: 0 3px;\\n vertical-align: top;\\n border: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-family: Roboto, sans-serif;\\n}\\n.webix_richfilter {\\n margin-top: 1px;\\n line-height: 32px;\\n}\\n.webix_ss_filter select {\\n padding: 3px;\\n}\\n/*headers and footers*/\\n.webix_ss_header,\\n.webix_hcolumn,\\n.webix_ss_vscroll_header,\\n.webix_dd_drag_column,\\n.webix_hs_left,\\n.webix_hs_center,\\n.webix_hs_right {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n background: #F4F5F9;\\n}\\n.webix_ss_footer,\\n.webix_ss_footer .webix_hcolumn,\\n.webix_ss_footer .webix_hs_left,\\n.webix_ss_footer .webix_hs_center,\\n.webix_ss_footer .webix_hs_right,\\n.webix_ss_footer div.webix_ss_vscroll_footer {\\n background: #fafafa;\\n}\\n.webix_hcell.webix_measure_size {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n/*content in header and footer*/\\n.webix_hcell {\\n padding: 0px 12px 0px 12px;\\n text-align: left;\\n}\\n/*borders in header and footer*/\\n.webix_ss_header .webix_hcolumn .webix_hcell,\\n.webix_ss_header .webix_span {\\n border-right: 1px solid #DADEE0;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_ss_footer .webix_hcolumn .webix_hcell,\\n.webix_ss_footer .webix_span {\\n border-right: 1px solid #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n}\\n/*remove rightmost borders*/\\n.webix_hs_right .webix_hcell.webix_last,\\n.webix_hs_center .webix_hcell.webix_last {\\n border-right-width: 0px;\\n}\\n/*right inner border*/\\n.webix_column.webix_last > div {\\n border-right-width: 0px;\\n}\\n/*borders between split areas*/\\n.webix_ss_right .webix_column.webix_first > div,\\n.webix_hs_right .webix_first {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_ss_left .webix_column.webix_last > div {\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_last_topcell.webix_cell {\\n border-bottom: 1px solid #DADEE0;\\n}\\n/*normal data cell of the table*/\\n.webix_column > div,\\n.webix_table_cell {\\n border-right: 1px solid #EDEFF0;\\n padding: 0 12px;\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_column,\\n.webix_hcolumn {\\n text-align: left;\\n}\\n/*header selection in column mode, column dnd*/\\n.webix_ss_header .webix_sel_hcell,\\n.webix_ss_footer .webix_sel_hcell,\\n.webix_ss_header .webix_dd_over_column {\\n background-color: #c9eaf5;\\n}\\n.webix_block_selection {\\n z-index: 2;\\n background: rgba(0, 0, 0, 0.1);\\n border: 2px solid #EDEFF0;\\n}\\n.webix_dd_drag {\\n white-space: nowrap;\\n overflow: hidden;\\n border-left: 1px solid #EDEFF0;\\n height: 36px;\\n}\\n.webix_dd_drag > div {\\n display: inline-block;\\n vertical-align: top;\\n background: #FFFFFF;\\n border-top: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n border-bottom: 1px solid #EDEFF0;\\n padding: 5px 12px;\\n height: 36px;\\n line-height: 28px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_dd_drag_column {\\n padding: 5px 10px 5px 10px;\\n}\\n.webix_column > .webix_drag_over.webix_cell {\\n background-color: #e6e6e6;\\n color: #475466;\\n}\\n.webix_column > .webix_drag_over.webix_cell.webix_row_select,\\n.webix_column > .webix_drag_over.webix_cell.webix_cell_select {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_column > .webix_drag_over.webix_cell.webix_row_select:focus,\\n.webix_column > .webix_drag_over.webix_cell.webix_cell_select:focus {\\n background: #edeff5;\\n}\\n.webix_cell.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_invalid_cell {\\n position: relative;\\n}\\n.webix_invalid_cell:after {\\n content: \\\"\\\";\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n width: 0px;\\n height: 1px;\\n border-top: 8px solid #f44;\\n border-left: 8px solid transparent;\\n}\\n/*selection*/\\n.webix_column > div.webix_cell_select,\\n.webix_column > div.webix_column_select,\\n.webix_column > div.webix_row_select {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_column > div.webix_cell_select:focus,\\n.webix_column > div.webix_column_select:focus,\\n.webix_column > div.webix_row_select:focus {\\n background: #edeff5;\\n}\\n/*extra borders, for selection in cell mode*/\\n.webix_column > div.webix_cell_select {\\n border-bottom: 1px solid #EDEFF0;\\n border-left: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n padding-top: 0px;\\n padding-left: 11px;\\n}\\n.webix_ss_right .webix_column.webix_first > div.webix_cell_select {\\n padding-left: 12px;\\n}\\n/*extra borders, for selection in row mode*/\\n.webix_column > div.webix_row_select {\\n border-bottom: 1px solid #EDEFF0;\\n padding-top: 0px;\\n}\\n/*extra borders for selection in column mode*/\\n.webix_column > div.webix_column_select {\\n border-left: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n padding-left: 11px;\\n}\\n.webix_cell.webix_dtable_colrow,\\n.webix_cell.webix_dtable_subrow,\\n.webix_dtable_subview {\\n position: absolute;\\n left: 0px;\\n top: 0px;\\n background-color: #FFFFFF;\\n width: 100%;\\n padding-right: 30px;\\n padding-left: 12px;\\n padding-top: 1px;\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_cell.webix_dtable_colrow.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_cell.webix_dtable_colrow.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_dtable_subrow {\\n border-top: 1px solid #EDEFF0;\\n text-align: right;\\n}\\n.webix_dtable_subview {\\n background: #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n padding: 0px 0px 0px 0px;\\n padding-left: 10px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.number .webix_cell {\\n text-align: right;\\n}\\n.webix_rotate {\\n transform: rotate(-90deg);\\n line-height: normal;\\n}\\n.webix_measure_rotate {\\n line-height: normal;\\n white-space: normal;\\n padding: 10px;\\n}\\n.webix_span_layer,\\n.webix_span_layer_top {\\n background: transparent;\\n position: absolute;\\n left: 0px;\\n top: 0px;\\n height: 0px;\\n width: 0px;\\n overflow: visible;\\n}\\n.webix_span_layer_top {\\n z-index: 1;\\n}\\n.webix_ss_right .webix_span_layer,\\n.webix_ss_right .webix_span_layer_top {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_dtable_span {\\n position: absolute;\\n background: #FFFFFF;\\n text-align: left;\\n}\\n.webix_dtable_span.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_dtable_span.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_hcell .webix_input_icon {\\n background-color: #DADEE0;\\n}\\n.webix_area_selection_layer {\\n position: absolute;\\n z-index: 2;\\n}\\n.webix_area_selection {\\n position: absolute;\\n background: #475466;\\n}\\n.webix_dtable_focused .webix_area_selection {\\n background-color: #3f4a5a;\\n}\\n.webix_area_selection_top,\\n.webix_area_selection_bottom {\\n height: 2px;\\n}\\n.webix_area_selection_left,\\n.webix_area_selection_right {\\n width: 2px;\\n}\\n.webix_area_selection_handle {\\n position: absolute;\\n width: 6px;\\n height: 6px;\\n border: 1px solid #fff;\\n background: #475466;\\n cursor: crosshair;\\n margin: -6px 0 0 -6px;\\n}\\n.webix_topcell {\\n position: relative;\\n background: #FFFFFF;\\n z-index: 1;\\n}\\n.webix_dtable .webix_resize_handle_x .webix_handle_content,\\n.webix_dtable .webix_resize_handle_y .webix_handle_content {\\n border: none;\\n background-color: #1CA1C1;\\n}\\n.webix_dtable_focused .webix_column > div.webix_row_select,\\n.webix_dtable_focused .webix_column > div.webix_column_select {\\n background: #edeff5;\\n}\\n.webix_window {\\n position: absolute;\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_window:focus {\\n box-shadow: 0 1px 14px 0 rgba(0, 0, 0, 0.12), 0 4px 10px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_win_body {\\n overflow: hidden;\\n}\\n.webix_window,\\n.webix_win_content,\\n.webix_win_body,\\n.webix_win_body > .webix_view {\\n border-radius: 0px;\\n}\\n.webix_win_body > .webix_view .webix_cal_month {\\n border-radius: 0px;\\n}\\n.webix_win_head {\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_win_title {\\n text-align: center;\\n}\\n/*----------------------------*/\\n/* DO NOT CHANGE STYLES BELOW */\\n/*----------------------------*/\\n.webix_win_content {\\n height: auto;\\n width: auto;\\n overflow: hidden;\\n}\\n.webix_modal {\\n width: 100%;\\n height: 100%;\\n position: fixed;\\n top: 0;\\n left: 0;\\n background-color: black;\\n opacity: 0.2;\\n}\\n.webix_modalbox_inside {\\n pointer-events: none;\\n}\\n.webix_point_top,\\n.webix_point_right,\\n.webix_point_bottom,\\n.webix_point_left {\\n position: absolute;\\n}\\n.webix_point_top,\\n.webix_point_bottom {\\n width: 13px;\\n height: 7px;\\n}\\n.webix_point_left,\\n.webix_point_right {\\n width: 7px;\\n height: 13px;\\n}\\n.webix_point_top,\\n.webix_point_bottom,\\n.webix_point_right,\\n.webix_point_left {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAArCAIAAADHSy4DAAAABnRSTlMAAAAAAABupgeRAAAACXBIWXMAAABPAAAATwFjiv3XAAAAhElEQVR4nMXVQQoAIQhAUe9/FC/pLAYayUm/EeT6YWGmoqpWharKG7n+XK5nt9L/LurMeV27oZHrReN0M6Oupr5S1GU0vhN1J7L27hp1QYXX1WtE5UxnNXI0ep7+pEGRpr95ooWObbXUm1npXWkFaF3vTqj9c+h8pVOb7gK6Yeje4tvwARi4FgcAh2V/AAAAAElFTkSuQmCC\\\");\\n}\\n.webix_point_top {\\n background-position: 0 -36px;\\n}\\n.webix_point_bottom {\\n background-position: 0 0;\\n}\\n.webix_point_right {\\n background-position: 0 -22px;\\n}\\n.webix_point_left {\\n background-position: 0 -9px;\\n}\\n.webix_resize_handle {\\n position: absolute;\\n z-index: 2;\\n width: 15px;\\n height: 15px;\\n bottom: 0px;\\n line-height: 15px;\\n right: -1px;\\n text-align: center;\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);\\n cursor: nw-resize;\\n}\\n.webix_resize_frame {\\n position: absolute;\\n opacity: 0.1;\\n background: #1CA1C1;\\n display: block;\\n border: 1px solid #0f5768;\\n box-shadow: 1px 3px 6px #000;\\n}\\n.webix_resize_cursor {\\n cursor: nw-resize;\\n}\\n.webix_shadow_medium,\\n.webix_shadow_small,\\n.webix_shadow_big {\\n position: relative;\\n}\\n.webix_shadow_medium {\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_shadow_small {\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_shadow_big {\\n box-shadow: 0 1px 14px 0 rgba(0, 0, 0, 0.12), 0 4px 10px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_shadow_none {\\n box-shadow: none !important;\\n}\\n.webix_toolbar.webix_shadow_small,\\n.webix_toolbar.webix_shadow_medium,\\n.webix_toolbar.webix_shadow_big {\\n z-index: 1;\\n}\\n/*basis*/\\n.webix_tree .webix_scroll_cont > .webix_tree_leaves {\\n display: inline-block;\\n padding: 8px;\\n}\\n.webix_tree_item {\\n clear: both;\\n height: 24px;\\n line-height: 24px;\\n white-space: nowrap;\\n}\\n.webix_tree_item.webix_selected {\\n background: transparent;\\n}\\n.webix_tree_item.webix_selected span {\\n padding: 4px 10px 4px 4px;\\n margin-left: -4px;\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_tree_item.webix_selected span:focus {\\n background: #edeff5;\\n}\\n.webix_tree_item.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_tree_checkbox {\\n margin: 0px;\\n padding: 0px;\\n vertical-align: top;\\n height: 100%;\\n width: 13px;\\n}\\n.webix_indeterminate {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAZUlEQVR4nGPw8Mhldw9ObXAPTp1JBG4AqWcAawhNs2QgArgFp1q5haTVgzTNZCABuIekzSJdU3DqTOpoqq+vZ3IPSfsPwyD+INJECNBREzSeGkAxTYwG16B0a3CKICXtgTSA0h4ApZxpTQmN4jEAAAAASUVORK5CYII=\\\");\\n background-repeat: no-repeat;\\n background-position: left center;\\n height: 100%;\\n width: 13px;\\n margin-top: 0 !important;\\n display: inline-block;\\n}\\n.webix_measure_size {\\n font-family: Roboto, sans-serif;\\n}\\n.webix_measure_size input,\\n.webix_measure_size textarea,\\n.webix_measure_size select {\\n width: 5px;\\n}\\n.webix_measure_size div {\\n float: none;\\n}\\n.webix_measure_size div,\\n.webix_measure_size a {\\n display: inline-block !important;\\n position: static !important;\\n}\\n.webix_tree_close,\\n.webix_tree_open,\\n.webix_tree_none,\\n.webix_tree_folder,\\n.webix_tree_file,\\n.webix_tree_folder_open {\\n display: inline-block;\\n vertical-align: top;\\n width: 20px;\\n height: 100%;\\n cursor: pointer;\\n margin: 0;\\n background-repeat: no-repeat;\\n}\\n.webix_tree_close,\\n.webix_tree_open,\\n.webix_tree_none {\\n background-position: center center;\\n}\\n.webix_cell .webix_tree_close,\\n.webix_cell .webix_tree_open,\\n.webix_cell .webix_tree_none {\\n background-color: transparent;\\n}\\n.webix_tree_folder,\\n.webix_tree_file,\\n.webix_tree_folder_open {\\n background-position: 0 center ;\\n}\\n.webix_tree_file,\\n.webix_tree_folder,\\n.webix_tree_folder_open {\\n margin: 0px 2px;\\n}\\n.webix_tree_leaves .webix_tree_leaves {\\n display: block;\\n margin-left: 20px;\\n}\\n.webix_line_tree .webix_tree_leaves {\\n margin-left: 0px;\\n}\\n.webix_tree_file {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAInjI+JwM26XAtPyTnTfU5veGyXJ2ZhaRpoSq0AicKlLNJftNojyCMFADs=\\\");\\n}\\n.webix_tree_folder {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAIhjI+py90AI3Syvoqj27mfnn2gZYxkYEpiCqypa27yTC8FADs=\\\");\\n}\\n.webix_tree_folder_open {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAIjjI+py90AI3SyvorjkQ7pDAJBSJaTaGpjKq7pxsJmR9c2UwAAOw==\\\");\\n}\\n.webix_tree_img {\\n background-color: #FFFFFF;\\n float: left;\\n width: 24px;\\n height: 24px;\\n background-position: 0 0;\\n}\\n.webix_tree_line1 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIxjI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKrKg68GbjNGVTeGZmeiRP+IphBbi0EgrAAA7\\\");\\n}\\n.webix_tree_line2 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIpjI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKgLuC7/mTNf2jef6zvc+XgAAOw==\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_tree_line3 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAI1jI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKgLuC78VC9KeveGYPpsJTwFmfCeixahABoQRXQEAOw==\\\");\\n}\\n.webix_tree_line4 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIjjI+py+0Po5y02ouz3rxDAIZi+HGAiW6nmmqr22avHGMzUwAAOw==\\\");\\n}\\n.webix_cal_month {\\n height: 24px;\\n line-height: 24px;\\n text-align: center;\\n position: relative;\\n font-size: 14px;\\n font-weight: bold;\\n padding: 0 0 6px;\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n}\\n.webix_cal_prev_button,\\n.webix_cal_next_button {\\n cursor: pointer;\\n position: absolute;\\n top: 0;\\n width: 24px;\\n height: 24px;\\n background-repeat: no-repeat;\\n background-position: 8px 6px;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_cal_prev_button {\\n left: 0;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAASUlEQVR42p2QMQoAQQgD79EZ0Mqn5xCu2cPdYgUbJ0rMMxXgLeiuKq8gsJAz8weQ0QiwJEfECnr4wdlEnwJ68+yyhReC+c85oRecj0Um+pmo9wAAAABJRU5ErkJggg==\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_cal_next_button {\\n right: 0;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAARElEQVR42qXPsQoAIAhF0T76PdDJT7cUmtQhcmk4N8QVQ9JXN2bmgWOgqp+BiCRG2AYAMoi3/LxYdyagAnhA6G93TrABZaJFJjrFY8IAAAAASUVORK5CYII=\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_view > .webix_cal_header {\\n height: 24px;\\n}\\n.webix_view > .webix_cal_header div {\\n float: left;\\n text-align: center;\\n height: 19px;\\n font-size: 11px;\\n color: #475466;\\n border-bottom: #DADEE0 1px solid;\\n}\\n.webix_cal_body .webix_cal_row > div {\\n float: left;\\n text-align: center;\\n height: 100%;\\n}\\n.webix_cal_body .webix_selected,\\n.webix_cal_body .webix_cal_select,\\n.webix_cal_body .webix_cal_select.webix_cal_today {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_cal_day,\\n.webix_cal_week_num {\\n cursor: pointer;\\n font-size: 12px;\\n color: #475466;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_cal_week_num {\\n color: #a2adbe;\\n cursor: default;\\n margin-right: 0px;\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_cal_event {\\n font-weight: bold;\\n color: #C66200;\\n}\\n.webix_cal_outside {\\n color: #b1bbc8;\\n}\\n.webix_cal_inactive {\\n background: #888;\\n}\\n.webix_cal_inactive {\\n background: #888;\\n}\\n.webix_cal_day_disabled,\\n.webix_cal_day_disabled.webix_cal_event {\\n color: #b1bbc8;\\n background: #f0f0f0;\\n}\\n.webix_cal_day_disabled.webix_cal_day,\\n.webix_cal_day_disabled.webix_cal_block {\\n cursor: not-allowed;\\n}\\n.webix_hours .webix_cal_day_disabled,\\n.webix_minutes .webix_cal_day_disabled,\\n.webix_hours .webix_cal_day_disabled.webix_cal_event,\\n.webix_minutes .webix_cal_day_disabled.webix_cal_event {\\n background: #FFFFFF;\\n font-weight: normal;\\n text-decoration: line-through;\\n}\\n.webix_cal_month_name {\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_cal_block {\\n float: left;\\n text-align: center;\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_selected {\\n background: #F4F5F9;\\n color: #475466;\\n}\\n.webix_cal_footer {\\n text-align: center;\\n font-size: 12px;\\n color: #444;\\n height: 24px;\\n padding: 6px 0 0;\\n cursor: pointer;\\n}\\n.webix_cal_icons {\\n float: right;\\n height: 20px;\\n line-height: 20px;\\n padding: 4px 4px 0;\\n}\\n.webix_cal_time {\\n height: 20px;\\n line-height: 20px;\\n padding: 4px 4px 0;\\n}\\n.webix_cal_time_icons {\\n float: left;\\n}\\n.webix_cal_icons .webix_cal_icon {\\n text-align: center;\\n padding: 0 4px;\\n}\\n.webix_cal_icon:hover,\\n.webix_cal_time:hover,\\n.webix_cal_month_name:hover {\\n text-decoration: underline;\\n color: #1CA1C1;\\n}\\n.webix_cal_icon:focus,\\n.webix_cal_time:focus,\\n.webix_cal_month_name:focus {\\n color: #1CA1C1;\\n}\\n.webix_cal_month_name.webix_readonly {\\n cursor: default;\\n}\\n.webix_cal_month_name.webix_readonly:hover,\\n.webix_cal_month_name.webix_readonly:focus {\\n text-decoration: none;\\n color: inherit;\\n}\\n.webix_time_header {\\n padding: 0 0 6px;\\n}\\n.webix_time_header .webix_cal_hours,\\n.webix_time_header .webix_cal_minutes {\\n display: inline-block;\\n font-size: 14px;\\n text-align: center;\\n height: 24px;\\n line-height: 24px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_time_header .webix_cal_minutes {\\n padding-left: 1px;\\n border-left: none;\\n}\\n.webix_time_header .webix_cal_hours {\\n border-right: none !important;\\n}\\n.webix_cal_body .webix_hours {\\n float: left;\\n border-right: 1px solid #DADEE0;\\n padding-right: 1px;\\n}\\n.webix_cal_body .webix_minutes {\\n float: left;\\n padding-left: 1px;\\n}\\n.webix_cal_block_empty {\\n float: left;\\n text-align: center;\\n}\\n.webix_time_footer {\\n text-align: center;\\n font-size: 12px;\\n height: 24px;\\n padding: 6px 0 0;\\n cursor: pointer;\\n}\\n.webix_cal_done {\\n height: 24px;\\n padding: 2px 8px;\\n font-size: 12px;\\n border-radius: 2px;\\n border: 1px solid #DADEE0;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n outline: none;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n float: right;\\n}\\n.webix_cal_done:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_cal_done:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_cal_done:active {\\n background-color: #daddeb;\\n}\\n.webix_cal_blurred_hours {\\n background-color: #f7f7f7;\\n}\\n.webix_property_line {\\n width: 100%;\\n height: auto;\\n line-height: 0;\\n}\\n.webix_property_line.webix_focused > div,\\n.webix_property_line:focus > div {\\n background-color: #f7f8fb;\\n}\\n.webix_property_label,\\n.webix_property_value {\\n display: inline-block;\\n padding-left: 12px;\\n border-bottom: 1px solid #EDEFF0;\\n overflow: hidden;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_property_label {\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_property_label_line {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n line-height: 42px;\\n padding-left: 12px;\\n border-bottom: 1px solid #EDEFF0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_property_label_line .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_property_label_line.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_property_label_line.webix_dark .webix_el_button,\\n.webix_property_label_line.webix_dark .webix_el_label .webix_el_box,\\n.webix_property_label_line.webix_dark .webix_inp_label,\\n.webix_property_label_line.webix_dark .webix_inp_top_label,\\n.webix_property_label_line.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_secondary .webix_icon,\\n.webix_property_label_line.webix_dark .webix_transparent .webix_icon,\\n.webix_property_label_line.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_property_label_line.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_property_label_line.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_property_label_line.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_transparent button:hover,\\n.webix_property_label_line.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_property_label_line.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev,\\n.webix_property_label_line.webix_dark .webix_segment_0,\\n.webix_property_label_line.webix_dark .webix_segment_1,\\n.webix_property_label_line.webix_dark .webix_segment_N,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button:hover,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next:hover,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev:hover,\\n.webix_property_label_line.webix_dark .webix_segment_0:hover,\\n.webix_property_label_line.webix_dark .webix_segment_1:hover,\\n.webix_property_label_line.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button:focus,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next:focus,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev:focus,\\n.webix_property_label_line.webix_dark .webix_segment_0:focus,\\n.webix_property_label_line.webix_dark .webix_segment_1:focus,\\n.webix_property_label_line.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button:active,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next:active,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev:active,\\n.webix_property_label_line.webix_dark .webix_segment_0:active,\\n.webix_property_label_line.webix_dark .webix_segment_1:active,\\n.webix_property_label_line.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_inp_static,\\n.webix_property_label_line.webix_dark input[type=text],\\n.webix_property_label_line.webix_dark input[type=combo],\\n.webix_property_label_line.webix_dark input[type=datepicker],\\n.webix_property_label_line.webix_dark textarea,\\n.webix_property_label_line.webix_dark select,\\n.webix_property_label_line.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_property_label_line.webix_dark .webix_el_texthighlight input,\\n.webix_property_label_line.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_property_label_line.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_property_label_line.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_multicombo_value,\\n.webix_property_label_line.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_property_label_line.webix_dark .webix_inp_static:focus,\\n.webix_property_label_line.webix_dark input[type=text]:focus,\\n.webix_property_label_line.webix_dark input[type=combo]:focus,\\n.webix_property_label_line.webix_dark input[type=datepicker]:focus,\\n.webix_property_label_line.webix_dark textarea:focus,\\n.webix_property_label_line.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_property_label_line.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_property_label_line.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_property_label_line.webix_dark .webix_el_icon,\\n.webix_property_label_line.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_property_label_line.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_property_label_line.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_property_label_line.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_property_label_line.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_property_label_line.webix_dark .webix_custom_checkbox,\\n.webix_property_label_line.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_custom_checkbox:focus,\\n.webix_property_label_line.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_property_label_line.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_property_label_line.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_property_label_line.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_property_label_line.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_property_label_line.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box input,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box select,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_property_label_line.webix_dark input.webix_invalid,\\n.webix_property_label_line.webix_dark select.webix_invalid,\\n.webix_property_label_line.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_property_label_line.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_property_label_line.webix_dark {\\n color: #FFFFFF;\\n}\\n.webix_property_col_ind {\\n float: right;\\n cursor: pointer;\\n margin: 0 8px 0 0;\\n border: 1px solid #DADEE0;\\n background: #ffffff;\\n border-radius: 3px;\\n width: 16px;\\n height: 16px;\\n}\\n.webix_property_value {\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.webix_property_check {\\n margin: 0;\\n vertical-align: middle;\\n}\\n/*style used by tooltip's container*/\\n.webix_tooltip {\\n display: none;\\n position: absolute;\\n z-index: 10000;\\n background-color: #FFFFFF;\\n padding: 5px 10px;\\n border: 1px solid #DADEE0;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n border-radius: 0px;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n.webix_global_tooltip {\\n pointer-events: none;\\n}\\n/*comments list*/\\n.webix_comments .webix_list .webix_list_item {\\n margin-top: 24px;\\n border: none;\\n cursor: default;\\n}\\n.webix_comments .webix_list .webix_comments_more_item {\\n margin-top: 12px;\\n}\\n/* comments list templates */\\n.webix_comments_name {\\n margin-left: 16px;\\n font-weight: 500;\\n color: rgba(0, 0, 0, 0.7);\\n}\\n.webix_comments_menu.webix_icon {\\n line-height: 30px;\\n width: 6px;\\n visibility: hidden;\\n float: right;\\n cursor: pointer;\\n color: #94A1B3;\\n margin: 0 4px 0 0;\\n}\\n.webix_comments_current:hover .webix_comments_menu,\\n.webix_comments_current.active_menu .webix_comments_menu {\\n visibility: visible;\\n}\\n.webix_comments_message {\\n white-space: pre-wrap;\\n line-height: 20px;\\n margin-left: 70px;\\n margin-right: 10px;\\n}\\n.webix_comments_message a {\\n color: #1CA1C1;\\n text-decoration: none;\\n word-break: break-all;\\n}\\n.webix_comments_message a:hover {\\n text-decoration: underline;\\n}\\n.webix_comments_message a:visited {\\n color: #7e57c2;\\n}\\n.webix_comments_message .webix_comments_mention {\\n font-weight: 500;\\n white-space: nowrap;\\n}\\n.webix_comments_mention {\\n color: #1CA1C1;\\n}\\n.webix_comments_avatar {\\n margin-left: 14px;\\n float: left;\\n position: relative;\\n width: 40px;\\n height: 40px;\\n}\\n.webix_comments_status {\\n z-index: 1;\\n top: 30px;\\n left: 30px;\\n border-radius: 50%;\\n border: 2px solid #FFFFFF;\\n position: absolute;\\n height: 12px;\\n width: 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_comments_status.active {\\n background-color: #55CD97;\\n}\\n.webix_comments_status.busy {\\n background-color: #FF5C4C;\\n}\\n.webix_comments_status.away {\\n background-color: #FDBF4C;\\n}\\n.webix_comments_status.none {\\n background-color: #d0d5dd;\\n}\\n.webix_comments_avatar_image {\\n width: 100%;\\n height: 100%;\\n overflow: hidden;\\n border-radius: 50%;\\n float: left;\\n position: relative;\\n}\\n.webix_comments_photo {\\n width: auto;\\n height: 100%;\\n margin: 0 auto;\\n}\\n.webix_comments_avatar_text {\\n font-size: 16px;\\n color: #1CA1C1;\\n line-height: 40px;\\n text-align: center;\\n background-color: #DFE2E6;\\n}\\n.webix_comments_avatar_text .webix_icon {\\n margin: 0;\\n}\\n.webix_comments_date {\\n float: right;\\n color: #94A1B3;\\n font-size: 12px;\\n}\\n.webix_comments_image {\\n max-width: 100%;\\n max-height: 300px;\\n display: block;\\n}\\n/* buttons*/\\n.webix_comments_more {\\n font-weight: 500;\\n text-align: center;\\n cursor: pointer;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n border: none;\\n border-radius: 2px;\\n}\\n.webix_comments_more:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_comments_send .webix_el_box {\\n float: right !important;\\n}\\n.webix_message_area {\\n position: fixed;\\n right: 5px;\\n width: 250px;\\n z-index: 1000;\\n}\\n.webix_message {\\n min-width: 120px;\\n font-family: Roboto, sans-serif;\\n z-index: 10000;\\n overflow: hidden;\\n margin: 4px 4px 12px;\\n transition: all 0.5s ease;\\n}\\n.webix_message.hidden {\\n height: 0px;\\n min-height: 0px;\\n padding-top: 0px;\\n padding-bottom: 0px;\\n border-width: 0px;\\n margin-top: 0px;\\n margin-bottom: 0px;\\n box-shadow: none;\\n overflow: hidden;\\n}\\n.webix_modal_box {\\n pointer-events: auto;\\n overflow: hidden;\\n display: inline-block;\\n min-width: 250px;\\n width: 250px;\\n text-align: center;\\n position: fixed;\\n background-color: #FFFFFF;\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n font-family: Roboto, sans-serif;\\n z-index: 20000;\\n border-radius: 0px;\\n border: 1px solid #DADEE0;\\n outline: none;\\n}\\n.webix_modal_box .webix_popup_button {\\n margin-top: 8px;\\n}\\n.webix_message,\\n.webix_popup_button {\\n cursor: pointer;\\n}\\n.webix_popup_controls {\\n padding: 4px 12px 12px;\\n}\\n.webix_popup_button {\\n height: 30px;\\n line-height: 30px;\\n display: inline-block;\\n margin: 0 4px;\\n border-radius: 2px;\\n}\\n.webix_popup_button {\\n min-width: 100px;\\n}\\ndiv.webix_modal_cover {\\n background-color: #000;\\n cursor: default;\\n opacity: 0.1;\\n position: fixed;\\n z-index: 19999;\\n left: 0px;\\n top: 0px;\\n width: 100%;\\n height: 100%;\\n border: none;\\n zoom: 1;\\n}\\n.webix_message img,\\n.webix_modal_box img {\\n float: left;\\n margin-right: 8px;\\n}\\n/*Skin section*/\\n.webix_popup_button {\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n outline: none;\\n}\\n.webix_popup_button:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_popup_button:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_popup_button:active {\\n background-color: #daddeb;\\n}\\n.webix_popup_button.confirm {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_popup_button.confirm:hover {\\n background-color: #1992af;\\n}\\n.webix_popup_button.confirm:focus {\\n background-color: #1992af;\\n}\\n.webix_popup_button.confirm:active {\\n background-color: #17839d;\\n}\\n.webix_popup_input.webix_el_text {\\n outline: none;\\n overflow: hidden;\\n padding: 3px 2px;\\n}\\n.webix_popup_input.webix_el_text input {\\n width: 100%;\\n height: 30px;\\n font-size: 14px;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_popup_input.webix_el_text.webix_required::before {\\n position: absolute;\\n right: 18px;\\n padding-top: 1px;\\n content: \\\"*\\\";\\n color: #FF5C4C;\\n}\\n.webix_popup_input.webix_el_text.webix_popup_invalid input {\\n background-color: #ffedee;\\n border-color: #fea5a8;\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n}\\n.webix_popup_title {\\n color: #475466;\\n line-height: 20px;\\n padding: 20px 16px 12px 16px;\\n font-size: 16px;\\n font-weight: 500;\\n}\\n.webix_popup_title + div.webix_popup_text {\\n padding-top: 0;\\n box-shadow: none;\\n}\\n.webix_popup_text {\\n overflow: hidden;\\n padding: 24px 16px 0px 16px;\\n font-size: 14px;\\n color: #475466;\\n line-height: 20px;\\n}\\n.webix_popup_text.webix_popup_label {\\n text-align: left;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_alert .webix_popup_title,\\n.webix_confirm .webix_popup_title,\\n.webix_prompt .webix_popup_title,\\n.webix_alert .webix_popup_text,\\n.webix_confirm .webix_popup_text,\\n.webix_prompt .webix_popup_text {\\n box-shadow: inset 0 4px #1CA1C1;\\n}\\n.webix_alert-warning .webix_popup_title,\\n.webix_confirm-warning .webix_popup_title,\\n.webix_prompt-warning .webix_popup_title,\\n.webix_alert-warning .webix_popup_text,\\n.webix_confirm-warning .webix_popup_text,\\n.webix_prompt-warning .webix_popup_text {\\n box-shadow: inset 0 4px #FDBF4C;\\n}\\n.webix_alert-error .webix_popup_title,\\n.webix_confirm-error .webix_popup_title,\\n.webix_prompt-error .webix_popup_title,\\n.webix_alert-error .webix_popup_text,\\n.webix_confirm-error .webix_popup_text,\\n.webix_prompt-error .webix_popup_text {\\n box-shadow: inset 0 4px #FF5C4C;\\n}\\n.webix_message {\\n font-size: 14px;\\n color: #475466;\\n box-shadow: 0 1px 14px 0 rgba(0, 0, 0, 0.12), 0 4px 10px 0 rgba(0, 0, 0, 0.1);\\n line-height: 20px;\\n border-radius: 2px;\\n border: 1px solid #DADEE0;\\n background-color: #FFFFFF;\\n}\\n.webix_message.webix_debug {\\n color: #313131;\\n border-color: #fed282;\\n background-color: #fff2db;\\n}\\n.webix_message.webix_error {\\n color: #313131;\\n border-color: #ff8d82;\\n background-color: #ffdedb;\\n}\\n.webix_message.webix_success {\\n color: #313131;\\n border-color: #88dcb6;\\n background-color: #ddf5ea;\\n}\\n.webix_message div {\\n padding: 11px 12px;\\n}\\n.webix_color_row {\\n clear: both;\\n white-space: nowrap;\\n}\\n.webix_color_palette {\\n text-align: left;\\n padding: 4px;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_color_palette.webix_palette_classic {\\n padding: 0;\\n}\\n.webix_color_row,\\n.webix_color_row div {\\n line-height: 0;\\n font-size: 0;\\n}\\n.webix_color_row div {\\n display: inline-block;\\n position: relative;\\n}\\n.webix_color_row div > * {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_color_row .webix_color_selected > * {\\n border: 1px solid;\\n border-color: #FFFFFF;\\n border-radius: 2px;\\n box-shadow: rgba(28, 161, 193, 0.6) 0 0 0 2px;\\n}\\n.webix_color_row .webix_color_selected:focus > * {\\n box-shadow: #1CA1C1 0 0 0 2px;\\n}\\n.webix_palette_classic .webix_color_row .webix_color_selected > * {\\n border: 2px solid #f3f3f3;\\n border-radius: 0px;\\n box-shadow: none;\\n}\\n.webix_palette_classic .webix_color_row .webix_color_selected:focus > * {\\n box-shadow: inset 0 0 15px #fff;\\n}\\n.webix_palette_classic .webix_color_item {\\n width: 100%;\\n height: 100%;\\n cursor: pointer;\\n}\\n.webix_palette_material .webix_color_item {\\n display: inline-block;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border-radius: 2px;\\n cursor: pointer;\\n width: 100%;\\n height: 100%;\\n}\\n.webix_palette_material .webix_color_row > div {\\n margin: 0 4px 4px 0;\\n}\\n.webix_color_area {\\n width: 100%;\\n height: 100%;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_color_block {\\n position: relative;\\n border-radius: 2px;\\n margin: 12px 12px 14px;\\n}\\n.webix_color_block:before,\\n.webix_color_block:after {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n left: 0;\\n}\\n.webix_color_block:before {\\n background-image: linear-gradient(0deg, #000, hsla(0, 0%, 100%, 0));\\n z-index: 2;\\n}\\n.webix_color_block:after {\\n background-image: linear-gradient(90deg, #fff, hsla(20, 42%, 65%, 0));\\n z-index: 1;\\n}\\n.webix_color_line {\\n position: relative;\\n height: 8px;\\n margin: 0 12px;\\n border-radius: 8px;\\n background-image: linear-gradient(90deg, red, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red);\\n}\\n.webix_color_circle {\\n width: 8px;\\n height: 8px;\\n margin: -6px 0 0 -6px;\\n border: 2px solid #FFFFFF;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\\n border-radius: 50%;\\n position: absolute;\\n left: 0;\\n top: 0;\\n z-index: 3;\\n}\\n.webix_color_circle:focus,\\n.webix_color_area_active .webix_color_circle {\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 0 4px #FFFFFF;\\n}\\n.webix_color_line_circle {\\n width: 12px;\\n height: 12px;\\n margin: -4px 0 0 -8px;\\n border: 2px solid #FFFFFF;\\n border-radius: 50%;\\n position: absolute;\\n left: 0;\\n top: 0;\\n background: #12FF08;\\n}\\n.webix_color_line_circle:focus,\\n.webix_color_area_active .webix_color_line_circle {\\n box-shadow: inset 0 0 8px #FFFFFF;\\n}\\n.webix_color_area_active .webix_color_circle,\\n.webix_color_area_active .webix_color_line_circle {\\n pointer-events: none;\\n}\\n.webix_color_out_block,\\n.webix_color_out_text {\\n height: 32px;\\n float: left;\\n border: 1px solid #CCD7E6;\\n margin: 12px 0px 12px 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_color_out_text {\\n color: #475466;\\n font-size: 14px;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n padding: 0px 12px;\\n}\\n.webix_color_out_text:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_color_area .webix_button {\\n width: calc(100% - 12px*2);\\n height: 32px;\\n margin: 0px 0px 12px 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_daterange .webix_view {\\n background-color: #FFFFFF;\\n}\\n.webix_daterange .webix_range_0 .webix_cal_next_button,\\n.webix_daterange .webix_range_N .webix_cal_prev_button {\\n visibility: hidden;\\n}\\n.webix_daterange .webix_range_1 .webix_cal_next_button,\\n.webix_daterange .webix_range_1 .webix_cal_prev_button {\\n visibility: hidden;\\n}\\n.webix_daterange .webix_range_1 .webix_cal_next_button:hover,\\n.webix_daterange .webix_range_1 .webix_cal_prev_button:hover {\\n cursor: default;\\n}\\n.webix_daterange .webix_range_left .webix_cal_next_button:hover,\\n.webix_daterange .webix_range_right .webix_cal_prev_button:hover {\\n cursor: default;\\n}\\n.webix_cal_range {\\n background-color: #ffffff;\\n}\\n.webix_cal_range_start {\\n border-radius: 3px 0 0 3px;\\n}\\n.webix_cal_range_end {\\n border-radius: 0 3px 3px 0;\\n}\\n.webix_cal_range_start,\\n.webix_cal_range_end,\\n.webix_cal_event.webix_cal_range_start,\\n.webix_cal_event.webix_cal_range_end,\\n.webix_cal_body .webix_cal_today.webix_cal_range_start,\\n.webix_cal_body .webix_cal_today.webix_cal_range_end {\\n background-color: #F4F5F9;\\n color: #475466;\\n}\\n.webix_cal_outside.webix_cal_range,\\n.webix_cal_body .webix_cal_outside.webix_cal_range_start,\\n.webix_cal_body .webix_cal_outside.webix_cal_range_end,\\n.webix_cal_body .webix_cal_outside.webix_cal_today.webix_cal_range_start,\\n.webix_cal_body .webix_cal_outside.webix_cal_today.webix_cal_range_end {\\n background-color: transparent;\\n color: #b1bbc8;\\n}\\n.webix_daterange .webix_cal_icons {\\n text-align: right;\\n padding: 0 4px;\\n}\\n.webix_daterange .webix_cal_icons .webix_cal_icon {\\n border-top: 1px solid #DADEE0;\\n}\\n.webix_daterange .webix_cal_time {\\n display: none;\\n}\\n.webix_daterange .webix_cal_timepicker .webix_range_time_start {\\n display: block;\\n}\\n.webix_daterange .webix_range_timepicker .webix_cal_time {\\n display: block;\\n padding: 5px 15px;\\n}\\n.webix_daterange .webix_range_timepicker .webix_range_time_start {\\n float: left;\\n}\\n.webix_daterange .webix_range_timepicker .webix_range_time_end {\\n float: right;\\n}\\n.webix_daterange .webix_range_footer .webix_cal_footer {\\n padding: 0;\\n}\\n.webix_timeboard .webix_slider_title {\\n text-align: left;\\n margin-left: 10px;\\n}\\n.webix_timeboard .webix_colon_template .webix_template {\\n padding: 0;\\n text-align: center;\\n line-height: 100%;\\n font-size: 30px;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_timeboard .webix_day_part .webix_el_box {\\n padding-left: 6px;\\n color: #1CA1C1;\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_timeboard .webix_day_part .webix_el_box:hover,\\n.webix_timeboard .webix_day_part .webix_el_box:focus {\\n color: #17839d;\\n}\\n.webix_drag_zone {\\n position: absolute;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n background-color: #FFFFFF;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n pointer-events: none;\\n}\\n.webix_drag_zone .webix_tree_item {\\n padding: 0 8px;\\n}\\n.webix_drag_zone .webix_tree_item .webix_tree_open,\\n.webix_drag_zone .webix_tree_item .webix_tree_close,\\n.webix_drag_zone .webix_tree_item .webix_tree_none {\\n display: none;\\n}\\n.webix_drag_zone .webix_ss_hscroll,\\n.webix_drag_zone .webix_ss_vscroll {\\n display: none !important;\\n}\\n.webix_drag_over,\\n.webix_drop_zone {\\n background-color: #e6e6e6;\\n}\\n.webix_drag_main {\\n position: relative;\\n background-color: #FFFFFF;\\n}\\n.webix_drag_main .webix_tree_item,\\n.webix_drag_main .webix_list_item,\\n.webix_drag_main .webix_dataview_item {\\n border: 1px solid #EDEFF0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_drag_multiple,\\n.webix_drag_multiple_last {\\n height: 100%;\\n width: 100%;\\n position: absolute;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border: 1px solid #EDEFF0;\\n background-color: #FFFFFF;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_drag_multiple {\\n bottom: 8px;\\n left: 8px;\\n}\\n.webix_drag_multiple_last {\\n bottom: 16px;\\n left: 16px;\\n}\\n.webix_drag_zone > .webix_badge {\\n top: -14px;\\n right: -14px;\\n}\\n.webix_invisible {\\n display: none !important;\\n}\\n.webix_drop_area,\\n.webix_drop_area_inner {\\n height: 36px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background-color: #f1f2f7;\\n}\\n.webix_list-x .webix_drop_area {\\n display: inline-block;\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_tree .webix_drop_area {\\n height: 24px;\\n}\\n.webix_list .webix_drop_area {\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_dataview .webix_drop_area {\\n float: left;\\n background-color: transparent;\\n}\\n.webix_dataview .webix_drop_area_inner {\\n border-right: 1px solid #EDEFF0;\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_vscroll_x {\\n height: 0px;\\n width: 100%;\\n overflow-y: hidden;\\n overflow-x: scroll;\\n}\\n.webix_vscroll_y {\\n width: 0px;\\n height: 100%;\\n overflow-x: hidden;\\n overflow-y: scroll;\\n}\\n.webix_vscroll_body {\\n width: 16px;\\n height: 16px;\\n}\\n.webix_scroll_x {\\n width: 50px;\\n height: 4px !important;\\n left: 1px;\\n bottom: 3px;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n position: absolute;\\n border-radius: 4px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_scroll_y {\\n width: 4px !important;\\n height: 50px;\\n top: 1px;\\n right: 3px;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n position: absolute;\\n border-radius: 4px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_custom_scroll {\\n -ms-overflow-style: none;\\n /* IE, Edge */\\n scrollbar-width: none;\\n /* Firefox */\\n}\\n.webix_custom_scroll::-webkit-scrollbar {\\n display: none;\\n /* Chrome, Edge(chromium), Opera, Safari, all browsers on iOS */\\n}\\n.webix_c_scroll_y {\\n position: absolute;\\n z-index: 3;\\n width: 10px;\\n right: 0px;\\n}\\n.webix_c_scroll_y > div {\\n transition: width 0.3s 0.2s, margin 0.3s 0.2s;\\n width: 4px;\\n height: 100%;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n border-radius: 4px;\\n margin: 0px 3px;\\n}\\n.webix_c_scroll_y:hover > div,\\n.webix_c_scroll_y.webix_scroll_active div {\\n width: 10px;\\n margin: 0px;\\n}\\n.webix_c_scroll_x {\\n position: absolute;\\n z-index: 3;\\n height: 10px;\\n bottom: 0px;\\n}\\n.webix_c_scroll_x > div {\\n transition: height 0.3s 0.2s, margin 0.3s 0.2s;\\n height: 4px;\\n width: 100%;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n border-radius: 4px;\\n margin: 3px 0px;\\n}\\n.webix_c_scroll_x:hover > div,\\n.webix_c_scroll_x.webix_scroll_active div {\\n height: 10px;\\n margin: 0px;\\n}\\n.webix_c_scroll_bar_y,\\n.webix_c_scroll_bar_x {\\n position: absolute;\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.webix_c_scroll_bar_y {\\n height: 100%;\\n width: 10px;\\n right: 0px;\\n}\\n.webix_c_scroll_bar_x {\\n width: 100%;\\n height: 10px;\\n bottom: 0px;\\n}\\n.webix_scroll_cont {\\n width: 100%;\\n height: auto;\\n clear: both;\\n position: relative;\\n}\\n.webix_secondary .webix_button {\\n background: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_secondary .webix_button:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_secondary .webix_button:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_secondary .webix_button:active {\\n background-color: #daddeb;\\n}\\n.webix_secondary .webix_button .webix_icon,\\n.webix_secondary .webix_button .webix_img_btn_text,\\n.webix_secondary .webix_button .webix_icon_btn {\\n color: #1CA1C1;\\n}\\n.webix_secondary .webix_pressed .webix_button {\\n background-color: #daddeb;\\n}\\n.webix_primary .webix_button {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_primary .webix_button:hover {\\n background-color: #1992af;\\n}\\n.webix_primary .webix_button:focus {\\n background-color: #1992af;\\n}\\n.webix_primary .webix_button:active {\\n background-color: #17839d;\\n}\\n.webix_primary .webix_button .webix_icon,\\n.webix_primary .webix_button .webix_img_btn_text,\\n.webix_primary .webix_button .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_primary .webix_pressed .webix_button {\\n background-color: #17839d;\\n}\\n.webix_danger .webix_button {\\n background: #FF5C4C;\\n color: #ffffff;\\n}\\n.webix_danger .webix_button:hover {\\n background-color: #ff4938;\\n}\\n.webix_danger .webix_button:focus {\\n background-color: #ff4938;\\n}\\n.webix_danger .webix_button:active {\\n background-color: #ff3723;\\n}\\n.webix_danger .webix_button .webix_icon,\\n.webix_danger .webix_button .webix_img_btn_text,\\n.webix_danger .webix_button .webix_icon_btn {\\n color: #ffffff;\\n}\\n.webix_danger .webix_pressed .webix_button {\\n background-color: #ff3723;\\n}\\n.webix_transparent .webix_button {\\n color: #475466;\\n background: transparent;\\n border: none;\\n}\\n.webix_transparent .webix_button .webix_img_btn_text {\\n color: #475466;\\n}\\n.webix_transparent .webix_button .webix_icon,\\n.webix_transparent .webix_button .webix_icon_btn {\\n color: #94A1B3;\\n}\\n.webix_transparent .webix_button:hover {\\n background-color: rgba(0, 0, 0, 0.04);\\n}\\n.webix_transparent .webix_button:focus {\\n background-color: rgba(0, 0, 0, 0.04);\\n}\\n.webix_transparent .webix_button:active {\\n background-color: rgba(0, 0, 0, 0.05);\\n}\\n.webix_transparent .webix_pressed .webix_button {\\n background-color: rgba(0, 0, 0, 0.05);\\n}\\n.webix_button,\\n.webixbutton {\\n border-radius: 2px;\\n height: 100%;\\n width: 100%;\\n cursor: pointer;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n -webkit-appearance: none;\\n padding: 0 6px;\\n}\\n.webix_el_button .webix_el_box,\\n.webix_el_toggle .webix_el_box {\\n position: relative;\\n}\\n.webix_img_btn,\\n.webix_img_btn_top {\\n vertical-align: top;\\n border: none;\\n width: 100%;\\n padding: 0;\\n}\\n.webix_img_btn .webix_icon {\\n color: #1CA1C1;\\n margin-right: 4px;\\n}\\n.webix_img_btn_top .webix_icon,\\n.webix_img_btn_top .webix_image {\\n font-size: 20px;\\n position: absolute;\\n top: 8px;\\n display: inline-block;\\n left: 50%;\\n transform: translateX(-50%);\\n}\\n.webix_img_btn .webix_image {\\n display: inline-block;\\n margin-right: 4px;\\n vertical-align: middle;\\n}\\n.webix_img_btn_text {\\n position: absolute;\\n left: 0;\\n bottom: 4px;\\n width: 100%;\\n text-align: center;\\n cursor: pointer;\\n color: #1CA1C1;\\n}\\n.webix_pressed .webix_button {\\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_button {\\n color: #94A1B3;\\n background: #f4f5f9;\\n border-color: #f4f5f9;\\n text-shadow: none;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: #94A1B3;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_image {\\n opacity: 0.4;\\n}\\n.webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_disabled_view.webix_control .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: #94A1B3;\\n}\\n.webixbutton {\\n width: auto;\\n height: auto;\\n padding: 8px 15px;\\n}\\n.webix_richtext_editor {\\n height: 100%;\\n}\\n.webix_template .webix_richtext_editor:focus {\\n outline: none;\\n}\\n.webix_richtext_container .webix_template {\\n padding: 10px;\\n overflow-x: auto;\\n border: solid #DADEE0;\\n border-width: 0px 1px 1px;\\n border-radius: 0px 0px 6px 6px;\\n}\\n.webix_richtext_inp_label .webix_template {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n color: #475466;\\n text-transform: none;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n float: left;\\n padding-top: 1px;\\n padding-left: 0;\\n padding-right: 9px;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n padding-right: 8px;\\n margin-bottom: 0px;\\n padding-top: 10px;\\n float: none;\\n}\\n.webix_richtext .wxi-underline,\\n.webix_richtext .wxi-italic,\\n.webix_richtext .wxi-bold {\\n vertical-align: sub;\\n font-size: 24px;\\n width: 24px;\\n}\\n.webix_control {\\n background: transparent;\\n}\\n.webix_control input,\\n.webix_control button,\\n.webix_control textarea,\\n.webix_el_label,\\n.webix_inp_label,\\n.webix_inp_top_label,\\n.webix_inp_bottom_label {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-family: Roboto, sans-serif;\\n}\\n.webix_el_box {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 3px 2px;\\n height: 100%;\\n width: 100%;\\n font-size: 14px;\\n overflow: hidden;\\n}\\n.webixtoolbarlabel {\\n font-size: 16px;\\n}\\n.webix_el_text input,\\n.webix_el_search input,\\n.webix_el_combo input,\\n.webix_el_datepicker input,\\n.webix_el_colorpicker input {\\n font-size: 14px;\\n height: 100%;\\n padding: 0px 12px;\\n border: 1px solid #DADEE0;\\n color: #475466;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n -webkit-appearance: none;\\n border-radius: 0;\\n}\\n.webix_multitext_icon:hover,\\n.webix_multitext_icon:active {\\n color: #1CA1C1;\\n background: inherit;\\n cursor: pointer;\\n}\\n.webix_inp_label,\\n.webix_inp_top_label,\\n.webix_label_right {\\n color: #475466;\\n text-transform: none;\\n font-size: 14px;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n}\\n.webix_inp_label {\\n float: left;\\n padding-top: 1px;\\n padding-left: 0;\\n padding-right: 9px;\\n}\\n.webix_inp_top_label {\\n float: none;\\n padding: 3px 2px;\\n padding-bottom: 0px;\\n}\\n.webix_inp_bottom_label {\\n font-size: 12px;\\n color: #516075;\\n}\\n.webix_label_right {\\n padding-left: 9px;\\n}\\n.webix_el_checkbox .webix_label_right {\\n display: inline-block;\\n padding-top: 1px;\\n}\\n.webix_el_label {\\n color: #475466;\\n}\\n.webix_toolbar .webix_el_label {\\n text-transform: none;\\n}\\n.webix_el_select select {\\n height: 100%;\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n border: 1px solid #DADEE0;\\n}\\nbody:not(:-moz-handler-blocked) .webix_el_select select {\\n padding: 0.2em;\\n}\\n.webix_el_group,\\n.webix_all_segments {\\n height: 100%;\\n white-space: nowrap;\\n}\\n.webix_inp_counter_next,\\n.webix_inp_counter_prev,\\n.webix_inp_counter_value {\\n border: 1px solid #DADEE0;\\n cursor: pointer;\\n -webkit-appearance: none;\\n width: 20px;\\n height: 100%;\\n vertical-align: top;\\n}\\n.webix_inp_counter_value {\\n font-size: 14px;\\n width: 50px;\\n color: #475466;\\n text-align: center;\\n border-left-width: 0px;\\n border-right-width: 0px;\\n -webkit-appearance: none;\\n border-radius: 0;\\n}\\n.webix_inp_counter_prev {\\n padding: 0;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.webix_inp_counter_prev:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_prev:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_prev:active {\\n background-color: #daddeb;\\n}\\n.webix_inp_counter_next {\\n padding: 0;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_inp_counter_next:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:active {\\n background-color: #daddeb;\\n}\\n.webix_el_textarea textarea,\\n.webix_textarea_measure {\\n border: 1px solid #DADEE0;\\n height: 100%;\\n margin: 0;\\n padding: 5px;\\n color: #475466;\\n resize: none;\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n padding-left: 12px;\\n padding-right: 12px;\\n}\\n.webix_textarea_measure {\\n box-sizing: border-box;\\n overflow: hidden;\\n}\\n.webix_el_textarea .webix_inp_label {\\n padding-top: 10px;\\n}\\n.webix_noscroll.webix_el_textarea textarea {\\n overflow: hidden;\\n}\\n.webix_segment_0,\\n.webix_segment_1 {\\n border: 1px solid #DADEE0;\\n border-right-width: 0px;\\n height: 100%;\\n}\\n.webix_segment_0 {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.webix_segment_N {\\n border: 1px solid #DADEE0;\\n height: 100%;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_segment_N:first-child {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_segment_0,\\n.webix_segment_1,\\n.webix_segment_N {\\n -webkit-appearance: none;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n outline: none;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n cursor: pointer;\\n padding: 0;\\n}\\n.webix_segment_0:hover,\\n.webix_segment_1:hover,\\n.webix_segment_N:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:focus,\\n.webix_segment_1:focus,\\n.webix_segment_N:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:active,\\n.webix_segment_1:active,\\n.webix_segment_N:active {\\n background-color: #daddeb;\\n}\\n.webix_segment_0.webix_selected,\\n.webix_segment_1.webix_selected,\\n.webix_segment_N.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n border-color: #1CA1C1;\\n background-color: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_segment_0.webix_selected:focus,\\n.webix_segment_1.webix_selected:focus,\\n.webix_segment_N.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_segment_0.webix_disabled,\\n.webix_segment_1.webix_disabled,\\n.webix_segment_N.webix_disabled {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n border-color: transparent;\\n cursor: not-allowed;\\n}\\n.webix_segment_0.webix_disabled:hover,\\n.webix_segment_1.webix_disabled:hover,\\n.webix_segment_N.webix_disabled:hover,\\n.webix_segment_0.webix_disabled:focus,\\n.webix_segment_1.webix_disabled:focus,\\n.webix_segment_N.webix_disabled:focus,\\n.webix_segment_0.webix_disabled:active,\\n.webix_segment_1.webix_disabled:active,\\n.webix_segment_N.webix_disabled:active {\\n box-shadow: none;\\n background-color: #fbfbfd;\\n}\\n.webix_segment_0.webix_disabled.webix_selected,\\n.webix_segment_1.webix_disabled.webix_selected,\\n.webix_segment_N.webix_disabled.webix_selected,\\n.webix_segment_0.webix_disabled.webix_selected:hover,\\n.webix_segment_1.webix_disabled.webix_selected:hover,\\n.webix_segment_N.webix_disabled.webix_selected:hover,\\n.webix_segment_0.webix_disabled.webix_selected:focus,\\n.webix_segment_1.webix_disabled.webix_selected:focus,\\n.webix_segment_N.webix_disabled.webix_selected:focus {\\n background-color: #dde0ec;\\n}\\n.webix_inp_static {\\n border: 1px solid #DADEE0;\\n overflow: hidden;\\n padding: 0px 12px;\\n height: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n float: left;\\n}\\n.webix_placeholder {\\n color: #94A1B3;\\n}\\n::-webkit-input-placeholder {\\n color: #94A1B3;\\n}\\n::-moz-placeholder {\\n color: #94A1B3;\\n}\\n/* Firefox 19+ */\\n:-moz-placeholder {\\n color: #94A1B3;\\n}\\n/* Firefox 18- */\\n:-ms-input-placeholder {\\n color: #94A1B3;\\n}\\n.webix_el_combo,\\n.webix_el_richselect,\\n.webix_el_datepicker,\\n.webix_el_colorpicker,\\n.webix_el_search {\\n font-size: 14px;\\n}\\n.webix_el_combo input,\\n.webix_el_richselect input,\\n.webix_el_datepicker input,\\n.webix_el_colorpicker input,\\n.webix_el_search input,\\n.webix_el_combo .webix_inp_static,\\n.webix_el_richselect .webix_inp_static,\\n.webix_el_datepicker .webix_inp_static,\\n.webix_el_colorpicker .webix_inp_static,\\n.webix_el_search .webix_inp_static {\\n color: #475466;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n -webkit-appearance: none;\\n}\\n.webix_el_combo .webix_el_box,\\n.webix_el_richselect .webix_el_box,\\n.webix_el_datepicker .webix_el_box,\\n.webix_el_colorpicker .webix_el_box,\\n.webix_el_search .webix_el_box,\\n.webix_el_text .webix_el_box,\\n.webix_el_texthighlight .webix_el_box {\\n color: #475466;\\n position: relative;\\n}\\n.webix_el_combo .webix_input_icon,\\n.webix_el_richselect .webix_input_icon,\\n.webix_el_datepicker .webix_input_icon,\\n.webix_el_colorpicker .webix_input_icon,\\n.webix_el_search .webix_input_icon,\\n.webix_el_text .webix_input_icon,\\n.webix_el_texthighlight .webix_input_icon {\\n background-color: transparent;\\n position: absolute;\\n z-index: 1;\\n padding-left: 4px;\\n width: 24px;\\n}\\n.webix_clear_icon:hover {\\n color: #FF5C4C;\\n cursor: pointer;\\n}\\n.webix_clear_icon:hover::before {\\n content: \\\"\\\\F011\\\";\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_view input::-ms-clear {\\n display: none;\\n}\\n/*Remove button padding in FF*/\\n.webix_view button::-moz-focus-inner {\\n padding: 0;\\n border: 0;\\n}\\n.webix_el_radio .webix_inp_label {\\n line-height: normal !important;\\n padding-top: 7px;\\n}\\n.webix_inp_radio_border input,\\n.webix_el_checkbox input {\\n margin: 0px;\\n padding: 0px;\\n float: left;\\n}\\n.webix_line_break {\\n clear: both;\\n}\\n.webix_custom_checkbox,\\n.webix_custom_radio {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_radio_option.webix_disabled .webix_label_right,\\n.webix_radio_option.webix_disabled .webix_inp_radio_border {\\n color: #94A1B3;\\n cursor: not-allowed;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_el_radio .webix_radio_option.webix_disabled .webix_custom_radio {\\n color: #94A1B3;\\n cursor: not-allowed;\\n}\\n.webix_radio_option {\\n display: table;\\n float: left;\\n height: 32px;\\n margin-right: 20px;\\n}\\n.webix_inp_radio_border,\\n.webix_el_radio .webix_label_right {\\n display: table-cell;\\n vertical-align: middle;\\n}\\n.webix_measure_size .webix_inp_radio_border,\\n.webix_measure_size.webix_el_radio .webix_label_right {\\n display: table-cell !important;\\n}\\n.webix_measure_size .webix_radio_option {\\n display: table !important;\\n float: left !important;\\n}\\n.webix_measure_size .webix_line_break {\\n display: block !important;\\n}\\n.webix_invalid .webix_el_box input,\\n.webix_invalid .webix_custom_radio,\\n.webix_invalid .webix_el_box .webix_inp_static,\\n.webix_invalid .webix_el_box select,\\n.webix_invalid .webix_el_box textarea,\\ninput.webix_invalid,\\nselect.webix_invalid,\\ntextarea.webix_invalid {\\n background-color: #fff6f6;\\n border-color: #fea5a8;\\n}\\n.webix_invalid .webix_inp_bottom_label {\\n font-size: 12px;\\n color: #fd595f;\\n}\\n.webix_el_colorpicker .webix_input_icon {\\n padding-left: 0;\\n width: 24px;\\n height: 24px;\\n border-radius: 2px;\\n}\\n.webix_el_search .webix_el_box {\\n position: relative;\\n}\\n.webix_el_search input {\\n padding-right: 30px;\\n}\\n.webix_el_search span {\\n position: absolute;\\n right: 19px;\\n cursor: pointer;\\n padding-left: 7px;\\n}\\n.webix_view.webix_control > .webix_disabled {\\n opacity: 0;\\n}\\n.webix_disabled_view.webix_control .webix_image {\\n -webkit-filter: grayscale(100%);\\n filter: grayscale(100%);\\n}\\n.webix_el_label.webix_disabled_view {\\n color: #94A1B3;\\n}\\n.webix_view.webix_control .webix_disabled_box label,\\n.webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_view.webix_control .webix_disabled_box button,\\n.webix_view.webix_control .webix_disabled_box .webix_slider_title {\\n color: #94A1B3;\\n}\\n.webix_view.webix_control .webix_disabled_box input,\\n.webix_view.webix_control .webix_disabled_box select,\\n.webix_view.webix_control .webix_disabled_box textarea,\\n.webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_view.webix_control .webix_disabled_box .webix_slider_right,\\n.webix_view.webix_control .webix_disabled_box .webix_slider_handle {\\n color: #94A1B3;\\n background: #fbfbfd;\\n border-color: #EDEFF0;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_view.webix_control .webix_disabled_box .webix_inp_counter_next,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_N {\\n color: #94A1B3;\\n background: #f4f5f9;\\n border-color: #f4f5f9;\\n text-shadow: none;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: #dde0ec;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_slider_left {\\n background-color: #94A1B3;\\n}\\n.webix_disabled_top_label {\\n color: #94A1B3;\\n}\\nlabel.webix_required:after,\\nlegend.webix_required:after,\\n.webix_measure_size.webix_required:after,\\n.webix_richtext_inp_label.webix_required .webix_template:after {\\n content: \\\"*\\\";\\n padding-left: 4px;\\n color: #FF5C4C;\\n}\\n.webix_multicombo .webix_inp_static {\\n padding: 0 3px 0 0;\\n}\\n.webix_el_text .webix_multicombo_input {\\n background-color: transparent;\\n border: 0;\\n float: left;\\n vertical-align: middle;\\n font-size: 14px;\\n padding: 0px;\\n color: #475466;\\n font-family: Roboto, sans-serif;\\n margin-left: 9px;\\n}\\n.webix_el_text .webix_multicombo_input:focus {\\n border: 0;\\n box-shadow: none;\\n}\\n.webix_multicombo_listbox {\\n width: auto;\\n line-height: 1;\\n margin: 0;\\n padding: 0;\\n list-style: none;\\n}\\n.webix_multicombo_value,\\n.webix_multicombo_tag {\\n float: left;\\n position: relative;\\n background-color: #f2f2f2;\\n display: inline-block;\\n margin: 3px 0 0 3px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n border-radius: 2px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_multicombo_value {\\n padding: 0 20px 0 5px;\\n}\\n.webix_multicombo_tag {\\n min-width: 15px;\\n text-align: center;\\n}\\n.webix_multicombo_tag,\\n.webix_multicombo_value.webix_readonly {\\n padding: 0 5px 0 5px;\\n}\\n.webix_multicombo_delete {\\n position: absolute;\\n top: 50%;\\n right: 4px;\\n margin-top: -8px;\\n font-size: 16px;\\n height: 16px;\\n line-height: 1;\\n color: #475466;\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_multicombo_delete::after {\\n content: \\\"\\\\F011\\\";\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_multilist .webix_list_item {\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n}\\n.webix_multilist .webix_selected {\\n background: #f2f2f2;\\n color: #475466;\\n}\\n.webix_multilist .wxi-checkbox-marked,\\n.webix_multilist .wxi-checkbox-blank {\\n vertical-align: middle;\\n font-size: 24px;\\n width: 24px;\\n margin-right: 4px;\\n}\\n.webix_checksuggest_select_all {\\n border-color: transparent;\\n border-bottom: 1px solid #DADEE0;\\n margin-bottom: 1px;\\n}\\n.webix_checksuggest_select_all .webix_label_right {\\n text-transform: capitalize;\\n display: block;\\n padding: 4px 12px 0 12px;\\n}\\n.webix_checksuggest_select_all input {\\n display: none;\\n}\\n.webix_checksuggest_select_all:hover {\\n cursor: pointer;\\n}\\n.webix_checksuggest_select_all:hover .webix_label_right {\\n cursor: pointer;\\n color: #F4F5F9;\\n}\\n.webix_el_texthighlight {\\n position: relative;\\n}\\n.webix_el_texthighlight.webix_el_text .webix_text_highlight_value {\\n position: relative;\\n top: 50%;\\n transform: translate(0, -50%);\\n overflow: hidden;\\n white-space: pre;\\n}\\n.webix_el_texthighlight.webix_el_text input,\\n.webix_el_texthighlight.webix_el_text .webix_text_highlight {\\n -ms-overflow-style: -ms-autohiding-scrollbar;\\n padding: 0 12px;\\n}\\n.webix_el_texthighlight.webix_el_text .webix_input_icon {\\n top: 3px;\\n}\\n.webix_el_texthighlight.webix_el_textarea textarea {\\n padding: 5px 12px;\\n}\\n.webix_el_texthighlight.webix_el_textarea .webix_text_highlight_value {\\n word-wrap: break-word;\\n margin: 5px 12px;\\n white-space: pre-wrap;\\n}\\n.webix_el_texthighlight.webix_disabled_view .webix_text_highlight {\\n background-color: #fbfbfd;\\n}\\n.webix_el_texthighlight .webix_text_highlight,\\n.webix_el_texthighlight input,\\n.webix_el_texthighlight textarea {\\n line-height: normal;\\n letter-spacing: normal;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_el_texthighlight .webix_text_highlight {\\n -webkit-text-size-adjust: none;\\n height: 100%;\\n position: absolute;\\n border: 1px solid transparent;\\n border-radius: 2px;\\n background-color: #fff;\\n overflow: auto;\\n}\\n.webix_el_texthighlight .webix_text_highlight .webix_text_highlight_value {\\n text-align: left;\\n}\\n.webix_el_texthighlight.webix_control .webix_el_box input,\\n.webix_el_texthighlight.webix_control .webix_el_box textarea {\\n display: block;\\n position: relative;\\n z-index: 1;\\n color: transparent;\\n caret-color: #475466;\\n background: transparent;\\n resize: none;\\n}\\n.webix_el_texthighlight textarea {\\n overflow: auto;\\n}\\n.webix_el_tabbar {\\n background: transparent;\\n}\\n.webix_all_tabs {\\n height: 100%;\\n display: table;\\n}\\n.webix_tab_filler {\\n display: table-cell;\\n background: transparent;\\n font-size: 1px;\\n border-bottom: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_tab_filler:first-child {\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_item_tab:first-child {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_item_tab {\\n display: table-cell;\\n text-align: center;\\n vertical-align: middle;\\n overflow: hidden;\\n cursor: pointer;\\n border: 1px solid #DADEE0;\\n border-left-width: 0px;\\n background: #FFFFFF;\\n color: #1CA1C1;\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 0px;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 0px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webixtype_bottom .webix_item_tab {\\n border-radius: 0;\\n}\\n.webix_item_tab.webix_selected {\\n border-bottom-width: 0px;\\n background: #FFFFFF;\\n color: #1CA1C1;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected {\\n border-bottom-width: 1px;\\n}\\n.webix_before_all_tabs {\\n width: 100%;\\n}\\n.webix_after_all_tabs {\\n width: 100%;\\n border-left: 1px solid #DADEE0;\\n border-right: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: #94A1B3;\\n background: #f4f5f9;\\n border-color: #f4f5f9;\\n text-shadow: none;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin: 0 auto;\\n text-align: center;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin: 0 3px;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab,\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab,\\n.webix_el_tabbar .webixtype_image .webix_item_tab {\\n padding: 3px 0;\\n border-radius: 0;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn_top,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top {\\n background-position: center 0;\\n position: relative;\\n height: 100%;\\n}\\n.webix_tab_more_icon {\\n cursor: pointer;\\n display: table-cell;\\n overflow: hidden;\\n text-align: center;\\n vertical-align: middle;\\n padding: 0 3px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_tab_more_icon .webix_icon {\\n width: 100%;\\n}\\n.webix_tab_list .webix_list_item:last-child {\\n border-bottom: none;\\n}\\n.webix_icon.webix_tab_close {\\n font-size: 12px;\\n float: right;\\n padding: 4px;\\n margin-top: -4px;\\n}\\n.webix_icon.webix_tab_close:focus {\\n color: #FF5C4C;\\n}\\n.webix_all_tabs .webix_item_tab.webix_disabled {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n border-color: transparent;\\n cursor: not-allowed;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_all_tabs .webix_item_tab.webix_disabled:hover,\\n.webix_all_tabs .webix_item_tab.webix_disabled.webix_selected,\\n.webix_all_tabs .webix_item_tab.webix_disabled.webix_selected:hover {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n border-color: transparent;\\n}\\n.webix_menu .webix_list_item:hover,\\n.webix_menu-x .webix_list_item:hover,\\n.webix_menu .webix_list_item:active,\\n.webix_menu-x .webix_list_item:active,\\n.webix_menu .webix_list_item:focus,\\n.webix_menu-x .webix_list_item:focus {\\n background: rgba(100, 100, 100, 0.1);\\n}\\n.webix_menu .webix_list_item,\\n.webix_menu-x .webix_list_item {\\n border: none;\\n text-decoration: none;\\n background: #FFFFFF;\\n height: 36px;\\n}\\n.webix_menu .webix_list_item .webix_submenu_icon,\\n.webix_menu-x .webix_list_item .webix_submenu_icon {\\n float: right;\\n text-align: right;\\n position: relative;\\n margin-left: 4px;\\n}\\n.webix_menu-x {\\n border-color: transparent;\\n background: transparent;\\n color: #FFFFFF;\\n}\\n.webix_menu-x .webix_list_item:first-child {\\n margin-left: 0;\\n}\\n.webix_menu-x .webix_submenu_icon {\\n top: 14px;\\n}\\n.webix_menu-x .webix_list_item {\\n display: inline-block;\\n line-height: 32px;\\n}\\n.webix_menu-x .webix_list_item {\\n border-right: 1px solid #fff;\\n border-left: 0px;\\n background: #1CA1C1;\\n color: #fff;\\n font-size: 14px;\\n}\\n.webix_menu-x .webix_list_item .webix_submenu_icon:before {\\n content: '\\\\F001';\\n}\\n.webix_menu-x .webix_list_item .webix_icon_btn {\\n color: #fff;\\n text-align: left;\\n}\\n.webix_menu-x .webix_list_item.webix_selected {\\n box-shadow: none;\\n}\\n.webix_menu-x .webix_list_item:hover,\\n.webix_menu-x .webix_list_item:active,\\n.webix_menu-x .webix_list_item:focus {\\n background-color: #1992af;\\n}\\n.webix_menu-x .webix_list_item:first-child {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.webix_menu-x .webix_list_item:last-child {\\n border-right: none;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_menu-x .webix_list_item.webix_disabled {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n}\\n.webix_menu-x.webix_disabled_view .webix_disabled {\\n background-color: transparent;\\n}\\n.webix_menu-x.webix_disabled_view .webix_list_item.menu {\\n color: #94A1B3;\\n background: #f4f5f9;\\n}\\n/* Submenu */\\n.webix_menu {\\n background: #FFFFFF;\\n border: 1px solid #DADEE0;\\n border-radius: 0px;\\n}\\n.webix_menu .webix_list_item {\\n display: block;\\n}\\n.webix_menu .webix_context_separator {\\n height: 3px;\\n padding: 1px 3px 0 3px;\\n}\\n.webix_menu .webix_context_separator .sep_line {\\n height: 1px;\\n border-top: 1px solid #DADEE0;\\n}\\n.webix_menu .webix_submenu_icon {\\n top: 12px;\\n}\\n.webix_menu .webix_context_spacer {\\n height: 36px;\\n}\\n.webix_menu_link {\\n color: inherit;\\n text-decoration: none;\\n display: block;\\n height: 100%;\\n}\\n/* Toolbar */\\n.webix_toolbar.webix_layout_subbar .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_button,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_label .webix_el_box,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_label,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_top_label,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_static,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=text],\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=combo],\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=datepicker],\\n.webix_toolbar.webix_layout_subbar.webix_dark textarea,\\n.webix_toolbar.webix_layout_subbar.webix_dark select,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_texthighlight input,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_multicombo_value,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_static:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=text]:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=combo]:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=datepicker]:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark textarea:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_checkbox,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_checkbox:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box input,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box select,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_toolbar.webix_layout_subbar.webix_dark input.webix_invalid,\\n.webix_toolbar.webix_layout_subbar.webix_dark select.webix_invalid,\\n.webix_toolbar.webix_layout_subbar.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar .webix_layout_line,\\n.webix_toolbar .webix_layout_clean {\\n background: transparent;\\n}\\n.webix_hidden_upload,\\n.webix_el_button .webix_hidden_upload {\\n height: 1px;\\n width: 1px;\\n border: 0 !important;\\n font-size: 1px;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n z-index: -1;\\n opacity: 0;\\n}\\n.webix_upload_client,\\n.webix_upload_error,\\n.webix_upload_server {\\n width: 60px;\\n text-align: center;\\n float: right;\\n}\\n.webix_error_icon,\\n.webix_cancel_icon {\\n display: inline-block;\\n background-repeat: no-repeat;\\n}\\n.webix_error_icon {\\n width: 18px;\\n height: 16px;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAYAAAAbBi9cAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZFMDdENjlDNjE2QzExRTI5QzhBQUU2OUI3RDY4RTFCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjZFMDdENjlENjE2QzExRTI5QzhBQUU2OUI3RDY4RTFCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NkUwN0Q2OUE2MTZDMTFFMjlDOEFBRTY5QjdENjhFMUIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NkUwN0Q2OUI2MTZDMTFFMjlDOEFBRTY5QjdENjhFMUIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4ZJnE7AAABdklEQVR42mK80aLPgAcwA/EcIOYB4mgg/oWuQL36AphmYcAPYvl5WBOYmBgY3n/6fQTIn4hLIRMeQ0CuaBHgY2EQ4GMF8euAWIgcg6qF+NmkOdiZGdhYmRiEBdhAhrSQapAKEBcJC7DCBUQE2UBUGhAbkGLQBDEhdjYmJkaGtHVMDD4LmBk+/2RgEBdhBwX+ZGINcuLiZPYW5Ie45tknRrAhIFqAl5WBh4vFBijsR8ggkI29IA0wwMsOo/+DaWjA9wIxGz6D0oAKDXi5EalCkvc/2DApPgifm5OZQZCPFRyGuAwCxwqya0AAZADMVTAgyA92TDUQS2MzqAUUxcAgRjPoP9hVyICVhREUi6B01g4TY4RmES0gvqSuyMPMQAK4ef/LXyBlAswmF2DWd4kJs2M1pGgLIvrRAXJyAIWqNzcXi7cgHysDqQAUnt9//LW52WoQBfLaDRlxDnWgYQzkAKBBDI+ef38E0n3nycsf6gyUgUcAAQYA9DZJKVXGocQAAAAASUVORK5CYII=\\\");\\n}\\n.webix_upload_server {\\n color: #55CD97;\\n}\\n.webix_remove_upload {\\n float: right;\\n}\\n.webix_cancel_icon {\\n margin-top: 9px;\\n width: 14px;\\n height: 14px;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAQAAAC1QeVaAAAAsElEQVR4XoVQUQbDQBScAywIuUcpKCWglBJCDlBKf0vpbymhd5mDhIDcoAcoJQSEsn2G5KmWzMDsPG92ZyGAgVfWfBtrUwEOZnwwOu2UjaPCbScLAEzYmzxyxafMgaUlRXMTsJJ1B7jgy0Y7gHt5FdgyimeAS+a6ZpDTQkLkCQbmk9OBHaPv+p6x99jLFFuOsTMPSlXl8FVlrSopFBP/sIQAbn6+bwsHA29sNGhMBQgf1cri4JYEbDkAAAAASUVORK5CYII=\\\");\\n}\\n.webix_upload_flash {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n bottom: 0;\\n left: 0;\\n background: #fff;\\n}\\n.webix_drop_file {\\n background: #f4f4f4;\\n position: relative;\\n}\\n.webix_drop_file::before {\\n position: absolute;\\n bottom: 10px;\\n left: 0px;\\n width: 100%;\\n text-align: center;\\n pointer-events: none;\\n}\\n.webix_fieldset > fieldset {\\n border: 1px solid #DADEE0;\\n margin: 0px;\\n padding: 5px 8px;\\n}\\n.webix_fieldset_label {\\n color: #475466;\\n font-size: 12px;\\n padding: 0px 8px;\\n text-transform: uppercase;\\n}\\n.webix_forminput > fieldset {\\n border: none;\\n margin: 0px;\\n padding: 0px;\\n}\\n.webix_forminput_label {\\n color: #475466;\\n font-family: Roboto, sans-serif;\\n float: left;\\n line-height: 32px;\\n padding: 3px 2px;\\n padding-right: 9px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\nlegend.webix_forminput_label_top {\\n width: 100%;\\n padding: 3px 2px 0;\\n}\\n.webix_slider_box {\\n position: relative;\\n padding: 0px 10px;\\n height: 100%;\\n float: left;\\n border-radius: 5px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin-top: -11px;\\n padding-top: 15px;\\n}\\n.webix_slider_box .webix_slider_left {\\n height: 10px;\\n float: left;\\n width: 100px;\\n background: #cbeff7;\\n border: 1px solid #e8eaec;\\n border-top-left-radius: 5px;\\n border-bottom-left-radius: 5px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_slider_box .webix_slider_right {\\n height: 10px;\\n float: left;\\n width: 100px;\\n background: #fff;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 5px;\\n border-bottom-right-radius: 5px;\\n border: 1px solid #e8eaec;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_slider_box .webix_slider_handle {\\n z-index: 1;\\n position: absolute;\\n width: 14px;\\n height: 14px;\\n top: 12px;\\n border-radius: 8px;\\n}\\n.webix_slider_box .webix_slider_handle:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_slider_box .webix_slider_left {\\n height: 6px;\\n border: 1px solid #CCD7E6;\\n background: #1CA1C1;\\n}\\n.webix_slider_box .webix_slider_right {\\n height: 6px;\\n border-color: #CCD7E6;\\n}\\n.webix_slider_box .webix_slider_handle {\\n width: 14px;\\n height: 14px;\\n border: 1px solid #CCD7E6;\\n background-color: #FFFFFF;\\n top: 10px;\\n}\\n.webix_rangeslider .webix_slider_box .webix_slider_left {\\n position: absolute;\\n}\\n.webix_rangeslider .webix_slider_box .webix_slider_active {\\n z-index: 2;\\n}\\n.webix_rangeslider .webix_slider_box .webix_slider_right {\\n border-radius: 5px;\\n}\\n.webix_rangeslider .webix_slider_title_box {\\n position: relative;\\n float: left;\\n height: 18px;\\n width: 1px;\\n}\\n.webix_rangeslider .webix_slider_title.webix_slider_move {\\n position: absolute;\\n}\\n.webix_rangeslider.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n border-top-left-radius: 5px;\\n border-bottom-left-radius: 5px;\\n border-top-right-radius: 5px;\\n border-bottom-right-radius: 5px;\\n}\\n.webix_rangeslider.webix_slider_vertical .webix_slider_title.webix_slider_move {\\n display: block;\\n position: relative;\\n}\\n.webix_slider_alt.webix_slider_vertical .webix_slider_box .webix_slider_handle {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFAQMAAABCXz8WAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAZQTFRFAAAAAAAApWe5zwAAAAJ0Uk5TNgD/j1xNAAAADklEQVR4nGNgYPjPAMYACgAB/xSLTywAAAAASUVORK5CYII=\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_left {\\n border: 1px solid #e1e1e1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_right {\\n border: 1px solid #e1e1e1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_handle {\\n width: 11px;\\n margin: 0 2px;\\n height: 14px;\\n top: 12px;\\n border-radius: 2px;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAYAAAAx8TU7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTJCMjdFNENBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTJCMjdFNERBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5MkIyN0U0QUFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5MkIyN0U0QkFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Powz/icAAAAaSURBVHjaYmBgYDBjgAA4zcSABQysIECAAQBn+ACx2PqtbAAAAABJRU5ErkJggg==\\\");\\n background-repeat: no-repeat;\\n background-position: 3px center;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_handle:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_left {\\n border: 1px solid #CCD7E6;\\n background: #1CA1C1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_right {\\n border-color: #CCD7E6;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_handle {\\n background-color: #FFFFFF;\\n border: 1px solid #CCD7E6;\\n top: 10px;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_left,\\n.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n width: 10px;\\n float: none;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_left {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 5px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 5px;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n border-top-left-radius: 5px;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 5px;\\n border-bottom-right-radius: 0;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_handle {\\n left: 7px;\\n}\\n.webix_slider_vertical .webix_slider_title {\\n padding-top: 1px;\\n text-align: left;\\n}\\n.webix_slider_vertical.webix_slider_alt .webix_slider_handle {\\n height: 11px;\\n width: 14px;\\n left: 5px;\\n}\\n.webix_slider_title {\\n text-align: center;\\n}\\n.webix_slider_title.webix_slider_move {\\n position: relative;\\n text-align: left;\\n display: inline-block;\\n width: auto;\\n white-space: nowrap;\\n}\\n.webix_switch_toggle {\\n position: absolute;\\n visibility: hidden;\\n}\\n.webix_switch_box {\\n display: block;\\n position: relative;\\n top: 50%;\\n margin-top: -12px;\\n height: 24px;\\n cursor: pointer;\\n background-color: #f1f1f1;\\n border: 1px solid #DADEE0;\\n border-radius: 60px;\\n transition: background-color 0.4s ease;\\n color: #666;\\n text-align: center;\\n float: left;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_el_switch .webix_label_right {\\n display: block;\\n padding-top: 3px;\\n margin-top: 4px;\\n}\\n.webix_switch_handle {\\n height: 22px;\\n width: 22px;\\n border-radius: 100%;\\n box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3);\\n border: 1px solid #eee;\\n position: absolute;\\n top: 0px;\\n background-color: #fff;\\n transition: left 0.3s ease;\\n cursor: pointer;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_switch_handle:focus,\\n.webix_switch_box:active .webix_switch_handle {\\n box-shadow: 0 0px 2px 2px rgba(0, 0, 0, 0.2);\\n}\\n.webix_switch_text {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n padding: 1px 0 0 18px;\\n display: inline-block;\\n width: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_switch_on .webix_switch_text {\\n padding: 1px 18px 0 0;\\n}\\n.webix_switch_box.webix_switch_on {\\n background-color: #F4F5F9;\\n color: #fff;\\n}\\n.webix_progress_top,\\n.webix_progress_bottom {\\n width: 100%;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n height: 6px;\\n overflow: hidden;\\n z-index: 95;\\n background: #f2f2f2;\\n}\\n.webix_progress_bottom {\\n bottom: 0px;\\n top: auto;\\n height: 17px;\\n}\\n.webix_progress_top .webix_progress_state,\\n.webix_progress_bottom .webix_progress_state {\\n width: 0px;\\n height: 6px;\\n background: #F4F5F9;\\n transition: width 3s;\\n}\\n.webix_progress_bottom .webix_progress_state {\\n height: 17px;\\n}\\n.webix_progress_icon {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n z-index: 95;\\n}\\n.webix_progress_icon .webix_progress_state {\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 50px;\\n position: absolute;\\n left: 50%;\\n top: 50%;\\n margin-left: -25px;\\n margin-top: -25px;\\n display: inline-block;\\n color: #93a0b3;\\n}\\n.webix_gage_box {\\n display: table;\\n height: 100%;\\n width: 100%;\\n}\\n.webix_gage_box > div {\\n display: table-cell;\\n vertical-align: middle;\\n}\\n.webix_gage_body {\\n height: 100%;\\n width: 100%;\\n transform: rotate(180deg);\\n}\\n.webix_gage_label {\\n font-size: 0.9em;\\n text-align: center;\\n margin-top: 10px;\\n}\\n.webix_gage_placeholder {\\n margin-top: -20px;\\n}\\n.webix_gage_info {\\n text-align: center;\\n font-size: 0.7em;\\n position: relative;\\n margin: 0 auto 10px auto;\\n}\\n.webix_gage_min_range {\\n left: -23%;\\n}\\n.webix_gage_max_range {\\n right: -23%;\\n}\\n.webix_gage_min_range,\\n.webix_gage_max_range {\\n display: inline-block;\\n margin-top: 20px;\\n position: absolute;\\n text-align: center;\\n width: 46%;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_gage_range_info {\\n font-size: 1.2em;\\n line-height: 1;\\n}\\n.webix_gage_value {\\n font-size: 2.2em;\\n color: #475466;\\n}\\n.webix_gage_value,\\n.webix_gage_range_info {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_gage_gradient_point_animated {\\n transition: transform 1.3s linear;\\n}\\n.webix_gage_animated {\\n stroke: hsl(120, 100%, 50%);\\n animation: gage_dash 1.3s linear forwards;\\n transition: stroke 1.3s linear, stroke-dasharray 1.3s linear;\\n}\\n@keyframes gage_dash {\\n to {\\n stroke-dashoffset: 0;\\n }\\n}\\n.webix_gage_small_font .webix_gage_info,\\n.webix_gage_small_font .webix_gage_range_info {\\n font-size: 1em;\\n}\\n.webix_gage_small_font .webix_gage_label,\\n.webix_gage_small_font .webix_gage_value {\\n font-weight: 500;\\n font-size: 1.2em;\\n}\\n.webix_gage_small_font .webix_gage_min_range,\\n.webix_gage_small_font .webix_gage_max_range {\\n margin-top: 0;\\n}\\n.webix_gage_small_font .webix_gage_placeholder {\\n margin-top: 0;\\n padding-top: 20px;\\n}\\n.webix_bullet_header {\\n font-weight: 500;\\n}\\n.webix_bullet_header,\\n.webix_bullet_subheader {\\n font-size: 14px;\\n fill: #475466;\\n}\\n.webix_bullet_scale {\\n fill: #74869f;\\n font-size: 12px;\\n font-weight: 500;\\n stroke: none;\\n text-anchor: middle;\\n}\\n.webix_bullet_scale_lines {\\n stroke: #74869f;\\n}\\n.webix_bullet_marker {\\n y: 5px;\\n width: 3px;\\n}\\n.webix_timeline .webix_scroll_cont {\\n padding-top: 28px;\\n}\\n.webix_timeline_item {\\n line-height: 0;\\n padding: 0 12px;\\n position: relative;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_timeline_date,\\n.webix_timeline_event {\\n line-height: 20px;\\n overflow: hidden;\\n position: absolute;\\n top: 0px;\\n}\\n.webix_timeline_left .webix_timeline_date,\\n.webix_timeline_right .webix_timeline_details,\\n.webix_timeline_right .webix_timeline_value {\\n text-align: right;\\n}\\n.webix_timeline_value {\\n font-weight: 500;\\n}\\n.webix_timeline_details {\\n color: #94A1B3;\\n padding-top: 2px;\\n}\\n.webix_timeline_date {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_timeline_horizontal .webix_scroll_cont {\\n white-space: nowrap;\\n display: inline-block;\\n padding-left: 28px;\\n height: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_timeline_horizontal .webix_timeline_item {\\n display: inline-block;\\n height: 100%;\\n padding: 12px 0 12px 0;\\n white-space: normal;\\n}\\n.webix_timeline_horizontal .webix_timeline_item .webix_timeline_date,\\n.webix_timeline_horizontal .webix_timeline_item .webix_timeline_event {\\n left: 0px;\\n}\\n.webix_timeline_horizontal .webix_timeline_item.webix_timeline_bottom .webix_timeline_event {\\n top: initial;\\n}\\n.webix_treemap {\\n background-color: #f5f5f5;\\n}\\n.webix_treemap .webix_scroll_cont {\\n position: relative;\\n height: 100%;\\n width: 100%;\\n}\\n.webix_treemap_item {\\n position: absolute;\\n color: #444;\\n overflow: hidden;\\n text-align: left;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 3px 5px;\\n border-width: 0px 1px 1px 0;\\n border-style: solid;\\n border-color: rgba(0, 0, 0, 0.2);\\n background: transparent;\\n cursor: pointer;\\n}\\n.webix_treemap_level_top {\\n z-index: 1;\\n border-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_treemap_item_bottom {\\n border-bottom-width: 0;\\n}\\n.webix_treemap_item_right {\\n border-right-width: 0;\\n}\\n.webix_treemap_item:hover {\\n box-shadow: inset 0 0 5px #666;\\n}\\n.webix_treemap_item.webix_selected {\\n border-color: #F4F5F9;\\n box-shadow: inset 0 0 1px 2px #F4F5F9;\\n}\\n.webix_treemap_header {\\n width: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_treemap_header {\\n padding: 0 10px;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_treemap_header_item {\\n cursor: pointer;\\n}\\n.webix_treemap_header_item:last-child {\\n cursor: default;\\n}\\n.webix_treemap_reset {\\n float: right;\\n width: 25px;\\n text-align: center;\\n}\\n.webix_treemap_reset:before {\\n content: \\\"\\\\F011\\\";\\n color: #475466;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 16px;\\n display: block;\\n cursor: pointer;\\n}\\n.webix_treemap_path_icon {\\n width: 20px;\\n text-align: center;\\n}\\n.webix_barcode {\\n position: relative;\\n}\\n.webix_barcode .webix_canvas_text {\\n font-size: 14px;\\n padding: 0 2px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.portlet_drag {\\n position: absolute;\\n z-index: 1;\\n top: 5px;\\n right: 5px;\\n width: 18px;\\n opacity: 0.5;\\n cursor: pointer;\\n}\\n.portlet_in_drag {\\n opacity: 0.4;\\n}\\n.portlet_marker,\\n.portlet_markertop,\\n.portlet_markerbottom,\\n.portlet_markerleft,\\n.portlet_markerright {\\n opacity: 0.5;\\n background: #9169BE;\\n position: absolute;\\n z-index: 2;\\n transition: top 0.5s, left 0.5s, width 0.5s, height 0.5s;\\n top: 0px;\\n left: 0px;\\n width: 100%;\\n height: 100%;\\n}\\n.portlet_markertop {\\n height: 50%;\\n}\\n.portlet_markerbottom {\\n height: 50%;\\n top: 50%;\\n}\\n.portlet_markerleft {\\n width: 50%;\\n}\\n.portlet_markerright {\\n width: 50%;\\n left: 50%;\\n}\\n.panel_icon {\\n position: absolute;\\n z-index: 93;\\n top: 5px;\\n right: 5px;\\n line-height: normal;\\n font-size: 13px;\\n width: 18px;\\n opacity: 0.5;\\n cursor: pointer;\\n}\\n.webix_disabled_view .panel_icon {\\n z-index: 91;\\n}\\n.panel_target {\\n position: absolute;\\n z-index: 3;\\n background: rgba(0, 0, 0, 0.04);\\n border: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_left {\\n border-width: 0 1px 0 0;\\n box-shadow: 2px 0 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_left.webix_animate {\\n transition: left 0.6s;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_right {\\n left: auto;\\n border-width: 0 0 0 1px;\\n box-shadow: -2px 0px 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_right.webix_animate {\\n transition: right 0.6s;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_top {\\n border-width: 0 0 1px 0 ;\\n box-shadow: 0 2px 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_top .webix_win_body {\\n position: relative;\\n}\\n.webix_sidemenu_top .webix_win_body > .webix_view {\\n position: absolute;\\n top: auto;\\n left: 0;\\n bottom: 0;\\n}\\n.webix_sidemenu_top.webix_animate,\\n.webix_sidemenu_top.webix_animate .webix_win_body {\\n transition: height 0.6s;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_bottom {\\n border-width: 1px 0 0 0 ;\\n top: auto;\\n box-shadow: 0 -2px 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_bottom.webix_animate,\\n.webix_sidemenu_bottom.webix_animate .webix_win_body {\\n transition: height 0.6s;\\n}\\n/* SideBar*/\\n.webix_sidebar {\\n background: #ECEFF1;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected:focus span {\\n background: transparent;\\n}\\n.webix_sidebar .webix_tree_item {\\n color: #454545;\\n height: 44px;\\n line-height: 43px;\\n}\\n.webix_sidebar .webix_scroll_cont > .webix_tree_leaves {\\n display: block;\\n padding: 0;\\n}\\n.webix_sidebar .webix_tree_leaves .webix_tree_leaves {\\n margin-left: 0px;\\n}\\n.webix_sidebar_selected,\\n.webix_sidebar_expanded .webix_tree_item:hover {\\n background-color: rgba(0, 0, 0, 0.02);\\n}\\n.webix_sidebar .webix_tree_item.webix_selected,\\n.webix_sidebar .webix_tree_item.webix_selected span {\\n background-color: #F4F5F9;\\n padding-right: 0;\\n}\\n.webix_sidebar .webix_tree_branch_1 .webix_tree_item {\\n padding-left: 44px;\\n}\\n.webix_sidebar .webix_tree_branch_1 > .webix_tree_item {\\n height: 44px;\\n line-height: 44px;\\n padding-left: 0;\\n}\\n.webix_sidebar .webix_tree_branch_1 {\\n border-bottom: 1px solid #e5e5e5;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected span,\\n.webix_sidebar .webix_tree_item span {\\n margin: 0;\\n padding: 0px;\\n}\\n.webix_icon.webix_sidebar_icon {\\n width: 44px;\\n text-align: center;\\n}\\nspan.webix_sidebar_dir_icon {\\n float: right;\\n line-height: inherit;\\n}\\n/*SubMenu (Popup) */\\n.webix_sidebar_popup {\\n border: none !important;\\n box-shadow: 2px 3px 3px #ddd;\\n}\\n.webix_sidebar_popup,\\n.webix_sidebar_popup .webix_list_item {\\n border-radius: 0;\\n}\\n.webix_sidebar_popup_right {\\n box-shadow: -3px 3px 3px #ddd;\\n}\\n.webix_sidebar_popup_list.webix_sidebar_popup_left .webix_icon {\\n float: right;\\n line-height: inherit;\\n width: 8px;\\n}\\n.webix_sidebar_popup_list.webix_sidebar_popup_right .webix_icon {\\n float: left;\\n line-height: inherit;\\n}\\n/*SubMenu: title*/\\n.webix_sidebar_popup_title {\\n background: #ECEFF1;\\n}\\n.webix_sidebar_popup_title.webix_selected {\\n border-left-color: #F4F5F9;\\n background: #F4F5F9;\\n}\\n.webix_sidebar_popup_title .webix_template {\\n line-height: 44px;\\n padding: 0 10px;\\n border: 1px solid #E5E5E5;\\n border-left: none;\\n}\\n.webix_sidebar_popup_right .webix_sidebar_popup_title .webix_template {\\n border: 1px solid #E5E5E5;\\n border-right: none;\\n}\\n.webix_sidebar_selected.webix_sidebar_popup_title .webix_template {\\n background: rgba(0, 0, 0, 0.03);\\n border-left: none;\\n}\\n.webix_sidebar_popup_list .webix_list_item {\\n border-left: 1px solid #E5E5E5;\\n border-right: 1px solid #E5E5E5;\\n}\\n/*SubMenu: list*/\\n.webix_sidebar_popup_list .webix_list_item:first-child {\\n border-top: 1px solid #E5E5E5;\\n}\\n.webix_sidebar_popup_list .webix_list_item:hover {\\n background: #f6f9fb;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_selected:hover {\\n background: #F4F5F9;\\n}\\n.webix_menu .webix_list_item.webix_sidebar_selected {\\n background: rgba(0, 0, 0, 0.02);\\n}\\n.webix_menu .webix_list_item.webix_sidebar_selected:hover {\\n background: rgba(0, 0, 0, 0.02) !important;\\n}\\n.webix_view.webix_pdf {\\n background-color: #404040;\\n overflow: auto;\\n}\\n.webix_pdf .canvas_wrapper {\\n margin: 0px auto;\\n box-shadow: 5px 5px 15px #1c1c1c;\\n width: 100%;\\n height: 100%;\\n}\\n.webix_toolbar.pdf_bar .webix_img_btn {\\n text-align: center;\\n}\\n.webix_toolbar.pdf_bar .webix_view {\\n background-color: transparent;\\n}\\n.webix_toolbar.pdf_bar .webix_icon_btn {\\n margin: 0;\\n}\\n.webix_toolbar.pdf_bar .webix_template {\\n background-color: transparent;\\n color: #fff;\\n line-height: 2em;\\n}\\n.webix_toolbar.pdf_bar .webix_el_box input,\\n.webix_toolbar.pdf_bar .webix_inp_static {\\n background-color: #5c5c5c;\\n color: #fff;\\n border-color: #404040;\\n}\\n.webix_toolbar.pdf_bar .webix_el_box input:focus,\\n.webix_toolbar.pdf_bar .webix_inp_static:focus {\\n border-color: #333;\\n}\\n.webix_toolbar.pdf_bar .webix_el_box .webix_input_icon {\\n color: #fff;\\n}\\n.webix_view.webix_popup.pdf_opt_list {\\n border: none;\\n}\\n.pdf_opt_list .webix_list {\\n background-color: #404040;\\n color: #fff;\\n}\\n.pdf_opt_list .webix_list .webix_list_item {\\n border-color: #474747;\\n line-height: 1.5em;\\n}\\n.pdf_opt_list .webix_list .webix_list_item.webix_selected,\\n.pdf_opt_list .webix_list .webix_list_item:hover {\\n color: #404040;\\n background-color: #fff;\\n}\\n.webix_dbllist .bottom_label {\\n text-align: center;\\n font-size: 10px;\\n}\\n.webix_dbllist .webix_list,\\n.webix_dbllist .bottom_label {\\n background: #ededed;\\n}\\n.webix_dbllist .webix_list_item {\\n background: #FFFFFF;\\n margin: 3px 4px 0px 4px;\\n border: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_dbllist .webix_list_item.webix_selected {\\n border-bottom-color: #DADEE0;\\n background-color: #F4F5F9;\\n color: #475466;\\n}\\n.webix_dbllist .dbllist_button {\\n width: 45%;\\n height: 30px;\\n margin-top: 4px;\\n padding: 0;\\n border-radius: 2px;\\n border: 1px solid #DADEE0;\\n cursor: pointer;\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n background-color: #F4F5F9;\\n}\\n.webix_dbllist .dbllist_button .webix_icon {\\n color: #1CA1C1;\\n font-size: 20px;\\n width: 26px;\\n}\\n.webix_dbllist .dbllist_button:first-child {\\n margin-top: 36px;\\n margin-right: 4px;\\n}\\n.webix_dbllist .dbllist_button:last-child {\\n margin-left: 4px;\\n}\\n.webix_dbllist .dbllist_button:hover,\\n.webix_dbllist .dbllist_button:focus,\\n.webix_dbllist .dbllist_button:active {\\n background-color: #e7e9f2;\\n}\\n.webix_invalid .webix_list {\\n background: #f8e2e2;\\n}\\n.dbllist_buttons .webix_template {\\n padding: 0 0 0 4px;\\n}\\n.webix_sparklines {\\n padding: 1px 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_sparklines svg {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_sparklines_line {\\n stroke: #3498db;\\n stroke-width: 1;\\n fill: transparent;\\n stroke-linecap: round;\\n}\\n.webix_sparklines_item {\\n fill: #3498db;\\n stroke-width: 1;\\n}\\n.webix_sparklines_bar {\\n fill: #6dbcf0;\\n}\\n.webix_sparklines_bar_negative {\\n fill: #d86c79;\\n}\\n.webix_sparklines_area {\\n fill: #e5eef4;\\n opacity: 0.5;\\n}\\n.webix_sparklines_origin {\\n stroke: #888;\\n stroke-width: 1;\\n fill: transparent;\\n}\\n.webix_sparklines_event_area {\\n fill: transparent;\\n}\\n.webix_sparklines_donut_hole {\\n fill: #FFFFFF;\\n}\\n.webix_sparklines_line_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_area_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_splinearea_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_radar_chart .webix_sparklines_event_area:hover {\\n fill: rgba(220, 220, 220, 0.4);\\n stroke: rgba(255, 255, 255, 0.6);\\n}\\n.webix_sparklines_pie_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_bar_chart .webix_sparklines_event_area:hover {\\n fill: rgba(255, 255, 255, 0.3);\\n}\\n/* print css rules*/\\n.webix_ui_print,\\n.webix_print_pdf {\\n display: none;\\n}\\nbody.webix_print {\\n margin-top: 0px;\\n}\\n@media print {\\n body.webix_print {\\n overflow: visible !important;\\n background-color: none !important;\\n }\\n body.webix_print > * {\\n display: none;\\n }\\n body.webix_print * {\\n visibility: hidden;\\n }\\n .webix_ui_print {\\n display: block !important;\\n margin: 0 0 0 0!important;\\n visibility: visible !important;\\n }\\n .webix_ui_print * {\\n visibility: visible !important;\\n }\\n .webix_print_noscroll {\\n height: auto !important;\\n width: auto !important;\\n }\\n .webix_print_noscroll,\\n .webix_print_noscroll .webix_scroll_cont {\\n overflow: visible !important;\\n }\\n .webix_print_pagebreak {\\n page-break-after: always;\\n }\\n .webix_print_header,\\n .webix_print_footer {\\n display: block !important;\\n padding: 20px 0px;\\n text-align: center;\\n height: auto !important;\\n visibility: visible !important;\\n }\\n .webix_print_header *,\\n .webix_print_footer * {\\n visibility: visible !important;\\n }\\n /*datatable specific*/\\n .webix_table_print {\\n display: table;\\n visibility: visible !important;\\n table-layout: fixed;\\n width: 100%;\\n border: 1px solid #ebebeb;\\n margin-bottom: 20px;\\n position: initial;\\n }\\n .webix_table_print td {\\n overflow: hidden;\\n }\\n .webix_table_print tr {\\n page-break-inside: avoid;\\n }\\n .webix_table_print .webix_print_top_split .webix_cell {\\n border-bottom: 1px solid #d2d2d2;\\n }\\n .webix_table_print .webix_cell {\\n display: table-cell !important;\\n border-right: 1px solid #ebebeb;\\n border-bottom: 1px solid #ebebeb;\\n padding: 0px 10px;\\n white-space: nowrap;\\n }\\n .webix_table_print .webix_header_cell {\\n display: table-cell;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n background: #F4F5F9;\\n border-right: 1px solid #DADEE0;\\n border-bottom: 1px solid #DADEE0;\\n }\\n .webix_table_print .webix_footer_cell {\\n display: table-cell;\\n background: #fafafa;\\n border-right: 1px solid #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n border-bottom: 1px solid #EDEFF0;\\n }\\n .webix_table_print .webix_cell.webix_dtable_span {\\n position: initial !important;\\n white-space: normal;\\n }\\n .webix_table_print .webix_rotate {\\n transform-origin: center 40% !important;\\n }\\n .webix_table_print.borderless,\\n .webix_table_print.borderless .webix_cell {\\n border: none;\\n }\\n /* x-list specific*/\\n .webix_table_print.webix_view.webix_list-x {\\n white-space: normal;\\n }\\n .webix_table_print.webix_view.webix_list-x .webix_list_item {\\n display: table-cell;\\n }\\n}\\n.webix_fullscreen_html .webix_template > * {\\n width: 100% !important;\\n height: 100% !important;\\n margin: 0px !important;\\n}\\n.webix_icon,\\n.webix_icon_btn,\\n.webix_input_icon {\\n display: inline-block;\\n font-family: \\\"Webix Material Icons\\\";\\n font-style: normal;\\n font-weight: normal;\\n line-height: 1;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n transform: translate(0, 0);\\n}\\n.webix_icon,\\n.webix_input_icon {\\n font-size: 17px;\\n display: inline-block;\\n width: 20px;\\n}\\n.webix_input_icon {\\n float: right;\\n font-size: 20px;\\n color: #94A1B3;\\n}\\n.webix_icon_button {\\n background-color: transparent;\\n border: none;\\n padding: 0;\\n cursor: pointer;\\n vertical-align: middle;\\n}\\n.webix_el_icon .webix_el_box {\\n padding: 0;\\n margin: 0 auto;\\n text-align: center;\\n position: relative;\\n overflow: visible;\\n cursor: pointer;\\n}\\n.webix_icon_button .webix_icon {\\n font-size: 20px;\\n height: 20px;\\n width: 20px;\\n display: inline-block;\\n text-align: center;\\n color: #94A1B3;\\n}\\n.webix_icon_btn {\\n font-size: 20px;\\n display: inline-block;\\n text-align: center;\\n width: 20px;\\n margin-right: 4px;\\n color: #94A1B3;\\n}\\n.webix_icon {\\n text-align: center;\\n}\\n.webix_badge {\\n background-color: #ff8839;\\n color: #FFFFFF;\\n border-radius: 11px;\\n font-size: 12px;\\n height: 22px;\\n min-width: 22px;\\n padding: 0 4px;\\n text-align: center;\\n line-height: 22px;\\n position: absolute;\\n right: 0;\\n top: 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_badge.webix_measure_size {\\n right: auto;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_list_item .webix_badge {\\n position: static;\\n float: right;\\n margin: 4px -5px 0 12px;\\n}\\n@font-face {\\n font-family: Roboto;\\n src: url('fonts/Roboto-Regular-webfont.woff2') format('woff2'), url('fonts/Roboto-Regular-webfont.woff') format('woff');\\n font-weight: normal;\\n font-style: normal;\\n}\\n@font-face {\\n font-family: Roboto;\\n src: url('fonts/Roboto-Medium-webfont.woff2') format('woff2'), url('fonts/Roboto-Medium-webfont.woff') format('woff');\\n font-style: normal;\\n font-weight: 500;\\n}\\n.mainFont {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.buttonFont {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n}\\n.selectFocusRule {\\n background: #edeff5;\\n}\\n.layoutBarBG .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.layoutBarBG.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.layoutBarBG.webix_dark .webix_el_button,\\n.layoutBarBG.webix_dark .webix_el_label .webix_el_box,\\n.layoutBarBG.webix_dark .webix_inp_label,\\n.layoutBarBG.webix_dark .webix_inp_top_label,\\n.layoutBarBG.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_secondary .webix_icon,\\n.layoutBarBG.webix_dark .webix_transparent .webix_icon,\\n.layoutBarBG.webix_dark .webix_secondary .webix_img_btn_text,\\n.layoutBarBG.webix_dark .webix_transparent .webix_img_btn_text,\\n.layoutBarBG.webix_dark .webix_secondary .webix_icon_btn,\\n.layoutBarBG.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_transparent button:hover,\\n.layoutBarBG.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.layoutBarBG.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_secondary button,\\n.layoutBarBG.webix_dark .webix_inp_counter_next,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev,\\n.layoutBarBG.webix_dark .webix_segment_0,\\n.layoutBarBG.webix_dark .webix_segment_1,\\n.layoutBarBG.webix_dark .webix_segment_N,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.layoutBarBG.webix_dark .webix_secondary button:hover,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item:hover,\\n.layoutBarBG.webix_dark .webix_inp_counter_next:hover,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev:hover,\\n.layoutBarBG.webix_dark .webix_segment_0:hover,\\n.layoutBarBG.webix_dark .webix_segment_1:hover,\\n.layoutBarBG.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_secondary button:focus,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item:focus,\\n.layoutBarBG.webix_dark .webix_inp_counter_next:focus,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev:focus,\\n.layoutBarBG.webix_dark .webix_segment_0:focus,\\n.layoutBarBG.webix_dark .webix_segment_1:focus,\\n.layoutBarBG.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_secondary button:active,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item:active,\\n.layoutBarBG.webix_dark .webix_inp_counter_next:active,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev:active,\\n.layoutBarBG.webix_dark .webix_segment_0:active,\\n.layoutBarBG.webix_dark .webix_segment_1:active,\\n.layoutBarBG.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_inp_static,\\n.layoutBarBG.webix_dark input[type=text],\\n.layoutBarBG.webix_dark input[type=combo],\\n.layoutBarBG.webix_dark input[type=datepicker],\\n.layoutBarBG.webix_dark textarea,\\n.layoutBarBG.webix_dark select,\\n.layoutBarBG.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.layoutBarBG.webix_dark .webix_el_texthighlight input,\\n.layoutBarBG.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.layoutBarBG.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.layoutBarBG.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_multicombo_value,\\n.layoutBarBG.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.layoutBarBG.webix_dark .webix_inp_static:focus,\\n.layoutBarBG.webix_dark input[type=text]:focus,\\n.layoutBarBG.webix_dark input[type=combo]:focus,\\n.layoutBarBG.webix_dark input[type=datepicker]:focus,\\n.layoutBarBG.webix_dark textarea:focus,\\n.layoutBarBG.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.layoutBarBG.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.layoutBarBG.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0:hover,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1:hover,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0:focus,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1:focus,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0:active,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1:active,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.layoutBarBG.webix_dark .webix_el_icon,\\n.layoutBarBG.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.layoutBarBG.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.layoutBarBG.webix_dark .webix_icon_button:hover .webix_icon,\\n.layoutBarBG.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.layoutBarBG.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.layoutBarBG.webix_dark .webix_custom_checkbox,\\n.layoutBarBG.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_custom_checkbox:focus,\\n.layoutBarBG.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.layoutBarBG.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.layoutBarBG.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.layoutBarBG.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.layoutBarBG.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.layoutBarBG.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box input,\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box select,\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box textarea,\\n.layoutBarBG.webix_dark input.webix_invalid,\\n.layoutBarBG.webix_dark select.webix_invalid,\\n.layoutBarBG.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.layoutBarBG.webix_dark .webix_invalid .webix_multicombo_value,\\n.layoutBarBG.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_toolbar.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_toolbar.webix_dark .webix_el_button,\\n.webix_toolbar.webix_dark .webix_el_label .webix_el_box,\\n.webix_toolbar.webix_dark .webix_inp_label,\\n.webix_toolbar.webix_dark .webix_inp_top_label,\\n.webix_toolbar.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_secondary .webix_icon,\\n.webix_toolbar.webix_dark .webix_transparent .webix_icon,\\n.webix_toolbar.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_toolbar.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_toolbar.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_toolbar.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_transparent button:hover,\\n.webix_toolbar.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_secondary button,\\n.webix_toolbar.webix_dark .webix_inp_counter_next,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev,\\n.webix_toolbar.webix_dark .webix_segment_0,\\n.webix_toolbar.webix_dark .webix_segment_1,\\n.webix_toolbar.webix_dark .webix_segment_N,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_toolbar.webix_dark .webix_secondary button:hover,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_toolbar.webix_dark .webix_inp_counter_next:hover,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev:hover,\\n.webix_toolbar.webix_dark .webix_segment_0:hover,\\n.webix_toolbar.webix_dark .webix_segment_1:hover,\\n.webix_toolbar.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_secondary button:focus,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_toolbar.webix_dark .webix_inp_counter_next:focus,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev:focus,\\n.webix_toolbar.webix_dark .webix_segment_0:focus,\\n.webix_toolbar.webix_dark .webix_segment_1:focus,\\n.webix_toolbar.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_secondary button:active,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_toolbar.webix_dark .webix_inp_counter_next:active,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev:active,\\n.webix_toolbar.webix_dark .webix_segment_0:active,\\n.webix_toolbar.webix_dark .webix_segment_1:active,\\n.webix_toolbar.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_inp_static,\\n.webix_toolbar.webix_dark input[type=text],\\n.webix_toolbar.webix_dark input[type=combo],\\n.webix_toolbar.webix_dark input[type=datepicker],\\n.webix_toolbar.webix_dark textarea,\\n.webix_toolbar.webix_dark select,\\n.webix_toolbar.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_dark .webix_el_texthighlight input,\\n.webix_toolbar.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_multicombo_value,\\n.webix_toolbar.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_toolbar.webix_dark .webix_inp_static:focus,\\n.webix_toolbar.webix_dark input[type=text]:focus,\\n.webix_toolbar.webix_dark input[type=combo]:focus,\\n.webix_toolbar.webix_dark input[type=datepicker]:focus,\\n.webix_toolbar.webix_dark textarea:focus,\\n.webix_toolbar.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_toolbar.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_toolbar.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_toolbar.webix_dark .webix_el_icon,\\n.webix_toolbar.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_toolbar.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_toolbar.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_toolbar.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_toolbar.webix_dark .webix_custom_checkbox,\\n.webix_toolbar.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_custom_checkbox:focus,\\n.webix_toolbar.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_toolbar.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_toolbar.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_toolbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_toolbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_toolbar.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box input,\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box select,\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_toolbar.webix_dark input.webix_invalid,\\n.webix_toolbar.webix_dark select.webix_invalid,\\n.webix_toolbar.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_toolbar.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_toolbar.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_layout_space > .webix_toolbar {\\n border-radius: 2px;\\n}\\n.webix_view.webix_layout_accordion {\\n background-color: #EBEDF0;\\n}\\n.webix_accordionitem .webix_accordionitem_button {\\n float: right;\\n position: relative;\\n height: 19px;\\n width: 19px;\\n margin: 13.5px 13px;\\n}\\n.webix_accordionitem .webix_accordionitem_header {\\n line-height: 44px;\\n}\\n.webix_accordionitem .webix_accordionitem_header:hover,\\n.webix_accordionitem .webix_accordionitem_header:focus {\\n background-color: #fafafa;\\n}\\n.webix_accordionitem.collapsed .webix_accordionitem_button {\\n float: right;\\n position: relative;\\n margin-top: 12.5px;\\n}\\n.webix_accordionitem.horizontal.collapsed,\\n.webix_accordionitem.collapsed {\\n background-color: #F4F5F9;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header,\\n.webix_accordionitem.collapsed .webix_accordionitem_header {\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header .webix_accordionitem_button,\\n.webix_accordionitem.collapsed .webix_accordionitem_header .webix_accordionitem_button {\\n color: #1CA1C1;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header .webix_accordionitem_label .webix_icon,\\n.webix_accordionitem.collapsed .webix_accordionitem_header .webix_accordionitem_label .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:hover,\\n.webix_accordionitem.collapsed .webix_accordionitem_header:hover,\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:focus,\\n.webix_accordionitem.collapsed .webix_accordionitem_header:focus {\\n background-color: #edeff5;\\n}\\n.webix_accordionitem_label {\\n padding-left: 12px;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header .webix_accordionitem_button {\\n color: #FFFFFF;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header.collapsed {\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header.collapsed .webix_accordionitem_button {\\n color: #1CA1C1;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header:hover,\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header:focus {\\n background-color: #61707e;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:hover,\\n.webix_layout_accordion.webix_dark .webix_accordionitem.collapsed .webix_accordionitem_header:hover,\\n.webix_layout_accordion.webix_dark .webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:focus,\\n.webix_layout_accordion.webix_dark .webix_accordionitem.collapsed .webix_accordionitem_header:focus {\\n background-color: #edeff5;\\n}\\n.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button {\\n color: #94A1B3;\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n text-align: center;\\n width: 24px;\\n height: 43px;\\n margin: 0 10px 0 10px;\\n}\\n.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_label .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F002';\\n}\\n.webix_accordionitem .webix_accordionitem_header.collapsed .webix_accordionitem_button:before {\\n content: '\\\\F004';\\n}\\n.webix_accordionitem.horizontal:last-child > .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F003';\\n}\\n.webix_accordionitem.horizontal.collapsed:last-child > .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F001';\\n}\\n.webix_accordionitem.vertical > .webix_accordionitem_header .webix_accordionitem_button {\\n height: 43px;\\n margin: 0px 10px 0 10px;\\n}\\n.webix_accordionitem.vertical > .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F004';\\n}\\n.webix_accordionitem.vertical > .webix_accordionitem_header.collapsed .webix_accordionitem_button:before {\\n content: '\\\\F001';\\n}\\n.webix_toolbar.webix_layout_subbar {\\n background: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar .webix_view {\\n color: #475466;\\n}\\n.webix_el_tabbar + .webix_multiview {\\n background-color: #FFFFFF;\\n}\\n.webix_layout_space > .webix_view,\\n.webix_layout_wide > .webix_view {\\n border-radius: 2px;\\n}\\n.webix_layout_space .webix_layout_accordion .webix_accordionitem,\\n.webix_layout_wide .webix_layout_accordion .webix_accordionitem {\\n border-radius: 2px;\\n}\\n.webix_popup_button {\\n border-color: #F4F5F9;\\n}\\n.webix_popup_button.confirm {\\n border-color: #1CA1C1;\\n}\\n.webix_popup_button div {\\n border-radius: 0;\\n}\\n.dataHeaderFont {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_dtable .webix_ss_header .webix_hcell,\\n.webix_dtable .webix_ss_footer .webix_hcell {\\n border-color: transparent;\\n}\\n.webix_dtable .webix_ss_body .webix_column > div,\\n.webix_dtable .webix_ss_body .webix_table_cell {\\n border-right-color: transparent;\\n border-left-color: transparent;\\n}\\n.webix_dtable.webix_header_border .webix_ss_header .webix_hcolumn > div,\\n.webix_dtable.webix_header_border .webix_ss_header .webix_span {\\n border-right-color: #DADEE0;\\n border-bottom-color: #DADEE0;\\n}\\n.webix_dtable.webix_footer_border .webix_ss_footer .webix_hcolumn > div,\\n.webix_dtable.webix_footer_border .webix_ss_footer .webix_span {\\n border-right-color: #DADEE0;\\n border-top-color: #DADEE0;\\n}\\n.webix_dtable.webix_data_border .webix_ss_body .webix_column > div,\\n.webix_dtable.webix_data_border .webix_table_cell {\\n border-right-color: #EDEFF0;\\n}\\n.webix_dtable .webix_ss_left .webix_column.webix_last > div,\\n.webix_dtable .webix_table_cell.webix_last_rightcell {\\n border-right: 1px solid #ccd2d4;\\n}\\n.webix_dtable div.webix_last_topcell {\\n border-bottom: 1px solid #ccd2d4;\\n}\\n.webix_dtable .webix_ss_right .webix_column.webix_first > div {\\n border-left: 1px solid #ccd2d4;\\n}\\n.webix_dtable .webix_hs_right .webix_hcell.webix_first {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_dtable .webix_hs_left .webix_hcell.webix_last {\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_dtable .webix_hcell.webix_ss_filter {\\n padding: 0px 4px;\\n}\\n.webix_dtable .webix_hcell.webix_div_filter {\\n padding: 1px 4px;\\n}\\n.webix_dtable .webix_dtable_subview {\\n background: #FFFFFF;\\n}\\n.webix_dtable .webix_dtable_subview .webix_view {\\n border-left-width: 1px;\\n border-right-width: 1px;\\n border-color: #EDEFF0;\\n}\\n.webix_dtable .webix_ss_filter select,\\n.webix_dtable .webix_ss_filter input {\\n height: 32px;\\n vertical-align: middle;\\n border-radius: 2px;\\n border-color: #CCD7E6;\\n}\\n.webix_dtable .webix_ss_filter select:focus,\\n.webix_dtable .webix_ss_filter input:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_dtable .webix_select_mark > div.webix_row_select {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_dtable .webix_ss_header .webix_hcolumn div.webix_last_row,\\n.webix_dtable .webix_ss_header .webix_span.webix_last_row {\\n border-bottom: 1px solid #5ccce7;\\n}\\n.webix_dtable .webix_ss_footer .webix_hcolumn > div:first-child,\\n.webix_dtable .webix_ss_footer .webix_hcell[row=\\\"0\\\"] {\\n border-top: 1px solid #5ccce7;\\n}\\n.webix_dtable .webix_ss_footer,\\n.webix_dtable .webix_ss_footer .webix_hcolumn,\\n.webix_dtable .webix_ss_footer .webix_hs_left,\\n.webix_dtable .webix_ss_footer .webix_hs_center,\\n.webix_dtable .webix_ss_footer .webix_hs_right,\\n.webix_dtable .webix_ss_footer div.webix_ss_vscroll_footer {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n background: #F4F5F9;\\n}\\n.webix_dtable .webix_column > .webix_drag_over.webix_cell {\\n background-color: #F4F5F9;\\n}\\n.webix_block_selection {\\n border: none;\\n background: #1CA1C1;\\n opacity: 0.1;\\n}\\n.webix_area_selection,\\n.webix_area_selection_handle {\\n background: #1CA1C1;\\n}\\n.webix_dtable_focused .webix_area_selection,\\n.webix_dtable_focused .webix_area_selection_handle {\\n background-color: #1992af;\\n}\\n.dtBodyCell {\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_dtable div.webix_ss_vscroll_header {\\n border-bottom-color: #5ccce7;\\n}\\n.webix_dtable div.webix_ss_vscroll_footer {\\n border-top-color: #5ccce7;\\n border-left-color: #DADEE0;\\n}\\n.webix_view .webix_dt_editor input,\\n.webix_view .webix_dt_editor select {\\n border-color: #1CA1C1;\\n border-radius: 2px;\\n}\\n.dataItemStyle {\\n border-color: #EDEFF0;\\n}\\n.webix_list_item.webix_group_back {\\n color: #313131;\\n background: #F4F5F9;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_dataview_item {\\n border-right-color: #EDEFF0;\\n line-height: 24px;\\n}\\n.webix_dataview_item.webix_selected {\\n box-shadow: none;\\n}\\n.webix_dataview_item.tiles.webix_selected {\\n border-color: #5ccce7;\\n}\\n.webix_view .webix_pager_item {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n outline: none;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_view .webix_pager_item:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_view .webix_pager_item:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_view .webix_pager_item:active {\\n background-color: #daddeb;\\n}\\n.webix_view .webix_pager_item_selected {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_view .webix_pager_item_selected:hover {\\n background-color: #1992af;\\n}\\n.webix_view .webix_pager_item_selected:focus {\\n background-color: #1992af;\\n}\\n.webix_view .webix_pager_item_selected:active {\\n background-color: #17839d;\\n}\\n.webix_view .webix_pager_item,\\n.webix_view .webix_pager_item_selected {\\n border-radius: 2px;\\n border-width: 0px;\\n}\\n.webix_list .webix_unit_header {\\n font-weight: normal;\\n text-shadow: none;\\n border-bottom: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background: #F4F5F9;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_list .webix_unit_header:not(:first-child) {\\n border-top: 1px solid #DADEE0;\\n margin-top: -1px;\\n}\\n.webix_tree .webix_tree_item.webix_selected {\\n background-color: #F4F5F9;\\n}\\n.webix_tree .webix_tree_item.webix_selected:focus {\\n background-color: #edeff5;\\n}\\n.webix_tree .webix_tree_item.webix_selected span {\\n background-color: transparent;\\n padding: 0;\\n margin: 0;\\n}\\n.webix_tree .webix_tree_item.webix_selected div {\\n background-color: transparent;\\n}\\n.webix_tree .webix_tree_item,\\n.webix_tree .webix_tree_item.webix_selected {\\n padding-right: 12px;\\n}\\n.webix_tree_open,\\n.webix_tree_close {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n text-align: center;\\n color: #94A1B3;\\n}\\n.webix_tree_open:before {\\n margin-left: -2px;\\n content: \\\"\\\\F027\\\";\\n}\\n.webix_tree_close:before {\\n margin-left: -2px;\\n content: \\\"\\\\F028\\\";\\n}\\n.webix_tree_folder,\\n.webix_tree_folder_open,\\n.webix_tree_file {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 20px;\\n margin: 0 4px 0 0;\\n width: 24px;\\n text-align: center;\\n color: #DADEE0;\\n}\\n.webix_tree_folder:before {\\n content: \\\"\\\\F030\\\";\\n}\\n.webix_tree_folder_open:before {\\n content: \\\"\\\\F031\\\";\\n}\\n.webix_tree_file:before {\\n content: \\\"\\\\F032\\\";\\n}\\n.webix_menu-x .webix_list_item .webix_submenu_icon,\\n.webix_view.webix_menu .webix_list_item .webix_submenu_icon {\\n font-size: 14px;\\n font-family: \\\"Webix Material Icons\\\";\\n width: 6px;\\n top: 0;\\n margin-left: 0;\\n}\\n.webix_view.webix_popup.webix_menu {\\n border: none;\\n}\\n.webix_menu.webix_view .webix_list_item:hover,\\n.webix_menu.webix_view .webix_list_item:active {\\n background-color: #edeff5;\\n}\\n.webix_menu.webix_view .webix_list_item .webix_submenu_icon:before {\\n content: '\\\\F003';\\n}\\n.webix_menu.webix_view .webix_list_item.webix_selected {\\n background: #F4F5F9;\\n}\\n.webix_menu.webix_view .webix_list_item.webix_disabled {\\n background-color: #FFFFFF;\\n}\\n.webix_menu.webix_view .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_property .webix_property_label_line {\\n background-color: #F4F5F9;\\n}\\n.webix_drag_over,\\n.webix_drop_zone {\\n background-color: #F4F5F9;\\n}\\n.webix_view button,\\n.webix_view input[type=button] {\\n -webkit-appearance: none;\\n}\\n.focusStyle {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_search input,\\n.webix_el_combo input,\\n.webix_el_colorpicker input {\\n padding-right: 28px;\\n}\\n.webix_el_search input,\\n.webix_el_text input,\\n.webix_el_combo input,\\n.webix_el_colorpicker input,\\n.webix_el_datepicker input {\\n border-radius: 2px;\\n}\\n.webix_el_search input:focus,\\n.webix_el_text input:focus,\\n.webix_el_combo input:focus,\\n.webix_el_colorpicker input:focus,\\n.webix_el_datepicker input:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_richselect .webix_inp_static,\\n.webix_el_datepicker .webix_inp_static,\\n.webix_el_colorpicker .webix_inp_static {\\n border-radius: 2px;\\n padding-right: 28px;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n}\\n.webix_el_richselect .webix_inp_static:focus,\\n.webix_el_datepicker .webix_inp_static:focus,\\n.webix_el_colorpicker .webix_inp_static:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_textarea textarea:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_select select:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_select select,\\n.webix_el_textarea textarea {\\n border-radius: 2px;\\n}\\n.webix_el_text .webix_inp_static {\\n border-radius: 2px;\\n white-space: nowrap;\\n}\\n.webix_focused .webix_inp_static {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_multilist .wxi-checkbox-marked {\\n color: #1CA1C1;\\n}\\n.webix_multilist .wxi-checkbox-blank {\\n color: #94A1B3;\\n}\\n.webix_multicombo_value,\\n.webix_multicombo_tag,\\n.webix_multicombo_value.webix_readonly {\\n background-color: #EBEDF0;\\n border-radius: 100px;\\n padding: 0 12px 0 12px;\\n}\\n.webix_multicombo_value:has(> .webix_multicombo_delete) {\\n padding: 0 26px 0 12px;\\n}\\n.webix_multicombo_delete {\\n color: #94A1B3;\\n margin-top: -10px;\\n font-size: 20px;\\n height: 20px;\\n}\\n.webix_multicombo_delete::after {\\n content: \\\"\\\\F033\\\";\\n}\\n.webix_checksuggest_select_all:hover {\\n background-color: #F4F5F9;\\n border-radius: 2px;\\n}\\n.webix_checksuggest_select_all:hover .webix_label_right {\\n color: #1CA1C1;\\n}\\n.webix_checksuggest_select_all .webix_label_right {\\n text-align: center;\\n font-size: 16px;\\n color: #1CA1C1;\\n}\\n.webix_checksuggest_select_all.webix_el_checkbox .webix_label_right {\\n padding-top: 5px;\\n}\\n.buttonStyle {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n}\\n.webix_el_colorpicker div.webix_inp_static div {\\n margin: 2.5px -20px 0px -5px;\\n}\\ndiv.webix_inp_static,\\n.webix_el_textarea textarea {\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n}\\n.webix_el_select select {\\n font-family: Roboto, sans-serif;\\n border-color: #DADEE0;\\n}\\n.webix_el_checkbox input {\\n border-color: #DADEE0;\\n}\\n.webix_el_counter .webix_inp_counter_value {\\n width: 42px;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n}\\n.webix_el_counter .webix_inp_counter_prev,\\n.webix_el_counter .webix_inp_counter_next {\\n background: #F4F5F9;\\n width: 30px;\\n border: 1px solid #CCD7E6;\\n font-weight: bold;\\n font-family: \\\"Courier New\\\", Courier, monospace;\\n}\\n.webix_el_counter .webix_inp_counter_prev {\\n font-size: 20px;\\n border-right: none;\\n}\\n.webix_el_counter .webix_inp_counter_next {\\n font-size: 20px;\\n border-left: none;\\n}\\n.webix_view.webix_control.webix_el_tabbar {\\n background: #FFFFFF;\\n}\\n.webix_all_tabs .webix_item_tab {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n border: none;\\n}\\n.webix_all_tabs .webix_item_tab:hover {\\n background-color: #F4F5F9;\\n}\\n.webix_all_tabs .webix_item_tab .webix_icon.webix_tab_close {\\n width: 28px;\\n font-size: 20px;\\n padding: 0;\\n margin-top: 1px;\\n color: #94A1B3;\\n}\\n.webix_all_tabs .webix_item_tab .webix_icon.webix_tab_close:focus {\\n color: #FF5C4C;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected {\\n box-shadow: inset 0 -2px #1CA1C1;\\n padding-bottom: 0;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected:hover {\\n background-color: transparent;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected:focus {\\n color: #17839d;\\n box-shadow: inset 0 -2px #17839d;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected.webix_disabled {\\n box-shadow: inset 0 -2px #94A1B3;\\n}\\n.webix_all_tabs .webix_tab_filler {\\n border: none;\\n}\\n.webix_all_tabs .webix_tab_more_icon .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_all_tabs .webix_tab_more_icon:hover,\\n.webix_all_tabs .webix_tab_more_icon:focus {\\n background-color: #F4F5F9;\\n}\\n.webixtype_bottom .webix_item_tab,\\n.webixtype_bottom .webix_item_tab.webix_selected {\\n background: #FFFFFF;\\n padding: 0;\\n}\\n.webixtype_bottom .webix_item_tab:last-child,\\n.webixtype_bottom .webix_item_tab.webix_selected:last-child {\\n border-right: none;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected {\\n box-shadow: inset 0 2px #1CA1C1;\\n background: #FFFFFF;\\n color: #1CA1C1;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected:focus {\\n box-shadow: inset 0 2px #17839d;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected.webix_disabled {\\n box-shadow: inset 0 2px #94A1B3;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin: 0 auto;\\n text-align: center;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-size: 24px;\\n margin: 0 3px;\\n height: 100%;\\n line-height: inherit;\\n vertical-align: top;\\n width: 100%;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab.webix_selected {\\n background: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn:active,\\n.webix_el_tabbar .webixtype_icon .webix_img_btn_top:active {\\n background-color: #FFFFFF;\\n}\\n.webix_accordionitem_label .webix_icon {\\n margin-right: 8px;\\n}\\n.webix_el_tabbar .webixtype_iconTop,\\n.webix_el_tabbar .webixtype_image {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab,\\n.webix_el_tabbar .webixtype_image .webix_item_tab {\\n font-size: 14px;\\n padding-top: 2px;\\n padding-bottom: 2px;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top .webix_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top .webix_image,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top .webix_image {\\n top: 0;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_text,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_text {\\n bottom: 0px;\\n font-size: 14px;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected {\\n background: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_img_btn_text,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_img_btn_text {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_icon_btn,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_icon_btn {\\n background-color: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_img_btn,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_img_btn {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab,\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab,\\n.webix_el_tabbar .webixtype_image .webix_item_tab {\\n padding: 0;\\n border-radius: 0;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab .webix_img_btn,\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab .webix_img_btn,\\n.webix_el_tabbar .webixtype_image .webix_item_tab .webix_img_btn {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon {\\n background: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon .webix_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon .webix_icon,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon:focus,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon:focus,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon:focus,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon:focus {\\n background-color: #F4F5F9;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn:hover,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn:hover,\\n.webix_el_tabbar .webixtype_image .webix_img_btn:hover,\\n.webix_el_tabbar .webixtype_icon .webix_img_btn_top:hover,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top:hover,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top:hover {\\n background-color: transparent;\\n}\\n.webix_tab_filler:first-child {\\n border-right: 0;\\n}\\n.passiveBarBG {\\n background: #FFFFFF;\\n color: #1CA1C1;\\n}\\n.webix_cancel_icon {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 17px;\\n margin: 0;\\n height: auto;\\n width: 20px;\\n}\\n.webix_cancel_icon:hover {\\n color: #FF5C4C;\\n}\\n.webix_cancel_icon:before {\\n content: \\\"\\\\F011\\\";\\n}\\n.webix_error_icon {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 20px;\\n height: auto;\\n width: 20px;\\n color: #FF5C4C;\\n}\\n.webix_error_icon:before {\\n content: \\\"\\\\F034\\\";\\n}\\n.webix_inp_counter_next:hover,\\n.webix_inp_counter_prev:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:focus,\\n.webix_inp_counter_prev:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:active,\\n.webix_inp_counter_prev:active {\\n background-color: #daddeb;\\n}\\n.webix_el_button button,\\n.webix_el_toggle button,\\n.webixbutton,\\n.webix_view button,\\n.webix_view input[type=button] {\\n border-width: 0px;\\n}\\n.webix_segment_0:hover,\\n.webix_segment_1:hover,\\n.webix_segment_N:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:focus,\\n.webix_segment_1:focus,\\n.webix_segment_N:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:active,\\n.webix_segment_1:active,\\n.webix_segment_N:active {\\n background-color: #daddeb;\\n}\\n.webix_selected.webix_segment_0:hover,\\n.webix_selected.webix_segment_1:hover,\\n.webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_selected.webix_segment_0:focus,\\n.webix_selected.webix_segment_1:focus,\\n.webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_selected.webix_segment_0:active,\\n.webix_selected.webix_segment_1:active,\\n.webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_all_segments .webix_segment_1,\\n.webix_all_segments .webix_segment_N {\\n margin-left: 1px;\\n border-left: none;\\n}\\n.webix_segment_0,\\n.webix_segment_1,\\n.webix_segment_N {\\n border-color: #F4F5F9;\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_left,\\n.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n width: 6px;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_handle {\\n left: 5px;\\n}\\n.webix_slider_vertical.webix_slider_alt .webix_slider_handle {\\n left: 3px;\\n}\\n.webix_section > .webix_template {\\n font-family: Roboto, sans-serif;\\n font-size: 12px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_view.webix_control .webix_disabled_box .webix_custom_checkbox,\\n.webix_view.webix_control .webix_disabled_box .webix_custom_radio {\\n color: #DADEE0;\\n}\\n.webix_view > .webix_disabled {\\n background-color: #EBEDF0;\\n opacity: 0.6;\\n}\\n.webix_disabled_view .webix_disabled_top_label {\\n color: #94A1B3;\\n}\\n.webix_custom_checkbox:before {\\n content: \\\"\\\\F013\\\";\\n font-family: \\\"Webix Material Icons\\\";\\n cursor: pointer;\\n}\\n.webix_checkbox_1 .webix_custom_checkbox:before {\\n content: \\\"\\\\F012\\\";\\n}\\n.webix_checkbox_1 .webix_custom_checkbox {\\n color: #1CA1C1;\\n}\\n.webix_custom_checkbox {\\n float: left;\\n position: relative;\\n font-size: 24px;\\n height: 100%;\\n padding: 0;\\n margin-top: 1px;\\n border: none;\\n background-color: transparent;\\n color: #94A1B3;\\n}\\n.webix_custom_checkbox:focus {\\n color: #188ba6;\\n}\\n.webix_el_radio .webix_custom_radio:before {\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n content: \\\"\\\\F035\\\";\\n display: block;\\n}\\n.webix_el_radio .webix_radio_1 .webix_custom_radio {\\n color: #1CA1C1;\\n}\\n.webix_el_radio .webix_radio_1 .webix_custom_radio:before {\\n content: \\\"\\\\F036\\\";\\n}\\n.webix_el_radio .webix_custom_radio {\\n padding: 0;\\n display: block;\\n background-color: transparent;\\n border-color: transparent;\\n color: #94A1B3;\\n cursor: pointer;\\n}\\n.webix_el_radio .webix_custom_radio:focus {\\n color: #188ba6;\\n}\\n.webix_cal_icon,\\n.webix_cal_time,\\n.webix_cal_month_name {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_cal_icon:hover,\\n.webix_cal_time:hover,\\n.webix_cal_month_name:hover,\\n.webix_cal_icon:focus,\\n.webix_cal_time:focus,\\n.webix_cal_month_name:focus {\\n text-decoration: none;\\n color: #1CA1C1;\\n}\\n.webix_cal_month_name,\\n.webix_time_header .webix_cal_hours,\\n.webix_time_header .webix_cal_minutes {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_cal_month_name.webix_readonly:hover,\\n.webix_cal_month_name.webix_readonly:focus {\\n color: #313131;\\n}\\n.webix_cal_prev_button,\\n.webix_cal_next_button {\\n background-image: none;\\n width: 24px;\\n font-size: 24px;\\n font-family: \\\"Webix Material Icons\\\";\\n color: #94A1B3;\\n}\\n.webix_cal_prev_button:hover,\\n.webix_cal_next_button:hover,\\n.webix_cal_prev_button:focus,\\n.webix_cal_next_button:focus {\\n color: #1CA1C1;\\n}\\n.webix_cal_prev_button:before {\\n content: \\\"\\\\F029\\\";\\n}\\n.webix_cal_next_button:before {\\n content: \\\"\\\\F028\\\";\\n}\\n.webix_time_header .webix_cal_hours,\\n.webix_time_header .webix_cal_minutes,\\n.webix_cal_body .webix_cal_block_empty {\\n font-weight: 500;\\n border-bottom: none;\\n}\\n.webix_view > .webix_cal_header {\\n height: 18px;\\n}\\n.webix_view > .webix_cal_header div {\\n height: 17px;\\n line-height: 18px;\\n font-size: 12px;\\n border-bottom-color: transparent;\\n}\\n.webix_cal_body .webix_cal_week_num {\\n color: #475466;\\n}\\n.webix_cal_body .webix_cal_today .webix_cal_day_inner {\\n box-shadow: inset 0 0 0 1px #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_day_inner {\\n display: inline-block;\\n font-size: 12px;\\n border-radius: 50%;\\n}\\n.webix_cal_body .webix_cal_day_inner:hover {\\n background-color: #F4F5F9;\\n}\\n.webix_cal_body .webix_cal_event {\\n font-weight: 500;\\n color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_outside {\\n color: #94A1B3;\\n font-weight: normal;\\n}\\n.webix_cal_body .webix_cal_select,\\n.webix_cal_body .webix_cal_today.webix_cal_select {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_select .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_select .webix_cal_day_inner {\\n color: #FFFFFF;\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_select .webix_cal_day_inner:hover,\\n.webix_cal_body .webix_cal_today.webix_cal_select .webix_cal_day_inner:hover {\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_select:focus .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_select:focus .webix_cal_day_inner {\\n background-color: #1992af;\\n}\\n.webix_cal_body .webix_cal_block {\\n font-family: Roboto, sans-serif;\\n font-size: 12px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected span {\\n background-color: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected span:hover {\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected:focus span {\\n background-color: #1992af;\\n}\\n.webix_cal_body .webix_cal_block span {\\n border-radius: 50%;\\n}\\n.webix_cal_body .webix_cal_block span:hover {\\n background-color: #F4F5F9;\\n}\\n.webix_cal_body .webix_hours .webix_cal_day_disabled,\\n.webix_cal_body .webix_hours .webix_cal_day_disabled.webix_cal_event,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled.webix_cal_event,\\n.webix_cal_body .webix_cal_day_disabled,\\n.webix_cal_body .webix_cal_day_disabled.webix_cal_event {\\n background-color: #fbfbfd;\\n color: #94A1B3;\\n}\\n.webix_cal_body .webix_hours .webix_cal_day_disabled span:hover,\\n.webix_cal_body .webix_hours .webix_cal_day_disabled.webix_cal_event span:hover,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled span:hover,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled.webix_cal_event span:hover,\\n.webix_cal_body .webix_cal_day_disabled span:hover,\\n.webix_cal_body .webix_cal_day_disabled.webix_cal_event span:hover {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_range_first,\\n.webix_cal_body .webix_cal_range_last {\\n position: relative;\\n}\\n.webix_cal_body .webix_cal_range_last + .webix_cal_outside {\\n background-color: #FFFFFF;\\n}\\n.webix_cal_body .webix_cal_range_first:before,\\n.webix_cal_body .webix_cal_range_last:after {\\n content: \\\"\\\";\\n display: block;\\n width: 50%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n background: #e1f6fb;\\n}\\n.webix_cal_body .webix_cal_range_first:before {\\n right: 100%;\\n}\\n.webix_cal_body .webix_cal_range_last:after {\\n left: 100%;\\n}\\n.webix_cal_body .webix_cal_range_start,\\n.webix_cal_body .webix_cal_range_end {\\n position: relative;\\n z-index: 1;\\n}\\n.webix_cal_body .webix_cal_range_last + .webix_cal_outside {\\n position: relative;\\n z-index: 1;\\n background-color: #FFFFFF;\\n}\\n.webix_cal_body .webix_cal_range:first-child:before,\\n.webix_cal_body .webix_cal_range:last-child:after,\\n.webix_cal_body .webix_cal_outside + .webix_cal_range_first:before {\\n width: 0;\\n}\\n.webix_cal_body .webix_cal_range_start,\\n.webix_cal_body .webix_cal_range_end,\\n.webix_cal_body .webix_cal_today.webix_cal_range_start,\\n.webix_cal_body .webix_cal_today.webix_cal_range_end {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_range_start .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_range_end .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_range_start .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_range_end .webix_cal_day_inner {\\n color: #FFFFFF;\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_range {\\n background-color: #e1f6fb;\\n}\\n.webix_daterange .webix_range_timepicker .webix_cal_time {\\n padding: 4px;\\n}\\n.webix_daterange .webix_cal_icons .webix_cal_icon {\\n border-top: none;\\n}\\n.webix_progress_top .webix_progress_state,\\n.webix_progress_bottom .webix_progress_state {\\n background: #1CA1C1;\\n background-image: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0.1) 75%, transparent 75%, transparent);\\n}\\n.webix_progress_top .webix_progress_state {\\n background-size: 10px 10px;\\n}\\n.webix_progress_bottom .webix_progress_state {\\n background-size: 14px 14px;\\n}\\n.webix_switch_box {\\n color: #475466;\\n background-color: #F4F5F9;\\n}\\n.webix_switch_box.webix_switch_on {\\n background-color: #1CA1C1;\\n}\\n.webix_switch_box .webix_switch_text {\\n padding-top: 2px;\\n}\\n.webix_sidebar {\\n background-color: #FFFFFF;\\n}\\n.webix_sidebar .webix_tree_item:hover {\\n background-color: #edeff5;\\n}\\n.webix_sidebar.webix_sidebar_left .webix_tree_item.webix_sidebar_selected + .webix_tree_leaves .webix_tree_item,\\n.webix_sidebar.webix_sidebar_left .webix_tree_item.webix_selected,\\n.webix_sidebar.webix_sidebar_left .webix_tree_item.webix_sidebar_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_sidebar.webix_sidebar_right .webix_tree_item.webix_sidebar_selected + .webix_tree_leaves .webix_tree_item,\\n.webix_sidebar.webix_sidebar_right .webix_tree_item.webix_selected,\\n.webix_sidebar.webix_sidebar_right .webix_tree_item.webix_sidebar_selected {\\n box-shadow: inset -2px 0 #1CA1C1;\\n}\\n.webix_sidebar .webix_tree_branch_1 {\\n border: none;\\n}\\n.webix_sidebar .webix_tree_branch_1 .webix_tree_item {\\n padding-right: 12px;\\n}\\n.webix_sidebar .webix_tree_branch_1 > .webix_tree_item {\\n padding-left: 12px;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected .webix_sidebar_icon,\\n.webix_sidebar .webix_tree_item .webix_sidebar_icon {\\n margin-right: 8px;\\n}\\n.webix_sidebar .webix_sidebar_icon {\\n width: 20px;\\n vertical-align: middle;\\n}\\n.webix_sidebar .webix_sidebar_icon,\\n.webix_sidebar .webix_sidebar_dir_icon {\\n color: #94A1B3;\\n font-size: 20px;\\n}\\n.webix_sidebar .webix_tree_item,\\n.webix_sidebar .webix_tree_branch_1 > .webix_tree_item {\\n color: #475466;\\n cursor: pointer;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected,\\n.webix_sidebar .webix_tree_item.webix_sidebar_selected {\\n color: #1CA1C1;\\n background-color: #F4F5F9;\\n font-weight: 500;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected .webix_sidebar_icon,\\n.webix_sidebar .webix_tree_item.webix_sidebar_selected .webix_sidebar_icon,\\n.webix_sidebar .webix_tree_item.webix_selected .webix_sidebar_dir_icon,\\n.webix_sidebar .webix_tree_item.webix_sidebar_selected .webix_sidebar_dir_icon {\\n color: #1CA1C1;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected span {\\n background-color: transparent;\\n color: #1CA1C1;\\n}\\n.webix_sidebar.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected {\\n background-color: transparent;\\n}\\n.webix_sidebar.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected:hover {\\n background-color: #edeff5;\\n}\\n.webix_sidebar_popup_list .webix_list_item,\\n.webix_sidebar_popup_list .webix_list_item:first-child {\\n border-width: 0px;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_sidebar_selected {\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_sidebar_selected:hover {\\n background-color: #F4F5F9 !important;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_selected {\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_sidebar_popup_list .webix_tree_branch_1 > .webix_tree_item {\\n height: 44px;\\n line-height: 44px;\\n}\\n.webix_sidebar_popup_left .webix_list_item.webix_selected,\\n.webix_sidebar_popup_left .webix_list_item.webix_sidebar_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_sidebar_popup_right .webix_list_item.webix_selected,\\n.webix_sidebar_popup_right .webix_list_item.webix_sidebar_selected {\\n box-shadow: inset -2px 0 #1CA1C1;\\n}\\n.webix_sidebar_popup_list.webix_sidebar_popup_right .webix_icon {\\n margin-left: -8px;\\n}\\n.webix_sidebar_popup.webix_sidebar_popup_left,\\n.webix_sidebar_popup.webix_sidebar_popup_right {\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_sidebar_popup.webix_sidebar_popup_right .webix_sidebar_popup_right {\\n box-shadow: none;\\n}\\n.webix_sidebar_popup .webix_sidebar_popup_title {\\n background-color: #F4F5F9;\\n}\\n.webix_sidebar_popup .webix_sidebar_popup_title .webix_template {\\n border: none;\\n line-height: 44px;\\n}\\n.webix_sidebar_popup .webix_sidebar_popup_title.webix_selected {\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_sidebar_popup_right {\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_sidebar.webix_dark {\\n border-color: #4A4E58;\\n background-color: #4A4E58;\\n}\\n.webix_sidebar.webix_dark .webix_tree_item {\\n color: #FFFFFF;\\n}\\n.webix_sidebar.webix_dark .webix_tree_item:hover {\\n background-color: #33353c;\\n}\\n.webix_sidebar.webix_dark .webix_tree_item.webix_selected,\\n.webix_sidebar.webix_dark .webix_tree_item.webix_sidebar_selected {\\n color: #1CA1C1;\\n background-color: #373a42;\\n}\\n.webix_sidebar.webix_dark.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected {\\n background-color: transparent;\\n}\\n.webix_sidebar.webix_dark.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected:hover {\\n background-color: #33353c;\\n}\\n.webix_sidebar_popup.webix_dark .webix_sidebar_popup_title {\\n background-color: #373a42;\\n}\\n.webix_sidebar_popup.webix_dark .webix_sidebar_popup_title .webix_template {\\n border-color: #373a42;\\n color: #FFFFFF;\\n}\\n.webix_sidebar_popup.webix_dark .webix_sidebar_popup_title.webix_selected .webix_template {\\n color: #1CA1C1;\\n}\\n.webix_sidebar_popup_list.webix_dark {\\n background-color: #4A4E58;\\n border-color: #373a42;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item {\\n background: #4A4E58;\\n color: #FFFFFF;\\n border-color: #373a42;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_selected,\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_sidebar_selected {\\n background-color: #373a42;\\n color: #1CA1C1;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item:hover {\\n background-color: #33353c;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_selected {\\n background-color: #373a42;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_sidebar_selected:hover {\\n background-color: #373a42 !important;\\n}\\n.webix_sidebar_popup.webix_dark {\\n border-color: #373a42;\\n}\\n.webix_list_item.webix_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_list_item.webix_disabled {\\n color: #94A1B3;\\n}\\n.webix_list_item.webix_selected.webix_disabled {\\n box-shadow: inset 2px 0 #94A1B3;\\n}\\n.webix_list_item .webix_icon {\\n font-size: 20px;\\n}\\n.webix_list-x .webix_list_item.webix_selected {\\n box-shadow: none;\\n border-left: none;\\n padding-left: 12px;\\n}\\n.webix_header > div {\\n padding-left: 12px;\\n}\\n.webix_icon,\\n.webix_icon_btn,\\n.webix_input_icon {\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_icon_button {\\n position: relative;\\n z-index: 0;\\n}\\n.webix_icon_button:before {\\n content: '';\\n opacity: 0;\\n position: absolute;\\n transition-duration: 0.15s;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n z-index: -1;\\n bottom: 0px;\\n left: 0px;\\n right: 0px;\\n top: 0px;\\n border-radius: 50%;\\n transform: scale(0);\\n transition-property: transform, opacity;\\n}\\n.webix_icon_button:hover .webix_icon,\\n.webix_icon_button:focus .webix_icon {\\n color: #475466;\\n}\\n.webix_icon_button:hover:before {\\n background-color: #F4F5F9;\\n opacity: 1;\\n transform: scale(1);\\n}\\n.webix_icon_btn,\\n.webix_input_icon {\\n width: 20px;\\n}\\n.webix_img_btn_top .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_icon_btn {\\n vertical-align: text-bottom;\\n}\\n.webix_resize_frame {\\n box-shadow: 0 2px 6px 0 #000, 0 1px 4px 0 #000;\\n}\\n.webix_tooltip {\\n padding: 4px 8px;\\n background-color: #475466;\\n color: #FFFFFF;\\n font-weight: 500;\\n line-height: 20px;\\n border-radius: 2px;\\n border: none;\\n}\\n.portlet_marker,\\n.portlet_markertop,\\n.portlet_markerbottom,\\n.portlet_markerleft,\\n.portlet_markerright {\\n background: #1CA1C1;\\n}\\n.webix_treemap_item:hover {\\n box-shadow: inset 0 0 0 1px #5ccce7;\\n}\\n.webix_treemap_item.webix_selected {\\n border-color: inherit;\\n box-shadow: inset 0 0 0 2px #1CA1C1;\\n}\\n.webixlabel {\\n font-weight: 500;\\n}\\n.webixtoolbarlabel {\\n letter-spacing: 0;\\n}\\n.webix_inp_label,\\n.webix_inp_top_label,\\nlegend.webix_forminput_label,\\n.webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_inp_label,\\n.webix_forminput_label {\\n padding-right: 8px;\\n}\\n.webix_label_right {\\n padding-left: 4px;\\n}\\n.webix_el_checkbox .webix_label_right {\\n display: block;\\n}\\n.webix_richtext .webix_richtext_container {\\n box-shadow: inset 0 1px #DADEE0;\\n}\\n.webix_dbllist .bottom_label {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #94A1B3;\\n letter-spacing: 0.2px;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_left,\\n.webix_popup.webix_sidemenu.webix_sidemenu_right,\\n.webix_popup.webix_sidemenu.webix_sidemenu_top,\\n.webix_popup.webix_sidemenu.webix_sidemenu_bottom {\\n border: none;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_chart .webix_chart_legend_item,\\n.webix_chart .webix_canvas_text,\\n.webix_chart .webix_axis_title_x,\\n.webix_chart .webix_axis_title_y {\\n font-family: Roboto, sans-serif;\\n font-size: 12px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_chart .webix_canvas_text.webix_axis_item_x,\\n.webix_chart .webix_canvas_text.webix_axis_item_y,\\n.webix_chart .webix_axis_title_x,\\n.webix_chart .webix_axis_title_y,\\n.webix_chart .webix_canvas_text.webix_axis_radar_title {\\n color: #94A1B3;\\n}\\n.webix_bullet_scale {\\n fill: #94A1B3;\\n font-size: 12px;\\n}\\n.webix_bullet_scale_lines {\\n stroke: #94A1B3;\\n}\\n.webix_toolbar.pdf_bar {\\n background-color: #474747;\\n}\\n.webix_toolbar.pdf_bar .webix_icon_btn {\\n font-size: 20px;\\n vertical-align: middle;\\n}\\n.webix_toolbar.pdf_bar .webix_img_btn:focus,\\n.webix_toolbar.pdf_bar .webix_img_btn:hover {\\n background-color: #333333;\\n}\\n.invalidStyle {\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n}\\n.webix_list_item.webix_invalid,\\n.webix_tree_item.webix_invalid,\\n.webix_dataview_item.webix_invalid,\\n.webix_cell.webix_invalid {\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n}\\n.webix_invalid .webix_el_box input,\\n.webix_invalid .webix_el_box .webix_inp_static,\\n.webix_invalid .webix_el_box select,\\n.webix_invalid .webix_el_box textarea,\\ninput.webix_invalid,\\nselect.webix_invalid,\\ntextarea.webix_invalid {\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n border-color: #ff8d82;\\n}\\n.webix_invalid .webix_inp_bottom_label {\\n color: #FF5C4C;\\n}\\n.webix_nav_panel .webix_nav_item {\\n background-color: transparent;\\n border-color: rgba(255, 255, 255, 0.4);\\n opacity: 1;\\n}\\n.webix_nav_panel .webix_nav_item:hover {\\n border-color: rgba(255, 255, 255, 0.6);\\n}\\n.webix_nav_panel .webix_nav_active {\\n background-color: #FFFFFF;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 1;\\n background-image: none;\\n text-align: center;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n color: #FFFFFF;\\n border-radius: 50%;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_nav_button_next .webix_nav_button_inner:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n transition: 0.15s;\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 1;\\n text-align: center;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 48px;\\n color: #FFFFFF;\\n background: rgba(0, 0, 0, 0.2);\\n border-radius: 2px;\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n background: rgba(0, 0, 0, 0.4);\\n}\\n.webix_nav_button_side.webix_nav_button_next {\\n right: 0;\\n}\\n.webix_nav_button_side.webix_nav_button_prev {\\n left: 0;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner:before {\\n content: \\\"\\\\F002\\\";\\n}\\n.webix_nav_button_next .webix_nav_button_inner:before {\\n content: \\\"\\\\F003\\\";\\n}\\n.webix_dark .webix_nav_item {\\n border-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_dark .webix_nav_item:hover {\\n border-color: rgba(0, 0, 0, 0.6);\\n}\\n.webix_dark .webix_nav_inactive {\\n background-color: transparent;\\n}\\n.webix_dark .webix_nav_active {\\n background-color: #000000;\\n}\\n.webix_dark .webix_nav_active:hover,\\n.webix_dark .webix_nav_active:focus {\\n box-shadow: 0 0 2px #000;\\n}\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner,\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner {\\n background-image: none;\\n color: #313131;\\n}\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner:focus {\\n background-color: rgba(255, 255, 255, 0.2);\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n background: rgba(255, 255, 255, 0.2);\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n background: rgba(255, 255, 255, 0.4);\\n}\\n.webix_skin_mark {\\n height: 230px;\\n}\\n/* based on MaterialDesignIcons.com */\\n@font-face {\\n font-family: \\\"Webix Material Icons\\\";\\n src: url('fonts/webixmdi-webfont.woff2') format('woff2'), url('fonts/webixmdi-webfont.woff') format('woff');\\n font-weight: normal;\\n font-style: normal;\\n}\\n/* icons collection common for above fonts*/\\n.wxi-angle-down:before {\\n content: \\\"\\\\F001\\\";\\n}\\n.wxi-angle-left:before {\\n content: \\\"\\\\F002\\\";\\n}\\n.wxi-angle-right:before {\\n content: \\\"\\\\F003\\\";\\n}\\n.wxi-angle-up:before {\\n content: \\\"\\\\F004\\\";\\n}\\n.wxi-angle-double-right:before {\\n content: \\\"\\\\F005\\\";\\n}\\n.wxi-angle-double-left:before {\\n content: \\\"\\\\F006\\\";\\n}\\n.wxi-clock:before {\\n content: \\\"\\\\F007\\\";\\n}\\n.wxi-calendar:before {\\n content: \\\"\\\\F008\\\";\\n}\\n.wxi-search:before {\\n content: \\\"\\\\F009\\\";\\n}\\n.wxi-dots:before {\\n content: \\\"\\\\F010\\\";\\n}\\n.wxi-close:before {\\n content: \\\"\\\\F011\\\";\\n}\\n.wxi-checkbox-marked:before {\\n content: \\\"\\\\F012\\\";\\n}\\n.wxi-checkbox-blank:before {\\n content: \\\"\\\\F013\\\";\\n}\\n.wxi-trash:before {\\n content: \\\"\\\\F014\\\";\\n}\\n.wxi-pencil:before {\\n content: \\\"\\\\F015\\\";\\n}\\n.wxi-eye:before {\\n content: \\\"\\\\F016\\\";\\n}\\n.wxi-eye-slash:before {\\n content: \\\"\\\\F017\\\";\\n}\\n.wxi-columns:before {\\n content: \\\"\\\\F018\\\";\\n}\\n.wxi-drag:before {\\n content: \\\"\\\\F019\\\";\\n}\\n.wxi-check:before {\\n content: \\\"\\\\F020\\\";\\n}\\n.wxi-underline:before {\\n content: \\\"\\\\F021\\\";\\n}\\n.wxi-bold:before {\\n content: \\\"\\\\F022\\\";\\n}\\n.wxi-italic:before {\\n content: \\\"\\\\F023\\\";\\n}\\n.wxi-sync:before {\\n content: \\\"\\\\F024\\\";\\n}\\n.wxi-plus-square:before {\\n content: \\\"\\\\F025\\\";\\n}\\n.wxi-minus-square:before {\\n content: \\\"\\\\F026\\\";\\n}\\n.wxi-menu-down:before {\\n content: \\\"\\\\F027\\\";\\n}\\n.wxi-menu-right:before {\\n content: \\\"\\\\F028\\\";\\n}\\n.wxi-menu-left:before {\\n content: \\\"\\\\F029\\\";\\n}\\n.wxi-folder:before {\\n content: \\\"\\\\F030\\\";\\n}\\n.wxi-folder-open:before {\\n content: \\\"\\\\F031\\\";\\n}\\n.wxi-file:before {\\n content: \\\"\\\\F032\\\";\\n}\\n.wxi-close-circle:before {\\n content: \\\"\\\\F033\\\";\\n}\\n.wxi-alert:before {\\n content: \\\"\\\\F034\\\";\\n}\\n.wxi-radiobox-blank:before {\\n content: \\\"\\\\F035\\\";\\n}\\n.wxi-radiobox-marked:before {\\n content: \\\"\\\\F036\\\";\\n}\\n.wxi-angle-double-down:before {\\n content: \\\"\\\\F037\\\";\\n}\\n.wxi-angle-double-up:before {\\n content: \\\"\\\\F038\\\";\\n}\\n.wxi-plus-circle:before {\\n content: \\\"\\\\F039\\\";\\n}\\n.wxi-minus-circle:before {\\n content: \\\"\\\\F040\\\";\\n}\\n.wxi-plus:before {\\n content: \\\"\\\\F041\\\";\\n}\\n.wxi-minus:before {\\n content: \\\"\\\\F042\\\";\\n}\\n.wxi-download:before {\\n content: \\\"\\\\F043\\\";\\n}\\n.wxi-user:before {\\n content: \\\"\\\\F044\\\";\\n}\\n.wxi-filter:before {\\n content: \\\"\\\\F045\\\";\\n}\\n.wxi-menu-up:before {\\n content: \\\"\\\\F046\\\";\\n}\\n/*predefined styles for text lables inside a item*/\\n.webix_strong {\\n font-weight: 500;\\n white-space: nowrap;\\n}\\n.webix_light {\\n color: #b3b3b3;\\n}\\n/*contr-styles for bootstrap*/\\n.webix_view,\\n.webix_input_icon {\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n}\\n.webix_view.webix_el_label {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_inp_label,\\n.webix_inp_top_label,\\n.webix_label_right {\\n margin-bottom: 0px;\\n}\\n.webix_view table {\\n border-collapse: initial;\\n}\\n/* Spin*/\\n.webix_spin {\\n animation: webix_spin 2s infinite linear;\\n}\\n@-webkit-keyframes webix_spin {\\n 0% {\\n transform: rotate(0deg);\\n }\\n 100% {\\n transform: rotate(359deg);\\n }\\n}\\n@keyframes webix_spin {\\n 0% {\\n transform: rotate(0deg);\\n }\\n 100% {\\n transform: rotate(359deg);\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/*!\\n * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\\n * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\\n */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\\\";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\\\";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\\\";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\\\";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\\\"\\\\f000\\\"}.fa-music:before{content:\\\"\\\\f001\\\"}.fa-search:before{content:\\\"\\\\f002\\\"}.fa-envelope-o:before{content:\\\"\\\\f003\\\"}.fa-heart:before{content:\\\"\\\\f004\\\"}.fa-star:before{content:\\\"\\\\f005\\\"}.fa-star-o:before{content:\\\"\\\\f006\\\"}.fa-user:before{content:\\\"\\\\f007\\\"}.fa-film:before{content:\\\"\\\\f008\\\"}.fa-th-large:before{content:\\\"\\\\f009\\\"}.fa-th:before{content:\\\"\\\\f00a\\\"}.fa-th-list:before{content:\\\"\\\\f00b\\\"}.fa-check:before{content:\\\"\\\\f00c\\\"}.fa-remove:before,.fa-close:before,.fa-times:before{content:\\\"\\\\f00d\\\"}.fa-search-plus:before{content:\\\"\\\\f00e\\\"}.fa-search-minus:before{content:\\\"\\\\f010\\\"}.fa-power-off:before{content:\\\"\\\\f011\\\"}.fa-signal:before{content:\\\"\\\\f012\\\"}.fa-gear:before,.fa-cog:before{content:\\\"\\\\f013\\\"}.fa-trash-o:before{content:\\\"\\\\f014\\\"}.fa-home:before{content:\\\"\\\\f015\\\"}.fa-file-o:before{content:\\\"\\\\f016\\\"}.fa-clock-o:before{content:\\\"\\\\f017\\\"}.fa-road:before{content:\\\"\\\\f018\\\"}.fa-download:before{content:\\\"\\\\f019\\\"}.fa-arrow-circle-o-down:before{content:\\\"\\\\f01a\\\"}.fa-arrow-circle-o-up:before{content:\\\"\\\\f01b\\\"}.fa-inbox:before{content:\\\"\\\\f01c\\\"}.fa-play-circle-o:before{content:\\\"\\\\f01d\\\"}.fa-rotate-right:before,.fa-repeat:before{content:\\\"\\\\f01e\\\"}.fa-refresh:before{content:\\\"\\\\f021\\\"}.fa-list-alt:before{content:\\\"\\\\f022\\\"}.fa-lock:before{content:\\\"\\\\f023\\\"}.fa-flag:before{content:\\\"\\\\f024\\\"}.fa-headphones:before{content:\\\"\\\\f025\\\"}.fa-volume-off:before{content:\\\"\\\\f026\\\"}.fa-volume-down:before{content:\\\"\\\\f027\\\"}.fa-volume-up:before{content:\\\"\\\\f028\\\"}.fa-qrcode:before{content:\\\"\\\\f029\\\"}.fa-barcode:before{content:\\\"\\\\f02a\\\"}.fa-tag:before{content:\\\"\\\\f02b\\\"}.fa-tags:before{content:\\\"\\\\f02c\\\"}.fa-book:before{content:\\\"\\\\f02d\\\"}.fa-bookmark:before{content:\\\"\\\\f02e\\\"}.fa-print:before{content:\\\"\\\\f02f\\\"}.fa-camera:before{content:\\\"\\\\f030\\\"}.fa-font:before{content:\\\"\\\\f031\\\"}.fa-bold:before{content:\\\"\\\\f032\\\"}.fa-italic:before{content:\\\"\\\\f033\\\"}.fa-text-height:before{content:\\\"\\\\f034\\\"}.fa-text-width:before{content:\\\"\\\\f035\\\"}.fa-align-left:before{content:\\\"\\\\f036\\\"}.fa-align-center:before{content:\\\"\\\\f037\\\"}.fa-align-right:before{content:\\\"\\\\f038\\\"}.fa-align-justify:before{content:\\\"\\\\f039\\\"}.fa-list:before{content:\\\"\\\\f03a\\\"}.fa-dedent:before,.fa-outdent:before{content:\\\"\\\\f03b\\\"}.fa-indent:before{content:\\\"\\\\f03c\\\"}.fa-video-camera:before{content:\\\"\\\\f03d\\\"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:\\\"\\\\f03e\\\"}.fa-pencil:before{content:\\\"\\\\f040\\\"}.fa-map-marker:before{content:\\\"\\\\f041\\\"}.fa-adjust:before{content:\\\"\\\\f042\\\"}.fa-tint:before{content:\\\"\\\\f043\\\"}.fa-edit:before,.fa-pencil-square-o:before{content:\\\"\\\\f044\\\"}.fa-share-square-o:before{content:\\\"\\\\f045\\\"}.fa-check-square-o:before{content:\\\"\\\\f046\\\"}.fa-arrows:before{content:\\\"\\\\f047\\\"}.fa-step-backward:before{content:\\\"\\\\f048\\\"}.fa-fast-backward:before{content:\\\"\\\\f049\\\"}.fa-backward:before{content:\\\"\\\\f04a\\\"}.fa-play:before{content:\\\"\\\\f04b\\\"}.fa-pause:before{content:\\\"\\\\f04c\\\"}.fa-stop:before{content:\\\"\\\\f04d\\\"}.fa-forward:before{content:\\\"\\\\f04e\\\"}.fa-fast-forward:before{content:\\\"\\\\f050\\\"}.fa-step-forward:before{content:\\\"\\\\f051\\\"}.fa-eject:before{content:\\\"\\\\f052\\\"}.fa-chevron-left:before{content:\\\"\\\\f053\\\"}.fa-chevron-right:before{content:\\\"\\\\f054\\\"}.fa-plus-circle:before{content:\\\"\\\\f055\\\"}.fa-minus-circle:before{content:\\\"\\\\f056\\\"}.fa-times-circle:before{content:\\\"\\\\f057\\\"}.fa-check-circle:before{content:\\\"\\\\f058\\\"}.fa-question-circle:before{content:\\\"\\\\f059\\\"}.fa-info-circle:before{content:\\\"\\\\f05a\\\"}.fa-crosshairs:before{content:\\\"\\\\f05b\\\"}.fa-times-circle-o:before{content:\\\"\\\\f05c\\\"}.fa-check-circle-o:before{content:\\\"\\\\f05d\\\"}.fa-ban:before{content:\\\"\\\\f05e\\\"}.fa-arrow-left:before{content:\\\"\\\\f060\\\"}.fa-arrow-right:before{content:\\\"\\\\f061\\\"}.fa-arrow-up:before{content:\\\"\\\\f062\\\"}.fa-arrow-down:before{content:\\\"\\\\f063\\\"}.fa-mail-forward:before,.fa-share:before{content:\\\"\\\\f064\\\"}.fa-expand:before{content:\\\"\\\\f065\\\"}.fa-compress:before{content:\\\"\\\\f066\\\"}.fa-plus:before{content:\\\"\\\\f067\\\"}.fa-minus:before{content:\\\"\\\\f068\\\"}.fa-asterisk:before{content:\\\"\\\\f069\\\"}.fa-exclamation-circle:before{content:\\\"\\\\f06a\\\"}.fa-gift:before{content:\\\"\\\\f06b\\\"}.fa-leaf:before{content:\\\"\\\\f06c\\\"}.fa-fire:before{content:\\\"\\\\f06d\\\"}.fa-eye:before{content:\\\"\\\\f06e\\\"}.fa-eye-slash:before{content:\\\"\\\\f070\\\"}.fa-warning:before,.fa-exclamation-triangle:before{content:\\\"\\\\f071\\\"}.fa-plane:before{content:\\\"\\\\f072\\\"}.fa-calendar:before{content:\\\"\\\\f073\\\"}.fa-random:before{content:\\\"\\\\f074\\\"}.fa-comment:before{content:\\\"\\\\f075\\\"}.fa-magnet:before{content:\\\"\\\\f076\\\"}.fa-chevron-up:before{content:\\\"\\\\f077\\\"}.fa-chevron-down:before{content:\\\"\\\\f078\\\"}.fa-retweet:before{content:\\\"\\\\f079\\\"}.fa-shopping-cart:before{content:\\\"\\\\f07a\\\"}.fa-folder:before{content:\\\"\\\\f07b\\\"}.fa-folder-open:before{content:\\\"\\\\f07c\\\"}.fa-arrows-v:before{content:\\\"\\\\f07d\\\"}.fa-arrows-h:before{content:\\\"\\\\f07e\\\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\\\"\\\\f080\\\"}.fa-twitter-square:before{content:\\\"\\\\f081\\\"}.fa-facebook-square:before{content:\\\"\\\\f082\\\"}.fa-camera-retro:before{content:\\\"\\\\f083\\\"}.fa-key:before{content:\\\"\\\\f084\\\"}.fa-gears:before,.fa-cogs:before{content:\\\"\\\\f085\\\"}.fa-comments:before{content:\\\"\\\\f086\\\"}.fa-thumbs-o-up:before{content:\\\"\\\\f087\\\"}.fa-thumbs-o-down:before{content:\\\"\\\\f088\\\"}.fa-star-half:before{content:\\\"\\\\f089\\\"}.fa-heart-o:before{content:\\\"\\\\f08a\\\"}.fa-sign-out:before{content:\\\"\\\\f08b\\\"}.fa-linkedin-square:before{content:\\\"\\\\f08c\\\"}.fa-thumb-tack:before{content:\\\"\\\\f08d\\\"}.fa-external-link:before{content:\\\"\\\\f08e\\\"}.fa-sign-in:before{content:\\\"\\\\f090\\\"}.fa-trophy:before{content:\\\"\\\\f091\\\"}.fa-github-square:before{content:\\\"\\\\f092\\\"}.fa-upload:before{content:\\\"\\\\f093\\\"}.fa-lemon-o:before{content:\\\"\\\\f094\\\"}.fa-phone:before{content:\\\"\\\\f095\\\"}.fa-square-o:before{content:\\\"\\\\f096\\\"}.fa-bookmark-o:before{content:\\\"\\\\f097\\\"}.fa-phone-square:before{content:\\\"\\\\f098\\\"}.fa-twitter:before{content:\\\"\\\\f099\\\"}.fa-facebook-f:before,.fa-facebook:before{content:\\\"\\\\f09a\\\"}.fa-github:before{content:\\\"\\\\f09b\\\"}.fa-unlock:before{content:\\\"\\\\f09c\\\"}.fa-credit-card:before{content:\\\"\\\\f09d\\\"}.fa-feed:before,.fa-rss:before{content:\\\"\\\\f09e\\\"}.fa-hdd-o:before{content:\\\"\\\\f0a0\\\"}.fa-bullhorn:before{content:\\\"\\\\f0a1\\\"}.fa-bell:before{content:\\\"\\\\f0f3\\\"}.fa-certificate:before{content:\\\"\\\\f0a3\\\"}.fa-hand-o-right:before{content:\\\"\\\\f0a4\\\"}.fa-hand-o-left:before{content:\\\"\\\\f0a5\\\"}.fa-hand-o-up:before{content:\\\"\\\\f0a6\\\"}.fa-hand-o-down:before{content:\\\"\\\\f0a7\\\"}.fa-arrow-circle-left:before{content:\\\"\\\\f0a8\\\"}.fa-arrow-circle-right:before{content:\\\"\\\\f0a9\\\"}.fa-arrow-circle-up:before{content:\\\"\\\\f0aa\\\"}.fa-arrow-circle-down:before{content:\\\"\\\\f0ab\\\"}.fa-globe:before{content:\\\"\\\\f0ac\\\"}.fa-wrench:before{content:\\\"\\\\f0ad\\\"}.fa-tasks:before{content:\\\"\\\\f0ae\\\"}.fa-filter:before{content:\\\"\\\\f0b0\\\"}.fa-briefcase:before{content:\\\"\\\\f0b1\\\"}.fa-arrows-alt:before{content:\\\"\\\\f0b2\\\"}.fa-group:before,.fa-users:before{content:\\\"\\\\f0c0\\\"}.fa-chain:before,.fa-link:before{content:\\\"\\\\f0c1\\\"}.fa-cloud:before{content:\\\"\\\\f0c2\\\"}.fa-flask:before{content:\\\"\\\\f0c3\\\"}.fa-cut:before,.fa-scissors:before{content:\\\"\\\\f0c4\\\"}.fa-copy:before,.fa-files-o:before{content:\\\"\\\\f0c5\\\"}.fa-paperclip:before{content:\\\"\\\\f0c6\\\"}.fa-save:before,.fa-floppy-o:before{content:\\\"\\\\f0c7\\\"}.fa-square:before{content:\\\"\\\\f0c8\\\"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:\\\"\\\\f0c9\\\"}.fa-list-ul:before{content:\\\"\\\\f0ca\\\"}.fa-list-ol:before{content:\\\"\\\\f0cb\\\"}.fa-strikethrough:before{content:\\\"\\\\f0cc\\\"}.fa-underline:before{content:\\\"\\\\f0cd\\\"}.fa-table:before{content:\\\"\\\\f0ce\\\"}.fa-magic:before{content:\\\"\\\\f0d0\\\"}.fa-truck:before{content:\\\"\\\\f0d1\\\"}.fa-pinterest:before{content:\\\"\\\\f0d2\\\"}.fa-pinterest-square:before{content:\\\"\\\\f0d3\\\"}.fa-google-plus-square:before{content:\\\"\\\\f0d4\\\"}.fa-google-plus:before{content:\\\"\\\\f0d5\\\"}.fa-money:before{content:\\\"\\\\f0d6\\\"}.fa-caret-down:before{content:\\\"\\\\f0d7\\\"}.fa-caret-up:before{content:\\\"\\\\f0d8\\\"}.fa-caret-left:before{content:\\\"\\\\f0d9\\\"}.fa-caret-right:before{content:\\\"\\\\f0da\\\"}.fa-columns:before{content:\\\"\\\\f0db\\\"}.fa-unsorted:before,.fa-sort:before{content:\\\"\\\\f0dc\\\"}.fa-sort-down:before,.fa-sort-desc:before{content:\\\"\\\\f0dd\\\"}.fa-sort-up:before,.fa-sort-asc:before{content:\\\"\\\\f0de\\\"}.fa-envelope:before{content:\\\"\\\\f0e0\\\"}.fa-linkedin:before{content:\\\"\\\\f0e1\\\"}.fa-rotate-left:before,.fa-undo:before{content:\\\"\\\\f0e2\\\"}.fa-legal:before,.fa-gavel:before{content:\\\"\\\\f0e3\\\"}.fa-dashboard:before,.fa-tachometer:before{content:\\\"\\\\f0e4\\\"}.fa-comment-o:before{content:\\\"\\\\f0e5\\\"}.fa-comments-o:before{content:\\\"\\\\f0e6\\\"}.fa-flash:before,.fa-bolt:before{content:\\\"\\\\f0e7\\\"}.fa-sitemap:before{content:\\\"\\\\f0e8\\\"}.fa-umbrella:before{content:\\\"\\\\f0e9\\\"}.fa-paste:before,.fa-clipboard:before{content:\\\"\\\\f0ea\\\"}.fa-lightbulb-o:before{content:\\\"\\\\f0eb\\\"}.fa-exchange:before{content:\\\"\\\\f0ec\\\"}.fa-cloud-download:before{content:\\\"\\\\f0ed\\\"}.fa-cloud-upload:before{content:\\\"\\\\f0ee\\\"}.fa-user-md:before{content:\\\"\\\\f0f0\\\"}.fa-stethoscope:before{content:\\\"\\\\f0f1\\\"}.fa-suitcase:before{content:\\\"\\\\f0f2\\\"}.fa-bell-o:before{content:\\\"\\\\f0a2\\\"}.fa-coffee:before{content:\\\"\\\\f0f4\\\"}.fa-cutlery:before{content:\\\"\\\\f0f5\\\"}.fa-file-text-o:before{content:\\\"\\\\f0f6\\\"}.fa-building-o:before{content:\\\"\\\\f0f7\\\"}.fa-hospital-o:before{content:\\\"\\\\f0f8\\\"}.fa-ambulance:before{content:\\\"\\\\f0f9\\\"}.fa-medkit:before{content:\\\"\\\\f0fa\\\"}.fa-fighter-jet:before{content:\\\"\\\\f0fb\\\"}.fa-beer:before{content:\\\"\\\\f0fc\\\"}.fa-h-square:before{content:\\\"\\\\f0fd\\\"}.fa-plus-square:before{content:\\\"\\\\f0fe\\\"}.fa-angle-double-left:before{content:\\\"\\\\f100\\\"}.fa-angle-double-right:before{content:\\\"\\\\f101\\\"}.fa-angle-double-up:before{content:\\\"\\\\f102\\\"}.fa-angle-double-down:before{content:\\\"\\\\f103\\\"}.fa-angle-left:before{content:\\\"\\\\f104\\\"}.fa-angle-right:before{content:\\\"\\\\f105\\\"}.fa-angle-up:before{content:\\\"\\\\f106\\\"}.fa-angle-down:before{content:\\\"\\\\f107\\\"}.fa-desktop:before{content:\\\"\\\\f108\\\"}.fa-laptop:before{content:\\\"\\\\f109\\\"}.fa-tablet:before{content:\\\"\\\\f10a\\\"}.fa-mobile-phone:before,.fa-mobile:before{content:\\\"\\\\f10b\\\"}.fa-circle-o:before{content:\\\"\\\\f10c\\\"}.fa-quote-left:before{content:\\\"\\\\f10d\\\"}.fa-quote-right:before{content:\\\"\\\\f10e\\\"}.fa-spinner:before{content:\\\"\\\\f110\\\"}.fa-circle:before{content:\\\"\\\\f111\\\"}.fa-mail-reply:before,.fa-reply:before{content:\\\"\\\\f112\\\"}.fa-github-alt:before{content:\\\"\\\\f113\\\"}.fa-folder-o:before{content:\\\"\\\\f114\\\"}.fa-folder-open-o:before{content:\\\"\\\\f115\\\"}.fa-smile-o:before{content:\\\"\\\\f118\\\"}.fa-frown-o:before{content:\\\"\\\\f119\\\"}.fa-meh-o:before{content:\\\"\\\\f11a\\\"}.fa-gamepad:before{content:\\\"\\\\f11b\\\"}.fa-keyboard-o:before{content:\\\"\\\\f11c\\\"}.fa-flag-o:before{content:\\\"\\\\f11d\\\"}.fa-flag-checkered:before{content:\\\"\\\\f11e\\\"}.fa-terminal:before{content:\\\"\\\\f120\\\"}.fa-code:before{content:\\\"\\\\f121\\\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\\\"\\\\f122\\\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\\\"\\\\f123\\\"}.fa-location-arrow:before{content:\\\"\\\\f124\\\"}.fa-crop:before{content:\\\"\\\\f125\\\"}.fa-code-fork:before{content:\\\"\\\\f126\\\"}.fa-unlink:before,.fa-chain-broken:before{content:\\\"\\\\f127\\\"}.fa-question:before{content:\\\"\\\\f128\\\"}.fa-info:before{content:\\\"\\\\f129\\\"}.fa-exclamation:before{content:\\\"\\\\f12a\\\"}.fa-superscript:before{content:\\\"\\\\f12b\\\"}.fa-subscript:before{content:\\\"\\\\f12c\\\"}.fa-eraser:before{content:\\\"\\\\f12d\\\"}.fa-puzzle-piece:before{content:\\\"\\\\f12e\\\"}.fa-microphone:before{content:\\\"\\\\f130\\\"}.fa-microphone-slash:before{content:\\\"\\\\f131\\\"}.fa-shield:before{content:\\\"\\\\f132\\\"}.fa-calendar-o:before{content:\\\"\\\\f133\\\"}.fa-fire-extinguisher:before{content:\\\"\\\\f134\\\"}.fa-rocket:before{content:\\\"\\\\f135\\\"}.fa-maxcdn:before{content:\\\"\\\\f136\\\"}.fa-chevron-circle-left:before{content:\\\"\\\\f137\\\"}.fa-chevron-circle-right:before{content:\\\"\\\\f138\\\"}.fa-chevron-circle-up:before{content:\\\"\\\\f139\\\"}.fa-chevron-circle-down:before{content:\\\"\\\\f13a\\\"}.fa-html5:before{content:\\\"\\\\f13b\\\"}.fa-css3:before{content:\\\"\\\\f13c\\\"}.fa-anchor:before{content:\\\"\\\\f13d\\\"}.fa-unlock-alt:before{content:\\\"\\\\f13e\\\"}.fa-bullseye:before{content:\\\"\\\\f140\\\"}.fa-ellipsis-h:before{content:\\\"\\\\f141\\\"}.fa-ellipsis-v:before{content:\\\"\\\\f142\\\"}.fa-rss-square:before{content:\\\"\\\\f143\\\"}.fa-play-circle:before{content:\\\"\\\\f144\\\"}.fa-ticket:before{content:\\\"\\\\f145\\\"}.fa-minus-square:before{content:\\\"\\\\f146\\\"}.fa-minus-square-o:before{content:\\\"\\\\f147\\\"}.fa-level-up:before{content:\\\"\\\\f148\\\"}.fa-level-down:before{content:\\\"\\\\f149\\\"}.fa-check-square:before{content:\\\"\\\\f14a\\\"}.fa-pencil-square:before{content:\\\"\\\\f14b\\\"}.fa-external-link-square:before{content:\\\"\\\\f14c\\\"}.fa-share-square:before{content:\\\"\\\\f14d\\\"}.fa-compass:before{content:\\\"\\\\f14e\\\"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:\\\"\\\\f150\\\"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:\\\"\\\\f151\\\"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:\\\"\\\\f152\\\"}.fa-euro:before,.fa-eur:before{content:\\\"\\\\f153\\\"}.fa-gbp:before{content:\\\"\\\\f154\\\"}.fa-dollar:before,.fa-usd:before{content:\\\"\\\\f155\\\"}.fa-rupee:before,.fa-inr:before{content:\\\"\\\\f156\\\"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:\\\"\\\\f157\\\"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:\\\"\\\\f158\\\"}.fa-won:before,.fa-krw:before{content:\\\"\\\\f159\\\"}.fa-bitcoin:before,.fa-btc:before{content:\\\"\\\\f15a\\\"}.fa-file:before{content:\\\"\\\\f15b\\\"}.fa-file-text:before{content:\\\"\\\\f15c\\\"}.fa-sort-alpha-asc:before{content:\\\"\\\\f15d\\\"}.fa-sort-alpha-desc:before{content:\\\"\\\\f15e\\\"}.fa-sort-amount-asc:before{content:\\\"\\\\f160\\\"}.fa-sort-amount-desc:before{content:\\\"\\\\f161\\\"}.fa-sort-numeric-asc:before{content:\\\"\\\\f162\\\"}.fa-sort-numeric-desc:before{content:\\\"\\\\f163\\\"}.fa-thumbs-up:before{content:\\\"\\\\f164\\\"}.fa-thumbs-down:before{content:\\\"\\\\f165\\\"}.fa-youtube-square:before{content:\\\"\\\\f166\\\"}.fa-youtube:before{content:\\\"\\\\f167\\\"}.fa-xing:before{content:\\\"\\\\f168\\\"}.fa-xing-square:before{content:\\\"\\\\f169\\\"}.fa-youtube-play:before{content:\\\"\\\\f16a\\\"}.fa-dropbox:before{content:\\\"\\\\f16b\\\"}.fa-stack-overflow:before{content:\\\"\\\\f16c\\\"}.fa-instagram:before{content:\\\"\\\\f16d\\\"}.fa-flickr:before{content:\\\"\\\\f16e\\\"}.fa-adn:before{content:\\\"\\\\f170\\\"}.fa-bitbucket:before{content:\\\"\\\\f171\\\"}.fa-bitbucket-square:before{content:\\\"\\\\f172\\\"}.fa-tumblr:before{content:\\\"\\\\f173\\\"}.fa-tumblr-square:before{content:\\\"\\\\f174\\\"}.fa-long-arrow-down:before{content:\\\"\\\\f175\\\"}.fa-long-arrow-up:before{content:\\\"\\\\f176\\\"}.fa-long-arrow-left:before{content:\\\"\\\\f177\\\"}.fa-long-arrow-right:before{content:\\\"\\\\f178\\\"}.fa-apple:before{content:\\\"\\\\f179\\\"}.fa-windows:before{content:\\\"\\\\f17a\\\"}.fa-android:before{content:\\\"\\\\f17b\\\"}.fa-linux:before{content:\\\"\\\\f17c\\\"}.fa-dribbble:before{content:\\\"\\\\f17d\\\"}.fa-skype:before{content:\\\"\\\\f17e\\\"}.fa-foursquare:before{content:\\\"\\\\f180\\\"}.fa-trello:before{content:\\\"\\\\f181\\\"}.fa-female:before{content:\\\"\\\\f182\\\"}.fa-male:before{content:\\\"\\\\f183\\\"}.fa-gittip:before,.fa-gratipay:before{content:\\\"\\\\f184\\\"}.fa-sun-o:before{content:\\\"\\\\f185\\\"}.fa-moon-o:before{content:\\\"\\\\f186\\\"}.fa-archive:before{content:\\\"\\\\f187\\\"}.fa-bug:before{content:\\\"\\\\f188\\\"}.fa-vk:before{content:\\\"\\\\f189\\\"}.fa-weibo:before{content:\\\"\\\\f18a\\\"}.fa-renren:before{content:\\\"\\\\f18b\\\"}.fa-pagelines:before{content:\\\"\\\\f18c\\\"}.fa-stack-exchange:before{content:\\\"\\\\f18d\\\"}.fa-arrow-circle-o-right:before{content:\\\"\\\\f18e\\\"}.fa-arrow-circle-o-left:before{content:\\\"\\\\f190\\\"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:\\\"\\\\f191\\\"}.fa-dot-circle-o:before{content:\\\"\\\\f192\\\"}.fa-wheelchair:before{content:\\\"\\\\f193\\\"}.fa-vimeo-square:before{content:\\\"\\\\f194\\\"}.fa-turkish-lira:before,.fa-try:before{content:\\\"\\\\f195\\\"}.fa-plus-square-o:before{content:\\\"\\\\f196\\\"}.fa-space-shuttle:before{content:\\\"\\\\f197\\\"}.fa-slack:before{content:\\\"\\\\f198\\\"}.fa-envelope-square:before{content:\\\"\\\\f199\\\"}.fa-wordpress:before{content:\\\"\\\\f19a\\\"}.fa-openid:before{content:\\\"\\\\f19b\\\"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:\\\"\\\\f19c\\\"}.fa-mortar-board:before,.fa-graduation-cap:before{content:\\\"\\\\f19d\\\"}.fa-yahoo:before{content:\\\"\\\\f19e\\\"}.fa-google:before{content:\\\"\\\\f1a0\\\"}.fa-reddit:before{content:\\\"\\\\f1a1\\\"}.fa-reddit-square:before{content:\\\"\\\\f1a2\\\"}.fa-stumbleupon-circle:before{content:\\\"\\\\f1a3\\\"}.fa-stumbleupon:before{content:\\\"\\\\f1a4\\\"}.fa-delicious:before{content:\\\"\\\\f1a5\\\"}.fa-digg:before{content:\\\"\\\\f1a6\\\"}.fa-pied-piper-pp:before{content:\\\"\\\\f1a7\\\"}.fa-pied-piper-alt:before{content:\\\"\\\\f1a8\\\"}.fa-drupal:before{content:\\\"\\\\f1a9\\\"}.fa-joomla:before{content:\\\"\\\\f1aa\\\"}.fa-language:before{content:\\\"\\\\f1ab\\\"}.fa-fax:before{content:\\\"\\\\f1ac\\\"}.fa-building:before{content:\\\"\\\\f1ad\\\"}.fa-child:before{content:\\\"\\\\f1ae\\\"}.fa-paw:before{content:\\\"\\\\f1b0\\\"}.fa-spoon:before{content:\\\"\\\\f1b1\\\"}.fa-cube:before{content:\\\"\\\\f1b2\\\"}.fa-cubes:before{content:\\\"\\\\f1b3\\\"}.fa-behance:before{content:\\\"\\\\f1b4\\\"}.fa-behance-square:before{content:\\\"\\\\f1b5\\\"}.fa-steam:before{content:\\\"\\\\f1b6\\\"}.fa-steam-square:before{content:\\\"\\\\f1b7\\\"}.fa-recycle:before{content:\\\"\\\\f1b8\\\"}.fa-automobile:before,.fa-car:before{content:\\\"\\\\f1b9\\\"}.fa-cab:before,.fa-taxi:before{content:\\\"\\\\f1ba\\\"}.fa-tree:before{content:\\\"\\\\f1bb\\\"}.fa-spotify:before{content:\\\"\\\\f1bc\\\"}.fa-deviantart:before{content:\\\"\\\\f1bd\\\"}.fa-soundcloud:before{content:\\\"\\\\f1be\\\"}.fa-database:before{content:\\\"\\\\f1c0\\\"}.fa-file-pdf-o:before{content:\\\"\\\\f1c1\\\"}.fa-file-word-o:before{content:\\\"\\\\f1c2\\\"}.fa-file-excel-o:before{content:\\\"\\\\f1c3\\\"}.fa-file-powerpoint-o:before{content:\\\"\\\\f1c4\\\"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:\\\"\\\\f1c5\\\"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:\\\"\\\\f1c6\\\"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:\\\"\\\\f1c7\\\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\\\"\\\\f1c8\\\"}.fa-file-code-o:before{content:\\\"\\\\f1c9\\\"}.fa-vine:before{content:\\\"\\\\f1ca\\\"}.fa-codepen:before{content:\\\"\\\\f1cb\\\"}.fa-jsfiddle:before{content:\\\"\\\\f1cc\\\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:\\\"\\\\f1cd\\\"}.fa-circle-o-notch:before{content:\\\"\\\\f1ce\\\"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:\\\"\\\\f1d0\\\"}.fa-ge:before,.fa-empire:before{content:\\\"\\\\f1d1\\\"}.fa-git-square:before{content:\\\"\\\\f1d2\\\"}.fa-git:before{content:\\\"\\\\f1d3\\\"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:\\\"\\\\f1d4\\\"}.fa-tencent-weibo:before{content:\\\"\\\\f1d5\\\"}.fa-qq:before{content:\\\"\\\\f1d6\\\"}.fa-wechat:before,.fa-weixin:before{content:\\\"\\\\f1d7\\\"}.fa-send:before,.fa-paper-plane:before{content:\\\"\\\\f1d8\\\"}.fa-send-o:before,.fa-paper-plane-o:before{content:\\\"\\\\f1d9\\\"}.fa-history:before{content:\\\"\\\\f1da\\\"}.fa-circle-thin:before{content:\\\"\\\\f1db\\\"}.fa-header:before{content:\\\"\\\\f1dc\\\"}.fa-paragraph:before{content:\\\"\\\\f1dd\\\"}.fa-sliders:before{content:\\\"\\\\f1de\\\"}.fa-share-alt:before{content:\\\"\\\\f1e0\\\"}.fa-share-alt-square:before{content:\\\"\\\\f1e1\\\"}.fa-bomb:before{content:\\\"\\\\f1e2\\\"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:\\\"\\\\f1e3\\\"}.fa-tty:before{content:\\\"\\\\f1e4\\\"}.fa-binoculars:before{content:\\\"\\\\f1e5\\\"}.fa-plug:before{content:\\\"\\\\f1e6\\\"}.fa-slideshare:before{content:\\\"\\\\f1e7\\\"}.fa-twitch:before{content:\\\"\\\\f1e8\\\"}.fa-yelp:before{content:\\\"\\\\f1e9\\\"}.fa-newspaper-o:before{content:\\\"\\\\f1ea\\\"}.fa-wifi:before{content:\\\"\\\\f1eb\\\"}.fa-calculator:before{content:\\\"\\\\f1ec\\\"}.fa-paypal:before{content:\\\"\\\\f1ed\\\"}.fa-google-wallet:before{content:\\\"\\\\f1ee\\\"}.fa-cc-visa:before{content:\\\"\\\\f1f0\\\"}.fa-cc-mastercard:before{content:\\\"\\\\f1f1\\\"}.fa-cc-discover:before{content:\\\"\\\\f1f2\\\"}.fa-cc-amex:before{content:\\\"\\\\f1f3\\\"}.fa-cc-paypal:before{content:\\\"\\\\f1f4\\\"}.fa-cc-stripe:before{content:\\\"\\\\f1f5\\\"}.fa-bell-slash:before{content:\\\"\\\\f1f6\\\"}.fa-bell-slash-o:before{content:\\\"\\\\f1f7\\\"}.fa-trash:before{content:\\\"\\\\f1f8\\\"}.fa-copyright:before{content:\\\"\\\\f1f9\\\"}.fa-at:before{content:\\\"\\\\f1fa\\\"}.fa-eyedropper:before{content:\\\"\\\\f1fb\\\"}.fa-paint-brush:before{content:\\\"\\\\f1fc\\\"}.fa-birthday-cake:before{content:\\\"\\\\f1fd\\\"}.fa-area-chart:before{content:\\\"\\\\f1fe\\\"}.fa-pie-chart:before{content:\\\"\\\\f200\\\"}.fa-line-chart:before{content:\\\"\\\\f201\\\"}.fa-lastfm:before{content:\\\"\\\\f202\\\"}.fa-lastfm-square:before{content:\\\"\\\\f203\\\"}.fa-toggle-off:before{content:\\\"\\\\f204\\\"}.fa-toggle-on:before{content:\\\"\\\\f205\\\"}.fa-bicycle:before{content:\\\"\\\\f206\\\"}.fa-bus:before{content:\\\"\\\\f207\\\"}.fa-ioxhost:before{content:\\\"\\\\f208\\\"}.fa-angellist:before{content:\\\"\\\\f209\\\"}.fa-cc:before{content:\\\"\\\\f20a\\\"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:\\\"\\\\f20b\\\"}.fa-meanpath:before{content:\\\"\\\\f20c\\\"}.fa-buysellads:before{content:\\\"\\\\f20d\\\"}.fa-connectdevelop:before{content:\\\"\\\\f20e\\\"}.fa-dashcube:before{content:\\\"\\\\f210\\\"}.fa-forumbee:before{content:\\\"\\\\f211\\\"}.fa-leanpub:before{content:\\\"\\\\f212\\\"}.fa-sellsy:before{content:\\\"\\\\f213\\\"}.fa-shirtsinbulk:before{content:\\\"\\\\f214\\\"}.fa-simplybuilt:before{content:\\\"\\\\f215\\\"}.fa-skyatlas:before{content:\\\"\\\\f216\\\"}.fa-cart-plus:before{content:\\\"\\\\f217\\\"}.fa-cart-arrow-down:before{content:\\\"\\\\f218\\\"}.fa-diamond:before{content:\\\"\\\\f219\\\"}.fa-ship:before{content:\\\"\\\\f21a\\\"}.fa-user-secret:before{content:\\\"\\\\f21b\\\"}.fa-motorcycle:before{content:\\\"\\\\f21c\\\"}.fa-street-view:before{content:\\\"\\\\f21d\\\"}.fa-heartbeat:before{content:\\\"\\\\f21e\\\"}.fa-venus:before{content:\\\"\\\\f221\\\"}.fa-mars:before{content:\\\"\\\\f222\\\"}.fa-mercury:before{content:\\\"\\\\f223\\\"}.fa-intersex:before,.fa-transgender:before{content:\\\"\\\\f224\\\"}.fa-transgender-alt:before{content:\\\"\\\\f225\\\"}.fa-venus-double:before{content:\\\"\\\\f226\\\"}.fa-mars-double:before{content:\\\"\\\\f227\\\"}.fa-venus-mars:before{content:\\\"\\\\f228\\\"}.fa-mars-stroke:before{content:\\\"\\\\f229\\\"}.fa-mars-stroke-v:before{content:\\\"\\\\f22a\\\"}.fa-mars-stroke-h:before{content:\\\"\\\\f22b\\\"}.fa-neuter:before{content:\\\"\\\\f22c\\\"}.fa-genderless:before{content:\\\"\\\\f22d\\\"}.fa-facebook-official:before{content:\\\"\\\\f230\\\"}.fa-pinterest-p:before{content:\\\"\\\\f231\\\"}.fa-whatsapp:before{content:\\\"\\\\f232\\\"}.fa-server:before{content:\\\"\\\\f233\\\"}.fa-user-plus:before{content:\\\"\\\\f234\\\"}.fa-user-times:before{content:\\\"\\\\f235\\\"}.fa-hotel:before,.fa-bed:before{content:\\\"\\\\f236\\\"}.fa-viacoin:before{content:\\\"\\\\f237\\\"}.fa-train:before{content:\\\"\\\\f238\\\"}.fa-subway:before{content:\\\"\\\\f239\\\"}.fa-medium:before{content:\\\"\\\\f23a\\\"}.fa-yc:before,.fa-y-combinator:before{content:\\\"\\\\f23b\\\"}.fa-optin-monster:before{content:\\\"\\\\f23c\\\"}.fa-opencart:before{content:\\\"\\\\f23d\\\"}.fa-expeditedssl:before{content:\\\"\\\\f23e\\\"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:\\\"\\\\f240\\\"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:\\\"\\\\f241\\\"}.fa-battery-2:before,.fa-battery-half:before{content:\\\"\\\\f242\\\"}.fa-battery-1:before,.fa-battery-quarter:before{content:\\\"\\\\f243\\\"}.fa-battery-0:before,.fa-battery-empty:before{content:\\\"\\\\f244\\\"}.fa-mouse-pointer:before{content:\\\"\\\\f245\\\"}.fa-i-cursor:before{content:\\\"\\\\f246\\\"}.fa-object-group:before{content:\\\"\\\\f247\\\"}.fa-object-ungroup:before{content:\\\"\\\\f248\\\"}.fa-sticky-note:before{content:\\\"\\\\f249\\\"}.fa-sticky-note-o:before{content:\\\"\\\\f24a\\\"}.fa-cc-jcb:before{content:\\\"\\\\f24b\\\"}.fa-cc-diners-club:before{content:\\\"\\\\f24c\\\"}.fa-clone:before{content:\\\"\\\\f24d\\\"}.fa-balance-scale:before{content:\\\"\\\\f24e\\\"}.fa-hourglass-o:before{content:\\\"\\\\f250\\\"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:\\\"\\\\f251\\\"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:\\\"\\\\f252\\\"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:\\\"\\\\f253\\\"}.fa-hourglass:before{content:\\\"\\\\f254\\\"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:\\\"\\\\f255\\\"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:\\\"\\\\f256\\\"}.fa-hand-scissors-o:before{content:\\\"\\\\f257\\\"}.fa-hand-lizard-o:before{content:\\\"\\\\f258\\\"}.fa-hand-spock-o:before{content:\\\"\\\\f259\\\"}.fa-hand-pointer-o:before{content:\\\"\\\\f25a\\\"}.fa-hand-peace-o:before{content:\\\"\\\\f25b\\\"}.fa-trademark:before{content:\\\"\\\\f25c\\\"}.fa-registered:before{content:\\\"\\\\f25d\\\"}.fa-creative-commons:before{content:\\\"\\\\f25e\\\"}.fa-gg:before{content:\\\"\\\\f260\\\"}.fa-gg-circle:before{content:\\\"\\\\f261\\\"}.fa-tripadvisor:before{content:\\\"\\\\f262\\\"}.fa-odnoklassniki:before{content:\\\"\\\\f263\\\"}.fa-odnoklassniki-square:before{content:\\\"\\\\f264\\\"}.fa-get-pocket:before{content:\\\"\\\\f265\\\"}.fa-wikipedia-w:before{content:\\\"\\\\f266\\\"}.fa-safari:before{content:\\\"\\\\f267\\\"}.fa-chrome:before{content:\\\"\\\\f268\\\"}.fa-firefox:before{content:\\\"\\\\f269\\\"}.fa-opera:before{content:\\\"\\\\f26a\\\"}.fa-internet-explorer:before{content:\\\"\\\\f26b\\\"}.fa-tv:before,.fa-television:before{content:\\\"\\\\f26c\\\"}.fa-contao:before{content:\\\"\\\\f26d\\\"}.fa-500px:before{content:\\\"\\\\f26e\\\"}.fa-amazon:before{content:\\\"\\\\f270\\\"}.fa-calendar-plus-o:before{content:\\\"\\\\f271\\\"}.fa-calendar-minus-o:before{content:\\\"\\\\f272\\\"}.fa-calendar-times-o:before{content:\\\"\\\\f273\\\"}.fa-calendar-check-o:before{content:\\\"\\\\f274\\\"}.fa-industry:before{content:\\\"\\\\f275\\\"}.fa-map-pin:before{content:\\\"\\\\f276\\\"}.fa-map-signs:before{content:\\\"\\\\f277\\\"}.fa-map-o:before{content:\\\"\\\\f278\\\"}.fa-map:before{content:\\\"\\\\f279\\\"}.fa-commenting:before{content:\\\"\\\\f27a\\\"}.fa-commenting-o:before{content:\\\"\\\\f27b\\\"}.fa-houzz:before{content:\\\"\\\\f27c\\\"}.fa-vimeo:before{content:\\\"\\\\f27d\\\"}.fa-black-tie:before{content:\\\"\\\\f27e\\\"}.fa-fonticons:before{content:\\\"\\\\f280\\\"}.fa-reddit-alien:before{content:\\\"\\\\f281\\\"}.fa-edge:before{content:\\\"\\\\f282\\\"}.fa-credit-card-alt:before{content:\\\"\\\\f283\\\"}.fa-codiepie:before{content:\\\"\\\\f284\\\"}.fa-modx:before{content:\\\"\\\\f285\\\"}.fa-fort-awesome:before{content:\\\"\\\\f286\\\"}.fa-usb:before{content:\\\"\\\\f287\\\"}.fa-product-hunt:before{content:\\\"\\\\f288\\\"}.fa-mixcloud:before{content:\\\"\\\\f289\\\"}.fa-scribd:before{content:\\\"\\\\f28a\\\"}.fa-pause-circle:before{content:\\\"\\\\f28b\\\"}.fa-pause-circle-o:before{content:\\\"\\\\f28c\\\"}.fa-stop-circle:before{content:\\\"\\\\f28d\\\"}.fa-stop-circle-o:before{content:\\\"\\\\f28e\\\"}.fa-shopping-bag:before{content:\\\"\\\\f290\\\"}.fa-shopping-basket:before{content:\\\"\\\\f291\\\"}.fa-hashtag:before{content:\\\"\\\\f292\\\"}.fa-bluetooth:before{content:\\\"\\\\f293\\\"}.fa-bluetooth-b:before{content:\\\"\\\\f294\\\"}.fa-percent:before{content:\\\"\\\\f295\\\"}.fa-gitlab:before{content:\\\"\\\\f296\\\"}.fa-wpbeginner:before{content:\\\"\\\\f297\\\"}.fa-wpforms:before{content:\\\"\\\\f298\\\"}.fa-envira:before{content:\\\"\\\\f299\\\"}.fa-universal-access:before{content:\\\"\\\\f29a\\\"}.fa-wheelchair-alt:before{content:\\\"\\\\f29b\\\"}.fa-question-circle-o:before{content:\\\"\\\\f29c\\\"}.fa-blind:before{content:\\\"\\\\f29d\\\"}.fa-audio-description:before{content:\\\"\\\\f29e\\\"}.fa-volume-control-phone:before{content:\\\"\\\\f2a0\\\"}.fa-braille:before{content:\\\"\\\\f2a1\\\"}.fa-assistive-listening-systems:before{content:\\\"\\\\f2a2\\\"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:\\\"\\\\f2a3\\\"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:\\\"\\\\f2a4\\\"}.fa-glide:before{content:\\\"\\\\f2a5\\\"}.fa-glide-g:before{content:\\\"\\\\f2a6\\\"}.fa-signing:before,.fa-sign-language:before{content:\\\"\\\\f2a7\\\"}.fa-low-vision:before{content:\\\"\\\\f2a8\\\"}.fa-viadeo:before{content:\\\"\\\\f2a9\\\"}.fa-viadeo-square:before{content:\\\"\\\\f2aa\\\"}.fa-snapchat:before{content:\\\"\\\\f2ab\\\"}.fa-snapchat-ghost:before{content:\\\"\\\\f2ac\\\"}.fa-snapchat-square:before{content:\\\"\\\\f2ad\\\"}.fa-pied-piper:before{content:\\\"\\\\f2ae\\\"}.fa-first-order:before{content:\\\"\\\\f2b0\\\"}.fa-yoast:before{content:\\\"\\\\f2b1\\\"}.fa-themeisle:before{content:\\\"\\\\f2b2\\\"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:\\\"\\\\f2b3\\\"}.fa-fa:before,.fa-font-awesome:before{content:\\\"\\\\f2b4\\\"}.fa-handshake-o:before{content:\\\"\\\\f2b5\\\"}.fa-envelope-open:before{content:\\\"\\\\f2b6\\\"}.fa-envelope-open-o:before{content:\\\"\\\\f2b7\\\"}.fa-linode:before{content:\\\"\\\\f2b8\\\"}.fa-address-book:before{content:\\\"\\\\f2b9\\\"}.fa-address-book-o:before{content:\\\"\\\\f2ba\\\"}.fa-vcard:before,.fa-address-card:before{content:\\\"\\\\f2bb\\\"}.fa-vcard-o:before,.fa-address-card-o:before{content:\\\"\\\\f2bc\\\"}.fa-user-circle:before{content:\\\"\\\\f2bd\\\"}.fa-user-circle-o:before{content:\\\"\\\\f2be\\\"}.fa-user-o:before{content:\\\"\\\\f2c0\\\"}.fa-id-badge:before{content:\\\"\\\\f2c1\\\"}.fa-drivers-license:before,.fa-id-card:before{content:\\\"\\\\f2c2\\\"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:\\\"\\\\f2c3\\\"}.fa-quora:before{content:\\\"\\\\f2c4\\\"}.fa-free-code-camp:before{content:\\\"\\\\f2c5\\\"}.fa-telegram:before{content:\\\"\\\\f2c6\\\"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:\\\"\\\\f2c7\\\"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:\\\"\\\\f2c8\\\"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:\\\"\\\\f2c9\\\"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:\\\"\\\\f2ca\\\"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:\\\"\\\\f2cb\\\"}.fa-shower:before{content:\\\"\\\\f2cc\\\"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:\\\"\\\\f2cd\\\"}.fa-podcast:before{content:\\\"\\\\f2ce\\\"}.fa-window-maximize:before{content:\\\"\\\\f2d0\\\"}.fa-window-minimize:before{content:\\\"\\\\f2d1\\\"}.fa-window-restore:before{content:\\\"\\\\f2d2\\\"}.fa-times-rectangle:before,.fa-window-close:before{content:\\\"\\\\f2d3\\\"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:\\\"\\\\f2d4\\\"}.fa-bandcamp:before{content:\\\"\\\\f2d5\\\"}.fa-grav:before{content:\\\"\\\\f2d6\\\"}.fa-etsy:before{content:\\\"\\\\f2d7\\\"}.fa-imdb:before{content:\\\"\\\\f2d8\\\"}.fa-ravelry:before{content:\\\"\\\\f2d9\\\"}.fa-eercast:before{content:\\\"\\\\f2da\\\"}.fa-microchip:before{content:\\\"\\\\f2db\\\"}.fa-snowflake-o:before{content:\\\"\\\\f2dc\\\"}.fa-superpowers:before{content:\\\"\\\\f2dd\\\"}.fa-wpexplorer:before{content:\\\"\\\\f2de\\\"}.fa-meetup:before{content:\\\"\\\\f2e0\\\"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./styles/font-awesome.min.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"/*!\\n * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\\n * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\\n */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\\\";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\\\";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\\\";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\\\";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\\\"\\\\f000\\\"}.fa-music:before{content:\\\"\\\\f001\\\"}.fa-search:before{content:\\\"\\\\f002\\\"}.fa-envelope-o:before{content:\\\"\\\\f003\\\"}.fa-heart:before{content:\\\"\\\\f004\\\"}.fa-star:before{content:\\\"\\\\f005\\\"}.fa-star-o:before{content:\\\"\\\\f006\\\"}.fa-user:before{content:\\\"\\\\f007\\\"}.fa-film:before{content:\\\"\\\\f008\\\"}.fa-th-large:before{content:\\\"\\\\f009\\\"}.fa-th:before{content:\\\"\\\\f00a\\\"}.fa-th-list:before{content:\\\"\\\\f00b\\\"}.fa-check:before{content:\\\"\\\\f00c\\\"}.fa-remove:before,.fa-close:before,.fa-times:before{content:\\\"\\\\f00d\\\"}.fa-search-plus:before{content:\\\"\\\\f00e\\\"}.fa-search-minus:before{content:\\\"\\\\f010\\\"}.fa-power-off:before{content:\\\"\\\\f011\\\"}.fa-signal:before{content:\\\"\\\\f012\\\"}.fa-gear:before,.fa-cog:before{content:\\\"\\\\f013\\\"}.fa-trash-o:before{content:\\\"\\\\f014\\\"}.fa-home:before{content:\\\"\\\\f015\\\"}.fa-file-o:before{content:\\\"\\\\f016\\\"}.fa-clock-o:before{content:\\\"\\\\f017\\\"}.fa-road:before{content:\\\"\\\\f018\\\"}.fa-download:before{content:\\\"\\\\f019\\\"}.fa-arrow-circle-o-down:before{content:\\\"\\\\f01a\\\"}.fa-arrow-circle-o-up:before{content:\\\"\\\\f01b\\\"}.fa-inbox:before{content:\\\"\\\\f01c\\\"}.fa-play-circle-o:before{content:\\\"\\\\f01d\\\"}.fa-rotate-right:before,.fa-repeat:before{content:\\\"\\\\f01e\\\"}.fa-refresh:before{content:\\\"\\\\f021\\\"}.fa-list-alt:before{content:\\\"\\\\f022\\\"}.fa-lock:before{content:\\\"\\\\f023\\\"}.fa-flag:before{content:\\\"\\\\f024\\\"}.fa-headphones:before{content:\\\"\\\\f025\\\"}.fa-volume-off:before{content:\\\"\\\\f026\\\"}.fa-volume-down:before{content:\\\"\\\\f027\\\"}.fa-volume-up:before{content:\\\"\\\\f028\\\"}.fa-qrcode:before{content:\\\"\\\\f029\\\"}.fa-barcode:before{content:\\\"\\\\f02a\\\"}.fa-tag:before{content:\\\"\\\\f02b\\\"}.fa-tags:before{content:\\\"\\\\f02c\\\"}.fa-book:before{content:\\\"\\\\f02d\\\"}.fa-bookmark:before{content:\\\"\\\\f02e\\\"}.fa-print:before{content:\\\"\\\\f02f\\\"}.fa-camera:before{content:\\\"\\\\f030\\\"}.fa-font:before{content:\\\"\\\\f031\\\"}.fa-bold:before{content:\\\"\\\\f032\\\"}.fa-italic:before{content:\\\"\\\\f033\\\"}.fa-text-height:before{content:\\\"\\\\f034\\\"}.fa-text-width:before{content:\\\"\\\\f035\\\"}.fa-align-left:before{content:\\\"\\\\f036\\\"}.fa-align-center:before{content:\\\"\\\\f037\\\"}.fa-align-right:before{content:\\\"\\\\f038\\\"}.fa-align-justify:before{content:\\\"\\\\f039\\\"}.fa-list:before{content:\\\"\\\\f03a\\\"}.fa-dedent:before,.fa-outdent:before{content:\\\"\\\\f03b\\\"}.fa-indent:before{content:\\\"\\\\f03c\\\"}.fa-video-camera:before{content:\\\"\\\\f03d\\\"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:\\\"\\\\f03e\\\"}.fa-pencil:before{content:\\\"\\\\f040\\\"}.fa-map-marker:before{content:\\\"\\\\f041\\\"}.fa-adjust:before{content:\\\"\\\\f042\\\"}.fa-tint:before{content:\\\"\\\\f043\\\"}.fa-edit:before,.fa-pencil-square-o:before{content:\\\"\\\\f044\\\"}.fa-share-square-o:before{content:\\\"\\\\f045\\\"}.fa-check-square-o:before{content:\\\"\\\\f046\\\"}.fa-arrows:before{content:\\\"\\\\f047\\\"}.fa-step-backward:before{content:\\\"\\\\f048\\\"}.fa-fast-backward:before{content:\\\"\\\\f049\\\"}.fa-backward:before{content:\\\"\\\\f04a\\\"}.fa-play:before{content:\\\"\\\\f04b\\\"}.fa-pause:before{content:\\\"\\\\f04c\\\"}.fa-stop:before{content:\\\"\\\\f04d\\\"}.fa-forward:before{content:\\\"\\\\f04e\\\"}.fa-fast-forward:before{content:\\\"\\\\f050\\\"}.fa-step-forward:before{content:\\\"\\\\f051\\\"}.fa-eject:before{content:\\\"\\\\f052\\\"}.fa-chevron-left:before{content:\\\"\\\\f053\\\"}.fa-chevron-right:before{content:\\\"\\\\f054\\\"}.fa-plus-circle:before{content:\\\"\\\\f055\\\"}.fa-minus-circle:before{content:\\\"\\\\f056\\\"}.fa-times-circle:before{content:\\\"\\\\f057\\\"}.fa-check-circle:before{content:\\\"\\\\f058\\\"}.fa-question-circle:before{content:\\\"\\\\f059\\\"}.fa-info-circle:before{content:\\\"\\\\f05a\\\"}.fa-crosshairs:before{content:\\\"\\\\f05b\\\"}.fa-times-circle-o:before{content:\\\"\\\\f05c\\\"}.fa-check-circle-o:before{content:\\\"\\\\f05d\\\"}.fa-ban:before{content:\\\"\\\\f05e\\\"}.fa-arrow-left:before{content:\\\"\\\\f060\\\"}.fa-arrow-right:before{content:\\\"\\\\f061\\\"}.fa-arrow-up:before{content:\\\"\\\\f062\\\"}.fa-arrow-down:before{content:\\\"\\\\f063\\\"}.fa-mail-forward:before,.fa-share:before{content:\\\"\\\\f064\\\"}.fa-expand:before{content:\\\"\\\\f065\\\"}.fa-compress:before{content:\\\"\\\\f066\\\"}.fa-plus:before{content:\\\"\\\\f067\\\"}.fa-minus:before{content:\\\"\\\\f068\\\"}.fa-asterisk:before{content:\\\"\\\\f069\\\"}.fa-exclamation-circle:before{content:\\\"\\\\f06a\\\"}.fa-gift:before{content:\\\"\\\\f06b\\\"}.fa-leaf:before{content:\\\"\\\\f06c\\\"}.fa-fire:before{content:\\\"\\\\f06d\\\"}.fa-eye:before{content:\\\"\\\\f06e\\\"}.fa-eye-slash:before{content:\\\"\\\\f070\\\"}.fa-warning:before,.fa-exclamation-triangle:before{content:\\\"\\\\f071\\\"}.fa-plane:before{content:\\\"\\\\f072\\\"}.fa-calendar:before{content:\\\"\\\\f073\\\"}.fa-random:before{content:\\\"\\\\f074\\\"}.fa-comment:before{content:\\\"\\\\f075\\\"}.fa-magnet:before{content:\\\"\\\\f076\\\"}.fa-chevron-up:before{content:\\\"\\\\f077\\\"}.fa-chevron-down:before{content:\\\"\\\\f078\\\"}.fa-retweet:before{content:\\\"\\\\f079\\\"}.fa-shopping-cart:before{content:\\\"\\\\f07a\\\"}.fa-folder:before{content:\\\"\\\\f07b\\\"}.fa-folder-open:before{content:\\\"\\\\f07c\\\"}.fa-arrows-v:before{content:\\\"\\\\f07d\\\"}.fa-arrows-h:before{content:\\\"\\\\f07e\\\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\\\"\\\\f080\\\"}.fa-twitter-square:before{content:\\\"\\\\f081\\\"}.fa-facebook-square:before{content:\\\"\\\\f082\\\"}.fa-camera-retro:before{content:\\\"\\\\f083\\\"}.fa-key:before{content:\\\"\\\\f084\\\"}.fa-gears:before,.fa-cogs:before{content:\\\"\\\\f085\\\"}.fa-comments:before{content:\\\"\\\\f086\\\"}.fa-thumbs-o-up:before{content:\\\"\\\\f087\\\"}.fa-thumbs-o-down:before{content:\\\"\\\\f088\\\"}.fa-star-half:before{content:\\\"\\\\f089\\\"}.fa-heart-o:before{content:\\\"\\\\f08a\\\"}.fa-sign-out:before{content:\\\"\\\\f08b\\\"}.fa-linkedin-square:before{content:\\\"\\\\f08c\\\"}.fa-thumb-tack:before{content:\\\"\\\\f08d\\\"}.fa-external-link:before{content:\\\"\\\\f08e\\\"}.fa-sign-in:before{content:\\\"\\\\f090\\\"}.fa-trophy:before{content:\\\"\\\\f091\\\"}.fa-github-square:before{content:\\\"\\\\f092\\\"}.fa-upload:before{content:\\\"\\\\f093\\\"}.fa-lemon-o:before{content:\\\"\\\\f094\\\"}.fa-phone:before{content:\\\"\\\\f095\\\"}.fa-square-o:before{content:\\\"\\\\f096\\\"}.fa-bookmark-o:before{content:\\\"\\\\f097\\\"}.fa-phone-square:before{content:\\\"\\\\f098\\\"}.fa-twitter:before{content:\\\"\\\\f099\\\"}.fa-facebook-f:before,.fa-facebook:before{content:\\\"\\\\f09a\\\"}.fa-github:before{content:\\\"\\\\f09b\\\"}.fa-unlock:before{content:\\\"\\\\f09c\\\"}.fa-credit-card:before{content:\\\"\\\\f09d\\\"}.fa-feed:before,.fa-rss:before{content:\\\"\\\\f09e\\\"}.fa-hdd-o:before{content:\\\"\\\\f0a0\\\"}.fa-bullhorn:before{content:\\\"\\\\f0a1\\\"}.fa-bell:before{content:\\\"\\\\f0f3\\\"}.fa-certificate:before{content:\\\"\\\\f0a3\\\"}.fa-hand-o-right:before{content:\\\"\\\\f0a4\\\"}.fa-hand-o-left:before{content:\\\"\\\\f0a5\\\"}.fa-hand-o-up:before{content:\\\"\\\\f0a6\\\"}.fa-hand-o-down:before{content:\\\"\\\\f0a7\\\"}.fa-arrow-circle-left:before{content:\\\"\\\\f0a8\\\"}.fa-arrow-circle-right:before{content:\\\"\\\\f0a9\\\"}.fa-arrow-circle-up:before{content:\\\"\\\\f0aa\\\"}.fa-arrow-circle-down:before{content:\\\"\\\\f0ab\\\"}.fa-globe:before{content:\\\"\\\\f0ac\\\"}.fa-wrench:before{content:\\\"\\\\f0ad\\\"}.fa-tasks:before{content:\\\"\\\\f0ae\\\"}.fa-filter:before{content:\\\"\\\\f0b0\\\"}.fa-briefcase:before{content:\\\"\\\\f0b1\\\"}.fa-arrows-alt:before{content:\\\"\\\\f0b2\\\"}.fa-group:before,.fa-users:before{content:\\\"\\\\f0c0\\\"}.fa-chain:before,.fa-link:before{content:\\\"\\\\f0c1\\\"}.fa-cloud:before{content:\\\"\\\\f0c2\\\"}.fa-flask:before{content:\\\"\\\\f0c3\\\"}.fa-cut:before,.fa-scissors:before{content:\\\"\\\\f0c4\\\"}.fa-copy:before,.fa-files-o:before{content:\\\"\\\\f0c5\\\"}.fa-paperclip:before{content:\\\"\\\\f0c6\\\"}.fa-save:before,.fa-floppy-o:before{content:\\\"\\\\f0c7\\\"}.fa-square:before{content:\\\"\\\\f0c8\\\"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:\\\"\\\\f0c9\\\"}.fa-list-ul:before{content:\\\"\\\\f0ca\\\"}.fa-list-ol:before{content:\\\"\\\\f0cb\\\"}.fa-strikethrough:before{content:\\\"\\\\f0cc\\\"}.fa-underline:before{content:\\\"\\\\f0cd\\\"}.fa-table:before{content:\\\"\\\\f0ce\\\"}.fa-magic:before{content:\\\"\\\\f0d0\\\"}.fa-truck:before{content:\\\"\\\\f0d1\\\"}.fa-pinterest:before{content:\\\"\\\\f0d2\\\"}.fa-pinterest-square:before{content:\\\"\\\\f0d3\\\"}.fa-google-plus-square:before{content:\\\"\\\\f0d4\\\"}.fa-google-plus:before{content:\\\"\\\\f0d5\\\"}.fa-money:before{content:\\\"\\\\f0d6\\\"}.fa-caret-down:before{content:\\\"\\\\f0d7\\\"}.fa-caret-up:before{content:\\\"\\\\f0d8\\\"}.fa-caret-left:before{content:\\\"\\\\f0d9\\\"}.fa-caret-right:before{content:\\\"\\\\f0da\\\"}.fa-columns:before{content:\\\"\\\\f0db\\\"}.fa-unsorted:before,.fa-sort:before{content:\\\"\\\\f0dc\\\"}.fa-sort-down:before,.fa-sort-desc:before{content:\\\"\\\\f0dd\\\"}.fa-sort-up:before,.fa-sort-asc:before{content:\\\"\\\\f0de\\\"}.fa-envelope:before{content:\\\"\\\\f0e0\\\"}.fa-linkedin:before{content:\\\"\\\\f0e1\\\"}.fa-rotate-left:before,.fa-undo:before{content:\\\"\\\\f0e2\\\"}.fa-legal:before,.fa-gavel:before{content:\\\"\\\\f0e3\\\"}.fa-dashboard:before,.fa-tachometer:before{content:\\\"\\\\f0e4\\\"}.fa-comment-o:before{content:\\\"\\\\f0e5\\\"}.fa-comments-o:before{content:\\\"\\\\f0e6\\\"}.fa-flash:before,.fa-bolt:before{content:\\\"\\\\f0e7\\\"}.fa-sitemap:before{content:\\\"\\\\f0e8\\\"}.fa-umbrella:before{content:\\\"\\\\f0e9\\\"}.fa-paste:before,.fa-clipboard:before{content:\\\"\\\\f0ea\\\"}.fa-lightbulb-o:before{content:\\\"\\\\f0eb\\\"}.fa-exchange:before{content:\\\"\\\\f0ec\\\"}.fa-cloud-download:before{content:\\\"\\\\f0ed\\\"}.fa-cloud-upload:before{content:\\\"\\\\f0ee\\\"}.fa-user-md:before{content:\\\"\\\\f0f0\\\"}.fa-stethoscope:before{content:\\\"\\\\f0f1\\\"}.fa-suitcase:before{content:\\\"\\\\f0f2\\\"}.fa-bell-o:before{content:\\\"\\\\f0a2\\\"}.fa-coffee:before{content:\\\"\\\\f0f4\\\"}.fa-cutlery:before{content:\\\"\\\\f0f5\\\"}.fa-file-text-o:before{content:\\\"\\\\f0f6\\\"}.fa-building-o:before{content:\\\"\\\\f0f7\\\"}.fa-hospital-o:before{content:\\\"\\\\f0f8\\\"}.fa-ambulance:before{content:\\\"\\\\f0f9\\\"}.fa-medkit:before{content:\\\"\\\\f0fa\\\"}.fa-fighter-jet:before{content:\\\"\\\\f0fb\\\"}.fa-beer:before{content:\\\"\\\\f0fc\\\"}.fa-h-square:before{content:\\\"\\\\f0fd\\\"}.fa-plus-square:before{content:\\\"\\\\f0fe\\\"}.fa-angle-double-left:before{content:\\\"\\\\f100\\\"}.fa-angle-double-right:before{content:\\\"\\\\f101\\\"}.fa-angle-double-up:before{content:\\\"\\\\f102\\\"}.fa-angle-double-down:before{content:\\\"\\\\f103\\\"}.fa-angle-left:before{content:\\\"\\\\f104\\\"}.fa-angle-right:before{content:\\\"\\\\f105\\\"}.fa-angle-up:before{content:\\\"\\\\f106\\\"}.fa-angle-down:before{content:\\\"\\\\f107\\\"}.fa-desktop:before{content:\\\"\\\\f108\\\"}.fa-laptop:before{content:\\\"\\\\f109\\\"}.fa-tablet:before{content:\\\"\\\\f10a\\\"}.fa-mobile-phone:before,.fa-mobile:before{content:\\\"\\\\f10b\\\"}.fa-circle-o:before{content:\\\"\\\\f10c\\\"}.fa-quote-left:before{content:\\\"\\\\f10d\\\"}.fa-quote-right:before{content:\\\"\\\\f10e\\\"}.fa-spinner:before{content:\\\"\\\\f110\\\"}.fa-circle:before{content:\\\"\\\\f111\\\"}.fa-mail-reply:before,.fa-reply:before{content:\\\"\\\\f112\\\"}.fa-github-alt:before{content:\\\"\\\\f113\\\"}.fa-folder-o:before{content:\\\"\\\\f114\\\"}.fa-folder-open-o:before{content:\\\"\\\\f115\\\"}.fa-smile-o:before{content:\\\"\\\\f118\\\"}.fa-frown-o:before{content:\\\"\\\\f119\\\"}.fa-meh-o:before{content:\\\"\\\\f11a\\\"}.fa-gamepad:before{content:\\\"\\\\f11b\\\"}.fa-keyboard-o:before{content:\\\"\\\\f11c\\\"}.fa-flag-o:before{content:\\\"\\\\f11d\\\"}.fa-flag-checkered:before{content:\\\"\\\\f11e\\\"}.fa-terminal:before{content:\\\"\\\\f120\\\"}.fa-code:before{content:\\\"\\\\f121\\\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\\\"\\\\f122\\\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\\\"\\\\f123\\\"}.fa-location-arrow:before{content:\\\"\\\\f124\\\"}.fa-crop:before{content:\\\"\\\\f125\\\"}.fa-code-fork:before{content:\\\"\\\\f126\\\"}.fa-unlink:before,.fa-chain-broken:before{content:\\\"\\\\f127\\\"}.fa-question:before{content:\\\"\\\\f128\\\"}.fa-info:before{content:\\\"\\\\f129\\\"}.fa-exclamation:before{content:\\\"\\\\f12a\\\"}.fa-superscript:before{content:\\\"\\\\f12b\\\"}.fa-subscript:before{content:\\\"\\\\f12c\\\"}.fa-eraser:before{content:\\\"\\\\f12d\\\"}.fa-puzzle-piece:before{content:\\\"\\\\f12e\\\"}.fa-microphone:before{content:\\\"\\\\f130\\\"}.fa-microphone-slash:before{content:\\\"\\\\f131\\\"}.fa-shield:before{content:\\\"\\\\f132\\\"}.fa-calendar-o:before{content:\\\"\\\\f133\\\"}.fa-fire-extinguisher:before{content:\\\"\\\\f134\\\"}.fa-rocket:before{content:\\\"\\\\f135\\\"}.fa-maxcdn:before{content:\\\"\\\\f136\\\"}.fa-chevron-circle-left:before{content:\\\"\\\\f137\\\"}.fa-chevron-circle-right:before{content:\\\"\\\\f138\\\"}.fa-chevron-circle-up:before{content:\\\"\\\\f139\\\"}.fa-chevron-circle-down:before{content:\\\"\\\\f13a\\\"}.fa-html5:before{content:\\\"\\\\f13b\\\"}.fa-css3:before{content:\\\"\\\\f13c\\\"}.fa-anchor:before{content:\\\"\\\\f13d\\\"}.fa-unlock-alt:before{content:\\\"\\\\f13e\\\"}.fa-bullseye:before{content:\\\"\\\\f140\\\"}.fa-ellipsis-h:before{content:\\\"\\\\f141\\\"}.fa-ellipsis-v:before{content:\\\"\\\\f142\\\"}.fa-rss-square:before{content:\\\"\\\\f143\\\"}.fa-play-circle:before{content:\\\"\\\\f144\\\"}.fa-ticket:before{content:\\\"\\\\f145\\\"}.fa-minus-square:before{content:\\\"\\\\f146\\\"}.fa-minus-square-o:before{content:\\\"\\\\f147\\\"}.fa-level-up:before{content:\\\"\\\\f148\\\"}.fa-level-down:before{content:\\\"\\\\f149\\\"}.fa-check-square:before{content:\\\"\\\\f14a\\\"}.fa-pencil-square:before{content:\\\"\\\\f14b\\\"}.fa-external-link-square:before{content:\\\"\\\\f14c\\\"}.fa-share-square:before{content:\\\"\\\\f14d\\\"}.fa-compass:before{content:\\\"\\\\f14e\\\"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:\\\"\\\\f150\\\"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:\\\"\\\\f151\\\"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:\\\"\\\\f152\\\"}.fa-euro:before,.fa-eur:before{content:\\\"\\\\f153\\\"}.fa-gbp:before{content:\\\"\\\\f154\\\"}.fa-dollar:before,.fa-usd:before{content:\\\"\\\\f155\\\"}.fa-rupee:before,.fa-inr:before{content:\\\"\\\\f156\\\"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:\\\"\\\\f157\\\"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:\\\"\\\\f158\\\"}.fa-won:before,.fa-krw:before{content:\\\"\\\\f159\\\"}.fa-bitcoin:before,.fa-btc:before{content:\\\"\\\\f15a\\\"}.fa-file:before{content:\\\"\\\\f15b\\\"}.fa-file-text:before{content:\\\"\\\\f15c\\\"}.fa-sort-alpha-asc:before{content:\\\"\\\\f15d\\\"}.fa-sort-alpha-desc:before{content:\\\"\\\\f15e\\\"}.fa-sort-amount-asc:before{content:\\\"\\\\f160\\\"}.fa-sort-amount-desc:before{content:\\\"\\\\f161\\\"}.fa-sort-numeric-asc:before{content:\\\"\\\\f162\\\"}.fa-sort-numeric-desc:before{content:\\\"\\\\f163\\\"}.fa-thumbs-up:before{content:\\\"\\\\f164\\\"}.fa-thumbs-down:before{content:\\\"\\\\f165\\\"}.fa-youtube-square:before{content:\\\"\\\\f166\\\"}.fa-youtube:before{content:\\\"\\\\f167\\\"}.fa-xing:before{content:\\\"\\\\f168\\\"}.fa-xing-square:before{content:\\\"\\\\f169\\\"}.fa-youtube-play:before{content:\\\"\\\\f16a\\\"}.fa-dropbox:before{content:\\\"\\\\f16b\\\"}.fa-stack-overflow:before{content:\\\"\\\\f16c\\\"}.fa-instagram:before{content:\\\"\\\\f16d\\\"}.fa-flickr:before{content:\\\"\\\\f16e\\\"}.fa-adn:before{content:\\\"\\\\f170\\\"}.fa-bitbucket:before{content:\\\"\\\\f171\\\"}.fa-bitbucket-square:before{content:\\\"\\\\f172\\\"}.fa-tumblr:before{content:\\\"\\\\f173\\\"}.fa-tumblr-square:before{content:\\\"\\\\f174\\\"}.fa-long-arrow-down:before{content:\\\"\\\\f175\\\"}.fa-long-arrow-up:before{content:\\\"\\\\f176\\\"}.fa-long-arrow-left:before{content:\\\"\\\\f177\\\"}.fa-long-arrow-right:before{content:\\\"\\\\f178\\\"}.fa-apple:before{content:\\\"\\\\f179\\\"}.fa-windows:before{content:\\\"\\\\f17a\\\"}.fa-android:before{content:\\\"\\\\f17b\\\"}.fa-linux:before{content:\\\"\\\\f17c\\\"}.fa-dribbble:before{content:\\\"\\\\f17d\\\"}.fa-skype:before{content:\\\"\\\\f17e\\\"}.fa-foursquare:before{content:\\\"\\\\f180\\\"}.fa-trello:before{content:\\\"\\\\f181\\\"}.fa-female:before{content:\\\"\\\\f182\\\"}.fa-male:before{content:\\\"\\\\f183\\\"}.fa-gittip:before,.fa-gratipay:before{content:\\\"\\\\f184\\\"}.fa-sun-o:before{content:\\\"\\\\f185\\\"}.fa-moon-o:before{content:\\\"\\\\f186\\\"}.fa-archive:before{content:\\\"\\\\f187\\\"}.fa-bug:before{content:\\\"\\\\f188\\\"}.fa-vk:before{content:\\\"\\\\f189\\\"}.fa-weibo:before{content:\\\"\\\\f18a\\\"}.fa-renren:before{content:\\\"\\\\f18b\\\"}.fa-pagelines:before{content:\\\"\\\\f18c\\\"}.fa-stack-exchange:before{content:\\\"\\\\f18d\\\"}.fa-arrow-circle-o-right:before{content:\\\"\\\\f18e\\\"}.fa-arrow-circle-o-left:before{content:\\\"\\\\f190\\\"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:\\\"\\\\f191\\\"}.fa-dot-circle-o:before{content:\\\"\\\\f192\\\"}.fa-wheelchair:before{content:\\\"\\\\f193\\\"}.fa-vimeo-square:before{content:\\\"\\\\f194\\\"}.fa-turkish-lira:before,.fa-try:before{content:\\\"\\\\f195\\\"}.fa-plus-square-o:before{content:\\\"\\\\f196\\\"}.fa-space-shuttle:before{content:\\\"\\\\f197\\\"}.fa-slack:before{content:\\\"\\\\f198\\\"}.fa-envelope-square:before{content:\\\"\\\\f199\\\"}.fa-wordpress:before{content:\\\"\\\\f19a\\\"}.fa-openid:before{content:\\\"\\\\f19b\\\"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:\\\"\\\\f19c\\\"}.fa-mortar-board:before,.fa-graduation-cap:before{content:\\\"\\\\f19d\\\"}.fa-yahoo:before{content:\\\"\\\\f19e\\\"}.fa-google:before{content:\\\"\\\\f1a0\\\"}.fa-reddit:before{content:\\\"\\\\f1a1\\\"}.fa-reddit-square:before{content:\\\"\\\\f1a2\\\"}.fa-stumbleupon-circle:before{content:\\\"\\\\f1a3\\\"}.fa-stumbleupon:before{content:\\\"\\\\f1a4\\\"}.fa-delicious:before{content:\\\"\\\\f1a5\\\"}.fa-digg:before{content:\\\"\\\\f1a6\\\"}.fa-pied-piper-pp:before{content:\\\"\\\\f1a7\\\"}.fa-pied-piper-alt:before{content:\\\"\\\\f1a8\\\"}.fa-drupal:before{content:\\\"\\\\f1a9\\\"}.fa-joomla:before{content:\\\"\\\\f1aa\\\"}.fa-language:before{content:\\\"\\\\f1ab\\\"}.fa-fax:before{content:\\\"\\\\f1ac\\\"}.fa-building:before{content:\\\"\\\\f1ad\\\"}.fa-child:before{content:\\\"\\\\f1ae\\\"}.fa-paw:before{content:\\\"\\\\f1b0\\\"}.fa-spoon:before{content:\\\"\\\\f1b1\\\"}.fa-cube:before{content:\\\"\\\\f1b2\\\"}.fa-cubes:before{content:\\\"\\\\f1b3\\\"}.fa-behance:before{content:\\\"\\\\f1b4\\\"}.fa-behance-square:before{content:\\\"\\\\f1b5\\\"}.fa-steam:before{content:\\\"\\\\f1b6\\\"}.fa-steam-square:before{content:\\\"\\\\f1b7\\\"}.fa-recycle:before{content:\\\"\\\\f1b8\\\"}.fa-automobile:before,.fa-car:before{content:\\\"\\\\f1b9\\\"}.fa-cab:before,.fa-taxi:before{content:\\\"\\\\f1ba\\\"}.fa-tree:before{content:\\\"\\\\f1bb\\\"}.fa-spotify:before{content:\\\"\\\\f1bc\\\"}.fa-deviantart:before{content:\\\"\\\\f1bd\\\"}.fa-soundcloud:before{content:\\\"\\\\f1be\\\"}.fa-database:before{content:\\\"\\\\f1c0\\\"}.fa-file-pdf-o:before{content:\\\"\\\\f1c1\\\"}.fa-file-word-o:before{content:\\\"\\\\f1c2\\\"}.fa-file-excel-o:before{content:\\\"\\\\f1c3\\\"}.fa-file-powerpoint-o:before{content:\\\"\\\\f1c4\\\"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:\\\"\\\\f1c5\\\"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:\\\"\\\\f1c6\\\"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:\\\"\\\\f1c7\\\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\\\"\\\\f1c8\\\"}.fa-file-code-o:before{content:\\\"\\\\f1c9\\\"}.fa-vine:before{content:\\\"\\\\f1ca\\\"}.fa-codepen:before{content:\\\"\\\\f1cb\\\"}.fa-jsfiddle:before{content:\\\"\\\\f1cc\\\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:\\\"\\\\f1cd\\\"}.fa-circle-o-notch:before{content:\\\"\\\\f1ce\\\"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:\\\"\\\\f1d0\\\"}.fa-ge:before,.fa-empire:before{content:\\\"\\\\f1d1\\\"}.fa-git-square:before{content:\\\"\\\\f1d2\\\"}.fa-git:before{content:\\\"\\\\f1d3\\\"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:\\\"\\\\f1d4\\\"}.fa-tencent-weibo:before{content:\\\"\\\\f1d5\\\"}.fa-qq:before{content:\\\"\\\\f1d6\\\"}.fa-wechat:before,.fa-weixin:before{content:\\\"\\\\f1d7\\\"}.fa-send:before,.fa-paper-plane:before{content:\\\"\\\\f1d8\\\"}.fa-send-o:before,.fa-paper-plane-o:before{content:\\\"\\\\f1d9\\\"}.fa-history:before{content:\\\"\\\\f1da\\\"}.fa-circle-thin:before{content:\\\"\\\\f1db\\\"}.fa-header:before{content:\\\"\\\\f1dc\\\"}.fa-paragraph:before{content:\\\"\\\\f1dd\\\"}.fa-sliders:before{content:\\\"\\\\f1de\\\"}.fa-share-alt:before{content:\\\"\\\\f1e0\\\"}.fa-share-alt-square:before{content:\\\"\\\\f1e1\\\"}.fa-bomb:before{content:\\\"\\\\f1e2\\\"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:\\\"\\\\f1e3\\\"}.fa-tty:before{content:\\\"\\\\f1e4\\\"}.fa-binoculars:before{content:\\\"\\\\f1e5\\\"}.fa-plug:before{content:\\\"\\\\f1e6\\\"}.fa-slideshare:before{content:\\\"\\\\f1e7\\\"}.fa-twitch:before{content:\\\"\\\\f1e8\\\"}.fa-yelp:before{content:\\\"\\\\f1e9\\\"}.fa-newspaper-o:before{content:\\\"\\\\f1ea\\\"}.fa-wifi:before{content:\\\"\\\\f1eb\\\"}.fa-calculator:before{content:\\\"\\\\f1ec\\\"}.fa-paypal:before{content:\\\"\\\\f1ed\\\"}.fa-google-wallet:before{content:\\\"\\\\f1ee\\\"}.fa-cc-visa:before{content:\\\"\\\\f1f0\\\"}.fa-cc-mastercard:before{content:\\\"\\\\f1f1\\\"}.fa-cc-discover:before{content:\\\"\\\\f1f2\\\"}.fa-cc-amex:before{content:\\\"\\\\f1f3\\\"}.fa-cc-paypal:before{content:\\\"\\\\f1f4\\\"}.fa-cc-stripe:before{content:\\\"\\\\f1f5\\\"}.fa-bell-slash:before{content:\\\"\\\\f1f6\\\"}.fa-bell-slash-o:before{content:\\\"\\\\f1f7\\\"}.fa-trash:before{content:\\\"\\\\f1f8\\\"}.fa-copyright:before{content:\\\"\\\\f1f9\\\"}.fa-at:before{content:\\\"\\\\f1fa\\\"}.fa-eyedropper:before{content:\\\"\\\\f1fb\\\"}.fa-paint-brush:before{content:\\\"\\\\f1fc\\\"}.fa-birthday-cake:before{content:\\\"\\\\f1fd\\\"}.fa-area-chart:before{content:\\\"\\\\f1fe\\\"}.fa-pie-chart:before{content:\\\"\\\\f200\\\"}.fa-line-chart:before{content:\\\"\\\\f201\\\"}.fa-lastfm:before{content:\\\"\\\\f202\\\"}.fa-lastfm-square:before{content:\\\"\\\\f203\\\"}.fa-toggle-off:before{content:\\\"\\\\f204\\\"}.fa-toggle-on:before{content:\\\"\\\\f205\\\"}.fa-bicycle:before{content:\\\"\\\\f206\\\"}.fa-bus:before{content:\\\"\\\\f207\\\"}.fa-ioxhost:before{content:\\\"\\\\f208\\\"}.fa-angellist:before{content:\\\"\\\\f209\\\"}.fa-cc:before{content:\\\"\\\\f20a\\\"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:\\\"\\\\f20b\\\"}.fa-meanpath:before{content:\\\"\\\\f20c\\\"}.fa-buysellads:before{content:\\\"\\\\f20d\\\"}.fa-connectdevelop:before{content:\\\"\\\\f20e\\\"}.fa-dashcube:before{content:\\\"\\\\f210\\\"}.fa-forumbee:before{content:\\\"\\\\f211\\\"}.fa-leanpub:before{content:\\\"\\\\f212\\\"}.fa-sellsy:before{content:\\\"\\\\f213\\\"}.fa-shirtsinbulk:before{content:\\\"\\\\f214\\\"}.fa-simplybuilt:before{content:\\\"\\\\f215\\\"}.fa-skyatlas:before{content:\\\"\\\\f216\\\"}.fa-cart-plus:before{content:\\\"\\\\f217\\\"}.fa-cart-arrow-down:before{content:\\\"\\\\f218\\\"}.fa-diamond:before{content:\\\"\\\\f219\\\"}.fa-ship:before{content:\\\"\\\\f21a\\\"}.fa-user-secret:before{content:\\\"\\\\f21b\\\"}.fa-motorcycle:before{content:\\\"\\\\f21c\\\"}.fa-street-view:before{content:\\\"\\\\f21d\\\"}.fa-heartbeat:before{content:\\\"\\\\f21e\\\"}.fa-venus:before{content:\\\"\\\\f221\\\"}.fa-mars:before{content:\\\"\\\\f222\\\"}.fa-mercury:before{content:\\\"\\\\f223\\\"}.fa-intersex:before,.fa-transgender:before{content:\\\"\\\\f224\\\"}.fa-transgender-alt:before{content:\\\"\\\\f225\\\"}.fa-venus-double:before{content:\\\"\\\\f226\\\"}.fa-mars-double:before{content:\\\"\\\\f227\\\"}.fa-venus-mars:before{content:\\\"\\\\f228\\\"}.fa-mars-stroke:before{content:\\\"\\\\f229\\\"}.fa-mars-stroke-v:before{content:\\\"\\\\f22a\\\"}.fa-mars-stroke-h:before{content:\\\"\\\\f22b\\\"}.fa-neuter:before{content:\\\"\\\\f22c\\\"}.fa-genderless:before{content:\\\"\\\\f22d\\\"}.fa-facebook-official:before{content:\\\"\\\\f230\\\"}.fa-pinterest-p:before{content:\\\"\\\\f231\\\"}.fa-whatsapp:before{content:\\\"\\\\f232\\\"}.fa-server:before{content:\\\"\\\\f233\\\"}.fa-user-plus:before{content:\\\"\\\\f234\\\"}.fa-user-times:before{content:\\\"\\\\f235\\\"}.fa-hotel:before,.fa-bed:before{content:\\\"\\\\f236\\\"}.fa-viacoin:before{content:\\\"\\\\f237\\\"}.fa-train:before{content:\\\"\\\\f238\\\"}.fa-subway:before{content:\\\"\\\\f239\\\"}.fa-medium:before{content:\\\"\\\\f23a\\\"}.fa-yc:before,.fa-y-combinator:before{content:\\\"\\\\f23b\\\"}.fa-optin-monster:before{content:\\\"\\\\f23c\\\"}.fa-opencart:before{content:\\\"\\\\f23d\\\"}.fa-expeditedssl:before{content:\\\"\\\\f23e\\\"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:\\\"\\\\f240\\\"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:\\\"\\\\f241\\\"}.fa-battery-2:before,.fa-battery-half:before{content:\\\"\\\\f242\\\"}.fa-battery-1:before,.fa-battery-quarter:before{content:\\\"\\\\f243\\\"}.fa-battery-0:before,.fa-battery-empty:before{content:\\\"\\\\f244\\\"}.fa-mouse-pointer:before{content:\\\"\\\\f245\\\"}.fa-i-cursor:before{content:\\\"\\\\f246\\\"}.fa-object-group:before{content:\\\"\\\\f247\\\"}.fa-object-ungroup:before{content:\\\"\\\\f248\\\"}.fa-sticky-note:before{content:\\\"\\\\f249\\\"}.fa-sticky-note-o:before{content:\\\"\\\\f24a\\\"}.fa-cc-jcb:before{content:\\\"\\\\f24b\\\"}.fa-cc-diners-club:before{content:\\\"\\\\f24c\\\"}.fa-clone:before{content:\\\"\\\\f24d\\\"}.fa-balance-scale:before{content:\\\"\\\\f24e\\\"}.fa-hourglass-o:before{content:\\\"\\\\f250\\\"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:\\\"\\\\f251\\\"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:\\\"\\\\f252\\\"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:\\\"\\\\f253\\\"}.fa-hourglass:before{content:\\\"\\\\f254\\\"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:\\\"\\\\f255\\\"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:\\\"\\\\f256\\\"}.fa-hand-scissors-o:before{content:\\\"\\\\f257\\\"}.fa-hand-lizard-o:before{content:\\\"\\\\f258\\\"}.fa-hand-spock-o:before{content:\\\"\\\\f259\\\"}.fa-hand-pointer-o:before{content:\\\"\\\\f25a\\\"}.fa-hand-peace-o:before{content:\\\"\\\\f25b\\\"}.fa-trademark:before{content:\\\"\\\\f25c\\\"}.fa-registered:before{content:\\\"\\\\f25d\\\"}.fa-creative-commons:before{content:\\\"\\\\f25e\\\"}.fa-gg:before{content:\\\"\\\\f260\\\"}.fa-gg-circle:before{content:\\\"\\\\f261\\\"}.fa-tripadvisor:before{content:\\\"\\\\f262\\\"}.fa-odnoklassniki:before{content:\\\"\\\\f263\\\"}.fa-odnoklassniki-square:before{content:\\\"\\\\f264\\\"}.fa-get-pocket:before{content:\\\"\\\\f265\\\"}.fa-wikipedia-w:before{content:\\\"\\\\f266\\\"}.fa-safari:before{content:\\\"\\\\f267\\\"}.fa-chrome:before{content:\\\"\\\\f268\\\"}.fa-firefox:before{content:\\\"\\\\f269\\\"}.fa-opera:before{content:\\\"\\\\f26a\\\"}.fa-internet-explorer:before{content:\\\"\\\\f26b\\\"}.fa-tv:before,.fa-television:before{content:\\\"\\\\f26c\\\"}.fa-contao:before{content:\\\"\\\\f26d\\\"}.fa-500px:before{content:\\\"\\\\f26e\\\"}.fa-amazon:before{content:\\\"\\\\f270\\\"}.fa-calendar-plus-o:before{content:\\\"\\\\f271\\\"}.fa-calendar-minus-o:before{content:\\\"\\\\f272\\\"}.fa-calendar-times-o:before{content:\\\"\\\\f273\\\"}.fa-calendar-check-o:before{content:\\\"\\\\f274\\\"}.fa-industry:before{content:\\\"\\\\f275\\\"}.fa-map-pin:before{content:\\\"\\\\f276\\\"}.fa-map-signs:before{content:\\\"\\\\f277\\\"}.fa-map-o:before{content:\\\"\\\\f278\\\"}.fa-map:before{content:\\\"\\\\f279\\\"}.fa-commenting:before{content:\\\"\\\\f27a\\\"}.fa-commenting-o:before{content:\\\"\\\\f27b\\\"}.fa-houzz:before{content:\\\"\\\\f27c\\\"}.fa-vimeo:before{content:\\\"\\\\f27d\\\"}.fa-black-tie:before{content:\\\"\\\\f27e\\\"}.fa-fonticons:before{content:\\\"\\\\f280\\\"}.fa-reddit-alien:before{content:\\\"\\\\f281\\\"}.fa-edge:before{content:\\\"\\\\f282\\\"}.fa-credit-card-alt:before{content:\\\"\\\\f283\\\"}.fa-codiepie:before{content:\\\"\\\\f284\\\"}.fa-modx:before{content:\\\"\\\\f285\\\"}.fa-fort-awesome:before{content:\\\"\\\\f286\\\"}.fa-usb:before{content:\\\"\\\\f287\\\"}.fa-product-hunt:before{content:\\\"\\\\f288\\\"}.fa-mixcloud:before{content:\\\"\\\\f289\\\"}.fa-scribd:before{content:\\\"\\\\f28a\\\"}.fa-pause-circle:before{content:\\\"\\\\f28b\\\"}.fa-pause-circle-o:before{content:\\\"\\\\f28c\\\"}.fa-stop-circle:before{content:\\\"\\\\f28d\\\"}.fa-stop-circle-o:before{content:\\\"\\\\f28e\\\"}.fa-shopping-bag:before{content:\\\"\\\\f290\\\"}.fa-shopping-basket:before{content:\\\"\\\\f291\\\"}.fa-hashtag:before{content:\\\"\\\\f292\\\"}.fa-bluetooth:before{content:\\\"\\\\f293\\\"}.fa-bluetooth-b:before{content:\\\"\\\\f294\\\"}.fa-percent:before{content:\\\"\\\\f295\\\"}.fa-gitlab:before{content:\\\"\\\\f296\\\"}.fa-wpbeginner:before{content:\\\"\\\\f297\\\"}.fa-wpforms:before{content:\\\"\\\\f298\\\"}.fa-envira:before{content:\\\"\\\\f299\\\"}.fa-universal-access:before{content:\\\"\\\\f29a\\\"}.fa-wheelchair-alt:before{content:\\\"\\\\f29b\\\"}.fa-question-circle-o:before{content:\\\"\\\\f29c\\\"}.fa-blind:before{content:\\\"\\\\f29d\\\"}.fa-audio-description:before{content:\\\"\\\\f29e\\\"}.fa-volume-control-phone:before{content:\\\"\\\\f2a0\\\"}.fa-braille:before{content:\\\"\\\\f2a1\\\"}.fa-assistive-listening-systems:before{content:\\\"\\\\f2a2\\\"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:\\\"\\\\f2a3\\\"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:\\\"\\\\f2a4\\\"}.fa-glide:before{content:\\\"\\\\f2a5\\\"}.fa-glide-g:before{content:\\\"\\\\f2a6\\\"}.fa-signing:before,.fa-sign-language:before{content:\\\"\\\\f2a7\\\"}.fa-low-vision:before{content:\\\"\\\\f2a8\\\"}.fa-viadeo:before{content:\\\"\\\\f2a9\\\"}.fa-viadeo-square:before{content:\\\"\\\\f2aa\\\"}.fa-snapchat:before{content:\\\"\\\\f2ab\\\"}.fa-snapchat-ghost:before{content:\\\"\\\\f2ac\\\"}.fa-snapchat-square:before{content:\\\"\\\\f2ad\\\"}.fa-pied-piper:before{content:\\\"\\\\f2ae\\\"}.fa-first-order:before{content:\\\"\\\\f2b0\\\"}.fa-yoast:before{content:\\\"\\\\f2b1\\\"}.fa-themeisle:before{content:\\\"\\\\f2b2\\\"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:\\\"\\\\f2b3\\\"}.fa-fa:before,.fa-font-awesome:before{content:\\\"\\\\f2b4\\\"}.fa-handshake-o:before{content:\\\"\\\\f2b5\\\"}.fa-envelope-open:before{content:\\\"\\\\f2b6\\\"}.fa-envelope-open-o:before{content:\\\"\\\\f2b7\\\"}.fa-linode:before{content:\\\"\\\\f2b8\\\"}.fa-address-book:before{content:\\\"\\\\f2b9\\\"}.fa-address-book-o:before{content:\\\"\\\\f2ba\\\"}.fa-vcard:before,.fa-address-card:before{content:\\\"\\\\f2bb\\\"}.fa-vcard-o:before,.fa-address-card-o:before{content:\\\"\\\\f2bc\\\"}.fa-user-circle:before{content:\\\"\\\\f2bd\\\"}.fa-user-circle-o:before{content:\\\"\\\\f2be\\\"}.fa-user-o:before{content:\\\"\\\\f2c0\\\"}.fa-id-badge:before{content:\\\"\\\\f2c1\\\"}.fa-drivers-license:before,.fa-id-card:before{content:\\\"\\\\f2c2\\\"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:\\\"\\\\f2c3\\\"}.fa-quora:before{content:\\\"\\\\f2c4\\\"}.fa-free-code-camp:before{content:\\\"\\\\f2c5\\\"}.fa-telegram:before{content:\\\"\\\\f2c6\\\"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:\\\"\\\\f2c7\\\"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:\\\"\\\\f2c8\\\"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:\\\"\\\\f2c9\\\"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:\\\"\\\\f2ca\\\"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:\\\"\\\\f2cb\\\"}.fa-shower:before{content:\\\"\\\\f2cc\\\"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:\\\"\\\\f2cd\\\"}.fa-podcast:before{content:\\\"\\\\f2ce\\\"}.fa-window-maximize:before{content:\\\"\\\\f2d0\\\"}.fa-window-minimize:before{content:\\\"\\\\f2d1\\\"}.fa-window-restore:before{content:\\\"\\\\f2d2\\\"}.fa-times-rectangle:before,.fa-window-close:before{content:\\\"\\\\f2d3\\\"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:\\\"\\\\f2d4\\\"}.fa-bandcamp:before{content:\\\"\\\\f2d5\\\"}.fa-grav:before{content:\\\"\\\\f2d6\\\"}.fa-etsy:before{content:\\\"\\\\f2d7\\\"}.fa-imdb:before{content:\\\"\\\\f2d8\\\"}.fa-ravelry:before{content:\\\"\\\\f2d9\\\"}.fa-eercast:before{content:\\\"\\\\f2da\\\"}.fa-microchip:before{content:\\\"\\\\f2db\\\"}.fa-snowflake-o:before{content:\\\"\\\\f2dc\\\"}.fa-superpowers:before{content:\\\"\\\\f2dd\\\"}.fa-wpexplorer:before{content:\\\"\\\\f2de\\\"}.fa-meetup:before{content:\\\"\\\\f2e0\\\"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".lds-default {\\n display: inline-block;\\n position: relative;\\n width: 80px;\\n height: 80px;\\n}\\n.lds-default div {\\n position: absolute;\\n width: 6px;\\n height: 6px;\\n background: #475466;\\n border-radius: 50%;\\n animation: lds-default 1.2s linear infinite;\\n}\\n.lds-default div:nth-child(1) {\\n animation-delay: 0s;\\n top: 37px;\\n left: 66px;\\n}\\n.lds-default div:nth-child(2) {\\n animation-delay: -0.1s;\\n top: 22px;\\n left: 62px;\\n}\\n.lds-default div:nth-child(3) {\\n animation-delay: -0.2s;\\n top: 11px;\\n left: 52px;\\n}\\n.lds-default div:nth-child(4) {\\n animation-delay: -0.3s;\\n top: 7px;\\n left: 37px;\\n}\\n.lds-default div:nth-child(5) {\\n animation-delay: -0.4s;\\n top: 11px;\\n left: 22px;\\n}\\n.lds-default div:nth-child(6) {\\n animation-delay: -0.5s;\\n top: 22px;\\n left: 11px;\\n}\\n.lds-default div:nth-child(7) {\\n animation-delay: -0.6s;\\n top: 37px;\\n left: 7px;\\n}\\n.lds-default div:nth-child(8) {\\n animation-delay: -0.7s;\\n top: 52px;\\n left: 11px;\\n}\\n.lds-default div:nth-child(9) {\\n animation-delay: -0.8s;\\n top: 62px;\\n left: 22px;\\n}\\n.lds-default div:nth-child(10) {\\n animation-delay: -0.9s;\\n top: 66px;\\n left: 37px;\\n}\\n.lds-default div:nth-child(11) {\\n animation-delay: -1s;\\n top: 62px;\\n left: 52px;\\n}\\n.lds-default div:nth-child(12) {\\n animation-delay: -1.1s;\\n top: 52px;\\n left: 62px;\\n}\\n@keyframes lds-default {\\n 0%, 20%, 80%, 100% {\\n transform: scale(1);\\n }\\n 50% {\\n transform: scale(1.5);\\n }\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./styles/loader.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,qBAAqB;EACrB,kBAAkB;EAClB,WAAW;EACX,YAAY;AACd;AACA;EACE,kBAAkB;EAClB,UAAU;EACV,WAAW;EACX,mBAAmB;EACnB,kBAAkB;EAClB,2CAA2C;AAC7C;AACA;EACE,mBAAmB;EACnB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,QAAQ;EACR,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,SAAS;AACX;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,oBAAoB;EACpB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE;IACE,mBAAmB;EACrB;EACA;IACE,qBAAqB;EACvB;AACF\",\"sourcesContent\":[\".lds-default {\\n display: inline-block;\\n position: relative;\\n width: 80px;\\n height: 80px;\\n}\\n.lds-default div {\\n position: absolute;\\n width: 6px;\\n height: 6px;\\n background: #475466;\\n border-radius: 50%;\\n animation: lds-default 1.2s linear infinite;\\n}\\n.lds-default div:nth-child(1) {\\n animation-delay: 0s;\\n top: 37px;\\n left: 66px;\\n}\\n.lds-default div:nth-child(2) {\\n animation-delay: -0.1s;\\n top: 22px;\\n left: 62px;\\n}\\n.lds-default div:nth-child(3) {\\n animation-delay: -0.2s;\\n top: 11px;\\n left: 52px;\\n}\\n.lds-default div:nth-child(4) {\\n animation-delay: -0.3s;\\n top: 7px;\\n left: 37px;\\n}\\n.lds-default div:nth-child(5) {\\n animation-delay: -0.4s;\\n top: 11px;\\n left: 22px;\\n}\\n.lds-default div:nth-child(6) {\\n animation-delay: -0.5s;\\n top: 22px;\\n left: 11px;\\n}\\n.lds-default div:nth-child(7) {\\n animation-delay: -0.6s;\\n top: 37px;\\n left: 7px;\\n}\\n.lds-default div:nth-child(8) {\\n animation-delay: -0.7s;\\n top: 52px;\\n left: 11px;\\n}\\n.lds-default div:nth-child(9) {\\n animation-delay: -0.8s;\\n top: 62px;\\n left: 22px;\\n}\\n.lds-default div:nth-child(10) {\\n animation-delay: -0.9s;\\n top: 66px;\\n left: 37px;\\n}\\n.lds-default div:nth-child(11) {\\n animation-delay: -1s;\\n top: 62px;\\n left: 52px;\\n}\\n.lds-default div:nth-child(12) {\\n animation-delay: -1.1s;\\n top: 52px;\\n left: 62px;\\n}\\n@keyframes lds-default {\\n 0%, 20%, 80%, 100% {\\n transform: scale(1);\\n }\\n 50% {\\n transform: scale(1.5);\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".mainSidebar.webix_sidebar.webix_dark,\\n.darkScrollview {\\n background: #444 !important;\\n}\\n.appDevDesigns {\\n background-color: rgb(68, 68, 68) !important;\\n width: 100%;\\n height: 100%;\\n background-image: url(assets/images/appdev_logo_white.png);\\n background-size: auto 110px;\\n background-repeat: no-repeat;\\n background-position: center;\\n}\\n.policyLink {\\n background-color: rgb(68, 68, 68);\\n border-width: 0px !important;\\n margin-top: 0px !important;\\n}\\na.policyMenu {\\n color: #BBB;\\n text-decoration: none;\\n}\\na.policyAuth {\\n color: #475466;\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_sidebar_icon {\\n margin-right: 15px;\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_tree_branch_1 {\\n //border-top: 1px solid rgba(255,255,255,0.1);\\n border-bottom: 1px solid rgba(0, 0, 0, 0.4);\\n box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.1);\\n}\\n.mainToolbar .webix_icon {\\n margin-top: -2px;\\n}\\n.mainToolbar.webix_toolbar.webix_dark {\\n background: #333;\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_tree_item:hover {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.mainSidebar.webix_sidebar.webix_dark\\n .webix_tree_item:hover\\n .webix_sidebar_icon {\\n color: rgba(255, 255, 255, 0.8);\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_tree_item.webix_selected,\\n.mainSidebar .webix_tree_item.webix_sidebar_selected {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #1ca1c1;\\n}\\n.mainSidebar.webix_sidebar.webix_dark\\n .webix_tree_item.webix_selected\\n .webix_icon {\\n color: #1ca1c1;\\n}\\n.webix_toolbar.webix_dark .webix_secondary.activePage button {\\n background-color: #1ca1c1 !important;\\n}\\n.webix_toolbar.webix_dark .userMenu.webix_menu-x .webix_list_item {\\n background-color: transparent;\\n padding: 3px 10px;\\n opacity: 0.7;\\n}\\n.webix_toolbar.webix_dark .inbox.webix_secondary button {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_dark .inbox.webix_secondary button .webix_icon_btn {\\n opacity: 0.7;\\n font-size: 20px;\\n}\\n.appPages .webix_button {\\n font-size: 14px;\\n color: rgba(255, 255, 255, 0.8) !important;\\n}\\n.appPages .webix_icon_btn {\\n opacity: 0.4;\\n}\\n\\n/* Styles imported from AppBuilder v1 */\\nlabel {\\n font-weight: 500;\\n}\\n/* Custom Webix Badge */\\n.webix_badge {\\n font-size: 8pt;\\n height: 18px;\\n line-height: 18px;\\n min-width: 18px;\\n right: 0;\\n}\\n/* Custom selectivity */\\n.webix_checksuggest_select_all .webix_el_box {\\n height: auto !important;\\n}\\n.webix_multicombo_tag,\\n.webix_multicombo_value {\\n box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.3);\\n border-bottom: 1px solid #fff;\\n margin: 3px 3px 1px;\\n max-height: 27px;\\n overflow: hidden;\\n line-height: 26px;\\n font-weight: normal;\\n color: #475466 !important;\\n}\\n.badgeContainer {\\n position: relative;\\n}\\n.webix_tooltip .webix_badge.selectivityBadge {\\n display: none;\\n}\\n.editConnectedPage {\\n margin-left: -5px;\\n margin-right: 5px;\\n opacity: 0.4;\\n}\\n.editConnectedPage:hover {\\n opacity: 1;\\n cursor: pointer;\\n}\\n.webix_tooltip .webix_multicombo_delete {\\n display: none;\\n}\\n.webix_multicombo_delete:hover:after {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n.webix_multicombo_delete:hover {\\n transform: scale(1.1);\\n}\\n.webix_multicombo_delete.clear-combo-value {\\n transition: all 0.2s ease-in-out;\\n}\\n.webix_multicombo_value {\\n display: flex;\\n /* width: 100%; */\\n}\\n.webix_multicombo_value .ellip {\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n}\\n.webix_cell .webix_multicombo_tag,\\n.webix_cell .webix_multicombo_value {\\n line-height: 26px;\\n margin: 4px 1.5px;\\n}\\n.webix_el_combo .webix_progress_state {\\n font-size: 35px !important;\\n}\\n.webix_list_item .editConnectedPage {\\n display: none;\\n}\\n.hascustomcolor {\\n color: white !important;\\n text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.3) !important;\\n}\\n.combowithcolors .webix_inp_static {\\n padding-left: 0px;\\n}\\n.webix_multicombo_delete:after {\\n color: rgba(0, 0, 0, 0.4);\\n text-shadow: none;\\n}\\n.hideWebixMulticomboTag .webix_multicombo_tag {\\n box-shadow: none;\\n padding: 0;\\n border: 0;\\n margin: 0;\\n background: transparent;\\n border-radius: 0;\\n max-height: none;\\n}\\n.selectivity-placeholder {\\n text-indent: 10px;\\n color: #666;\\n}\\n.selectivity-multiple-input-container {\\n background: transparent !important;\\n padding: 0px !important;\\n overflow: hidden !important;\\n max-height: unset;\\n /* border-radius: 6px; */\\n}\\n.selectivity-single-result-container {\\n left: 2px;\\n}\\n.selectivity-multiple-selected-item,\\n.selectivity-single-selected-item {\\n background: #337ab7 !important;\\n padding: 0 10px;\\n border-radius: 15px !important;\\n color: #fff !important;\\n line-height: 29px;\\n display: inline-block;\\n height: unset !important;\\n margin: 2px;\\n /*max-width: 100px !important;*/\\n}\\n.selectivity-multiple-input,\\ninput[type=\\\"text\\\"].selectivity-multiple-input {\\n height: 33px;\\n text-indent: 10px;\\n}\\n.selectivity-single-selected-item-remove {\\n color: #fff;\\n float: none;\\n padding: 7px 5px 7px 0px;\\n}\\n.selectivity-multiple-selected-item-edit,\\n.selectivity-multiple-selected-item-remove {\\n padding: 5px 0 5px 5px;\\n}\\n.selectivity-single-selected-item-edit,\\n.selectivity-multiple-selected-item-edit,\\n.selectivity-single-selected-item-edit:hover,\\n.selectivity-multiple-selected-item-edit:hover {\\n color: #fff;\\n cursor: pointer;\\n text-decoration: none !important;\\n background: #1ca1c1;\\n margin-left: -9pt;\\n padding: 5px 5px 5px 10px;\\n margin-right: 5px;\\n}\\n.customField {\\n line-height: 33px;\\n}\\n.customField .selectivity-multiple-input-container {\\n border: 1px solid #ccd7e6;\\n /* border-radius: 6px; */\\n margin-right: 4px;\\n}\\n.readonlyField {\\n background-color: #fff;\\n}\\n.selectivity-single-select {\\n background: transparent !important;\\n}\\n.webix_cell .form-entry {\\n border: 0;\\n}\\n.form-entry {\\n border-radius: 6px;\\n height: 100%;\\n border: 1px solid #ddd;\\n color: #666;\\n background: #fff;\\n border-color: #ccc;\\n margin-right: 2px;\\n}\\n.form-entry .selectivity-multiple-selected-item {\\n float: none;\\n}\\n.webix_template .selectivity-single-select {\\n padding: 0;\\n border: 1px solid #ccd7e6;\\n /* border-radius: 6px; */\\n margin-right: 4px;\\n}\\n.selectivity-single-select input {\\n padding: 0;\\n border: 0;\\n}\\n.selectivity-single-selected-item {\\n color: #666;\\n}\\n.selectivity-single-result-container {\\n top: 0em !important;\\n}\\n.selectivity-caret {\\n top: 0.4em !important;\\n}\\n.selectivityBadge {\\n top: 6px;\\n right: -5px;\\n background: #aaa;\\n}\\n.list-data-values,\\n.connect-data-values {\\n position: relative;\\n}\\n\\n.ab-app-list-info {\\n float: left;\\n height: 100%;\\n}\\n.ab-tree-ui .webix_scroll_cont .webix_tree_leaves {\\n display: block !important;\\n}\\n.ab-app-list-edit,\\n.ab-object-list-edit,\\n.ab-page-list-edit {\\n float: right;\\n height: 100%;\\n opacity: 0.6;\\n}\\n.ab-app-list-edit:hover,\\n.ab-object-list-edit:hover,\\n.ab-page-list-edit:hover {\\n opacity: 1;\\n}\\n.ab-app-list-edit .webix_list_item {\\n line-height: 50px;\\n}\\n.ab-app-list-edit .webix_icon {\\n line-height: 59px;\\n}\\n.ab-app-list-item {\\n height: 100%;\\n clear: both;\\n}\\n.ab-app-list-edit .webix_list_item {\\n padding: 10px;\\n}\\n.ab-app-list-name {\\n font-size: 20px;\\n line-height: 20px;\\n margin-top: 10px;\\n}\\n.ab-app-list-description {\\n opacity: 0.6;\\n}\\n\\n.webix_list_item .webix_icon {\\n font-size: inherit;\\n}\\n.webix_list_item .webix_icon.wxi-checkbox-marked {\\n font-size: 20px;\\n}\\n.emptypane {\\n line-height: auto;\\n}\\n.opsportal-area-site-default-appbuilder a,\\n.webix_view a {\\n opacity: 1;\\n}\\n.webix_list_item.menu.selected {\\n background: #657584;\\n}\\n.webix_icon_btn {\\n font-size: 20px;\\n}\\n.appTitle .webix_el_box {\\n font-size: 20px !important;\\n}\\n.webix_dark .webix_icon_btn {\\n opacity: 0.4;\\n}\\n.ab_amp .webix_dark .webix_icon_btn {\\n opacity: 1;\\n}\\n.webix_el_button button {\\n /* font-size: 14px; */\\n}\\n.webix_el_button button.webixtype_standard:hover {\\n text-decoration: underline;\\n}\\n.webix_menu-x .webix_list_item {\\n line-height: 31px;\\n}\\n.bg-white {\\n background: white;\\n}\\n.ab-component-tools {\\n position: absolute;\\n top: 2px;\\n right: 33px;\\n}\\n.ab-component-tools.ab-tab-tools {\\n right: 0;\\n z-index: 100;\\n}\\n.ab-component-remove,\\n.ab-component-edit {\\n width: 31px;\\n height: 31px;\\n display: inline-block;\\n margin-right: 1px;\\n font-size: 18px;\\n text-align: center;\\n line-height: 33px !important;\\n background: #4caf50;\\n color: white;\\n top: -2px;\\n position: relative;\\n overflow: hidden;\\n float: right;\\n}\\n.ab-component-remove:hover,\\n.ab-component-edit:hover {\\n cursor: pointer;\\n}\\n.ab-component-remove {\\n background: #ff3b30;\\n}\\n.panel_icon {\\n font-size: 16px;\\n width: 22px;\\n height: 24px;\\n line-height: 24px;\\n}\\n.webix_fieldset_label {\\n width: auto;\\n margin-bottom: 0;\\n border: 0;\\n}\\n.ab-widget-header {\\n background: #eee;\\n}\\n.ab-component-header .webix_el_box {\\n font-size: 24px;\\n}\\n.ab-component-description .webix_el_box {\\n color: #666;\\n}\\n.bg_gray {\\n background-color: #ebedf0;\\n}\\n.noBackground, .webix_dark .webix_sidebar {\\n background-color: transparent;\\n}\\n.webix_dark .webix_view {\\n background-color: transparent;\\n color: white;\\n}\\n.ab_amp .webix_dark .webix_view {\\n background-color: white;\\n color: inherit;\\n}\\n.webix_dark .webix_list-x .webix_list_item {\\n border-right: 0;\\n}\\n.ab-text .ab-detail-component-holder {\\n line-height: 32px;\\n}\\n.webix_tree_checkbox {\\n margin: 5px 6px 0 0 !important;\\n height: 14px;\\n width: 14px;\\n}\\n.ab-menu-left .webix_scroll_cont {\\n text-align: left;\\n}\\n.ab-menu-right .webix_scroll_cont {\\n text-align: right;\\n}\\n.ab-menu-center .webix_scroll_cont {\\n text-align: center;\\n}\\n.ab-menu-link.webix_menu-x .webix_list_item {\\n background: transparent;\\n color: #337ab7;\\n font-weight: bold;\\n padding: 0;\\n margin-right: 15px;\\n}\\n.ab-menu-link.webix_menu-x .webix_list_item:hover {\\n text-decoration: underline;\\n}\\n.ab-custom-field {\\n overflow: visible;\\n}\\n.ab-custom-field .webix_template {\\n padding: 0;\\n}\\n.ab-custom-field legend {\\n border-bottom: none;\\n}\\n\\n.ab-component-form-rule {\\n background-color: #dcdcdc;\\n}\\n.ab-main-container .webix_querybuilder_wrap .webix_layout_form,\\n.ab-main-container .ab-component-form-rules .webix_layout_form {\\n background: inherit !important;\\n}\\n.ab-component-form-rules .webix_view {\\n background: transparent !important;\\n}\\n.ab-component-form-rules {\\n background: #ddd;\\n border-radius: 5px;\\n box-shadow: inset 0px 2px 5px 0px rgba(0, 0, 0, 0.4);\\n position: relative;\\n overflow: visible;\\n}\\n.ab-component-form-rules-delete {\\n background: transparent;\\n}\\n.ab-component-form-rules-delete .ab-component-remove {\\n position: absolute;\\n top: -6px;\\n right: -8px;\\n border-radius: 100%;\\n}\\n/* Connect object data */\\n.ab-connect-add-new a.fa {\\n width: 35px;\\n height: 35px;\\n display: block;\\n float: left;\\n border-radius: 4px;\\n background: #1ca1c1;\\n color: white;\\n opacity: 1;\\n text-align: center;\\n line-height: 35px;\\n}\\n.ab-connect-add-new a.fa:hover {\\n text-decoration: none;\\n background-color: #1992af;\\n}\\n.ab-connect-data-info {\\n display: inline-block;\\n width: 90px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.ab-connect-data-disable {\\n background-color: #aaa;\\n}\\n.stop-scrolling {\\n height: 100%;\\n overflow: hidden;\\n}\\n.ab-scroll-y {\\n overflow-y: auto !important;\\n}\\n.ab-ellipses-text,\\n.ab-ellipses-text > div {\\n overflow: hidden;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n}\\n.webix_dtable .webix_ss_footer .webix_hcell:hover,\\n.webix_dtable .webix_ss_header .webix_hcell:hover {\\n border-right-color: #dadee0;\\n}\\n\\n/* Interface Editor */\\n.ab-widget-header {\\n background-color: #ddd;\\n}\\n.ab-widget-header .webix_icon_btn {\\n opacity: 0.7;\\n margin-left: 5px;\\n}\\n.ab-main-container .widget_drag {\\n position: absolute;\\n z-index: 1;\\n top: 0px;\\n right: 0px;\\n width: 33px;\\n opacity: 1;\\n cursor: move;\\n background-color: #aaa;\\n height: 31px;\\n color: #fff;\\n}\\n.ab-main-container .widget_drag:hover {\\n opacity: 0.8;\\n}\\n.ab-main-container .widget_drag .webix_icon {\\n line-height: 28px;\\n width: 33px;\\n height: 33px;\\n text-align: center;\\n}\\n.webix_el_checkbox .webix_label_right {\\n padding-top: 0;\\n}\\n.webix_cell .ab-image-data-field {\\n /* pointer-events: none; */\\n padding: 0;\\n}\\n.ab-image-holder, .ab-image-holder .webix_template {\\n padding: 0;\\n overflow: visible;\\n}\\n.ab-image-data-field {\\n width: 100%;\\n height: 100%;\\n}\\n.ab-image-data-field-download {\\n position: absolute;\\n left: 0;\\n background-color: #dcdcdc;\\n padding: 3px 1px 1px 1px;\\n opacity: 0.5 !important;\\n text-decoration: none;\\n color: #000;\\n}\\n.ab-image-data-field-download:hover {\\n opacity: 1 !important;\\n text-decoration: none;\\n color: #000;\\n}\\n.detailsView .webix_icon:hover,\\n.edit .webix_icon:hover,\\n.trash .webix_icon:hover {\\n cursor: pointer;\\n}\\n.ab-layout-header {\\n position: relative;\\n}\\n.ab-layout-header > .ab-component-tools {\\n right: 0px;\\n}\\n\\n.transparent {\\n background: transparent !important;\\n}\\n.borderless {\\n border: none !important;\\n}\\n.nopadding {\\n padding: 0 !important;\\n}\\n.nomargin {\\n margin: 0 !important;\\n}\\n.webix_modal {\\n opacity: 0.8;\\n}\\n.modal_title .webix_el_box {\\n font-size: 18px;\\n}\\n/* Loading Screen */\\n.ab-loading-screen {\\n background: #000;\\n opacity: 0.7;\\n position: absolute !important;\\n}\\n.ab-loading-body {\\n background: #000;\\n border-width: 0px !important;\\n}\\n.ab-loading-message {\\n color: #fff !important;\\n background: #000 !important;\\n font-size: 30px !important;\\n text-align: center;\\n vertical-align: middle;\\n border-width: 0px !important;\\n padding-top: 20% !important;\\n height: 100px !important;\\n}\\n.ab-loading-button {\\n text-align: center;\\n}\\n.ab-loading-button button {\\n background-color: #003b7e;\\n width: 200px;\\n}\\n.ab-loading-cancel-button {\\n text-align: center;\\n background: transparent;\\n}\\n.ab-loading-cancel-button a {\\n color: #fff !important;\\n}\\n.ab-loading-screen .webix_progress_bottom {\\n height: 40px !important;\\n opacity: 1;\\n}\\n.ab-loading-screen .webix_progress_bottom .webix_progress_state {\\n height: 40px !important;\\n}\\n.webix_menu-x .webix_list_item:last-child {\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_menu-x .webix_list_item:first-child {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n}\\n.preview_item {\\n background: #999;\\n}\\n.panel_drag_view {\\n border-width: 0 1px 1px 1px;\\n border-color: 1px solid #dadee0;\\n border-style: solid;\\n}\\n.panel_drag_view:before {\\n content: \\\"\\\";\\n display: block;\\n height: 100%;\\n width: 100%;\\n background: rgb(255, 255, 255);\\n background: linear-gradient(\\n 0deg,\\n rgba(255, 255, 255, 1) 15%,\\n rgba(255, 255, 255, 0) 80%\\n );\\n position: absolute;\\n z-index: 1;\\n top: 31px;\\n}\\n.ab-datacollection-table .ab-component-in-page {\\n text-align: center;\\n line-height: 15px;\\n vertical-align: middle;\\n display: table-cell;\\n}\\n.ab-datacollection-table .webix_dataview_item {\\n display: table;\\n}\\n.ab-datacollection-table .fa {\\n color: #337ab7;\\n margin-bottom: 10px;\\n}\\n.ab-datacollection-table.borderless .webix_dataview_item,\\n.borderless .webix_dataview_item {\\n border: none;\\n padding: 12px;\\n}\\n.ab-datacollection-table .webix_dataview_item:hover {\\n background: #edeff0;\\n border-radius: 5px;\\n}\\n.webix_list_item:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected,\\n.webix_all_tabs .webix_item_tab.webix_selected:hover,\\n.webix_all_tabs .webix_item_tab.webix_selected:active,\\n.webix_all_tabs .webix_item_tab.webix_selected:focus {\\n color: white;\\n background: #1ca1c199 !important;\\n box-shadow: inset 0 -3px #1ca1c1;\\n}\\n.webix_all_tabs .webix_item_tab,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon {\\n box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.25);\\n background: #ebedf0;\\n}\\n.ab-tab-back:hover,\\n.ab-tab-next:hover,\\n.ab-tab-up:hover,\\n.ab-tab-down:hover {\\n cursor: e-resize;\\n opacity: 1;\\n}\\n.ab-tab-back:hover {\\n cursor: w-resize;\\n}\\n.ab-tab-up:hover {\\n cursor: n-resize;\\n opacity: 1;\\n}\\n.ab-tab-down:hover {\\n cursor: s-resize;\\n}\\n.ab-tab-back,\\n.ab-tab-next,\\n.ab-tab-up,\\n.ab-tab-down {\\n float: left;\\n margin-left: 10px;\\n background: #1ca1c1;\\n opacity: 0.8;\\n width: 20px;\\n height: 20px;\\n border-radius: 10px;\\n line-height: 18px;\\n padding-right: 2px;\\n color: white;\\n}\\n.ab-tab-edit {\\n opacity: 0.4;\\n}\\n.ab-tab-edit:hover {\\n opacity: 1;\\n}\\n.ab-tab-next {\\n float: right;\\n margin-right: 10px;\\n padding-left: 6px;\\n}\\n.ab-tab-up,\\n.ab-tab-down {\\n float: right;\\n margin: 12px -2px 12px 15px;\\n padding-left: 6px;\\n}\\n.webix_all_tabs div:nth-child(1) .ab-tab-back {\\n display: none;\\n}\\n.webix_all_tabs div:nth-last-child(1) .ab-tab-next {\\n display: none;\\n}\\n.webix_tab_filler:nth-last-child(1) {\\n width: 17px !important;\\n}\\n.ab-tabview-scrollview {\\n /* margin-top: -1px; */\\n}\\n.ab-tabIconContainer {\\n display: inline-block;\\n}\\n\\n.webix_view.webix_control.webix_el_tabbar.webix_dark {\\n background: #4a4e58;\\n}\\n.webix_el_tabbar.webix_dark .webix_all_tabs .webix_item_tab {\\n background: transparent;\\n color: white;\\n}\\n.webix_el_tabbar.webix_dark .webix_all_tabs .webix_item_tab:hover {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n.webix_sidebar.webix_dark .webix_tree_item.webix_selected span {\\n color: white;\\n}\\n.webix_sidebar.webix_dark\\n .webix_tree_item.webix_selected\\n span.webix_sidebar_icon {\\n color: inherit;\\n}\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_inp_counter_next,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_inp_counter_prev,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_menu-x .webix_list_item,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_segment_0,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_segment_1,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_segment_N,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webixtype_base,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webixtype_next,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webixtype_prev {\\n border-color: rgba(0, 0, 0, 0.1);\\n}\\n.webix_tree_none {\\n /* display: none; */\\n}\\n.ab-background-lightgray {\\n background: #c0c5cc;\\n}\\n.ab-background-gray {\\n background: #475466;\\n}\\n.ab-background-gray::before {\\n content: \\\"\\\";\\n background: #475466;\\n display: block;\\n position: absolute;\\n left: 0;\\n width: 100%;\\n height: 100vh;\\n}\\n.ab-background-gray .webix_view.webix_layout_form {\\n background: transparent;\\n}\\n.webix_carousel .image {\\n background: #333;\\n}\\n.webix_nav_panel .webix_nav_item {\\n box-sizing: border-box;\\n}\\n.ab-carousel-image-container {\\n position: relative;\\n height: 100%;\\n}\\n.ab-carousel-image-container img {\\n width: 100%;\\n height: 100%;\\n object-fit: contain;\\n}\\n.ab-carousel-image-title {\\n position: absolute;\\n top: 0;\\n left: 0;\\n font-size: 18px;\\n padding: 4px;\\n background: rgba(0, 0, 0, 0.4);\\n border-bottom-right-radius: 8px;\\n color: #fff;\\n}\\n.ab-carousel-image-icon {\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n font-size: 20px;\\n border-bottom-left-radius: 8px;\\n background: rgba(255, 255, 255, 0.4);\\n}\\n.ab-carousel-image-icon span {\\n opacity: 0.6;\\n margin: 6px;\\n}\\n.ab-carousel-image-icon span:hover {\\n opacity: 1;\\n cursor: pointer;\\n}\\n.webix_carousel.fullscreen .ab-carousel-fullscreen {\\n display: none;\\n}\\n.ab-detail-view .webix_accordionitem {\\n border-radius: 5px;\\n box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 2px 0px;\\n border-color: transparent;\\n}\\n.ab-detail-page.ab-detail-hover .webix_accordionitem:hover {\\n box-shadow: rgba(0, 0, 0, 0.2) 0px 3px 2px 0px;\\n}\\n.ab-detail-page .webix_accordionitem:hover .webix_accordionitem_body:after {\\n background: #1da1c14f;\\n width: 100%;\\n height: 100%;\\n display: block;\\n position: absolute;\\n cursor: pointer;\\n top: 0;\\n font-family: \\\"FontAwesome\\\";\\n content: \\\"\\\";\\n color: white;\\n text-align: center;\\n font-size: 72px;\\n vertical-align: middle;\\n}\\n.ab-edit-page .webix_accordionitem:hover {\\n position: relative;\\n}\\n.ab-edit-page .webix_accordionitem:hover .webix_accordionitem_header {\\n display: block !important;\\n position: absolute;\\n right: 0;\\n top: 0;\\n border: 0;\\n z-index: 1;\\n border-bottom-left-radius: 10px;\\n}\\n.ab-edit-page\\n .webix_accordionitem:hover\\n .webix_accordionitem_header\\n .webix_accordionitem_button:before {\\n content: \\\"\\\\f013\\\";\\n font-family: \\\"FontAwesome\\\";\\n color: #94a1b3;\\n}\\n.ab-edit-page.ab-detail-page\\n .webix_accordionitem:hover\\n .webix_accordionitem_header\\n .webix_accordionitem_button:before {\\n color: white;\\n}\\n.ab-edit-page\\n .webix_accordionitem\\n .webix_accordionitem_header:hover\\n .webix_accordionitem_button:before {\\n color: #94a1b3 !important;\\n}\\n.ab-custom-template .webix_template {\\n padding: 10px;\\n}\\n\\n.image-data-field-image {\\n position: relative;\\n border: 5px solid white;\\n background-size: contain;\\n background-position: center;\\n overflow: visible;\\n background-repeat: no-repeat;\\n background-color: #333;\\n}\\n.ab-delete-photo {\\n position: absolute;\\n top: 0;\\n right: 0;\\n}\\n.hasDataCollection {\\n color: #1ca1c1;\\n margin: 5px;\\n position: absolute;\\n right: 0;\\n background: white;\\n}\\n.sidebarCustomIcon {\\n font-family: \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n font-size: 12px !important;\\n background: #94a1b3 !important;\\n border-radius: 100%;\\n width: 20px !important;\\n height: 20px;\\n line-height: 20px;\\n color: #fff !important;\\n font-weight: bold;\\n vertical-align: unset !important;\\n}\\n.webix_dark .sidebarCustomIcon {\\n color: #4a4e58 !important;\\n}\\n.webix_dark .webix_selected .sidebarCustomIcon {\\n background: #1ca1c1 !important;\\n color: #4a4e58 !important;\\n}\\n.webix_selected .sidebarCustomIcon {\\n color: #fff !important;\\n background: #1ca1c1 !important;\\n}\\n\\n/* FormBuilder Clases */\\n.formbuilder {\\n padding: 20px;\\n}\\n.card-header .btn {\\n color: #333;\\n}\\n.card {\\n position: relative;\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-direction: column;\\n flex-direction: column;\\n min-width: 0;\\n word-wrap: break-word;\\n background-color: #fff;\\n background-clip: border-box;\\n border: 1px solid rgba(0, 0, 0, 0.125);\\n border-radius: 0.25rem;\\n}\\n\\n.card > hr {\\n margin-right: 0;\\n margin-left: 0;\\n}\\n\\n.card > .list-group:first-child .list-group-item:first-child {\\n border-top-left-radius: 0.25rem;\\n border-top-right-radius: 0.25rem;\\n}\\n\\n.card > .list-group:last-child .list-group-item:last-child {\\n border-bottom-right-radius: 0.25rem;\\n border-bottom-left-radius: 0.25rem;\\n}\\n\\n.card-body {\\n -ms-flex: 1 1 auto;\\n flex: 1 1 auto;\\n min-height: 1px;\\n padding: 1.25rem;\\n}\\n\\n.card-title {\\n margin-bottom: 0.75rem;\\n}\\n\\n.card-subtitle {\\n margin-top: -0.375rem;\\n margin-bottom: 0;\\n}\\n\\n.card-text:last-child {\\n margin-bottom: 0;\\n}\\n\\n.card-link:hover {\\n text-decoration: none;\\n}\\n\\n.card-link + .card-link {\\n margin-left: 1.25rem;\\n}\\n\\n.card-header {\\n padding: 0.75rem 1.25rem;\\n margin-bottom: 0;\\n background-color: rgba(0, 0, 0, 0.03);\\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-header:first-child {\\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\\n}\\n\\n.card-header + .list-group .list-group-item:first-child {\\n border-top: 0;\\n}\\n\\n.card-footer {\\n padding: 0.75rem 1.25rem;\\n background-color: rgba(0, 0, 0, 0.03);\\n border-top: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-footer:last-child {\\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\\n}\\n\\n.card-header-tabs {\\n margin-right: -0.625rem;\\n margin-bottom: -0.75rem;\\n margin-left: -0.625rem;\\n border-bottom: 0;\\n}\\n\\n.card-header-pills {\\n margin-right: -0.625rem;\\n margin-left: -0.625rem;\\n}\\n\\n.card-img-overlay {\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n padding: 1.25rem;\\n}\\n\\n.card-img,\\n.card-img-bottom,\\n.card-img-top {\\n -ms-flex-negative: 0;\\n flex-shrink: 0;\\n width: 100%;\\n}\\n\\n.card-img,\\n.card-img-top {\\n border-top-left-radius: calc(0.25rem - 1px);\\n border-top-right-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-img,\\n.card-img-bottom {\\n border-bottom-right-radius: calc(0.25rem - 1px);\\n border-bottom-left-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-deck .card {\\n margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n .card-deck {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-flow: row wrap;\\n flex-flow: row wrap;\\n margin-right: -15px;\\n margin-left: -15px;\\n }\\n .card-deck .card {\\n -ms-flex: 1 0 0%;\\n flex: 1 0 0%;\\n margin-right: 15px;\\n margin-bottom: 0;\\n margin-left: 15px;\\n }\\n}\\n\\n.card-group > .card {\\n margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n .card-group {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-flow: row wrap;\\n flex-flow: row wrap;\\n }\\n .card-group > .card {\\n -ms-flex: 1 0 0%;\\n flex: 1 0 0%;\\n margin-bottom: 0;\\n }\\n .card-group > .card + .card {\\n margin-left: 0;\\n border-left: 0;\\n }\\n .card-group > .card:not(:last-child) {\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n }\\n .card-group > .card:not(:last-child) .card-header,\\n .card-group > .card:not(:last-child) .card-img-top {\\n border-top-right-radius: 0;\\n }\\n .card-group > .card:not(:last-child) .card-footer,\\n .card-group > .card:not(:last-child) .card-img-bottom {\\n border-bottom-right-radius: 0;\\n }\\n .card-group > .card:not(:first-child) {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n }\\n .card-group > .card:not(:first-child) .card-header,\\n .card-group > .card:not(:first-child) .card-img-top {\\n border-top-left-radius: 0;\\n }\\n .card-group > .card:not(:first-child) .card-footer,\\n .card-group > .card:not(:first-child) .card-img-bottom {\\n border-bottom-left-radius: 0;\\n }\\n}\\n\\n.card-columns .card {\\n margin-bottom: 0.75rem;\\n}\\n\\n@media (min-width: 576px) {\\n .card-columns {\\n -webkit-column-count: 3;\\n -moz-column-count: 3;\\n column-count: 3;\\n -webkit-column-gap: 1.25rem;\\n -moz-column-gap: 1.25rem;\\n column-gap: 1.25rem;\\n orphans: 1;\\n widows: 1;\\n }\\n .card-columns .card {\\n display: inline-block;\\n width: 100%;\\n }\\n}\\n\\n.accordion > .card {\\n overflow: hidden;\\n}\\n\\n.accordion > .card:not(:last-of-type) {\\n border-bottom: 0;\\n border-bottom-right-radius: 0;\\n border-bottom-left-radius: 0;\\n}\\n\\n.accordion > .card:not(:first-of-type) {\\n border-top-left-radius: 0;\\n border-top-right-radius: 0;\\n}\\n\\n.accordion > .card > .card-header {\\n border-radius: 0;\\n margin-bottom: -1px;\\n}\\n.form-builder-group-header {\\n padding: 0;\\n}\\n.formio .btn:hover,\\n.btn:focus {\\n background-position: 0 0 !important;\\n}\\n.mb-0,\\n.my-0 {\\n margin-bottom: 0 !important;\\n}\\n.mt-0,\\n.my-0 {\\n margin-top: 0 !important;\\n}\\n.scrolly {\\n overflow: scroll;\\n}\\n.forceOpen {\\n display: block !important;\\n}\\n.formio .btn-secondary,\\n.formio-dialog .btn-secondary {\\n color: #333;\\n}\\n.formio-dialog a,\\n.formio a {\\n opacity: 1 !important;\\n}\\n.component-settings .nav > li > a {\\n margin-bottom: -7px;\\n}\\n.formio-form .input-group {\\n display: flex;\\n}\\n.formio-form .input-group-append {\\n margin-left: -1px;\\n}\\n.formio-form .input-group-append,\\n.formio-form .input-group-prepend {\\n display: -ms-flexbox;\\n display: flex;\\n}\\n.formio-form .input-group-text {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-align: center;\\n align-items: center;\\n padding: 0.375rem 0.75rem;\\n margin-bottom: 0;\\n font-size: 1rem;\\n font-weight: 400;\\n line-height: 1.5;\\n color: #495057;\\n text-align: center;\\n white-space: nowrap;\\n background-color: #e9ecef;\\n border: 1px solid #ced4da;\\n border-radius: 0.25rem;\\n}\\n.formio-form .input-group > .input-group-append > .btn,\\n.formio-form .input-group > .input-group-append > .input-group-text,\\n.formio-form\\n .input-group\\n > .input-group-prepend:first-child\\n > .btn:not(:first-child),\\n.formio-form\\n .input-group\\n > .input-group-prepend:first-child\\n > .input-group-text:not(:first-child),\\n.formio-form .input-group > .input-group-prepend:not(:first-child) > .btn,\\n.formio-form\\n .input-group\\n > .input-group-prepend:not(:first-child)\\n > .input-group-text {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n}\\n.formio-form .nav-tabs > li {\\n margin-bottom: -8px;\\n}\\n.formio-dialog .formio-form .nav-tabs > li {\\n margin-bottom: -1px;\\n}\\n.max100 {\\n max-width: 100%;\\n}\\n.webix_qb_buttons button {\\n height: auto;\\n}\\n.no-margin {\\n margin: 0 !important;\\n}\\n.ab_amp .fa-stack {\\n font-size: 0.65em;\\n}\\n.ab_amp i {\\n vertical-align: middle;\\n}\\n.ab_amp.lightgray {\\n background: #eee;\\n}\\n.ab_amp .webixLineTree:hover {\\n cursor: pointer;\\n}\\n.ab_amp .accessLevel .fa-stack {\\n vertical-align: top;\\n margin-top: 3px;\\n}\\n.ab_amp .accessLevel:hover .fa-stack {\\n transform: scale(1.25, 1.25);\\n}\\n.ab_amp .externalLink {\\n color: #ccc;\\n float: right;\\n margin-top: 5px;\\n}\\n.ab_amp .externalLink:hover {\\n color: #666 !important;\\n}\\n.ab_amp .webix_accordionitem .webix_accordionitem_button,\\n.ab_amp .webix_accordionitem.collapsed .webix_accordionitem_button {\\n float: left !important;\\n}\\n.ab_amp .webix_accordionitem .webix_accordionitem_button {\\n transform: rotate(180deg);\\n}\\n.ab_amp .webix_accordionitem.collapsed .webix_accordionitem_button {\\n transform: rotate(-90deg);\\n}\\n.ab_amp .webix_accordionitem_header {\\n background-color: #1ca1c1 !important;\\n}\\n.ab_amp .webix_accordionitem_header.collapsed {\\n background-color: white !important;\\n}\\n.ab_amp .webix_danger_inverse button {\\n border: 1px solid #ff4938;\\n color: #ff4938;\\n background: white;\\n}\\n.ab_amp .webix_danger_inverse .webix_icon_btn {\\n color: #ff4938;\\n}\\n.ab_amp .webix_danger_inverse:hover button {\\n background-color: #ff4938;\\n color: #fff;\\n}\\n.ab_amp .webix_danger_inverse:hover .webix_icon_btn {\\n color: #fff;\\n}\\ndiv.amp {\\n font-family: \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n background: rgb(28, 161, 193, 0.4);\\n /* padding: 5px 0; */\\n display: inline-block;\\n right: 0;\\n top: 75px;\\n border-top-left-radius: 10px;\\n border-bottom-left-radius: 10px;\\n color: white;\\n font-size: 16px;\\n transition: 0.25s all;\\n position: absolute;\\n width: 40px;\\n white-space: nowrap;\\n overflow: hidden;\\n height: 32px;\\n z-index: 100;\\n display: flex;\\n}\\ndiv.amp.qtt {\\n top: 108px;\\n}\\ndiv.amp div {\\n padding: 5px 10px;\\n}\\ndiv.amp div:first-child {\\n background: rgba(255, 255, 255, 0.2);\\n border-right: 1px solid rgba(255, 255, 255, 0.4);\\n padding: 5px 10px;\\n}\\ndiv.amp:hover {\\n width: 212px !important;\\n cursor: pointer;\\n background: rgb(28, 161, 193) !important;\\n}\\ndiv.amp:hover .fa-unlock-alt {\\n display: inline-block !important;\\n}\\ndiv.amp:hover .fa-lock {\\n display: none !important;\\n}\\ndiv.amp .fa-unlock-alt,\\ndiv.amp .fa-lock,\\ndiv.amp .fa-language {\\n transform: scale(1.25, 1.25);\\n text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2);\\n}\\ndiv.amp .fa-unlock-alt {\\n display: none;\\n}\\n.ampWindow .webix_toolbar.webix_dark {\\n background: #444 !important;\\n}\\n/* .accessLevel-0::before {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n background: rgba(233, 30, 30, 0.4);\\n display: block;\\n position: absolute;\\n}\\n.accessLevel-1::before {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n background: rgba(33, 150, 243, 0.4);\\n display: block;\\n position: absolute;\\n}\\n.accessLevel-2::before {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n background: rgba(76, 175, 80, 0.4);\\n display: block;\\n position: absolute;\\n} */\\n.ab-csv-importer .row-pass {\\n background-color: #b4e8b6;\\n}\\n.ab-csv-importer .row-fail {\\n background-color: #e4b0ad;\\n}\\n.ab-csv-importer .row-warn {\\n background-color: #f9d59f;\\n}\\n.ab-csv-importer .cell-invalid {\\n background-color: #e9ab4d;\\n}\\n.transparentBG .webix_el_tabbar + .webix_multiview {\\n background: transparent !important;\\n}\\n.webix_hcell .fa {\\n opacity: 0.4;\\n}\\n.ab-widget-header .webix_template {\\n padding: 0 10px;\\n}\\n.ab-layout-header .webix_template {\\n padding: 0;\\n line-height: 30px;\\n}\\n.ab-widget-header .webix_template div {\\n line-height: 30px;\\n}\\n.ab-widget-header .webix_template div .fa,\\n.ab-layout-header .fa {\\n vertical-align: middle;\\n}\\n#offlinePrompt,\\n#connectionPrompt {\\n line-height: 30px;\\n color: white;\\n background: #f44336;\\n font-size: 14px;\\n text-align: center;\\n transition: all 1s;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);\\n overflow: hidden;\\n}\\n#connectionPrompt {\\n background: #f44336;\\n}\\n#countdown {\\n height: 20px;\\n width: 20px;\\n text-align: center;\\n display: inline-block;\\n line-height: 20px;\\n position: relative;\\n bottom: 2px;\\n font-size: 9px;\\n}\\n\\n#countdown-number {\\n color: white;\\n display: inline-block;\\n width: 20px;\\n height: 20px;\\n}\\n\\n#countdown svg {\\n width: 20px;\\n height: 20px;\\n transform: rotateY(-180deg) rotateZ(-90deg);\\n position: absolute;\\n margin-left: -20px;\\n}\\n\\n#countdown svg circle {\\n stroke-dasharray: 56px;\\n stroke-dashoffset: 0px;\\n stroke-linecap: round;\\n stroke-width: 2px;\\n stroke: white;\\n fill: none;\\n animation: countdown 30s linear infinite forwards;\\n}\\n\\n@keyframes countdown {\\n from {\\n stroke-dashoffset: 0px;\\n }\\n to {\\n stroke-dashoffset: 56px;\\n }\\n}\\n#reloadPrompt {\\n position: absolute;\\n z-index: 200000;\\n top: 0;\\n bottom: 0;\\n left: 0;\\n right: 0;\\n background: rgba(0, 0, 0, 0.7);\\n display: flex;\\n}\\n#reloadPrompt div {\\n background: #f44336;\\n width: 250px;\\n border: 3px solid white;\\n margin: auto auto;\\n padding: 20px;\\n text-align: center;\\n border-radius: 10px;\\n color: white;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);\\n}\\n.reloadPage {\\n background: rgba(0, 0, 0, 0.2);\\n border: none;\\n padding: 5px 10px;\\n border-radius: 5px;\\n margin-top: 10px;\\n}\\n.reloadPage:hover {\\n background: rgba(0, 0, 0, 0.4);\\n}\\n.webix_warn .webix_button {\\n background: #ff9800 !important;\\n color: #fff !important;\\n}\\n.webix_dark .webix_inp_bottom_label {\\n color: lightgray;\\n font-style: oblique;\\n}\\n.no-margin {\\n margin: 0;\\n}\\n.inbox_drawer.webix_toolbar.webix_dark .webix_secondary button,\\n.mainToolbar.webix_toolbar.webix_dark .webix_secondary button {\\n background-color: transparent;\\n}\\n.inbox_drawer.webix_toolbar.webix_dark .webix_secondary button:hover,\\n.mainToolbar.webix_toolbar.webix_dark .webix_secondary button:hover {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n/* Login Page */\\n.portalLogin {\\n /* opacity: 0; */\\n background: #ebedf0;\\n background: linear-gradient(\\n 0deg,\\n rgba(171, 171, 171, 1) 0%,\\n rgba(235, 237, 240, 1) 100%\\n );\\n /* -webkit-animation: 1s ease 0s normal forwards 1 fadein;\\n animation: 1s ease 0s normal forwards 1 fadein; */\\n}\\n.portalLoginForm {\\n opacity: 0;\\n -webkit-animation: 1s ease 0s normal forwards 1 fadein;\\n animation: 1s ease 0s normal forwards 1 fadein;\\n background: white;\\n border-radius: 30px;\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n position: relative;\\n top: -20px;\\n transform: scale(1.2);\\n}\\n.portalLogin .webix_view {\\n overflow: visible;\\n display: inline-block;\\n}\\n.preload-card {\\n opacity: 0;\\n animation: 1s ease 0s normal forwards 1 onlyfadein;\\n background: white;\\n border-radius: 30px;\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n position: relative;\\n\\n}\\ndiv.webix_dataview_item.webix_transparent {\\n padding: 0px;\\n}\\n@keyframes fadein {\\n 0% {\\n opacity: 0;\\n top: -20px;\\n transform: scale(1.1);\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n }\\n 100% {\\n opacity: 1;\\n top: 0;\\n transform: scale(1);\\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.4);\\n }\\n}\\n\\n@keyframes onlyfadein {\\n 0% {\\n opacity: 0;\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n }\\n 100% {\\n opacity: 1;\\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.4);\\n }\\n}\\n\\n@-webkit-keyframes fadein {\\n 0% {\\n opacity: 0;\\n }\\n 100% {\\n opacity: 1;\\n }\\n}\\n.ab-connect-add-new-link .webix_icon_btn {\\n margin-right: 0;\\n}\\n.image-data-field-icon {\\n border: 2px dashed rgba(0, 0, 0, 0.3);\\n border-radius: 10px;\\n padding: 5px;\\n display: flex;\\n flex-direction: row;\\n text-align: center;\\n justify-content: center;\\n align-items: center;\\n line-height: 12px;\\n font-size: 10px;\\n color: rgba(0, 0, 0, 0.5);\\n margin: 5px;\\n height: calc(100% - 10px);\\n overflow: hidden;\\n box-sizing: border-box;\\n}\\n.webix_cell > .ab-image-data-field {\\n margin-left: -12px;\\n}\\n.ab-delete-photo {\\n background: red;\\n color: white;\\n font-size: 10px;\\n text-align: center;\\n line-height: 20px;\\n width: 20px;\\n height: 20px;\\n border-radius: 10px;\\n top: -3px;\\n right: -3px;\\n transition: all 0.25s;\\n}\\n.ab-delete-photo:hover {\\n color: white;\\n font-size: 14px;\\n}\\n.webix_transparent .webix_button .webix_icon,\\n.webix_transparent .webix_button .webix_icon_btn {\\n color: #1ca1c1;\\n}\\n.webix_icon_btn {\\n margin-right: 0 !important;\\n vertical-align: baseline;\\n}\\n.webix_list_icon.webix_icon {\\n vertical-align: baseline;\\n}\\n.webix_list_item.menu {\\n color: inherit;\\n}\\n.ab-datacollection-list-item {\\n position: relative;\\n}\\n.ab-object-list-item {\\n position: relative;\\n}\\n.ab-object-list-edit {\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n.webix_el_label.formText .webix_el_box {\\n font-weight: normal;\\n}\\n\\n.switcheroo .webix_win_head .webix_layout_line {\\n background: #657584;\\n color: #fff;\\n}\\n.switcheroo .webix_win_head .webix_view .webix_template {\\n background: #657584;\\n color: #fff;\\n}\\n.portal_work_warning_banner {\\n background: #e64b2a;\\n color: #fff;\\n}\\n.portal_work_warning_banner .webix_el_box {\\n color: #fff;\\n}\\n.portal_work_warning_banner .webix_button {\\n color: #fff;\\n font-size: 14px;\\n}\\n.portal_work_switcheroo_user_switched {\\n background: #2196f3;\\n color: #fff;\\n}\\n.portal_work_switcheroo_user_switched .webix_el_box {\\n color: #fff;\\n}\\n/* Query Override */\\n.wbq-field-box {\\n max-width: 95% !important;\\n}\\n/* Tutorial Manager */\\n.highlightMe,\\n.findDataCy [data-cy] {\\n position: relative !important;\\n}\\n.highlightMe:before,\\n.findDataCy [data-cy]:hover:before {\\n content: \\\"\\\" !important;\\n width: 100% !important;\\n height: 100% !important;\\n border: 2px solid red !important;\\n border-style: inset !important;\\n position: absolute !important;\\n top: 0 !important;\\n left: 0 !important;\\n cursor: help !important;\\n}\\ninput.highlightMe,\\ntextarea.highlightMe,\\nbutton.highlightMe,\\n.findDataCy input[data-cy]:hover,\\n.findDataCy textarea[data-cy]:hover,\\n.findDataCy button[data-cy]:hover {\\n border: 2px solid red !important;\\n border-style: inset !important;\\n cursor: help !important;\\n}\\n.hintItem {\\n position: relative;\\n overflow: visible !important;\\n margin: 10px;\\n padding: 10px;\\n border: 1px solid #efefef;\\n border-radius: 5px;\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.hintItem:hover {\\n background: #efefef;\\n}\\n.hintItem h1 {\\n font-size: 18px;\\n padding: 0;\\n margin: 0;\\n}\\n.hintItem p {\\n margin: 0;\\n font-size: 14px;\\n line-height: 18px;\\n color: #6c757d;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n display: -webkit-box;\\n -webkit-line-clamp: 2;\\n -webkit-box-orient: vertical;\\n}\\n.deleteHint,\\n.deleteStep {\\n position: absolute;\\n right: -5px;\\n top: -5px;\\n background: red;\\n color: white;\\n width: 20px;\\n height: 20px;\\n line-height: 20px;\\n text-align: center;\\n border-radius: 10px;\\n}\\n.deleteHint:hover,\\n.deleteStep:hover {\\n transform: scale(1.1);\\n cursor: pointer;\\n}\\n.deleteStep {\\n right: 25px;\\n}\\n.active0 {\\n opacity: 0.4;\\n}\\n.highlightWin {\\n font-size: 18px;\\n text-align: center;\\n}\\n.stepPos {\\n font-size: 20px;\\n width: 35px;\\n height: 35px;\\n margin: 0 auto;\\n background: #657584;\\n line-height: 35px;\\n text-align: center;\\n color: white;\\n border-radius: 100%;\\n}\\n.wider_popup {\\n width: 250px !important;\\n}\\n.wider_popup .webix_list_item {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_hint {\\n padding-bottom: 60px !important;\\n}\\n.dontShow {\\n font-size: 12px;\\n font-weight: normal;\\n font-style: italic;\\n display: block;\\n padding: 0;\\n margin: 15px 0 0 0;\\n}\\n.dontShow input {\\n vertical-align: text-top;\\n}\\n.pdf-data-view .webix_selected {\\n background-color: #87c3d1;\\n}\\n.pdf-data-view-item {\\n display: flex;\\n flex-direction: row;\\n flex-wrap: nowrap;\\n justify-content: space-between;\\n}\\n.pdf-data-view-image {\\n position: relative;\\n}\\n.pdf-data-view-image-icon {\\n transition: .5s ease;\\n opacity: 0;\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n transform: translate(-50%, -50%);\\n -ms-transform: translate(-50%, -50%);\\n text-align: center;\\n}\\n.pdf-data-view-image:hover canvas {\\n opacity: 0.7;\\n}\\n.pdf-data-view-image:hover .pdf-data-view-image-icon {\\n opacity: 0.9;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./styles/ui.css\"],\"names\":[],\"mappings\":\"AAAA;;GAEG,2BAA2B;AAC9B;AACA;GACG,4CAA4C;GAC5C,WAAW;GACX,YAAY;GACZ,0DAA0D;GAC1D,2BAA2B;GAC3B,4BAA4B;GAC5B,2BAA2B;AAC9B;AACA;GACG,iCAAiC;GACjC,4BAA4B;GAC5B,0BAA0B;AAC7B;AACA;GACG,WAAW;GACX,qBAAqB;AACxB;AACA;GACG,cAAc;AACjB;AACA;GACG,kBAAkB;GAClB,+BAA+B;AAClC;AACA;GACG,6CAA6C;GAC7C,2CAA2C;GAC3C,gDAAgD;AACnD;AACA;GACG,gBAAgB;AACnB;AACA;GACG,gBAAgB;AACnB;AACA;GACG,qCAAqC;AACxC;AACA;;;GAGG,+BAA+B;AAClC;AACA;;GAEG,oCAAoC;GACpC,cAAc;AACjB;AACA;;;GAGG,cAAc;AACjB;AACA;GACG,oCAAoC;AACvC;AACA;GACG,6BAA6B;GAC7B,iBAAiB;GACjB,YAAY;AACf;AACA;GACG,6BAA6B;AAChC;AACA;GACG,YAAY;GACZ,eAAe;AAClB;AACA;GACG,eAAe;GACf,0CAA0C;AAC7C;AACA;GACG,YAAY;AACf;;AAEA,uCAAuC;AACvC;GACG,gBAAgB;AACnB;AACA,uBAAuB;AACvB;GACG,cAAc;GACd,YAAY;GACZ,iBAAiB;GACjB,eAAe;GACf,QAAQ;AACX;AACA,uBAAuB;AACvB;GACG,uBAAuB;AAC1B;AACA;;GAEG,gDAAgD;GAChD,6BAA6B;GAC7B,mBAAmB;GACnB,gBAAgB;GAChB,gBAAgB;GAChB,iBAAiB;GACjB,mBAAmB;GACnB,yBAAyB;AAC5B;AACA;GACG,kBAAkB;AACrB;AACA;GACG,aAAa;AAChB;AACA;GACG,iBAAiB;GACjB,iBAAiB;GACjB,YAAY;AACf;AACA;GACG,UAAU;GACV,eAAe;AAClB;AACA;GACG,aAAa;AAChB;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,qBAAqB;AACxB;AACA;GACG,gCAAgC;AACnC;AACA;GACG,aAAa;GACb,iBAAiB;AACpB;AACA;GACG,uBAAuB;GACvB,gBAAgB;GAChB,mBAAmB;AACtB;AACA;;GAEG,iBAAiB;GACjB,iBAAiB;AACpB;AACA;GACG,0BAA0B;AAC7B;AACA;GACG,aAAa;AAChB;AACA;GACG,uBAAuB;GACvB,sDAAsD;AACzD;AACA;GACG,iBAAiB;AACpB;AACA;GACG,yBAAyB;GACzB,iBAAiB;AACpB;AACA;GACG,gBAAgB;GAChB,UAAU;GACV,SAAS;GACT,SAAS;GACT,uBAAuB;GACvB,gBAAgB;GAChB,gBAAgB;AACnB;AACA;GACG,iBAAiB;GACjB,WAAW;AACd;AACA;GACG,kCAAkC;GAClC,uBAAuB;GACvB,2BAA2B;GAC3B,iBAAiB;GACjB,wBAAwB;AAC3B;AACA;GACG,SAAS;AACZ;AACA;;GAEG,8BAA8B;GAC9B,eAAe;GACf,8BAA8B;GAC9B,sBAAsB;GACtB,iBAAiB;GACjB,qBAAqB;GACrB,wBAAwB;GACxB,WAAW;GACX,+BAA+B;AAClC;AACA;;GAEG,YAAY;GACZ,iBAAiB;AACpB;AACA;GACG,WAAW;GACX,WAAW;GACX,wBAAwB;AAC3B;AACA;;GAEG,sBAAsB;AACzB;AACA;;;;GAIG,WAAW;GACX,eAAe;GACf,gCAAgC;GAChC,mBAAmB;GACnB,iBAAiB;GACjB,yBAAyB;GACzB,iBAAiB;AACpB;AACA;GACG,iBAAiB;AACpB;AACA;GACG,yBAAyB;GACzB,wBAAwB;GACxB,iBAAiB;AACpB;AACA;GACG,sBAAsB;AACzB;AACA;GACG,kCAAkC;AACrC;AACA;GACG,SAAS;AACZ;AACA;GACG,kBAAkB;GAClB,YAAY;GACZ,sBAAsB;GACtB,WAAW;GACX,gBAAgB;GAChB,kBAAkB;GAClB,iBAAiB;AACpB;AACA;GACG,WAAW;AACd;AACA;GACG,UAAU;GACV,yBAAyB;GACzB,wBAAwB;GACxB,iBAAiB;AACpB;AACA;GACG,UAAU;GACV,SAAS;AACZ;AACA;GACG,WAAW;AACd;AACA;GACG,mBAAmB;AACtB;AACA;GACG,qBAAqB;AACxB;AACA;GACG,QAAQ;GACR,WAAW;GACX,gBAAgB;AACnB;AACA;;GAEG,kBAAkB;AACrB;;AAEA;GACG,WAAW;GACX,YAAY;AACf;AACA;GACG,yBAAyB;AAC5B;AACA;;;GAGG,YAAY;GACZ,YAAY;GACZ,YAAY;AACf;AACA;;;GAGG,UAAU;AACb;AACA;GACG,iBAAiB;AACpB;AACA;GACG,iBAAiB;AACpB;AACA;GACG,YAAY;GACZ,WAAW;AACd;AACA;GACG,aAAa;AAChB;AACA;GACG,eAAe;GACf,iBAAiB;GACjB,gBAAgB;AACnB;AACA;GACG,YAAY;AACf;;AAEA;GACG,kBAAkB;AACrB;AACA;GACG,eAAe;AAClB;AACA;GACG,iBAAiB;AACpB;AACA;;GAEG,UAAU;AACb;AACA;GACG,mBAAmB;AACtB;AACA;GACG,eAAe;AAClB;AACA;GACG,0BAA0B;AAC7B;AACA;GACG,YAAY;AACf;AACA;GACG,UAAU;AACb;AACA;GACG,qBAAqB;AACxB;AACA;GACG,0BAA0B;AAC7B;AACA;GACG,iBAAiB;AACpB;AACA;GACG,iBAAiB;AACpB;AACA;GACG,kBAAkB;GAClB,QAAQ;GACR,WAAW;AACd;AACA;GACG,QAAQ;GACR,YAAY;AACf;AACA;;GAEG,WAAW;GACX,YAAY;GACZ,qBAAqB;GACrB,iBAAiB;GACjB,eAAe;GACf,kBAAkB;GAClB,4BAA4B;GAC5B,mBAAmB;GACnB,YAAY;GACZ,SAAS;GACT,kBAAkB;GAClB,gBAAgB;GAChB,YAAY;AACf;AACA;;GAEG,eAAe;AAClB;AACA;GACG,mBAAmB;AACtB;AACA;GACG,eAAe;GACf,WAAW;GACX,YAAY;GACZ,iBAAiB;AACpB;AACA;GACG,WAAW;GACX,gBAAgB;GAChB,SAAS;AACZ;AACA;GACG,gBAAgB;AACnB;AACA;GACG,eAAe;AAClB;AACA;GACG,WAAW;AACd;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,6BAA6B;AAChC;AACA;GACG,6BAA6B;GAC7B,YAAY;AACf;AACA;GACG,uBAAuB;GACvB,cAAc;AACjB;AACA;GACG,eAAe;AAClB;AACA;GACG,iBAAiB;AACpB;AACA;GACG,8BAA8B;GAC9B,YAAY;GACZ,WAAW;AACd;AACA;GACG,gBAAgB;AACnB;AACA;GACG,iBAAiB;AACpB;AACA;GACG,kBAAkB;AACrB;AACA;GACG,uBAAuB;GACvB,cAAc;GACd,iBAAiB;GACjB,UAAU;GACV,kBAAkB;AACrB;AACA;GACG,0BAA0B;AAC7B;AACA;GACG,iBAAiB;AACpB;AACA;GACG,UAAU;AACb;AACA;GACG,mBAAmB;AACtB;;AAEA;GACG,yBAAyB;AAC5B;AACA;;GAEG,8BAA8B;AACjC;AACA;GACG,kCAAkC;AACrC;AACA;GACG,gBAAgB;GAChB,kBAAkB;GAClB,oDAAoD;GACpD,kBAAkB;GAClB,iBAAiB;AACpB;AACA;GACG,uBAAuB;AAC1B;AACA;GACG,kBAAkB;GAClB,SAAS;GACT,WAAW;GACX,mBAAmB;AACtB;AACA,wBAAwB;AACxB;GACG,WAAW;GACX,YAAY;GACZ,cAAc;GACd,WAAW;GACX,kBAAkB;GAClB,mBAAmB;GACnB,YAAY;GACZ,UAAU;GACV,kBAAkB;GAClB,iBAAiB;AACpB;AACA;GACG,qBAAqB;GACrB,yBAAyB;AAC5B;AACA;GACG,qBAAqB;GACrB,WAAW;GACX,mBAAmB;GACnB,gBAAgB;GAChB,uBAAuB;AAC1B;;AAEA;GACG,sBAAsB;AACzB;AACA;GACG,YAAY;GACZ,gBAAgB;AACnB;AACA;GACG,2BAA2B;AAC9B;AACA;;GAEG,gBAAgB;GAChB,mBAAmB;GACnB,uBAAuB;AAC1B;AACA;;GAEG,2BAA2B;AAC9B;;AAEA,qBAAqB;AACrB;GACG,sBAAsB;AACzB;AACA;GACG,YAAY;GACZ,gBAAgB;AACnB;AACA;GACG,kBAAkB;GAClB,UAAU;GACV,QAAQ;GACR,UAAU;GACV,WAAW;GACX,UAAU;GACV,YAAY;GACZ,sBAAsB;GACtB,YAAY;GACZ,WAAW;AACd;AACA;GACG,YAAY;AACf;AACA;GACG,iBAAiB;GACjB,WAAW;GACX,YAAY;GACZ,kBAAkB;AACrB;AACA;GACG,cAAc;AACjB;AACA;GACG,0BAA0B;GAC1B,UAAU;AACb;AACA;GACG,UAAU;GACV,iBAAiB;AACpB;AACA;GACG,WAAW;GACX,YAAY;AACf;AACA;GACG,kBAAkB;GAClB,OAAO;GACP,yBAAyB;GACzB,wBAAwB;GACxB,uBAAuB;GACvB,qBAAqB;GACrB,WAAW;AACd;AACA;GACG,qBAAqB;GACrB,qBAAqB;GACrB,WAAW;AACd;AACA;;;GAGG,eAAe;AAClB;AACA;GACG,kBAAkB;AACrB;AACA;GACG,UAAU;AACb;;AAEA;GACG,kCAAkC;AACrC;AACA;GACG,uBAAuB;AAC1B;AACA;GACG,qBAAqB;AACxB;AACA;GACG,oBAAoB;AACvB;AACA;GACG,YAAY;AACf;AACA;GACG,eAAe;AAClB;AACA,mBAAmB;AACnB;GACG,gBAAgB;GAChB,YAAY;GACZ,6BAA6B;AAChC;AACA;GACG,gBAAgB;GAChB,4BAA4B;AAC/B;AACA;GACG,sBAAsB;GACtB,2BAA2B;GAC3B,0BAA0B;GAC1B,kBAAkB;GAClB,sBAAsB;GACtB,4BAA4B;GAC5B,2BAA2B;GAC3B,wBAAwB;AAC3B;AACA;GACG,kBAAkB;AACrB;AACA;GACG,yBAAyB;GACzB,YAAY;AACf;AACA;GACG,kBAAkB;GAClB,uBAAuB;AAC1B;AACA;GACG,sBAAsB;AACzB;AACA;GACG,uBAAuB;GACvB,UAAU;AACb;AACA;GACG,uBAAuB;AAC1B;AACA;GACG,4BAA4B;GAC5B,+BAA+B;AAClC;AACA;GACG,2BAA2B;GAC3B,8BAA8B;AACjC;AACA;GACG,gBAAgB;AACnB;AACA;GACG,2BAA2B;GAC3B,+BAA+B;GAC/B,mBAAmB;AACtB;AACA;GACG,WAAW;GACX,cAAc;GACd,YAAY;GACZ,WAAW;GACX,8BAA8B;GAC9B;;;;IAIC;GACD,kBAAkB;GAClB,UAAU;GACV,SAAS;AACZ;AACA;GACG,kBAAkB;GAClB,iBAAiB;GACjB,sBAAsB;GACtB,mBAAmB;AACtB;AACA;GACG,cAAc;AACjB;AACA;GACG,cAAc;GACd,mBAAmB;AACtB;AACA;;GAEG,YAAY;GACZ,aAAa;AAChB;AACA;GACG,mBAAmB;GACnB,kBAAkB;AACrB;AACA;GACG,+BAA+B;AAClC;AACA;;;;GAIG,YAAY;GACZ,gCAAgC;GAChC,gCAAgC;AACnC;AACA;;;;;GAKG,iDAAiD;GACjD,mBAAmB;AACtB;AACA;;;;GAIG,gBAAgB;GAChB,UAAU;AACb;AACA;GACG,gBAAgB;AACnB;AACA;GACG,gBAAgB;GAChB,UAAU;AACb;AACA;GACG,gBAAgB;AACnB;AACA;;;;GAIG,WAAW;GACX,iBAAiB;GACjB,mBAAmB;GACnB,YAAY;GACZ,WAAW;GACX,YAAY;GACZ,mBAAmB;GACnB,iBAAiB;GACjB,kBAAkB;GAClB,YAAY;AACf;AACA;GACG,YAAY;AACf;AACA;GACG,UAAU;AACb;AACA;GACG,YAAY;GACZ,kBAAkB;GAClB,iBAAiB;AACpB;AACA;;GAEG,YAAY;GACZ,2BAA2B;GAC3B,iBAAiB;AACpB;AACA;GACG,aAAa;AAChB;AACA;GACG,aAAa;AAChB;AACA;GACG,sBAAsB;AACzB;AACA;GACG,sBAAsB;AACzB;AACA;GACG,qBAAqB;AACxB;;AAEA;GACG,mBAAmB;AACtB;AACA;GACG,uBAAuB;GACvB,YAAY;AACf;AACA;GACG,8BAA8B;AACjC;AACA;GACG,YAAY;AACf;AACA;;;GAGG,cAAc;AACjB;AACA;;;;;;;;;GASG,gCAAgC;AACnC;AACA;GACG,mBAAmB;AACtB;AACA;GACG,mBAAmB;AACtB;AACA;GACG,mBAAmB;AACtB;AACA;GACG,WAAW;GACX,mBAAmB;GACnB,cAAc;GACd,kBAAkB;GAClB,OAAO;GACP,WAAW;GACX,aAAa;AAChB;AACA;GACG,uBAAuB;AAC1B;AACA;GACG,gBAAgB;AACnB;AACA;GACG,sBAAsB;AACzB;AACA;GACG,kBAAkB;GAClB,YAAY;AACf;AACA;GACG,WAAW;GACX,YAAY;GACZ,mBAAmB;AACtB;AACA;GACG,kBAAkB;GAClB,MAAM;GACN,OAAO;GACP,eAAe;GACf,YAAY;GACZ,8BAA8B;GAC9B,+BAA+B;GAC/B,WAAW;AACd;AACA;GACG,kBAAkB;GAClB,QAAQ;GACR,UAAU;GACV,eAAe;GACf,8BAA8B;GAC9B,oC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AEG,6BAA6B;GAChC;GACA;MACG,yBAAyB;MACzB,4BAA4B;GAC/B;GACA;;MAEG,yBAAyB;GAC5B;GACA;;MAEG,4BAA4B;GAC/B;AACH;;AAEA;GACG,sBAAsB;AACzB;;AAEA;GACG;MACG,uBAAuB;MACvB,oBAAoB;MACpB,eAAe;MACf,2BAA2B;MAC3B,wBAAwB;MACxB,mBAAmB;MACnB,UAAU;MACV,SAAS;GACZ;GACA;MACG,qBAAqB;MACrB,WAAW;GACd;AACH;;AAEA;GACG,gBAAgB;AACnB;;AAEA;GACG,gBAAgB;GAChB,6BAA6B;GAC7B,4BAA4B;AAC/B;;AAEA;GACG,yBAAyB;GACzB,0BAA0B;AAC7B;;AAEA;GACG,gBAAgB;GAChB,mBAAmB;AACtB;AACA;GACG,UAAU;AACb;AACA;;GAEG,mCAAmC;AACtC;AACA;;GAEG,2BAA2B;AAC9B;AACA;;GAEG,wBAAwB;AAC3B;AACA;GACG,gBAAgB;AACnB;AACA;GACG,yBAAyB;AAC5B;AACA;;GAEG,WAAW;AACd;AACA;;GAEG,qBAAqB;AACxB;AACA;GACG,mBAAmB;AACtB;AACA;GACG,aAAa;AAChB;AACA;GACG,iBAAiB;AACpB;AACA;;GAEG,oBAAoB;GACpB,aAAa;AAChB;AACA;GACG,oBAAoB;GACpB,aAAa;GACb,sBAAsB;GACtB,mBAAmB;GACnB,yBAAyB;GACzB,gBAAgB;GAChB,eAAe;GACf,gBAAgB;GAChB,gBAAgB;GAChB,cAAc;GACd,kBAAkB;GAClB,mBAAmB;GACnB,yBAAyB;GACzB,yBAAyB;GACzB,sBAAsB;AACzB;AACA;;;;;;;;;;;;;;;GAeG,yBAAyB;GACzB,4BAA4B;AAC/B;AACA;GACG,mBAAmB;AACtB;AACA;GACG,mBAAmB;AACtB;AACA;GACG,eAAe;AAClB;AACA;GACG,YAAY;AACf;AACA;GACG,oBAAoB;AACvB;AACA;GACG,iBAAiB;AACpB;AACA;GACG,sBAAsB;AACzB;AACA;GACG,gBAAgB;AACnB;AACA;GACG,eAAe;AAClB;AACA;GACG,mBAAmB;GACnB,eAAe;AAClB;AACA;GACG,4BAA4B;AAC/B;AACA;GACG,WAAW;GACX,YAAY;GACZ,eAAe;AAClB;AACA;GACG,sBAAsB;AACzB;AACA;;GAEG,sBAAsB;AACzB;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,oCAAoC;AACvC;AACA;GACG,kCAAkC;AACrC;AACA;GACG,yBAAyB;GACzB,cAAc;GACd,iBAAiB;AACpB;AACA;GACG,cAAc;AACjB;AACA;GACG,yBAAyB;GACzB,WAAW;AACd;AACA;GACG,WAAW;AACd;AACA;GACG,2DAA2D;GAC3D,kCAAkC;GAClC,oBAAoB;GACpB,qBAAqB;GACrB,QAAQ;GACR,SAAS;GACT,4BAA4B;GAC5B,+BAA+B;GAC/B,YAAY;GACZ,eAAe;GACf,qBAAqB;GACrB,kBAAkB;GAClB,WAAW;GACX,mBAAmB;GACnB,gBAAgB;GAChB,YAAY;GACZ,YAAY;GACZ,aAAa;AAChB;AACA;GACG,UAAU;AACb;AACA;GACG,iBAAiB;AACpB;AACA;GACG,oCAAoC;GACpC,gDAAgD;GAChD,iBAAiB;AACpB;AACA;GACG,uBAAuB;GACvB,eAAe;GACf,wCAAwC;AAC3C;AACA;GACG,gCAAgC;AACnC;AACA;GACG,wBAAwB;AAC3B;AACA;;;GAGG,4BAA4B;GAC5B,4CAA4C;AAC/C;AACA;GACG,aAAa;AAChB;AACA;GACG,2BAA2B;AAC9B;AACA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;GACG,yBAAyB;AAC5B;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,kCAAkC;AACrC;AACA;GACG,YAAY;AACf;AACA;GACG,eAAe;AAClB;AACA;GACG,UAAU;GACV,iBAAiB;AACpB;AACA;GACG,iBAAiB;AACpB;AACA;;GAEG,sBAAsB;AACzB;AACA;;GAEG,iBAAiB;GACjB,YAAY;GACZ,mBAAmB;GACnB,eAAe;GACf,kBAAkB;GAClB,kBAAkB;GAClB,yCAAyC;GACzC,gBAAgB;AACnB;AACA;GACG,mBAAmB;AACtB;AACA;GACG,YAAY;GACZ,WAAW;GACX,kBAAkB;GAClB,qBAAqB;GACrB,iBAAiB;GACjB,kBAAkB;GAClB,WAAW;GACX,cAAc;AACjB;;AAEA;GACG,YAAY;GACZ,qBAAqB;GACrB,WAAW;GACX,YAAY;AACf;;AAEA;GACG,WAAW;GACX,YAAY;GACZ,2CAA2C;GAC3C,kBAAkB;GAClB,kBAAkB;AACrB;;AAEA;GACG,sBAAsB;GACtB,sBAAsB;GACtB,qBAAqB;GACrB,iBAAiB;GACjB,aAAa;GACb,UAAU;GACV,iDAAiD;AACpD;;AAEA;GACG;MACG,sBAAsB;GACzB;GACA;MACG,uBAAuB;GAC1B;AACH;AACA;GACG,kBAAkB;GAClB,eAAe;GACf,MAAM;GACN,SAAS;GACT,OAAO;GACP,QAAQ;GACR,8BAA8B;GAC9B,aAAa;AAChB;AACA;GACG,mBAAmB;GACnB,YAAY;GACZ,uBAAuB;GACvB,iBAAiB;GACjB,aAAa;GACb,kBAAkB;GAClB,mBAAmB;GACnB,YAAY;GACZ,yCAAyC;AAC5C;AACA;GACG,8BAA8B;GAC9B,YAAY;GACZ,iBAAiB;GACjB,kBAAkB;GAClB,gBAAgB;AACnB;AACA;GACG,8BAA8B;AACjC;AACA;GACG,8BAA8B;GAC9B,sBAAsB;AACzB;AACA;GACG,gBAAgB;GAChB,mBAAmB;AACtB;AACA;GACG,SAAS;AACZ;AACA;;GAEG,6BAA6B;AAChC;AACA;;GAEG,oCAAoC;AACvC;AACA,eAAe;AACf;GACG,gBAAgB;GAChB,mBAAmB;GACnB;;;;IAIC;GACD;oDACiD;AACpD;AACA;GACG,UAAU;GACV,sDAAsD;GACtD,8CAA8C;GAC9C,iBAAiB;GACjB,mBAAmB;GACnB,4CAA4C;GAC5C,kBAAkB;GAClB,UAAU;GACV,qBAAqB;AACxB;AACA;GACG,iBAAiB;GACjB,qBAAqB;AACxB;AACA;GACG,UAAU;GACV,kDAAkD;GAClD,iBAAiB;GACjB,mBAAmB;GACnB,4CAA4C;GAC5C,kBAAkB;;AAErB;AACA;GACG,YAAY;AACf;AACA;GACG;MACG,UAAU;MACV,UAAU;MACV,qBAAqB;MACrB,4CAA4C;GAC/C;GACA;MACG,UAAU;MACV,MAAM;MACN,mBAAmB;MACnB,0CAA0C;GAC7C;AACH;;AAEA;GACG;MACG,UAAU;MACV,4CAA4C;GAC/C;GACA;MACG,UAAU;MACV,0CAA0C;GAC7C;AACH;;AAEA;GACG;MACG,UAAU;GACb;GACA;MACG,UAAU;GACb;AACH;AACA;GACG,eAAe;AAClB;AACA;GACG,qCAAqC;GACrC,mBAAmB;GACnB,YAAY;GACZ,aAAa;GACb,mBAAmB;GACnB,kBAAkB;GAClB,uBAAuB;GACvB,mBAAmB;GACnB,iBAAiB;GACjB,eAAe;GACf,yBAAyB;GACzB,WAAW;GACX,yBAAyB;GACzB,gBAAgB;GAChB,sBAAsB;AACzB;AACA;GACG,kBAAkB;AACrB;AACA;GACG,eAAe;GACf,YAAY;GACZ,eAAe;GACf,kBAAkB;GAClB,iBAAiB;GACjB,WAAW;GACX,YAAY;GACZ,mBAAmB;GACnB,SAAS;GACT,WAAW;GACX,qBAAqB;AACxB;AACA;GACG,YAAY;GACZ,eAAe;AAClB;AACA;;GAEG,cAAc;AACjB;AACA;GACG,0BAA0B;GAC1B,wBAAwB;AAC3B;AACA;GACG,wBAAwB;AAC3B;AACA;GACG,cAAc;AACjB;AACA;GACG,kBAAkB;AACrB;AACA;GACG,kBAAkB;AACrB;AACA;GACG,kBAAkB;GAClB,QAAQ;GACR,MAAM;AACT;AACA;GACG,mBAAmB;AACtB;;AAEA;GACG,mBAAmB;GACnB,WAAW;AACd;AACA;GACG,mBAAmB;GACnB,WAAW;AACd;AACA;GACG,mBAAmB;GACnB,WAAW;AACd;AACA;GACG,WAAW;AACd;AACA;GACG,WAAW;GACX,eAAe;AAClB;AACA;GACG,mBAAmB;GACnB,WAAW;AACd;AACA;GACG,WAAW;AACd;AACA,mBAAmB;AACnB;GACG,yBAAyB;AAC5B;AACA,qBAAqB;AACrB;;GAEG,6BAA6B;AAChC;AACA;;GAEG,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,gCAAgC;GAChC,8BAA8B;GAC9B,6BAA6B;GAC7B,iBAAiB;GACjB,kBAAkB;GAClB,uBAAuB;AAC1B;AACA;;;;;;GAMG,gCAAgC;GAChC,8BAA8B;GAC9B,uBAAuB;AAC1B;AACA;GACG,kBAAkB;GAClB,4BAA4B;GAC5B,YAAY;GACZ,aAAa;GACb,yBAAyB;GACzB,kBAAkB;GAClB,+BAA+B;AAClC;AACA;GACG,mBAAmB;AACtB;AACA;GACG,eAAe;GACf,UAAU;GACV,SAAS;AACZ;AACA;GACG,SAAS;GACT,eAAe;GACf,iBAAiB;GACjB,cAAc;GACd,gBAAgB;GAChB,uBAAuB;GACvB,oBAAoB;GACpB,qBAAqB;GACrB,4BAA4B;AAC/B;AACA;;GAEG,kBAAkB;GAClB,WAAW;GACX,SAAS;GACT,eAAe;GACf,YAAY;GACZ,WAAW;GACX,YAAY;GACZ,iBAAiB;GACjB,kBAAkB;GAClB,mBAAmB;AACtB;AACA;;GAEG,qBAAqB;GACrB,eAAe;AAClB;AACA;GACG,WAAW;AACd;AACA;GACG,YAAY;AACf;AACA;GACG,eAAe;GACf,kBAAkB;AACrB;AACA;GACG,eAAe;GACf,WAAW;GACX,YAAY;GACZ,cAAc;GACd,mBAAmB;GACnB,iBAAiB;GACjB,kBAAkB;GAClB,YAAY;GACZ,mBAAmB;AACtB;AACA;GACG,uBAAuB;AAC1B;AACA;GACG,mBAAmB;GACnB,gBAAgB;GAChB,uBAAuB;AAC1B;AACA;GACG,+BAA+B;AAClC;AACA;GACG,eAAe;GACf,mBAAmB;GACnB,kBAAkB;GAClB,cAAc;GACd,UAAU;GACV,kBAAkB;AACrB;AACA;GACG,wBAAwB;AAC3B;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,aAAa;GACb,mBAAmB;GACnB,iBAAiB;GACjB,8BAA8B;AACjC;AACA;GACG,kBAAkB;AACrB;AACA;GACG,oBAAoB;GACpB,UAAU;GACV,kBAAkB;GAClB,QAAQ;GACR,SAAS;GACT,gCAAgC;GAChC,oCAAoC;GACpC,kBAAkB;AACrB;AACA;GACG,YAAY;AACf;AACA;GACG,YAAY;AACf\",\"sourcesContent\":[\".mainSidebar.webix_sidebar.webix_dark,\\n.darkScrollview {\\n background: #444 !important;\\n}\\n.appDevDesigns {\\n background-color: rgb(68, 68, 68) !important;\\n width: 100%;\\n height: 100%;\\n background-image: url(assets/images/appdev_logo_white.png);\\n background-size: auto 110px;\\n background-repeat: no-repeat;\\n background-position: center;\\n}\\n.policyLink {\\n background-color: rgb(68, 68, 68);\\n border-width: 0px !important;\\n margin-top: 0px !important;\\n}\\na.policyMenu {\\n color: #BBB;\\n text-decoration: none;\\n}\\na.policyAuth {\\n color: #475466;\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_sidebar_icon {\\n margin-right: 15px;\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_tree_branch_1 {\\n //border-top: 1px solid rgba(255,255,255,0.1);\\n border-bottom: 1px solid rgba(0, 0, 0, 0.4);\\n box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.1);\\n}\\n.mainToolbar .webix_icon {\\n margin-top: -2px;\\n}\\n.mainToolbar.webix_toolbar.webix_dark {\\n background: #333;\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_tree_item:hover {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.mainSidebar.webix_sidebar.webix_dark\\n .webix_tree_item:hover\\n .webix_sidebar_icon {\\n color: rgba(255, 255, 255, 0.8);\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_tree_item.webix_selected,\\n.mainSidebar .webix_tree_item.webix_sidebar_selected {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #1ca1c1;\\n}\\n.mainSidebar.webix_sidebar.webix_dark\\n .webix_tree_item.webix_selected\\n .webix_icon {\\n color: #1ca1c1;\\n}\\n.webix_toolbar.webix_dark .webix_secondary.activePage button {\\n background-color: #1ca1c1 !important;\\n}\\n.webix_toolbar.webix_dark .userMenu.webix_menu-x .webix_list_item {\\n background-color: transparent;\\n padding: 3px 10px;\\n opacity: 0.7;\\n}\\n.webix_toolbar.webix_dark .inbox.webix_secondary button {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_dark .inbox.webix_secondary button .webix_icon_btn {\\n opacity: 0.7;\\n font-size: 20px;\\n}\\n.appPages .webix_button {\\n font-size: 14px;\\n color: rgba(255, 255, 255, 0.8) !important;\\n}\\n.appPages .webix_icon_btn {\\n opacity: 0.4;\\n}\\n\\n/* Styles imported from AppBuilder v1 */\\nlabel {\\n font-weight: 500;\\n}\\n/* Custom Webix Badge */\\n.webix_badge {\\n font-size: 8pt;\\n height: 18px;\\n line-height: 18px;\\n min-width: 18px;\\n right: 0;\\n}\\n/* Custom selectivity */\\n.webix_checksuggest_select_all .webix_el_box {\\n height: auto !important;\\n}\\n.webix_multicombo_tag,\\n.webix_multicombo_value {\\n box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.3);\\n border-bottom: 1px solid #fff;\\n margin: 3px 3px 1px;\\n max-height: 27px;\\n overflow: hidden;\\n line-height: 26px;\\n font-weight: normal;\\n color: #475466 !important;\\n}\\n.badgeContainer {\\n position: relative;\\n}\\n.webix_tooltip .webix_badge.selectivityBadge {\\n display: none;\\n}\\n.editConnectedPage {\\n margin-left: -5px;\\n margin-right: 5px;\\n opacity: 0.4;\\n}\\n.editConnectedPage:hover {\\n opacity: 1;\\n cursor: pointer;\\n}\\n.webix_tooltip .webix_multicombo_delete {\\n display: none;\\n}\\n.webix_multicombo_delete:hover:after {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n.webix_multicombo_delete:hover {\\n transform: scale(1.1);\\n}\\n.webix_multicombo_delete.clear-combo-value {\\n transition: all 0.2s ease-in-out;\\n}\\n.webix_multicombo_value {\\n display: flex;\\n /* width: 100%; */\\n}\\n.webix_multicombo_value .ellip {\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n}\\n.webix_cell .webix_multicombo_tag,\\n.webix_cell .webix_multicombo_value {\\n line-height: 26px;\\n margin: 4px 1.5px;\\n}\\n.webix_el_combo .webix_progress_state {\\n font-size: 35px !important;\\n}\\n.webix_list_item .editConnectedPage {\\n display: none;\\n}\\n.hascustomcolor {\\n color: white !important;\\n text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.3) !important;\\n}\\n.combowithcolors .webix_inp_static {\\n padding-left: 0px;\\n}\\n.webix_multicombo_delete:after {\\n color: rgba(0, 0, 0, 0.4);\\n text-shadow: none;\\n}\\n.hideWebixMulticomboTag .webix_multicombo_tag {\\n box-shadow: none;\\n padding: 0;\\n border: 0;\\n margin: 0;\\n background: transparent;\\n border-radius: 0;\\n max-height: none;\\n}\\n.selectivity-placeholder {\\n text-indent: 10px;\\n color: #666;\\n}\\n.selectivity-multiple-input-container {\\n background: transparent !important;\\n padding: 0px !important;\\n overflow: hidden !important;\\n max-height: unset;\\n /* border-radius: 6px; */\\n}\\n.selectivity-single-result-container {\\n left: 2px;\\n}\\n.selectivity-multiple-selected-item,\\n.selectivity-single-selected-item {\\n background: #337ab7 !important;\\n padding: 0 10px;\\n border-radius: 15px !important;\\n color: #fff !important;\\n line-height: 29px;\\n display: inline-block;\\n height: unset !important;\\n margin: 2px;\\n /*max-width: 100px !important;*/\\n}\\n.selectivity-multiple-input,\\ninput[type=\\\"text\\\"].selectivity-multiple-input {\\n height: 33px;\\n text-indent: 10px;\\n}\\n.selectivity-single-selected-item-remove {\\n color: #fff;\\n float: none;\\n padding: 7px 5px 7px 0px;\\n}\\n.selectivity-multiple-selected-item-edit,\\n.selectivity-multiple-selected-item-remove {\\n padding: 5px 0 5px 5px;\\n}\\n.selectivity-single-selected-item-edit,\\n.selectivity-multiple-selected-item-edit,\\n.selectivity-single-selected-item-edit:hover,\\n.selectivity-multiple-selected-item-edit:hover {\\n color: #fff;\\n cursor: pointer;\\n text-decoration: none !important;\\n background: #1ca1c1;\\n margin-left: -9pt;\\n padding: 5px 5px 5px 10px;\\n margin-right: 5px;\\n}\\n.customField {\\n line-height: 33px;\\n}\\n.customField .selectivity-multiple-input-container {\\n border: 1px solid #ccd7e6;\\n /* border-radius: 6px; */\\n margin-right: 4px;\\n}\\n.readonlyField {\\n background-color: #fff;\\n}\\n.selectivity-single-select {\\n background: transparent !important;\\n}\\n.webix_cell .form-entry {\\n border: 0;\\n}\\n.form-entry {\\n border-radius: 6px;\\n height: 100%;\\n border: 1px solid #ddd;\\n color: #666;\\n background: #fff;\\n border-color: #ccc;\\n margin-right: 2px;\\n}\\n.form-entry .selectivity-multiple-selected-item {\\n float: none;\\n}\\n.webix_template .selectivity-single-select {\\n padding: 0;\\n border: 1px solid #ccd7e6;\\n /* border-radius: 6px; */\\n margin-right: 4px;\\n}\\n.selectivity-single-select input {\\n padding: 0;\\n border: 0;\\n}\\n.selectivity-single-selected-item {\\n color: #666;\\n}\\n.selectivity-single-result-container {\\n top: 0em !important;\\n}\\n.selectivity-caret {\\n top: 0.4em !important;\\n}\\n.selectivityBadge {\\n top: 6px;\\n right: -5px;\\n background: #aaa;\\n}\\n.list-data-values,\\n.connect-data-values {\\n position: relative;\\n}\\n\\n.ab-app-list-info {\\n float: left;\\n height: 100%;\\n}\\n.ab-tree-ui .webix_scroll_cont .webix_tree_leaves {\\n display: block !important;\\n}\\n.ab-app-list-edit,\\n.ab-object-list-edit,\\n.ab-page-list-edit {\\n float: right;\\n height: 100%;\\n opacity: 0.6;\\n}\\n.ab-app-list-edit:hover,\\n.ab-object-list-edit:hover,\\n.ab-page-list-edit:hover {\\n opacity: 1;\\n}\\n.ab-app-list-edit .webix_list_item {\\n line-height: 50px;\\n}\\n.ab-app-list-edit .webix_icon {\\n line-height: 59px;\\n}\\n.ab-app-list-item {\\n height: 100%;\\n clear: both;\\n}\\n.ab-app-list-edit .webix_list_item {\\n padding: 10px;\\n}\\n.ab-app-list-name {\\n font-size: 20px;\\n line-height: 20px;\\n margin-top: 10px;\\n}\\n.ab-app-list-description {\\n opacity: 0.6;\\n}\\n\\n.webix_list_item .webix_icon {\\n font-size: inherit;\\n}\\n.webix_list_item .webix_icon.wxi-checkbox-marked {\\n font-size: 20px;\\n}\\n.emptypane {\\n line-height: auto;\\n}\\n.opsportal-area-site-default-appbuilder a,\\n.webix_view a {\\n opacity: 1;\\n}\\n.webix_list_item.menu.selected {\\n background: #657584;\\n}\\n.webix_icon_btn {\\n font-size: 20px;\\n}\\n.appTitle .webix_el_box {\\n font-size: 20px !important;\\n}\\n.webix_dark .webix_icon_btn {\\n opacity: 0.4;\\n}\\n.ab_amp .webix_dark .webix_icon_btn {\\n opacity: 1;\\n}\\n.webix_el_button button {\\n /* font-size: 14px; */\\n}\\n.webix_el_button button.webixtype_standard:hover {\\n text-decoration: underline;\\n}\\n.webix_menu-x .webix_list_item {\\n line-height: 31px;\\n}\\n.bg-white {\\n background: white;\\n}\\n.ab-component-tools {\\n position: absolute;\\n top: 2px;\\n right: 33px;\\n}\\n.ab-component-tools.ab-tab-tools {\\n right: 0;\\n z-index: 100;\\n}\\n.ab-component-remove,\\n.ab-component-edit {\\n width: 31px;\\n height: 31px;\\n display: inline-block;\\n margin-right: 1px;\\n font-size: 18px;\\n text-align: center;\\n line-height: 33px !important;\\n background: #4caf50;\\n color: white;\\n top: -2px;\\n position: relative;\\n overflow: hidden;\\n float: right;\\n}\\n.ab-component-remove:hover,\\n.ab-component-edit:hover {\\n cursor: pointer;\\n}\\n.ab-component-remove {\\n background: #ff3b30;\\n}\\n.panel_icon {\\n font-size: 16px;\\n width: 22px;\\n height: 24px;\\n line-height: 24px;\\n}\\n.webix_fieldset_label {\\n width: auto;\\n margin-bottom: 0;\\n border: 0;\\n}\\n.ab-widget-header {\\n background: #eee;\\n}\\n.ab-component-header .webix_el_box {\\n font-size: 24px;\\n}\\n.ab-component-description .webix_el_box {\\n color: #666;\\n}\\n.bg_gray {\\n background-color: #ebedf0;\\n}\\n.noBackground, .webix_dark .webix_sidebar {\\n background-color: transparent;\\n}\\n.webix_dark .webix_view {\\n background-color: transparent;\\n color: white;\\n}\\n.ab_amp .webix_dark .webix_view {\\n background-color: white;\\n color: inherit;\\n}\\n.webix_dark .webix_list-x .webix_list_item {\\n border-right: 0;\\n}\\n.ab-text .ab-detail-component-holder {\\n line-height: 32px;\\n}\\n.webix_tree_checkbox {\\n margin: 5px 6px 0 0 !important;\\n height: 14px;\\n width: 14px;\\n}\\n.ab-menu-left .webix_scroll_cont {\\n text-align: left;\\n}\\n.ab-menu-right .webix_scroll_cont {\\n text-align: right;\\n}\\n.ab-menu-center .webix_scroll_cont {\\n text-align: center;\\n}\\n.ab-menu-link.webix_menu-x .webix_list_item {\\n background: transparent;\\n color: #337ab7;\\n font-weight: bold;\\n padding: 0;\\n margin-right: 15px;\\n}\\n.ab-menu-link.webix_menu-x .webix_list_item:hover {\\n text-decoration: underline;\\n}\\n.ab-custom-field {\\n overflow: visible;\\n}\\n.ab-custom-field .webix_template {\\n padding: 0;\\n}\\n.ab-custom-field legend {\\n border-bottom: none;\\n}\\n\\n.ab-component-form-rule {\\n background-color: #dcdcdc;\\n}\\n.ab-main-container .webix_querybuilder_wrap .webix_layout_form,\\n.ab-main-container .ab-component-form-rules .webix_layout_form {\\n background: inherit !important;\\n}\\n.ab-component-form-rules .webix_view {\\n background: transparent !important;\\n}\\n.ab-component-form-rules {\\n background: #ddd;\\n border-radius: 5px;\\n box-shadow: inset 0px 2px 5px 0px rgba(0, 0, 0, 0.4);\\n position: relative;\\n overflow: visible;\\n}\\n.ab-component-form-rules-delete {\\n background: transparent;\\n}\\n.ab-component-form-rules-delete .ab-component-remove {\\n position: absolute;\\n top: -6px;\\n right: -8px;\\n border-radius: 100%;\\n}\\n/* Connect object data */\\n.ab-connect-add-new a.fa {\\n width: 35px;\\n height: 35px;\\n display: block;\\n float: left;\\n border-radius: 4px;\\n background: #1ca1c1;\\n color: white;\\n opacity: 1;\\n text-align: center;\\n line-height: 35px;\\n}\\n.ab-connect-add-new a.fa:hover {\\n text-decoration: none;\\n background-color: #1992af;\\n}\\n.ab-connect-data-info {\\n display: inline-block;\\n width: 90px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.ab-connect-data-disable {\\n background-color: #aaa;\\n}\\n.stop-scrolling {\\n height: 100%;\\n overflow: hidden;\\n}\\n.ab-scroll-y {\\n overflow-y: auto !important;\\n}\\n.ab-ellipses-text,\\n.ab-ellipses-text > div {\\n overflow: hidden;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n}\\n.webix_dtable .webix_ss_footer .webix_hcell:hover,\\n.webix_dtable .webix_ss_header .webix_hcell:hover {\\n border-right-color: #dadee0;\\n}\\n\\n/* Interface Editor */\\n.ab-widget-header {\\n background-color: #ddd;\\n}\\n.ab-widget-header .webix_icon_btn {\\n opacity: 0.7;\\n margin-left: 5px;\\n}\\n.ab-main-container .widget_drag {\\n position: absolute;\\n z-index: 1;\\n top: 0px;\\n right: 0px;\\n width: 33px;\\n opacity: 1;\\n cursor: move;\\n background-color: #aaa;\\n height: 31px;\\n color: #fff;\\n}\\n.ab-main-container .widget_drag:hover {\\n opacity: 0.8;\\n}\\n.ab-main-container .widget_drag .webix_icon {\\n line-height: 28px;\\n width: 33px;\\n height: 33px;\\n text-align: center;\\n}\\n.webix_el_checkbox .webix_label_right {\\n padding-top: 0;\\n}\\n.webix_cell .ab-image-data-field {\\n /* pointer-events: none; */\\n padding: 0;\\n}\\n.ab-image-holder, .ab-image-holder .webix_template {\\n padding: 0;\\n overflow: visible;\\n}\\n.ab-image-data-field {\\n width: 100%;\\n height: 100%;\\n}\\n.ab-image-data-field-download {\\n position: absolute;\\n left: 0;\\n background-color: #dcdcdc;\\n padding: 3px 1px 1px 1px;\\n opacity: 0.5 !important;\\n text-decoration: none;\\n color: #000;\\n}\\n.ab-image-data-field-download:hover {\\n opacity: 1 !important;\\n text-decoration: none;\\n color: #000;\\n}\\n.detailsView .webix_icon:hover,\\n.edit .webix_icon:hover,\\n.trash .webix_icon:hover {\\n cursor: pointer;\\n}\\n.ab-layout-header {\\n position: relative;\\n}\\n.ab-layout-header > .ab-component-tools {\\n right: 0px;\\n}\\n\\n.transparent {\\n background: transparent !important;\\n}\\n.borderless {\\n border: none !important;\\n}\\n.nopadding {\\n padding: 0 !important;\\n}\\n.nomargin {\\n margin: 0 !important;\\n}\\n.webix_modal {\\n opacity: 0.8;\\n}\\n.modal_title .webix_el_box {\\n font-size: 18px;\\n}\\n/* Loading Screen */\\n.ab-loading-screen {\\n background: #000;\\n opacity: 0.7;\\n position: absolute !important;\\n}\\n.ab-loading-body {\\n background: #000;\\n border-width: 0px !important;\\n}\\n.ab-loading-message {\\n color: #fff !important;\\n background: #000 !important;\\n font-size: 30px !important;\\n text-align: center;\\n vertical-align: middle;\\n border-width: 0px !important;\\n padding-top: 20% !important;\\n height: 100px !important;\\n}\\n.ab-loading-button {\\n text-align: center;\\n}\\n.ab-loading-button button {\\n background-color: #003b7e;\\n width: 200px;\\n}\\n.ab-loading-cancel-button {\\n text-align: center;\\n background: transparent;\\n}\\n.ab-loading-cancel-button a {\\n color: #fff !important;\\n}\\n.ab-loading-screen .webix_progress_bottom {\\n height: 40px !important;\\n opacity: 1;\\n}\\n.ab-loading-screen .webix_progress_bottom .webix_progress_state {\\n height: 40px !important;\\n}\\n.webix_menu-x .webix_list_item:last-child {\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_menu-x .webix_list_item:first-child {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n}\\n.preview_item {\\n background: #999;\\n}\\n.panel_drag_view {\\n border-width: 0 1px 1px 1px;\\n border-color: 1px solid #dadee0;\\n border-style: solid;\\n}\\n.panel_drag_view:before {\\n content: \\\"\\\";\\n display: block;\\n height: 100%;\\n width: 100%;\\n background: rgb(255, 255, 255);\\n background: linear-gradient(\\n 0deg,\\n rgba(255, 255, 255, 1) 15%,\\n rgba(255, 255, 255, 0) 80%\\n );\\n position: absolute;\\n z-index: 1;\\n top: 31px;\\n}\\n.ab-datacollection-table .ab-component-in-page {\\n text-align: center;\\n line-height: 15px;\\n vertical-align: middle;\\n display: table-cell;\\n}\\n.ab-datacollection-table .webix_dataview_item {\\n display: table;\\n}\\n.ab-datacollection-table .fa {\\n color: #337ab7;\\n margin-bottom: 10px;\\n}\\n.ab-datacollection-table.borderless .webix_dataview_item,\\n.borderless .webix_dataview_item {\\n border: none;\\n padding: 12px;\\n}\\n.ab-datacollection-table .webix_dataview_item:hover {\\n background: #edeff0;\\n border-radius: 5px;\\n}\\n.webix_list_item:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected,\\n.webix_all_tabs .webix_item_tab.webix_selected:hover,\\n.webix_all_tabs .webix_item_tab.webix_selected:active,\\n.webix_all_tabs .webix_item_tab.webix_selected:focus {\\n color: white;\\n background: #1ca1c199 !important;\\n box-shadow: inset 0 -3px #1ca1c1;\\n}\\n.webix_all_tabs .webix_item_tab,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon {\\n box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.25);\\n background: #ebedf0;\\n}\\n.ab-tab-back:hover,\\n.ab-tab-next:hover,\\n.ab-tab-up:hover,\\n.ab-tab-down:hover {\\n cursor: e-resize;\\n opacity: 1;\\n}\\n.ab-tab-back:hover {\\n cursor: w-resize;\\n}\\n.ab-tab-up:hover {\\n cursor: n-resize;\\n opacity: 1;\\n}\\n.ab-tab-down:hover {\\n cursor: s-resize;\\n}\\n.ab-tab-back,\\n.ab-tab-next,\\n.ab-tab-up,\\n.ab-tab-down {\\n float: left;\\n margin-left: 10px;\\n background: #1ca1c1;\\n opacity: 0.8;\\n width: 20px;\\n height: 20px;\\n border-radius: 10px;\\n line-height: 18px;\\n padding-right: 2px;\\n color: white;\\n}\\n.ab-tab-edit {\\n opacity: 0.4;\\n}\\n.ab-tab-edit:hover {\\n opacity: 1;\\n}\\n.ab-tab-next {\\n float: right;\\n margin-right: 10px;\\n padding-left: 6px;\\n}\\n.ab-tab-up,\\n.ab-tab-down {\\n float: right;\\n margin: 12px -2px 12px 15px;\\n padding-left: 6px;\\n}\\n.webix_all_tabs div:nth-child(1) .ab-tab-back {\\n display: none;\\n}\\n.webix_all_tabs div:nth-last-child(1) .ab-tab-next {\\n display: none;\\n}\\n.webix_tab_filler:nth-last-child(1) {\\n width: 17px !important;\\n}\\n.ab-tabview-scrollview {\\n /* margin-top: -1px; */\\n}\\n.ab-tabIconContainer {\\n display: inline-block;\\n}\\n\\n.webix_view.webix_control.webix_el_tabbar.webix_dark {\\n background: #4a4e58;\\n}\\n.webix_el_tabbar.webix_dark .webix_all_tabs .webix_item_tab {\\n background: transparent;\\n color: white;\\n}\\n.webix_el_tabbar.webix_dark .webix_all_tabs .webix_item_tab:hover {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n.webix_sidebar.webix_dark .webix_tree_item.webix_selected span {\\n color: white;\\n}\\n.webix_sidebar.webix_dark\\n .webix_tree_item.webix_selected\\n span.webix_sidebar_icon {\\n color: inherit;\\n}\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_inp_counter_next,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_inp_counter_prev,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_menu-x .webix_list_item,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_segment_0,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_segment_1,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_segment_N,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webixtype_base,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webixtype_next,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webixtype_prev {\\n border-color: rgba(0, 0, 0, 0.1);\\n}\\n.webix_tree_none {\\n /* display: none; */\\n}\\n.ab-background-lightgray {\\n background: #c0c5cc;\\n}\\n.ab-background-gray {\\n background: #475466;\\n}\\n.ab-background-gray::before {\\n content: \\\"\\\";\\n background: #475466;\\n display: block;\\n position: absolute;\\n left: 0;\\n width: 100%;\\n height: 100vh;\\n}\\n.ab-background-gray .webix_view.webix_layout_form {\\n background: transparent;\\n}\\n.webix_carousel .image {\\n background: #333;\\n}\\n.webix_nav_panel .webix_nav_item {\\n box-sizing: border-box;\\n}\\n.ab-carousel-image-container {\\n position: relative;\\n height: 100%;\\n}\\n.ab-carousel-image-container img {\\n width: 100%;\\n height: 100%;\\n object-fit: contain;\\n}\\n.ab-carousel-image-title {\\n position: absolute;\\n top: 0;\\n left: 0;\\n font-size: 18px;\\n padding: 4px;\\n background: rgba(0, 0, 0, 0.4);\\n border-bottom-right-radius: 8px;\\n color: #fff;\\n}\\n.ab-carousel-image-icon {\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n font-size: 20px;\\n border-bottom-left-radius: 8px;\\n background: rgba(255, 255, 255, 0.4);\\n}\\n.ab-carousel-image-icon span {\\n opacity: 0.6;\\n margin: 6px;\\n}\\n.ab-carousel-image-icon span:hover {\\n opacity: 1;\\n cursor: pointer;\\n}\\n.webix_carousel.fullscreen .ab-carousel-fullscreen {\\n display: none;\\n}\\n.ab-detail-view .webix_accordionitem {\\n border-radius: 5px;\\n box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 2px 0px;\\n border-color: transparent;\\n}\\n.ab-detail-page.ab-detail-hover .webix_accordionitem:hover {\\n box-shadow: rgba(0, 0, 0, 0.2) 0px 3px 2px 0px;\\n}\\n.ab-detail-page .webix_accordionitem:hover .webix_accordionitem_body:after {\\n background: #1da1c14f;\\n width: 100%;\\n height: 100%;\\n display: block;\\n position: absolute;\\n cursor: pointer;\\n top: 0;\\n font-family: \\\"FontAwesome\\\";\\n content: \\\"\\\";\\n color: white;\\n text-align: center;\\n font-size: 72px;\\n vertical-align: middle;\\n}\\n.ab-edit-page .webix_accordionitem:hover {\\n position: relative;\\n}\\n.ab-edit-page .webix_accordionitem:hover .webix_accordionitem_header {\\n display: block !important;\\n position: absolute;\\n right: 0;\\n top: 0;\\n border: 0;\\n z-index: 1;\\n border-bottom-left-radius: 10px;\\n}\\n.ab-edit-page\\n .webix_accordionitem:hover\\n .webix_accordionitem_header\\n .webix_accordionitem_button:before {\\n content: \\\"\\\\f013\\\";\\n font-family: \\\"FontAwesome\\\";\\n color: #94a1b3;\\n}\\n.ab-edit-page.ab-detail-page\\n .webix_accordionitem:hover\\n .webix_accordionitem_header\\n .webix_accordionitem_button:before {\\n color: white;\\n}\\n.ab-edit-page\\n .webix_accordionitem\\n .webix_accordionitem_header:hover\\n .webix_accordionitem_button:before {\\n color: #94a1b3 !important;\\n}\\n.ab-custom-template .webix_template {\\n padding: 10px;\\n}\\n\\n.image-data-field-image {\\n position: relative;\\n border: 5px solid white;\\n background-size: contain;\\n background-position: center;\\n overflow: visible;\\n background-repeat: no-repeat;\\n background-color: #333;\\n}\\n.ab-delete-photo {\\n position: absolute;\\n top: 0;\\n right: 0;\\n}\\n.hasDataCollection {\\n color: #1ca1c1;\\n margin: 5px;\\n position: absolute;\\n right: 0;\\n background: white;\\n}\\n.sidebarCustomIcon {\\n font-family: \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n font-size: 12px !important;\\n background: #94a1b3 !important;\\n border-radius: 100%;\\n width: 20px !important;\\n height: 20px;\\n line-height: 20px;\\n color: #fff !important;\\n font-weight: bold;\\n vertical-align: unset !important;\\n}\\n.webix_dark .sidebarCustomIcon {\\n color: #4a4e58 !important;\\n}\\n.webix_dark .webix_selected .sidebarCustomIcon {\\n background: #1ca1c1 !important;\\n color: #4a4e58 !important;\\n}\\n.webix_selected .sidebarCustomIcon {\\n color: #fff !important;\\n background: #1ca1c1 !important;\\n}\\n\\n/* FormBuilder Clases */\\n.formbuilder {\\n padding: 20px;\\n}\\n.card-header .btn {\\n color: #333;\\n}\\n.card {\\n position: relative;\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-direction: column;\\n flex-direction: column;\\n min-width: 0;\\n word-wrap: break-word;\\n background-color: #fff;\\n background-clip: border-box;\\n border: 1px solid rgba(0, 0, 0, 0.125);\\n border-radius: 0.25rem;\\n}\\n\\n.card > hr {\\n margin-right: 0;\\n margin-left: 0;\\n}\\n\\n.card > .list-group:first-child .list-group-item:first-child {\\n border-top-left-radius: 0.25rem;\\n border-top-right-radius: 0.25rem;\\n}\\n\\n.card > .list-group:last-child .list-group-item:last-child {\\n border-bottom-right-radius: 0.25rem;\\n border-bottom-left-radius: 0.25rem;\\n}\\n\\n.card-body {\\n -ms-flex: 1 1 auto;\\n flex: 1 1 auto;\\n min-height: 1px;\\n padding: 1.25rem;\\n}\\n\\n.card-title {\\n margin-bottom: 0.75rem;\\n}\\n\\n.card-subtitle {\\n margin-top: -0.375rem;\\n margin-bottom: 0;\\n}\\n\\n.card-text:last-child {\\n margin-bottom: 0;\\n}\\n\\n.card-link:hover {\\n text-decoration: none;\\n}\\n\\n.card-link + .card-link {\\n margin-left: 1.25rem;\\n}\\n\\n.card-header {\\n padding: 0.75rem 1.25rem;\\n margin-bottom: 0;\\n background-color: rgba(0, 0, 0, 0.03);\\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-header:first-child {\\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\\n}\\n\\n.card-header + .list-group .list-group-item:first-child {\\n border-top: 0;\\n}\\n\\n.card-footer {\\n padding: 0.75rem 1.25rem;\\n background-color: rgba(0, 0, 0, 0.03);\\n border-top: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-footer:last-child {\\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\\n}\\n\\n.card-header-tabs {\\n margin-right: -0.625rem;\\n margin-bottom: -0.75rem;\\n margin-left: -0.625rem;\\n border-bottom: 0;\\n}\\n\\n.card-header-pills {\\n margin-right: -0.625rem;\\n margin-left: -0.625rem;\\n}\\n\\n.card-img-overlay {\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n padding: 1.25rem;\\n}\\n\\n.card-img,\\n.card-img-bottom,\\n.card-img-top {\\n -ms-flex-negative: 0;\\n flex-shrink: 0;\\n width: 100%;\\n}\\n\\n.card-img,\\n.card-img-top {\\n border-top-left-radius: calc(0.25rem - 1px);\\n border-top-right-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-img,\\n.card-img-bottom {\\n border-bottom-right-radius: calc(0.25rem - 1px);\\n border-bottom-left-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-deck .card {\\n margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n .card-deck {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-flow: row wrap;\\n flex-flow: row wrap;\\n margin-right: -15px;\\n margin-left: -15px;\\n }\\n .card-deck .card {\\n -ms-flex: 1 0 0%;\\n flex: 1 0 0%;\\n margin-right: 15px;\\n margin-bottom: 0;\\n margin-left: 15px;\\n }\\n}\\n\\n.card-group > .card {\\n margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n .card-group {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-flow: row wrap;\\n flex-flow: row wrap;\\n }\\n .card-group > .card {\\n -ms-flex: 1 0 0%;\\n flex: 1 0 0%;\\n margin-bottom: 0;\\n }\\n .card-group > .card + .card {\\n margin-left: 0;\\n border-left: 0;\\n }\\n .card-group > .card:not(:last-child) {\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n }\\n .card-group > .card:not(:last-child) .card-header,\\n .card-group > .card:not(:last-child) .card-img-top {\\n border-top-right-radius: 0;\\n }\\n .card-group > .card:not(:last-child) .card-footer,\\n .card-group > .card:not(:last-child) .card-img-bottom {\\n border-bottom-right-radius: 0;\\n }\\n .card-group > .card:not(:first-child) {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n }\\n .card-group > .card:not(:first-child) .card-header,\\n .card-group > .card:not(:first-child) .card-img-top {\\n border-top-left-radius: 0;\\n }\\n .card-group > .card:not(:first-child) .card-footer,\\n .card-group > .card:not(:first-child) .card-img-bottom {\\n border-bottom-left-radius: 0;\\n }\\n}\\n\\n.card-columns .card {\\n margin-bottom: 0.75rem;\\n}\\n\\n@media (min-width: 576px) {\\n .card-columns {\\n -webkit-column-count: 3;\\n -moz-column-count: 3;\\n column-count: 3;\\n -webkit-column-gap: 1.25rem;\\n -moz-column-gap: 1.25rem;\\n column-gap: 1.25rem;\\n orphans: 1;\\n widows: 1;\\n }\\n .card-columns .card {\\n display: inline-block;\\n width: 100%;\\n }\\n}\\n\\n.accordion > .card {\\n overflow: hidden;\\n}\\n\\n.accordion > .card:not(:last-of-type) {\\n border-bottom: 0;\\n border-bottom-right-radius: 0;\\n border-bottom-left-radius: 0;\\n}\\n\\n.accordion > .card:not(:first-of-type) {\\n border-top-left-radius: 0;\\n border-top-right-radius: 0;\\n}\\n\\n.accordion > .card > .card-header {\\n border-radius: 0;\\n margin-bottom: -1px;\\n}\\n.form-builder-group-header {\\n padding: 0;\\n}\\n.formio .btn:hover,\\n.btn:focus {\\n background-position: 0 0 !important;\\n}\\n.mb-0,\\n.my-0 {\\n margin-bottom: 0 !important;\\n}\\n.mt-0,\\n.my-0 {\\n margin-top: 0 !important;\\n}\\n.scrolly {\\n overflow: scroll;\\n}\\n.forceOpen {\\n display: block !important;\\n}\\n.formio .btn-secondary,\\n.formio-dialog .btn-secondary {\\n color: #333;\\n}\\n.formio-dialog a,\\n.formio a {\\n opacity: 1 !important;\\n}\\n.component-settings .nav > li > a {\\n margin-bottom: -7px;\\n}\\n.formio-form .input-group {\\n display: flex;\\n}\\n.formio-form .input-group-append {\\n margin-left: -1px;\\n}\\n.formio-form .input-group-append,\\n.formio-form .input-group-prepend {\\n display: -ms-flexbox;\\n display: flex;\\n}\\n.formio-form .input-group-text {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-align: center;\\n align-items: center;\\n padding: 0.375rem 0.75rem;\\n margin-bottom: 0;\\n font-size: 1rem;\\n font-weight: 400;\\n line-height: 1.5;\\n color: #495057;\\n text-align: center;\\n white-space: nowrap;\\n background-color: #e9ecef;\\n border: 1px solid #ced4da;\\n border-radius: 0.25rem;\\n}\\n.formio-form .input-group > .input-group-append > .btn,\\n.formio-form .input-group > .input-group-append > .input-group-text,\\n.formio-form\\n .input-group\\n > .input-group-prepend:first-child\\n > .btn:not(:first-child),\\n.formio-form\\n .input-group\\n > .input-group-prepend:first-child\\n > .input-group-text:not(:first-child),\\n.formio-form .input-group > .input-group-prepend:not(:first-child) > .btn,\\n.formio-form\\n .input-group\\n > .input-group-prepend:not(:first-child)\\n > .input-group-text {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n}\\n.formio-form .nav-tabs > li {\\n margin-bottom: -8px;\\n}\\n.formio-dialog .formio-form .nav-tabs > li {\\n margin-bottom: -1px;\\n}\\n.max100 {\\n max-width: 100%;\\n}\\n.webix_qb_buttons button {\\n height: auto;\\n}\\n.no-margin {\\n margin: 0 !important;\\n}\\n.ab_amp .fa-stack {\\n font-size: 0.65em;\\n}\\n.ab_amp i {\\n vertical-align: middle;\\n}\\n.ab_amp.lightgray {\\n background: #eee;\\n}\\n.ab_amp .webixLineTree:hover {\\n cursor: pointer;\\n}\\n.ab_amp .accessLevel .fa-stack {\\n vertical-align: top;\\n margin-top: 3px;\\n}\\n.ab_amp .accessLevel:hover .fa-stack {\\n transform: scale(1.25, 1.25);\\n}\\n.ab_amp .externalLink {\\n color: #ccc;\\n float: right;\\n margin-top: 5px;\\n}\\n.ab_amp .externalLink:hover {\\n color: #666 !important;\\n}\\n.ab_amp .webix_accordionitem .webix_accordionitem_button,\\n.ab_amp .webix_accordionitem.collapsed .webix_accordionitem_button {\\n float: left !important;\\n}\\n.ab_amp .webix_accordionitem .webix_accordionitem_button {\\n transform: rotate(180deg);\\n}\\n.ab_amp .webix_accordionitem.collapsed .webix_accordionitem_button {\\n transform: rotate(-90deg);\\n}\\n.ab_amp .webix_accordionitem_header {\\n background-color: #1ca1c1 !important;\\n}\\n.ab_amp .webix_accordionitem_header.collapsed {\\n background-color: white !important;\\n}\\n.ab_amp .webix_danger_inverse button {\\n border: 1px solid #ff4938;\\n color: #ff4938;\\n background: white;\\n}\\n.ab_amp .webix_danger_inverse .webix_icon_btn {\\n color: #ff4938;\\n}\\n.ab_amp .webix_danger_inverse:hover button {\\n background-color: #ff4938;\\n color: #fff;\\n}\\n.ab_amp .webix_danger_inverse:hover .webix_icon_btn {\\n color: #fff;\\n}\\ndiv.amp {\\n font-family: \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n background: rgb(28, 161, 193, 0.4);\\n /* padding: 5px 0; */\\n display: inline-block;\\n right: 0;\\n top: 75px;\\n border-top-left-radius: 10px;\\n border-bottom-left-radius: 10px;\\n color: white;\\n font-size: 16px;\\n transition: 0.25s all;\\n position: absolute;\\n width: 40px;\\n white-space: nowrap;\\n overflow: hidden;\\n height: 32px;\\n z-index: 100;\\n display: flex;\\n}\\ndiv.amp.qtt {\\n top: 108px;\\n}\\ndiv.amp div {\\n padding: 5px 10px;\\n}\\ndiv.amp div:first-child {\\n background: rgba(255, 255, 255, 0.2);\\n border-right: 1px solid rgba(255, 255, 255, 0.4);\\n padding: 5px 10px;\\n}\\ndiv.amp:hover {\\n width: 212px !important;\\n cursor: pointer;\\n background: rgb(28, 161, 193) !important;\\n}\\ndiv.amp:hover .fa-unlock-alt {\\n display: inline-block !important;\\n}\\ndiv.amp:hover .fa-lock {\\n display: none !important;\\n}\\ndiv.amp .fa-unlock-alt,\\ndiv.amp .fa-lock,\\ndiv.amp .fa-language {\\n transform: scale(1.25, 1.25);\\n text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2);\\n}\\ndiv.amp .fa-unlock-alt {\\n display: none;\\n}\\n.ampWindow .webix_toolbar.webix_dark {\\n background: #444 !important;\\n}\\n/* .accessLevel-0::before {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n background: rgba(233, 30, 30, 0.4);\\n display: block;\\n position: absolute;\\n}\\n.accessLevel-1::before {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n background: rgba(33, 150, 243, 0.4);\\n display: block;\\n position: absolute;\\n}\\n.accessLevel-2::before {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n background: rgba(76, 175, 80, 0.4);\\n display: block;\\n position: absolute;\\n} */\\n.ab-csv-importer .row-pass {\\n background-color: #b4e8b6;\\n}\\n.ab-csv-importer .row-fail {\\n background-color: #e4b0ad;\\n}\\n.ab-csv-importer .row-warn {\\n background-color: #f9d59f;\\n}\\n.ab-csv-importer .cell-invalid {\\n background-color: #e9ab4d;\\n}\\n.transparentBG .webix_el_tabbar + .webix_multiview {\\n background: transparent !important;\\n}\\n.webix_hcell .fa {\\n opacity: 0.4;\\n}\\n.ab-widget-header .webix_template {\\n padding: 0 10px;\\n}\\n.ab-layout-header .webix_template {\\n padding: 0;\\n line-height: 30px;\\n}\\n.ab-widget-header .webix_template div {\\n line-height: 30px;\\n}\\n.ab-widget-header .webix_template div .fa,\\n.ab-layout-header .fa {\\n vertical-align: middle;\\n}\\n#offlinePrompt,\\n#connectionPrompt {\\n line-height: 30px;\\n color: white;\\n background: #f44336;\\n font-size: 14px;\\n text-align: center;\\n transition: all 1s;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);\\n overflow: hidden;\\n}\\n#connectionPrompt {\\n background: #f44336;\\n}\\n#countdown {\\n height: 20px;\\n width: 20px;\\n text-align: center;\\n display: inline-block;\\n line-height: 20px;\\n position: relative;\\n bottom: 2px;\\n font-size: 9px;\\n}\\n\\n#countdown-number {\\n color: white;\\n display: inline-block;\\n width: 20px;\\n height: 20px;\\n}\\n\\n#countdown svg {\\n width: 20px;\\n height: 20px;\\n transform: rotateY(-180deg) rotateZ(-90deg);\\n position: absolute;\\n margin-left: -20px;\\n}\\n\\n#countdown svg circle {\\n stroke-dasharray: 56px;\\n stroke-dashoffset: 0px;\\n stroke-linecap: round;\\n stroke-width: 2px;\\n stroke: white;\\n fill: none;\\n animation: countdown 30s linear infinite forwards;\\n}\\n\\n@keyframes countdown {\\n from {\\n stroke-dashoffset: 0px;\\n }\\n to {\\n stroke-dashoffset: 56px;\\n }\\n}\\n#reloadPrompt {\\n position: absolute;\\n z-index: 200000;\\n top: 0;\\n bottom: 0;\\n left: 0;\\n right: 0;\\n background: rgba(0, 0, 0, 0.7);\\n display: flex;\\n}\\n#reloadPrompt div {\\n background: #f44336;\\n width: 250px;\\n border: 3px solid white;\\n margin: auto auto;\\n padding: 20px;\\n text-align: center;\\n border-radius: 10px;\\n color: white;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);\\n}\\n.reloadPage {\\n background: rgba(0, 0, 0, 0.2);\\n border: none;\\n padding: 5px 10px;\\n border-radius: 5px;\\n margin-top: 10px;\\n}\\n.reloadPage:hover {\\n background: rgba(0, 0, 0, 0.4);\\n}\\n.webix_warn .webix_button {\\n background: #ff9800 !important;\\n color: #fff !important;\\n}\\n.webix_dark .webix_inp_bottom_label {\\n color: lightgray;\\n font-style: oblique;\\n}\\n.no-margin {\\n margin: 0;\\n}\\n.inbox_drawer.webix_toolbar.webix_dark .webix_secondary button,\\n.mainToolbar.webix_toolbar.webix_dark .webix_secondary button {\\n background-color: transparent;\\n}\\n.inbox_drawer.webix_toolbar.webix_dark .webix_secondary button:hover,\\n.mainToolbar.webix_toolbar.webix_dark .webix_secondary button:hover {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n/* Login Page */\\n.portalLogin {\\n /* opacity: 0; */\\n background: #ebedf0;\\n background: linear-gradient(\\n 0deg,\\n rgba(171, 171, 171, 1) 0%,\\n rgba(235, 237, 240, 1) 100%\\n );\\n /* -webkit-animation: 1s ease 0s normal forwards 1 fadein;\\n animation: 1s ease 0s normal forwards 1 fadein; */\\n}\\n.portalLoginForm {\\n opacity: 0;\\n -webkit-animation: 1s ease 0s normal forwards 1 fadein;\\n animation: 1s ease 0s normal forwards 1 fadein;\\n background: white;\\n border-radius: 30px;\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n position: relative;\\n top: -20px;\\n transform: scale(1.2);\\n}\\n.portalLogin .webix_view {\\n overflow: visible;\\n display: inline-block;\\n}\\n.preload-card {\\n opacity: 0;\\n animation: 1s ease 0s normal forwards 1 onlyfadein;\\n background: white;\\n border-radius: 30px;\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n position: relative;\\n\\n}\\ndiv.webix_dataview_item.webix_transparent {\\n padding: 0px;\\n}\\n@keyframes fadein {\\n 0% {\\n opacity: 0;\\n top: -20px;\\n transform: scale(1.1);\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n }\\n 100% {\\n opacity: 1;\\n top: 0;\\n transform: scale(1);\\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.4);\\n }\\n}\\n\\n@keyframes onlyfadein {\\n 0% {\\n opacity: 0;\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n }\\n 100% {\\n opacity: 1;\\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.4);\\n }\\n}\\n\\n@-webkit-keyframes fadein {\\n 0% {\\n opacity: 0;\\n }\\n 100% {\\n opacity: 1;\\n }\\n}\\n.ab-connect-add-new-link .webix_icon_btn {\\n margin-right: 0;\\n}\\n.image-data-field-icon {\\n border: 2px dashed rgba(0, 0, 0, 0.3);\\n border-radius: 10px;\\n padding: 5px;\\n display: flex;\\n flex-direction: row;\\n text-align: center;\\n justify-content: center;\\n align-items: center;\\n line-height: 12px;\\n font-size: 10px;\\n color: rgba(0, 0, 0, 0.5);\\n margin: 5px;\\n height: calc(100% - 10px);\\n overflow: hidden;\\n box-sizing: border-box;\\n}\\n.webix_cell > .ab-image-data-field {\\n margin-left: -12px;\\n}\\n.ab-delete-photo {\\n background: red;\\n color: white;\\n font-size: 10px;\\n text-align: center;\\n line-height: 20px;\\n width: 20px;\\n height: 20px;\\n border-radius: 10px;\\n top: -3px;\\n right: -3px;\\n transition: all 0.25s;\\n}\\n.ab-delete-photo:hover {\\n color: white;\\n font-size: 14px;\\n}\\n.webix_transparent .webix_button .webix_icon,\\n.webix_transparent .webix_button .webix_icon_btn {\\n color: #1ca1c1;\\n}\\n.webix_icon_btn {\\n margin-right: 0 !important;\\n vertical-align: baseline;\\n}\\n.webix_list_icon.webix_icon {\\n vertical-align: baseline;\\n}\\n.webix_list_item.menu {\\n color: inherit;\\n}\\n.ab-datacollection-list-item {\\n position: relative;\\n}\\n.ab-object-list-item {\\n position: relative;\\n}\\n.ab-object-list-edit {\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n.webix_el_label.formText .webix_el_box {\\n font-weight: normal;\\n}\\n\\n.switcheroo .webix_win_head .webix_layout_line {\\n background: #657584;\\n color: #fff;\\n}\\n.switcheroo .webix_win_head .webix_view .webix_template {\\n background: #657584;\\n color: #fff;\\n}\\n.portal_work_warning_banner {\\n background: #e64b2a;\\n color: #fff;\\n}\\n.portal_work_warning_banner .webix_el_box {\\n color: #fff;\\n}\\n.portal_work_warning_banner .webix_button {\\n color: #fff;\\n font-size: 14px;\\n}\\n.portal_work_switcheroo_user_switched {\\n background: #2196f3;\\n color: #fff;\\n}\\n.portal_work_switcheroo_user_switched .webix_el_box {\\n color: #fff;\\n}\\n/* Query Override */\\n.wbq-field-box {\\n max-width: 95% !important;\\n}\\n/* Tutorial Manager */\\n.highlightMe,\\n.findDataCy [data-cy] {\\n position: relative !important;\\n}\\n.highlightMe:before,\\n.findDataCy [data-cy]:hover:before {\\n content: \\\"\\\" !important;\\n width: 100% !important;\\n height: 100% !important;\\n border: 2px solid red !important;\\n border-style: inset !important;\\n position: absolute !important;\\n top: 0 !important;\\n left: 0 !important;\\n cursor: help !important;\\n}\\ninput.highlightMe,\\ntextarea.highlightMe,\\nbutton.highlightMe,\\n.findDataCy input[data-cy]:hover,\\n.findDataCy textarea[data-cy]:hover,\\n.findDataCy button[data-cy]:hover {\\n border: 2px solid red !important;\\n border-style: inset !important;\\n cursor: help !important;\\n}\\n.hintItem {\\n position: relative;\\n overflow: visible !important;\\n margin: 10px;\\n padding: 10px;\\n border: 1px solid #efefef;\\n border-radius: 5px;\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.hintItem:hover {\\n background: #efefef;\\n}\\n.hintItem h1 {\\n font-size: 18px;\\n padding: 0;\\n margin: 0;\\n}\\n.hintItem p {\\n margin: 0;\\n font-size: 14px;\\n line-height: 18px;\\n color: #6c757d;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n display: -webkit-box;\\n -webkit-line-clamp: 2;\\n -webkit-box-orient: vertical;\\n}\\n.deleteHint,\\n.deleteStep {\\n position: absolute;\\n right: -5px;\\n top: -5px;\\n background: red;\\n color: white;\\n width: 20px;\\n height: 20px;\\n line-height: 20px;\\n text-align: center;\\n border-radius: 10px;\\n}\\n.deleteHint:hover,\\n.deleteStep:hover {\\n transform: scale(1.1);\\n cursor: pointer;\\n}\\n.deleteStep {\\n right: 25px;\\n}\\n.active0 {\\n opacity: 0.4;\\n}\\n.highlightWin {\\n font-size: 18px;\\n text-align: center;\\n}\\n.stepPos {\\n font-size: 20px;\\n width: 35px;\\n height: 35px;\\n margin: 0 auto;\\n background: #657584;\\n line-height: 35px;\\n text-align: center;\\n color: white;\\n border-radius: 100%;\\n}\\n.wider_popup {\\n width: 250px !important;\\n}\\n.wider_popup .webix_list_item {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_hint {\\n padding-bottom: 60px !important;\\n}\\n.dontShow {\\n font-size: 12px;\\n font-weight: normal;\\n font-style: italic;\\n display: block;\\n padding: 0;\\n margin: 15px 0 0 0;\\n}\\n.dontShow input {\\n vertical-align: text-top;\\n}\\n.pdf-data-view .webix_selected {\\n background-color: #87c3d1;\\n}\\n.pdf-data-view-item {\\n display: flex;\\n flex-direction: row;\\n flex-wrap: nowrap;\\n justify-content: space-between;\\n}\\n.pdf-data-view-image {\\n position: relative;\\n}\\n.pdf-data-view-image-icon {\\n transition: .5s ease;\\n opacity: 0;\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n transform: translate(-50%, -50%);\\n -ms-transform: translate(-50%, -50%);\\n text-align: center;\\n}\\n.pdf-data-view-image:hover canvas {\\n opacity: 0.7;\\n}\\n.pdf-data-view-image:hover .pdf-data-view-image-icon {\\n opacity: 0.9;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import ConfigDesktop from \"./configDesktop\";\nimport ConfigMobile from \"./configMobile\";\n\n// var EventEmitter = require(\"events\").EventEmitter;\nimport { defaultsDeep } from \"lodash\";\n\nconst settingsDefault = {\n \"appbuilder-portal-autoenter\": true,\n // {bool} autoenter\n // open up the portal as soon as we load.\n // false : just displays a link that will load the portal\n\n \"appbuilder-portal-fullscreen\": true,\n // {bool} fullscreen\n // take up the full browser window?\n // false : only take up the area the current div is\n\n \"appbuilder-tenant\": null,\n // {string} tenant\n // the tenant uuid for this AppBuilder instance.\n\n \"appbuilder-view\": \"work\",\n // {string} view\n // the default view to display to the current user.\n\n \"appbuilder-tenant-prefix\": null,\n // TESTING! Remove this\n};\n\nconst configDefaults = {\n site: {\n appbuilder: {\n networkType: \"socket\",\n // options: [\"rest\", \"relay\", \"socket\"]\n // Note: \"socket\" is required for realtime updates across devices.\n\n networkNumRetries: 3,\n // the number of times we will retry sending a network request\n // when we receive a timeout error.\n\n urlCoreServer: window.location.origin,\n // on the web client, just record the current URL by default.\n // the site config can override this if they want.\n },\n storage: {\n encrypted: false,\n // {bool} should we encrypt our data in the local browser storage?\n },\n },\n};\nclass Config {\n constructor() {\n // this.setMaxListeners(0);\n this._config = null;\n // {obj} _config\n // these are the configuration settings returned from the server. These\n // are more detailed configuration settings for the running of the site.\n\n this._configUser = null;\n // {obj} _configUser\n // the default settings for the current user of the system.\n // .user {obj} the current info for who we think is using the site\n // .userReal {obj} if switheroo'd, this is the actual user\n\n this._settings = {};\n // {obj} _settings\n // settings are the configuration parameters found on the base
    \n // these settings are the minimum needed to successfully pull up the\n // portal popup and perform the initial config request\n }\n\n config(json) {\n this._config = this._config || {};\n Object.keys(json).forEach((k) => {\n this._config[k] = json[k];\n });\n defaultsDeep(this._config, configDefaults);\n }\n\n configInbox(json) {\n this._config = this._config || {};\n this._config.inbox = json.inbox || [];\n this._config.inboxMeta = json.inboxMeta || [];\n }\n\n configUser(json) {\n this._configUser = json;\n }\n\n setting(key, value) {\n if (value) {\n this._settings[key] = value;\n return;\n }\n return this._settings[key];\n }\n\n settingsFromDiv(div) {\n Object.keys(settingsDefault).forEach((d) => {\n var val = div.getAttribute(d);\n if (!val) {\n val = settingsDefault[d];\n }\n if (val === \"false\") val = false;\n if (val === \"true\") val = true;\n\n var key = d.split(\"-\").pop();\n this.setting(key, val);\n });\n }\n\n settings(json = {}) {\n for (let key in settingsDefault) {\n const val = json[key] ?? settingsDefault[key];\n this.setting(key.split(\"-\").pop(), val);\n }\n }\n\n /**\n * definitions()\n * return the ABDefinition(s) required to manage the interface.\n * @return {obj}\n * { ABDefinition.id : {ABDefinition} } hash of definitions.\n */\n definitions() {\n return window.definitions;\n }\n\n error(/* ...args */) {\n console.error(\"Who is calling this? -> move to AB.error() instead.\");\n // this.emit(\"ab.error\", args);\n }\n\n labelConfig() {\n if (this._config && this._config.labels) {\n return this._config.labels;\n }\n console.error(\"No Label config found.\");\n return {};\n }\n\n languageConfig() {\n if (this._config && this._config.languages) {\n return this._config.languages;\n }\n console.error(\"No Language config found.\");\n return {};\n }\n\n metaConfig() {\n if (this._config && this._config.meta) {\n return this._config.meta;\n }\n console.error(\"No Meta config found.\");\n return {};\n }\n\n plugins() {\n // TODO: Pull from this._config.plugins\n return [\"ABDesigner.js\"];\n // return [];\n }\n\n inboxConfig() {\n if (this._config && this._config.inbox) {\n return this._config.inbox;\n }\n return null;\n }\n\n inboxMetaConfig() {\n if (this._config && this._config.inboxMeta) {\n return this._config.inboxMeta;\n }\n return null;\n }\n\n /**\n * @typedef SiteConfig\n * @property {Object} appbuilder\n * @property {number} appbuilder.networkNumRetries\n * @property {\"socket\"|\"rest\"|\"relay\"} appbuilder.networkType\n * @property {string} appbuilder.urlCoreServer\n * @property {boolean} [relay] whether relay is enabled on the server\n * @property {Object} [storage]\n * @property {boolean} storage.encrypted\n * @property {Array<{uuid: string, key: string}>} [tenants]\n * @property {string} [privacyPolicy]\n */\n /** @returns {SiteConfig} */\n siteConfig() {\n if (this._config && this._config.site) {\n return this._config.site;\n }\n return configDefaults.site;\n }\n\n tenantConfig() {\n if (this._config && this._config.tenant) {\n return this._config.tenant;\n }\n return null;\n }\n\n uiSettings() {\n if (window.innerWidth < 768) {\n return ConfigMobile;\n }\n return ConfigDesktop;\n }\n\n /**\n * @typedef User - based on SITE_USER\n * @property {string} email email address\n * @property {string} id\n * @property {number} isActive wether the user is active in the system\n * @property {string} languageCode\n * @property {string} username\n * ...\n */\n\n /**\n * Information about the current user\n * @returns {User|null}\n */\n userConfig() {\n return this._configUser?.user ?? null;\n }\n\n userReal() {\n return this._configUser?.userReal ?? false;\n }\n}\nexport default new Config();\n","/**\n * @class configDesktop\n *\n * Manage our configuration settings for Desktop styles.\n\n */\n\nexport default {\n // Application List\n appListRowHeight: 67,\n\n // button types\n buttonWidthLarge: 200,\n buttonWidthMedium: 150,\n buttonWidthSmall: 100,\n buttonWidthExtraSmall: 50,\n\n // tab types\n tabWidthLarge: 200,\n tabWidthMedium: 120,\n tabWidthSmall: 100,\n tabWidthExtraSmall: 50,\n\n // column types\n columnWidthXLarge: 350,\n columnWidthLarge: 250,\n columnWidthMedium: 200,\n columnWidthSmall: 150,\n columnWidthExtraSmall: 100,\n\n // spacers\n xSmallSpacer: 5,\n smallSpacer: 10,\n mediumSpacer: 25,\n largeSpacer: 50,\n xLargeSpacer: 100,\n xxLargeSpacer: 200,\n xxxLargeSpacer: 400,\n appListSpacerRowHeight: 100,\n appListSpacerColMinWidth: 100,\n appListSpacerColMaxWidth: 200,\n objectWorkspaceColWidth: 20,\n\n // labels\n labelWidthSmall: 50,\n labelWidthMedium: 80,\n labelWidthLarge: 120,\n labelWidthXLarge: 150,\n labelWidthXXLarge: 200,\n labelWidthXXXLarge: 280,\n labelWidthCheckbox: 0,\n\n // show elements on desktop\n hideMobile: false,\n};\n","/**\n * @class configMobile\n *\n * Manage our configuration settings for mobile styles.\n\n */\n\nexport default {\n // Application List\n appListRowHeight: 67,\n\n // button types\n buttonWidthLarge: 200,\n buttonWidthMedium: 150,\n buttonWidthSmall: 100,\n buttonWidthExtraSmall: 50,\n\n // tab types\n tabWidthLarge: 200,\n tabWidthMedium: 120,\n tabWidthSmall: 100,\n tabWidthExtraSmall: 50,\n\n // column types\n columnWidthLarge: 250,\n columnWidthMedium: 200,\n columnWidthSmall: 150,\n columnWidthExtraSmall: 100,\n\n // spacers\n xSmallSpacer: 1,\n smallSpacer: 1,\n mediumSpacer: 10,\n largeSpacer: 20,\n xLargeSpacer: 50,\n xxLargeSpacer: 100,\n xxxLargeSpacer: 120,\n appListSpacerRowHeight: 10,\n appListSpacerColMinWidth: 1,\n appListSpacerColMaxWidth: 1,\n objectWorkspaceColWidth: 1,\n\n // labels\n labelWidthSmall: 50,\n labelWidthMedium: 80,\n labelWidthLarge: 120,\n labelWidthXLarge: 120,\n labelWidthXXLarge: 120,\n labelWidthCheckbox: 0,\n\n // hide elements for mobile\n hideMobile: true,\n};\n","// Include all CSS here\nimport \"./styles/loader.css\";\nimport \"./js/webix/webix.css\";\nimport \"./js/webix/components/gantt/gantt.min.css\";\nimport \"./js/webix/components/reports/reports.min.css\";\nimport \"./js/webix/components/query/query.min.css\";\nimport \"./js/webix/components/scheduler/scheduler.min.css\";\nimport \"./js/webix/components/querybuilder/querybuilder.min.css\";\nimport \"./js/webix/components/hint/hint.css\";\nimport \"./styles/ui.css\";\n// NOTE: keep Font Awesome AFTER webix css so webix wont\n// override our icon stylesimport \"./styles/font-awesome.min.css\";\nimport \"./styles/font-awesome.min.css\";\n\nimport performance from \"./utils/performance\";\nperformance.init();\n\nimport Bootstrap from \"./init/Bootstrap.js\";\n// Bootstrap is responsible for initializing the platform.\n\n// Import webix dynamically so we load it before we load other files that need it\nconst webixLoading = import(\n /* webpackChunkName: \"webix\" */\n /* webpackPreload: true */\n \"./js/webix/webix.min.js\"\n).then(async (webix) => {\n // Make sure webix is global object\n window.webix = webix;\n // Now load additional webix resources\n import(\n /* webpackChunkName: \"webix.resources\" */\n /* webpackPreload: true */\n \"./js/webix/webixResources\"\n );\n});\n\n// __AB_preload should be created by our /config/preload script that gets\n// loaded on the initial page load.\nPromise.all([window.__AB_preload, window.__AB_socketReady]).then(() => {\n delete window.__AB_preload_resolve;\n delete window.__AB_socketReady_resolve;\n Bootstrap.init(webixLoading).catch((err) => {\n // This is a known error that has already been handled.\n if (err.code == \"ENODEFS\") return;\n\n var errorMSG = err.toString();\n\n Bootstrap.alert({\n type: \"alert-error\",\n title: \"Error initializing Portal:\",\n text: errorMSG,\n });\n\n Bootstrap.error(err);\n });\n});\n","/*\n * Bootstrap.js\n * This file drives the setup and preparation of the Web Platform.\n * It's main job is to prepare all the local Resources for operation as\n * well the main ABFactory object that will drive the rest of the applications.\n */\n\nimport events from \"events\";\n\nconst EventEmitter = events.EventEmitter;\n\nimport Config from \"../config/Config.js\";\n\nimport initConfig from \"../init/initConfig.js\";\nimport \"../init/initConnectListerner.js\";\nimport initDiv from \"../init/initDiv.js\";\nimport initUser from \"../init/initUser.js\";\n// import initResources from \"../init/initResources.js\";\n\n// import JSZipUtils from \"jszip-utils/dist/jszip-utils.min.js\";\n\n// import Selectivity from \"../js/selectivity/selectivity.min.js\";\n// import selectivityCSS from \"../js/selectivity/selectivity.min.css\";\n\nimport UI from \"../ui/ui.js\";\nimport ErrorNoDefsUI from \"../ui/error_noDefs.js\";\n\nimport performance from \"../utils/performance.js\";\n\nclass Bootstrap extends EventEmitter {\n constructor() {\n super();\n this.setMaxListeners(0);\n\n // Common Reference to Configuration Values\n this.Config = Config;\n\n //\n // UI Related\n //\n\n this._div = null;\n // {el} _div\n // the HTML element that is the where our initial [click] here button\n // should be displayed. Our actual portal is a popup, but the base\n //
    can be used for an embedded view.\n\n this._plugins = [];\n // {array} ._plugins\n // an array of the loaded plugins we need to register.\n\n this._ui = null;\n // {obj} ._ui\n // the Webix Object that is our UI display\n\n this.on(\"error\", (err) => {\n performance.error(err);\n });\n }\n\n /**\n * @param {Promise} webixLoading - so we know when webix is finished loading\n */\n async init(webixLoading) {\n const loadABFactory = import(\n /* webpackChunkName: \"AB\" */\n /* webpackPrefetch: true */\n \"../AppBuilder/ABFactory\"\n );\n // @const {Promise} loadABFactory Defer loading the ABFactory for a smaller\n // inital file size, allowing us to show the loading UI sooner.\n /**\n * @type {Function} preloadMessage\n * @description show a loading message\n * @param {string} message to display on the loading screen\n */\n const preloadMessage = (m) =>\n (document.getElementById(\"preload-text\").innerHTML = m);\n /**\n * @type {Function}\n * @description remove the preload ui elements\n */\n const destroyPreloadUI = () =>\n document.getElementById(\"preloader\").remove();\n\n const networkTestWorker = new Worker(\n new URL(\"../utils/networkTest.js\", import.meta.url)\n );\n let networkIsSlow = false;\n networkTestWorker.onmessage = ({ data }) => {\n if (networkIsSlow !== data) {\n networkIsSlow = data;\n const $uiWarning = document.getElementById(\n \"preload_network_warning\"\n );\n $uiWarning.hidden = !networkIsSlow;\n // Tell sentry our network speed changed\n performance.setContext(\"breadcrumb\", {\n category: \"network\",\n message: networkIsSlow\n ? \"Slow network detected\"\n : \"Network speed restored\",\n level: \"info\",\n });\n }\n };\n\n preloadMessage(\"Waiting for the API Server\");\n\n performance.mark(\"bootstrap\", { op: \"function\" });\n // on the web platform, we need to gather the appropriate configuration\n // information before we can show the UI\n // 1) Find or create the DIV element our UI is to attach to\n // this DIV element can contain settings pertainent to our setup\n performance.mark(\"initDiv\", { op: \"ui.render\" });\n await initDiv.init(this);\n performance.measure(\"initDiv\");\n\n // 2) Request the User's Configuration Information from the server.\n performance.mark(\"initConfig\", { op: \"function\" });\n preloadMessage(\"Getting Configuration Settings\");\n await initConfig.init(this);\n performance.measure(\"initConfig\");\n\n await initUser.init(this);\n const userInfo = Config.userConfig();\n\n if (userInfo) {\n // load definitions for current user\n performance.setContext(\"user\", {\n id: userInfo.id,\n });\n // redirect if has refererUrlPWA\n const refererUrlPWA = sessionStorage.getItem(\"refererUrlPWA\");\n if (refererUrlPWA) {\n sessionStorage.removeItem(\"refererUrlPWA\");\n window.location.assign(refererUrlPWA);\n }\n } else {\n let { options: tenantConfig } = Config.tenantConfig();\n tenantConfig =\n typeof tenantConfig === \"string\"\n ? JSON.parse(tenantConfig)\n : tenantConfig;\n // If no user and tenant isn't using local auth start\n // the external auth workflow:\n if (tenantConfig.authType !== \"login\") {\n window.location.assign(\"/auth/login\");\n return;\n }\n // Keep going if the tenant is using local auth\n }\n // 2.5) Load any plugins\n performance.mark(\"loadPlugins\", { op: \"function\" });\n\n // Plugins are now loaded via the Preloader and stored in\n (window.__AB_Plugins || []).forEach((p) => {\n this.addPlugin(p);\n });\n performance.measure(\"loadPlugins\");\n\n // 3) Now we have enough info, to create an instance of our\n // {ABFactory} that drives the rest of the AppBuilder objects\n performance.mark(\"createABFactory\", { op: \"function\" });\n preloadMessage(\"Starting AppBuilder\");\n\n const { default: ABFactory } = await loadABFactory;\n let definitions = Config.definitions() || null;\n\n if (definitions) {\n // NOTE: when loading up an unauthorized user,\n // definitions will be null: we can skip the plugins\n // Q: is it possible to load a plugin when unauthorized?\n this._plugins.forEach((p) => {\n definitions = definitions.concat(p.definitions());\n });\n }\n this.AB = new ABFactory(definitions);\n\n if (!window.AB) window.AB = this.AB;\n // Make our Factory Global.\n // NOTE: our tests are expecting to access our ABFactory this way.\n\n this.AB.Network.registerNetworkTestWorker(\n networkTestWorker,\n networkIsSlow\n );\n\n const loadPlugin = async (purl) => {\n // Helper to load script with proper MIME type headers\n const loadScriptWithMimeType = async (url) => {\n try {\n // Fetch with Accept header to request JavaScript MIME type\n const response = await fetch(url, {\n headers: {\n Accept:\n \"application/javascript, text/javascript, */*;q=0.8\",\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to load script: ${response.status} ${response.statusText}`\n );\n }\n\n // Verify we got JavaScript content type\n const contentType = response.headers.get(\"content-type\");\n if (\n contentType &&\n !contentType.includes(\"javascript\") &&\n !contentType.includes(\"ecmascript\")\n ) {\n console.warn(\n `Unexpected content type for ${url}: ${contentType}`\n );\n }\n\n const text = await response.text();\n // Create a blob URL with explicit JavaScript MIME type\n const blob = new Blob([text], {\n type: \"application/javascript\",\n });\n return URL.createObjectURL(blob);\n } catch (e) {\n console.error(`Error loading script with fetch: ${url}`, e);\n return null;\n }\n };\n\n // try ESM dynamic import first; fall back to UMD global\n const tryImport = async (url) => {\n try {\n // Try direct import first (may work if server is configured correctly)\n try {\n const mod = await import(/* webpackIgnore: true */ url);\n // Try multiple ways to get the function\n let fn = mod?.default || mod?.registerService;\n if (!fn && typeof mod === \"object\") {\n // If still not found, try to find any function export\n const values = Object.values(mod);\n fn = values.find((v) => typeof v === \"function\");\n }\n if (fn) return fn;\n } catch (directImportError) {\n // If direct import fails, try with fetch + blob URL\n const blobUrl = await loadScriptWithMimeType(url);\n if (blobUrl) {\n try {\n const mod = await import(\n /* webpackIgnore: true */ blobUrl\n );\n URL.revokeObjectURL(blobUrl); // Clean up\n let fn = mod?.default || mod?.registerService;\n if (!fn && typeof mod === \"object\") {\n const values = Object.values(mod);\n fn = values.find((v) => typeof v === \"function\");\n }\n if (fn) return fn;\n } catch (blobImportError) {\n URL.revokeObjectURL(blobUrl); // Clean up on error\n throw blobImportError;\n }\n }\n }\n return null;\n } catch (e) {\n return null;\n }\n };\n\n const tryUMD = async (url) => {\n // Load script with proper MIME type, then inject as script tag\n const blobUrl = await loadScriptWithMimeType(url);\n if (!blobUrl) {\n // Fallback to original scriptLoad if available\n if (this.AB.scriptLoad) {\n await this.AB.scriptLoad(url);\n // Look for global export after script loads\n const globalExport = window.Plugin;\n return (\n (globalExport &&\n (globalExport.default ||\n globalExport.registerService ||\n globalExport)) ||\n null\n );\n } else {\n // Manual script tag creation with explicit type\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = url;\n script.onload = () => resolve();\n script.onerror = () =>\n reject(new Error(`Failed to load script: ${url}`));\n document.head.appendChild(script);\n }).then(() => {\n // Look for global export after script loads\n const globalExport = window.Plugin;\n return (\n (globalExport &&\n (globalExport.default ||\n globalExport.registerService ||\n globalExport)) ||\n null\n );\n });\n }\n }\n\n // Load via blob URL with explicit type\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = blobUrl;\n script.onload = () => {\n URL.revokeObjectURL(blobUrl); // Clean up\n // Conventional UMD name used by our plugin builds\n const globalExport = window.Plugin;\n resolve(\n (globalExport &&\n (globalExport.default ||\n globalExport.registerService ||\n globalExport)) ||\n null\n );\n };\n script.onerror = () => {\n URL.revokeObjectURL(blobUrl); // Clean up on error\n reject(new Error(`Failed to load script: ${url}`));\n };\n document.head.appendChild(script);\n }).catch(() => {\n // Fallback to original scriptLoad if available\n if (this.AB.scriptLoad) {\n return this.AB.scriptLoad(url).then(() => {\n const globalExport = window.Plugin;\n return (\n (globalExport &&\n (globalExport.default ||\n globalExport.registerService ||\n globalExport)) ||\n null\n );\n });\n }\n return null;\n });\n };\n\n let registerFn = await tryImport(purl);\n if (!registerFn) {\n registerFn = await tryUMD(purl);\n }\n if (typeof registerFn === \"function\") {\n // Register with the ABFactory core (expects a function taking PluginAPI)\n this.AB.pluginRegister(registerFn);\n } else {\n console.warn(\"Plugin did not export a function:\", purl);\n }\n };\n const loadPlugins = async (plugins) => {\n const urls = plugins || [];\n await Promise.all(urls.map((p) => loadPlugin(p)));\n };\n // load our installed plugins here:\n await loadPlugins(window.__AB_plugins_v1);\n\n await this.AB.init();\n await webixLoading;\n // NOTE: special case: User has no Roles defined.\n // direct them to our special ErrorNoDefsUI\n if (userInfo && userInfo.roles.length == 0) {\n performance.measure(\"createABFactory\");\n ErrorNoDefsUI.init(this.AB);\n ErrorNoDefsUI.attach();\n ErrorNoDefsUI.show();\n if (Config.userReal()) {\n ErrorNoDefsUI.switcherooUser(Config.userConfig());\n }\n destroyPreloadUI();\n this.ui(ErrorNoDefsUI);\n\n let err = new Error(\"No Definitions\");\n err.code = \"ENODEFS\";\n throw err;\n }\n\n // 3.5 prepare the plugins\n this._plugins.forEach((p) => {\n p.apply(this.AB);\n const labels = p.labels(this.AB.Multilingual.currentLanguage());\n this.AB.Multilingual.pluginLoadLabels(p.key, labels);\n });\n performance.measure(\"createABFactory\");\n\n // 4) Now we can create the UI and send it the {ABFactory}\n performance.mark(\"initUI\", { op: \"ui.render\" });\n // webix recommends wrapping any webix code in the .ready()\n // function that executes after page loading.\n webix.ready(() => {\n const locales = {\n en: \"en-US\",\n \"zh-hans\": \"zh-CN\",\n th: \"th-TH\",\n };\n // locales - map ab languageCode to webix locale\n const { languageCode } = AB.Config.userConfig() ?? {};\n // save the webix locale used to set locale in ClassUIPage.renderPage()\n window.webixLocale =\n Object.prototype.hasOwnProperty.call(locales, languageCode) &&\n Object.prototype.hasOwnProperty.call(\n webix.i18n.locales,\n locales[languageCode]\n )\n ? locales[languageCode]\n : false;\n\n // webix pro offers a feature that hides scroll bars by\n // default for browsers that include them due to the user's\n // UI. The experience becomes more like a touch interface\n // with the exception that scroll bars appear when user\n // hovers over a scrollable area\n /* if (!Webix.env.touch && Webix.env.scrollSize ) */\n webix.CustomScroll.init();\n\n const div = this.div();\n\n UI.attach(div.id);\n destroyPreloadUI();\n this.ui(UI);\n this.ui()\n .init(this.AB)\n .then(() => {\n performance.measure(\"initUI\");\n performance.measure(\"bootstrap\");\n });\n // this.ui().init() routine handles the remaining\n // bootup/display process.\n });\n }\n\n addPlugin(plugin) {\n this._plugins.push(plugin);\n }\n\n alert(options) {\n webix.alert(options);\n }\n\n div(el) {\n if (el) {\n this._div = el;\n return;\n }\n return this._div;\n }\n\n error(...params) {\n console.error(...params);\n let message = params[0];\n this.emit(message);\n }\n\n ui(UI) {\n if (UI) {\n this._ui = UI;\n return;\n }\n return this._ui;\n }\n}\n\nexport default new Bootstrap();\n","export default {\n init: async (BS) => {\n // BS {Bootstrap}\n // The initial Bootstrap object found in \"./Bootstrap.js\"\n try {\n BS.Config.settings(window.__AB_Settings);\n let configData = window.__AB_Config;\n delete configData.settings;\n BS.Config.config(configData);\n } catch (err) {\n BS.error(\"initConfig: GET /config:\", err);\n // HOTFIX: (12/15/2022) If the user visits /home directly /config is\n // the first request made to sails and if we're not authenticated but\n // using OKTA or CAS, we get a CORS error when trying to authenticate.\n // Send the user to / to get authenticated correctly.\n if (err.message == \"Failed to fetch\")\n window.location.replace(window.location.origin);\n }\n },\n};\n","/*\n * initDiv.js\n * find or create an initial
    for our Appbuilder portal\n */\nexport default {\n init: (BS) => {\n // BS {Bootstrap}\n // The initial Bootstrap object found in \"./Bootstrap.js\"\n\n return new Promise((resolve, reject) => {\n // find our initial
    tag\n var div = document.querySelector(\"div[appbuilder-portal]\");\n if (!div) {\n div = document.createElement(\"Div\");\n div.setAttribute(\"appbuilder-portal-autoenter\", \"true\");\n div.setAttribute(\"appbuilder-portal-fullscreen\", \"true\");\n document.getElementsByTagName(\"body\")[0].appendChild(div);\n }\n // let loading = document.createElement(\"Div\");\n // loading.style.justifyContent = \"center\";\n // loading.style.alignItems = \"center\";\n // loading.style.display = \"flex\";\n // loading.style.height = \"100vh\";\n // loading.style.width = \"100%\";\n // loading.style.position = \"absolute\";\n // loading.style.top = \"0\";\n // loading.style.left = \"0\";\n // // loading.style.animation = \"spinning 1s ease infinite\";\n //\n // loading.innerHTML = ``;\n // document.getElementsByTagName(\"body\")[0].appendChild(loading);\n // const css = window.document.styleSheets[0];\n // css.insertRule(\n // `@keyframes spinning {\n // 0% { transform: rotate(0deg); }\n // 100% { transform: rotate(360deg); }\n // }`,\n // css.cssRules.length\n // );\n // make sure there is a div.id set:\n if (!div.id) {\n div.id = \"AppBuilder\";\n }\n BS.div(div);\n BS.Config.settingsFromDiv(div); // set the autoEnter config\n resolve();\n });\n },\n};\n","export default {\n init: async (BS) => {\n // BS {Bootstrap}\n // The initial Bootstrap object found in \"./Bootstrap.js\"\n try {\n let configData = {\n user: window.__AB_Config_User,\n userReal: window.__AB_Config_User_Real,\n };\n BS.Config.configUser(configData);\n } catch (err) {\n BS.error(\"initConfig: GET /config:\", err);\n // HOTFIX: (12/15/2022) If the user visits /home directly /config is\n // the first request made to sails and if we're not authenticated but\n // using OKTA or CAS, we get a CORS error when trying to authenticate.\n // Send the user to / to get authenticated correctly.\n if (err.message == \"Failed to fetch\")\n window.location.replace(window.location.origin);\n }\n },\n};\n","import { EventEmitter } from \"events\";\n\nexport default class ClassUI extends EventEmitter {\n constructor(base, ids, AB = null) {\n super();\n\n this.ids = {};\n // {hash}\n // An internal reference of webix.ids that we use to reference webix\n // components.\n\n // We can be called in several ways:\n // 1) super(\"base_id\");\n // in this case we create a default this.ids.component = base_id;\n //\n // 2) super({ id1:\"id1\", id2:\"id2\", ... })\n // in this case we create a this.ids = base;\n // we look for a this.ids.base || or this.ids.component and use that\n // as our \"base\" reference.\n //\n // 3) super(base, ids);\n //\n if (base) {\n if (\"string\" == typeof base) {\n this.ids = {\n component: base,\n };\n } else {\n this.ids = base;\n base = this.ids.base ?? this.ids.component;\n }\n }\n\n // a shortcut way to enter the ids is to simply put the keys:\n // {\n // form:\"\",\n // form_button:\"\",\n // ...\n // }\n // so we need to make sure the actual values are set according to\n // `{base}_{key}` format.\n //\n if (ids) {\n Object.keys(ids).forEach((k) => {\n if (ids[k]) {\n return (this.ids[k] = ids[k]);\n }\n this.ids[k] = `${base}_${k}`;\n });\n }\n\n // verify this.ids are properly set:\n Object.keys(this.ids).forEach((k) => {\n this.ids[k] = this.ids[k] || `${base}_${k}`;\n });\n\n // and make sure there is a .component set:\n this.ids.component = this.ids.component || base;\n\n if (AB) {\n this.AB = AB;\n }\n }\n\n /**\n * @method CYPRESS_REF()\n * Attach a cypress \"data-cy\" attribute to the given element. This is used\n * for writing E2E tests and how we directly identify a webix widget we are\n * referencing for our tests.\n * @param {webix.object|webix.node|html.element} el\n * The element we are attempting to attach the data attribute to\n * There are a number of ways we might be sending this element\n * on a onAfterRender() callback on a Webix Object\n * by gathering the nodes of a Webix object directly\n * @param {string} id\n * [optional] the value of the data-cy attribute\n */\n static CYPRESS_REF(el, id) {\n if (!el) return;\n\n id = id || el.config?.id;\n\n // is this a webix object?\n if (el.getInputNode) {\n var node = el.getInputNode();\n if (node) {\n node.setAttribute(\"data-cy\", id);\n return;\n }\n }\n\n // this element has a webix $view\n if (el.$view) {\n el.$view.setAttribute(\"data-cy\", id);\n return;\n }\n\n // this is probably a straight up DOM element:\n el.setAttribute?.(\"data-cy\", id);\n }\n\n /**\n * attach()\n * cause this UI object to attach itself to a given DIV.ID\n * of an existing HTML object.\n * @param {string} id\n * the
    value of the HTML element to display this UI\n * inside.\n * @return {Webix View}\n * returns an instance of the Webix UI object generated by our\n * .ui() description.\n */\n attach(id) {\n var ui = this.ui();\n if (ui && id) {\n ui.container = id;\n }\n\n this.el = webix.ui(ui);\n return this.el;\n }\n\n changePage(pageId) {\n this.emit(\"changePage\", pageId);\n }\n\n hide() {\n if (this.ids?.component) {\n $$(this.ids.component).hide();\n }\n }\n\n label(key, ...params) {\n if (this.AB) {\n return this.AB.Multilingual.label(key, key, ...params);\n }\n console.error(\".labels() called before .AB was set!\");\n return key;\n }\n\n /**\n * ui()\n * return a Webix user interface definition for this UI component.\n * This should be just the json description, not an active instance.\n * @return {obj}\n */\n ui() {\n console.error(\n \"ClassUI.ui(): it is expected that sub classes of ClassUI will implement their own ui() method.\"\n );\n }\n\n show() {\n if (this.ids?.component) {\n $$(this.ids.component)?.show();\n }\n }\n\n get WARNING_ICON() {\n return ``;\n }\n\n get WARNING_ICON_DARK() {\n return this.WARNING_ICON.replace(\"pulseLight\", \"pulseDark\");\n }\n}\n","import ClassUI from \"./ClassUI\";\n\nclass ClassUIPage extends ClassUI {\n constructor(containerID, page, App, AB) {\n super();\n\n this.containerID = containerID;\n // {string}\n // the webix $$(containerID) reference to attach this UI to.\n // Typically the portal_work generates a series of container placeholders\n // and these ClassUIPage will attach themselves to them.\n\n this.page = page;\n // {ABViewPage}\n // The Root Page that this container is displaying.\n\n this.App = App;\n // {ABComponent.App}\n // The common UI Component App factory.\n\n this.AB = AB;\n // {ABFactory}\n // The common ABFactory being shared for all our ABxxx Objects.\n\n this.initialized = false;\n // {bool}\n // indicates if the User had chosen to display this page yet.\n // We prevent loading our data and building the page until the\n // User decides to show the page.\n\n this.pageStack = [];\n // {array}\n // Keep track of the {ABViewPage.id} that have been showPage()ed.\n // The last element in the stack should be the Actively Shown page.\n // If the stack is empty, then we are showing the RootPage.\n\n this.pageComponents = {};\n // {hash} { ABViewPage.id : ABViewPage.component() }\n // we keep track of all the ui.component() of our possible views to\n // prevent having to regenerate them and quickly access their values.\n\n this.changePageEventIds = {};\n // {hash} { ABViewPage.id : .on(\"changePage\") }\n // A hash of the on(\"changePage\") listeners for each page. Used to\n // prevent multiple listeners added to a Page\n }\n\n ui() {\n // NOTE: the .container === .id\n // so this REPLACES the container created by the portal_work\n var placeholder = {};\n if (this.page && this.page.isRoot()) {\n // some pages can take a while to initialize.\n // add a spinner to indicate it is busy\n placeholder = {\n type: \"clean\",\n css: { \"text-align\": \"center\" },\n template:\n '
    ',\n };\n }\n return {\n view: \"multiview\",\n // container: this.containerID,\n css: \"ab-main-container ab-generated-page\",\n borderless: true,\n id: this.containerID,\n animate: false,\n cells: [placeholder],\n on: {\n // onViewChange: (prevId, nextId) => {\n // this.resize();\n // },\n },\n };\n }\n\n init(AB, render = false, showPage = true) {\n if (AB) {\n this.AB = AB;\n }\n\n // don't redo all this if we already have!\n if (this.initialized) return Promise.resolve();\n\n var myUI = this.ui();\n webix.ui(myUI, $$(this.containerID));\n\n if (!render) {\n return Promise.resolve();\n }\n\n // .init() returns a Promise\n return new Promise((resolve /*, reject */) => {\n // 1) make sure all Application DataCollections have started\n // initialization.\n this.page.application.datacollectionsIncluded().forEach((dc) => {\n if (!dc) return;\n\n dc.init();\n });\n\n // 2) Render all our Pages\n this.renderPage(this.page);\n\n // 3) After we are rendered, we are technically initialized\n this.initialized = true;\n\n // 4) Make sure our Root Page is \"shown\"\n this.showPage();\n\n if (!showPage) {\n let parView = $$(this.containerID).getParentView();\n parView.showBatch(parView.getValue(), false);\n }\n\n resolve();\n });\n }\n\n /**\n * initEvents()\n * Setup the listeners for each page. There are 3 main events we are\n * concerned with:\n * \"changePage\" =>\n * generated by our Page / Sub Page / Sub view\n * indicates when a new page should be displayed.\n * \"ab.interface.update\" =>\n * generated by the server.\n * indicates that the Definition of our interface\n * has changed and we need to redisplay.\n * \"ab.datacollection.update\" = >\n * generated by the server.\n * indicates one of the DataCollections have been updated.\n * if it is one we are depending on, we need to redisplay\n *\n * @param {ABViewPage} page\n * The ABViewPage to establish listeners on.\n */\n initEvents(page) {\n if (page == null) return;\n\n // { pageId: eventId, ..., pageIdn: eventIdn }\n this.changePageEventIds = this.changePageEventIds || {};\n\n // prevent duplicate event registrations\n if (!this.changePageEventIds[page.id]) {\n this.changePageEventIds[page.id] = page.on(\"changePage\", (pageID) => {\n this.showPage(pageID);\n });\n }\n\n let needToReloadPage = () => {\n // clear the cache of events\n this.changePageEventIds = {};\n\n this.initialized = false;\n\n // begin the process of reloading the page\n this.init(this.AB, true, false);\n };\n\n if (!this.updatePageEventId && page.isRoot()) {\n /**\n * @event ab.interface.update\n * This event is triggered when the root page is updated\n *\n * @param data.rootPage {uuid} - id of the root page\n */\n this.updatePageEventId = this.AB.on(\n \"ab.interface.update\",\n function (data) {\n if (page.id == data.rootPageId) {\n needToReloadPage();\n }\n }\n );\n }\n\n if (!this.updateDatacollectionEventId && page.isRoot()) {\n /**\n * @event ab.datacollection.update\n * This event is triggered when the datacollection is updated\n * Make sure we only update the Display if it was a DC that was\n * included in this Page's Application.\n *\n * @param data.datacollectionId {uuid} - id of the data view\n */\n this.updateDatacollectionEventId = this.AB.on(\n \"ab.datacollection.update\",\n (data) => {\n let updatedDC = this.page.application.datacollectionsIncluded(\n (dc) => dc.id == data.datacollectionId\n )[0];\n if (updatedDC) {\n needToReloadPage();\n }\n }\n );\n }\n }\n\n /**\n * renderPage()\n * create the Webix UI for the given ABViewPage and all it's Sub Pages.\n * This routine creates the component.ui, and performs the component.init()\n * but does not perform the final component.onShow() ( that happens in the\n * showPage() method.)\n * @param {ABViewPage} page\n */\n renderPage(page) {\n if (window.webixLocale) {\n setTimeout(() => {\n webix.i18n.setLocale(window.webixLocale);\n }, 500);\n }\n var component = page.component(this.App);\n var ui = component.ui;\n\n // Keep the page component\n this.pageComponents[page.id] = component;\n\n var myContainer = $$(this.containerID);\n // {webix.ui}\n // Referencing our container. Since we seem to make numerous references\n // to this below, let's just pull it 1x.\n\n // James:\n // this is pulled in from our previous v1 code. Not sure if it is still\n // relevant.\n // TODO: review this and how this works in context of our Webix Only\n // Portal.\n // Also, notice how we are referencing the internal data of a Page object?\n // there should be an accessor method (like page.setting(\"pageWidth\"))\n // that returns the data we need.\n /*\n if (\n parseInt(page.settings.pageWidth) > 0 &&\n parseInt(page.settings.fixedPageWidth) == 1\n ) {\n var parentContainer = this.element.parent()[0];\n parentContainer.style.width = parseInt(page.settings.pageWidth) + \"px\";\n parentContainer.style.margin = \"0 auto\";\n parentContainer.classList.add(page.settings.pageBackground);\n }\n */\n\n var type = page.settings?.type ?? \"\";\n if (typeof page.type === \"function\") {\n // plugin method.\n type = page.type();\n }\n switch (type) {\n case \"popup\":\n var popupTemplate = {\n view: \"window\",\n id: page.id,\n modal: true,\n position: \"center\",\n resize: true,\n width: parseInt(page.settings.popupWidth) || 700,\n height: parseInt(page.settings.popupHeight) + 44 || 450,\n css: \"ab-main-container\",\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n view: \"label\",\n label: page.label,\n css: \"modal_title\",\n align: \"center\",\n },\n {\n view: \"button\",\n label: \"Close\",\n autowidth: true,\n align: \"center\",\n click: () => {\n this.showPage();\n // var popup = this.getTopParentView();\n // popup.hide();\n },\n on: {\n //Add data-cy attribute to the close button\n onAfterRender: () => {\n const button = $$(page.id).queryView(\"button\");\n const dataCy = `Popup Close Button ${page.name} ${page.id}`;\n button\n .getInputNode()\n .setAttribute(\"data-cy\", dataCy);\n },\n },\n },\n ],\n },\n body: {\n view: \"scrollview\",\n scroll: true,\n body: ui,\n },\n };\n\n var oldView = $$(page.id);\n if (oldView) {\n // if it is a Popup, destroy() it\n if (oldView.config.view == \"window\") {\n oldView.destructor();\n }\n // else remove the view from our multiview\n else if (myContainer) {\n myContainer.removeView(page.id);\n }\n }\n\n // Now create the New one (hidden)\n try {\n webix.ui(popupTemplate).hide();\n } catch (e) {\n console.error(\"Error creating Page:\", page);\n console.error(e);\n // debugger;\n }\n break;\n\n case \"page\":\n default:\n // Define page id to be batch id of webix.multiview\n ui.batch = page.id;\n\n // if this view already exists\n var oldPage = $$(page.id);\n if (oldPage) {\n // if the old view was a popup, but now we want it as\n // a page, we need to move it to our multiview\n if (oldPage.config.view == \"window\") {\n oldPage.destructor();\n\n myContainer.addView(ui);\n }\n // else we want to rebuild it.\n else {\n webix.ui(ui, oldPage);\n }\n }\n // else this is our first time so add it\n else if (myContainer) {\n myContainer.addView(ui);\n }\n\n break;\n }\n\n // handle events\n this.initEvents(page);\n\n // Render child pages\n (page.pages() || []).forEach((subpage) => {\n this.renderPage(subpage);\n });\n\n // Initial UI components\n component.init();\n }\n\n /**\n * show()\n * is called by the main portal_work when a menu item is selected and this\n * container should be displayed.\n */\n show() {\n var container = $$(this.containerID);\n if (container) {\n if (!this.initialized) {\n // this is our 1st time to show, so wait for our initial loading\n // container to display, before causing it to be transformed into\n // our Page.\n var eventID = container.attachEvent(\"onViewShow\", () => {\n // only 1x\n container.detachEvent(eventID);\n // give ourselves some additional space to make sure animations\n // are complete or operational before the .init() which can be\n // resource intensive.\n setTimeout(() => {\n this.init(this.AB, true);\n container.show();\n }, 50);\n });\n }\n\n container.show();\n }\n }\n\n /**\n * showPage()\n * A RootPage can have several SubPages that it wants to display during\n * it's normal operation. An embedded view component can trigger an\n * .emit(\"showPage\", pageID) that will get propagated up to our RootPage\n * and showPage(pageID) will be called.\n *\n * For example, an ABViewMenu object will have a button clicked and it will\n * signal this to show the desired Page.\n *\n * If a showPage() is called with no parameter, then we are being requested\n * to return to the previous page before the current one.\n * @param {string} pageID\n * The {ABViewPage.id} of the page to show.\n * @param {string} viewID\n * An additional ABViewxxx.id that can also be signaled to show.\n * ?? Usually on the Page we just showed, so you can specify a\n * page + view.\n */\n showPage(pageID, viewId) {\n var showPageID = null;\n // {string}\n // This is the actual pageID of the ABViewPage to display.\n\n // in any case, if the active page is not the requested page,\n // we hide it:\n var activeID = this.pageStack[this.pageStack.length - 1];\n if (activeID) {\n // if the actively displayed page is what is being asked for\n // we can just exit.\n if (activeID == pageID) {\n return; //\n }\n\n // otherwise we need to hide() any popups / pages\n var activeUI = $$(activeID);\n if (activeUI && activeUI.hide) activeUI.hide();\n }\n\n // if no pageID provided, then we are displaying a previous page:\n if (!pageID) {\n // pull the last View displayed & remove it.\n this.pageStack.pop();\n } else {\n // be sure not to add our Root Page to the stack\n if (this.page.id != pageID) {\n // add the new pageID to our stack:\n // REMEMBER: last item is what should be show()n\n this.pageStack.push(pageID);\n } else {\n // in this case: we have items in our .pageStack, but we are told\n // to return to our RootPage;\n // clear out our .pageStack and we will return to our root\n this.pageStack = [];\n }\n }\n\n // now get the ID of the page to show\n showPageID = this.pageStack[this.pageStack.length - 1];\n if (!showPageID) {\n // then we want to display the Root Page:\n showPageID = this.page.id;\n }\n\n if (!showPageID) {\n // if we get here and don't have a showPageID ... something didn't\n // go as planned:\n this.AB.error(\n new Error(`Unable to resolve showPage() with pageID[${pageID}]`)\n );\n } else {\n // make sure a popup is shown\n if ($$(showPageID)) $$(showPageID).show();\n\n // if our MultiView has this batch then show batch\n var batchExist = false;\n var childViews = $$(this.containerID).getChildViews();\n batchExist = childViews.filter(function (v) {\n return v.config.batch == showPageID;\n })[0];\n if (batchExist) $$(this.containerID).showBatch(showPageID);\n\n // now make sure the actual component's .onShow() is called\n // But perform a Timeout() so any current webix animations\n // complete beforehand:\n setTimeout(() => {\n if (\n this.pageComponents[showPageID] &&\n this.pageComponents[showPageID].onShow\n ) {\n // for (const element of document\n // .getElementById(self.containerDomID)\n // .getElementsByClassName(\"ab-loading\")) {\n // element.style.display = \"none\";\n // }\n this.pageComponents[showPageID].onShow();\n if (viewId) {\n $$(viewId)?.show();\n }\n }\n }, 60);\n }\n }\n\n /*\n removePage(pageId) {\n var pageCom = this.pageComponents[pageId];\n var pageElemId = pageCom.ui.id;\n\n // swtich the page before it will be removed\n if (this.activePageId == pageId) {\n this.showPage(this.rootPage.id);\n }\n\n // remove from .multiview\n $$(this.containerDomID).removeView(pageElemId);\n\n // destroy view's modal\n if ($$(pageElemId)) $$(pageElemId).destructor();\n }\n */\n}\n\nexport default ClassUIPage;\n","import ClassUI from \"./ClassUI.js\";\n\nimport Switcheroo from \"./portal_work_user_switcheroo.js\";\n\nclass ErrorNoDefsUI extends ClassUI {\n ui() {\n const L = (...params) => {\n return this.label(...params);\n };\n return {\n rows: [\n {\n id: \"switched\",\n height: 23,\n css: \"portal_work_switcheroo_user_switched\",\n hidden: true,\n cols: [\n {\n width: 5,\n },\n {\n id: \"switched_label\",\n view: \"label\",\n align: \"center\",\n },\n {\n view: \"button\",\n value: '
    ',\n align: \"center\",\n width: 30,\n css: \"webix_transparent\",\n on: {\n onItemClick: () => {\n Switcheroo.init(this.AB, true);\n Switcheroo.switcherooClear();\n $$(\"switched\").hide();\n },\n },\n },\n {\n width: 5,\n },\n ],\n },\n {\n id: \"error_no_defs\",\n css: \"portalLogin\",\n cols: [\n {},\n {\n rows: [\n {},\n {\n width: 360,\n height: 200,\n rows: [\n {\n css: \"portalLoginForm\",\n padding: 30,\n rows: [\n {\n id: \"error_no_defs_text\",\n template: `
    \n ${L(\n \"You don't have any Roles in the system defined. Talk to an Administrator.\"\n )}\n
    `,\n borderless: true,\n },\n ],\n },\n ],\n },\n {},\n ],\n },\n {},\n ],\n },\n ],\n };\n }\n\n async init(AB) {\n this.AB = AB;\n }\n\n switcherooUser(user) {\n const L = (...params) => {\n return this.label(...params);\n };\n $$(\"switched\").show();\n $$(\"switched_label\").setValue(\n L('*You are viewing this site as \"{0}\"*', [this.AB.Account.username()])\n );\n }\n\n preloadMessage(text) {\n $$(\"error_no_defs_text\").setValues({ text });\n }\n destroy() {\n $$(\"error_no_defs\").destructor();\n }\n}\n\nexport default new ErrorNoDefsUI();\n","import ClassUI from \"./ClassUI.js\";\nimport PortalLoading from \"./portal_loading.js\";\nimport PortalAuth from \"./portal_auth.js\";\nimport PortalWork from \"./portal_work.js\";\n\nclass Portal extends ClassUI {\n constructor() {\n super();\n\n this.ShownPortal = null;\n // {UI.Portal} ShownPortal\n // Keep track of which Portal is currently shown.\n\n this.portalWorkReady = false;\n // {bool}\n // has the PortalWork UI emitted it's \"ready\" event?\n //\n }\n\n ui() {\n return {\n view: \"popup\",\n fullscreen: true,\n modal: true,\n body: {\n id: \"portal\",\n view: \"multiview\",\n keepViews: true,\n animate: false,\n rows: [PortalLoading.ui(), PortalAuth.ui(), PortalWork.ui()],\n },\n };\n }\n\n init(AB) {\n this.AB = AB;\n\n this.AB.on(\"portal.show\", (key) => {\n this.showPortal(key);\n });\n\n var allInits = [];\n // {array} allInits\n // all the .init() {Promise}s that are being generated during our\n // init().\n\n allInits.push(PortalAuth.init(AB));\n\n // if we are authenticated, then we make sure our loading & work portals\n // are prepared.\n if (this.AB.Account.isAuthenticated) {\n // Setup our listeners BEFORE the .init()s\n this.AB.Account.on(\"logout\", (data) => {\n if (data?.redirect) {\n // if we pass a redirect link follow it\n window.document.location.href = data?.redirect;\n } else {\n // on logout show Auth Portal\n this.showAuthPortal();\n }\n });\n\n this.AB.Network.on(\"reauth\", () => {\n // on logout show Auth Portal\n this.showAuthPortal();\n });\n\n PortalWork.on(\"ready\", () => {\n this.portalWorkReady = true;\n this.showDefaultView();\n });\n\n // Now trigger our other .init()s\n allInits.push(PortalLoading.init(AB));\n allInits.push(PortalWork.init(AB));\n }\n\n return Promise.all(allInits).then(() => {\n this.showDefaultView();\n });\n }\n\n showAuthPortal(defaultView) {\n if (this.ShownPortal != PortalAuth) {\n PortalAuth.show(defaultView);\n this.ShownPortal = PortalAuth;\n }\n }\n\n showWorkPortal() {\n if (this.portalWorkReady) {\n if (this.ShownPortal != PortalWork) {\n // when loading portal is done move to Work Portal\n PortalWork.show();\n this.ShownPortal = PortalWork;\n }\n } else {\n if (!this.ShownPortal) {\n // if we haven't already shown a portal ... show the loading\n PortalLoading.show();\n }\n }\n }\n\n showDefaultView() {\n // At this point, all inits() are complete\n\n // if authenticated then show our default view:\n if (this.AB.Account.isAuthenticated) {\n // do we have a specified defaultView?\n let defaultView = this.AB.Config.setting(\"view\");\n if (defaultView) {\n // defaultView should be in form:\n // \"auth_login_form\",\n // \"auth_login_passwordReset\",\n // \"work\"\n var parts = defaultView.split(\"_\");\n this.showPortal(parts[0], defaultView);\n } else {\n // then default to our work view:\n if (this.portalWorkReady) {\n this.showWorkPortal();\n } else {\n if (!this.ShownPortal) {\n // if we haven't already shown a portal ... show the loading\n PortalLoading.show();\n }\n }\n }\n } else {\n this.showAuthPortal();\n }\n }\n\n showPortal(key, defaultView) {\n switch (key) {\n case \"auth\":\n this.showAuthPortal(defaultView);\n break;\n\n case \"work\":\n this.showWorkPortal();\n break;\n }\n }\n}\n\nexport default new Portal();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalAccessLevelManager extends ClassUI {\n constructor() {\n super();\n this.accessLevels = [\n {\n id: \"0\",\n value: \"No Access\",\n },\n {\n id: \"1\",\n value: \"Read Only\",\n },\n {\n id: \"2\",\n value: \"Full Access\",\n },\n ];\n }\n\n ui() {\n const accessLevelManagerBody = {\n view: \"scrollview\",\n css: \"lightgray ab_amp\",\n body: {\n rows: [\n {\n view: \"accordion\",\n id: \"amp_accordion\",\n roles: [],\n hidden: true,\n collapsed: true,\n css: \"webix_dark\",\n rows: [],\n },\n {\n id: \"amp_accordion_noSelection\",\n rows: [\n {},\n {\n view: \"label\",\n align: \"center\",\n height: 200,\n label: \"
    \",\n },\n {\n view: \"label\",\n align: \"center\",\n label: \"Add a role to control access.\",\n },\n {\n cols: [\n {},\n {\n view: \"button\",\n label: \"Add Role\",\n type: \"form\",\n css: \"webix_primary\",\n autowidth: true,\n click: () => {\n webix.ui(newRolePopup).show();\n\n const roles = this.roles.filter((role) => {\n return (\n $$(\"amp_accordion\").config.roles.indexOf(\n role.id\n ) == -1\n );\n });\n\n $$(\"role_popup_options\").define(\n \"options\",\n roles\n );\n $$(\"role_popup_options\").refresh();\n },\n },\n {},\n ],\n },\n {},\n ],\n },\n ],\n },\n };\n\n const newRolePopup = {\n view: \"popup\",\n id: \"role_popup\",\n position: \"center\",\n height: 250,\n width: 350,\n modal: true,\n body: {\n rows: [\n {\n view: \"toolbar\",\n id: \"myToolbarABLiveTool\",\n css: \"webix_dark\",\n cols: [\n {\n view: \"label\",\n label: \"Add Role\",\n align: \"center\",\n },\n ],\n },\n {\n view: \"form\",\n elements: [\n /* We are not managing users yet so take this out\n {\n view: \"text\",\n label: \"Create new\",\n labelWidth: 90\n },\n {\n view: \"label\",\n label: \"- or -\",\n align: \"center\"\n },*/\n {\n view: \"combo\",\n label: \"\",\n id: \"role_popup_options\",\n placeholder: \"Choose role\",\n options: [],\n },\n {\n cols: [\n {\n view: \"button\",\n value: \"Cancel\",\n click: () => {\n $$(\"role_popup\").hide();\n },\n },\n {\n view: \"button\",\n value: \"Add\",\n id: \"role_popup_options_add\",\n css: \"webix_primary\",\n click: () => {\n const role =\n $$(\"role_popup_options\").getValue();\n if ($$(`amp_accordionitem_${role}`)) {\n $$(`amp_accordionitem_${role}`).show();\n $$(\"amp_accordion\").config.roles.push(role);\n } else {\n this.buildAccessAccordion(role);\n }\n $$(\"role_popup\").hide();\n },\n },\n ],\n },\n ],\n },\n ],\n },\n };\n\n return {\n view: \"window\",\n css: \"ampWindow\",\n id: \"access_manager\",\n position: function (state) {\n state.left = state.maxWidth - 350; // fixed values\n state.top = 0;\n state.width = 350; // relative values\n state.height = state.maxHeight;\n },\n on: {\n onShow: () => {\n // collapse all the accordion items but the top one\n var index = 0;\n $$(\"amp_accordion\")\n .getChildViews()\n .forEach((a) => {\n if (index == 0) {\n $$(a).expand();\n } else {\n $$(a).collapse();\n }\n index++;\n $$(\"amp_accordion\").show();\n $$(\"amp_accordion_noSelection\").hide();\n });\n },\n },\n //modal: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n width: 15,\n },\n {\n view: \"label\",\n label: \"Access Manager\",\n autowidth: true,\n },\n {},\n {\n view: \"button\",\n label: \"Add Role\",\n width: 100,\n css: \"webix_primary\",\n click: () => {\n webix.ui(newRolePopup).show();\n\n var roles = this.roles.filter((role) => {\n return (\n $$(\"amp_accordion\").config.roles.indexOf(role.id) ==\n -1\n );\n });\n\n $$(\"role_popup_options\").define(\"options\", roles);\n $$(\"role_popup_options\").refresh();\n },\n },\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n this.hide();\n },\n },\n ],\n },\n body: accessLevelManagerBody,\n };\n }\n\n init(portal) {\n this.AB = portal.AB;\n this.portal = portal;\n this.appId = portal.AppState.lastSelectedApp;\n\n const languageCode = this.AB.Config.userConfig().languageCode;\n this.roles = this.AB.Config.metaConfig().roles.map((role) => {\n const translation = role.translations.filter(\n (t) => t.code == languageCode\n );\n const name = translation.length == 1 ? translation[0].name : role.name;\n return { id: role.id, value: name };\n });\n\n webix.ui(this.ui());\n\n // buld the tree views for already defined role access levels\n const application = this.AB.applicationByID(this.appId);\n if (application.isAccessManaged) {\n // Build the access level tree for Roles\n const existingRoles = [];\n application.pages().forEach((page) => {\n Object.keys(page.accessLevels).forEach((role) => {\n if (existingRoles.indexOf(role) == -1) {\n existingRoles.push(role);\n }\n });\n });\n existingRoles.forEach((role) => {\n this.buildAccessAccordion(role);\n });\n }\n }\n\n show() {\n $$(\"access_manager\").show();\n }\n\n hide() {\n $$(\"access_manager\").hide();\n }\n\n showPage(viewId, pageId, parent) {\n parent.application = {};\n parent.application.id = this.appId;\n this.portal.showPage(parent);\n const pageUI = this.portal.pageContainers[parent.id];\n pageUI.showPage(pageId, viewId);\n }\n\n /*\n * helper to get the current apps views\n */\n views(f) {\n return this.AB.applicationByID(this.appId).views(f);\n }\n\n buildAccessAccordion(role) {\n const L = this.AB.Label();\n const application = this.AB.applicationByID(this.appId);\n const isRoleAccessManager =\n parseInt(application.accessManagers.useRole) == 1 &&\n application.accessManagers.role.indexOf(role) > -1;\n const manageUsers = {\n rows: [\n {\n height: 10,\n },\n {\n cols: [\n {\n width: 10,\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-trash\",\n css: \"webix_danger_inverse\",\n label: \"Remove\",\n click: async () => {\n const confirmation = await webix.confirm(\n \"Remove role from app?\"\n );\n if (confirmation) {\n const tree = $$(`linetree_${role}`);\n const mainPages = this.AB.applicationByID(\n this.appId\n ).pages();\n await mainPages.forEach(async (page) => {\n const branch = tree.getItem(page.id);\n branch.access = \"0\";\n await page.updateAccessLevels(\n tree.config.role,\n \"0\"\n );\n tree.updateItem(page.id, branch);\n });\n\n $$(`amp_accordionitem_${role}`).hide();\n const itemToRemove =\n $$(\"amp_accordion\").config.roles.indexOf(role);\n if (itemToRemove > -1) {\n $$(\"amp_accordion\").config.roles.splice(\n itemToRemove,\n 1\n );\n }\n }\n },\n },\n {\n width: 10,\n },\n ],\n },\n {\n height: 10,\n },\n ],\n };\n\n $$(\"amp_accordion\").config.roles.push(role);\n\n const toggleParent = (element) => {\n if (!element.parent) return false;\n var parentElem = element.parent;\n if (!parentElem.parent) return false;\n parentElem.parent.emit(\"changeTab\", parentElem.id);\n toggleParent(parentElem.parent);\n };\n\n const getParent = (id, component) => {\n let item = $$(component).getItem(id);\n if (item.$parent == 0) return item;\n else return getParent(item.$parent, component);\n };\n\n const tree = {\n id: `linetree_${role}`,\n view: \"edittree\",\n type: \"lineTree\",\n editable: true,\n role: role,\n editor: \"combo\",\n editValue: \"access\",\n threeState: true,\n template: (obj, common) => {\n const treeOptions = $$(`linetree_${role}`).config.options;\n const option = treeOptions.find((o) => o.id === obj.access);\n let color, icon;\n switch (option.id) {\n case \"1\":\n color = \"#FFAB00\";\n icon = \"eye\";\n break;\n case \"2\":\n color = \"#00C853\";\n icon = \"pencil\";\n break;\n default:\n // Case \"0\"\n color = \"#ff4938\";\n icon = \"lock\";\n }\n\n return `\n \n \n \n \n ${common.icon(obj, common)}\n ${obj.label}\n \n `;\n },\n options: this.accessLevels,\n data: this.getAccessLevelTree(role),\n onClick: {\n externalLink: (event, branch, target) => {\n const item = $$(`linetree_${role}`).getItem(branch);\n const parent = getParent(branch, `linetree_${role}`);\n if (item.type == \"tab\") {\n this.showPage(branch, item.pageId, parent);\n\n const tabView = this.views((v) => v.id == item.id)[0];\n if (!tabView) return false;\n\n const tab = tabView.parent;\n if (!tab) return false;\n\n toggleParent(tab);\n if (!$$(tabView.id) || !$$(tabView.id).isVisible()) {\n const showIt = setInterval(() => {\n if ($$(tabView.id) && $$(tabView.id).isVisible()) {\n clearInterval(showIt);\n }\n tab.emit(\"changeTab\", tabView.id);\n }, 200);\n }\n }\n // switch page\n else {\n this.showPage(branch, item.id, parent);\n }\n\n return false;\n },\n },\n on: {\n onAfterEditStop: async (state, editor, ignoreUpdate) => {\n if (state.old == state.value) return false;\n const tree = $$(`linetree_${role}`);\n const view = this.views((v) => {\n return v.id == editor.id;\n })[0];\n await view.updateAccessLevels(tree.config.role, state.value);\n console.log(\n `Role: ${tree.config.role} set to Access Level: ${state.value} on view: ${view.id}`\n );\n },\n onDataUpdate: async (id, data, old) => {\n const tree = $$(`linetree_${role}`);\n if (data.access == \"0\") {\n // NOTE: Need to update \"No Access\" option here because It does not trigger `onAfterEditStop` event\n const view = this.views((v) => v.id == id)[0];\n await view.updateAccessLevels(tree.config.role, data.access);\n\n tree.blockEvent();\n await tree.data.eachSubItem(id, async (child) => {\n const childData = tree.getItem(child.id);\n if (childData.access != data.access) {\n childData.access = data.access;\n const view = this.views((v) => {\n return v.id == child.id;\n })[0];\n await view.updateAccessLevels(\n tree.config.role,\n data.access\n );\n console.log(\n `Role: ${tree.config.role} set to Access Level: ${data.access} on view: ${view.id}`\n );\n tree.updateItem(child.id, childData);\n }\n });\n tree.unblockEvent();\n } else {\n const parentBranch = tree.getParentId(id);\n const parentData = tree.getItem(parentBranch);\n if (parentData) {\n if (parentData.access == \"0\") {\n parentData.access = \"1\";\n const view = this.views((v) => {\n return v.id == parentBranch;\n })[0];\n await view.updateAccessLevels(\n tree.config.role,\n parentData.access\n );\n\n console.log(\n `Role: ${tree.config.role} set to Access Level: ${parentData.access} on view: ${view.id}`\n );\n tree.updateItem(parentBranch, parentData);\n }\n }\n }\n },\n },\n };\n\n const newAccordionItem = {\n view: \"accordionitem\",\n id: `amp_accordionitem_${role}`,\n header: () => {\n return `${\n this.roles?.find((r) => {\n return r.id === role;\n })?.value ?? role\n } ${\n isRoleAccessManager\n ? `${this.WARNING_ICON}`\n : \"\"\n }`;\n },\n collapsed: true,\n body: {\n type: \"clean\",\n rows: [tree, manageUsers],\n },\n };\n\n $$(\"amp_accordion\").addView(newAccordionItem, -1);\n $$(\"amp_accordion\").show();\n $$(\"amp_accordion_noSelection\").hide();\n\n if (isRoleAccessManager)\n this.AB.Webix.TooltipControl.addTooltip(\n $$(`amp_accordionitem_${role}`).$view\n );\n\n $$(`linetree_${role}`).openAll();\n }\n\n getAccessLevelTree(role) {\n const tree = new webix.TreeCollection();\n\n const addPage = (page, index, parentId, type) => {\n // add to tree collection\n const accessLevel = page.accessLevels[role] ?? \"0\";\n const branch = {\n id: page.id,\n access: accessLevel,\n label: page.label,\n pageId: parentId,\n type: type,\n };\n tree.add(branch, index, parentId);\n\n // stop at detail views\n if (page.defaults.key == \"detail\") {\n return;\n }\n\n const subPages = page.pages ? page.pages() : [];\n subPages.forEach((childPage, childIndex) => {\n addPage(childPage, childIndex, page.id, \"page\");\n });\n\n // add tabs\n page\n .views((view) => view.defaults.key == \"tab\")\n .forEach((tab, tabIndex) => {\n // tab views\n tab.views().forEach((tabView, tabViewIndex) => {\n // tab items will be below sub-page items\n const tIndex = subPages.length + tabIndex + tabViewIndex;\n addPage(tabView, tIndex, page.id, \"tab\");\n });\n });\n };\n this.AB.applicationByID(this.appId)\n .pages()\n .forEach((p, index) => {\n addPage(p, index, null, \"page\");\n });\n\n return tree;\n }\n}\n\nexport default new PortalAccessLevelManager();\n","import ClassUI from \"./ClassUI.js\";\n\n// sub pages:\nimport PortalAuthLogin from \"./portal_auth_login.js\";\n\nclass PortalAuth extends ClassUI {\n constructor() {\n super();\n\n this.ActivePortal = null;\n // {PortalAuthxxx} ActivePortal\n // the UI Portal to use for Authenticating our User for this Tenant.\n }\n\n ui() {\n var self = this;\n\n return {\n id: \"portal_auth\",\n view: \"multiview\",\n animate: false,\n cells: [PortalAuthLogin.ui()],\n };\n }\n\n init(AB) {\n this.AB = AB;\n\n // decide which Auth Portal to display:\n var authType = this.AB.Tenant.setting(\"authType\") || \"login\";\n switch (authType) {\n case \"login\":\n this.ActivePortal = PortalAuthLogin;\n break;\n\n case \"passwordless\":\n break;\n\n case \"facebook\":\n break;\n\n case \"google\":\n break;\n }\n\n return this.ActivePortal?.init(AB).then(() => {\n this.ActivePortal?.show();\n });\n }\n\n show(defaultView) {\n // We cannot properly store the session id if users navigate directly to /home\n // so when they navigate to /home and it was not a redirect we send them back to /\n if (\n window?.location?.pathname == \"/home\" &&\n !window?.performance?.navigation?.redirectCount\n )\n window.location.replace(window.location.origin);\n\n $$(\"portal_auth\").show();\n this.ActivePortal.show(defaultView);\n }\n}\n\nexport default new PortalAuth();\n","import ClassUI from \"./ClassUI.js\";\nimport PortalAuthLoginForm from \"./portal_auth_login_form.js\";\nimport PortalAuthLoginResetPassword from \"./portal_auth_login_resetPassword.js\";\nimport PortalAuthLoginResetRequest from \"./portal_auth_login_resetRequest.js\";\n\nclass PortalAuthLogin extends ClassUI {\n constructor() {\n super();\n }\n\n ui() {\n var self = this;\n\n return {\n id: \"portal_auth_login\",\n view: \"multiview\",\n animate: false,\n rows: [\n PortalAuthLoginForm.ui(),\n PortalAuthLoginResetPassword.ui(),\n PortalAuthLoginResetRequest.ui(),\n ],\n };\n }\n\n async init(AB) {\n this.AB = AB;\n\n var allInits = [];\n allInits.push(PortalAuthLoginForm.init(AB));\n PortalAuthLoginForm.on(\"request.reset\", () => {\n PortalAuthLoginResetRequest.show();\n });\n\n allInits.push(PortalAuthLoginResetRequest.init(AB));\n PortalAuthLoginResetRequest.on(\"login\", () => {\n PortalAuthLoginForm.show();\n });\n\n allInits.push(PortalAuthLoginResetPassword.init(AB));\n PortalAuthLoginResetPassword.on(\"updated\", () => {\n console.log(\">>>> Password Changed ... NOW WHAT? <<<<<<\");\n });\n\n await Promise.all(allInits);\n }\n\n show(defaultView) {\n // defaultView should be:\n // \"auth_login_form\",\n // \"auth_login_passwordReset\"\n\n if (defaultView) {\n var view = defaultView.split(\"_\").pop();\n switch (view) {\n case \"resetPassword\":\n PortalAuthLoginResetPassword.show();\n break;\n\n default:\n case \"form\":\n PortalAuthLoginForm.show();\n break;\n }\n return;\n }\n\n // Default to the LoginForm\n PortalAuthLoginForm.show();\n }\n}\n\nexport default new PortalAuthLogin();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalAuthLoginForm extends ClassUI {\n constructor() {\n super();\n }\n\n ui() {\n var self = this;\n\n if (!this.AB) {\n // we need to init() before being able to translate our UI:\n return {\n id: \"portal_auth_login_container\",\n };\n }\n\n var L = this.AB.Label();\n\n return {\n id: \"portal_auth_login_container\",\n css: \"portalLogin\",\n cols: [\n {},\n {\n rows: [\n {},\n {\n width: 360,\n rows: [\n {\n css: \"portalLoginForm\",\n padding: 30,\n rows: [\n {\n template:\n \"
    \",\n borderless: true,\n height: 190,\n type: \"clean\",\n },\n {\n id: \"portal_auth_login_form\",\n view: \"form\",\n type: \"clean\",\n css: { background: \"transparent !important\" },\n borderless: true,\n elementsConfig: {\n bottomPadding: 20,\n height: 52,\n },\n elements: [\n {\n view: \"text\",\n placeholder: L(\"Email\"),\n name: \"email\",\n id: \"email\",\n attributes: {\n \"data-cy\":\n \"portal_auth_login_form_email\",\n },\n // required: true,\n validate: webix.rules.isEmail,\n invalidMessage: L(\n \"Please enter a valid email.\"\n ),\n validateEvent: \"blur\",\n },\n {\n view: \"text\",\n type: \"password\",\n placeholder: L(\"Password\"),\n name: \"password\",\n attributes: {\n \"data-cy\":\n \"portal_auth_login_form_password\",\n },\n // required: true,\n validate: webix.rules.isNotEmpty,\n invalidMessage: L(\n \"Please enter your password.\"\n ),\n validateEvent: \"blur\",\n },\n {\n margin: 10,\n paddingX: 2,\n borderless: true,\n cols: [\n {},\n {\n view: \"button\",\n label: L(\"Login\"),\n type: \"form\",\n id: \"portal_auth_login_form_submit\",\n css: \"webix_primary\",\n width: 150,\n hotkey: \"enter\",\n click() {\n var form = $$(\n \"portal_auth_login_form\"\n );\n if (form.validate()) {\n $$(\n \"portal_auth_login_form_submit\"\n ).hide();\n $$(\n \"portal_auth_login_form_submit_wait\"\n ).show();\n\n var values =\n form.getValues();\n self.error(); // hids the error message\n\n // this.AB.Network.post()\n // can either be a Relay or Rest operation.\n // we should get the response from the\n // published JobRequest initialized in\n // the .init() routine.\n self.AB.Network.post(\n {\n url: \"/auth/login\",\n data: values,\n },\n {\n key: \"portal_auth_login\" /*, context:{} */,\n }\n ).catch((err) => {\n $$(\n \"portal_auth_login_form_submit\"\n ).show();\n $$(\n \"portal_auth_login_form_submit_wait\"\n ).hide();\n console.log(err);\n });\n }\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {\n view: \"button\",\n label: \"\",\n type: \"form\",\n id: \"portal_auth_login_form_submit_wait\",\n css: \"webix_primary\",\n width: 150,\n hidden: true,\n },\n {},\n ],\n },\n {\n margin: 10,\n paddingX: 2,\n borderless: true,\n cols: [\n {},\n {\n view: \"button\",\n label: L(\"Forgot password?\"),\n id: \"portal_auth_login_forgot\",\n css: \"webix_transparent\",\n click: () => {\n this.emit(\"request.reset\");\n // $$(\"portal_auth_login\").hide();\n // $$(\"password_reset_email\").show();\n },\n width: 150,\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {},\n ],\n },\n {\n id: \"portal_auth_login_form_errormsg\",\n view: \"template\",\n css: \"webix_control\",\n height: 32,\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n ],\n },\n ],\n },\n {},\n {\n cols: [\n { width: 20 },\n {\n id: \"auth_privacy_policy\",\n view: \"template\",\n template:\n '#pretext# #label#',\n css: \"policyLink noBackground\",\n height: 30,\n hidden: true,\n },\n { width: 20 },\n ],\n },\n ],\n },\n {},\n ],\n },\n {},\n ],\n };\n }\n\n error(message) {\n var $errMsg = $$(\"portal_auth_login_form_errormsg\");\n if (message) {\n $errMsg.setHTML(\n `
    ${message}
    `\n );\n $errMsg.show();\n } else {\n $errMsg.hide();\n }\n }\n\n /** @param {import('../AppBuilder/ABFactory.js').default} AB */\n init(AB) {\n this.AB = AB;\n\n // now replace our initial placeholder with our viewable form\n webix.ui(this.ui(), $$(\"portal_auth_login_container\"));\n\n this.error(); // hides the default error message.\n\n this.AB.Network.on(\"portal_auth_login\", (context, err, response) => {\n // Listen for our login responses:\n // console.log(\"Network.on():\", context, err, response);\n\n if (err) {\n // any http 400-500 response should show up here:\n if (err.code) {\n switch (err.code) {\n case \"EINVALIDLOGIN\":\n this.error(err.message);\n break;\n\n case \"EFAILEDATTEMPTS\":\n this.error(err.message);\n $$(\"portal_auth_login_form_submit\").hide();\n break;\n\n default:\n this.AB.error(err);\n break;\n }\n }\n return;\n }\n\n if (\n response.user ||\n (response.status == \"success\" && response.data.user)\n ) {\n // reload the page to gather all the config info:\n window.location.reload(true);\n\n // Login was successful -> rerun BootStrap.init() to load the\n // config, definitions, plugins, etc for this user\n // Bootstrap.init(this.AB).catch((err) => {\n // Bootstrap.alert({\n // type: \"alert-error\",\n // title: \"Error initializing Portal:\",\n // text: err.toString(),\n // });\n // Bootstrap.error(err);\n // });\n } else {\n if (response.status == \"error\") {\n console.log(\"what to do with this error:\");\n console.error(response);\n }\n }\n });\n const { privacyPolicy } = this.AB.Config.siteConfig();\n if (privacyPolicy) {\n const L = this.AB.Label();\n $$(\"auth_privacy_policy\").setValues({\n label: L(\"Privacy Policy\"),\n pretext: L(\"By signing in you agree to our\"),\n link: privacyPolicy,\n });\n $$(\"auth_privacy_policy\").show();\n }\n\n return Promise.resolve();\n }\n\n show() {\n $$(\"portal_auth_login_container\").show();\n }\n}\n\nexport default new PortalAuthLoginForm();\n","import ClassUI from \"./ClassUI.js\";\n\nvar L = null;\n\nclass PortalAuthLoginResetPassword extends ClassUI {\n constructor() {\n super();\n }\n\n ui() {\n var self = this;\n\n if (!this.AB) {\n // we need to init() before being able to translate our UI:\n return {\n id: \"portal_auth_login_reset_password\",\n };\n }\n\n return {\n id: \"portal_auth_login_reset_password\",\n css: \"portalLogin\",\n cols: [\n {},\n {\n rows: [\n {},\n {\n width: 360,\n rows: [\n {\n id: \"portal_auth_login_reset_password_col\",\n css: \"portalLoginForm\",\n padding: 30,\n rows: [\n {\n template:\n \"
    \",\n borderless: true,\n height: 190,\n type: \"clean\",\n },\n {\n id: \"portal_auth_login_reset_password_form\",\n view: \"form\",\n type: \"clean\",\n css: { background: \"transparent !important\" },\n borderless: true,\n elementsConfig: {\n height: 52,\n },\n elements: [\n {\n id: \"new-password-email\",\n template: ` ${this.AB.Account.email()} `,\n css: {\n background: \"transparent !important\",\n border: \"none\",\n \"font-size\": \"16px\",\n color: \"black\",\n \"text-align\": \"center\",\n },\n },\n {\n id: \"password-new\",\n view: \"text\",\n type: \"password\",\n placeholder: L(\"Enter a new Password\"),\n name: L(\"Enter a new Password\"),\n validate: (v) => {\n return v.length >= 8;\n },\n invalidMessage: L(\n \"Needs to be at least 8 characters\"\n ),\n validateEvent: \"blur\",\n bottomPadding: 20,\n attributes: {\n \"data-cy\":\n \"portal_reset_password_new\",\n },\n },\n {\n id: \"password-confirm\",\n view: \"text\",\n type: \"password\",\n placeholder: L(\"Re-enter Password\"),\n name: \"email\",\n validate: (v) => {\n return (\n v === $$(\"password-new\").getValue()\n );\n },\n invalidMessage: L(\n \"Passwords do not match\"\n ),\n validateEvent: \"blur\",\n bottomPadding: 20,\n attributes: {\n \"data-cy\":\n \"portal_reset_password_confirm\",\n },\n },\n {\n margin: 10,\n paddingX: 2,\n borderless: true,\n cols: [\n {},\n {\n view: \"button\",\n label: L(\"Save\"),\n type: \"form\",\n id: \"portal_reset_password_submit\",\n css: \"webix_primary\",\n width: 150,\n hotkey: \"enter\",\n click: () => {\n if (\n $$(\n \"portal_auth_login_reset_password_form\"\n ).validate()\n ) {\n let password =\n $$(\n \"password-new\"\n ).getValue();\n this.AB.Network.post(\n {\n url: \"/auth/password/reset\",\n data: {\n password,\n },\n },\n {\n key: \"portal_auth_password_reset\",\n context: {},\n }\n ).catch((err) => {\n console.log(err);\n });\n }\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {},\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n {},\n ],\n },\n {},\n ],\n };\n }\n\n async init(AB) {\n this.AB = AB;\n\n L = (...params) => {\n return this.AB.Multilingual.label(...params);\n };\n\n // now replace our initial placeholder with our viewable form\n webix.ui(this.ui(), $$(\"portal_auth_login_reset_password\"));\n\n this.AB.Network.on(\n \"portal_auth_password_reset\",\n (context, err, response) => {\n // Listen for our responses:\n // Show a popup for confirmation that an email was sent.\n // context.email : {string} entered email address.\n\n this.AB.emit(\"portal.show\", \"work\"); // switch to the Work Portal.\n }\n );\n }\n\n show() {\n $$(\"portal_auth_login_reset_password\").show();\n }\n}\n\nexport default new PortalAuthLoginResetPassword();\n","import ClassUI from \"./ClassUI.js\";\n\nvar L = null;\n\nclass PortalAuthLoginResetRequest extends ClassUI {\n constructor() {\n super();\n }\n\n ui() {\n var self = this;\n\n if (!this.AB) {\n // we need to init() before being able to translate our UI:\n return {\n id: \"portal_auth_login_reset_request\",\n };\n }\n\n return {\n id: \"portal_auth_login_reset_request\",\n css: \"portalLogin\",\n cols: [\n {},\n {\n rows: [\n {},\n {\n width: 360,\n rows: [\n {\n id: \"password_reset_email\",\n css: \"portalLoginForm\",\n padding: 30,\n rows: [\n {\n template:\n \"
    \",\n borderless: true,\n height: 190,\n type: \"clean\",\n },\n {\n id: \"portal_reset_password_form\",\n view: \"form\",\n type: \"clean\",\n css: { background: \"transparent !important\" },\n borderless: true,\n elementsConfig: {\n bottomPadding: 20,\n },\n elements: [\n {\n template: `

    ${L(\n \"Enter your email. We'll send a link to reset your password.\"\n )}

    `,\n autoheight: true,\n css: {\n background: \"transparent\",\n border: \"none\",\n \"font-size\": \"16px\",\n color: \"black\",\n \"text-align\": \"center\",\n },\n },\n {\n borderless: true,\n cols: [\n {\n id: \"reset_tenantList\",\n view: \"select\",\n // label: \"Tenant\",\n name: \"tenant\",\n attributes: {\n \"data-cy\": \"reset_tenantList\",\n },\n value: 1,\n options: [\n { id: 1, value: \"Master\" },\n { id: 2, value: \"Release\" },\n ],\n },\n {\n id: \"reset-email\",\n view: \"text\",\n placeholder: L(\"Email\"),\n name: \"email\",\n validate: webix.rules.isEmail,\n invalidMessage: L(\n \"Please enter a valid email.\"\n ),\n validateEvent: \"blur\",\n attributes: {\n \"data-cy\":\n \"portal_reset_request_email\",\n },\n },\n {\n rows: [\n {\n view: \"button\",\n icon: \"fa fa-paper-plane\",\n type: \"icon\",\n css: \"webix_primary\",\n id: \"portal_reset_request_send\",\n autowidth: true,\n hotkey: \"enter\",\n click() {\n var email =\n $$(\"reset-email\");\n if (email.validate()) {\n email =\n email.getValue();\n var tenant =\n $$(\n \"reset_tenantList\"\n ).getValue();\n self.AB.Network.post(\n {\n url: \"/auth/login/reset\",\n data: {\n email,\n tenant,\n url:\n window\n .location\n .origin ||\n window\n .location\n .href,\n },\n },\n {\n key: \"portal_auth_login_reset\",\n context: {\n email,\n },\n }\n ).catch((err) => {\n console.log(err);\n });\n }\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(\n this\n );\n },\n },\n },\n {},\n ],\n },\n ],\n },\n {\n view: \"button\",\n label: L(\"Back to log in\"),\n css: \"webix_transparent\",\n click() {\n self.emit(\"login\");\n },\n },\n ],\n },\n ],\n },\n ],\n },\n {},\n ],\n },\n {},\n ],\n };\n }\n\n async init(AB) {\n this.AB = AB;\n\n L = (...params) => {\n return this.AB.Multilingual.label(...params);\n };\n\n // now replace our initial placeholder with our viewable form\n webix.ui(this.ui(), $$(\"portal_auth_login_reset_request\"));\n\n var $tenant = $$(\"reset_tenantList\");\n var siteConfig = this.AB.Config.siteConfig();\n if (siteConfig?.tenants?.length) {\n // replace options in tenant list with siteConfig.tenants:\n var newOptions = [];\n siteConfig.tenants.forEach((t) => {\n var opt = {\n id: t.uuid,\n value: t.title || t.key,\n };\n newOptions.push(opt);\n });\n\n $tenant.define(\"options\", newOptions);\n }\n\n var tID = this.AB.Tenant.id();\n if (tID) {\n $tenant.define(\"value\", tID);\n\n // if the tID matches one of our options, then we can hide\n // the input.\n // eg: they entered a route [tenant].our.url\n // we simple auto select the tenant and don't show this component.\n var opt = newOptions.find((o) => o.id == tID);\n if (opt) {\n $tenant.hide();\n }\n }\n\n this.AB.Network.on(\n \"portal_auth_login_reset\",\n (context, err, response) => {\n // Listen for our responses:\n // Show a popup for confirmation that an email was sent.\n // context.email : {string} entered email address.\n\n var text = L(\n \"

    An email with instructions on how to reset your password has been sent to {0}.

    Check your spam or junk folder if you don’t see the email in your inbox.

    \",\n [context.email]\n );\n\n webix.alert({\n title: L(\"Email Sent\"),\n ok: L(\"Okay\"),\n width: 500,\n text: text,\n });\n }\n );\n }\n\n show() {\n $$(\"portal_auth_login_reset_request\").show();\n }\n}\n\nexport default new PortalAuthLoginResetRequest();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalLoading extends ClassUI {\n constructor() {\n super();\n }\n\n ui() {\n return {\n id: \"portal_loading\",\n view: \"label\",\n label: \"loading\",\n };\n }\n\n init(AB) {\n this.AB = AB;\n\n return Promise.resolve();\n }\n\n show() {\n $$(\"portal_loading\").show();\n }\n}\n\nexport default new PortalLoading();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalTranslationTool extends ClassUI {\n constructor() {\n super();\n this.containerDomID = \"domID\";\n }\n\n ui() {\n const translationToolBody = {\n view: \"scrollview\",\n css: \"lightgray ab_amp\",\n body: {\n rows: [\n {\n view: \"accordion\",\n id: `qtt_accordion_${this.containerDomID}`,\n roles: [],\n hidden: true,\n collapsed: true,\n css: \"webix_dark\",\n rows: [],\n },\n {\n id: `qtt_accordion_noSelection_${this.containerDomID}`,\n rows: [{}],\n },\n ],\n },\n };\n\n return {\n view: \"window\",\n css: \"qttWindow\",\n id: `quickTranslationTool_${this.containerDomID}`,\n position: function (state) {\n state.left = state.maxWidth - 400; // fixed values\n state.top = 0;\n state.width = 400; // relative values\n state.height = state.maxHeight;\n },\n on: {\n onShow: () => {\n // collapse all the accordion items but the top one\n var index = 0;\n $$(`qtt_accordion_${this.containerDomID}`)\n .getChildViews()\n .forEach((a) => {\n if (index == 0) {\n $$(a).expand();\n } else {\n $$(a).collapse();\n }\n index++;\n $$(`qtt_accordion_${this.containerDomID}`).show();\n $$(\n `qtt_accordion_noSelection_${this.containerDomID}`\n ).hide();\n });\n },\n },\n head: {\n rows: [\n {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n width: 15,\n },\n {\n view: \"label\",\n label: \"Translation Tool\",\n autowidth: true,\n },\n {},\n {\n view: \"button\",\n width: 38,\n css: \"webix_transparent\",\n icon: \"fa fa-cog\",\n type: \"iconTop\",\n click: function () {\n if ($$(\"translationSettings\").config.hidden) {\n $$(\"translationSettings\").show();\n } else {\n $$(\"translationSettings\").hide();\n }\n },\n },\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(\n `quickTranslationTool_${this.containerDomID}`\n ).hide();\n },\n },\n ],\n },\n {\n view: \"toolbar\",\n id: \"translationSettings\",\n hidden: true,\n css: \"webix_dark\",\n rows: [\n {\n id: `qtt_accordion_${this.containerDomID}_translateTo`,\n view: \"select\",\n labelWidth: 120,\n label: \"Translate to:\",\n labelAlign: \"right\",\n options: [],\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n this.buildTranslationAccordion(\n this.application.objectsIncluded(),\n this.application.pages(),\n this.application.hintsIncluded()\n );\n }\n },\n },\n },\n {\n id: `qtt_accordion_${this.containerDomID}_translateHint`,\n view: \"select\",\n labelWidth: 120,\n label: \"Hint language:\",\n bottomLabel: \"*Hover over label to display hint\",\n labelAlign: \"right\",\n options: [],\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n this.buildTranslationAccordion(\n this.application.objectsIncluded(),\n this.application.pages(),\n this.application.hintsIncluded()\n );\n }\n },\n },\n },\n ],\n },\n ],\n },\n body: translationToolBody,\n };\n }\n\n init(portal) {\n this.AB = portal.AB;\n this.portal = portal;\n this.appId = portal.AppState.lastSelectedApp;\n this.application = this.AB.applicationByID(this.appId);\n\n const languageCode = this.AB.Config.userConfig().languageCode;\n\n let languageList = [];\n\n try {\n this.AB.Network.get({\n // The object \"SITE_LANGUAGE\"\n url: \"/app_builder/model/d84cd351-d96c-490f-9afb-2a0b880ca0ec\",\n }).then((list) => {\n list.data.forEach((item) => {\n languageList.push({\n id: item.language_code,\n value: item.language_label,\n });\n });\n $$(`qtt_accordion_${this.containerDomID}_translateTo`).define({\n options: languageList,\n value: languageCode,\n });\n $$(`qtt_accordion_${this.containerDomID}_translateTo`).refresh();\n $$(\n `qtt_accordion_${this.containerDomID}` + \"_translateHint\"\n ).define({\n options: languageList,\n value: languageList[0].id,\n });\n $$(\n `qtt_accordion_${this.containerDomID}` + \"_translateHint\"\n ).refresh();\n this.buildTranslationAccordion(\n this.application.objectsIncluded(),\n this.application.pages(),\n this.application.hintsIncluded()\n );\n });\n\n webix.ready(function () {\n webix.protoUI(\n {\n name: \"edittree\",\n },\n webix.EditAbility,\n webix.ui.tree\n );\n });\n\n webix.ui(this.ui());\n } catch (error) {\n console.error(error);\n }\n }\n\n show() {\n $$(`quickTranslationTool_${this.containerDomID}`).show();\n }\n\n hide() {\n $$(`quickTranslationTool_${this.containerDomID}`).hide();\n }\n\n showPage(pageId) {\n let page = this.application.views((v) => {\n return v.id == pageId;\n })[0];\n\n this.portal.showPage(page);\n }\n\n /*\n * helper to get the current apps views\n */\n views(f) {\n return this.AB.applicationByID(this.appId).views(f);\n }\n\n tutorials(f) {\n return this.AB.applicationByID(this.appId).hints(f);\n }\n\n buildTranslationAccordion(objects, views, tutorials) {\n $$(`qtt_accordion_${this.containerDomID}`).removeView(\n `qtt_accordionitem_${this.containerDomID}_objects`\n );\n $$(`qtt_accordion_${this.containerDomID}`).removeView(\n `qtt_accordionitem_${this.containerDomID}_views`\n );\n $$(`qtt_accordion_${this.containerDomID}`).removeView(\n `qtt_accordionitem_${this.containerDomID}_tutorials`\n );\n\n var toggleParent = (element) => {\n if (!element.parent) return false;\n var parentElem = element.parent;\n if (!parentElem.parent) return false;\n parentElem.parent.emit(\"changeTab\", parentElem.id);\n toggleParent(parentElem.parent);\n };\n\n var objectTree = [\n {\n id: `qtt_object_progress${this.containerDomID}`,\n height: 7,\n },\n {\n id: `linetree_${this.containerDomID}_objects`,\n view: \"edittree\",\n type: \"lineTree\",\n editable: true,\n tooltip: \"#hint#\",\n // role: role,\n editor: \"text\",\n editValue: \"value\",\n template: (obj, common) => {\n let language = $$(\n `qtt_accordion_${this.containerDomID}_translateTo`\n ).getValue();\n var color = \"gray\";\n if (obj.value.indexOf(`[${language}]`) > -1) {\n color = \"#ff5c4c\";\n }\n if (!obj.icon) {\n obj.icon = \"minus\";\n }\n var icon = `\n \n \n `;\n return (\n `` +\n icon +\n common.icon(obj, common) +\n `${obj.value}`\n );\n },\n data: [],\n on: {\n onAfterLoad: (id) => {\n if (\n !$$(`qtt_object_progress${this.containerDomID}`)\n .showProgress\n ) {\n webix.extend(\n $$(`qtt_object_progress${this.containerDomID}`),\n webix.ProgressBar\n );\n }\n $$(`linetree_${this.containerDomID}_objects`).parse(\n this.getTranslationToolObjectsTree(\n objects,\n this.containerDomID\n )\n );\n $$(`linetree_${this.containerDomID}_objects`).openAll();\n },\n onAfterEditStop: (state, editor, ignoreUpdate) => {\n if (state.old == state.value) return false;\n let language = $$(\n `qtt_accordion_${this.containerDomID}_translateTo`\n ).getValue();\n let branch = $$(\n `linetree_${this.containerDomID}_objects`\n ).data.getItem(editor.id);\n let propName = branch.field;\n let objectId = branch.objectId ? branch.objectId : branch.id;\n let fieldId = branch.fieldId ? branch.fieldId : \"\";\n let obj = this.AB.objectByID(objectId);\n if (fieldId) {\n let field = obj.fields((item) => {\n return item.id == fieldId;\n })[0];\n if (branch.type == \"option\") {\n field.settings.options.forEach((option) => {\n if (option.id == branch.id) {\n if (obj.languageDefault() == language) {\n hasLang = true;\n option[propName] = state.value;\n } else {\n option.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n var trans = {};\n trans.language_code = language;\n trans[propName] = state.value;\n option.translations.push(trans);\n }\n field.save();\n }\n });\n } else {\n var hasLang = false;\n if (obj.languageDefault() == language) {\n hasLang = true;\n field[propName] = state.value;\n } else {\n field.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n var trans = {};\n trans.language_code = language;\n trans[propName] = state.value;\n field.translations.push(trans);\n }\n field.save();\n }\n } else {\n let hasLang = false;\n if (obj.languageDefault() == language) {\n hasLang = true;\n obj[propName] = state.value;\n } else {\n obj.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n let trans = {};\n trans.language_code = language;\n trans[propName] = state.value;\n obj.translations.push(trans);\n }\n obj.save();\n }\n\n let progressBar = $$(\n `qtt_object_progress${this.containerDomID}`\n );\n let total = progressBar.config.total;\n let completed = progressBar.config.completed;\n\n if (\n state.old.indexOf(`[${language}]`) == -1 &&\n state.value.indexOf(`[${language}]`) > -1\n ) {\n completed--;\n } else if (\n state.old.indexOf(`[${language}]`) > -1 &&\n state.value.indexOf(`[${language}]`) > -1\n ) {\n // no change to completed count\n } else {\n completed++;\n }\n let position = completed / total + 0.00001;\n progressBar.define({\n total: total,\n completed: completed,\n });\n progressBar.showProgress({\n type: \"top\",\n position: position,\n });\n },\n },\n },\n ];\n\n var viewTree = [\n {\n id: `qtt_view_progress${this.containerDomID}`,\n height: 7,\n },\n {\n id: `linetree_${this.containerDomID}_views`,\n view: \"edittree\",\n type: \"lineTree\",\n editable: true,\n tooltip: \"#hint#\",\n // role: role,\n editor: \"text\",\n editValue: \"value\",\n template: (obj, common) => {\n let language = $$(\n `qtt_accordion_${this.containerDomID}_translateTo`\n ).getValue();\n var color = \"gray\";\n if (obj.value.indexOf(`[${language}]`) > -1) {\n color = \"#ff5c4c\";\n }\n if (!obj.icon) {\n obj.icon = \"minus\";\n }\n var externalLink = \"\";\n if ([\"button\", \"label\", \"menu\"].indexOf(obj.type) == -1) {\n externalLink = ``;\n }\n var icon = `\n \n \n `;\n return (\n `` +\n icon +\n common.icon(obj, common) +\n `${obj.value}` +\n externalLink\n );\n },\n data: [],\n onClick: {\n externalLink: (event, branch, target) => {\n var item = $$(\n `linetree_${this.containerDomID}_views`\n ).getItem(branch);\n\n this.showPage(item.pageId || item.viewId);\n\n if (item.type == \"tab\") {\n var tabView = this.application.views(\n (v) => v.id == item.id\n )[0];\n if (!tabView) return false;\n\n var tab = tabView.parent;\n if (!tab) return false;\n\n toggleParent(tab);\n if (!$$(tabView.id) || !$$(tabView.id).isVisible()) {\n var showIt = setInterval(function () {\n if ($$(tabView.id) && $$(tabView.id).isVisible()) {\n clearInterval(showIt);\n }\n tab.emit(\"changeTab\", tabView.id);\n }, 200);\n }\n } else if (item.type == \"page\") {\n var pageView = this.application.views(\n (v) => v.id == item.id\n )[0];\n if (!pageView) return false;\n pageView.emit(\"changePage\", pageView.id);\n // this.showPage(item.pageId);\n }\n\n return false;\n },\n },\n on: {\n onAfterLoad: (id) => {\n if (\n !$$(`qtt_view_progress${this.containerDomID}`).showProgress\n ) {\n webix.extend(\n $$(`qtt_view_progress${this.containerDomID}`),\n webix.ProgressBar\n );\n }\n $$(`linetree_${this.containerDomID}_views`).parse(\n this.getTranslationToolViewsTree(\n views,\n this.containerDomID\n )\n );\n $$(`linetree_${this.containerDomID}_views`).openAll();\n },\n onAfterEditStop: (state, editor, ignoreUpdate) => {\n if (state.old == state.value) return false;\n let language = $$(\n `qtt_accordion_${this.containerDomID}_translateTo`\n ).getValue();\n let branch = $$(\n `linetree_${this.containerDomID}_views`\n ).data.getItem(editor.id);\n let propName = branch.field;\n if (branch.type == \"menu\") {\n let view = this.application.views((view) => {\n return view.id == branch.viewId;\n })[0];\n view.settings.order.forEach((button) => {\n if (button.pageId == branch.buttonId) {\n let hasLang = false;\n button.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n if (!hasLang) {\n let trans = {};\n trans.language_code = language;\n trans[propName] = state.value;\n button.translations.push(trans);\n }\n view.save();\n }\n });\n } else if (branch.type == \"button\") {\n let view = this.application.views((view) => {\n return view.id == branch.viewId;\n })[0];\n var hasLang = false;\n\n if (view.languageDefault() == language) {\n hasLang = true;\n view.settings[propName] = state.value;\n } else {\n view.settings.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n var trans = {};\n trans.language_code = language;\n trans[propName] = state.value;\n view.settings.translations.push(trans);\n }\n view.save();\n } else {\n let view = this.application.views((view) => {\n return view.id == branch.id;\n })[0];\n let hasLang = false;\n if (view.languageDefault() == language) {\n hasLang = true;\n view[propName] = state.value;\n } else {\n view.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n let trans = {};\n trans.language_code = language;\n trans[propName] = state.value;\n view.translations.push(trans);\n }\n view.save();\n }\n let progressBar = $$(\n `qtt_view_progress${this.containerDomID}`\n );\n let total = progressBar.config.total;\n let completed = progressBar.config.completed;\n if (\n state.old.indexOf(`[${language}]`) == -1 &&\n state.value.indexOf(`[${language}]`) > -1\n ) {\n completed--;\n } else if (\n state.old.indexOf(`[${language}]`) > -1 &&\n state.value.indexOf(`[${language}]`) > -1\n ) {\n // no change to completed count\n } else {\n completed++;\n }\n let position = completed / total + 0.00001;\n progressBar.define({\n total: total,\n completed: completed,\n });\n progressBar.showProgress({\n type: \"top\",\n position: position,\n });\n },\n },\n },\n ];\n\n var tutorialTree = [\n {\n id: `qtt_tutorials_progress${this.containerDomID}`,\n height: 7,\n },\n {\n id: `linetree_${this.containerDomID}_tutorials`,\n view: \"edittree\",\n type: \"lineTree\",\n editable: true,\n tooltip: \"#hint#\",\n // role: role,\n editor: \"text\",\n editValue: \"value\",\n template: (obj, common) => {\n let language = $$(\n `qtt_accordion_${this.containerDomID}_translateTo`\n ).getValue();\n var color = \"gray\";\n if (obj.value.indexOf(`[${language}]`) > -1) {\n color = \"#ff5c4c\";\n }\n if (!obj.icon) {\n obj.icon = \"minus\";\n }\n var icon = `\n \n \n `;\n return (\n `` +\n icon +\n common.icon(obj, common) +\n `${obj.value}`\n );\n },\n data: [],\n on: {\n onAfterLoad: (id) => {\n if (\n !$$(`qtt_tutorials_progress${this.containerDomID}`)\n .showProgress\n ) {\n webix.extend(\n $$(`qtt_tutorials_progress${this.containerDomID}`),\n webix.ProgressBar\n );\n }\n $$(`linetree_${this.containerDomID}_tutorials`).parse(\n this.getTranslationToolTutorialsTree(\n tutorials,\n this.containerDomID\n )\n );\n $$(`linetree_${this.containerDomID}_tutorials`).openAll();\n },\n onAfterEditStop: (state, editor, ignoreUpdate) => {\n /// need to work here next week james\n if (state.old == state.value) return false;\n let language = $$(\n `qtt_accordion_${this.containerDomID}_translateTo`\n ).getValue();\n let branch = $$(\n `linetree_${this.containerDomID}_tutorials`\n ).data.getItem(editor.id);\n let propName = branch.field;\n if (branch.type == \"tutorial\") {\n let hint = this.AB.hints((h) => {\n return h.id == branch.viewId;\n })[0];\n let hasLang = false;\n if (hint.languageDefault() == language) {\n hasLang = true;\n hint[propName] = state.value;\n } else {\n hint.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n let trans = {};\n for (const [key, value] of Object.entries(\n hint.translations[0]\n )) {\n trans[key] = `[${language}] ${value}`;\n }\n trans.language_code = language;\n trans[propName] = state.value;\n hint.translations.push(trans);\n }\n hint.save();\n } else if (branch.type == \"step\") {\n let hint = this.AB.hints((h) => {\n return h.id == branch.hintId;\n })[0];\n let step = hint._steps[branch.viewId];\n let hasLang = false;\n if (step.languageDefault() == language) {\n hasLang = true;\n step[propName] = state.value;\n } else {\n step.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n let trans = {};\n for (const [key, value] of Object.entries(\n step.translations[0]\n )) {\n trans[key] = `[${language}] ${value}`;\n }\n trans.language_code = language;\n trans[propName] = state.value;\n step.translations.push(trans);\n }\n step.save();\n }\n let progressBar = $$(\n `qtt_tutorials_progress${this.containerDomID}`\n );\n let total = progressBar.config.total;\n let completed = progressBar.config.completed;\n if (\n state.old.indexOf(`[${language}]`) == -1 &&\n state.value.indexOf(`[${language}]`) > -1\n ) {\n completed--;\n } else if (\n state.old.indexOf(`[${language}]`) > -1 &&\n state.value.indexOf(`[${language}]`) > -1\n ) {\n // no change to completed count\n } else {\n completed++;\n }\n let position = completed / total + 0.00001;\n progressBar.define({\n total: total,\n completed: completed,\n });\n progressBar.showProgress({\n type: \"top\",\n position: position,\n });\n },\n },\n },\n ];\n\n var objectsAccordionItem = {\n view: \"accordionitem\",\n id: `qtt_accordionitem_${this.containerDomID}_objects`,\n header: \"Data Objects\",\n collapsed: true,\n body: {\n type: \"clean\",\n rows: objectTree,\n },\n };\n\n var viewsAccordionItem = {\n view: \"accordionitem\",\n id: `qtt_accordionitem_${this.containerDomID}_views`,\n header: \"Interface Items\",\n collapsed: true,\n body: {\n type: \"clean\",\n rows: viewTree,\n },\n };\n\n var hintsAccordionItem = {\n view: \"accordionitem\",\n id: `qtt_accordionitem_${this.containerDomID}_tutorials`,\n header: \"Tutorials\",\n collapsed: true,\n body: {\n type: \"clean\",\n rows: tutorialTree,\n },\n };\n\n $$(`qtt_accordion_${this.containerDomID}`).addView(\n objectsAccordionItem,\n -1\n );\n $$(`qtt_accordion_${this.containerDomID}`).addView(\n viewsAccordionItem,\n -1\n );\n $$(`qtt_accordion_${this.containerDomID}`).addView(\n hintsAccordionItem,\n -1\n );\n $$(`qtt_accordion_${this.containerDomID}`).show();\n $$(`qtt_accordionitem_${this.containerDomID}_views`).collapse();\n $$(`qtt_accordionitem_${this.containerDomID}_tutorials`).collapse();\n $$(`qtt_accordion_noSelection_${this.containerDomID}`).hide();\n\n $$(`linetree_${this.containerDomID}_objects`).openAll();\n $$(`linetree_${this.containerDomID}_views`).openAll();\n $$(`linetree_${this.containerDomID}_tutorials`).openAll();\n }\n\n getTranslations(translations, domId, field, completed, total) {\n var missingHint = false;\n var missingTranslate = false;\n var translateLang = $$(`qtt_accordion_${domId}_translateTo`).getValue();\n var value = translations.filter((item) => {\n return item.language_code == translateLang;\n })[0];\n if (!value) {\n // we didn't find the language so we are defaulting to first language\n missingTranslate = true;\n value = translations[0];\n }\n var hintLang = $$(`qtt_accordion_${domId}_translateHint`).getValue();\n var hint = translations.filter((item) => {\n return item.language_code == hintLang;\n })[0];\n if (!hint) {\n // we didn't find the language so we are defaulting to first language\n missingHint = true;\n hint = translations[0];\n }\n\n var hintLabel = \"\";\n var valueLabel = \"\";\n\n // some items store the text we need translated under \"text\"\n if (field) {\n hintLabel = hint[field];\n valueLabel = value[field];\n }\n if (!hintLabel) {\n hintLabel = hint.label;\n }\n if (!valueLabel) {\n valueLabel = value.label;\n }\n\n var hintPrefix = \"\";\n if (missingHint) {\n hintPrefix = `[${hintLang}] `;\n }\n var translatePrefix = \"\";\n if (missingTranslate) {\n translatePrefix = `[${translateLang}] `;\n }\n if (\n (valueLabel || \"\").indexOf(`[${translateLang}]`) == -1 &&\n !missingTranslate\n ) {\n completed++;\n }\n total++;\n return {\n hint: hintPrefix + hintLabel,\n value: translatePrefix + valueLabel,\n completed: completed,\n total: total,\n };\n }\n\n getTranslationToolViewsTree(views, domId) {\n var completed = 0;\n var total = 0;\n // this so it looks right/indented in a tree view:\n var tree = new webix.TreeCollection();\n\n /**\n * @method addPage\n *\n * @param {ABView} page\n * @param {integer} index\n * @param {uuid} parentId\n */\n var addPage = (page, parentId, type, field = \"label\", viewId) => {\n var translations = page.translations;\n var pageId = page.id;\n if (type == \"button\") {\n translations = page.settings.translations;\n pageId = `${page.id}_${field}`;\n }\n var labels = this.getTranslations(\n translations,\n domId,\n field,\n completed,\n total\n );\n completed = labels.completed;\n total = labels.total;\n var icon = page.tabicon ? page.tabicon : page.icon;\n\n // add to tree collection\n var branch = {\n id: pageId,\n value: labels.value,\n hint: labels.hint,\n field: field,\n viewId: viewId,\n translations: page.translations,\n pageId: parentId,\n buttonId: page.pageId,\n type: type,\n icon: icon,\n };\n tree.add(branch, null, parentId);\n\n // stop at detail views\n // if (page.defaults.key == \"detail\") {\n // return;\n // }\n\n var subPages = page.pages ? page.pages() : [];\n subPages.forEach((childPage, childIndex) => {\n addPage(childPage, page.id, \"page\");\n });\n\n // stop if there are no views to parse\n if (!page.views) return;\n // add labels\n page\n .views((v) => v.defaults.key == \"label\")\n .forEach((label, labelIndex) => {\n // label views\n // label.icon = \"th-list\";\n addPage(label, page.id, \"label\", \"text\", label.id);\n });\n // add tabs\n page\n .views((v) => v.defaults.key == \"tab\")\n .forEach((tab, tabIndex) => {\n // tab views\n tab.views().forEach((tabView, tabViewIndex) => {\n // tab items will be below sub-page items\n // tabView.icon = \"th-list\";\n addPage(tabView, page.id, \"tab\", \"label\", tab.id);\n });\n });\n // add menus\n page\n .views((v) => v.defaults.key == \"menu\")\n .forEach((menu, menuIndex) => {\n // menu buttons\n if (!menu.settings.order) return;\n menu.settings.order.forEach((menuItem, menuItemIndex) => {\n // tab items will be below sub-page items\n // menuItem.icon = \"link\";\n addPage(menuItem, page.id, \"menu\", \"aliasname\", menu.id);\n });\n });\n // add form buttons\n page\n .views((v) => v.defaults.key == \"form\")\n .forEach((form, formIndex) => {\n // form inputs\n form.views().forEach((formInput, formInputIndex) => {\n // we only need buttons\n if (formInput.key == \"button\") {\n for (const property in formInput.settings\n .translations[0]) {\n if (property != \"language_code\") {\n addPage(\n formInput,\n page.id,\n \"button\",\n property,\n formInput.id\n );\n }\n }\n }\n });\n });\n // add chart labels\n page\n .views((v) => v.defaults.key == \"chart\")\n .forEach((chart, chartIndex) => {\n // chart views\n chart.views().forEach((view, viewIndex) => {\n // we only need buttons\n if (view.key == \"label\") {\n addPage(view, page.id, \"label\", \"text\", view.id);\n }\n });\n });\n };\n views.forEach((p, index) => {\n addPage(p, null, \"page\", \"label\", p.id);\n });\n\n // there is a webix bug that will not allow you to se the value of a progress bar to 0\n let progressBar = $$(`qtt_view_progress${domId}`);\n let position = completed / total + 0.0001;\n progressBar.showProgress({\n type: \"top\",\n position: position,\n });\n progressBar.define({\n total: total,\n completed: completed,\n });\n\n return tree;\n }\n\n getTranslationToolObjectsTree(objects, domId) {\n var completed = 0;\n var total = 0;\n // this so it looks right/indented in a tree view:\n var tree = new webix.TreeCollection();\n\n /**\n * @method addBranch\n *\n * @param {ABView} page\n * @param {uuid} parentId\n * @param {string} type\n */\n var addBranch = (\n object,\n parentId,\n type,\n field = \"label\",\n fieldId,\n objectId\n ) => {\n var translations = object.translations;\n // we were missing translationson the Roles object\n if (!translations) return;\n var labels = this.getTranslations(\n translations,\n domId,\n field,\n completed,\n total\n );\n completed = labels.completed;\n total = labels.total;\n\n // add to tree collection\n var branch = {\n id: object.id,\n value: labels.value,\n hint: labels.hint,\n translations: object.translations,\n pageId: parentId,\n objectId: objectId,\n type: type,\n field: field,\n fieldId: fieldId,\n icon:\n type == \"object\" ? \"database\" : object.icon ? object.icon : \"\",\n };\n tree.add(branch, null, parentId);\n\n var fields = object.fields ? object.fields() : [];\n fields.forEach((field, fieldIndex) => {\n addBranch(field, object.id, \"field\", \"label\", field.id, object.id);\n });\n\n // add options\n if (\n object.settings &&\n object.settings.options &&\n object.settings.options.length\n ) {\n object.settings.options.forEach((option, optionIndex) => {\n addBranch(\n option,\n object.id,\n \"option\",\n \"text\",\n fieldId,\n parentId\n );\n });\n }\n };\n objects.forEach((p, index) => {\n addBranch(p, null, \"object\");\n });\n\n // there is a webix bug that will not allow you to se the value of a progress bar to 0\n let progressBar = $$(`qtt_object_progress${domId}`);\n let position = completed / total + 0.0001;\n progressBar.showProgress({\n type: \"top\",\n position: position,\n });\n progressBar.define({\n total: total,\n completed: completed,\n });\n\n return tree;\n }\n\n getTranslationToolTutorialsTree(tutorials, domId) {\n var completed = 0;\n var total = 0;\n // this so it looks right/indented in a tree view:\n var tree = new webix.TreeCollection();\n\n /**\n * @method addBranch\n *\n * @param {ABView} page\n * @param {uuid} parentId\n * @param {string} type\n */\n var addBranch = (\n object,\n parentId,\n type,\n field = [\"label\"],\n hintId = null\n ) => {\n var translations = object.translations;\n // we were missing translationson the Roles object\n if (!translations) return;\n let lastField = \"\";\n let firstField = \"\";\n field.forEach((f) => {\n if (firstField == \"\") firstField = f;\n lastField = f;\n var labels = this.getTranslations(\n translations,\n domId,\n f,\n completed,\n total\n );\n completed = labels.completed;\n total = labels.total;\n\n // add to tree collection\n var branch = {\n id: object.id + f,\n viewId: object.id,\n value: labels.value,\n hint: labels.hint,\n translations: object.translations,\n field: f,\n type: type,\n hintId: hintId,\n icon:\n type == \"tutorial\"\n ? \"info-circle\"\n : object.icon\n ? object.icon\n : \"minus-circle\",\n };\n tree.add(branch, null, parentId);\n parentId = object.id + firstField;\n });\n\n var steps = object.stepIDs || [];\n steps.forEach((step) => {\n addBranch(\n object._steps[step],\n parentId,\n \"step\",\n [\"name\", \"text\"],\n object.id\n );\n });\n };\n tutorials.forEach((p, index) => {\n addBranch(p, null, \"tutorial\", [\"name\", \"description\"]);\n });\n\n // there is a webix bug that will not allow you to se the value of a progress bar to 0\n let progressBar = $$(`qtt_tutorials_progress${domId}`);\n let position = completed / total + 0.0001;\n progressBar.showProgress({\n type: \"top\",\n position: position,\n });\n progressBar.define({\n total: total,\n completed: completed,\n });\n\n return tree;\n }\n}\n\nexport default new PortalTranslationTool();\n","import ClassUI from \"./ClassUI.js\";\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nclass PortalTutorialManager extends ClassUI {\n constructor() {\n super();\n }\n\n ui(appId) {\n // this is the modal window that opens when you click a tutorial to edit\n const tutorialStepsManager = (id) => {\n return {\n view: \"window\",\n id: \"stepManager\" + id,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n width: 15,\n },\n {\n view: \"label\",\n label: \"Tutorial Steps Manager\",\n autowidth: true,\n },\n {},\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-plus\",\n label: \"Step\",\n autowidth: true,\n css: \"webix_primary\",\n click: async () => {\n // create ABStep\n let step = await this.createStep(id);\n // save it to get an id to store on the ABHint\n await step.save();\n\n // get the current ABHint\n let hint = this.AB.hints((h) => {\n return h.id == id;\n })[0];\n // store the new ABStep id in the current ABHint\n if (hint?.stepIDs && Array.isArray(hint.stepIDs)) {\n hint.stepIDs.push(step.id);\n } else {\n hint.stepIDs = [step.id];\n }\n // store the ABStep in the ABHint (not saved in definitions)\n hint._steps[step.id] = step;\n // add the new step UI to the interface\n $$(\"hint_steps_\" + hint.id).addView(\n this.stepUI(step, hint)\n );\n },\n },\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(\"stepManager\" + id).close();\n this.show();\n },\n },\n ],\n },\n width: 800,\n height: 500,\n move: true,\n position: \"center\",\n resize: true,\n body: {\n rows: [\n {\n view: \"scrollview\",\n body: {\n rows: [\n tutorialSettings(id),\n {\n id: \"hint_steps_\" + id,\n rows: [],\n },\n ],\n },\n },\n save(id),\n ],\n },\n };\n };\n\n // ui that contains the list of current ABHints on this application\n const tutorialManagerBody = {\n view: \"scrollview\",\n css: \"lightgray ab_tutorial\",\n body: {\n rows: [\n {\n view: \"list\",\n id: \"tutorial_list\",\n template: `
    \n \n
    \n
    \n

    #name#

    \n

    #description#

    \n
    `,\n data: this._hints,\n hidden: this._hints.length == 0, // hide if we do not have any hints yet\n type: {\n css: \"hintItem\",\n height: \"auto\",\n },\n onClick: {\n deleteHint: (ev, id) => {\n // Confirm user wants to delete the hint\n webix\n .confirm({\n title: L(\"Delete Tutorial\"),\n text: L(\n \"Are you sure you want to delete this tutorial?\"\n ),\n type: \"confirm-error\",\n })\n .then((result) => {\n // get the hint that we want to delete\n let hint = this.AB.hintID(id);\n // delete the hint (steps will also be deleted)\n hint.destroy(this.application);\n // remove the hint from the ui\n $$(\"tutorial_list\").remove(id);\n // check if we have any hints if not switch views\n if ($$(\"tutorial_list\").count() == 0) {\n $$(\"tutorial_list\").hide();\n $$(\"tutorial_list_noSelection\").show();\n }\n return false; // blocks the default click behavior\n })\n .fail(() => {\n // webix.message(\"Cancel\");\n });\n return false;\n },\n hintItem: (ev, id) => {\n // open the editor for the hint\n webix.ui(tutorialStepsManager(id)).show();\n // insert the steps into the manager to edit\n this.steps(id);\n this.hide();\n },\n },\n },\n {\n id: \"tutorial_list_noSelection\",\n hidden: this._hints.length > 0,\n rows: [\n {},\n {\n view: \"label\",\n align: \"center\",\n height: 200,\n label: \"
    \",\n },\n {\n view: \"label\",\n align: \"center\",\n label: \"Add a tutorial to this page.\",\n },\n {\n cols: [\n {},\n {\n view: \"button\",\n label: \"Create Tutorial\",\n type: \"form\",\n css: \"webix_primary\",\n autowidth: true,\n click: () => {\n // open modal that helps user make a new hint\n webix.ui(newTutorialPopup).show();\n\n // populate the optiosn of the page/tab combo\n $$(\"view_popup_options\").define(\n \"options\",\n this.options\n );\n // attempt to set the values of the combo based off the\n // last visited page would be better if we could look at\n // tabs as well\n $$(\"view_popup_options\").define(\n \"value\",\n this.portal.AppState.lastPages[\n this.portal.AppState.lastSelectedApp\n ]\n );\n $$(\"view_popup_options\").refresh();\n },\n },\n {},\n ],\n },\n {},\n ],\n },\n ],\n },\n };\n\n // small modal that is displayed when user wants to create a new tutorial/hint\n const newTutorialPopup = {\n view: \"popup\",\n id: \"newTutorialPopup\",\n position: \"center\",\n height: 250,\n width: 350,\n modal: true,\n body: {\n rows: [\n {\n view: \"toolbar\",\n id: \"myToolbarABLiveTool\",\n css: \"webix_dark\",\n cols: [\n {\n view: \"label\",\n label: L(\"Create Tutorial\"),\n align: \"center\",\n },\n ],\n },\n {\n view: \"form\",\n elements: [\n {\n view: \"combo\",\n label: \"\",\n id: \"view_popup_options\",\n placeholder: L(\"Choose Page or Tab\"),\n options: [],\n },\n {\n cols: [\n {\n view: \"button\",\n value: L(\"Cancel\"),\n click: () => {\n $$(\"newTutorialPopup\").hide();\n },\n },\n {\n view: \"button\",\n value: \"Create\",\n id: \"view_popup_options_add\",\n css: \"webix_primary\",\n click: () => {\n let view = $$(\"view_popup_options\").getValue();\n let text = $$(\"view_popup_options\")\n .getText()\n .trim();\n // take values from selection to build a new hint\n this.createTutorial(view, text);\n $$(\"newTutorialPopup\").hide();\n },\n },\n ],\n },\n ],\n },\n ],\n },\n };\n\n // save the hint and step values and close the manager\n const save = (id) => {\n return {\n cols: [\n {},\n {\n view: \"button\",\n value: L(\"Cancel\"),\n width: 100,\n click: () => {\n $$(\"stepManager\" + id).close();\n this.show();\n },\n },\n {\n view: \"button\",\n value: L(\"Save\"),\n width: 100,\n css: \"webix_primary\",\n click: async (element, event) => {\n // validate form\n let valid = $$(\"stepform\" + id).validate();\n // get hint we are going to update\n let hint = this.AB.hints((h) => {\n return h.id == id;\n })[0];\n // loop through steps to get values and save\n hint.stepIDs.forEach((step) => {\n if (hint?._steps?.[step]) {\n // validate each step to ensure they are ready to save\n if (\n !$$(\"step_form\" + step).validate({\n disabled: true,\n })\n ) {\n valid = false;\n } else {\n // set values so we can save later\n let values = $$(\"step_form\" + step).getValues();\n hint._steps[step].name = values.name;\n hint._steps[step].text = values.text;\n hint._steps[step].settings.event = values.event;\n hint._steps[step].settings.el = values.el;\n // hint._steps[step].save();\n }\n }\n });\n if (!valid) return false;\n\n var values = $$(\"stepform\" + id).getValues();\n hint.name = values.name;\n hint.description = values.description;\n hint.settings.view = values.view;\n hint.settings.active = values.active;\n // save the steps data next\n // hint.stepIDs.forEach((step) => {\n // if (hint?._steps?.[step]) {\n // hint._steps[step].save();\n // }\n // });\n for (const step of hint.stepIDs) {\n if (hint?._steps?.[step]) {\n await hint._steps[step].save();\n }\n }\n await hint.save();\n $$(\"stepManager\" + id).close();\n this.show();\n },\n },\n {},\n ],\n };\n };\n\n // ui that is at the top of the tutorial manager for the global tutorial settings\n const tutorialSettings = (id) => {\n let currentTutorial = this.AB.hints((h) => {\n return h.id == id;\n })[0];\n let active = currentTutorial?.settings?.active ?? \"1\";\n return {\n view: \"form\",\n id: \"stepform\" + id,\n borderless: true,\n cols: [\n {\n id: \"step_window\",\n rows: [\n {\n view: \"text\",\n label: L(\"Title\"),\n name: \"name\",\n validate: webix.rules.isNotEmpty,\n invalidMessage: L(\"Title is required\"),\n value: currentTutorial.name,\n },\n {\n view: \"textarea\",\n label: L(\"Text\"),\n labelAlign: \"left\",\n height: 100,\n name: \"description\",\n value: currentTutorial?.description || \"\",\n },\n ],\n },\n {\n width: 300,\n rows: [\n {\n cols: [\n {\n view: \"label\",\n label: L(\"Page/Tab\"),\n align: \"left\",\n width: 100,\n },\n // {\n // view: \"button\",\n // icon: \"fa fa-crosshairs\",\n // type: \"icon\",\n // label: L(\"select\"),\n // css: \"focusPageTab webix_primary\",\n // currentTutorialID: id,\n // width: 100,\n // click: () => {\n // $$(\"stepManager\" + currentTutorial.id).hide();\n // document.addEventListener(\n // \"click\",\n // this.handlePageTabClick,\n // false\n // );\n // document.hintId = id;\n // webix.ui(this.pageTabWindow(id)).show();\n // },\n // },\n {\n view: \"combo\",\n name: \"view\",\n value: currentTutorial.settings.view,\n options: {\n view: \"suggest\",\n css: \"wider_popup\",\n body: {\n view: \"list\",\n css: \"wider_popup\",\n data: this.options,\n template: \"#value#\",\n },\n },\n },\n ],\n },\n\n {\n view: \"switch\",\n label: L(\"Active\"),\n labelWidth: 100,\n name: \"active\",\n value: active,\n },\n ],\n },\n ],\n };\n };\n\n // this is the drawer admin that lists all tutorials\n return {\n view: \"window\",\n css: \"tutorialWindow\",\n id: \"tutorial_manager\",\n position: function (state) {\n state.left = state.maxWidth - 350; // fixed values\n state.top = 0;\n state.width = 350; // relative values\n state.height = state.maxHeight;\n },\n on: {\n onShow: () => {},\n },\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n width: 15,\n },\n {\n view: \"label\",\n label: \"Tutorial Manager\",\n autowidth: true,\n },\n {},\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-plus\",\n label: \"Tutorial\",\n width: 95,\n css: \"webix_primary\",\n click: () => {\n webix.ui(newTutorialPopup).show();\n\n $$(\"view_popup_options\").define(\"options\", this.options);\n $$(\"view_popup_options\").define(\n \"value\",\n this.portal.AppState.lastPages[\n this.portal.AppState.lastSelectedApp\n ]\n );\n $$(\"view_popup_options\").refresh();\n },\n },\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n this.hide();\n },\n },\n ],\n },\n body: tutorialManagerBody,\n };\n }\n\n init(portal) {\n this.AB = portal.AB;\n this.portal = portal;\n this.appId = portal.AppState.lastSelectedApp;\n\n this.application = this.AB.applicationByID(this.appId);\n const pages = this.application.pages();\n this.options = this.getViewOptions(pages);\n // only return tutorials that are on current application\n this._hints = this.AB.hints((hint) => {\n if (this.application.hintIDs.indexOf(hint.id) > -1) {\n return true;\n } else {\n return false;\n }\n });\n webix.ui(this.ui());\n }\n\n show() {\n // this gets the latest hints and updates them to local list.\n $$(\"tutorial_manager\").show();\n this._hints = this.AB.hints((hint) => {\n if (this.application.hintIDs.indexOf(hint.id) > -1) {\n return true;\n } else {\n return false;\n }\n });\n $$(\"tutorial_list\").define(\"data\", this._hints);\n $$(\"tutorial_list\").refresh();\n }\n\n hide() {\n $$(\"tutorial_manager\").hide();\n }\n\n // small modal that gives instructions to user when selecting the page or tab to load this tutorial on\n pageTabWindow(hintID) {\n return {\n view: \"window\",\n id: \"pageTabWindow\",\n width: 160,\n height: 160,\n move: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {},\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(\"stepManager\" + hintID).show();\n $$(\"pageTabWindow\").hide();\n\n document.removeEventListener(\n \"contextmenu\",\n this.handleRightClick,\n false\n );\n },\n },\n ],\n },\n position: function (state) {\n state.left = state.maxWidth - state.width;\n state.top = state.maxHeight - state.height;\n },\n body: {\n template:\n \"
    \" +\n L(\"Click the page or tab that will start this tutorial\") +\n \"
    \",\n },\n };\n }\n\n // small modal that gives instructions to users when they are selecting the highlight element\n focusWindow(hintID) {\n return {\n view: \"window\",\n id: \"focusWindow\",\n width: 160,\n height: 160,\n move: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {},\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(\"stepManager\" + hintID).show();\n $$(\"focusWindow\").hide();\n\n document.removeEventListener(\n \"contextmenu\",\n this.handleRightClick,\n false\n );\n document.body.classList.remove(\"findDataCy\");\n },\n },\n ],\n },\n position: function (state) {\n state.left = state.maxWidth - state.width;\n state.top = state.maxHeight - state.height;\n },\n body: {\n template:\n \"
    \" +\n L(\"Right click the element you want to highlight.\") +\n \"
    \",\n },\n };\n }\n\n updateStepsUI(id) {\n const views = $$(\"hint_steps_\" + id).getChildViews();\n let viewsToRemove = [];\n views.forEach((view) => {\n viewsToRemove.push(view.config.id);\n });\n viewsToRemove.forEach((view) => {\n $$(\"hint_steps_\" + id).removeView(view);\n });\n this.steps(id);\n }\n\n addHighlightClass(event) {\n let item = $$(event.currentTarget);\n let formVals = $$(\"step_form\" + item.config.stepId).getValues();\n document.querySelector(formVals?.el).classList.add(\"highlightMe\");\n }\n removeHighlightClass(event) {\n let item = $$(event.currentTarget);\n let formVals = $$(\"step_form\" + item.config.stepId).getValues();\n document.querySelector(formVals?.el).classList.remove(\"highlightMe\");\n }\n\n // build a list of steps that are included in this hint\n steps(id) {\n let hint = this.AB.hints((h) => {\n return h.id == id;\n })[0];\n // if we do not have steps\n if (!hint?.stepIDs?.length) {\n let addStepBelow = {\n id: \"addStepBelow\",\n padding: 20,\n rows: [\n {\n css: \"ab-component-form-rules\",\n rows: [\n {},\n {\n view: \"label\",\n align: \"center\",\n height: 80,\n label: \"
    \",\n },\n {\n view: \"label\",\n align: \"center\",\n label: L(\"Add a step to this tutorial.\"),\n },\n {\n cols: [\n {},\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-plus\",\n label: L(\"Step\"),\n autowidth: true,\n css: \"webix_primary\",\n click: async () => {\n // create an ABStep\n let step = await this.createStep(id);\n // save it to definitions to get id\n await step.save();\n // get the hint we are editing\n let hint = this.AB.hints((h) => {\n return h.id == id;\n })[0];\n // assign the new ABStep id to the ABHint\n if (\n hint?.stepIDs &&\n Array.isArray(hint.stepIDs)\n ) {\n hint.stepIDs.push(step.id);\n } else {\n hint.stepIDs = [step.id];\n }\n // store the ABStep on the ABHint (not stored in defs)\n hint._steps[step.id] = step;\n // remove ui that shows when ABHint does not have steps\n $$(\"hint_steps_\" + hint.id).removeView(\n \"addStepBelow\"\n );\n // add the ui to edit the new step to the ui\n $$(\"hint_steps_\" + hint.id).addView(\n this.stepUI(step, hint)\n );\n },\n },\n {},\n ],\n },\n {},\n ],\n },\n ],\n };\n // add to the ui now that we have it defined\n $$(\"hint_steps_\" + id).addView(addStepBelow);\n } else {\n // if we do have steps\n hint.stepIDs.forEach((step) => {\n $$(\"hint_steps_\" + id).addView(\n this.stepUI(hint._steps[step], hint)\n );\n });\n }\n // set up hover listeners for buttons that help user pick and show the highlight elements\n const focusElements = document.querySelectorAll(\".focusElement\");\n for (let i = 0; i < focusElements.length; i++) {\n focusElements[i].addEventListener(\n \"mouseover\",\n this.addHighlightClass,\n false\n );\n focusElements[i].addEventListener(\n \"mouseout\",\n this.removeHighlightClass,\n false\n );\n }\n }\n\n // UI for each step that will be used to rebuild steps when moved/deleted/loaded\n stepUI(step, hint) {\n // the position of the step that we display in the top left corner of the ui\n let position = $$(\"hint_steps_\" + hint.id).getChildViews().length + 1;\n return {\n view: \"form\",\n id: \"step_form\" + step.id,\n css: \"my\",\n padding: 15,\n borderless: true,\n rows: [\n {\n borderless: true,\n cols: [\n {\n width: 50,\n rows: [\n {\n view: \"label\",\n label: `

    ${position}

    `,\n align: \"center\",\n },\n {\n view: \"icon\",\n class: \"moveStepUp\",\n icon: \"fa fa-caret-up\",\n disabled: position == 1 ? true : false, // do not allow moving up if already at the top position\n align: \"center\",\n click: (id, element) => {\n // move the step up a position\n this.moveStep(step, hint, \"up\");\n },\n },\n {\n view: \"icon\",\n class: \"moveStepDown\",\n icon: \"fa fa-caret-down\",\n disabled:\n hint.stepIDs.length == position ? true : false, // do not let the last item be moved down\n align: \"center\",\n click: (id, element) => {\n // move the step down a position\n this.moveStep(step, hint, \"down\");\n },\n },\n ],\n },\n {\n css: \"ab-component-form-rules\",\n padding: 15,\n cols: [\n {\n minWidth: 300,\n rows: [\n {\n view: \"text\",\n label: L(\"Title\"),\n validate: webix.rules.isNotEmpty,\n invalidMessage: L(\"Title is required\"),\n labelWidth: 100,\n name: \"name\",\n value: step?.name || \"\",\n },\n {\n view: \"textarea\",\n label: L(\"Text\"),\n labelAlign: \"left\",\n labelWidth: 100,\n height: 150,\n name: \"text\",\n value: step?.text || \"\",\n },\n {\n cols: [\n {\n view: \"label\",\n label: L(\"Highlight\"),\n align: \"left\",\n width: 100,\n },\n {\n view: \"button\",\n icon: \"fa fa-crosshairs\",\n type: \"icon\",\n label: L(\"select\"),\n css: \"focusElement webix_primary\",\n stepId: step.id,\n width: 100,\n click: () => {\n // change the ui to support the selecting of the highlight element\n $$(\"stepManager\" + hint.id).hide();\n // adding this class will allow a css rule to highlight any element with data-cy attribute on hover\n document.body.classList.add(\n \"findDataCy\"\n );\n // when the user sees the element hovered can be a highlight element they right click to save it\n document.addEventListener(\n \"contextmenu\",\n this.handleRightClick,\n false\n );\n // store the step and hint ids to use in the handleRightClick() function\n document.stepId = step.id;\n document.hintId = hint.id;\n // show a small window in bottom right hand corner that helps user know what to do\n webix\n .ui(this.focusWindow(hint.id))\n .show();\n },\n },\n {\n view: \"text\",\n name: \"el\",\n value: step.settings.el,\n disabled: true,\n placeholder: L(\n \"Click the 'select' button to pick an element to highlight.\"\n ),\n bottomLabel: L(\n \"Hover over the 'select' button to highlight the chosen element.\"\n ),\n validate: webix.rules.isNotEmpty,\n invalidMessage: L(\n \"Please choose an item to highlight\"\n ),\n },\n ],\n },\n {\n cols: [\n {\n view: \"label\",\n label: L(\"Event\"),\n align: \"left\",\n width: 100,\n },\n {\n view: \"combo\",\n value: step.settings.event,\n name: \"event\",\n options: [\n {\n id: \"click\",\n value: L(\"Click\"),\n },\n {\n id: \"enter\",\n value: L(\"Enter\"),\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n {\n view: \"template\",\n borderless: true,\n template: `
    `,\n width: 15,\n onClick: {\n deleteStep: (ev, id) => {\n // ask user if they want to delete this step\n webix\n .confirm({\n title: L(\"Delete Step\"),\n text: L(\n \"Are you sure you want to delete this step?\"\n ),\n type: \"confirm-error\",\n })\n .then(async (result) => {\n // remove the step from the hint\n hint.stepRemove(step.id);\n await hint.save();\n // rebuild the step ui now that one has been removed\n this.updateStepsUI(hint.id);\n return false; // blocks the default click behavior\n })\n .fail(() => {\n // webix.message(\"Cancel\");\n });\n return false;\n },\n },\n },\n ],\n },\n ],\n };\n }\n\n // this function moves a step up or down a position\n async moveStep(step, hint, direction) {\n let currPosition = hint.stepIDs.indexOf(step.id);\n switch (direction) {\n case \"up\":\n hint.stepIDs.splice(\n currPosition - 1,\n 0,\n hint.stepIDs.splice(currPosition, 1)[0]\n );\n break;\n default:\n hint.stepIDs.splice(\n currPosition + 1,\n 0,\n hint.stepIDs.splice(currPosition, 1)[0]\n );\n }\n await hint.save();\n this.updateStepsUI(hint.id);\n }\n\n // this builds the list of page/tab options that a hint can be added to\n getViewOptions(views) {\n // this so it looks right/indented in a tree view:\n // var tree = new webix.TreeCollection();\n var options = [];\n\n /**\n * @method addOption\n *\n * @param {ABView} page\n * @param {uuid} parentId\n * @param {number} depth\n */\n var addOption = (object, parentId, depth) => {\n // add to tree collection\n if ([\"page\", \"tab\", \"viewcontainer\"].indexOf(object.key) != -1) {\n var indent = \"\";\n for (let i = 0; i < depth; i++) {\n indent += \"\";\n }\n let icon =\n object.icon == \"braille\" ? \"external-link-square\" : object.icon;\n var option = {\n id: object.id,\n value: `${indent} ${object.label}`,\n };\n options.push(option);\n }\n\n var pages = object.pages ? object.pages() : [];\n pages.forEach((page, pageIndex) => {\n addOption(page, object.id, depth + 1);\n });\n\n var views = object.views();\n views.forEach((view, pageIndex) => {\n addOption(view, object.id, depth + 1);\n });\n };\n views.forEach((p, index) => {\n addOption(p, null, 0);\n });\n\n return options;\n }\n\n // This creates a new hint and stores it on the application and view we want to display it on\n async createTutorial(viewID, viewLabel) {\n let hint = this.AB.hintNew({\n name: viewLabel,\n settings: { view: viewID },\n });\n await hint.save();\n if (Array.isArray(this?.application?.hintIDs)) {\n this.application.hintIDs.unshift(hint.id);\n } else {\n this.application.hintIDs = [hint.id];\n }\n this.application.save();\n let hintView = this.application.views((view) => {\n return view.id == viewID;\n })[0];\n hintView.settings.hintID = hint.id;\n hintView.save();\n $$(\"tutorial_list\").add(hint, 0);\n if (this.AB.hints().length) {\n $$(\"tutorial_list\").show();\n $$(\"tutorial_list_noSelection\").hide();\n }\n }\n\n // create a new step on a hint\n async createStep(hintID) {\n let step = this.AB.stepNew(null, hintID);\n return step;\n }\n\n // store the data-cy info on a step after right clicking an element on the page\n handleRightClick(event) {\n function getCy(element) {\n if (element?.dataset?.cy) {\n return element.dataset.cy;\n } else if (element?.parentElement) {\n return getCy(element.parentElement);\n } else {\n webix.alert({\n text: L(\"Sorry, try another element.\"),\n });\n return \"\";\n }\n }\n\n if (document?.stepId) {\n event.preventDefault();\n event.stopPropagation();\n let dataCy = getCy(event.target);\n if (!dataCy) return false;\n $$(\"step_form\" + document.stepId).setValues(\n {\n el: \"[data-cy='\" + dataCy + \"']\",\n },\n true\n );\n }\n $$(\"stepManager\" + document.hintId).show();\n $$(\"focusWindow\").hide();\n\n document.removeEventListener(\"contextmenu\", this.handleRightClick, false);\n document.body.classList.remove(\"findDataCy\");\n delete document.stepId;\n delete document.hintId;\n\n return false;\n }\n\n // handlePageTabClick(event) {\n // event.preventDefault();\n // event.stopPropagation();\n // debugger;\n // // $$(\"stepform\" + document?.hintId).setValues(\n // // {\n // // view: \"[data-cy='\" + dataCy + \"']\",\n // // },\n // // true\n // // );\n\n // $$(\"stepManager\" + document.hintId).show();\n // $$(\"pageTabWindow\").hide();\n\n // document.removeEventListener(\"click\", this.handlePageTabClick, false);\n // delete document.hintId;\n\n // return false;\n // }\n}\n\nexport default new PortalTutorialManager();\n","import ClassUI from \"./ClassUI.js\";\nimport ClassUIPage from \"./ClassUIPage.js\";\n\nimport PortalWorkInbox from \"./portal_work_inbox.js\";\nimport PortalWorkInboxTaskWindow from \"./portal_work_inbox_taskWindow.js\";\nimport PortalWorkUserProfileWindow from \"./portal_work_user_profile_window.js\";\nimport PortalWorkUserSwitcheroo from \"./portal_work_user_switcheroo.js\";\nimport PortalWorkUserQRWindow from \"./portal_work_user_qr_window.js\";\nimport PortalWorkUserMobileQR from \"./portal_work_user_mobile_qr.js\";\nimport PortalWorkTaskUserForm from \"./portal_work_task_user_form.js\";\nimport PortalAccessLevelManager from \"./portal_access_level_manager.js\";\nimport TranslationTool from \"./portal_translation_tool.js\";\nimport TutorialManager from \"./portal_tutorial_manager.js\";\n\nclass PortalWork extends ClassUI {\n constructor() {\n super();\n }\n\n ui() {\n return {\n id: \"portal_work\",\n rows: [\n {\n id: \"portal_work_network_warning\",\n height: 30,\n css: \"portal_work_warning_banner warning_custom_css\",\n hidden: true,\n cols: [\n { width: 5 },\n {\n id: \"portal_work_network_warning_label\",\n view: \"label\",\n align: \"center\",\n },\n {\n id: \"portal_work_network_warning_button\",\n view: \"button\",\n align: \"center\",\n hidden: true,\n width: 100,\n css: \"webix_transparent\",\n },\n { width: 5 },\n ],\n },\n {\n id: \"portal_work_switcheroo_user_switched\",\n height: 30,\n css: \"portal_work_switcheroo_user_switched\",\n hidden: true,\n cols: [\n {\n width: 5,\n },\n {\n id: \"portal_work_switcheroo_user_switched_label\",\n view: \"label\",\n align: \"center\",\n },\n {\n id: \"portal_work_switcheroo_user_switched_loading\",\n view: \"label\",\n hidden: true,\n align: \"center\",\n width: 30,\n label: '',\n },\n {\n view: \"button\",\n value: '
    ',\n align: \"center\",\n width: 30,\n css: \"webix_transparent\",\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(this, \"switcheroo_clear_button\");\n },\n onItemClick: async () => {\n this.busy();\n await PortalWorkUserSwitcheroo.switcherooClear();\n this.ready();\n $$(\"portal_work_switcheroo_user_switched\").hide();\n },\n },\n },\n {\n width: 5,\n },\n ],\n },\n {\n view: \"toolbar\",\n id: \"mainToolbar\",\n // borderless: true,\n css: \"webix_dark mainToolbar\",\n padding: 10,\n cols: [\n {\n id: \"portal_work_menu_sidebar\",\n view: \"button\",\n type: \"icon\",\n width: 50,\n icon: \"fa fa-bars no-margin\",\n click: () => {\n let navSideBar = $$(\"navSidebar\");\n if (navSideBar.isVisible()) {\n navSideBar.hide();\n } else {\n navSideBar.show();\n let sidebarMenu = $$(\"abSidebarMenu\");\n if (sidebarMenu.getSelectedId() == \"\") {\n sidebarMenu.blockEvent();\n const firstID = sidebarMenu.getFirstId();\n sidebarMenu.select(firstID);\n sidebarMenu.unblockEvent();\n }\n }\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {\n view: \"label\",\n autowidth: true,\n id: \"portal_work_menu_title\",\n label: \"AppBuilder\",\n align: \"left\",\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {},\n {\n id: \"portal_work_menu_pages\",\n css: \"appPages\",\n cols: [],\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {},\n {\n id: \"inbox_icon\",\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-envelope no-margin\",\n width: 40,\n // badge: 12,\n click: () => {\n PortalWorkInbox.show();\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {\n id: \"settings_icon\",\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-cog fa-lg no-margin\",\n width: 40,\n hidden: true,\n popup: \"settingsMenu\",\n /* Look at this.refreshSettingsMenu() for menu options and actions */\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {\n id: \"user_icon\",\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-user-circle no-margin\",\n width: 40,\n popup: \"userMenu\",\n /* Look at Popup created below for menu options and actions */\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n ],\n },\n {\n cols: [\n {\n id: \"navSidebar\",\n hidden: true,\n autoheight: true,\n borderless: true,\n rows: [\n {\n id: \"abNavSidebarScrollView\",\n view: \"scrollview\",\n scroll: \"y\",\n css: \"darkScrollview\",\n body: {\n rows: [\n {\n view: \"sidebar\",\n id: \"abSidebarMenu\",\n borderless: true,\n css: \"webix_dark mainSidebar\",\n data: [],\n on: {\n onAfterRender() {\n this.data.each((a) => {\n ClassUI.CYPRESS_REF(\n this.getItemNode(a.id),\n a.id\n );\n });\n },\n onAfterSelect: (/* id */) => {\n // this.selectApplication(id);\n },\n onItemClick: (id) => {\n this.selectApplication(id);\n },\n },\n },\n ],\n },\n },\n {\n view: \"template\",\n borderless: true,\n css: \"appDevDesigns\",\n height: 110,\n },\n {\n id: \"portal_work_privacy_policy\",\n view: \"template\",\n template:\n '#label#',\n css: \"policyLink\",\n height: 30,\n hidden: true,\n },\n ],\n },\n {\n id: \"abWorkPages\",\n template: \"No Applications Have Been Loaded.\",\n }, // this is where content goes\n ],\n },\n ],\n };\n }\n\n /** @param {import('../AppBuilder/ABFactory.js').default} AB */\n async init(AB) {\n this.AB = AB;\n\n this.storageKey = \"portal_work_state\";\n\n this.pageContainers = {};\n\n const L = (...params) => {\n return this.label(...params);\n };\n\n const allInits = [];\n\n allInits.push(PortalWorkUserProfileWindow.init(this.AB));\n allInits.push(PortalWorkUserSwitcheroo.init(this.AB));\n PortalWorkTaskUserForm.init(this.AB);\n\n // {hash} { ABViewPage.id : ClassUIPage() }\n // track each of the page containers (instances of ClassUIPage) that\n // are responsible for displaying the proper state of each of our\n // Root Pages.\n\n // Get all our ABApplications and loaded Plugins in allApplications\n const allApplications = (\n this.AB.applications(\n (a) =>\n a.isWebApp &&\n a.isAccessibleForRoles(this.AB.Account.rolesAll() ?? [])\n ) || []\n ).concat(this.AB.plugins().filter((p) => p.pages) || []);\n\n // Build out our Navigation Side Bar Menu with our available\n // ABApplications\n const menu_data = [];\n\n for (let i = 0; i < allApplications.length; i++) {\n // TODO: implement Sorting on these before building UI\n menu_data.push(this.uiSideBarMenuEntry(allApplications[i]));\n }\n\n let { privacyPolicy, relay } = this.AB.Config.siteConfig();\n if (privacyPolicy) {\n $$(\"portal_work_privacy_policy\").setValues({\n label: L(\"Privacy Policy\"),\n link: privacyPolicy,\n });\n $$(\"portal_work_privacy_policy\").show();\n }\n\n $$(\"abSidebarMenu\").define(\"data\", menu_data);\n this.sidebarResize();\n\n PortalWorkUserMobileQR.init(AB);\n\n const userMenuOptions = [\n { id: \"user_profile\", label: L(\"User Profile\"), icon: \"user\" },\n { id: \"user_logout\", label: L(\"Logout\"), icon: \"ban\" },\n ];\n\n // add in any Mobile App QR Codes:\n const allMobile = this.AB.applications((a) => a.isMobile);\n allMobile.forEach((m) => {\n userMenuOptions.splice(1, 0, {\n id: m.id, // \"pwa_app\",\n label: m.label,\n icon: m.icon.replace(\"fa-\", \"\"),\n });\n });\n\n if (this.AB.Account.canSwitcheroo()) {\n userMenuOptions.splice(1, 0, {\n id: \"user_switcheroo\",\n label: L(\"Switcheroo\"),\n icon: \"user-secret\",\n });\n }\n\n if (this.AB.Account.isSwitcherood()) {\n $$(\"portal_work_switcheroo_user_switched_label\").setValue(\n `\n ${L('You are viewing this site as \"{0}\"', [\n this.AB.Account.username(),\n ])}`\n );\n $$(\"portal_work_switcheroo_user_switched\").show();\n }\n /** @type {Object.} */\n this.networkWarnings = {\n /**\n * @typedef {object} NetworkWarning - define the display & behavior of\n * a Network Warning\n * @prop {string} label - warning message to display\n * @prop {number} priority - 1 is the highest prioirity\n * @prop {Function} [click] - click hanlder function\n * @prop {string} [button] - label for the button\n * @prop {string | number} [value] - to replace in button lable\n * @prop {string} [css] - custom css to add to the warning ui\n * @prop {Boolean} [active] - is the warning currently active\n */\n no_network: {\n label: `\n ${L(\"No network detected. Work will not be saved.\")}`,\n priority: 1,\n },\n no_server: {\n label: `\n ${L(\n \"Uh oh...we cannot communicate with our servers, please wait before saving data.\"\n )}`,\n priority: 2,\n click: () => this.AB.Network._connectionCheck(),\n button: ` #value# ${L(\n \"requests\"\n )}`,\n value: 0,\n },\n slow: {\n label: `\n ${L(\"Slow Network Detected! This may affect your experience.\")}`,\n priority: 5,\n click: () => {\n this.networkWarningClear(\"slow\");\n this.networkWarnings.slow.disabled = true;\n },\n button: ` ${L(\n \"dismiss\"\n )}`,\n css: \"background: #c98025\",\n },\n };\n\n if (!navigator.onLine) this.networkWarningDisplay(\"no_network\");\n\n window.addEventListener(\"offline\", () => {\n this.networkWarningDisplay(\"no_network\");\n });\n\n window.addEventListener(\"online\", () => {\n this.networkWarningClear(\"no_network\");\n });\n\n // document.body.addEventListener(\n // \"offline\",\n // function () {\n // debugger;\n // $$(\"portal_work_no_network_detected\").show();\n // },\n // false\n // );\n // document.body.addEventListener(\n // \"online\",\n // function () {\n // debugger;\n // $$(\"portal_work_no_network_detected\").hide();\n // },\n // false\n // );\n\n // Only add the QR Code option if the relay service is enabled\n if (relay) {\n // Insert at userMenuOptions[2] so logout is still last\n userMenuOptions.splice(2, 0, {\n id: \"user_qr\",\n label: L(\"Connect Mobile App\"),\n icon: \"qrcode\",\n });\n }\n\n // This is the User popup menu that opens when you click the user icon in the main nav\n this.AB.Webix.ui({\n view: \"popup\",\n id: \"userMenu\",\n width: 150,\n body: {\n view: \"list\",\n data: userMenuOptions,\n template: \" #label#\",\n autoheight: true,\n select: true,\n on: {\n onItemClick: (id) => {\n switch (id) {\n case \"user_profile\":\n PortalWorkUserProfileWindow.show();\n break;\n case \"user_switcheroo\":\n PortalWorkUserSwitcheroo.show();\n break;\n case \"user_logout\":\n AB.Account.logout();\n break;\n case \"user_qr\":\n PortalWorkUserQRWindow.init(AB);\n PortalWorkUserQRWindow.show();\n break;\n default: {\n // was this one of our Mobile Apps?\n const mobileApp = this.AB.applicationByID(id);\n if (mobileApp) {\n PortalWorkUserMobileQR.load(mobileApp);\n PortalWorkUserMobileQR.show();\n } else {\n const item = userMenuOptions.filter(\n (o) => o.id == id\n )[0];\n this.AB.Webix.message(\n `Not yet implemented
    \n Menu item:${item.label}
    \n Menu ID:${item.id}`\n );\n }\n }\n }\n $$(\"userMenu\").hide();\n },\n\n onAfterRender() {\n this.data.each((a) => {\n ClassUI.CYPRESS_REF(this.getItemNode(a.id), a.id);\n });\n },\n },\n },\n });\n\n // Now Fill out Toolbar and Root Pages:\n //\n // Step 1: prepare the AppState so we can determine which options\n // should be pre selected.\n\n /**\n * @typedef {Object} AppState\n * @property {string} lastSelectedApp ABApplication.id of the last App selected,\n * @property {Object} lastPages a lookup of all the last selected Pages for each Application {hash} { ABApplication.id : ABPage.id }\n */\n\n // 1.1 Check for App & Page secified on the route (query params /?app=...&page=...)\n // Ref: https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams\n const queryParams = new URLSearchParams(window.location.search);\n if (queryParams.has(\"app\") && queryParams.has(\"page\")) {\n const appParam = queryParams.get(\"app\");\n // Check its a real appID to address: https://github.com/CruGlobal/ab_platform_web/security/code-scanning/630\n const app = this.AB.applicationByID(appParam);\n if (!app) {\n console.error(`Trying to Navigate to unknown app ${appParam}`);\n } else {\n this.AppState = {\n lastSelectedApp: app.id,\n lastPages: {},\n };\n this.AppState.lastPages[app.id] = queryParams.get(\"page\");\n }\n }\n\n // 1.2 Load the last app / page from storage\n this.AppState =\n this.AppState ?? (await this.AB.Storage.get(this.storageKey));\n // 1.3 Create a new AppState\n this.AppState = this.AppState ?? {\n lastSelectedApp: null,\n // {string} the ABApplication.id of the last App selected\n\n lastPages: {},\n // {hash} { ABApplication.id : ABPage.id }\n // a lookup of all the last selected Pages for each Application\n };\n\n // set default selected App if not already set\n // just choose the 1st App in the list (must have pages that we have\n // access to)\n if (!this.AppState.lastSelectedApp && menu_data.length)\n for (let i = 0; i < menu_data.length; i++)\n if (\n (\n menu_data[i].abApplication\n .pages()\n .filter((p) => p.getUserAccess?.() > 0) || []\n ).length > 0\n ) {\n this.AppState.lastSelectedApp = menu_data[i].abApplication.id;\n\n break;\n }\n\n //\n // Step 2: figure out the Default Page to be displayed.\n //\n let DefaultPage = null;\n // {ABViewPage}\n // The ABViewPage of the 1st page to display.\n\n // sidebar and NavBar are already built at this point. So we can\n // query them.\n const $sideBar = $$(\"abSidebarMenu\");\n\n if ($sideBar) {\n // search the Menu entries to see which one matches our\n // stored AppState\n let foundMenuEntry = this.sidebarMenuEntryByID(\n this.AppState.lastSelectedApp\n );\n\n if (!foundMenuEntry) {\n // if we couldn't find the entry then our .lastSelectedApp\n // must be referencing an Application we no longer have\n // access to.\n // So just pick the 1st app with pages\n for (let i = 0; i < menu_data.length; i++) {\n if ((menu_data[i].abApplication.pages() || []).length > 0) {\n foundMenuEntry =\n this.sidebarMenuEntryByID(menu_data[i].abApplication.id) ||\n null;\n\n if (foundMenuEntry) break;\n }\n }\n }\n\n if (foundMenuEntry) {\n $sideBar.select(foundMenuEntry.id);\n this.selectApplication(foundMenuEntry.id);\n\n const defaultPageID =\n this.AppState.lastPages[foundMenuEntry.abApplication.id];\n\n DefaultPage = foundMenuEntry.abApplication.pages(\n (p) => p.id === defaultPageID\n )[0];\n\n if (!DefaultPage) {\n // then just pick the first one:\n DefaultPage = foundMenuEntry.abApplication.pages()[0];\n }\n }\n }\n\n //\n // Step 3: Prime the content area with placeholders for ALL\n // Root Pages\n //\n const allPlaceholders = [];\n\n for (let i = 0; i < allApplications.length; i++) {\n const pages = allApplications[i].pages?.() || [];\n\n for (let j = 0; j < pages.length; j++) {\n if (pages[j].getUserAccess?.() === 0) continue;\n\n allPlaceholders.push({\n id: this.pageID(pages[j]),\n template: `Page: ${pages[j].label || pages[j].name}`,\n });\n }\n }\n\n if (allPlaceholders.length > 0)\n this.AB.Webix.ui(\n {\n view: \"multiview\",\n keepViews: true,\n animate: false,\n cells: allPlaceholders,\n },\n $$(\"abWorkPages\")\n );\n\n //\n // Step 4: initialize the DefaultPage\n // when it is finished we can show that page and emit \"ready\" to\n // signal we can transition to the Work Portal\n //\n if (!this.App) {\n // page.component() require a common {ABComponent.App}\n this.App = new this.AB.Class.ABComponent(\n null,\n \"portal_work\",\n this.AB\n ).App;\n }\n\n if (DefaultPage) {\n const container = new ClassUIPage(\n this.pageID(DefaultPage),\n DefaultPage,\n this.App,\n this.AB\n );\n const containerInit = async () => {\n await container.init(this.AB, true);\n this.showPage(DefaultPage);\n };\n\n this.pageContainers[DefaultPage.id] = container;\n allInits.push(containerInit());\n }\n // let pUI = DefaultPage.component(this.App);\n\n // webix.ui(pUI.ui, $$(this.pageID(DefaultPage)));\n // pUI.init();\n // pUI.onShow();\n // this.showPage(DefaultPage);\n\n //\n // Step 5: initialize the remaining Pages\n //\n for (let i = 0; i < allApplications.length; i++) {\n const pages = allApplications[i].pages?.() || [];\n\n for (let j = 0; j < pages.length; j++) {\n if (pages[j].getUserAccess?.() === 0) continue;\n\n if (!DefaultPage || pages[j].id !== DefaultPage.id) {\n const cont = new ClassUIPage(\n this.pageID(pages[j]),\n pages[j],\n this.App,\n this.AB\n );\n\n this.pageContainers[pages[j].id] = cont;\n\n allInits.push(cont.init(this.AB));\n\n // let comp = page.component(commonComp.App);\n // webix.ui(comp.ui, $$(this.pageID(page)));\n // comp.init();\n // comp.onShow();\n }\n }\n }\n\n this.refreshSettingsMenu();\n //\n // Step 6: Initialize the Inbox Items\n //\n PortalWorkInbox.on(\"updated\", () => {\n const count = PortalWorkInbox.count();\n $$(\"inbox_icon\").define({ badge: count ? count : false });\n $$(\"inbox_icon\").refresh();\n });\n\n await PortalWorkInbox.init(this.AB);\n\n //\n // Step 7: As well as the Inbox Task Window\n //\n allInits.push(PortalWorkInboxTaskWindow.init(this.AB));\n\n // Network and Queued operations Alert\n this.AB.Network.on(\"queued\", () => {\n const count = this.AB.Network.queueCount();\n if (count > 0) {\n this.networkWarningDisplay(\"no_server\", count);\n } else {\n this.networkWarningClear(\"no_server\");\n }\n });\n this.AB.Network.on(\"queue.synced\", () => {\n this.networkWarningDisplay(\"no_server\", 0);\n this.networkWarningClear(\"no_server\");\n });\n\n if (this.AB.Network.isNetworkSlow()) this.networkWarningDisplay(\"slow\");\n this.AB.Network.on(\"networkslow\", (isSlow) => {\n isSlow\n ? this.networkWarningDisplay(\"slow\")\n : this.networkWarningClear(\"slow\");\n });\n\n this.emit(\"ready\");\n\n // !!! HACK: Leave this for James to figure out why Menu Title isn't proper\n // size on initial loading.\n setTimeout(() => {\n $$(\"portal_work_menu_title\").resize();\n }, 200);\n\n // Now attempt to flush any pending network operations:\n this.AB.Network._connectionCheck();\n\n // Be sure our UI elements that don't respond to onAfterRender()\n // have their cypress references set:\n [\"portal_work_menu_pages\"].forEach((eid) => {\n ClassUI.CYPRESS_REF($$(eid));\n });\n\n await Promise.all(allInits);\n }\n\n /**\n * Display a network warning banner. Will not update if a higher priority\n * warning is already active, but will save the state in case the active\n * warning is cleared before this one. Can be called without a key to\n * update/clear exisiting warnings.\n * @param {string?} key\n */\n networkWarningDisplay(key, value) {\n if (key) this.networkWarnings[key].active = true;\n if (key && value) this.networkWarnings[key].value = value;\n\n // get the highest priority active warning\n let warning;\n for (const k in this.networkWarnings) {\n const entry = this.networkWarnings[k];\n if (!entry.active || entry.disabled) continue;\n if (!warning || warning.priority > entry.priority) {\n warning = entry;\n }\n }\n if (!warning) {\n // No active warnings so hide the banner\n $$(\"portal_work_network_warning\").hide();\n return;\n }\n $$(\"portal_work_network_warning_label\").setValue(warning.label);\n const button = $$(\"portal_work_network_warning_button\");\n if (warning.click) {\n button.define(\"click\", warning.click);\n const buttonText = (warning.button ?? \"\").replaceAll(\n \"#value#\",\n warning.value\n );\n button.define(\"label\", buttonText);\n button.refresh();\n button.show();\n } else {\n button.hide();\n }\n warning.css\n ? this.AB.Webix.html.addStyle(\n `.warning_custom_css{${warning.css}}`,\n \"warning_custom_css\"\n )\n : this.AB.Webix.html.removeStyle(\"warning_custom_css\");\n $$(\"portal_work_network_warning\").show();\n }\n /**\n * Clear a network warning\n * @param {string} key\n */\n networkWarningClear(key) {\n this.networkWarnings[key].active = false;\n // Call this.networkWarningDisplay() again in case another warning is still active\n this.networkWarningDisplay();\n }\n\n /**\n * pageID()\n * return a commone webix.id for a given ABViewPage\n * @param {ABViewPage || string} page\n * An instance of ABViewPage, OR a string of the ABViewPage.id\n * @return {string}\n */\n pageID(page) {\n return `page_${page.id || page}`;\n }\n\n selectApplication(id) {\n const row = $$(\"abSidebarMenu\").getItem(id);\n\n const pageButtons = [];\n // {array}\n // the webix menu buttons for each Page\n\n let firstPage = true;\n // {bool} firstPage\n // should we choose the 1st page as being the active page?\n\n let activePageID = null;\n // {string}\n // The ABViewPage.id of the active Page for the current Application.\n if (this.AppState.lastSelectedApp != row.abApplication.id) {\n // remember the current Application has been selected\n this.AppState.lastSelectedApp = row.abApplication.id;\n this.saveState();\n // Need to Settings Menu if different for each app\n this.refreshSettingsMenu();\n }\n\n // if the current Application already has an Active State Page marked\n // we don't want the first page:\n activePageID = this.AppState.lastPages[row.abApplication.id];\n if (activePageID) {\n firstPage = false;\n }\n\n // Build a Menu Button for each of the ABApplication Root Pages\n (row.abApplication.pages() || []).forEach((p) => {\n if (p.getUserAccess?.() == 0) return;\n // Decide if current Page button should look selected.\n let active = \"\";\n if (firstPage || p.id == activePageID) {\n active = \"activePage\";\n firstPage = false;\n\n // remember this one\n this.AppState.lastPages[row.abApplication.id] = p.id;\n }\n\n let pbLabel = p.label;\n if (\"function\" === typeof p.label) {\n pbLabel = p.label();\n }\n pageButtons.push({\n view: \"button\",\n css: active,\n type: \"icon\",\n label: pbLabel,\n autowidth: true,\n icon: `fa fa-${p.icon}`,\n abPage: p,\n click: (item) => {\n // when button is clicked, update the selected look\n const pageButton = $$(item);\n\n // Remove any other \"activePage\" entries\n $$(\"portal_work_menu_pages\")\n .queryView(\n {\n css: \"activePage\",\n },\n \"all\"\n )\n .forEach((p) => {\n if (p != pageButton) {\n p.define(\"css\", \"\");\n p.$view.classList.remove(\"activePage\");\n }\n });\n\n // make sure this one is marked\n pageButton.define(\"css\", \"activePage\");\n pageButton.$view.classList.add(\"activePage\");\n\n // now trigger the page to display:\n this.showPage(pageButton.data.abPage);\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, p.id);\n },\n },\n });\n });\n webix.ui(pageButtons, $$(\"portal_work_menu_pages\"));\n\n $$(\"portal_work_menu_title\").setValue(row.value);\n $$(\"portal_work_menu_title\").resize();\n\n // now everything is displayed\n // default initial display to current activePage:\n let selectedPage = null;\n $$(\"portal_work_menu_pages\")\n .queryView(\n {\n css: \"activePage\",\n },\n \"all\"\n )\n .forEach((p) => {\n selectedPage = p;\n });\n this.showPage(selectedPage?.data?.abPage);\n\n // hide the sidebar menu\n const sideBar = $$(\"navSidebar\");\n if (sideBar.isVisible()) {\n sideBar.hide();\n }\n }\n\n /**\n * saveState()\n * trigger a save of our current AppState.\n * NOTE: we delay this so we can catch multiple saves in a short period\n * of time.\n */\n saveState() {\n if (this._saveTimeoutID) {\n clearTimeout(this._saveTimeoutID);\n }\n this._saveTimeoutID = setTimeout(() => {\n this.AB.Storage.set(this.storageKey, this.AppState);\n }, 500);\n }\n\n show() {\n $$(\"portal_work\").show();\n }\n\n showPage(page) {\n // this could be a subpage\n const pageUI = this.pageContainers[page?.id];\n\n if (pageUI) {\n pageUI.show();\n this.AppState.lastPages[page.application.id] = page.id;\n this.saveState();\n }\n }\n\n /**\n * @method sidebarMenuEntryByID()\n * returns the sidebar menu entry that matches the given {menuID}\n * @param {string|uuid} menuID\n * @return {obj}\n */\n sidebarMenuEntryByID(menuID) {\n const $sideBar = $$(\"abSidebarMenu\");\n\n let foundMenuEntry = null;\n\n if ($sideBar) {\n // search the Menu entries to see which one matches our\n // stored AppState\n\n let id = $sideBar.getFirstId();\n while (!foundMenuEntry && id) {\n let entry = $sideBar.getItem(id);\n if (entry.abApplication.id == menuID) {\n foundMenuEntry = entry;\n }\n id = $sideBar.getNextId(id);\n }\n }\n\n return foundMenuEntry;\n }\n\n sidebarResize() {\n const sidebarMenu = $$(\"abSidebarMenu\");\n const sideBarHeight = sidebarMenu.count() * 45 + 1;\n\n sidebarMenu.define(\"height\", sideBarHeight);\n sidebarMenu.resize();\n // $$(\"abNavSidebarScrollView\").resize(true);\n }\n\n /**\n * generate the Webix definition for a menu entry given the ABApplication\n * the menu entry should represent.\n * @param {ABApplication} app\n * @return {obj} Webix.ui definition.\n */\n uiSideBarMenuEntry(app) {\n return {\n id: app.id,\n icon: `fa ${app.icon}`,\n value: app.label || app.name,\n abApplication: app,\n // This is never called:\n // on: {\n // onAfterRender() {\n // debugger;\n // ClassUI.CYPRESS_REF(this, app.id);\n // },\n // },\n };\n }\n\n refreshSettingsMenu() {\n const { uuid, roles } = this.AB.Config.userConfig();\n const application = this.AB.applicationByID(\n this.AppState.lastSelectedApp\n );\n const settingsMenuOptions = [];\n\n if (!application) return $$(\"settings_icon\").hide();\n if (application.isAccessManaged) {\n let isManager = false;\n if (\n application.accessManagers.useAccount == \"1\" &&\n application.accessManagers.account.indexOf(uuid) > -1\n ) {\n isManager = true;\n }\n if (!isManager && application.accessManagers.useRole == \"1\") {\n roles.forEach((role) => {\n if (application.accessManagers.role.indexOf(role.uuid) > -1) {\n isManager = true;\n }\n });\n }\n if (isManager) {\n settingsMenuOptions.push({\n id: \"accessLevel\",\n label: this.label(\"Access Manager\"),\n icon: \"lock\",\n });\n }\n }\n if (application.isTranslationManaged) {\n let isManager = false;\n if (\n application.translationManagers.useAccount == \"1\" &&\n application.translationManagers.account.indexOf(uuid) > -1\n ) {\n isManager = true;\n }\n if (!isManager && application.translationManagers.useRole == \"1\") {\n roles.forEach((role) => {\n if (\n application.translationManagers.role.indexOf(role.uuid) > -1\n ) {\n isManager = true;\n }\n });\n }\n if (isManager) {\n settingsMenuOptions.push({\n id: \"translation\",\n label: this.label(\"Translation Tool\"),\n icon: \"language\",\n });\n }\n }\n if (application.isTutorialManaged) {\n let isManager = false;\n if (\n application.tutorialManagers.useAccount == \"1\" &&\n application.tutorialManagers.account.indexOf(uuid) > -1\n ) {\n isManager = true;\n }\n if (!isManager && application.tutorialManagers.useRole == \"1\") {\n roles.forEach((role) => {\n if (application.tutorialManagers.role.indexOf(role.uuid) > -1) {\n isManager = true;\n }\n });\n }\n if (isManager) {\n settingsMenuOptions.push({\n id: \"tutorial\",\n label: this.label(\"Tutorial Manager\"),\n icon: \"info-circle\",\n });\n }\n }\n\n if (settingsMenuOptions.length < 1) return $$(\"settings_icon\").hide();\n\n $$(\"settings_icon\").show();\n\n webix.ui({\n view: \"popup\",\n id: \"settingsMenu\",\n width: 150,\n body: {\n view: \"list\",\n data: settingsMenuOptions,\n template: \" #label#\",\n autoheight: true,\n select: true,\n on: {\n onItemClick: (id /*, event */) => {\n switch (id) {\n case \"accessLevel\":\n PortalAccessLevelManager.init(this);\n PortalAccessLevelManager.show();\n break;\n case \"translation\":\n TranslationTool.init(this);\n TranslationTool.show();\n break;\n case \"tutorial\":\n TutorialManager.init(this);\n TutorialManager.show();\n break;\n default:\n //eslint-disable-next-line\n const item = settingsMenuOptions.filter(\n (o) => o.id == id\n )[0];\n webix.message(\n `Not yet implemented
    \n Menu item:${item.label}
    \n Menu ID:${item.id}`\n );\n }\n $$(\"settingsMenu\").hide();\n },\n\n onAfterRender() {\n this.data.each((a) => {\n ClassUI.CYPRESS_REF(this.getItemNode(a.id), a.id);\n });\n },\n },\n },\n });\n }\n\n busy() {\n $$(\"portal_work_switcheroo_user_switched_loading\")?.show();\n }\n\n ready() {\n $$(\"portal_work_switcheroo_user_switched_loading\")?.hide();\n }\n}\n\nexport default new PortalWork();\n","import ClassUI from \"./ClassUI.js\";\nimport ClassAccordionEntry from \"./portal_work_inbox_accordion.js\";\nimport PortalWorkInboxTaskWindow from \"./portal_work_inbox_taskWindow.js\";\n\nclass PortalWorkInbox extends ClassUI {\n constructor() {\n super();\n\n this.id = \"portal_work_inbox\";\n // {string}\n // the webix.id of this UI element\n\n this.entries = [];\n // {array}\n // the list of User Forms this user is able to process.\n\n this.processLookupHash = {\n /* ABProcess.id : \"Process Label\" */\n };\n\n this.appLookupHash = {\n /* ABProcess.id : \"ABApplication.id\" */\n };\n\n this.appAccordionLists = {};\n // {hash} { app.id : {accordionItemDefinition} }\n }\n\n ui() {\n var L = (...params) => {\n return this.label(...params);\n };\n\n return {\n id: this.id,\n view: \"window\",\n move: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark inbox_drawer\",\n cols: [\n { width: 7 },\n {\n view: \"label\",\n label: L(\"Inbox\"),\n },\n {\n view: \"button\",\n autowidth: true,\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(this.id).hide();\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n ],\n },\n position: function (state) {\n state.left = state.maxWidth - 350; // fixed values\n state.top = 0;\n state.width = 350; // relative values\n state.height = state.maxHeight;\n },\n body: {\n cells: [\n {\n id: \"inboxItems\",\n view: \"scrollview\",\n scroll: \"y\",\n body: {\n view: \"accordion\",\n id: \"inbox_accordion\",\n css: {\n background: \"#dadee0 !important\",\n },\n multi: true,\n rows: [],\n },\n },\n {\n id: \"emptyInbox\",\n view: \"layout\",\n hidden: true,\n css: {\n background: \"#dadee0 !important\",\n },\n rows: [\n {},\n {\n view: \"label\",\n align: \"center\",\n height: 200,\n label: \"
    \",\n },\n {\n view: \"label\",\n align: \"center\",\n label: L(\"No tasks...you're all caught up.\"),\n },\n {},\n ],\n },\n ],\n },\n };\n }\n\n init(AB) {\n this.AB = AB;\n\n // Load the { items, meta } data structure before continuing with\n // the rest of the init process.\n this.AB.Network.get({ url: \"/config/inbox\" }).then((inboxConfig) => {\n this.AB.Config.configInbox(inboxConfig);\n\n this.initDelayed(AB);\n });\n }\n\n initDelayed(AB) {\n webix.ui(this.ui());\n\n this.allAppAccordions = {};\n // {hash} { ABApplication.id : ClassAccordionEntry }\n // A lookup of all our ClassAccordionEntry(s) by their app.id\n\n //\n // Prepare our Hashes:\n //\n this.lang = this.AB.Account.language();\n (this.AB.Config.inboxMetaConfig() || []).forEach((app) => {\n this.createAccordian(app);\n });\n\n this.entries = this.AB.Config.inboxConfig() || [];\n\n this.entries.forEach((i) => this.addItem(i));\n\n var allInits = [];\n\n for (var index in this.appAccordionLists) {\n const processes = this.getProcessList(index);\n\n const accordion = this.allAppAccordions[index]\n ? this.allAppAccordions[index].unitList()\n : null;\n if (accordion) {\n const init = async () => {\n await this.allAppAccordions[index].init(this.AB);\n accordion.parse(processes);\n accordion.show();\n };\n allInits.push(init());\n } else {\n this.AB.notify.developer(\n new Error(\n `could not find an inbox-accordion for index[${index}]`\n ),\n {\n context: \"portal_work_inbox:init(): config error\",\n inboxMeta: this.AB.Config.inboxMetaConfig(),\n inbox: this.entries,\n }\n );\n }\n }\n\n return Promise.all(allInits).then(() => {\n this.emit(\"updated\");\n\n this.AB.on(\"ab.inbox.create\", async (item) => {\n const alreadyThere = this.entries.find((e) => e.uuid == item.uuid);\n if (!alreadyThere) {\n this.entries.push(item);\n // If we can't find the app's accordion in the list then add it\n const createNew = !this.appLookupHash[item.definition];\n if (createNew) {\n const [app] = await this.AB.Network.post({\n url: \"/process/inbox/meta\",\n data: { ids: [item.definition] },\n });\n this.createAccordian(app);\n }\n const appId = this.appLookupHash[item.definition];\n const accordion = this.allAppAccordions[appId];\n this.addItem(item);\n\n if (createNew) await accordion.init(this.AB);\n\n const unitList = accordion.unitList();\n unitList.parse(this.appAccordionLists[appId][item.definition]);\n unitList.show();\n unitList.refresh();\n\n accordion.show();\n }\n this.emit(\"updated\");\n });\n\n this.AB.on(\"ab.inbox.update\", (item) => {\n const appId = this.appLookupHash[item.definition];\n const accordion = this.allAppAccordions[appId];\n\n accordion.AB.Network.emit(\"inbox.update\", {\n uuid: item.uuid,\n unitID: item.definition,\n });\n });\n\n // Now Register for RT Updates to our Inbox\n this.AB.Network.post(\n {\n url: `/process/inbox/register`,\n },\n {\n key: \"inbox.register\",\n context: {},\n }\n );\n });\n }\n\n createAccordian(app) {\n if (!app) return;\n\n // convert config info with current language labels\n this.translate(app, this.lang);\n\n const appAccordion = new ClassAccordionEntry(app);\n $$(\"inbox_accordion\").addView(appAccordion.ui());\n this.allAppAccordions[app.id] = appAccordion;\n appAccordion.on(\"showTasks\", (...params) => {\n // showTasks\n // indicates when the user has selected a group of Accordian Tasks\n // to process.\n PortalWorkInboxTaskWindow.showTasks(...params);\n });\n\n appAccordion.on(\"item.processed\", (uuid) => {\n // item.processed\n // indicates when the specified form has been updated on the server.\n PortalWorkInboxTaskWindow.clearTask(uuid);\n this.entries = this.entries.filter((e) => e.uuid != uuid);\n if (this.entries.length == 0) {\n $$(\"emptyInbox\").show();\n }\n this.emit(\"updated\");\n });\n\n (app.processes || []).forEach((p) => {\n this.translate(p, this.lang);\n this.processLookupHash[p.id] = p.label;\n this.appLookupHash[p.id] = app.id;\n });\n\n return appAccordion;\n }\n\n getProcessList(index) {\n const processes = [];\n for (const process in this.appAccordionLists[index]) {\n processes.push(this.appAccordionLists[index][process]);\n }\n return processes;\n }\n\n addItem(item) {\n // item {obj} inbox configuration item\n // .definition {uuid} the process.id that generated this form\n // .name {string} the Name of this form\n //\n item.uniteLabel =\n \"{\" + item.definition + \"}\" + this.processLookupHash[item.definition];\n // create our own .uniteLabel\n // this is used within the accordion.unitlist to group the data.\n\n // find the application.id for this form\n var appId = this.appLookupHash[item.definition];\n\n // make sure we have an appAccordionLists[appID] entry\n if (!this.appAccordionLists[appId]) this.appAccordionLists[appId] = {};\n if (!this.appAccordionLists[appId][item.definition]) {\n this.appAccordionLists[appId][item.definition] = {\n id: item.definition,\n name: item.name,\n uniteLabel: item.uniteLabel,\n items: [],\n };\n }\n\n // add this as one of our items\n this.appAccordionLists[appId][item.definition].items.push(item);\n }\n\n show() {\n if (this.entries.length == 0) {\n $$(\"emptyInbox\").show();\n } else {\n $$(\"inboxItems\").show();\n }\n $$(this.id).show();\n\n for (const appId in this.allAppAccordions) {\n this.allAppAccordions[appId]?.show();\n }\n }\n\n /**\n * @method translate()\n * given an object with a .translations property, we will fill out\n * the translations for the given language.\n * @param {obj} obj\n * @param {string} lang\n * the language_code of the translations to use.\n */\n translate(obj, lang) {\n if (obj?.translations) {\n var entry = obj.translations.find((t) => t.language_code == lang);\n if (!entry) {\n entry = obj.translations[0];\n }\n if (entry) {\n Object.keys(entry).forEach((k) => {\n if (k != \"language_code\") {\n obj[k] = entry[k];\n }\n });\n }\n }\n }\n\n count() {\n return this.entries.length;\n }\n}\n\nexport default new PortalWorkInbox();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalWorkInboxAccordion extends ClassUI {\n constructor(app) {\n super();\n\n this.app = app;\n this.id = `inbox-accordion-app-holder-${this.app.id}`;\n this.idUnitList = `inbox-accordion-app-${this.app.id}`;\n }\n\n ui() {\n const self = this;\n // for .click() handler below:\n\n return {\n header: this.app.label,\n id: this.id,\n view: \"accordionitem\",\n collapsed: true,\n css: \"stayCollapsed\",\n hidden: true,\n body: {\n view: \"unitlist\",\n id: this.idUnitList,\n uniteBy: \"#uniteLabel#\",\n autoheight: true,\n css: \"inbox_unitlist\",\n type: {\n templateHeader: function (value) {\n return (\n ' ' +\n value.replace(/{(.*?)}/, \"\")\n );\n },\n headerHeight: 35,\n },\n template: function (obj) {\n return (\n obj.name +\n \" \" +\n obj.items.length +\n \"\"\n );\n },\n select: true,\n data: [],\n click: function (id /* , ev */) {\n const list = this;\n // const parent = this.getParentView();\n const selectedItem = this.getItem(id);\n\n const cells = [];\n // {array}\n // the webix defs for the Form.io forms for this selection.\n\n // const number = 1;\n selectedItem.items.forEach(function (task) {\n if (task.data?.url) {\n cells.push({\n id: \"task-holder-\" + task.uuid,\n unitlist: list,\n view: \"layout\",\n padding: 20,\n rows: [\n {\n id: task.uuid,\n view: \"iframe\",\n src: task.data.url,\n },\n ],\n });\n } else\n cells.push({\n id: \"task-holder-\" + task.uuid,\n unitlist: list,\n view: \"layout\",\n padding: 20,\n rows: [\n {\n id: task.uuid,\n view: \"formiopreview\",\n formComponents: task.ui,\n formData: task.data,\n onButton: function (value) {\n self.processItem(id, task, value);\n },\n },\n ],\n });\n });\n\n self.emit(\"showTasks\", /*list, */ selectedItem.name, cells);\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n this.data.each((a) => {\n ClassUI.CYPRESS_REF(\n this.getItemNode(a.id),\n `${self.id}_${a.id}`\n );\n });\n },\n },\n },\n // TODO: This never gets called!\n // on: {\n // onAfterRender() {\n // ClassUI.CYPRESS_REF(this);\n // },\n // },\n };\n }\n\n init(AB) {\n // prevent multiple .init() calls\n if (!this.AB) {\n this.AB = AB;\n\n this.AB.Network.on(\"inbox.update\", (context, err /* , response */) => {\n if (err && err.message) {\n webix.message(err.message);\n this.AB.notify.developer(err, {\n context:\n \"portal_work_inbox_accordion:Network[inbox.update]: error updating Inbox item\",\n info: context,\n });\n return;\n }\n\n const list = $$(this.idUnitList);\n const selectedItem = list.getItem(context.unitID);\n\n // clear out processed item from our accordion\n // prune the item from the group of similar processes in the unit list\n if (selectedItem) {\n const parent = list.getParentView();\n\n selectedItem.items = selectedItem.items.filter(function (i) {\n return i.uuid != context.uuid;\n });\n\n // refresh the unit list so we can get an update badge count\n list.refresh();\n if (selectedItem.items.length == 0) {\n // remove the item from the unit list\n list.remove(list.getSelectedId());\n // if that was the last item in the unit list remove the accordion\n if (list.count() == 0) {\n parent.hide();\n }\n }\n }\n\n this.emit(\"item.processed\", context.uuid);\n });\n }\n\n return Promise.resolve();\n }\n\n unitList() {\n return $$(this.idUnitList);\n }\n\n /**\n * @method processItem()\n * submit the current task's response back to the server.\n * @param {ABProcessForm} task\n * the current form that is being responded to.\n * @param {string} value\n * the value of the Form button returned.\n */\n processItem(unitID, task, value) {\n this.AB.Network.put(\n {\n url: `/process/inbox/${task.uuid}`,\n data: { response: value },\n },\n {\n key: \"inbox.update\",\n context: { uuid: task.uuid, unitID },\n }\n );\n\n return;\n }\n\n show() {\n $$(this.id).show();\n $$(this.id).expand();\n this.initFormIOPreview();\n }\n\n /**\n * Ensure the formio custom webix component is loaded and ready to\n * use.\n */\n initFormIOPreview() {\n this.AB.custom.formiopreview.init();\n }\n}\n\nexport default PortalWorkInboxAccordion;\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalWorkInboxTaskwindow extends ClassUI {\n constructor() {\n super();\n this.id = \"portal_work_inbox_taskwindow\";\n this.idTaskMultiview = \"taskMultiview\";\n this.idTaskTitle = \"taskTitle\";\n this.idTaskPager = \"taskPager\";\n }\n\n ui() {\n var L = (...params) => {\n return this.label(...params);\n };\n return {\n id: this.id,\n view: \"window\",\n position: function (state) {\n state.left = state.maxWidth / 2 - 800 / 2; // fixed values\n state.top = state.maxHeight / 2 - (state.maxHeight * 0.7) / 2;\n state.width = 800; // relative values\n state.height = state.maxHeight * 0.7;\n },\n modal: true,\n move: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark team-form-header\",\n cols: [\n { width: 17 },\n {\n id: this.idTaskTitle,\n view: \"label\",\n label: L(\"Your Tasks\"),\n },\n {\n view: \"button\",\n autowidth: true,\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(this.id).hide();\n // we don't want the list to look like it has still selected the item\n $$(this.idTaskMultiview)\n .getChildViews()[0]\n .config.unitlist.unselectAll();\n // reset the pager so we don't get errors when we open it next\n $$(this.idTaskPager).select(0);\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, \"inbox_taskwindow_close\");\n },\n },\n },\n ],\n },\n body: {\n rows: [\n {\n view: \"scrollview\",\n scroll: \"xy\",\n body: {\n id: this.idTaskMultiview,\n cells: [\n {\n view: \"layout\",\n padding: 20,\n rows: [\n {\n id: \"emptyTasks\",\n template: L(\"No more tasks...good job!\"),\n },\n ],\n },\n ],\n },\n },\n {\n view: \"toolbar\",\n css: \"inboxpager\",\n cols: [\n {\n id: this.idTaskPager,\n view: \"pager\",\n size: 1,\n group: 3,\n height: 45,\n master: false,\n template:\n '
    {common.first()} {common.prev()} {common.pages()} {common.next()} {common.last()}
    ',\n on: {\n onAfterRender() {\n // debugger;\n ClassUI.CYPRESS_REF(this);\n // this.data.each((a) => {\n // ClassUI.CYPRESS_REF(\n // this.getItemNode(a.id),\n // `${self.id}_${a.id}`\n // );\n // });\n },\n onBeforePageChange: (new_page /*, old_page */) => {\n var views = $$(\n this.idTaskMultiview\n ).getChildViews();\n views[parseInt(new_page)].show();\n },\n },\n },\n ],\n },\n ],\n },\n };\n }\n\n init(AB) {\n this.AB = AB;\n webix.ui(this.ui());\n\n return Promise.resolve();\n }\n\n clearTask(uuid) {\n // find out how many pages are in this multiview\n var views = $$(this.idTaskMultiview).getChildViews();\n // if there is more than one page we need to find out what the next page should be\n if (views.length > 1) {\n var taskHolder = $$(\"task-holder-\" + uuid);\n if (taskHolder) {\n // find out if we are on the last page\n if (\n $$(this.idTaskMultiview).index(taskHolder) + 1 ==\n views.length\n ) {\n // if we are on the last page we will go back to the previous page\n $$(this.idTaskMultiview).setValue(\n views[$$(this.idTaskMultiview).index(taskHolder) - 1].config\n .id\n );\n } else {\n // if we are not on the last page we will go to the next page\n $$(this.idTaskMultiview).setValue(\n views[$$(this.idTaskMultiview).index(taskHolder) + 1].config\n .id\n );\n }\n // once we move off of the page we can remove it\n $$(this.idTaskMultiview).removeView(\n views[$$(this.idTaskMultiview).index(taskHolder)]\n );\n }\n\n // // prune the item from the group of similar processes in the unit list\n // if (this.selectedItem) {\n // this.selectedItem.items = this.selectedItem.items.filter(function (\n // i\n // ) {\n // return i.uuid != uuid;\n // });\n // }\n // // refresh the unit list so we can get an update badge count\n // this.list.refresh();\n\n // now we update the pager\n // block events because we don't want it telling the multiview to change pages after we set the new value\n $$(this.idTaskPager).blockEvent();\n // set the page to the first while we rebuild the pager (or it will throw an error)\n $$(this.idTaskPager).select(0);\n // set the current number of pages to the number of views in the multiview\n $$(this.idTaskPager).define(\n \"count\",\n $$(this.idTaskMultiview).getChildViews().length\n );\n $$(this.idTaskPager).refresh();\n // set the page to the correct number because it probably changed when we removed a view above\n $$(this.idTaskPager).select(\n $$(this.idTaskMultiview).index(\n $$(this.idTaskMultiview).getActiveId()\n )\n );\n $$(this.idTaskPager).unblockEvent();\n } else {\n // no more tasks hide the modal\n $$(this.id).hide();\n // // remove the item from the unit list\n // this.list.remove(this.list.getSelectedId());\n // // if that was the last item in the unit list remove the accordion\n // if (this.list.count() == 0) {\n // parent.hide();\n // }\n }\n }\n\n hide() {\n $$(this.id).hide();\n }\n\n show() {\n $$(this.id).show();\n }\n\n showTasks(/* unitList, */ selectedItemName, cells) {\n // this.list = unitList;\n // this.selectedItem = selectedItem;\n webix.ui(\n {\n id: this.idTaskMultiview,\n cells: cells,\n },\n $$(this.idTaskMultiview)\n );\n\n $$(this.idTaskTitle).define(\"label\", selectedItemName);\n $$(this.idTaskPager).define(\"count\", cells.length);\n $$(this.idTaskPager).refresh();\n $$(this.id).show();\n }\n}\n\nexport default new PortalWorkInboxTaskwindow();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalWorkTaskUserForm extends ClassUI {\n constructor() {\n super(\"portal_work_task_user_form\", {\n formIO: \"\",\n });\n }\n\n ui() {\n const ids = this.ids;\n\n return {\n id: ids.component,\n view: \"window\",\n height: 500,\n width: 600,\n position: \"center\",\n modal: true,\n move: true,\n resize: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n css: { cursor: \"move\" },\n },\n // {\n // view: \"label\",\n // label: this.label(\"\"),\n // autowidth: true,\n // },\n // {},\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n this.hide();\n },\n },\n ],\n },\n body: {\n view: \"layout\",\n padding: 10,\n rows: [this.uiFormIO()],\n },\n };\n }\n\n uiFormIO(\n processId,\n taskId,\n instanceId,\n formComponents = { components: [] },\n formData\n ) {\n const ids = this.ids;\n const _this = this;\n\n return {\n id: ids.formIO,\n view: \"formiopreview\",\n processId,\n taskId,\n instanceId,\n formComponents: formComponents,\n formData,\n onButton: function () {\n _this.submitData(this.processId, this.taskId, this.instanceId);\n },\n };\n }\n\n refreshFormIO(\n processId,\n taskId,\n instanceId,\n formComponents = { components: [] },\n formData\n ) {\n const ids = this.ids;\n const formIoDef = this.uiFormIO(\n processId,\n taskId,\n instanceId,\n formComponents,\n formData\n );\n\n this.AB.Webix.ui(formIoDef, $$(ids.formIO));\n }\n\n init(AB) {\n const ui = this.ui();\n\n this.AB = AB;\n this.AB.custom.formiopreview.init();\n this.AB.Webix.ui(ui);\n this.AB.on(\"ab.task.userform\", (data) => {\n this.refreshFormIO(\n data.processId,\n data.taskId,\n data.instanceId,\n data.formio,\n data.formData\n );\n this.show();\n });\n }\n\n show() {\n const $popup = $$(this.ids.component);\n try {\n $popup?.show();\n } catch {\n // Catch the error i.render is not function.\n }\n }\n\n hide() {\n const $popup = $$(this.ids.component);\n $popup?.hide();\n }\n\n submitData(processID, taskID, instanceID) {\n const ids = this.ids;\n const values = $$(ids.formIO)?._formio?.instance?.data ?? null;\n if (!values) return;\n\n this.AB.Network.post({\n url: `/process/userform/${processID}/${taskID}`,\n data: {\n instanceID,\n values,\n },\n });\n\n this.hide();\n }\n}\n\nexport default new PortalWorkTaskUserForm();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalWorkUserMobileQR extends ClassUI {\n constructor() {\n super(\"portal_work_user_qr_window\", {\n // taskMultiview:\"\",\n description: \"\",\n instructions: \"\",\n title: \"\",\n qrcode: \"\",\n taskPager: \"\",\n });\n }\n\n ui() {\n var L = (...params) => {\n return this.label(...params);\n };\n const ids = this.ids;\n return {\n id: ids.component,\n view: \"window\",\n position: function (state) {\n state.left = state.maxWidth / 2 - 600 / 2; // fixed values\n state.top = state.maxHeight / 2 - (state.maxHeight * 0.7) / 2;\n state.width = 500; // relative values\n state.height = 400;\n },\n modal: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n { width: 17 },\n {\n id: ids.title,\n view: \"label\",\n label: L(\"Connect Mobile App\"),\n },\n {\n view: \"button\",\n type: \"icon\",\n css: \"webix_transparent\",\n width: 40,\n icon: \"fa fa-repeat\",\n click: () => {\n $$(\"qr-code-image\").refresh();\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, \"qr_image_reload\");\n },\n },\n },\n {\n view: \"button\",\n type: \"icon\",\n css: \"webix_transparent\",\n width: 40,\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(ids.component).hide();\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, \"qr_window_close\");\n },\n },\n },\n ],\n },\n body: {\n css: { \"text-align\": \"center\" },\n rows: [\n { height: 10 },\n {\n id: ids.description,\n borderless: true,\n template: `The App's Description should go here.`,\n },\n {\n id: ids.instructions,\n borderless: true,\n template: `${L(\n \"Use your phone's camera app to scan this QR code, and it will open a webpage to the {0} mobile app. You only need to scan the code for the first time.\"\n )}`,\n },\n {\n id: ids.qrcode,\n height: 175,\n borderless: true,\n // autoheight: true,\n autowidth: true,\n template:\n \"\",\n },\n\n {},\n // {\n // borderless: true,\n // template: `
    ${L(\n // \"This code can only be used once. It will expire after 7 days.\"\n // )}
    `,\n // },\n ],\n },\n };\n }\n\n init(AB) {\n this.AB = AB;\n webix.ui(this.ui());\n\n return Promise.resolve();\n }\n\n load(App) {\n var L = (...params) => {\n return this.label(...params);\n };\n\n // change Title\n let $title = $$(this.ids.title);\n $title.define(\"label\", App.label);\n $title.refresh();\n\n // Change Description\n let $desc = $$(this.ids.description);\n $desc.define(\n \"template\",\n `${App.description}`\n );\n $desc.refresh();\n\n let $instr = $$(this.ids.instructions);\n $instr.define(\n \"template\",\n `${L(\n \"Use your phone's camera app to scan this QR code, and it will open a webpage to the {0} mobile app. You only need to scan the code for the first time.\",\n [App.label]\n )}`\n );\n\n // Change QR Image\n let $qrcode = $$(this.ids.qrcode);\n $qrcode.define(\n \"template\",\n ``\n );\n $qrcode.refresh();\n\n $$(this.ids.component)?.refresh?.();\n }\n\n hide() {\n $$(this.ids.component).hide();\n }\n\n show() {\n $$(this.ids.component).show();\n }\n}\n\nexport default new PortalWorkUserMobileQR();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalWorkUserProfileWindow extends ClassUI {\n constructor() {\n super(\"portal_work_user_profile_window\", {\n imageUser: \"\",\n uploaderImage: \"\",\n formUserInfo: \"\",\n\n dataEmail: \"\",\n editModeEmail: \"\",\n buttonEditModeEmail: \"\",\n editModeButtonsEmail: \"\",\n\n dataLanguage: \"\",\n editModeLanguage: \"\",\n buttonEditModeLanguage: \"\",\n editModeButtonsLanguage: \"\",\n\n formNewPassword: \"\",\n fieldNewPassword: \"\",\n systemNotification: \"\",\n advanceOptions: \"\",\n });\n }\n\n ui() {\n const ids = this.ids;\n const L = (...params) => {\n return this.label(...params);\n };\n\n // [fix] preventing console 404 errors when user doesn't have an Account Image:\n let acctImageID = this.AB.Account.imageID();\n let imgTemplate = ``;\n let imgErrorDiv = `
    `;\n\n if (acctImageID) {\n imgTemplate = `${imgTemplate}${imgErrorDiv}`; // show both in case value is invalid\n } else {\n imgTemplate = imgErrorDiv.replace(\"none;\", \"block;\"); // show the Div\n }\n\n return {\n id: ids.component,\n view: \"window\",\n position: \"center\",\n modal: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n { width: 7 },\n {\n view: \"label\",\n label: L(\"User Profile\"),\n },\n {\n view: \"button\",\n autowidth: true,\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n on: {\n onItemClick() {\n $$(ids.component).hide();\n },\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, \"user-profile-close\");\n },\n },\n },\n ],\n },\n // body: {\n // view: \"scrollview\",\n // minHeight: 455,\n body: {\n view: \"layout\",\n width: 460,\n rows: [\n {\n rows: [\n {\n id: ids.imageUser,\n view: \"template\",\n autoheight: true,\n borderless: true,\n css: {\n background: \"#222f3e\",\n },\n // width: 160,\n template: imgTemplate,\n },\n {\n css: {\n position: \"absolute\",\n top: \"185px\",\n },\n cols: [\n {},\n {\n id: ids.uploaderImage,\n view: \"uploader\",\n type: \"icon\",\n width: 34,\n height: 32,\n zIndex: 999,\n icon: \"fa fa-upload\",\n algin: \"center\",\n inputName: \"file\",\n apiOnly: true,\n multiple: false,\n accept:\n \"image/png, image/gif, image/jpeg, image/bmp\",\n // Image field\n upload: `/file/upload/${\n this.AB.objectUser().id\n }/6383ce19-b344-44ee-87e6-decced7361f8/1`,\n on: {\n // when upload is complete:\n onFileUpload: async (item, response) => {\n const imageID = response.data.uuid;\n\n const $uploaderImage = $$(\n ids.uploaderImage\n );\n const $imageUser = $$(ids.imageUser);\n\n $uploaderImage.disable();\n\n // await this.AB.Network.put({\n // url: `/app_builder/model/${\n // this.AB.objectUser().id\n // }/${this.AB.Account.uuid()}`,\n // data: {\n // image_id: response.data.uuid,\n // },\n // });\n await this.AB.objectUser()\n .model()\n .update(this.AB.Account.uuid(), {\n image_id: response.data.uuid,\n });\n\n this.AB.Account._config.image_id = imageID;\n\n $imageUser.setHTML(\n `
    `\n );\n $uploaderImage.enable();\n },\n\n // if an error was returned\n onFileUploadError: (item, response) => {\n const error = new Error(response);\n\n const $uploaderImage = $$(\n ids.uploaderImage\n );\n\n $uploaderImage.enable();\n\n this.AB.notify.developer(error, {\n context: \"Error uploading file\",\n });\n webix.alert(error);\n },\n },\n },\n {},\n ],\n },\n {\n id: ids.formUserInfo,\n view: \"form\",\n width: 460,\n height: 160,\n borderless: true,\n css: {\n position: \"relative\",\n top: \"15px\",\n },\n elements: [\n {\n css: {\n \"border-bottom\": \"1px solid #dee2e6\",\n \"margin-top\": \"0 !important\",\n },\n cols: [\n {\n view: \"label\",\n width: 160,\n // align: \"right\",\n label: L(\"Tenant\"),\n },\n {\n view: \"label\",\n name: \"tenant\",\n value: \"\",\n css: \"formText\",\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(\n this,\n \"user_profile_tenant\"\n );\n },\n },\n },\n ],\n },\n {\n css: {\n \"border-bottom\": \"1px solid #dee2e6\",\n \"margin-top\": \"0 !important\",\n },\n cols: [\n {\n view: \"label\",\n width: 160,\n // align: \"right\",\n label: L(\"Username\"),\n },\n {\n view: \"label\",\n name: \"username\",\n value: \"\",\n css: \"formText\",\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(\n this,\n \"user_profile_username\"\n );\n },\n },\n },\n ],\n },\n {\n css: {\n \"border-bottom\": \"1px solid #dee2e6\",\n \"margin-top\": \"0 !important\",\n },\n cols: [\n {\n view: \"label\",\n width: 160,\n // align: \"right\",\n label: L(\"Email\"),\n },\n {\n id: ids.dataEmail,\n view: \"label\",\n name: \"email\",\n value: \"\",\n css: \"formText\",\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(\n this,\n \"user_profile_email\"\n );\n },\n },\n },\n {\n id: ids.editModeEmail,\n view: \"text\",\n hidden: true,\n value: \"\",\n },\n {\n id: ids.buttonEditModeEmail,\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-pencil\",\n width: 40,\n inputWidth: 40,\n on: {\n onItemClick: () => {\n const $dataEmail = $$(ids.dataEmail);\n const $editModeEmail = $$(\n ids.editModeEmail\n );\n const $buttonEditModeEmail = $$(\n ids.buttonEditModeEmail\n );\n const $editModeButtonsEmail = $$(\n ids.editModeButtonsEmail\n );\n\n $editModeEmail.setValue(\n this.AB.Account.email()\n );\n\n $dataEmail.hide();\n $buttonEditModeEmail.hide();\n\n $editModeEmail.show();\n $editModeButtonsEmail.show();\n },\n },\n },\n {\n id: ids.editModeButtonsEmail,\n hidden: true,\n cols: [\n {\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-close\",\n width: 40,\n inputWidth: 40,\n css: \"webix_danger\",\n on: {\n onItemClick: () => {\n const $dataEmail = $$(\n ids.dataEmail\n );\n const $editModeEmail = $$(\n ids.editModeEmail\n );\n const $buttonEditModeEmail = $$(\n ids.buttonEditModeEmail\n );\n const $editModeButtonsEmail =\n $$(ids.editModeButtonsEmail);\n\n $editModeEmail.hide();\n $editModeButtonsEmail.hide();\n\n $dataEmail.show();\n $buttonEditModeEmail.show();\n },\n },\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-check\",\n width: 40,\n inputWidth: 40,\n css: \"webix_primary\",\n on: {\n onItemClick: async () => {\n const $dataEmail = $$(\n ids.dataEmail\n );\n const $editModeEmail = $$(\n ids.editModeEmail\n );\n const $buttonEditModeEmail = $$(\n ids.buttonEditModeEmail\n );\n const $editModeButtonsEmail =\n $$(ids.editModeButtonsEmail);\n\n $editModeEmail.hide();\n $editModeButtonsEmail.hide();\n\n $dataEmail.show();\n $buttonEditModeEmail.show();\n\n try {\n const email =\n $editModeEmail.getValue();\n\n $buttonEditModeEmail.disable();\n\n // await this.AB.Network.put({\n // url: `/app_builder/model/${\n // this.AB.objectUser().id\n // }/${this.AB.Account.uuid()}`,\n // data: {\n // email,\n // },\n // });\n await this.AB.objectUser()\n .model()\n .update(\n this.AB.Account.uuid(),\n { email }\n );\n\n this.AB.Account._config.email =\n email;\n } catch (error) {\n this.AB.notify.developer(\n error,\n {\n context:\n \"error updating user profile email\",\n }\n );\n } finally {\n $dataEmail.setValue(\n this.AB.Account.email()\n );\n $buttonEditModeEmail.enable();\n }\n },\n },\n },\n ],\n },\n ],\n },\n {\n css: {\n \"margin-top\": \"0 !important\",\n },\n cols: [\n {\n view: \"label\",\n width: 160,\n // align: \"right\",\n label: L(\"Language\"),\n },\n {\n id: ids.dataLanguage,\n view: \"label\",\n name: \"language\",\n value: \"\",\n css: \"formText\",\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(\n this,\n \"user_profile_language\"\n );\n },\n },\n },\n {\n id: ids.editModeLanguage,\n view: \"combo\",\n hidden: true,\n value: null,\n options: [],\n },\n {\n id: ids.buttonEditModeLanguage,\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-pencil\",\n width: 40,\n inputWidth: 40,\n on: {\n onItemClick: async () => {\n const $dataLanguage = $$(\n ids.dataLanguage\n );\n const $editModeLanguage = $$(\n ids.editModeLanguage\n );\n const $buttonEditModeLanguage = $$(\n ids.buttonEditModeLanguage\n );\n const $editModeButtonsLanguage = $$(\n ids.editModeButtonsLanguage\n );\n\n $buttonEditModeLanguage.disable();\n\n $editModeLanguage.define(\n \"options\",\n await this.getLanguages()\n );\n $editModeLanguage.refresh();\n $editModeLanguage.setValue(\n this.AB.Account.language()\n );\n\n $dataLanguage.hide();\n $buttonEditModeLanguage.hide();\n\n $editModeLanguage.show();\n $editModeButtonsLanguage.show();\n },\n },\n },\n {\n id: ids.editModeButtonsLanguage,\n hidden: true,\n cols: [\n {\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-close\",\n width: 40,\n inputWidth: 40,\n css: \"webix_danger\",\n on: {\n onItemClick: async () => {\n const $dataLanguage = $$(\n ids.dataLanguage\n );\n const $editModeLanguage = $$(\n ids.editModeLanguage\n );\n const $buttonEditModeLanguage =\n $$(\n ids.buttonEditModeLanguage\n );\n const $editModeButtonsLanguage =\n $$(\n ids.editModeButtonsLanguage\n );\n\n $editModeLanguage.hide();\n $editModeButtonsLanguage.hide();\n\n $dataLanguage.show();\n $buttonEditModeLanguage.show();\n\n try {\n $dataLanguage.setValue(\n await this.languageCodeToWord(\n this.AB.Account.language()\n )\n );\n } catch (error) {\n $dataLanguage.setValue(null);\n this.AB.notify.developer(\n error,\n {\n context:\n \"portal_work_user_profile_window: Error updating language\",\n }\n );\n } finally {\n $buttonEditModeLanguage.enable();\n }\n },\n },\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-check\",\n width: 40,\n inputWidth: 40,\n css: \"webix_primary\",\n on: {\n onItemClick: async () => {\n const $dataLanguage = $$(\n ids.dataLanguage\n );\n const $editModeLanguage = $$(\n ids.editModeLanguage\n );\n const $buttonEditModeLanguage =\n $$(\n ids.buttonEditModeLanguage\n );\n const $editModeButtonsLanguage =\n $$(\n ids.editModeButtonsLanguage\n );\n\n $editModeLanguage.hide();\n $editModeButtonsLanguage.hide();\n\n $dataLanguage.show();\n $buttonEditModeLanguage.show();\n\n try {\n const languageCode =\n $editModeLanguage.getValue();\n\n // await this.AB.Network.put({\n // url: `/app_builder/model/${\n // this.AB.objectUser().id\n // }/${this.AB.Account.uuid()}`,\n // data: {\n // languageCode,\n // },\n // });\n await this.AB.objectUser()\n .model()\n .update(\n this.AB.Account.uuid(),\n { languageCode }\n );\n\n this.AB.Account._config.languageCode =\n languageCode;\n } catch (error) {\n this.AB.notify.developer(\n error,\n {\n context:\n \"portal_work_user_profile_window: Error updating language Code\",\n }\n );\n } finally {\n try {\n $dataLanguage.setValue(\n await this.languageCodeToWord(\n this.AB.Account.language()\n )\n );\n } catch (error) {\n $dataLanguage.setValue(\n null\n );\n\n this.AB.notify.developer(\n error,\n {\n context:\n \"portal_work_user_profile_window: Error updating languageCodeToWord()\",\n }\n );\n }\n\n $buttonEditModeLanguage.enable();\n }\n },\n },\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n {\n rows: [\n {\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-angle-down\",\n height: 40,\n css: \"webix_primary\",\n label: L(\"Advanced Options\"),\n on: {\n onItemClick: (id) => {\n const $button = $$(id);\n const $advanceOptions = $$(ids.advanceOptions);\n\n if ($advanceOptions.isVisible()) {\n $button.define(\"icon\", \"wxi-angle-down\");\n $button.refresh();\n $advanceOptions.hide();\n } else {\n $button.define(\"icon\", \"wxi-angle-up\");\n $button.refresh();\n $advanceOptions.show();\n }\n },\n },\n },\n {\n id: ids.advanceOptions,\n hidden: true,\n rows: [\n {\n view: \"form\",\n width: 460,\n borderless: true,\n elements: [\n {\n cols: [\n {\n rows: [\n {\n height: 3,\n },\n {\n view: \"label\",\n width: 160,\n // align: \"right\",\n label: L(\"New Password\"),\n },\n {},\n ],\n },\n {\n id: ids.formNewPassword,\n view: \"form\",\n borderless: true,\n width: 260,\n padding: 0,\n elements: [\n {\n id: ids.fieldNewPassword,\n view: \"text\",\n name: \"newPassword\",\n type: \"password\",\n placeholder: L(\n \"Enter a new Password (at least 8)\"\n ),\n value: \"\",\n validate: (value) => {\n return value.length >= 8;\n },\n },\n {\n view: \"text\",\n name: \"confirmPassword\",\n type: \"password\",\n placeholder:\n L(\"Confirm Password\"),\n value: \"\",\n validate: (value) => {\n const $fieldNewPassword = $$(\n ids.fieldNewPassword\n );\n\n return (\n value ===\n $fieldNewPassword.getValue()\n );\n },\n },\n {\n view: \"button\",\n type: \"form\",\n value: \"Save\",\n align: \"right\",\n height: 32,\n width: 75,\n inputWidth: 75,\n css: \"webix_primary\",\n on: {\n onItemClick: async (id) => {\n const $formNewPassword =\n $$(\n ids.formNewPassword\n );\n const $thisButton =\n $$(id);\n\n if (\n $formNewPassword.validate()\n ) {\n try {\n const $fieldNewPassword =\n $$(\n ids.fieldNewPassword\n );\n const password =\n $fieldNewPassword.getValue();\n\n $thisButton.disable();\n $formNewPassword.disable();\n\n await this.AB.Network.post(\n {\n url: \"/auth/password/reset\",\n data: {\n password,\n },\n },\n {\n key: \"portal_auth_password_reset\",\n context: {},\n }\n );\n } catch (error) {\n this.AB.notify.developer(\n error,\n {\n context:\n \"portal_work_user_profile_window:Error resetting password\",\n }\n );\n } finally {\n $formNewPassword.clear();\n $formNewPassword.enable();\n $thisButton.enable();\n }\n webix.alert(\n \"The new password is successfully updated!\"\n );\n }\n },\n },\n },\n ],\n },\n ],\n },\n {\n css: {\n \"border-top\": \"1px solid #dee2e6\",\n },\n cols: [\n {\n view: \"label\",\n width: 160,\n // align: \"right\",\n label: L(\"System Notification\"),\n },\n {\n id: ids.systemNotification,\n view: \"checkbox\",\n borderless: true,\n width: 27,\n css: {\n \"text-align\": \"center !important\",\n padding: \"0 10px\",\n },\n value: 0,\n on: {\n onItemClick: async () => {\n const $systemNotification = $$(\n ids.systemNotification\n );\n\n try {\n const sendEmailNotifications =\n $systemNotification.getValue();\n // await this.AB.Network.put({\n // url: `/app_builder/model/${\n // this.AB.objectUser().id\n // }/${this.AB.Account.uuid()}`,\n // data: {\n // sendEmailNotifications,\n // },\n // });\n\n await this.AB.objectUser()\n .model()\n .update(\n this.AB.Account.uuid(),\n {\n sendEmailNotifications,\n }\n );\n\n this.AB.Account._config.sendEmailNotifications =\n sendEmailNotifications;\n } catch (error) {\n this.AB.notify.developer(\n error,\n {\n context:\n \"portal_work_user_profile_window:Error updating email notifications\",\n }\n );\n } finally {\n $systemNotification.setValue(\n this.AB.Account.sendEmailNotifications()\n );\n }\n },\n },\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n // },\n };\n }\n\n async init(AB) {\n this.AB = AB;\n\n webix.ui(this.ui());\n }\n\n async languageCodeToWord(code) {\n if (typeof code !== \"string\")\n throw new Error('The argrument \"code\" should be a string');\n\n const languages = await this.getLanguages();\n for (let i = 0; i < languages.length; i++)\n if (languages[i].id === code) return languages[i].value;\n\n return null;\n }\n\n async getLanguages() {\n const data = [];\n\n try {\n const Language = this.AB.objectLanguage();\n const response = await Language.model().findAll();\n for (let i = 0; i < response.data.length; i++)\n data.push({\n id: response.data[i].language_code,\n value: response.data[i].language_label,\n });\n } catch (error) {\n this.AB.notify.developer(error, {\n context: \"Error getting Languages\",\n });\n }\n\n return data;\n }\n\n async populate() {\n const ids = this.ids;\n\n const $formUserInfo = $$(ids.formUserInfo);\n const $systemNotification = $$(ids.systemNotification);\n\n const populateLanguage = async () => {\n const $dataLanguage = $$(ids.dataLanguage);\n const $buttonEditModeLanguage = $$(ids.buttonEditModeLanguage);\n\n $buttonEditModeLanguage.disable();\n\n try {\n $dataLanguage.setValue(\n await this.languageCodeToWord(this.AB.Account.language())\n );\n } catch (error) {\n $dataLanguage.setValue(null);\n\n this.AB.notify.developer(error, {\n context: \"Error setting Languages\",\n });\n }\n\n $buttonEditModeLanguage.enable();\n };\n\n populateLanguage();\n $formUserInfo.setValues({\n tenant: this.AB.Tenant.id(),\n username: this.AB.Account.username(),\n email: this.AB.Account.email(),\n });\n $systemNotification.setValue(this.AB.Account.sendEmailNotifications());\n }\n\n hide() {\n const ids = this.ids;\n\n const $component = $$(ids.component);\n\n $component.hide();\n }\n\n show() {\n const ids = this.ids;\n\n const $component = $$(ids.component);\n\n $component.show();\n\n this.populate();\n }\n}\n\nexport default new PortalWorkUserProfileWindow();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalWorkUserQRWindow extends ClassUI {\n constructor() {\n super();\n this.id = \"portal_work_user_qr_window\";\n this.idTaskMultiview = \"taskMultiview\";\n this.idTaskTitle = \"taskTitle\";\n this.idTaskPager = \"taskPager\";\n this.classQrImageDom = \"qr-code-image-dom\";\n }\n\n ui() {\n var L = (...params) => {\n return this.label(...params);\n };\n return {\n id: this.id,\n view: \"window\",\n position: function (state) {\n state.left = state.maxWidth / 2 - 600 / 2; // fixed values\n state.top = state.maxHeight / 2 - (state.maxHeight * 0.7) / 2;\n state.width = 500; // relative values\n state.height = 400;\n },\n modal: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n { width: 17 },\n {\n id: this.idTaskTitle,\n view: \"label\",\n label: L(\"Connect Mobile App\"),\n },\n {\n view: \"button\",\n type: \"icon\",\n css: \"webix_transparent\",\n width: 40,\n icon: \"fa fa-repeat\",\n click: () => {\n $$(\"qr-code-image\").refresh();\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, \"qr_image_reload\");\n },\n },\n },\n {\n view: \"button\",\n type: \"icon\",\n css: \"webix_transparent\",\n width: 40,\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(this.id).hide();\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, \"qr_window_close\");\n },\n },\n },\n ],\n },\n body: {\n css: { \"text-align\": \"center\" },\n rows: [\n { height: 10 },\n {\n borderless: true,\n template: `${L(\n \"Use your phone's camera app to scan this QR code, and it will open a webpage to the conneXted mobile app. You only need to scan the code for the first time.\"\n )}`,\n },\n {\n id: \"qr-code-image\",\n borderless: true,\n autoheight: true,\n autowidth: true,\n template: ``,\n on: {\n onAfterRender: () => {\n const $img = $$(\n \"qr-code-image\"\n ).$view.getElementsByClassName(this.classQrImageDom)[0];\n $img.onload = () => {\n $$(\"qr-code-image\").adjust();\n };\n },\n },\n },\n\n {\n borderless: true,\n template: `
    ${L(\n \"This code can only be used once. It will expire after 7 days.\"\n )}
    `,\n },\n ],\n },\n };\n }\n\n init(AB) {\n this.AB = AB;\n webix.ui(this.ui());\n\n return Promise.resolve();\n }\n\n hide() {\n $$(this.id).hide();\n }\n\n show() {\n $$(this.id).show();\n }\n}\n\nexport default new PortalWorkUserQRWindow();\n","import ClassUI from \"./ClassUI.js\";\n\nvar myClass = null;\n// Singleton.\n// This UI gets imported several times so let's not recreate the class each time.\n\nif (!myClass) {\n myClass = class PortalWorkUserSwitcheroo extends ClassUI {\n constructor() {\n super(\"portal_work_user_switcheroo\", {\n userIcon: \"\",\n userName: \"\",\n switchBack: \"\",\n switchBackReplacer: \"\",\n list: \"\",\n });\n }\n\n ui() {\n var L = (...params) => {\n return this.label(...params);\n };\n const ids = this.ids;\n return {\n id: ids.component,\n view: \"window\",\n position: \"center\",\n hidden: true,\n close: true,\n modal: true,\n css: \"switcheroo\",\n head: L(\"Switcheroo\"),\n body: {\n padding: 10,\n rows: [\n {\n height: 30,\n cols: [\n {\n id: ids.userIcon,\n view: \"label\",\n align: \"center\",\n width: 44,\n },\n {\n id: ids.userName,\n view: \"label\",\n align: \"center\",\n },\n {\n id: ids.switchBack,\n view: \"button\",\n value: '
    ',\n align: \"center\",\n css: \"webix_transparent\",\n width: 44,\n on: {\n onItemClick: () => {\n this.switchUser();\n this.hide();\n },\n },\n },\n {\n id: ids.switchBackReplacer,\n width: 44,\n },\n ],\n },\n {\n view: \"label\",\n label: L(\"View site as:\"),\n align: \"left\",\n },\n {\n id: ids.list,\n },\n {\n cols: [\n {\n view: \"button\",\n value: L(\"Switch\"),\n css: \"webix_primary\",\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(\n this,\n \"switcheroo_switch_button\"\n );\n },\n onItemClick: () => {\n const userID = $$(ids.list).getValue();\n\n if (!userID) {\n webix.message(L(\"Please select a user.\"));\n\n return;\n }\n\n this.switchUser(userID);\n this.hide();\n },\n },\n },\n ],\n },\n ],\n },\n };\n }\n\n init(AB, headless = false) {\n this.AB = AB;\n if (!headless) {\n webix.ui(this.ui());\n this.populate();\n }\n\n return Promise.resolve();\n }\n\n hide() {\n $$(this.ids.component).hide();\n }\n\n show() {\n $$(this.ids.component).show();\n }\n\n // const clearPopupUserMenu = () => {\n // $$(\"switcheroo_list\").setValue(\"\");\n // $$(\"switcheroo\").hide();\n // $$(\"userMenu_list\").unselectAll();\n // $$(\"userMenu_list\").show();\n // };\n\n async switcherooClear() {\n return this.switchUser(null);\n }\n\n async switchUser(userID) {\n const user = (this.AB.Account.userList() || []).find(\n (e) => e.uuid === userID\n );\n\n // Save to a switched user.\n if (!user || !userID) {\n // if no user, then remove our current Switcheroo assignment\n /* let response = */ await this.AB.Network.delete({\n url: `/auth/switcheroo`,\n // data: {},\n });\n } else {\n /* let response = */ await this.AB.Network.post({\n url: `/auth/switcheroo/${user.uuid}`,\n // data: {},\n });\n }\n\n window.location.reload(true);\n }\n\n populate() {\n const ids = this.ids;\n\n const mainUserID = this.AB.Account.uuid();\n const userList = (this.AB.Account.userList() || [])\n .filter((e) => e.uuid !== mainUserID)\n .map((u) => {\n return { id: u.uuid, value: u.username };\n });\n\n let switchedUserID = null;\n if (this.AB.Account.isSwitcherood()) {\n switchedUserID = mainUserID;\n }\n webix.ui(\n {\n id: ids.list,\n view: \"combo\",\n options: {\n body: {\n template: (obj) => {\n if (obj.id === switchedUserID)\n return ` ${obj.value}`;\n return `${obj.value}`;\n },\n },\n data: userList,\n },\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(this, \"switcheroo_user_list\");\n },\n onItemClick: (id) => {\n $$(id).setValue(\"\");\n },\n },\n },\n $$(ids.list)\n );\n $$(ids.userName).setValue(this.AB.Account.username());\n\n if (this.AB.Account.isSwitcherood()) {\n $$(ids.userIcon).setValue(\n \"\"\n );\n $$(ids.switchBackReplacer)?.hide();\n $$(ids.switchBack)?.show();\n return;\n }\n\n $$(ids.userIcon).setValue(\"\");\n $$(ids.switchBack).hide();\n $$(ids.switchBackReplacer).show();\n }\n };\n}\nexport default new myClass();\n","import ClassUI from \"./ClassUI.js\";\nimport Portal from \"./portal.js\";\n\nclass UI extends ClassUI {\n constructor() {\n super();\n\n this.hiddenElements = [];\n }\n\n ui() {\n return {\n id: \"labelClickToEnter\",\n view: \"label\",\n label: \"Hello\",\n on: {\n onItemClick: (/* id, e */) => {\n this.portalShow();\n },\n },\n };\n }\n\n init(AB) {\n this.AB = AB;\n var entryLabel = this.AB.Tenant.textClickToEnter;\n if (entryLabel) {\n $$(\"labelClickToEnter\").define({\n label: entryLabel,\n });\n }\n\n // by not sending an id param, this creates it's own div.\n this.popup = Portal.attach();\n\n // AB.on(\"error\", (error) => {\n // console.error(\"ui.on(error): \", error);\n // });\n\n return Portal.init(AB).then(() => {\n if (this.AB.Config.setting(\"autoenter\")) {\n this.portalShow();\n } else {\n this.portalHide();\n }\n });\n }\n\n portalHide() {\n // show our link to enter\n this.popup.hide();\n }\n\n portalShow() {\n // show our portal\n this.popup.show();\n }\n}\n\nexport default new UI();\n","/**\n * Performance - utility to track performance of the web platform\n * Written initally for sentry, but could be extended to support others\n * tracking tools.\n * Also supports the User timing API for lighthouse / local dev\n */\n\nimport * as Sentry from \"@sentry/browser\";\n/* These come from the DefinePlugin in webpack */\nlet webpackMode = \"development\";\nlet version, dsn;\ntry {\n /* global WEBPACK_MODE SENTRY_DSN VERSION */\n webpackMode = WEBPACK_MODE;\n dsn = SENTRY_DSN;\n version = VERSION;\n} catch (err) {\n console.warn(\n \"Error reading from webpack, check the DefinePlugin is working correctly\",\n err\n );\n}\n\nconst mode = dsn\n ? \"sentry\"\n : webpackMode === \"development\"\n ? \"browser\"\n : undefined;\n\n// Following are performance tracking sources, will be accessed through the\n// PerfomanceInterface\n\n/*\n * Default - performance tracking disabled\n */\nclass Performance {\n init() {}\n error() {}\n mark() {}\n measure() {}\n notify(domain, error, info) {\n console.groupCollapsed(`Notify ${domain}: ${error?.message ?? \"\"}`);\n console.error(error);\n console.log(\"info\", info);\n console.groupEnd();\n }\n setContext() {}\n}\n\n/*\n * Sentry perfomance tracking\n */\nclass SentryPerformance extends Performance {\n constructor() {\n super();\n this.childSpans = {};\n }\n\n init() {\n Sentry.init({\n dsn,\n environment: webpackMode,\n release: version,\n integrations: [new Sentry.BrowserTracing()],\n normalizeDepth: 5,\n sampleRate: 0.05,\n tracesSampleRate: 0.05,\n });\n }\n\n error(err) {\n Sentry.captureException(err);\n }\n\n mark(key, context = {}) {\n context.name = key;\n if (!this.mainSpan) {\n this.mainSpanKey = key;\n this.mainSpan = Sentry.startTransaction(context);\n } else {\n this.childSpans[key] = this.mainSpan.startChild(context);\n }\n }\n\n measure(key) {\n if (this.mainSpanKey === key) {\n this.mainSpan.finish();\n delete this.mainSpan;\n delete this.mainSpanKey;\n this.childSpans = {};\n } else {\n this.childSpans[key]?.finish?.();\n delete this.childSpans[key];\n }\n }\n\n notify(domain, error, info) {\n const scope = new Sentry.Scope();\n // Mark builder alerts as lower level in sentry\n if (domain == \"builder\") scope.setLevel(\"warning\");\n scope.setTag(\"domain\", domain);\n scope.setContext(\"info\", info);\n Sentry.captureException(error, scope);\n // Also log to console:\n super.notify(domain, error, info);\n }\n\n setContext(key, data) {\n switch (key) {\n case \"tags\":\n Sentry.setTags(data);\n break;\n case \"user\":\n Sentry.setUser(data);\n break;\n case \"breadcrumb\":\n Sentry.addBreadcrumb(data);\n break;\n default:\n Sentry.setContext(key, data);\n break;\n }\n }\n}\n\n/*\n * Browser Performance tracking - uses the User Timing API\n */\nclass BrowserPerformnace extends Performance {\n error(err) {\n console.error(err);\n }\n\n mark(key, context) {\n if (!this.mainSpanKey) {\n this.mainSpanKey = key;\n }\n window.performance.mark(key, { detail: context });\n }\n\n measure(key) {\n try {\n const mark = window.performance.getEntriesByName(key, \"mark\")[0];\n const measure = window.performance.measure(key, {\n start: key,\n detail: mark?.detail,\n });\n if (this.mainSpanKey === key) {\n console.groupCollapsed(\n `${measure.name} finished in ${measure.duration} ms`\n );\n const entries = window.performance.getEntriesByType(\"measure\");\n if (entries.length > 1)\n console.table(entries, [\"name\", \"duration\", \"startTime\"]);\n else console.log(measure);\n console.groupEnd();\n delete this.mainSpanKey;\n window.performance.clearMarks();\n window.performance.clearMeasures();\n }\n } catch (e) {\n // console.warn(e);\n }\n }\n}\n\n/**\n * hash of performance tracking sources\n */\nconst sources = {\n sentry: SentryPerformance,\n browser: BrowserPerformnace,\n};\n\n/**\n * Performance Interface that the rest of the app uses. Routes the calls to the\n * configured performance tracking source\n */\nclass PerformanceInterface {\n constructor(mode) {\n this.mode = mode;\n this.initialized = false;\n this._source = new (sources[mode] ?? Performance)();\n }\n\n /**\n * initialize performance, should be called early in init\n */\n init() {\n if (this.initialized) return;\n this._source.init();\n // console.log(\"Performance.init() complete\", mode);\n this.initialized = true;\n }\n\n /**\n * Capture an error\n * @param {Error} error\n */\n error(err) {\n this._source.error(err);\n }\n\n /**\n * Start a performance tracking span. End by calling measure() with the same key.\n * The first mark will be consider a parent, and subsequent marks become\n * children until the initial mark is measured.\n * @param {string} key unique key to track\n * @param {object} [context] any additional context\n */\n mark(key, context) {\n this._source.mark(key, context);\n }\n\n /**\n * End a performance tracking span\n * @param {string} key should match an existing mark\n */\n measure(key) {\n this._source.measure(key);\n }\n\n /**\n * Implements AB.notify which will log differently depending on our tracking\n * option\n * @param {string} domain which group of people we are sending a notification to.\n * @param {Error} error An error object generated at the point of issue.\n * @param {json} info Additional related information concerning the issue.\n */\n notify(domain, error, info) {\n this._source.notify(domain, error, info);\n }\n\n /**\n * Set additional context to tracing/error events\n * @param {string} key type of context (tag, user, etc)\n * @pram {object} data\n */\n setContext(key, data) {\n this._source.setContext(key, data);\n }\n}\n\n// singleton\nlet performanceInterface;\n\n/**\n * Get/create the shared performance instance\n * @returns {PerformanceInterface}\n */\nfunction getPerformance() {\n if (!performanceInterface)\n performanceInterface = new PerformanceInterface(mode);\n return performanceInterface;\n}\n\nexport default getPerformance();\n","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js?url=false!./gantt.min.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js?url=false!./hint.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js?url=false!./query.min.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js?url=false!./querybuilder.min.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js?url=false!./reports.min.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js?url=false!./scheduler.min.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../node_modules/css-loader/dist/cjs.js?url=false!./webix.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../node_modules/css-loader/dist/cjs.js?url=false!./font-awesome.min.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../node_modules/css-loader/dist/cjs.js?url=false!./loader.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../node_modules/css-loader/dist/cjs.js?url=false!./ui.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","__webpack_require__.O(0, [\"app\"], () => {\n\t__webpack_require__.E(\"vendor-node_modules_atomicjs_dist_atomic_min_js-node_modules_atomicjs_dist_atomic_polyfills_m-6fe1ea\");\n\t__webpack_require__.E(\"AB\");\n}, 5);"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/assets/app.65b73d1b748f10aa7e0c.js.map b/assets/app.65b73d1b748f10aa7e0c.js.map deleted file mode 100644 index 3026ca5c..00000000 --- a/assets/app.65b73d1b748f10aa7e0c.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.65b73d1b748f10aa7e0c.js","mappings":"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Y,MAAM,MAAM,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,MAAM,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,SAAS,UAAU,MAAM,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,QAAQ,UAAU,KAAK,SAAS,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,KAAK,MAAM,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,SAAS,UAAU,MAAM,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,KAAK,MAAM,UAAU,UAAU,KAAK,KAAK,UAAU,cAAc,OAAO,MAAM,UAAU,KAAK,KAAK,UAAU,cAAc,OAAO,MAAM,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,cAAc,OAAO,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,cAAc,OAAO,MAAM,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,cAAc,OAAO,KAAK,cAAc,OAAO,KAAK,cAAc,OAAO,MAAM,UAAU,KAAK,KAAK,cAAc,OAAO,MAAM,UAAU,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,UAAU,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,WAAW,UAAU,KAAK,YAAY,MAAM,YAAY,aAAa,aAAa,aAAa,MAAM,YAAY,MAAM,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,YAAY,MAAM,YAAY,aAAa,WAAW,UAAU,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,UAAU,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,MAAM,KAAK,UAAU,YAAY,WAAW,MAAM,UAAU,KAAK,UAAU,UAAU,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,MAAM,UAAU,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,aAAa,MAAM,UAAU,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,YAAY,WAAW,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,UAAU,YAAY,WAAW,YAAY,WAAW,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,MAAM,MAAM,UAAU,MAAM,UAAU,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,cAAc,cAAc,aAAa,aAAa,WAAW,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,MAAM,MAAM,UAAU,YAAY,aAAa,aAAa,WAAW,UAAU,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,YAAY,WAAW,UAAU,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,WAAW,KAAK,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,YAAY,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,aAAa,MAAM,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,WAAW,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,WAAW,UAAU,KAAK,MAAM,UAAU,YAAY,MAAM,SAAS,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,MAAM,UAAU,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,KAAK,YAAY,YAAY,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,MAAM,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,MAAM,YAAY,MAAM,YAAY,aAAa,MAAM,YAAY,OAAO,YAAY,aAAa,MAAM,MAAM,YAAY,aAAa,MAAM,YAAY,OAAO,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,YAAY,OAAO,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,MAAM,YAAY,QAAQ,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,aAAa,MAAM,UAAU,OAAO,UAAU,YAAY,MAAM,OAAO,YAAY,MAAM,YAAY,MAAM,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,YAAY,aAAa,MAAM,YAAY,MAAM,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,WAAW,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,WAAW,KAAK,MAAM,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,MAAM,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,WAAW,KAAK,MAAM,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,YAAY,aAAa,aAAa,MAAM,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,UAAU,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,QAAQ,YAAY,MAAM,MAAM,UAAU,UAAU,KAAK,MAAM,UAAU,UAAU,KAAK,QAAQ,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,UAAU,KAAK,UAAU,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,aAAa,aAAa,WAAW,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,OAAO,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,aAAa,MAAM,UAAU,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,UAAU,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,KAAK,OAAO,UAAU,YAAY,MAAM,MAAM,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,SAAS,UAAU,MAAM,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,YAAY,MAAM,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,YAAY,WAAW,UAAU,MAAM,KAAK,YAAY,MAAM,YAAY,MAAM,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,KAAK,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,WAAW,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,YAAY,WAAW,MAAM,UAAU,KAAK,YAAY,aAAa,WAAW,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,KAAK,KAAK,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,WAAW,KAAK,KAAK,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,KAAK,MAAM,UAAU,YAAY,MAAM,UAAU,KAAK,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,UAAU,YAAY,MAAM,UAAU,YAAY,MAAM,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,MAAM,UAAU,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,MAAM,UAAU,UAAU,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,UAAU,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,UAAU,YAAY,WAAW,MAAM,SAAS,YAAY,WAAW,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,OAAO,UAAU,KAAK,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,MAAM,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,KAAK,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,WAAW,MAAM,MAAM,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,WAAW,MAAM,MAAM,UAAU,UAAU,KAAK,MAAM,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,KAAK,KAAK,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,WAAW,UAAU,UAAU,KAAK,KAAK,UAAU,YAAY,MAAM,MAAM,UAAU,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,KAAK,MAAM,UAAU,MAAM,OAAO,UAAU,MAAM,KAAK,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,WAAW,KAAK,OAAO,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,MAAM,SAAS,UAAU,UAAU,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,WAAW,MAAM,OAAO,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,MAAM,UAAU,YAAY,MAAM,OAAO,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,OAAO,YAAY,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,UAAU,UAAU,KAAK,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,UAAU,YAAY,aAAa,aAAa,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,UAAU,YAAY,aAAa,aAAa,MAAM,aAAa,YAAY,aAAa,MAAM,aAAa,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,WAAW,KAAK,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM,YAAY,MAAM,UAAU,MAAM,YAAY,MAAM,UAAU,MAAM,SAAS,UAAU,MAAM,cAAc,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,KAAK,KAAK,UAAU,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,YAAY,MAAM,UAAU,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,MAAM,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,YAAY,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,QAAQ,UAAU,MAAM,UAAU,UAAU,YAAY,aAAa,MAAM,SAAS,UAAU,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,QAAQ,UAAU,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,YAAY,MAAM,MAAM,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,WAAW,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,WAAW,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,WAAW,KAAK,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,KAAK,OAAO,UAAU,YAAY,MAAM,OAAO,YAAY,aAAa,WAAW,KAAK,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,OAAO,UAAU,YAAY,aAAa,MAAM,UAAU,YAAY,MAAM,MAAM,UAAU,YAAY,aAAa,WAAW,KAAK,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,UAAU,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,WAAW,UAAU,KAAK,UAAU,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,SAAS,UAAU,MAAM,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,UAAU,YAAY,WAAW,YAAY,WAAW,UAAU,UAAU,UAAU,KAAK,OAAO,UAAU,YAAY,WAAW,KAAK,MAAM,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,cAAc,OAAO,KAAK,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,YAAY,eAAe,cAAc,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,KAAK,MAAM,UAAU,UAAU,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,WAAW,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,MAAM,UAAU,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,KAAK,MAAM,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,YAAY,WAAW,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,YAAY,aAAa,aAAa,WAAW,MAAM,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,KAAK,YAAY,MAAM,KAAK,MAAM,UAAU,MAAM,MAAM,YAAY,aAAa,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,MAAM,MAAM,YAAY,aAAa,aAAa,WAAW,KAAK,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,WAAW,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,UAAU,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,KAAK,SAAS,UAAU,YAAY,aAAa,WAAW,YAAY,WAAW,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,MAAM,UAAU,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,UAAU,KAAK,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,YAAY,MAAM,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,KAAK,KAAK,UAAU,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,YAAY,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,aAAa,MAAM,MAAM,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,WAAW,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,QAAQ,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,YAAY,OAAO,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,YAAY,MAAM,UAAU,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,YAAY,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,KAAK,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,WAAW,KAAK,KAAK,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,WAAW,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,MAAM,KAAK,UAAU,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,WAAW,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,SAAS,UAAU,MAAM,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,SAAS,UAAU,MAAM,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,WAAW,MAAM,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,WAAW,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,WAAW,MAAM,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,QAAQ,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,QAAQ,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,WAAW,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,MAAM,YAAY,aAAa,MAAM,MAAM,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,MAAM,UAAU,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,UAAU,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,KAAK,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,MAAM,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,aAAa,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,OAAO,YAAY,aAAa,WAAW,YAAY,WAAW,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,YAAY,WAAW,UAAU,UAAU,MAAM,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,MAAM,SAAS,YAAY,MAAM,SAAS,YAAY,MAAM,OAAO,YAAY,aAAa,aAAa,aAAa,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM,OAAO,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,WAAW,KAAK,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,WAAW,UAAU,UAAU,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,aAAa,MAAM,MAAM,UAAU,MAAM,MAAM,UAAU,YAAY,aAAa,MAAM,QAAQ,UAAU,KAAK,MAAM,UAAU,UAAU,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,MAAM,OAAO,UAAU,YAAY,MAAM,OAAO,UAAU,MAAM,QAAQ,YAAY,MAAM,QAAQ,UAAU,MAAM,YAAY,YAAY,MAAM,UAAU,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,SAAS,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,OAAO,YAAY,aAAa,WAAW,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,OAAO,UAAU,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,WAAW,UAAU,MAAM,KAAK,UAAU,MAAM,OAAO,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,UAAU,YAAY,WAAW,MAAM,OAAO,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,MAAM,UAAU,MAAM,MAAM,YAAY,WAAW,UAAU,YAAY,WAAW,MAAM,QAAQ,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,UAAU,YAAY,WAAW,MAAM,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,UAAU,UAAU,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM,YAAY,WAAW,KAAK,KAAK,YAAY,WAAW,YAAY,MAAM,OAAO,UAAU,KAAK,QAAQ,YAAY,MAAM,QAAQ,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,UAAU,UAAU,MAAM,MAAM,UAAU,UAAU,MAAM,MAAM,UAAU,YAAY,aAAa,MAAM,QAAQ,UAAU,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,WAAW,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,aAAa,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,WAAW,KAAK,SAAS,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,QAAQ,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,QAAQ,UAAU,YAAY,MAAM,QAAQ,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,SAAS,UAAU,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,QAAQ,UAAU,YAAY,MAAM,WAAW,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,YAAY,aAAa,aAAa,WAAW,UAAU,YAAY,MAAM,QAAQ,YAAY,aAAa,MAAM,MAAM,UAAU,YAAY,aAAa,WAAW,UAAU,YAAY,aAAa,MAAM,QAAQ,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAA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AK,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,MAAM,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,MAAM,MAAM,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,MAAM,MAAM,YAAY,MAAM,QAAQ,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,MAAM,MAAM,YAAY,OAAO,KAAK,UAAU,UAAU,KAAK,KAAK,YAAY,MAAM,OAAO,UAAU,UAAU,UAAU,KAAK,OAAO,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK,MAAM,UAAU,UAAU,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,WAAW,UAAU,YAAY,aAAa,WAAW,KAAK,MAAM,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,WAAW,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,OAAO,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,YAAY,MAAM,YAAY,MAAM,UAAU,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,UAAU,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,OAAO,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,aAAa,aAAa,MAAM,MAAM,YAAY,OAAO,YAAY,MAAM,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,UAAU,YAAY,WAAW,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,WAAW,KAAK,KAAK,YAAY,aAAa,WAAW,KAAK,OAAO,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,YAAY,MAAM,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,UAAU,UAAU,UAAU,UAAU,YAAY,SAAS,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,UAAU,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,QAAQ,UAAU,YAAY,aAAa,MAAM,SAAS,YAAY,aAAa,MAAM,QAAQ,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,QAAQ,UAAU,YAAY,aAAa,WAAW,UAAU,UAAU,YAAY,aAAa,aAAa,WAAW,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,YAAY,aAAa,MAAM,MAAM,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,OAAO,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,OAAO,UAAU,MAAM,aAAa,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,YAAY,WAAW,YAAY,WAAW,UAAU,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,UAAU,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,UAAU,YAAY,WAAW,UAAU,YAAY,WAAW,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,UAAU,UAAU,YAAY,MAAM,QAAQ,YAAY,aAAa,WAAW,MAAM,QAAQ,UAAU,KAAK,QAAQ,YAAY,MAAM,KAAK,UAAU,OAAO,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,UAAU,UAAU,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,OAAO,YAAY,MAAM,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,OAAO,KAAK,UAAU,UAAU,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,WAAW,UAAU,YAAY,OAAO,KAAK,YAAY,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,YAAY,OAAO,KAAK,YAAY,OAAO,KAAK,YAAY,aAAa,aAAa,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,UAAU,OAAO,KAAK,YAAY,aAAa,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,YAAY,aAAa,aAAa,aAAa,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,YAAY,OAAO,OAAO,YAAY,WAAW,UAAU,MAAM,MAAM,YAAY,aAAa,OAAO,MAAM,YAAY,aAAa,OAAO,KAAK,YAAY,OAAO,KAAK,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,MAAM,KAAK,YAAY,OAAO,KAAK,KAAK,YAAY,WAAW,YAAY,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,KAAK,YAAY,OAAO,KAAK,KAAK,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,WAAW,UAAU,KAAK,KAAK,YAAY,WAAW,KAAK,MAAM,KAAK,YAAY,OAAO,KAAK,YAAY,aAAa,aAAa,OAAO,KAAK,YAAY,aAAa,OAAO,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,UAAU,KAAK,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,WAAW,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,aAAa,aAAa,aAAa,aAAa,MAAM,mBAAmB,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,WAAW,KAAK,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,YAAY,aAAa,WAAW,UAAU,YAAY,aAAa,WAAW,YAAY,aAAa,WAAW,UAAU,UAAU,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,WAAW,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,OAAO,YAAY,aAAa,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,2BAA2B,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK,UAAU,YAAY,MAAM,KAAK,YAAY,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,OAAO,KAAK,UAAU,YAAY,WAAW,UAAU,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,aAAa,OAAO,KAAK,YAAY,aAAa,aAAa,aAAa,WAAW,UAAU,YAAY,OAAO,KAAK,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,KAAK,YAAY,WAAW,UAAU,UAAU,UAAU,UAAU,YAAY,WAAW,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,WAAW,YAAY,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,KAAK,MAAM,YAAY,MAAM,MAAM,YAAY,MAAM,UAAU,KAAK,YAAY,aAAa,SAAS,KAAK,KAAK,OAAO,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,UAAU,YAAY,aAAa,aAAa,aAAa,cAAc,MAAM,KAAK,UAAU,KAAK,KAAK,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,KAAK,UAAU,UAAU,YAAY,aAAa,MAAM,MAAM,KAAK,KAAK,UAAU,YAAY,MAAM,KAAK,UAAU,YAAY,MAAM,MAAM,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,KAAK,UAAU,MAAM,KAAK,YAAY,aAAa,WAAW,UAAU,YAAY,aAAa,aAAa,aAAa,aAAa,WAAW,YAAY,WAAW,YAAY,aAAa,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,UAAU,UAAU,YAAY,aAAa,WAAW,UAAU,YAAY,WAAW,UAAU,YAAY,MAAM,KAAK,UAAU,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,YAAY,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,MAAM,KAAK,YAAY,WAAW,UAAU,KAAK,KAAK,YAAY,OAAO,KAAK,YAAY,WAAW,KAAK,KAAK,YAAY,WAAW,KAAK,KAA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,oCAAoC,GAAG,wBAAwB,wBAAwB,GAAG,6BAA6B,0BAA0B,gBAAgB,wBAAwB,cAAc,eAAe,sCAAsC,0CAA0C,wBAAwB,GAAG,qCAAqC,kBAAkB,GAAG,wDAAwD,kBAAkB,GAAG,qBAAqB;AAC50lG;AACA,iEAAe,uBAAuB,EAAC;;;;;;;;;;;;;;;;;;;ACPK;AACF;;AAE1C;AACsC;;AAEtC;AACA;AACA,OAAO,MAAM;AACb;AACA;;AAEA;AACA,OAAO,MAAM;AACb;AACA;;AAEA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA,OAAO,QAAQ;AACf;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,aAAa,MAAM;AACnB,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,UAAU,KAAK;AACf;AACA;;AAEA;AACA,UAAU,KAAK;AACf;AACA,mBAAmB,MAAM;AACzB,uBAAuB,MAAM;;AAE7B;AACA,UAAU,KAAK;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM,oDAAY;AAClB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf,iBAAiB,mBAAmB,iBAAiB;AACrD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,yBAAyB;AAC1C,iBAAiB,QAAQ;AACzB,iBAAiB,SAAS;AAC1B,iBAAiB,QAAQ;AACzB,iBAAiB,SAAS;AAC1B,iBAAiB,OAAO,0BAA0B,GAAG;AACrD,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,qDAAY;AAC5B;AACA,aAAa,sDAAa;AAC1B;;AAEA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iEAAe,YAAY,EAAC;;;;;;;;;;;;;;;ACzO5B;AACA;AACA;AACA;;AAEA;;AAEA,iEAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC,EAAC;;;;;;;;;;;;;;;ACtDF;AACA;AACA;AACA;;AAEA;;AAEA,iEAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC,EAAC;;;;;;;;;;;;;;;;;;;;;;;;ACpDF;AAC6B;AACC;AACqB;AACI;AACJ;AACQ;AACM;AACpB;AACpB;AACzB;AACA;AACuC;;AAEO;AAC9C,2DAAW;;AAEiC;AAC5C;;AAEA;AACA,qBAAqB,sJAIpB;AACD;AACA;AACA;AACA,GAAG,sKAIC;AACJ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,GAAG,2DAAS;AACZ;AACA;;AAEA;;AAEA,MAAM,2DAAS;AACf;AACA;AACA;AACA,OAAO;;AAEP,MAAM,2DAAS;AACf,IAAI;AACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;ACvDD;AACA;AACA;AACA;AACA;AACA;;AAE4B;;AAE5B,qBAAqB,4DAAmB;;AAEC;;AAEM;AACN;AACA;AACE;AAC3C;;AAEA;;AAEA;AACA;;AAE6B;AACqB;;AAEA;;AAElD;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,yDAAM;;AAE1B;AACA;AACA;;AAEA;AACA,UAAU,IAAI;AACd;AACA;AACA;;AAEA;AACA,UAAU,OAAO;AACjB;;AAEA;AACA,UAAU,KAAK;AACf;;AAEA;AACA,SAAS,6DAAW;AACpB,OAAO;AACP;;AAEA;AACA,cAAc,SAAS;AACvB;AACA;AACA,4BAA4B,uRAIrB;AACP,iBAAiB,SAAS;AAC1B;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,gHAA0C;AAC3D;AACA;AACA,uCAAuC,MAAM;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6DAAW;AACvB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA,MAAM,6DAAW,qBAAqB,gBAAgB;AACtD;AACA;AACA;AACA;AACA,MAAM,6DAAW,mBAAmB,iBAAiB;AACrD,YAAY,wDAAO;AACnB,MAAM,6DAAW;;AAEjB;AACA,MAAM,6DAAW,sBAAsB,gBAAgB;AACvD;AACA,YAAY,2DAAU;AACtB,MAAM,6DAAW;;AAEjB,YAAY,yDAAQ;AACpB,uBAAuB,yDAAM;;AAE7B;AACA;AACA,SAAS,6DAAW;AACpB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,eAAe,wBAAwB,EAAE,yDAAM;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,6DAAW,uBAAuB,gBAAgB;;AAExD;AACA;AACA;AACA,OAAO;AACP,MAAM,6DAAW;;AAEjB;AACA,aAAa,WAAW;AACxB,MAAM,6DAAW,2BAA2B,gBAAgB;AAC5D;;AAEA,cAAc,qBAAqB;AACnC,wBAAwB,yDAAM;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,6DAAW;AACpB,SAAS,2DAAa;AACtB,SAAS,2DAAa;AACtB,SAAS,2DAAa;AACtB,aAAa,yDAAM;AACnB,YAAY,2DAAa,gBAAgB,yDAAM;AAC/C;AACA;AACA,iBAAiB,2DAAa;;AAE9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM,6DAAW;;AAEjB,sDAAsD;AACtD,MAAM,6DAAW,kBAAkB,iBAAiB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,eAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,SAAS,iDAAE;AACX;AACA,iBAAiB,iDAAE;AACnB;AACA;AACA;AACA,eAAe,6DAAW;AAC1B,eAAe,6DAAW;AAC1B,aAAa;AACb;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,eAAe,EAAC;;;;;;;;;;;;;;;ACpS/B,iEAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,CAAC,EAAC;;;;;;;;;;;;;;;ACnBF;AACA;AACA;AACA;AACA,iEAAe;AACf;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,sCAAsC,aAAa,aAAa;AAC3H;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,4BAA4B;AAC5B,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA,OAAO;AACP,IAAI;AACJ,CAAC,EAAC;;;;;;;;;;;;;;;AChDF,iEAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,CAAC,EAAC;;;;;;;;;;;;;;;;;ACpBoC;;AAEtC,sBAAsB,gDAAY;AAClC;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,KAAK,EAAE,IAAI;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,KAAK,GAAG,EAAE;AACvC,UAAU;AACV;;AAEA;AACA;AACA,yCAAyC,KAAK,GAAG,EAAE;AACnD,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,sCAAsC;AACpD;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,OAAO,EAAC;;;;;;;;;;;;;;;;ACnKS;;AAEhC,0BAA0B,gDAAO;AACjC;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,UAAU;AACV,4BAA4B,eAAe;AAC3C;AACA;;AAEA;AACA,UAAU,SAAS;AACnB;AACA;;AAEA;AACA,UAAU,SAAS;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,wBAAwB;AAC3C;AACA,2CAA2C,aAAa,oBAAoB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;;AAEA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kCAAkC,MAAM;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,MAAM;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,mEAAmE,WAAW,EAAE,QAAQ;AACxF;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,iBAAiB,eAAe;AAChC,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kEAAkE,OAAO;AACzE;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,WAAW,EAAC;;;;;;;;;;;;;;;;;ACrgBQ;;AAEuB;;AAE1D,4BAA4B,mDAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,6DAA6D,iBAAiB;AAC9E;AACA;AACA;AACA;AACA;AACA,2BAA2B,uEAAU;AACrC,2BAA2B,uEAAU;AACrC;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,eAAe;AACjG,yCAAyC;AACzC;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB,0BAA0B;AAC1B;AACA,mBAAmB;AACnB,oBAAoB;AACpB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,EAAE;AAC9C;AACA;;AAEA;AACA,2CAA2C,MAAM;AACjD;AACA;AACA;AACA;AACA;;AAEA,iEAAe,mBAAmB,EAAC;;;;;;;;;;;;;;;;;;;ACzGA;AACa;AACN;AACA;;AAE1C,qBAAqB,mDAAO;AAC5B;AACA;;AAEA;AACA,UAAU,WAAW;AACrB;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,0DAAa,OAAO,uDAAU,OAAO,uDAAU;AAClE,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA,UAAU,OAAO;AACjB,0BAA0B,QAAQ;AAClC;;AAEA,oBAAoB,uDAAU;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,UAAU;;AAEV,SAAS,uDAAU;AACnB;AACA;AACA,UAAU;;AAEV;AACA,uBAAuB,0DAAa;AACpC,uBAAuB,uDAAU;AACjC;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA,8BAA8B,uDAAU;AACxC,SAAS,uDAAU;AACnB,4BAA4B,uDAAU;AACtC;AACA;;AAEA;AACA;AACA,iCAAiC,uDAAU;AAC3C;AACA,YAAY,uDAAU;AACtB,+BAA+B,uDAAU;AACzC;AACA,QAAQ;AACR;AACA;AACA,YAAY,0DAAa;AACzB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,kBAAkB,0DAAa;AAC/B;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,YAAY,EAAC;;;;;;;;;;;;;;;;ACnJO;;AAEnC,uCAAuC,mDAAO;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,4DAA4D,kBAAkB,wBAAwB,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAC3P,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,6BAA6B;AAC7B;AACA,sBAAsB;AACtB,uBAAuB;AACvB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,KAAK;AAClE,4DAA4D,KAAK;AACjE;AACA,mCAAmC;AACnC;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,KAAK;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B,mDAAmD,KAAK;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,KAAK;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,KAAK;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2CAA2C,OAAO;AAClD,0CAA0C,MAAM;AAChD;AACA,uBAAuB;AACvB,6BAA6B,UAAU;AACvC;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,2CAA2C,KAAK;AAChD,4DAA4D,KAAK;AACjE;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA,2CAA2C,KAAK;AAChD;AACA;AACA,gBAAgB;AAChB;AACA;AACA,2BAA2B,kBAAkB,uBAAuB,aAAa,WAAW,QAAQ;AACpG;AACA,aAAa;AACb;AACA,2CAA2C,KAAK;AAChD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,oCAAoC,kBAAkB,uBAAuB,aAAa,WAAW,QAAQ;AAC7G;AACA;AACA;AACA,mBAAmB;AACnB;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;;AAEA;AACA,oCAAoC,kBAAkB,uBAAuB,mBAAmB,WAAW,QAAQ;AACnH;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA,kCAAkC,KAAK;AACvC;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA,2DAA2D;AAC3D;AACA,sBAAsB,IAAI,kBAAkB;AAC5C;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA,oCAAoC,KAAK;AACzC;;AAEA,qBAAqB,KAAK;AAC1B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA,iEAAe,8BAA8B,EAAC;;;;;;;;;;;;;;;;;ACllBX;;AAEnC;AACqD;;AAErD,yBAAyB,mDAAO;AAChC;AACA;;AAEA;AACA,UAAU,eAAe;AACzB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,6DAAe;AAChC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,6DAAe;AAC/C;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,gBAAgB,EAAC;;;;;;;;;;;;;;;;;;;AChEG;AAC2B;AACkB;AACF;;AAE9E,8BAA8B,mDAAO;AACrC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,kEAAmB;AAC/B,YAAY,2EAA4B;AACxC,YAAY,0EAA2B;AACvC;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,kEAAmB;AACvC,MAAM,kEAAmB;AACzB,SAAS,0EAA2B;AACpC,OAAO;;AAEP,oBAAoB,0EAA2B;AAC/C,MAAM,0EAA2B;AACjC,SAAS,kEAAmB;AAC5B,OAAO;;AAEP,oBAAoB,2EAA4B;AAChD,MAAM,2EAA4B;AAClC;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,2EAA4B;AAC3C;;AAEA;AACA;AACA,eAAe,kEAAmB;AAClC;AACA;AACA;AACA;;AAEA;AACA,MAAM,kEAAmB;AACzB;AACA;;AAEA,iEAAe,qBAAqB,EAAC;;;;;;;;;;;;;;;;ACxEF;;AAEnC,kCAAkC,mDAAO;AACzC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,iBAAiB,mBAAmB,oCAAoC,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAClS;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,wCAAwC,sCAAsC;AAC9E;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iEAAiE;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA,iGAAiG;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA,8CAA8C;AAC9C;AACA;AACA,mDAAmD,mDAAO;AAC1D,iDAAiD;AACjD,8CAA8C;AAC9C,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,4CAA4C;AAC5C;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,mDAAmD,mDAAO;AAC1D,iDAAiD;AACjD,8CAA8C;AAC9C,2CAA2C;AAC3C,4CAA4C;AAC5C;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,mDAAO;AACpD,2CAA2C;AAC3C,wCAAwC;AACxC,qCAAqC;AACrC;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB,0BAA0B;AAC1B;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,gCAAgC,WAAW;AAC3C;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB,oBAAoB;AACpB;AACA,aAAa;AACb,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sFAAsF,QAAQ;AAC9F;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA,eAAe,8CAA8C;AAC7D;AACA;;AAEA;AACA;;AAEA,oBAAoB;;AAEpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,gBAAgB;AAChB,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,yBAAyB,EAAC;;;;;;;;;;;;;;;;ACxTN;;AAEnC;;AAEA,2CAA2C,mDAAO;AAClD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,iBAAiB,mBAAmB,oCAAoC,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAClS;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,wCAAwC,sCAAsC;AAC9E;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA,qDAAqD,yBAAyB;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D,uDAAuD;AACvD;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA,oDAAoD;AACpD;AACA,8CAA8C;AAC9C;AACA;AACA,mDAAmD,mDAAO;AAC1D,iDAAiD;AACjD,8CAA8C;AAC9C,2CAA2C;AAC3C,4CAA4C;AAC5C;AACA,qCAAqC;AACrC;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB,oBAAoB;AACpB;AACA,aAAa;AACb,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;;AAExC,iDAAiD;AACjD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,kCAAkC,EAAC;;;;;;;;;;;;;;;;ACjMf;;AAEnC;;AAEA,0CAA0C,mDAAO;AACjD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,iBAAiB,mBAAmB,oCAAoC,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAClS;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,wCAAwC,sCAAsC;AAC9E;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA,uDAAuD;AACvD;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA,kDAAkD,wBAAwB;AAC1E,kDAAkD,yBAAyB;AAC3E;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE,6DAA6D;AAC7D;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA,0DAA0D;AAC1D;AACA,oDAAoD;AACpD;AACA;AACA,yDAAyD,mDAAO;AAChE;AACA;AACA,uDAAuD;AACvD,oDAAoD;AACpD,iDAAiD;AACjD,kDAAkD;AAClD;AACA,2CAA2C;AAC3C;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB,oBAAoB;AACpB;AACA,aAAa;AACb,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;;AAExC;AACA,iGAAiG,EAAE;AACnG;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,iCAAiC,EAAC;;;;;;;;;;;;;;;;ACrPd;;AAEnC,4BAA4B,mDAAO;AACnC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,mBAAmB,EAAC;;;;;;;;;;;;;;;;AC1BA;;AAEnC,oCAAoC,mDAAO;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,mDAAmD,oBAAoB;AACvE,2BAA2B;AAC3B,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,qCAAqC,oBAAoB;AACzD;AACA,+CAA+C;AAC/C;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,mCAAmC,oBAAoB;AACvD;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,yCAAyC,oBAAoB;AAC7D;AACA,qDAAqD,oBAAoB;AACzE;AACA,mBAAmB;AACnB,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,oBAAoB;AAC1E;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,6CAA6C,oBAAoB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb,gCAAgC,oBAAoB;AACpD;AACA;AACA,aAAa;AACb,gCAAgC,oBAAoB;AACpD;AACA,gCAAgC,oBAAoB;AACpD;AACA;AACA;AACA,aAAa;AACb;AACA,gCAAgC,oBAAoB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,UAAU;;AAEV;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA,iCAAiC,oBAAoB;AACrD;;AAEA;AACA,iCAAiC,oBAAoB;AACrD;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B,oBAAoB;AAC9C,8BAA8B,oBAAoB;AAClD;AACA,0BAA0B,oBAAoB;AAC9C,8BAA8B,oBAAoB;AAClD;AACA,0BAA0B,oBAAoB;AAC9C,8BAA8B,oBAAoB;AAClD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA,UAAU;AACV;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oBAAoB;AACvD;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E,gEAAgE,OAAO;AACvE,+DAA+D,UAAU;AACzE;AACA;AACA;AACA;AACA;AACA,2BAA2B,UAAU;AACrC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,+CAA+C,oBAAoB;AACnE;AACA;AACA;AACA,iDAAiD,oBAAoB;AACrE;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD,gBAAgB;AAChB;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,uBAAuB;AACvB;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C,oBAAoB;AAC/D;AACA;AACA;;AAEA;AACA,2CAA2C,SAAS;AACpD,6CAA6C,SAAS;AACtD;AACA;AACA,oBAAoB;AACpB,2CAA2C,SAAS;AACpD,6CAA6C,SAAS;AACtD;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA,UAAU;AACV;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oBAAoB;AACvD;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA,6EAA6E;AAC7E,gEAAgE,OAAO;AACvE,+DAA+D,UAAU;AACzE;AACA;AACA;AACA;AACA;AACA,2BAA2B,UAAU;AACrC;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA,6CAA6C,oBAAoB;AACjE;AACA;AACA,+CAA+C,oBAAoB;AACnE;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD,gBAAgB;AAChB;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,oBAAoB;AACpB;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,oBAAoB;AAC7D;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD,6CAA6C,SAAS;AACtD;AACA;AACA,oBAAoB;AACpB,2CAA2C,SAAS;AACpD,6CAA6C,SAAS;AACtD;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA,yCAAyC,oBAAoB;AAC7D;AACA,UAAU;AACV;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oBAAoB;AACvD;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E,gEAAgE,OAAO;AACvE,+DAA+D,UAAU;AACzE;AACA;AACA;AACA;AACA;AACA,2BAA2B,UAAU;AACrC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,kDAAkD,oBAAoB;AACtE;AACA;AACA;AACA,oDAAoD,oBAAoB;AACxE;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA;AACA;AACA;AACA,iCAAiC,oBAAoB;AACrD,gBAAgB;AAChB;AACA;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,SAAS,IAAI,MAAM;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,SAAS,IAAI,MAAM;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,oBAAoB;AAClE;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD,6CAA6C,SAAS;AACtD;AACA;AACA,oBAAoB;AACpB,2CAA2C,SAAS;AACpD,6CAA6C,SAAS;AACtD;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;;AAEA;AACA;AACA,kCAAkC,oBAAoB;AACtD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,kCAAkC,oBAAoB;AACtD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA,kCAAkC,oBAAoB;AACtD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C,8BAA8B,oBAAoB;AAClD,8BAA8B,oBAAoB;AAClD,sCAAsC,oBAAoB;;AAE1D,qBAAqB,oBAAoB;AACzC,qBAAqB,oBAAoB;AACzC,qBAAqB,oBAAoB;AACzC;;AAEA;AACA;AACA;AACA,8CAA8C,MAAM;AACpD;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,yCAAyC,MAAM;AAC/C;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,0BAA0B,SAAS;AACnC;AACA;AACA;AACA,+BAA+B,cAAc;AAC7C;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,SAAS;AAC1B,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ,GAAG,MAAM;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;AACA,OAAO;;AAEP;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,MAAM;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA,iDAAiD,MAAM;AACvD;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,MAAM;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;;AAEP;AACA,oDAAoD,MAAM;AAC1D;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA,iEAAe,2BAA2B,EAAC;;;;;;;;;;;;;;;;ACttCR;;AAEnC;;AAEA,oCAAoC,mDAAO;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,mBAAmB;AACnB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,4BAA4B;AAC5B;AACA;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,4DAA4D,kBAAkB,wBAAwB,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAC3P,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,6BAA6B;AAC7B;AACA,sBAAsB;AACtB,uBAAuB;AACvB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA,4BAA4B;AAC5B,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,4DAA4D,iBAAiB,wBAAwB,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAC1P,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,6BAA6B;AAC7B;AACA,sBAAsB;AACtB,uBAAuB;AACvB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,sBAAsB,0BAA0B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,SAAS;AAClE;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,2CAA2C;AAC3C;AACA,qCAAqC;AACrC;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C,+BAA+B;AAC/B;AACA;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,MAAM;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC,0DAA0D,YAAY;AACtE;AACA;AACA;AACA;AACA;AACA,yBAAyB,QAAQ,kBAAkB,KAAK,SAAS,aAAa;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,cAAc;AACnC,OAAO;AACP;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,iEAAe,2BAA2B,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxlCR;AACQ;;AAEU;AACqB;AACK;AACP;AACH;AACA;AACA;AACG;AACb;AACA;;AAE3D,yBAAyB,mDAAO;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,oBAAoB,UAAU;AAC9B;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,6DAA6D,iBAAiB;AAC9E;AACA;AACA;AACA;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB;AACA;AACA,iCAAiC,uEAAwB;AACzD;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6DAAe;AACvC,sBAAsB;AACtB;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mDAAO;AAClC,yBAAyB;AACzB,sBAAsB;AACtB,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,mDAAO;AACpD;AACA;AACA;AACA,2CAA2C;AAC3C,wCAAwC;AACxC;AACA;AACA,wCAAwC;AACxC;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;AACA;;AAEA,eAAe,8CAA8C;AAC7D;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,oBAAoB,2EAA2B;AAC/C,oBAAoB,uEAAwB;AAC5C,MAAM,sEAAsB;;AAE5B,UAAU,SAAS;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,4BAA4B;AAClD;AACA;AACA;;AAEA,YAAY,uBAAuB;AACnC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA,MAAM,sEAAsB;;AAE5B;AACA,WAAW,4DAA4D;AACvE,WAAW,oDAAoD;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,cAAc,kCAAkC,EAAE;AAClD;AACA,eAAe;AACf;AACA;AACA;AACA,iBAAiB,iCAAiC;AAClD;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA,mBAAmB,QAAQ;AAC3B,mBAAmB,QAAQ;AAC3B,mBAAmB,UAAU;AAC7B,mBAAmB,QAAQ;AAC3B,mBAAmB,iBAAiB;AACpC,mBAAmB,QAAQ;AAC3B,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA,cAAc,kDAAkD;AAChE;AACA,UAAU;AACV;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA,gFAAgF;AAChF;AACA,cAAc;AACd;AACA,UAAU;AACV;AACA;AACA,cAAc,6DAA6D;AAC3E;AACA;AACA;AACA;AACA,aAAa;AACb,sEAAsE;AACtE;AACA,cAAc;AACd;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2EAA2B;AACnD;AACA;AACA,wBAAwB,uEAAwB;AAChD;AACA;AACA;AACA;AACA;AACA,wBAAwB,sEAAsB;AAC9C,wBAAwB,sEAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA,2BAA2B,sEAAsB;AACjD,2BAA2B,sEAAsB;AACjD,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA,0CAA0C,WAAW;AACrD,wCAAwC,QAAQ;AAChD;AACA;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA,qBAAqB,mDAAO;AAC5B,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,QAAQ;AAC3B,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ,wEAAwE,SAAS;AAC7G;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,SAAS;AACxE,WAAW;AACX;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;;AAEtB,sBAAsB;AACtB,aAAa,SAAS;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,sBAAsB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,4BAA4B;AAClD;;AAEA,yBAAyB,kBAAkB;AAC3C;;AAEA;AACA;AACA,kCAAkC,gCAAgC;AAClE,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,uDAAW;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,4BAA4B;AAClD;;AAEA,yBAAyB,kBAAkB;AAC3C;;AAEA;AACA,gCAAgC,uDAAW;AAC3C;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM,6DAAe;AACrB,uBAAuB,6DAAe;AACtC,mCAAmC,8BAA8B;AACjE;AACA,OAAO;;AAEP,YAAY,6DAAe;;AAE3B;AACA;AACA;AACA,oBAAoB,wEAAyB;;AAE7C;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA,SAAS,mDAAO;AAChB,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,mCAAmC,EAAE,aAAa;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA,eAAe;AACf;AACA;AACA,qBAAqB,gBAAgB;AACrC;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU,MAAM;AAChB;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,OAAO;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA,kBAAkB,mDAAO;AACzB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6DAA6D;AAC7D,cAAc,aAAa;AAC3B,eAAe;AACf;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,eAAe;AAC7B,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA,qBAAqB,SAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uEAAwB;AAChD,wBAAwB,uEAAwB;AAChD;AACA;AACA,wBAAwB,oEAAe;AACvC,wBAAwB,oEAAe;AACvC;AACA;AACA,wBAAwB,oEAAe;AACvC,wBAAwB,oEAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,WAAW;AACrD,wCAAwC,QAAQ;AAChD;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA,qBAAqB,mDAAO;AAC5B,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,gBAAgB,EAAC;;;;;;;;;;;;;;;;;;AC/oCG;AACgC;AACO;;AAE1E,8BAA8B,mDAAO;AACrC;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU,SAAS,UAAU;AAC7B;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA,+CAA+C;AAC/C;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,4DAA4D,kBAAkB,wBAAwB,oBAAoB,gDAAgD,+BAA+B,4BAA4B,sBAAsB;AAC3P,sBAAsB;AACtB;AACA;AACA;AACA;AACA,sBAAsB;AACtB,uBAAuB;AACvB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA,qBAAqB,cAAc;AACnC;AACA,4BAA4B,sBAAsB;AAClD;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA,UAAU,SAAS;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,iEAAiE,MAAM;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wBAAwB;AACrD,mBAAmB;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,UAAU;;AAEV;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA,+BAA+B,uEAAmB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,wEAAyB;AAClC,OAAO;;AAEP;AACA;AACA;AACA,SAAS,wEAAyB;AAClC;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe,MAAM;AACrB,yBAAyB,MAAM;AAC/B,mBAAmB,QAAQ;AAC3B;AACA;AACA,WAAW,wBAAwB;AACnC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,KAAK;AACnB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,qBAAqB,EAAC;;;;;;;;;;;;;;;;ACrVF;;AAEnC,uCAAuC,mDAAO;AAC9C;AACA;;AAEA;AACA,8CAA8C,YAAY;AAC1D,+CAA+C,YAAY;AAC3D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,MAAM;AAC3C;AACA,gBAAgB;AAChB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B;AACA,sBAAsB;AACtB,gBAAgB;;AAEhB;AACA,aAAa;AACb;AACA;AACA,kBAAkB,mDAAO;AACzB;AACA,qBAAqB,mDAAO;AAC5B;AACA,2BAA2B,QAAQ,GAAG,KAAK;AAC3C;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,mCAAmC,UAAU;AAC7C,oBAAoB,iBAAiB;AACrC,UAAU;AACV;AACA;AACA,uBAAuB,yBAAyB;AAChD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,wBAAwB,EAAC;;;;;;;;;;;;;;;;AC5ML;;AAEnC,wCAAwC,mDAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,mBAAmB,GAAG,iBAAiB,gBAAgB,iBAAiB,gBAAgB,cAAc;AAC9J;AACA;AACA;AACA,8BAA8B,mDAAO;AACrC;AACA;AACA;AACA,0CAA0C,QAAQ,GAAG,KAAK;AAC1D;AACA,kCAAkC;AAClC,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,+BAA+B,EAAC;;;;;;;;;;;;;;;;AC9NZ;;AAEnC,qCAAqC,mDAAO;AAC5C;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC,gBAAgB;AAChB;AACA;AACA;AACA;AACA,mBAAmB;AACnB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,UAAU,GAAG,OAAO;AACvD;AACA;AACA;AACA,UAAU;AACV,OAAO;;AAEP;AACA;AACA;;AAEA,iEAAe,4BAA4B,EAAC;;;;;;;;;;;;;;;;AClJT;;AAEnC,qCAAqC,mDAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA,mBAAmB,wBAAwB;AAC3C;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE,gBAAgB;AAChB;AACA;AACA;AACA,yDAAyD,gBAAgB,IAAI;AAC7E,2GAA2G,GAAG;AAC9G,oBAAoB;AACpB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,cAAc;AAC5F,gBAAgB;;AAEhB,iBAAiB;AACjB;AACA;AACA,2DAA2D,gBAAgB,gBAAgB,IAAI;AAC/F;AACA,uBAAuB;AACvB,mBAAmB;AACnB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB,IAAI,gBAAgB;AAC1E;AACA;;AAEA;AACA;AACA;AACA,sCAAsC,gBAAgB,IAAI;AAC1D,kGAAkG,GAAG;AACrG;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA,iCAAiC,OAAO,gCAAgC,cAAc;AACtF;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,4BAA4B,EAAC;;;;;;;;;;;;;;;;ACnKT;;AAEnC,0CAA0C,mDAAO;AACjD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,0CAA0C,YAAY,sCAAsC,8DAA8D,sDAAsD,mBAAmB,gBAAgB,wBAAwB;AAC3Q,oEAAoE,cAAc,eAAe,qBAAqB,oBAAoB,mBAAmB,wBAAwB,iDAAiD,cAAc,sBAAsB;;AAE1Q;AACA,0BAA0B,YAAY,EAAE,YAAY,GAAG;AACvD,QAAQ;AACR,iDAAiD,UAAU,IAAI;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,2CAA2C,GAAG,uBAAuB;AACrE;AACA;AACA,2CAA2C;AAC3C,wCAAwC;AACxC;AACA;AACA;AACA;AACA,wCAAwC;;AAExC;;AAEA;AACA,yDAAyD,0BAA0B,sCAAsC,8DAA8D,sDAAsD,mBAAmB,gBAAgB,wBAAwB,+CAA+C,cAAc,eAAe,qBAAqB,oBAAoB,mBAAmB,wBAAwB,iDAAiD,cAAc,sBAAsB;AAC7hB;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,qCAAqC;AACrC;AACA,kCAAkC;AAClC,+BAA+B;AAC/B,4BAA4B;AAC5B,6BAA6B;AAC7B;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mDAAO;AACjD;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mDAAO;AACjD;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mDAAO;AACjD;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,8CAA8C;AAC9C,2CAA2C;AAC3C,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,0DAA0D,GAAG,uBAAuB;AACpF;AACA;AACA,0DAA0D;AAC1D,uDAAuD;AACvD;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,2CAA2C;AAC3C,wCAAwC;AACxC;AACA,kCAAkC;AAClC;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mDAAO;AACjD;AACA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,wCAAwC;AACxC,qCAAqC;AACrC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA,8CAA8C;AAC9C,2CAA2C;AAC3C,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0DAA0D,GAAG,uBAAuB;AACpF;AACA;AACA,0DAA0D;AAC1D,uDAAuD;AACvD;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8CAA8C;AAC9C,2CAA2C;AAC3C,wCAAwC;AACxC;AACA,kCAAkC;AAClC;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,+CAA+C;AAC/C;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE,gEAAgE;AAChE;AACA;AACA,6EAA6E;AAC7E;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD,iDAAiD;AACjD,8CAA8C;AAC9C;AACA,wCAAwC;AACxC;AACA,kCAAkC;AAClC;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,GAAG,uBAAuB;AACpF;AACA;AACA,0DAA0D;AAC1D,uDAAuD;;AAEvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,2CAA2C;AAC3C,wCAAwC;AACxC;AACA,kCAAkC;AAClC;AACA,4BAA4B;AAC5B;AACA,sBAAsB;AACtB;AACA,gBAAgB;AAChB;AACA,UAAU;AACV,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,sBAAsB,sBAAsB;AAC5C;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,0BAA0B;AACnD;AACA;AACA;AACA,aAAa;AACb,QAAQ;AACR;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iEAAe,iCAAiC,EAAC;;;;;;;;;;;;;;;;AC/7Bd;;AAEnC,qCAAqC,mDAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA,+BAA+B;AAC/B;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,wBAAwB,mDAAO;AAC/B,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA,mBAAmB,wBAAwB;AAC3C;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA,yDAAyD,gBAAgB,IAAI;AAC7E;AACA,oBAAoB;AACpB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gEAAgE,qBAAqB,gCAAgC,cAAc;AACnI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,mBAAmB;AACnB,gBAAgB;;AAEhB;AACA;AACA,wDAAwD,gBAAgB,gBAAgB,IAAI;AAC5F;AACA,oBAAoB;AACpB,gBAAgB;AAChB;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iEAAe,4BAA4B,EAAC;;;;;;;;;;;;;;;;AC3HT;;AAEnC;AACA;AACA;;AAEA;AACA,oDAAoD,mDAAO;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mEAAmE,gBAAgB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,mDAAO;AACxC;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,+BAA+B;AAC/B,4BAA4B;AAC5B,yBAAyB;AACzB;AACA,mBAAmB;AACnB;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B,aAAa;AACb,WAAW;AACX;AACA,wCAAwC,UAAU;AAClD,0BAA0B;AAC1B,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E,UAAU;AACvF,mEAAmE,UAAU,IAAI,UAAU;AAC3F,sBAAsB;AACtB,mBAAmB;AACnB;AACA,gBAAgB;AAChB;AACA;AACA,qBAAqB,mDAAO;AAC5B,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAe,aAAa,EAAC;;;;;;;;;;;;;;;;;AC1NM;AACF;;AAEjC,iBAAiB,mDAAO;AACxB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA,mBAAmB,kDAAM;;AAEzB;AACA;AACA,UAAU;;AAEV,aAAa,kDAAM;AACnB;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,QAAQ,EAAC;;;;;;;;;;;;;;;;;;;AC3DxB;AACA;AACA;AACA;AACA;AACA;;AAE0C;AAC1C;AACA;AACA;AACA;AACA;AACA,iBAAiB,aAAY;AAC7B,SAAS,SAAU;AACnB,aAAa,SAAO;AACpB,EAAE;AACF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,OAAO,IAAI,qBAAqB;AACvE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM,iDAAW;AACjB;AACA;AACA;AACA,4BAA4B,2DAAqB;AACjD;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,MAAM,6DAAuB;AAC7B;;AAEA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB,6DAAuB;AAChD,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,kDAAY;AACpC;AACA;AACA;AACA;AACA,MAAM,6DAAuB;AAC7B;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,oDAAc;AAC1B;AACA;AACA,YAAY,oDAAc;AAC1B;AACA;AACA,YAAY,0DAAoB;AAChC;AACA;AACA,YAAY,uDAAiB;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,kBAAkB,cAAc,cAAc,kBAAkB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,OAAO;AACrB,cAAc,MAAM;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,gBAAgB,EAAC;;;;;;;;;;;;;;;;;;AChQkE;AAClG,YAA8G;;AAE9G;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,oGAAO;;;;AAIxB,iEAAe,oGAAO,aAAa;;;;;;;;;;;;;;;;;ACZ+D;AAClG,YAAyG;;AAEzG;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,+FAAO;;;;AAIxB,iEAAe,+FAAO,aAAa;;;;;;;;;;;;;;;;;ACZ+D;AAClG,YAA8G;;AAE9G;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,oGAAO;;;;AAIxB,iEAAe,oGAAO,aAAa;;;;;;;;;;;;;;;;;ACZ+D;AAClG,YAAqH;;AAErH;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,2GAAO;;;;AAIxB,iEAAe,2GAAO,aAAa;;;;;;;;;;;;;;;;;ACZ+D;AAClG,YAAgH;;AAEhH;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,sGAAO;;;;AAIxB,iEAAe,sGAAO,aAAa;;;;;;;;;;;;;;;;;ACZ+D;AAClG,YAAkH;;AAElH;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,wGAAO;;;;AAIxB,iEAAe,wGAAO,aAAa;;;;;;;;;;;;;;;;;ACZyD;AAC5F,YAAoG;;AAEpG;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,gGAAO;;;;AAIxB,iEAAe,gGAAO,aAAa;;;;;;;;;;;;;;;;;ACZsD;AACzF,YAA4G;;AAE5G;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,2GAAO;;;;AAIxB,iEAAe,2GAAO,aAAa;;;;;;;;;;;;;;;;;ACZsD;AACzF,YAAkG;;AAElG;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,iGAAO;;;;AAIxB,iEAAe,iGAAO,aAAa;;;;;;;;;;;;;;;;;ACZsD;AACzF,YAA8F;;AAE9F;;AAEA;AACA;;AAEA,aAAa,0GAAG,CAAC,6FAAO;;;;AAIxB,iEAAe,6FAAO,aAAa;;;;;;;;UCZnC;UACA;UACA;UACA,CAAC","sources":["webpack://ab_platform_web/./js/webix/components/gantt/gantt.min.css","webpack://ab_platform_web/./js/webix/components/hint/hint.css","webpack://ab_platform_web/./js/webix/components/query/query.min.css","webpack://ab_platform_web/./js/webix/components/querybuilder/querybuilder.min.css","webpack://ab_platform_web/./js/webix/components/reports/reports.min.css","webpack://ab_platform_web/./js/webix/components/scheduler/scheduler.min.css","webpack://ab_platform_web/./js/webix/webix.css","webpack://ab_platform_web/./styles/font-awesome.min.css","webpack://ab_platform_web/./styles/loader.css","webpack://ab_platform_web/./styles/ui.css","webpack://ab_platform_web/./config/Config.js","webpack://ab_platform_web/./config/configDesktop.js","webpack://ab_platform_web/./config/configMobile.js","webpack://ab_platform_web/./index.js","webpack://ab_platform_web/./init/Bootstrap.js","webpack://ab_platform_web/./init/initConfig.js","webpack://ab_platform_web/./init/initDiv.js","webpack://ab_platform_web/./init/initUser.js","webpack://ab_platform_web/./ui/ClassUI.js","webpack://ab_platform_web/./ui/ClassUIPage.js","webpack://ab_platform_web/./ui/error_noDefs.js","webpack://ab_platform_web/./ui/portal.js","webpack://ab_platform_web/./ui/portal_access_level_manager.js","webpack://ab_platform_web/./ui/portal_auth.js","webpack://ab_platform_web/./ui/portal_auth_login.js","webpack://ab_platform_web/./ui/portal_auth_login_form.js","webpack://ab_platform_web/./ui/portal_auth_login_resetPassword.js","webpack://ab_platform_web/./ui/portal_auth_login_resetRequest.js","webpack://ab_platform_web/./ui/portal_loading.js","webpack://ab_platform_web/./ui/portal_translation_tool.js","webpack://ab_platform_web/./ui/portal_tutorial_manager.js","webpack://ab_platform_web/./ui/portal_work.js","webpack://ab_platform_web/./ui/portal_work_inbox.js","webpack://ab_platform_web/./ui/portal_work_inbox_accordion.js","webpack://ab_platform_web/./ui/portal_work_inbox_taskWindow.js","webpack://ab_platform_web/./ui/portal_work_task_user_form.js","webpack://ab_platform_web/./ui/portal_work_user_mobile_qr.js","webpack://ab_platform_web/./ui/portal_work_user_profile_window.js","webpack://ab_platform_web/./ui/portal_work_user_qr_window.js","webpack://ab_platform_web/./ui/portal_work_user_switcheroo.js","webpack://ab_platform_web/./ui/ui.js","webpack://ab_platform_web/./utils/performance.js","webpack://ab_platform_web/./js/webix/components/gantt/gantt.min.css?01a8","webpack://ab_platform_web/./js/webix/components/hint/hint.css?8c20","webpack://ab_platform_web/./js/webix/components/query/query.min.css?5ecb","webpack://ab_platform_web/./js/webix/components/querybuilder/querybuilder.min.css?d1c4","webpack://ab_platform_web/./js/webix/components/reports/reports.min.css?71d1","webpack://ab_platform_web/./js/webix/components/scheduler/scheduler.min.css?b355","webpack://ab_platform_web/./js/webix/webix.css?40ef","webpack://ab_platform_web/./styles/font-awesome.min.css?4c12","webpack://ab_platform_web/./styles/loader.css?2e54","webpack://ab_platform_web/./styles/ui.css?95be","webpack://ab_platform_web/webpack/runtime/startup prefetch"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@charset \\\"UTF-8\\\";.webix_gantt_tree .wxi-plus,.webix_gantt_tree .wxi-plus-circle{line-height:42px;font-size:22px}.webix_gantt_link{top:6px;width:16px;height:16px}.webix_gantt_milestone .webix_gantt_link{top:2px}.webix_gantt_milestone .webix_gantt_link_left.webix_gantt_link{left:-24px}.webix_gantt_milestone .webix_gantt_link_right.webix_gantt_link{right:-24px}.webix_gantt_scale .webix_template{padding:0}.webix_gantt_scale_row{display:flex;box-sizing:border-box}.webix_gantt_scale_row:not(:last-child){border-bottom:1px solid #dadee0}.webix_gantt_scale_cell{display:flex;flex:0 0 auto;justify-content:center;align-items:center;border-right:1px solid #dadee0;box-sizing:border-box;background-color:#f4f5f9}.webix_gantt_layer{position:absolute;top:0;left:0;width:100%;height:100%}.webix_gantt_task_base{position:absolute;box-sizing:border-box;border-radius:2px;color:#fff;cursor:pointer}.webix_gantt_project{background-color:#38aea2}.webix_gantt_task{background-color:#6ba8cb}.webix_gantt_project:hover,.webix_gantt_task:hover{z-index:3;box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_gantt_milestone{background-color:transparent}.webix_gantt_in_action .webix_gantt_task_base,.webix_gantt_task_in_action{pointer-events:none}.webix_drag_zone.webix_gantt_task_base{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_drag_zone.webix_gantt_task_base.webix_gantt_milestone{box-shadow:none}.webix_drag_zone.webix_gantt_task_base.webix_gantt_milestone .webix_gantt_content{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_gantt_progress{height:100%;background-color:#4d96c0;border-radius:2px 0 0 2px}.webix_gantt_project .webix_gantt_progress{background-color:#2e8f85}.webix_gantt_milestone .webix_gantt_content{transform:rotate(45deg);background-color:#cf89d5;border-radius:inherit;padding:0;width:100%;text-overflow:clip}.webix_gantt_milestone .webix_gantt_content span{visibility:hidden}.webix_gantt_milestone:hover .webix_gantt_content,.webix_gantt_milestone .webix_gantt_content:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_gantt_progress_drag{position:absolute;z-index:1;cursor:ew-resize;top:100%;border:10px solid transparent;border-bottom:10px solid #dadee0;margin-top:-19px;margin-left:-10px;visibility:hidden}.webix_gantt_task_base:hover .webix_gantt_progress_drag,.webix_gantt_mode_progress .webix_gantt_progress_drag{visibility:visible}.webix_gantt_progress_drag::before{content:\\\"\\\";position:absolute;border:8px solid transparent;border-bottom:8px solid #fff;top:-7px;left:-8px}.webix_gantt_progress_percent{position:absolute;left:-10px;top:9px;display:inline-block;line-height:14px;width:20px;border:1px solid #dadee0;border-top:0;border-radius:2px 2px 4px 4px;box-sizing:border-box;background:#fff;color:#1ca1c1;text-align:center;font-size:10px}.webix_gantt_content{text-align:center;line-height:30px;position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 12px}.webix_gantt_link{position:absolute;z-index:2;border-radius:50%;border:1px solid #dadee0;background-color:#fff;cursor:pointer;user-select:none;opacity:0}.webix_gantt_link_visible .webix_gantt_content:hover,.webix_gantt_task_base.webix_gantt_link_visible:hover,.webix_gantt_task_base.webix_gantt_link_visible:hover .webix_gantt_content{box-shadow:none}.webix_gantt_task,.webix_gantt_project{box-shadow:#fff 1px 0 0}.webix_gantt_milestone .webix_gantt_content{box-shadow:#fff 1px -1px 0}.webix_gantt_task.webix_gantt_link_visible .webix_gantt_progress_drag{visibility:hidden}.webix_gantt_link_visible .webix_gantt_link{opacity:1}.webix_gantt_link_left{left:-9px}.webix_gantt_link_right{right:-9px}.webix_gantt_task_base:hover .webix_gantt_link,.webix_gantt_link:hover{opacity:1}.webix_gantt_readonly .webix_gantt_task_base .webix_gantt_link{display:none}.webix_gantt_group.webix_gantt_project{cursor:default}.webix_gantt_group.webix_gantt_project .webix_gantt_link{display:none}.webix_gantt_touch_bars .webix_gantt_task .webix_gantt_content{padding:0 32px}.webix_gantt_touch_bars .webix_gantt_task::before,.webix_gantt_touch_bars .webix_gantt_task::after{content:\\\"\\\";font-size:20px;font-family:\\\"Webix Material Icons\\\";position:absolute;visibility:hidden;top:50%;margin-top:-10px}.webix_gantt_touch_bars .webix_gantt_task::before{left:12px}.webix_gantt_touch_bars .webix_gantt_task::after{right:12px}.webix_gantt_touch_bars .webix_gantt_task_base .webix_gantt_progress_drag{visibility:hidden}.webix_gantt_touch_bars .webix_gantt_mode_start::before,.webix_gantt_touch_bars .webix_gantt_mode_end::after,.webix_gantt_touch_bars .webix_gantt_task:hover::before,.webix_gantt_touch_bars .webix_gantt_task:hover::after{visibility:visible}.webix_gantt_task_base.webix_gantt_last::after{content:\\\"\\\";display:block;height:7px}.webix_gantt_task_base.webix_gantt_last .webix_gantt_progress_drag{transform:rotate(180deg);top:unset;bottom:100%;margin-bottom:-19px}.webix_gantt_task_base.webix_gantt_last .webix_gantt_progress_percent{transform:rotate(180deg);top:8.5px;border-radius:4px 4px 2px 2px;border:1px solid #dadee0;border-bottom:0}.webix_gantt_bars,.webix_gantt_touch_bars,.webix_gantt_links,.webix_gantt_holidays{background:transparent}.webix_gantt_bars,.webix_gantt_touch_bars{border-color:#fff}.webix_gantt_links .webix_template{position:relative;padding:0}.webix_gantt_links polyline{stroke:orange;fill:transparent;stroke-width:2}.webix_gantt_temp_line{pointer-events:none;position:absolute;z-index:1;top:0;left:0}.webix_gantt_bar_selection{background-color:rgba(195,200,222,0.2);position:absolute;top:-100px;pointer-events:none}.webix_gantt_markers{pointer-events:none;position:absolute}.webix_gantt_marker{position:absolute;left:-100px;top:0;width:2px;height:inherit;margin-left:-1px;background-color:#1ca1c1;opacity:.6}.webix_gantt_marker_text{display:inline-block;padding:4px 8px;line-height:16px;white-space:nowrap;border-bottom-right-radius:4px;background-color:inherit;color:#fff}.webix_gantt_marker.webix_gantt_today_marker{background-color:#ff5c4c}.webix_gantt_holidays .webix_template{position:relative;padding:0}.webix_gantt_bar_holidays,.webix_gantt_bar_resource_holidays{position:absolute;pointer-events:none}.webix_gantt_holiday{position:absolute;background-color:rgba(97,120,151,0.12)}.webix_gantt_bar_resource_holidays .webix_gantt_holiday{background-color:rgba(97,120,151,0.12)}.webix_gantt_bar_resource_holidays .webix_gantt_work_day{position:absolute;background-color:#fff}.webix_gantt_bar_holidays .webix_gantt_holiday{top:0;height:inherit}.webix_gantt_scale_cell.webix_gantt_holiday_scale{background-color:rgba(97,120,151,0.12)}.webix_gantt_critical.webix_gantt_task{background:#ff5c4c}.webix_gantt_critical.webix_gantt_task .webix_gantt_progress{background:#ff3723}.webix_gantt_critical.webix_gantt_milestone{background-color:transparent}.webix_gantt_critical.webix_gantt_milestone .webix_gantt_content{background:#ff5c4c}.webix_gantt_critical.webix_gantt_project{background-color:#f50}.webix_gantt_critical.webix_gantt_project .webix_gantt_progress{background-color:#d64700}.webix_gantt_links polyline.webix_gantt_line_critical{stroke:#ff5c4c}.webix_gantt_split_selection{position:absolute;z-index:2;background-color:rgba(107,168,203,0.2);border:1px solid #6ba8cb;border-radius:2px}.webix_gantt_split_task .webix_tree_close{visibility:hidden}.webix_gantt_split_container{position:absolute;pointer-events:none;background-image:linear-gradient(to right,#1ca1c1 50%,rgba(255,255,255,0) 0);background-position:bottom;background-size:14px 2px;background-repeat:repeat-x}.webix_gantt_baseline_task,.webix_gantt_baseline_project{position:absolute;height:5px;border-radius:2px}.webix_gantt_baseline_task{background-color:rgba(24,80,111,0.75)}.webix_gantt_baseline_project{background-color:rgba(7,80,73,0.8)}.webix_gantt_task_info ul{margin:0;padding:5px 0 0 15px}.webix_gantt_task_info .webix_template{overflow:auto;padding:0 0 0 2px;line-height:20px}ul.webix_gantt_info_list_resources{padding:5px 0 0}.webix_gantt_info_resource{display:flex;align-items:stretch;padding:0 0 1px;line-height:normal}.webix_gantt_info_list_text_row{display:flex;align-items:baseline;padding-top:4px}.webix_gantt_info_list_text{min-width:130px;margin-left:8px;margin-right:8px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.webix_gantt_info_list_text.webix_gantt_resource_section{padding-left:0}.webix_gantt_task_title{color:#313131;font-weight:500;font-size:16px}.webix_gantt_task_text{line-height:20px}.webix_gantt_info_list_planned{padding-top:5px}.webix_gantt_form_tree .webix_gantt_title .webix_cell{padding-left:8px}.webix_gantt_form_tree .webix_gantt_action .wxi-trash{margin-left:-10px;height:20px;font-size:18px}.webix_gantt_form_tree .webix_cell{border-bottom-color:transparent}.webix_gantt_form_tree .webix_gantt_type .webix_cell,.webix_gantt_form_tree .webix_gantt_value .webix_cell{padding-right:4px;text-align:right}.webix_gantt_form_tree .webix_dt_editor input{text-align:right}.webix_gantt_form_counter .webix_inp_counter_value{width:calc(50% - 60px)}.webix_list .webix_gantt_resource_section{float:right;text-align:right}.webix_gantt_resource_section{padding-left:5px;color:#888;width:80px;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.webix_gantt_resource_table .webix_gantt_title .webix_cell.webix_gantt_select_editor{box-shadow:inset 0 0 0 1px #1ca1c1;border-radius:2px;padding-left:8px;background:#fff}.webix_gantt_select_editor_popup .webix_selected{box-shadow:none}.webix_gantt_select_editor_popup .webix_list_item,.webix_gantt_select_editor_popup .webix_list_item.webix_selected{padding:0 8px;line-height:36px}.webix_gantt_form_unit_title{padding-right:12px}.webix_gantt_table_hover[aria-level=\\\"2\\\"],.webix_gantt_link_table_hover[aria-level=\\\"2\\\"]{background:rgba(244,245,249,0.6)}.webix_gantt .webix_transparent .webix_button{color:#1ca1c1}.webix_gantt .webix_transparent .webix_el_box:not(.webix_disabled_box) .webix_icon_btn{color:#1ca1c1}.webix_gantt_select_editor_popup .webix_scroll_cont:empty:before{content:attr(placeholder);font-size:12px;font-style:italic;color:#888;text-align:center;display:inline-block;width:100%;line-height:28px}.webix_gantt_datepicker .webix_cal_icon_clear{display:none}.webix_gantt_tree .webix_gantt_action .webix_icon{cursor:pointer}.webix_gantt_tree .webix_gantt_action .webix_icon:hover{color:#1ca1c1}.webix_gantt_tree .webix_column.webix_gantt_action>div,.webix_gantt_tree .webix_hcell.webix_gantt_action{padding:0 11px}.webix_gantt_tree .webix_gantt_title .webix_cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.webix_gantt_tree .webix_column>div.webix_row_select{background-color:#f4f5f9;color:#475466}.webix_gantt_tree .webix_ss_body .webix_column>div{border-right-color:transparent;border-left-color:transparent}.webix_gantt_resizer{background-color:#ebedf0}.webix_gantt_resizer.webix_resizer_x{z-index:5;position:relative;overflow:visible}.webix_gantt_resizer.webix_resizer_x:after{position:absolute;left:-4px;height:100%;content:\\\"\\\";width:9px}.webix_drag_zone .webix_dd_drag.webix_gantt_tree_no_icon .webix_tree_close{visibility:hidden}@font-face{font-family:\\\"gantt-webfont\\\";src:url(\\\"fonts/gantt-webfont.woff2\\\") format(\\\"woff2\\\"),url(\\\"fonts/gantt-webfont.woff\\\") format(\\\"woff\\\");font-weight:normal;font-style:normal}[class^=gti-]:before,[class*=gti-]:before{font-family:\\\"gantt-webfont\\\";display:inline-block;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.gti-menu:before{content:\\\"\\\"}.webix_gantt_accordion .webix_accordionitem{border-color:transparent}.webix_gantt_accordion .webix_accordionitem_header{border-color:transparent;font-size:inherit}.webix_gantt_accordion .webix_accordionitem_header .webix_accordionitem_button{color:#94a1b3}.webix_gantt_accordion .webix_accordionitem.collapsed .webix_accordionitem_header .webix_accordionitem_button{color:#94a1b3}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header.collapsed .webix_accordionitem_button:before{content:\\\"\\\"}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button{margin:0 6px 0 1px}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button:before{content:\\\"\\\"}.webix_gantt_accordion .webix_accordionitem.collapsed .webix_accordionitem_header:hover,.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header:hover{background-color:rgba(195,200,222,0.2)}.webix_gantt_accordion .webix_accordionitem_label{color:#313131}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header{background-color:#f4f5f9}.webix_gantt_person_avatar,.webix_gantt_cell_remain_num{vertical-align:middle;margin:4px 4px 4px 0;height:24px;line-height:24px;flex-shrink:0;width:24px;font-size:12px;border-radius:50%;display:inline-block;text-align:center;color:rgba(255,255,255,0.9)}.webix_gantt_person_avatar_big{height:32px;line-height:32px;width:32px;font-size:14px}.webix_gantt_person_avatar_0{background:#00a037}.webix_gantt_person_avatar_1{background:#13a1aa}.webix_gantt_person_avatar_2{background:#fd772c}.webix_gantt_person_avatar_3{background:#b26bd3}.webix_gantt_person_avatar_4{background:#c87095}.webix_gantt_person_avatar_5{background:#eb2f89}.webix_gantt_person_avatar_6{background:#9bb402}.webix_gantt_person_avatar_7{background:#e7a90b}.webix_gantt_person_avatar_8{background:#0bbed7}.webix_gantt_person_avatar_9{background:#038cd9}.webix_gantt_tree_column_resources .webix_cell{padding:0 8px}.webix_gantt_cell_assigned_text{font-size:12px}.webix_gantt_cell_assigned_last{width:24px;display:inline-block}.webix_gantt_cell_remain_num{position:relative;left:-28px;z-index:1;background:rgba(0,0,0,0.5)}.webix_gantt_avatar_box{height:100%;display:flex;align-items:center}.webix_gantt_avatar_box .webix_icon{flex-basis:20px}.webix_gantt_avatar_box_inline{display:inline-flex;align-items:center}.webix_gantt_avatar_option_box{display:flex;align-items:center;justify-content:space-between}.webix_gantt_editor_avatar_name{max-width:170px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-left:2px}.webix_popup .webix_gantt_editor_avatar_name{max-width:190px}.webix_gantt_absbutton{border-radius:50%;z-index:91}.webix_gantt_absbutton .webix_el_box{background-color:#1ca1c1}.webix_gantt_absbutton .webix_el_box .webix_icon_button:hover:before{background-color:#1992af}.webix_gantt_absbutton .webix_el_box .webix_icon{color:#fff}.webix_gantt_resdiagram_tree .webix_tree_none,.webix_gantt_resdiagram_tree .webix_tree_folder_open{cursor:default}.webix_gantt_resdiagram_tree .webix_cell{text-overflow:ellipsis}.webix_gantt_resdiagram_tree .webix_ss_body .webix_column>div{border-right-color:transparent;border-left-color:transparent}.webix_gantt_resdiagram_chart.webix_tree .webix_scroll_cont>.webix_tree_leaves{padding:0}.webix_gantt_resdiagram_chart.webix_tree .webix_scroll_cont>.webix_tree_leaves:last-child::after{content:\\\"\\\";display:block;height:2px}.webix_gantt_diagram_marker{display:inline-block;position:absolute;color:#fff;text-align:center;background-color:#55cd97;border-radius:32px;width:32px;height:32px;line-height:32px}.webix_gantt_diagram_marker.webix_gantt_overload{background-color:#ff5c4c}.webix_gantt_diagram_line.webix_tree_item{padding:4px}.webix_gantt .webix_progress_top{z-index:10000}.webix_gantt_scale{border-bottom-color:#5ccce7}.webix_gantt_danger .webix_button{color:#ff5c4c;background-color:#fff1ef}.webix_gantt_danger .webix_button:hover,.webix_gantt_danger .webix_button:focus{background-color:#ffe7e5}.webix_gantt_danger .webix_button:active{background-color:#ffdedb}\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/components/gantt/gantt.min.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@charset \\\"UTF-8\\\";.webix_gantt_tree .wxi-plus,.webix_gantt_tree .wxi-plus-circle{line-height:42px;font-size:22px}.webix_gantt_link{top:6px;width:16px;height:16px}.webix_gantt_milestone .webix_gantt_link{top:2px}.webix_gantt_milestone .webix_gantt_link_left.webix_gantt_link{left:-24px}.webix_gantt_milestone .webix_gantt_link_right.webix_gantt_link{right:-24px}.webix_gantt_scale .webix_template{padding:0}.webix_gantt_scale_row{display:flex;box-sizing:border-box}.webix_gantt_scale_row:not(:last-child){border-bottom:1px solid #dadee0}.webix_gantt_scale_cell{display:flex;flex:0 0 auto;justify-content:center;align-items:center;border-right:1px solid #dadee0;box-sizing:border-box;background-color:#f4f5f9}.webix_gantt_layer{position:absolute;top:0;left:0;width:100%;height:100%}.webix_gantt_task_base{position:absolute;box-sizing:border-box;border-radius:2px;color:#fff;cursor:pointer}.webix_gantt_project{background-color:#38aea2}.webix_gantt_task{background-color:#6ba8cb}.webix_gantt_project:hover,.webix_gantt_task:hover{z-index:3;box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_gantt_milestone{background-color:transparent}.webix_gantt_in_action .webix_gantt_task_base,.webix_gantt_task_in_action{pointer-events:none}.webix_drag_zone.webix_gantt_task_base{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_drag_zone.webix_gantt_task_base.webix_gantt_milestone{box-shadow:none}.webix_drag_zone.webix_gantt_task_base.webix_gantt_milestone .webix_gantt_content{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_gantt_progress{height:100%;background-color:#4d96c0;border-radius:2px 0 0 2px}.webix_gantt_project .webix_gantt_progress{background-color:#2e8f85}.webix_gantt_milestone .webix_gantt_content{transform:rotate(45deg);background-color:#cf89d5;border-radius:inherit;padding:0;width:100%;text-overflow:clip}.webix_gantt_milestone .webix_gantt_content span{visibility:hidden}.webix_gantt_milestone:hover .webix_gantt_content,.webix_gantt_milestone .webix_gantt_content:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_gantt_progress_drag{position:absolute;z-index:1;cursor:ew-resize;top:100%;border:10px solid transparent;border-bottom:10px solid #dadee0;margin-top:-19px;margin-left:-10px;visibility:hidden}.webix_gantt_task_base:hover .webix_gantt_progress_drag,.webix_gantt_mode_progress .webix_gantt_progress_drag{visibility:visible}.webix_gantt_progress_drag::before{content:\\\"\\\";position:absolute;border:8px solid transparent;border-bottom:8px solid #fff;top:-7px;left:-8px}.webix_gantt_progress_percent{position:absolute;left:-10px;top:9px;display:inline-block;line-height:14px;width:20px;border:1px solid #dadee0;border-top:0;border-radius:2px 2px 4px 4px;box-sizing:border-box;background:#fff;color:#1ca1c1;text-align:center;font-size:10px}.webix_gantt_content{text-align:center;line-height:30px;position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 12px}.webix_gantt_link{position:absolute;z-index:2;border-radius:50%;border:1px solid #dadee0;background-color:#fff;cursor:pointer;user-select:none;opacity:0}.webix_gantt_link_visible .webix_gantt_content:hover,.webix_gantt_task_base.webix_gantt_link_visible:hover,.webix_gantt_task_base.webix_gantt_link_visible:hover .webix_gantt_content{box-shadow:none}.webix_gantt_task,.webix_gantt_project{box-shadow:#fff 1px 0 0}.webix_gantt_milestone .webix_gantt_content{box-shadow:#fff 1px -1px 0}.webix_gantt_task.webix_gantt_link_visible .webix_gantt_progress_drag{visibility:hidden}.webix_gantt_link_visible .webix_gantt_link{opacity:1}.webix_gantt_link_left{left:-9px}.webix_gantt_link_right{right:-9px}.webix_gantt_task_base:hover .webix_gantt_link,.webix_gantt_link:hover{opacity:1}.webix_gantt_readonly .webix_gantt_task_base .webix_gantt_link{display:none}.webix_gantt_group.webix_gantt_project{cursor:default}.webix_gantt_group.webix_gantt_project .webix_gantt_link{display:none}.webix_gantt_touch_bars .webix_gantt_task .webix_gantt_content{padding:0 32px}.webix_gantt_touch_bars .webix_gantt_task::before,.webix_gantt_touch_bars .webix_gantt_task::after{content:\\\"\\\";font-size:20px;font-family:\\\"Webix Material Icons\\\";position:absolute;visibility:hidden;top:50%;margin-top:-10px}.webix_gantt_touch_bars .webix_gantt_task::before{left:12px}.webix_gantt_touch_bars .webix_gantt_task::after{right:12px}.webix_gantt_touch_bars .webix_gantt_task_base .webix_gantt_progress_drag{visibility:hidden}.webix_gantt_touch_bars .webix_gantt_mode_start::before,.webix_gantt_touch_bars .webix_gantt_mode_end::after,.webix_gantt_touch_bars .webix_gantt_task:hover::before,.webix_gantt_touch_bars .webix_gantt_task:hover::after{visibility:visible}.webix_gantt_task_base.webix_gantt_last::after{content:\\\"\\\";display:block;height:7px}.webix_gantt_task_base.webix_gantt_last .webix_gantt_progress_drag{transform:rotate(180deg);top:unset;bottom:100%;margin-bottom:-19px}.webix_gantt_task_base.webix_gantt_last .webix_gantt_progress_percent{transform:rotate(180deg);top:8.5px;border-radius:4px 4px 2px 2px;border:1px solid #dadee0;border-bottom:0}.webix_gantt_bars,.webix_gantt_touch_bars,.webix_gantt_links,.webix_gantt_holidays{background:transparent}.webix_gantt_bars,.webix_gantt_touch_bars{border-color:#fff}.webix_gantt_links .webix_template{position:relative;padding:0}.webix_gantt_links polyline{stroke:orange;fill:transparent;stroke-width:2}.webix_gantt_temp_line{pointer-events:none;position:absolute;z-index:1;top:0;left:0}.webix_gantt_bar_selection{background-color:rgba(195,200,222,0.2);position:absolute;top:-100px;pointer-events:none}.webix_gantt_markers{pointer-events:none;position:absolute}.webix_gantt_marker{position:absolute;left:-100px;top:0;width:2px;height:inherit;margin-left:-1px;background-color:#1ca1c1;opacity:.6}.webix_gantt_marker_text{display:inline-block;padding:4px 8px;line-height:16px;white-space:nowrap;border-bottom-right-radius:4px;background-color:inherit;color:#fff}.webix_gantt_marker.webix_gantt_today_marker{background-color:#ff5c4c}.webix_gantt_holidays .webix_template{position:relative;padding:0}.webix_gantt_bar_holidays,.webix_gantt_bar_resource_holidays{position:absolute;pointer-events:none}.webix_gantt_holiday{position:absolute;background-color:rgba(97,120,151,0.12)}.webix_gantt_bar_resource_holidays .webix_gantt_holiday{background-color:rgba(97,120,151,0.12)}.webix_gantt_bar_resource_holidays .webix_gantt_work_day{position:absolute;background-color:#fff}.webix_gantt_bar_holidays .webix_gantt_holiday{top:0;height:inherit}.webix_gantt_scale_cell.webix_gantt_holiday_scale{background-color:rgba(97,120,151,0.12)}.webix_gantt_critical.webix_gantt_task{background:#ff5c4c}.webix_gantt_critical.webix_gantt_task .webix_gantt_progress{background:#ff3723}.webix_gantt_critical.webix_gantt_milestone{background-color:transparent}.webix_gantt_critical.webix_gantt_milestone .webix_gantt_content{background:#ff5c4c}.webix_gantt_critical.webix_gantt_project{background-color:#f50}.webix_gantt_critical.webix_gantt_project .webix_gantt_progress{background-color:#d64700}.webix_gantt_links polyline.webix_gantt_line_critical{stroke:#ff5c4c}.webix_gantt_split_selection{position:absolute;z-index:2;background-color:rgba(107,168,203,0.2);border:1px solid #6ba8cb;border-radius:2px}.webix_gantt_split_task .webix_tree_close{visibility:hidden}.webix_gantt_split_container{position:absolute;pointer-events:none;background-image:linear-gradient(to right,#1ca1c1 50%,rgba(255,255,255,0) 0);background-position:bottom;background-size:14px 2px;background-repeat:repeat-x}.webix_gantt_baseline_task,.webix_gantt_baseline_project{position:absolute;height:5px;border-radius:2px}.webix_gantt_baseline_task{background-color:rgba(24,80,111,0.75)}.webix_gantt_baseline_project{background-color:rgba(7,80,73,0.8)}.webix_gantt_task_info ul{margin:0;padding:5px 0 0 15px}.webix_gantt_task_info .webix_template{overflow:auto;padding:0 0 0 2px;line-height:20px}ul.webix_gantt_info_list_resources{padding:5px 0 0}.webix_gantt_info_resource{display:flex;align-items:stretch;padding:0 0 1px;line-height:normal}.webix_gantt_info_list_text_row{display:flex;align-items:baseline;padding-top:4px}.webix_gantt_info_list_text{min-width:130px;margin-left:8px;margin-right:8px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.webix_gantt_info_list_text.webix_gantt_resource_section{padding-left:0}.webix_gantt_task_title{color:#313131;font-weight:500;font-size:16px}.webix_gantt_task_text{line-height:20px}.webix_gantt_info_list_planned{padding-top:5px}.webix_gantt_form_tree .webix_gantt_title .webix_cell{padding-left:8px}.webix_gantt_form_tree .webix_gantt_action .wxi-trash{margin-left:-10px;height:20px;font-size:18px}.webix_gantt_form_tree .webix_cell{border-bottom-color:transparent}.webix_gantt_form_tree .webix_gantt_type .webix_cell,.webix_gantt_form_tree .webix_gantt_value .webix_cell{padding-right:4px;text-align:right}.webix_gantt_form_tree .webix_dt_editor input{text-align:right}.webix_gantt_form_counter .webix_inp_counter_value{width:calc(50% - 60px)}.webix_list .webix_gantt_resource_section{float:right;text-align:right}.webix_gantt_resource_section{padding-left:5px;color:#888;width:80px;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.webix_gantt_resource_table .webix_gantt_title .webix_cell.webix_gantt_select_editor{box-shadow:inset 0 0 0 1px #1ca1c1;border-radius:2px;padding-left:8px;background:#fff}.webix_gantt_select_editor_popup .webix_selected{box-shadow:none}.webix_gantt_select_editor_popup .webix_list_item,.webix_gantt_select_editor_popup .webix_list_item.webix_selected{padding:0 8px;line-height:36px}.webix_gantt_form_unit_title{padding-right:12px}.webix_gantt_table_hover[aria-level=\\\"2\\\"],.webix_gantt_link_table_hover[aria-level=\\\"2\\\"]{background:rgba(244,245,249,0.6)}.webix_gantt .webix_transparent .webix_button{color:#1ca1c1}.webix_gantt .webix_transparent .webix_el_box:not(.webix_disabled_box) .webix_icon_btn{color:#1ca1c1}.webix_gantt_select_editor_popup .webix_scroll_cont:empty:before{content:attr(placeholder);font-size:12px;font-style:italic;color:#888;text-align:center;display:inline-block;width:100%;line-height:28px}.webix_gantt_datepicker .webix_cal_icon_clear{display:none}.webix_gantt_tree .webix_gantt_action .webix_icon{cursor:pointer}.webix_gantt_tree .webix_gantt_action .webix_icon:hover{color:#1ca1c1}.webix_gantt_tree .webix_column.webix_gantt_action>div,.webix_gantt_tree .webix_hcell.webix_gantt_action{padding:0 11px}.webix_gantt_tree .webix_gantt_title .webix_cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.webix_gantt_tree .webix_column>div.webix_row_select{background-color:#f4f5f9;color:#475466}.webix_gantt_tree .webix_ss_body .webix_column>div{border-right-color:transparent;border-left-color:transparent}.webix_gantt_resizer{background-color:#ebedf0}.webix_gantt_resizer.webix_resizer_x{z-index:5;position:relative;overflow:visible}.webix_gantt_resizer.webix_resizer_x:after{position:absolute;left:-4px;height:100%;content:\\\"\\\";width:9px}.webix_drag_zone .webix_dd_drag.webix_gantt_tree_no_icon .webix_tree_close{visibility:hidden}@font-face{font-family:\\\"gantt-webfont\\\";src:url(\\\"fonts/gantt-webfont.woff2\\\") format(\\\"woff2\\\"),url(\\\"fonts/gantt-webfont.woff\\\") format(\\\"woff\\\");font-weight:normal;font-style:normal}[class^=gti-]:before,[class*=gti-]:before{font-family:\\\"gantt-webfont\\\";display:inline-block;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.gti-menu:before{content:\\\"\\\"}.webix_gantt_accordion .webix_accordionitem{border-color:transparent}.webix_gantt_accordion .webix_accordionitem_header{border-color:transparent;font-size:inherit}.webix_gantt_accordion .webix_accordionitem_header .webix_accordionitem_button{color:#94a1b3}.webix_gantt_accordion .webix_accordionitem.collapsed .webix_accordionitem_header .webix_accordionitem_button{color:#94a1b3}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header.collapsed .webix_accordionitem_button:before{content:\\\"\\\"}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button{margin:0 6px 0 1px}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button:before{content:\\\"\\\"}.webix_gantt_accordion .webix_accordionitem.collapsed .webix_accordionitem_header:hover,.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header:hover{background-color:rgba(195,200,222,0.2)}.webix_gantt_accordion .webix_accordionitem_label{color:#313131}.webix_gantt_accordion .webix_accordionitem .webix_accordionitem_header{background-color:#f4f5f9}.webix_gantt_person_avatar,.webix_gantt_cell_remain_num{vertical-align:middle;margin:4px 4px 4px 0;height:24px;line-height:24px;flex-shrink:0;width:24px;font-size:12px;border-radius:50%;display:inline-block;text-align:center;color:rgba(255,255,255,0.9)}.webix_gantt_person_avatar_big{height:32px;line-height:32px;width:32px;font-size:14px}.webix_gantt_person_avatar_0{background:#00a037}.webix_gantt_person_avatar_1{background:#13a1aa}.webix_gantt_person_avatar_2{background:#fd772c}.webix_gantt_person_avatar_3{background:#b26bd3}.webix_gantt_person_avatar_4{background:#c87095}.webix_gantt_person_avatar_5{background:#eb2f89}.webix_gantt_person_avatar_6{background:#9bb402}.webix_gantt_person_avatar_7{background:#e7a90b}.webix_gantt_person_avatar_8{background:#0bbed7}.webix_gantt_person_avatar_9{background:#038cd9}.webix_gantt_tree_column_resources .webix_cell{padding:0 8px}.webix_gantt_cell_assigned_text{font-size:12px}.webix_gantt_cell_assigned_last{width:24px;display:inline-block}.webix_gantt_cell_remain_num{position:relative;left:-28px;z-index:1;background:rgba(0,0,0,0.5)}.webix_gantt_avatar_box{height:100%;display:flex;align-items:center}.webix_gantt_avatar_box .webix_icon{flex-basis:20px}.webix_gantt_avatar_box_inline{display:inline-flex;align-items:center}.webix_gantt_avatar_option_box{display:flex;align-items:center;justify-content:space-between}.webix_gantt_editor_avatar_name{max-width:170px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-left:2px}.webix_popup .webix_gantt_editor_avatar_name{max-width:190px}.webix_gantt_absbutton{border-radius:50%;z-index:91}.webix_gantt_absbutton .webix_el_box{background-color:#1ca1c1}.webix_gantt_absbutton .webix_el_box .webix_icon_button:hover:before{background-color:#1992af}.webix_gantt_absbutton .webix_el_box .webix_icon{color:#fff}.webix_gantt_resdiagram_tree .webix_tree_none,.webix_gantt_resdiagram_tree .webix_tree_folder_open{cursor:default}.webix_gantt_resdiagram_tree .webix_cell{text-overflow:ellipsis}.webix_gantt_resdiagram_tree .webix_ss_body .webix_column>div{border-right-color:transparent;border-left-color:transparent}.webix_gantt_resdiagram_chart.webix_tree .webix_scroll_cont>.webix_tree_leaves{padding:0}.webix_gantt_resdiagram_chart.webix_tree .webix_scroll_cont>.webix_tree_leaves:last-child::after{content:\\\"\\\";display:block;height:2px}.webix_gantt_diagram_marker{display:inline-block;position:absolute;color:#fff;text-align:center;background-color:#55cd97;border-radius:32px;width:32px;height:32px;line-height:32px}.webix_gantt_diagram_marker.webix_gantt_overload{background-color:#ff5c4c}.webix_gantt_diagram_line.webix_tree_item{padding:4px}.webix_gantt .webix_progress_top{z-index:10000}.webix_gantt_scale{border-bottom-color:#5ccce7}.webix_gantt_danger .webix_button{color:#ff5c4c;background-color:#fff1ef}.webix_gantt_danger .webix_button:hover,.webix_gantt_danger .webix_button:focus{background-color:#ffe7e5}.webix_gantt_danger .webix_button:active{background-color:#ffdedb}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".webix_hint_view.webix_hint_animated .webix_hint_overlay_hole_el {\\n fill: #000;\\n -webkit-transition: fill 0.4s ease-in;\\n -o-transition: fill 0.4s ease-in;\\n transition: fill 0.4s ease-in;\\n}\\n.webix_hint_view.webix_hint_animated .webix_hint {\\n opacity: 1;\\n -webkit-transition: opacity 0.4s ease-in;\\n -o-transition: opacity 0.4s ease-in;\\n transition: opacity 0.4s ease-in;\\n}\\n.webix_hint_overlay {\\n position: fixed;\\n width: 100%;\\n height: 100%;\\n top: 0;\\n left: 0;\\n z-index: 1010;\\n pointer-events: none;\\n overflow: hidden;\\n opacity: 0.6;\\n}\\n.webix_hint_view svg {\\n position: absolute;\\n height: 100%;\\n width: 100%;\\n left: 0;\\n top: 0;\\n}\\n.webix_hint_overflow {\\n pointer-events: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n position: relative;\\n height: 100%;\\n width: 100%;\\n min-width: 100%;\\n}\\n.webix_hint_overflow .webix_window,\\n.webix_hint_overflow .webix_popup {\\n pointer-events: all;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n.webix_hint {\\n position: fixed;\\n pointer-events: all;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n display: block;\\n z-index: 1012;\\n width: 310px;\\n border-radius: 2px;\\n background-color: #FFFFFF;\\n padding: 22px 50px 80px 22px;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n -webkit-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.1);\\n box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.1);\\n opacity: 0;\\n}\\n.webix_hint .webix_hint_label {\\n color: rgba(0, 0, 0, 0.54);\\n font-size: 16px;\\n line-height: 24px;\\n margin: -5px 0;\\n}\\n.webix_hint .webix_hint_title {\\n color: rgba(0, 0, 0, 0.87);\\n font-size: 20px;\\n font-weight: 500;\\n line-height: 1;\\n margin-bottom: 15px;\\n}\\n.webix_hint_buttons {\\n position: absolute;\\n bottom: 11px;\\n right: 22px;\\n}\\n.webix_hint_buttons .webix_hint_button {\\n display: inline-block;\\n pointer-events: all;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n cursor: pointer;\\n margin: 0 auto;\\n height: 32px;\\n padding: 0px 16px;\\n border: none;\\n border-radius: 2px;\\n font-size: 14px;\\n font-weight: 500;\\n line-height: 16px;\\n text-transform: uppercase;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_next {\\n margin-left: 17px;\\n background-color: #00BFC7;\\n color: #fff;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_next:hover {\\n background-color: #27D6DD;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_prev {\\n color: #0097A7;\\n background-color: #fff;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_prev:hover {\\n background-color: rgba(0, 191, 199, 0.1);\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_prev.webix_hint_button_hidden {\\n display: none;\\n}\\n.webix_hint_progress {\\n position: absolute;\\n bottom: 17px;\\n left: 22px;\\n color: rgba(0, 0, 0, 0.54);\\n font-size: 14px;\\n}\\n.webix_hint_button_close {\\n position: absolute;\\n right: 22px;\\n top: 20px;\\n z-index: 1012;\\n background: transparent;\\n border: none;\\n font-size: 22px;\\n color: rgba(0, 0, 0, 0.54);\\n pointer-events: all;\\n cursor: pointer;\\n padding: 0;\\n line-height: 1;\\n}\\n.webix_hint_button_close:hover {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/components/hint/hint.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,UAAU;EACV,qCAAqC;EACrC,gCAAgC;EAChC,6BAA6B;AAC/B;AACA;EACE,UAAU;EACV,wCAAwC;EACxC,mCAAmC;EACnC,gCAAgC;AAClC;AACA;EACE,eAAe;EACf,WAAW;EACX,YAAY;EACZ,MAAM;EACN,OAAO;EACP,aAAa;EACb,oBAAoB;EACpB,gBAAgB;EAChB,YAAY;AACd;AACA;EACE,kBAAkB;EAClB,YAAY;EACZ,WAAW;EACX,OAAO;EACP,MAAM;AACR;AACA;EACE,oBAAoB;EACpB,yBAAyB;EACzB,sBAAsB;EACtB,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;EAClB,YAAY;EACZ,WAAW;EACX,eAAe;AACjB;AACA;;EAEE,mBAAmB;EACnB,yBAAyB;EACzB,sBAAsB;EACtB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,eAAe;EACf,mBAAmB;EACnB,yBAAyB;EACzB,sBAAsB;EACtB,qBAAqB;EACrB,iBAAiB;EACjB,cAAc;EACd,aAAa;EACb,YAAY;EACZ,kBAAkB;EAClB,yBAAyB;EACzB,4BAA4B;EAC5B,8BAA8B;EAC9B,sBAAsB;EACtB,kFAAkF;EAClF,0EAA0E;EAC1E,UAAU;AACZ;AACA;EACE,0BAA0B;EAC1B,eAAe;EACf,iBAAiB;EACjB,cAAc;AAChB;AACA;EACE,0BAA0B;EAC1B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,kBAAkB;EAClB,YAAY;EACZ,WAAW;AACb;AACA;EACE,qBAAqB;EACrB,mBAAmB;EACnB,+BAA+B;EAC/B,uBAAuB;EACvB,eAAe;EACf,cAAc;EACd,YAAY;EACZ,iBAAiB;EACjB,YAAY;EACZ,kBAAkB;EAClB,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,yBAAyB;AAC3B;AACA;EACE,iBAAiB;EACjB,yBAAyB;EACzB,WAAW;AACb;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,sBAAsB;AACxB;AACA;EACE,wCAAwC;AAC1C;AACA;EACE,aAAa;AACf;AACA;EACE,kBAAkB;EAClB,YAAY;EACZ,UAAU;EACV,0BAA0B;EAC1B,eAAe;AACjB;AACA;EACE,kBAAkB;EAClB,WAAW;EACX,SAAS;EACT,aAAa;EACb,uBAAuB;EACvB,YAAY;EACZ,eAAe;EACf,0BAA0B;EAC1B,mBAAmB;EACnB,eAAe;EACf,UAAU;EACV,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B\",\"sourcesContent\":[\".webix_hint_view.webix_hint_animated .webix_hint_overlay_hole_el {\\n fill: #000;\\n -webkit-transition: fill 0.4s ease-in;\\n -o-transition: fill 0.4s ease-in;\\n transition: fill 0.4s ease-in;\\n}\\n.webix_hint_view.webix_hint_animated .webix_hint {\\n opacity: 1;\\n -webkit-transition: opacity 0.4s ease-in;\\n -o-transition: opacity 0.4s ease-in;\\n transition: opacity 0.4s ease-in;\\n}\\n.webix_hint_overlay {\\n position: fixed;\\n width: 100%;\\n height: 100%;\\n top: 0;\\n left: 0;\\n z-index: 1010;\\n pointer-events: none;\\n overflow: hidden;\\n opacity: 0.6;\\n}\\n.webix_hint_view svg {\\n position: absolute;\\n height: 100%;\\n width: 100%;\\n left: 0;\\n top: 0;\\n}\\n.webix_hint_overflow {\\n pointer-events: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n position: relative;\\n height: 100%;\\n width: 100%;\\n min-width: 100%;\\n}\\n.webix_hint_overflow .webix_window,\\n.webix_hint_overflow .webix_popup {\\n pointer-events: all;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n.webix_hint {\\n position: fixed;\\n pointer-events: all;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n display: block;\\n z-index: 1012;\\n width: 310px;\\n border-radius: 2px;\\n background-color: #FFFFFF;\\n padding: 22px 50px 80px 22px;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n -webkit-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.1);\\n box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.1);\\n opacity: 0;\\n}\\n.webix_hint .webix_hint_label {\\n color: rgba(0, 0, 0, 0.54);\\n font-size: 16px;\\n line-height: 24px;\\n margin: -5px 0;\\n}\\n.webix_hint .webix_hint_title {\\n color: rgba(0, 0, 0, 0.87);\\n font-size: 20px;\\n font-weight: 500;\\n line-height: 1;\\n margin-bottom: 15px;\\n}\\n.webix_hint_buttons {\\n position: absolute;\\n bottom: 11px;\\n right: 22px;\\n}\\n.webix_hint_buttons .webix_hint_button {\\n display: inline-block;\\n pointer-events: all;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n cursor: pointer;\\n margin: 0 auto;\\n height: 32px;\\n padding: 0px 16px;\\n border: none;\\n border-radius: 2px;\\n font-size: 14px;\\n font-weight: 500;\\n line-height: 16px;\\n text-transform: uppercase;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_next {\\n margin-left: 17px;\\n background-color: #00BFC7;\\n color: #fff;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_next:hover {\\n background-color: #27D6DD;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_prev {\\n color: #0097A7;\\n background-color: #fff;\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_prev:hover {\\n background-color: rgba(0, 191, 199, 0.1);\\n}\\n.webix_hint_buttons .webix_hint_button.webix_hint_button_prev.webix_hint_button_hidden {\\n display: none;\\n}\\n.webix_hint_progress {\\n position: absolute;\\n bottom: 17px;\\n left: 22px;\\n color: rgba(0, 0, 0, 0.54);\\n font-size: 14px;\\n}\\n.webix_hint_button_close {\\n position: absolute;\\n right: 22px;\\n top: 20px;\\n z-index: 1012;\\n background: transparent;\\n border: none;\\n font-size: 22px;\\n color: rgba(0, 0, 0, 0.54);\\n pointer-events: all;\\n cursor: pointer;\\n padding: 0;\\n line-height: 1;\\n}\\n.webix_hint_button_close:hover {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".wbq-query_list .wbq-field-value,.wbq-query_bar .wbq-field-value{color:#1ca1c1}.wbq-query_list .wbq-field-name,.wbq-query_bar .wbq-field-name{font-weight:500}.wbq-query_list .action-close,.wbq-query_list .action-menu{cursor:pointer;margin-top:10px;right:4px;position:absolute}.wbq-query_bar .action-close,.wbq-query_bar .action-menu{cursor:pointer;margin:8px -10px 0 8px}.wbq-query_list .webix_scroll_cont>.webix_tree_leaves{padding:8px 0}.wbq-query_list .webix_tree_item{height:auto;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_list .webix_tree_item.active-editor{line-height:32px;padding:0;margin-left:4px;margin-right:4px;background-color:#fff}.wbq-query_list .webix_tree_item+.webix_tree_leaves{padding-top:10px;border-left:1px solid #ccd7e6;margin-left:20px;padding-left:16px}.wbq-query_list .webix_tree_item.group{margin:0}.wbq-filter_join{position:absolute;z-index:2;top:-24px;height:20px;line-height:20px;left:0;width:40px;border-radius:20px;text-align:center;display:block;cursor:pointer}.wbq-filter_join_and{color:#fff;background:#fdbf4c}.wbq-filter_join_or{color:#fff;background:#55cd97}.wbq-query_list .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-query_bar .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-field-box{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:250px}.wbq-query_bar .webix_scroll_cont>.webix_tree_leaves{padding:0;white-space:nowrap;padding:4px 0 4px 0}.wbq-query_bar .webix_tree_leaves,.wbq-query_bar .webix_tree_leaves div{display:inline-block}.wbq-query_bar .webix_tree_item{height:32px;line-height:32px;margin:0 52px 0 0;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:after{color:#a78fd5}.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:after{color:#68ccd2}.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:after{color:#999}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\"(\\\";margin:0 2px 0 -4px;display:inline-block;transform:scaleX(0.75);font-size:30px;line-height:0;position:relative}.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\")\\\";margin:0 -4px 0 2px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{border-radius:2px;margin-left:0;margin-right:52px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves .webix_tree_item{background:#fff;margin-top:0;line-height:32px}.wbq-query_bar .webix_tree_leaves>div:last-child>div{margin-right:0}.wbq-query_bar .webix_tree_leaves>.webix_tree_branch_1>.webix_tree_leaves{padding:4px;margin-top:-4px;margin-bottom:-4px}.wbq-query_bar .wbq-filter_join{top:6px;left:-44px;width:36px}.wbq-query_bar .group{padding:0;height:20px;margin-right:0;background:transparent}.webix_toolbar .wbq-query_bar{background-color:transparent}.wbq-query_list.webix_tree .webix_scroll_cont>.webix_tree_leaves{display:block}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{display:inline-block}.wbq-filter_join_disabled{cursor:default;pointer-events:none}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{background:#f4f5f9}.wbq-query_list .webix_tree_item{line-height:36px;margin-bottom:32px}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{top:4px}.wbq-field-box{margin-bottom:-13px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/components/query/query.min.css\"],\"names\":[],\"mappings\":\"AAAA,iEAAiE,aAAa,CAAC,+DAA+D,eAAe,CAAC,2DAA2D,cAAc,CAAC,eAAe,CAAC,SAAS,CAAC,iBAAiB,CAAC,yDAAyD,cAAc,CAAC,sBAAsB,CAAC,sDAAsD,aAAa,CAAC,iCAAiC,WAAW,CAAC,cAAc,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,+CAA+C,gBAAgB,CAAC,SAAS,CAAC,eAAe,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,oDAAoD,gBAAgB,CAAC,6BAA6B,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,uCAAuC,QAAQ,CAAC,iBAAiB,iBAAiB,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,aAAa,CAAC,cAAc,CAAC,qBAAqB,UAAU,CAAC,kBAAkB,CAAC,oBAAoB,UAAU,CAAC,kBAAkB,CAAC,oFAAoF,YAAY,CAAC,mFAAmF,YAAY,CAAC,eAAe,oBAAoB,CAAC,eAAe,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,eAAe,CAAC,qDAAqD,SAAS,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,wEAAwE,oBAAoB,CAAC,gCAAgC,WAAW,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,cAAc,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,2HAA2H,aAAa,CAAC,2HAA2H,aAAa,CAAC,2HAA2H,UAAU,CAAC,+FAA+F,WAAW,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,+CAA+C,WAAW,CAAC,mBAAmB,CAAC,qDAAqD,iBAAiB,CAAC,aAAa,CAAC,iBAAiB,CAAC,sEAAsE,eAAe,CAAC,YAAY,CAAC,gBAAgB,CAAC,qDAAqD,cAAc,CAAC,0EAA0E,WAAW,CAAC,eAAe,CAAC,kBAAkB,CAAC,gCAAgC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,sBAAsB,SAAS,CAAC,WAAW,CAAC,cAAc,CAAC,sBAAsB,CAAC,8BAA8B,4BAA4B,CAAC,iEAAiE,aAAa,CAAC,qDAAqD,oBAAoB,CAAC,0BAA0B,cAAc,CAAC,mBAAmB,CAAC,qDAAqD,kBAAkB,CAAC,iCAAiC,gBAAgB,CAAC,kBAAkB,CAAC,+FAA+F,OAAO,CAAC,eAAe,mBAAmB\",\"sourcesContent\":[\".wbq-query_list .wbq-field-value,.wbq-query_bar .wbq-field-value{color:#1ca1c1}.wbq-query_list .wbq-field-name,.wbq-query_bar .wbq-field-name{font-weight:500}.wbq-query_list .action-close,.wbq-query_list .action-menu{cursor:pointer;margin-top:10px;right:4px;position:absolute}.wbq-query_bar .action-close,.wbq-query_bar .action-menu{cursor:pointer;margin:8px -10px 0 8px}.wbq-query_list .webix_scroll_cont>.webix_tree_leaves{padding:8px 0}.wbq-query_list .webix_tree_item{height:auto;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_list .webix_tree_item.active-editor{line-height:32px;padding:0;margin-left:4px;margin-right:4px;background-color:#fff}.wbq-query_list .webix_tree_item+.webix_tree_leaves{padding-top:10px;border-left:1px solid #ccd7e6;margin-left:20px;padding-left:16px}.wbq-query_list .webix_tree_item.group{margin:0}.wbq-filter_join{position:absolute;z-index:2;top:-24px;height:20px;line-height:20px;left:0;width:40px;border-radius:20px;text-align:center;display:block;cursor:pointer}.wbq-filter_join_and{color:#fff;background:#fdbf4c}.wbq-filter_join_or{color:#fff;background:#55cd97}.wbq-query_list .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-query_bar .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-field-box{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:250px}.wbq-query_bar .webix_scroll_cont>.webix_tree_leaves{padding:0;white-space:nowrap;padding:4px 0 4px 0}.wbq-query_bar .webix_tree_leaves,.wbq-query_bar .webix_tree_leaves div{display:inline-block}.wbq-query_bar .webix_tree_item{height:32px;line-height:32px;margin:0 52px 0 0;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:after{color:#a78fd5}.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:after{color:#68ccd2}.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:after{color:#999}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\"(\\\";margin:0 2px 0 -4px;display:inline-block;transform:scaleX(0.75);font-size:30px;line-height:0;position:relative}.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\")\\\";margin:0 -4px 0 2px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{border-radius:2px;margin-left:0;margin-right:52px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves .webix_tree_item{background:#fff;margin-top:0;line-height:32px}.wbq-query_bar .webix_tree_leaves>div:last-child>div{margin-right:0}.wbq-query_bar .webix_tree_leaves>.webix_tree_branch_1>.webix_tree_leaves{padding:4px;margin-top:-4px;margin-bottom:-4px}.wbq-query_bar .wbq-filter_join{top:6px;left:-44px;width:36px}.wbq-query_bar .group{padding:0;height:20px;margin-right:0;background:transparent}.webix_toolbar .wbq-query_bar{background-color:transparent}.wbq-query_list.webix_tree .webix_scroll_cont>.webix_tree_leaves{display:block}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{display:inline-block}.wbq-filter_join_disabled{cursor:default;pointer-events:none}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{background:#f4f5f9}.wbq-query_list .webix_tree_item{line-height:36px;margin-bottom:32px}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{top:4px}.wbq-field-box{margin-bottom:-13px}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@font-face{font-family:Webix Querybuilder Icons;font-style:normal;font-weight:400;src:url(fonts/querybuilder-webfont.woff2) format(\\\"woff2\\\"),url(fonts/querybuilder-webfont.woff) format(\\\"woff\\\"),url(fonts/querybuilder-webfont.ttf) format(\\\"truetype\\\"),url(fonts/querybuilder-webfont.svg) format(\\\"svg\\\")}.webix_qb_filter_icon{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:inherit;cursor:pointer;display:inline-block;font:400 400 400 24px/1 \\\"Webix Querybuilder Icons\\\";font-size:18px;line-height:inherit;text-rendering:auto}.webix_qb_filter_icon:hover{color:#1992af}.webix_qb_filter_icon:before{content:\\\"\\\\F001\\\"}.webix_qb_filter{text-align:center}.webix_qb_wrap{background-color:#ebedf0;position:relative}.webix_qb_wrap .webix_view{background-color:transparent}.webix_qb_wrap .webix_template{padding:0}.webix_qb_wrap .webix_el_combo span.webix_input_icon,.webix_qb_wrap .webix_el_datepicker span.webix_input_icon,.webix_qb_wrap .webix_el_richselect .webix_inp_static,.webix_qb_wrap .webix_el_richselect span.webix_input_icon,.webix_qb_wrap .webix_el_select select{border-radius:0}.webix_qb_wrap .webix_qb_wrap{border-left:1px solid #ccd7e6!important}.webix_qb_add{white-space:nowrap}.webix_qb_add_group,.webix_qb_add_rule{background:transparent;border:0;box-shadow:none;color:#1ca1c1;font-size:14px;line-height:1pc;margin:0 10px 0 0;outline:0;text-transform:uppercase}.webix_qb_add_group:active,.webix_qb_add_group:focus,.webix_qb_add_group:hover,.webix_qb_add_rule:active,.webix_qb_add_rule:focus,.webix_qb_add_rule:hover{color:#1992af}.webix_qb_line .webix_qb_close{cursor:pointer;right:25px;top:0}.webix_qb_line .webix_qb_close button{background-color:transparent;border:0;color:#94a1b3;padding:2px 1px;width:20px}.webix_qb_line .webix_qb_close button:active,.webix_qb_line .webix_qb_close button:focus,.webix_qb_line .webix_qb_close button:hover{box-shadow:none;color:#ff5c4c;outline:0}.webix_qb_buttons{background-color:#606060;border-radius:2px;height:26px;margin-top:2px;padding:3px 0;text-align:center;width:87px}.webix_qb_buttons button{background-color:#606060;border:0;border-radius:0;color:#ccc;cursor:pointer;font-size:14px;height:26px;padding:0;text-transform:capitalize;width:38px}.webix_qb_and{margin-right:3px}.webix_qb_and.webix_active,.webix_qb_or.webix_active{background-color:#1ca1c1;color:#fff}.webix_qb_line{position:relative}.webix_qb_line .webix_control,.webix_qb_line .webix_inp_static,.webix_qb_line input{border-radius:0}.webix_qb_line .webix_el_slider.webix_invalid .webix_el_box{background-color:rgba(254,165,168,.2392)}.webix_qb_line .webix_qb_rule_input,.webix_qb_line .webix_qb_rule_select,.webix_qb_line .webix_qb_value_select{display:inline-block;font-size:14px}.webix_qb_line .webix_qb_rule_input .webix_input_icon,.webix_qb_line .webix_qb_rule_select .webix_input_icon,.webix_qb_line .webix_qb_value_select .webix_input_icon{display:none}.webix_column_qb .webix_qb_rule_input,.webix_column_qb .webix_qb_rule_select,.webix_column_qb .webix_qb_value_select{display:block}.webix_qb_sorting{position:absolute;right:7px;top:9px;width:390px;z-index:2}.webix_qb_sorting .webix_control{display:inline-block;margin-right:10px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/components/querybuilder/querybuilder.min.css\"],\"names\":[],\"mappings\":\"AAAA,WAAW,oCAAoC,CAAC,iBAAiB,CAAC,eAAe,CAAC,sNAAsN,CAAC,sBAAsB,iCAAiC,CAAC,kCAAkC,CAAC,aAAa,CAAC,cAAc,CAAC,oBAAoB,CAAC,kDAAkD,CAAC,cAAc,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,4BAA4B,aAAa,CAAC,6BAA6B,eAAe,CAAC,iBAAiB,iBAAiB,CAAC,eAAe,wBAAwB,CAAC,iBAAiB,CAAC,2BAA2B,4BAA4B,CAAC,+BAA+B,SAAS,CAAC,sQAAsQ,eAAe,CAAC,8BAA8B,uCAAuC,CAAC,cAAc,kBAAkB,CAAC,uCAAuC,sBAAsB,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,CAAC,cAAc,CAAC,eAAe,CAAC,iBAAiB,CAAC,SAAS,CAAC,wBAAwB,CAAC,2JAA2J,aAAa,CAAC,+BAA+B,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,sCAAsC,4BAA4B,CAAC,QAAQ,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC,qIAAqI,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,kBAAkB,wBAAwB,CAAC,iBAAiB,CAAC,WAAW,CAAC,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,UAAU,CAAC,yBAAyB,wBAAwB,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,yBAAyB,CAAC,UAAU,CAAC,cAAc,gBAAgB,CAAC,qDAAqD,wBAAwB,CAAC,UAAU,CAAC,eAAe,iBAAiB,CAAC,oFAAoF,eAAe,CAAC,4DAA4D,wCAAwC,CAAC,+GAA+G,oBAAoB,CAAC,cAAc,CAAC,qKAAqK,YAAY,CAAC,qHAAqH,aAAa,CAAC,kBAAkB,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,iCAAiC,oBAAoB,CAAC,iBAAiB\",\"sourcesContent\":[\"@font-face{font-family:Webix Querybuilder Icons;font-style:normal;font-weight:400;src:url(fonts/querybuilder-webfont.woff2) format(\\\"woff2\\\"),url(fonts/querybuilder-webfont.woff) format(\\\"woff\\\"),url(fonts/querybuilder-webfont.ttf) format(\\\"truetype\\\"),url(fonts/querybuilder-webfont.svg) format(\\\"svg\\\")}.webix_qb_filter_icon{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:inherit;cursor:pointer;display:inline-block;font:400 400 400 24px/1 \\\"Webix Querybuilder Icons\\\";font-size:18px;line-height:inherit;text-rendering:auto}.webix_qb_filter_icon:hover{color:#1992af}.webix_qb_filter_icon:before{content:\\\"\\\\F001\\\"}.webix_qb_filter{text-align:center}.webix_qb_wrap{background-color:#ebedf0;position:relative}.webix_qb_wrap .webix_view{background-color:transparent}.webix_qb_wrap .webix_template{padding:0}.webix_qb_wrap .webix_el_combo span.webix_input_icon,.webix_qb_wrap .webix_el_datepicker span.webix_input_icon,.webix_qb_wrap .webix_el_richselect .webix_inp_static,.webix_qb_wrap .webix_el_richselect span.webix_input_icon,.webix_qb_wrap .webix_el_select select{border-radius:0}.webix_qb_wrap .webix_qb_wrap{border-left:1px solid #ccd7e6!important}.webix_qb_add{white-space:nowrap}.webix_qb_add_group,.webix_qb_add_rule{background:transparent;border:0;box-shadow:none;color:#1ca1c1;font-size:14px;line-height:1pc;margin:0 10px 0 0;outline:0;text-transform:uppercase}.webix_qb_add_group:active,.webix_qb_add_group:focus,.webix_qb_add_group:hover,.webix_qb_add_rule:active,.webix_qb_add_rule:focus,.webix_qb_add_rule:hover{color:#1992af}.webix_qb_line .webix_qb_close{cursor:pointer;right:25px;top:0}.webix_qb_line .webix_qb_close button{background-color:transparent;border:0;color:#94a1b3;padding:2px 1px;width:20px}.webix_qb_line .webix_qb_close button:active,.webix_qb_line .webix_qb_close button:focus,.webix_qb_line .webix_qb_close button:hover{box-shadow:none;color:#ff5c4c;outline:0}.webix_qb_buttons{background-color:#606060;border-radius:2px;height:26px;margin-top:2px;padding:3px 0;text-align:center;width:87px}.webix_qb_buttons button{background-color:#606060;border:0;border-radius:0;color:#ccc;cursor:pointer;font-size:14px;height:26px;padding:0;text-transform:capitalize;width:38px}.webix_qb_and{margin-right:3px}.webix_qb_and.webix_active,.webix_qb_or.webix_active{background-color:#1ca1c1;color:#fff}.webix_qb_line{position:relative}.webix_qb_line .webix_control,.webix_qb_line .webix_inp_static,.webix_qb_line input{border-radius:0}.webix_qb_line .webix_el_slider.webix_invalid .webix_el_box{background-color:rgba(254,165,168,.2392)}.webix_qb_line .webix_qb_rule_input,.webix_qb_line .webix_qb_rule_select,.webix_qb_line .webix_qb_value_select{display:inline-block;font-size:14px}.webix_qb_line .webix_qb_rule_input .webix_input_icon,.webix_qb_line .webix_qb_rule_select .webix_input_icon,.webix_qb_line .webix_qb_value_select .webix_input_icon{display:none}.webix_column_qb .webix_qb_rule_input,.webix_column_qb .webix_qb_rule_select,.webix_column_qb .webix_qb_value_select{display:block}.webix_qb_sorting{position:absolute;right:7px;top:9px;width:390px;z-index:2}.webix_qb_sorting .webix_control{display:inline-block;margin-right:10px}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@charset \\\"UTF-8\\\";.wbq-query_list .wbq-field-value,.wbq-query_bar .wbq-field-value{color:#1ca1c1}.wbq-query_list .wbq-field-name,.wbq-query_bar .wbq-field-name{font-weight:500}.wbq-query_list .action-close,.wbq-query_list .action-menu{cursor:pointer;margin-top:10px;right:4px;position:absolute}.wbq-query_bar .action-close,.wbq-query_bar .action-menu{cursor:pointer;margin:8px -10px 0 8px}.wbq-query_list .webix_scroll_cont>.webix_tree_leaves{padding:8px 0}.wbq-query_list .webix_tree_item{height:auto;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_list .webix_tree_item.active-editor{line-height:32px;padding:0;margin-left:4px;margin-right:4px;background-color:#fff}.wbq-query_list .webix_tree_item+.webix_tree_leaves{padding-top:10px;border-left:1px solid #ccd7e6;margin-left:20px;padding-left:16px}.wbq-query_list .webix_tree_item.group{margin:0}.wbq-filter_join{position:absolute;z-index:2;top:-24px;height:20px;line-height:20px;left:0;width:40px;border-radius:20px;text-align:center;display:block;cursor:pointer}.wbq-filter_join_and{color:#fff;background:#fdbf4c}.wbq-filter_join_or{color:#fff;background:#55cd97}.wbq-query_list .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-query_bar .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-field-box{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:250px}.wbq-query_bar .webix_scroll_cont>.webix_tree_leaves{padding:0;white-space:nowrap;padding:4px 0 4px 0}.wbq-query_bar .webix_tree_leaves,.wbq-query_bar .webix_tree_leaves div{display:inline-block}.wbq-query_bar .webix_tree_item{height:32px;line-height:32px;margin:0 52px 0 0;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:after{color:#a78fd5}.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:after{color:#68ccd2}.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:after{color:#999}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\"(\\\";margin:0 2px 0 -4px;display:inline-block;transform:scaleX(0.75);font-size:30px;line-height:0;position:relative}.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\")\\\";margin:0 -4px 0 2px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{border-radius:2px;margin-left:0;margin-right:52px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves .webix_tree_item{background:#fff;margin-top:0;line-height:32px}.wbq-query_bar .webix_tree_leaves>div:last-child>div{margin-right:0}.wbq-query_bar .webix_tree_leaves>.webix_tree_branch_1>.webix_tree_leaves{padding:4px;margin-top:-4px;margin-bottom:-4px}.wbq-query_bar .wbq-filter_join{top:6px;left:-44px;width:36px}.wbq-query_bar .group{padding:0;height:20px;margin-right:0;background:transparent}.webix_toolbar .wbq-query_bar{background-color:transparent}.wbq-query_list.webix_tree .webix_scroll_cont>.webix_tree_leaves{display:block}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{display:inline-block}.wbq-filter_join_disabled{cursor:default;pointer-events:none}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{background:#f4f5f9}.wbq-query_list .webix_tree_item{line-height:36px;margin-bottom:32px}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{top:4px}.wbq-field-box{margin-bottom:-13px}.webix_el_label.webix_rpt_not_saved .webix_el_box{color:#ff5c4c}.webix_reports .webix_pressed .webix_button{box-shadow:none}.webix_rpt_found_record{background:#f9eab3}.webix_rpt_list .webix_scroll_cont:empty:before{content:attr(placeholder);color:#8693a5;text-align:center;display:inline-block;width:100%;line-height:60px}.webix_rpt_empty{position:relative;background:transparent}.webix_rpt_empty .webix_template{display:flex;justify-content:center;flex-flow:row wrap}.webix_rpt_empty_placeholder{color:#8693a5;font-size:16px;font-weight:500;position:absolute;top:15%}.webix_rpt_empty svg{width:80%;height:80%;display:block;margin:auto;max-width:390px}.webix_rpt_query .webix_el_toggle button,.webix_rpt_query .webix_el_toggle .webix_pressed button{box-shadow:none}.webix_rpt_query .webix_el_toggle{text-align:center}.webix_rpt_query .webix_el_toggle button{width:300px}.webix_rpt_query .webix_el_toggle .wxi-checkbox-blank{color:#94a1b3}.webix_rpt_query .webix_tree .webix_scroll_cont>.webix_tree_leaves{display:block}@font-face{font-family:\\\"report-webfont\\\";src:url(\\\"fonts/report-webfont.woff2?1597778382139\\\") format(\\\"woff2\\\"),url(\\\"fonts/report-webfont.woff?1597778382139\\\") format(\\\"woff\\\");font-weight:normal;font-style:normal}[class^=rpi-]:before,[class*=rpi-]:before{font-family:\\\"report-webfont\\\";display:inline-block;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.rpi-plus:before{content:\\\"\\\"}.rpi-delete:before{content:\\\"\\\"}.rpi-content-copy:before{content:\\\"\\\"}.rpi-export:before{content:\\\"\\\"}.rpi-sort-alphabetical-descending:before{content:\\\"\\\"}.rpi-sort-alphabetical-ascending:before{content:\\\"\\\"}.rpi-sort-calendar-descending:before{content:\\\"\\\"}.rpi-sort-calendar-ascending:before{content:\\\"\\\"}.rpi-pencil:before{content:\\\"\\\"}.rpi-square-edit-outline:before{content:\\\"\\\"}.rpi-menu:before{content:\\\"\\\"}.rpi-menu-open:before{content:\\\"\\\"}.rpi-dots-vertical:before{content:\\\"\\\"}.rpi-magnify:before{content:\\\"\\\"}.rpi-close:before{content:\\\"\\\"}.rpi-drag-vertical:before{content:\\\"\\\"}.rpi-eye:before{content:\\\"\\\"}.rpi-eye-off-outline:before{content:\\\"\\\"}.rpi-arrow-horizontal-lock:before{content:\\\"\\\"}.rpi-cog:before{content:\\\"\\\"}.rpi-arrow-up:before{content:\\\"\\\"}.rpi-arrow-down:before{content:\\\"\\\"}.rpi-table:before{content:\\\"\\\"}.rpi-poll:before{content:\\\"\\\"}.rpi-chart-tree:before{content:\\\"\\\"}.rpi-chart-line:before{content:\\\"\\\"}.rpi-chart-bell-curve-cumulative:before{content:\\\"\\\"}.rpi-chart-areaspline:before{content:\\\"\\\"}.rpi-chart-line-stacked:before{content:\\\"\\\"}.rpi-chart-areaspline-variant:before{content:\\\"\\\"}.rpi-chart-bar-stacked:before{content:\\\"\\\"}.rpi-vector-triangle:before{content:\\\"\\\"}.rpi-chart-bar:before{content:\\\"\\\"}.rpi-circle-outline:before{content:\\\"\\\"}.rpi-square-outline:before{content:\\\"\\\"}.rpi-triangle-outline:before{content:\\\"\\\"}.rpi-rhombus-outline:before{content:\\\"\\\"}.rpi-trash-can-outline:before{content:\\\"\\\"}.rpi-pail-outline:before{content:\\\"\\\"}.wbx-mark_frozen{text-align:center;cursor:ns-resize}.wbx-mark_frozen .webix_rpt_config_row_name{width:100%;font-size:13px}.wbx-mark_frozen .webix_rpt_config_row_name .webix_icon{vertical-align:middle}.wbx-mark_frozen.webix_dd_drag div{border-color:transparent;background:inherit}.webix_rpt_config_row,.webix_rpt_item_suggest{display:flex;justify-content:space-between;align-items:center}.webix_rpt_config_row .webix_icon,.webix_rpt_item_suggest .webix_icon{line-height:inherit}.webix_rpt_config_row_name{width:310px}.webix_rpt_chart_config .webix_rpt_config_row_name{padding-left:10px}.webix_rpt_columns_list .rpi-drag-vertical{color:#94a1b3;cursor:ns-resize}.webix_rpt_columns_list .webix_cell:not(.webix_dtable_subview):hover{background:#f4f5f9}.webix_rpt_columns_list .webix_cell:not(.webix_dtable_subview):hover .rpi-drag-vertical{color:#475466}.webix_rpt_columns_list .webix_dtable_subview .webix_view{border-left-width:0}.webix_rpt_columns_list .webix_dtable_subview{background-color:transparent}.webix_rpt_columns_list .webix_dtable_subview .webix_inp_label{font-weight:normal}.webix_rpt_drag{cursor:ns-resize}.webix_drag_zone .webix_rpt_config_row .rpi-drag-vertical,.webix_drag_zone .webix_rpt_config_row .webix_tree_close{visibility:hidden}.webix_rpt_delete .webix_button{color:#ff5c4c}.webix_rpt_title{color:#313131;font-weight:500}.webix_rpt_subtitle .webix_inp_label,.webix_rpt_subtitle .webix_el_box{color:#475466;font-weight:normal}.webix_rpt_date_selector{color:#1ca1c1;display:inline-block;line-height:1}.webix_rpt_date_selector .webix_rpt_sort_selector .webix_rpt_date_selector .webix_icon{cursor:pointer}.webix_rpt_grouppopup .webix_icon{padding-top:6px;float:right}.webix_rpt_grouppopup .wxi-radiobox-marked{color:#1ca1c1}.webix_rpt_grouppopup .wxi-radiobox-blank{color:#94a1b3}.webix_rpt_groupselect_delete,.webix_rpt_multicombo .webix_multicombo_delete{font-size:16px;width:20px;line-height:20px}.webix_rpt_groupselect_delete:after,.webix_rpt_multicombo .webix_multicombo_delete:after{content:\\\"\\\"}.webix_rpt_summary_form{border-color:transparent}.webix_rpt_chart_color{width:24px;height:24px;border-radius:2px;margin-left:10px}.webix_rpt_config_row_hover{background:#f4f5f9}.webix_rpt_colorpicker .webix_input_icon{position:absolute;right:32px}.webix_rpt_colorpicker .webix_input_icon:before{font-size:20px;content:\\\"\\\";left:30px;position:absolute;color:#94a1b3;top:2px}.webix_rpt_markerselect .webix_icon{font-size:18px;margin-right:2px}.webix_rpt_markerselect_list .webix_icon{font-size:18px;margin-right:17px}.webix_rpt_action_remove{color:#94a1b3;margin-top:6px}.webix_rpt_description .webix_template{padding-left:2px;font-size:13px}.webix_rpt_qselect_icon{padding-top:7px;float:right;color:#94a1b3}.webix_rpt_qselect_suggest .webix_scroll_cont:empty:before{content:attr(placeholder);font-size:13px;font-style:italic;color:#8693a5;text-align:center;display:inline-block;width:100%;line-height:25px}.webix_rpt_groupselect .webix_multicombo_value{display:flex;align-items:center;padding-right:6px}.webix_rpt_groupselect .webix_multicombo_value .webix_rpt_groupselect_delete{margin-top:0;position:static;line-height:1;margin-left:5px;height:auto}.webix_rpt_groupselect .webix_multicombo_value>span{vertical-align:middle}.webix_rpt_groupselect_sep{padding:0 6px 0 3px}.webix_rpt_bcols .webix_dtable_subview{padding-left:0}.webix_rpt_bucket_values .webix_list_item{display:flex;align-items:center}.webix_rpt_bucket_values .webix_list_item .webix_rpt_bucket_value{width:170px}.webix_rpt_multicombo .webix_multicombo_text{display:flex;align-items:center}.webix_rpt_bucket_value{max-width:170px;text-overflow:ellipsis;display:inline-block;overflow:hidden}.webix_multicombo_value .webix_rpt_bucket_icon{display:none}.webix_rpt_bucket_icon{width:25px;text-align:right;color:#94a1b3}.webix_rpt_bucket_sublabel{font-size:13px;color:#8693a5}.webix_rpt_bucket_sublabel.webix_icon{font-size:15px}.webix_rpt_buckets_num{margin-right:15px}.webix_rpt_subview .webix_invalid .webix_el_box input,.webix_rpt_subview .webix_invalid .webix_el_box .webix_inp_static{background:#fff;color:#475466}.webix_rpt_bucket_delete{width:40px;color:#94a1b3}.webix_rpt_bucket_delete:hover{color:#475466}.webix_rpt_bucket_value_selected{color:#8693a5}.webix_el_search .webix_badge{cursor:default;padding-left:4px}.webix_rpt .webix_treemap_item.l0{background-color:#42a5f5}.webix_rpt .webix_treemap_item.l1{background-color:#64b5f6}.webix_rpt .webix_treemap_item.l2{background-color:#90caf9}.webix_rpt .webix_treemap_item.l3{background-color:#bbdefb}.webix_rpt_list_btn .webix_cell{padding:0}.webix_rpt_list_btn .webix_icon{line-height:38px;border-radius:50%;width:38px;height:38px;color:#8693a5}.webix_rpt_list_btn .webix_icon:hover{background:rgba(0,0,0,0.07);color:#475466}.webix_rpt_list .webix_selected .webix_rpt_list_report_date,.webix_rpt_list .webix_selected .webix_icon,.webix_rpt_list .webix_selected:focus .webix_rpt_list_report_date,.webix_rpt_list .webix_selected:focus .webix_icon{color:#8693a5}.webix_rpt_list .webix_selected .webix_icon:hover,.webix_rpt_list .webix_selected:focus .webix_icon:hover{color:#475466}.webix_rpt_list_block{position:relative;padding-top:6px}.webix_rpt_list_report_date,.webix_rpt_list_report_name{width:260px;line-height:22px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.webix_rpt_list_report_date{color:#8693a5;font-size:13px;line-height:20px;height:20px;overflow:hidden}.webix_rpt_action_menu{position:absolute;right:0;top:50%;color:#94a1b3;margin-top:-8px}.webix_rpt_action_menu:hover{color:#475466}.webix_rpt_btn_active.webix_rpt_sort_icon .webix_icon,.webix_rpt_btn_active.webix_rpt_sort_icon button:hover .webix_icon{color:#1ca1c1}.webix_rpt_sort_icon .webix_icon{color:#94a1b3}.webix_rpt_sources_path{float:right;color:#888;font-size:12px}.webix_multicombo_value .webix_rpt_sources_path{display:none}.wbq-field-name .webix_rpt_sources_path{position:absolute;right:30px}.webix_rpt_popup_menu .webix_list_item{padding-left:7px}.webix_rpt_popup_menu .webix_icon{color:#94a1b3;float:left;font-size:19px;margin-top:6px;margin-right:5px}.webix_rpt_popup_menu .webix_disabled .webix_icon{color:#bfccdf}.webix_rpt_popup_menu .webix_list_item:active,.webix_rpt_popup_menu .webix_list_item:focus{background:transparent}.webix_rpt_vertical_chart_labels .webix_axis_item_x{transform:rotate(-45deg);text-align:right;transform-origin:75% 320%}.webix_rpt_vertical_chart_labels .webix_rpt_chart_label{width:80px}.webix_rpt_chart_label{max-width:80px}.webix_rpt_vertical_chart_labels .webix_rpt_chart_label0{left:40px !important}.webix_el_search .webix_badge{top:9px;right:29px}.webix_rpt_cls1{fill:#9dbabf;fill-opacity:.25}.webix_rpt_cls2{fill:#edeff0}.webix_rpt_cls3{fill:#b4dfea}.webix_rpt_cls4{fill:#fafbff}.webix_rpt_cls5{fill:#dedede}.webix_rpt_cls6{fill:#f2f2f2}.webix_rpt_cls7{fill:#fff}.webix_rpt_cls8{fill:#b4dfea}.webix_rpt_cls9{fill:#f4f5f9}\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/components/reports/reports.min.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@charset \\\"UTF-8\\\";.wbq-query_list .wbq-field-value,.wbq-query_bar .wbq-field-value{color:#1ca1c1}.wbq-query_list .wbq-field-name,.wbq-query_bar .wbq-field-name{font-weight:500}.wbq-query_list .action-close,.wbq-query_list .action-menu{cursor:pointer;margin-top:10px;right:4px;position:absolute}.wbq-query_bar .action-close,.wbq-query_bar .action-menu{cursor:pointer;margin:8px -10px 0 8px}.wbq-query_list .webix_scroll_cont>.webix_tree_leaves{padding:8px 0}.wbq-query_list .webix_tree_item{height:auto;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_list .webix_tree_item.active-editor{line-height:32px;padding:0;margin-left:4px;margin-right:4px;background-color:#fff}.wbq-query_list .webix_tree_item+.webix_tree_leaves{padding-top:10px;border-left:1px solid #ccd7e6;margin-left:20px;padding-left:16px}.wbq-query_list .webix_tree_item.group{margin:0}.wbq-filter_join{position:absolute;z-index:2;top:-24px;height:20px;line-height:20px;left:0;width:40px;border-radius:20px;text-align:center;display:block;cursor:pointer}.wbq-filter_join_and{color:#fff;background:#fdbf4c}.wbq-filter_join_or{color:#fff;background:#55cd97}.wbq-query_list .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-query_bar .webix_tree_leaves>div:first-child>div:first-child .wbq-filter_join{display:none}.wbq-field-box{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:250px}.wbq-query_bar .webix_scroll_cont>.webix_tree_leaves{padding:0;white-space:nowrap;padding:4px 0 4px 0}.wbq-query_bar .webix_tree_leaves,.wbq-query_bar .webix_tree_leaves div{display:inline-block}.wbq-query_bar .webix_tree_item{height:32px;line-height:32px;margin:0 52px 0 0;padding:0 16px;user-select:none;position:relative;background:#f4f5f9;border-radius:2px;white-space:nowrap;overflow:visible !important}.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_1 .webix_tree_leaves:after{color:#a78fd5}.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_2 .webix_tree_leaves:after{color:#68ccd2}.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:before,.wbq-query_bar .webix_tree_branch_3 .webix_tree_leaves:after{color:#999}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\"(\\\";margin:0 2px 0 -4px;display:inline-block;transform:scaleX(0.75);font-size:30px;line-height:0;position:relative}.wbq-query_bar .group+.webix_tree_leaves:after{content:\\\")\\\";margin:0 -4px 0 2px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{border-radius:2px;margin-left:0;margin-right:52px}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves .webix_tree_item{background:#fff;margin-top:0;line-height:32px}.wbq-query_bar .webix_tree_leaves>div:last-child>div{margin-right:0}.wbq-query_bar .webix_tree_leaves>.webix_tree_branch_1>.webix_tree_leaves{padding:4px;margin-top:-4px;margin-bottom:-4px}.wbq-query_bar .wbq-filter_join{top:6px;left:-44px;width:36px}.wbq-query_bar .group{padding:0;height:20px;margin-right:0;background:transparent}.webix_toolbar .wbq-query_bar{background-color:transparent}.wbq-query_list.webix_tree .webix_scroll_cont>.webix_tree_leaves{display:block}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{display:inline-block}.wbq-filter_join_disabled{cursor:default;pointer-events:none}.wbq-query_bar .webix_tree_leaves .webix_tree_leaves{background:#f4f5f9}.wbq-query_list .webix_tree_item{line-height:36px;margin-bottom:32px}.wbq-query_bar .group+.webix_tree_leaves:before,.wbq-query_bar .group+.webix_tree_leaves:after{top:4px}.wbq-field-box{margin-bottom:-13px}.webix_el_label.webix_rpt_not_saved .webix_el_box{color:#ff5c4c}.webix_reports .webix_pressed .webix_button{box-shadow:none}.webix_rpt_found_record{background:#f9eab3}.webix_rpt_list .webix_scroll_cont:empty:before{content:attr(placeholder);color:#8693a5;text-align:center;display:inline-block;width:100%;line-height:60px}.webix_rpt_empty{position:relative;background:transparent}.webix_rpt_empty .webix_template{display:flex;justify-content:center;flex-flow:row wrap}.webix_rpt_empty_placeholder{color:#8693a5;font-size:16px;font-weight:500;position:absolute;top:15%}.webix_rpt_empty svg{width:80%;height:80%;display:block;margin:auto;max-width:390px}.webix_rpt_query .webix_el_toggle button,.webix_rpt_query .webix_el_toggle .webix_pressed button{box-shadow:none}.webix_rpt_query .webix_el_toggle{text-align:center}.webix_rpt_query .webix_el_toggle button{width:300px}.webix_rpt_query .webix_el_toggle .wxi-checkbox-blank{color:#94a1b3}.webix_rpt_query .webix_tree .webix_scroll_cont>.webix_tree_leaves{display:block}@font-face{font-family:\\\"report-webfont\\\";src:url(\\\"fonts/report-webfont.woff2?1597778382139\\\") format(\\\"woff2\\\"),url(\\\"fonts/report-webfont.woff?1597778382139\\\") format(\\\"woff\\\");font-weight:normal;font-style:normal}[class^=rpi-]:before,[class*=rpi-]:before{font-family:\\\"report-webfont\\\";display:inline-block;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.rpi-plus:before{content:\\\"\\\"}.rpi-delete:before{content:\\\"\\\"}.rpi-content-copy:before{content:\\\"\\\"}.rpi-export:before{content:\\\"\\\"}.rpi-sort-alphabetical-descending:before{content:\\\"\\\"}.rpi-sort-alphabetical-ascending:before{content:\\\"\\\"}.rpi-sort-calendar-descending:before{content:\\\"\\\"}.rpi-sort-calendar-ascending:before{content:\\\"\\\"}.rpi-pencil:before{content:\\\"\\\"}.rpi-square-edit-outline:before{content:\\\"\\\"}.rpi-menu:before{content:\\\"\\\"}.rpi-menu-open:before{content:\\\"\\\"}.rpi-dots-vertical:before{content:\\\"\\\"}.rpi-magnify:before{content:\\\"\\\"}.rpi-close:before{content:\\\"\\\"}.rpi-drag-vertical:before{content:\\\"\\\"}.rpi-eye:before{content:\\\"\\\"}.rpi-eye-off-outline:before{content:\\\"\\\"}.rpi-arrow-horizontal-lock:before{content:\\\"\\\"}.rpi-cog:before{content:\\\"\\\"}.rpi-arrow-up:before{content:\\\"\\\"}.rpi-arrow-down:before{content:\\\"\\\"}.rpi-table:before{content:\\\"\\\"}.rpi-poll:before{content:\\\"\\\"}.rpi-chart-tree:before{content:\\\"\\\"}.rpi-chart-line:before{content:\\\"\\\"}.rpi-chart-bell-curve-cumulative:before{content:\\\"\\\"}.rpi-chart-areaspline:before{content:\\\"\\\"}.rpi-chart-line-stacked:before{content:\\\"\\\"}.rpi-chart-areaspline-variant:before{content:\\\"\\\"}.rpi-chart-bar-stacked:before{content:\\\"\\\"}.rpi-vector-triangle:before{content:\\\"\\\"}.rpi-chart-bar:before{content:\\\"\\\"}.rpi-circle-outline:before{content:\\\"\\\"}.rpi-square-outline:before{content:\\\"\\\"}.rpi-triangle-outline:before{content:\\\"\\\"}.rpi-rhombus-outline:before{content:\\\"\\\"}.rpi-trash-can-outline:before{content:\\\"\\\"}.rpi-pail-outline:before{content:\\\"\\\"}.wbx-mark_frozen{text-align:center;cursor:ns-resize}.wbx-mark_frozen .webix_rpt_config_row_name{width:100%;font-size:13px}.wbx-mark_frozen .webix_rpt_config_row_name .webix_icon{vertical-align:middle}.wbx-mark_frozen.webix_dd_drag div{border-color:transparent;background:inherit}.webix_rpt_config_row,.webix_rpt_item_suggest{display:flex;justify-content:space-between;align-items:center}.webix_rpt_config_row .webix_icon,.webix_rpt_item_suggest .webix_icon{line-height:inherit}.webix_rpt_config_row_name{width:310px}.webix_rpt_chart_config .webix_rpt_config_row_name{padding-left:10px}.webix_rpt_columns_list .rpi-drag-vertical{color:#94a1b3;cursor:ns-resize}.webix_rpt_columns_list .webix_cell:not(.webix_dtable_subview):hover{background:#f4f5f9}.webix_rpt_columns_list .webix_cell:not(.webix_dtable_subview):hover .rpi-drag-vertical{color:#475466}.webix_rpt_columns_list .webix_dtable_subview .webix_view{border-left-width:0}.webix_rpt_columns_list .webix_dtable_subview{background-color:transparent}.webix_rpt_columns_list .webix_dtable_subview .webix_inp_label{font-weight:normal}.webix_rpt_drag{cursor:ns-resize}.webix_drag_zone .webix_rpt_config_row .rpi-drag-vertical,.webix_drag_zone .webix_rpt_config_row .webix_tree_close{visibility:hidden}.webix_rpt_delete .webix_button{color:#ff5c4c}.webix_rpt_title{color:#313131;font-weight:500}.webix_rpt_subtitle .webix_inp_label,.webix_rpt_subtitle .webix_el_box{color:#475466;font-weight:normal}.webix_rpt_date_selector{color:#1ca1c1;display:inline-block;line-height:1}.webix_rpt_date_selector .webix_rpt_sort_selector .webix_rpt_date_selector .webix_icon{cursor:pointer}.webix_rpt_grouppopup .webix_icon{padding-top:6px;float:right}.webix_rpt_grouppopup .wxi-radiobox-marked{color:#1ca1c1}.webix_rpt_grouppopup .wxi-radiobox-blank{color:#94a1b3}.webix_rpt_groupselect_delete,.webix_rpt_multicombo .webix_multicombo_delete{font-size:16px;width:20px;line-height:20px}.webix_rpt_groupselect_delete:after,.webix_rpt_multicombo .webix_multicombo_delete:after{content:\\\"\\\"}.webix_rpt_summary_form{border-color:transparent}.webix_rpt_chart_color{width:24px;height:24px;border-radius:2px;margin-left:10px}.webix_rpt_config_row_hover{background:#f4f5f9}.webix_rpt_colorpicker .webix_input_icon{position:absolute;right:32px}.webix_rpt_colorpicker .webix_input_icon:before{font-size:20px;content:\\\"\\\";left:30px;position:absolute;color:#94a1b3;top:2px}.webix_rpt_markerselect .webix_icon{font-size:18px;margin-right:2px}.webix_rpt_markerselect_list .webix_icon{font-size:18px;margin-right:17px}.webix_rpt_action_remove{color:#94a1b3;margin-top:6px}.webix_rpt_description .webix_template{padding-left:2px;font-size:13px}.webix_rpt_qselect_icon{padding-top:7px;float:right;color:#94a1b3}.webix_rpt_qselect_suggest .webix_scroll_cont:empty:before{content:attr(placeholder);font-size:13px;font-style:italic;color:#8693a5;text-align:center;display:inline-block;width:100%;line-height:25px}.webix_rpt_groupselect .webix_multicombo_value{display:flex;align-items:center;padding-right:6px}.webix_rpt_groupselect .webix_multicombo_value .webix_rpt_groupselect_delete{margin-top:0;position:static;line-height:1;margin-left:5px;height:auto}.webix_rpt_groupselect .webix_multicombo_value>span{vertical-align:middle}.webix_rpt_groupselect_sep{padding:0 6px 0 3px}.webix_rpt_bcols .webix_dtable_subview{padding-left:0}.webix_rpt_bucket_values .webix_list_item{display:flex;align-items:center}.webix_rpt_bucket_values .webix_list_item .webix_rpt_bucket_value{width:170px}.webix_rpt_multicombo .webix_multicombo_text{display:flex;align-items:center}.webix_rpt_bucket_value{max-width:170px;text-overflow:ellipsis;display:inline-block;overflow:hidden}.webix_multicombo_value .webix_rpt_bucket_icon{display:none}.webix_rpt_bucket_icon{width:25px;text-align:right;color:#94a1b3}.webix_rpt_bucket_sublabel{font-size:13px;color:#8693a5}.webix_rpt_bucket_sublabel.webix_icon{font-size:15px}.webix_rpt_buckets_num{margin-right:15px}.webix_rpt_subview .webix_invalid .webix_el_box input,.webix_rpt_subview .webix_invalid .webix_el_box .webix_inp_static{background:#fff;color:#475466}.webix_rpt_bucket_delete{width:40px;color:#94a1b3}.webix_rpt_bucket_delete:hover{color:#475466}.webix_rpt_bucket_value_selected{color:#8693a5}.webix_el_search .webix_badge{cursor:default;padding-left:4px}.webix_rpt .webix_treemap_item.l0{background-color:#42a5f5}.webix_rpt .webix_treemap_item.l1{background-color:#64b5f6}.webix_rpt .webix_treemap_item.l2{background-color:#90caf9}.webix_rpt .webix_treemap_item.l3{background-color:#bbdefb}.webix_rpt_list_btn .webix_cell{padding:0}.webix_rpt_list_btn .webix_icon{line-height:38px;border-radius:50%;width:38px;height:38px;color:#8693a5}.webix_rpt_list_btn .webix_icon:hover{background:rgba(0,0,0,0.07);color:#475466}.webix_rpt_list .webix_selected .webix_rpt_list_report_date,.webix_rpt_list .webix_selected .webix_icon,.webix_rpt_list .webix_selected:focus .webix_rpt_list_report_date,.webix_rpt_list .webix_selected:focus .webix_icon{color:#8693a5}.webix_rpt_list .webix_selected .webix_icon:hover,.webix_rpt_list .webix_selected:focus .webix_icon:hover{color:#475466}.webix_rpt_list_block{position:relative;padding-top:6px}.webix_rpt_list_report_date,.webix_rpt_list_report_name{width:260px;line-height:22px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.webix_rpt_list_report_date{color:#8693a5;font-size:13px;line-height:20px;height:20px;overflow:hidden}.webix_rpt_action_menu{position:absolute;right:0;top:50%;color:#94a1b3;margin-top:-8px}.webix_rpt_action_menu:hover{color:#475466}.webix_rpt_btn_active.webix_rpt_sort_icon .webix_icon,.webix_rpt_btn_active.webix_rpt_sort_icon button:hover .webix_icon{color:#1ca1c1}.webix_rpt_sort_icon .webix_icon{color:#94a1b3}.webix_rpt_sources_path{float:right;color:#888;font-size:12px}.webix_multicombo_value .webix_rpt_sources_path{display:none}.wbq-field-name .webix_rpt_sources_path{position:absolute;right:30px}.webix_rpt_popup_menu .webix_list_item{padding-left:7px}.webix_rpt_popup_menu .webix_icon{color:#94a1b3;float:left;font-size:19px;margin-top:6px;margin-right:5px}.webix_rpt_popup_menu .webix_disabled .webix_icon{color:#bfccdf}.webix_rpt_popup_menu .webix_list_item:active,.webix_rpt_popup_menu .webix_list_item:focus{background:transparent}.webix_rpt_vertical_chart_labels .webix_axis_item_x{transform:rotate(-45deg);text-align:right;transform-origin:75% 320%}.webix_rpt_vertical_chart_labels .webix_rpt_chart_label{width:80px}.webix_rpt_chart_label{max-width:80px}.webix_rpt_vertical_chart_labels .webix_rpt_chart_label0{left:40px !important}.webix_el_search .webix_badge{top:9px;right:29px}.webix_rpt_cls1{fill:#9dbabf;fill-opacity:.25}.webix_rpt_cls2{fill:#edeff0}.webix_rpt_cls3{fill:#b4dfea}.webix_rpt_cls4{fill:#fafbff}.webix_rpt_cls5{fill:#dedede}.webix_rpt_cls6{fill:#f2f2f2}.webix_rpt_cls7{fill:#fff}.webix_rpt_cls8{fill:#b4dfea}.webix_rpt_cls9{fill:#f4f5f9}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@charset \\\"UTF-8\\\";@font-face{font-family:\\\"scheduler-webfont\\\";src:url(\\\"fonts/scheduler-webfont.woff2\\\") format(\\\"woff2\\\"),url(\\\"fonts/scheduler-webfont.woff\\\") format(\\\"woff\\\");font-weight:normal;font-style:normal}[class^=shi-]:before,[class*=shi-]:before{font-family:\\\"scheduler-webfont\\\";display:inline-block;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.shi-agenda:before{content:\\\"\\\"}.shi-day:before{content:\\\"\\\"}.shi-month:before{content:\\\"\\\"}.shi-week:before{content:\\\"\\\"}.shi-back:before{content:\\\"\\\"}.shi-menu:before{content:\\\"\\\"}.shi-timeline:before{content:\\\"\\\"}.shi-units:before{content:\\\"\\\"}.shi-content-copy:before{content:\\\"\\\"}.shi-year:before{content:\\\"\\\"}.webix_scheduler_info .webix_template{overflow:auto;padding:0 0 0 2px}.webix_scheduler_info .webix_template .webix_scheduler_event_title{color:#313131;font-weight:500;margin-top:7px;margin-bottom:20px}.webix_scheduler_info .webix_template .webix_scheduler_event_from_to,.webix_scheduler_info .webix_template .webix_scheduler_event_recurring_pattern{margin-bottom:20px;line-height:20px}.webix_scheduler_info .webix_template .webix_scheduler_event_details_title,.webix_scheduler_info .webix_template .webix_scheduler_event_units_title{color:#313131;font-weight:500;margin-bottom:10px}.webix_scheduler_info .webix_template .webix_scheduler_event_text{line-height:20px}.webix_scheduler_info .webix_template .webix_scheduler_event_units{margin-bottom:10px}.webix_scheduler_info .webix_template .webix_scheduler_event_units .webix_scheduler_event_unit_item{display:inline-block;margin-right:6px}.webix_scheduler_section_tpl{margin-top:20px;margin-bottom:20px}.webix_scheduler_section_tpl .webix_scheduler_section_title{font-weight:500;color:#313131}.webix_scheduler_cal_color .webix_inp_static{padding-right:50px}.webix_scheduler_cal_color_suggest .webix_list_item,.webix_scheduler_cal_color_suggest .webix_list_item.webix_selected{position:relative;padding-right:32px}.webix_scheduler_cal_color_suggest .webix_scheduler_cal_marker{right:4px}.webix_scheduler_cal_marker{display:block;width:24px;height:24px;border-radius:2px;position:absolute;right:26px;top:50%;margin-top:-12px}.webix_scheduler_counter .webix_inp_counter_value{width:calc(100% - 60px)}.webix_scheduler_subform_popup{border-width:1px}.webix_scheduler_subform_popup .webix_win_head{border-bottom-color:transparent}.webix_scheduler_cal_disabled{color:#94a1b3}.webix_scheduler_cal_disabled .webix_scheduler_calendar_marker{opacity:.6}.webix_scheduler_day_events{border-color:#edeff0;position:relative}.webix_scheduler_day_events .webix_list_item{padding:0;cursor:default;padding:0}.webix_scheduler_day_event{padding:8px 8px 16px;overflow:hidden;cursor:pointer;position:absolute;border-radius:2px;border-left:3px solid;box-sizing:border-box;transition:box-shadow .15s}.webix_scheduler_day_event:hover{z-index:1;box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_day_event:hover .webix_scheduler_resizer{visibility:visible}.webix_active_resize .webix_scheduler_day_events .webix_scheduler_day_event,.webix_active_resize .webix_scheduler_day_events .webix_list_item{cursor:ns-resize}.webix_drag_event,.webix_drag_event:hover{border-radius:2px;box-shadow:3px 3px 7px rgba(0,0,0,0.3),2px 2px 4px rgba(0,0,0,0.2)}.webix_active_resize .webix_scheduler_day_event:hover,.webix_noselect .webix_scheduler_day_event:hover{box-shadow:none}.webix_active_resize .webix_scheduler_day_event:hover .webix_scheduler_resizer,.webix_noselect .webix_scheduler_day_event:hover .webix_scheduler_resizer{visibility:hidden}.webix_active_resize .webix_scheduler_day_event.webix_resize_event:hover .webix_scheduler_resizer{visibility:visible}.webix_resize_event{border-radius:2px;box-shadow:3px 3px 7px rgba(0,0,0,0.3),2px 2px 4px rgba(0,0,0,0.2)}.webix_resize_event .webix_scheduler_resizer{visibility:visible}.webix_scheduler_resizer{position:absolute;bottom:0;left:0;width:100%;height:16px;font-size:16px;visibility:hidden;cursor:ns-resize}.webix_scheduler_resizer::before{content:\\\"\\\";transform:rotate(90deg);position:absolute;margin-left:-10px}.webix_scheduler_multilist{border-left-color:#edeff0;border-bottom-color:transparent}.webix_scheduler_multilist .webix_list_item{cursor:default;padding:0;line-height:normal;font-weight:500;position:relative;border-color:transparent}.webix_scheduler_multilist .webix_scheduler_multi_more .webix_scheduler_multiday_event{transition:background-color .3s;background-color:#f4f5f9;text-align:center;border:0}.webix_scheduler_multilist .webix_scheduler_multi_more .webix_scheduler_multiday_event:hover{background-color:#e7e9f2;box-shadow:none}.webix_scheduler_multilist .webix_scheduler_multiday_event{top:4px;left:1px}.webix_scheduler_multiday_event{cursor:pointer;position:absolute;border-radius:2px;border-left:3px solid;padding:0 8px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:box-shadow .15s}.webix_scheduler_multiday_event:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_event_break_left.webix_scheduler_event_break_right:hover,.webix_scheduler_event_break_left.webix_scheduler_event_break_right.webix_scheduler_event_selected{box-shadow:3px 9px 5px -7px rgba(0,0,0,0.3),2px 8px 2px -7px rgba(0,0,0,0.2)}.webix_scheduler_event_name{display:inline-block;line-height:20px;font-weight:500;font-size:14px}.webix_scheduler_event_time{line-height:14px;margin-top:4px;font-size:12px}.webix_scheduler_scale .webix_list_item{cursor:default;padding:0;border-bottom-color:transparent;text-align:center}.webix_scheduler_inner_day{height:100%;overflow:hidden}.webix_scheduler_day_scroll{border-top-color:#edeff0;position:relative}.webix_scheduler_day_header .webix_template{font-weight:500;line-height:32px;text-align:center;padding:0 0 0 50px}.webix_scheduler_today_marker{z-index:2;position:absolute;background-color:#ea764f;width:100%;height:2px;margin-top:-1px;pointer-events:none}.webix_scheduler_today_marker:before{content:\\\"\\\";display:block;background:inherit;width:12px;height:12px;margin-top:-5px;border-radius:50%}.webix_scheduler_multilist .webix_drag_event.webix_list_item{box-shadow:none;background:transparent}.webix_scheduler_multilist .webix_drag_event.webix_list_item .webix_scheduler_multiday_event{box-shadow:3px 3px 7px rgba(0,0,0,0.3),2px 2px 4px rgba(0,0,0,0.2)}.webix_scheduler_day_header .webix_dataview_item{border-color:transparent;text-align:center;line-height:31px;padding:0;cursor:default}.webix_scheduler_day_header .webix_dataview_item .webix_scheduler_weekday{font-size:12px}.webix_scheduler_day_header .webix_dataview_item .webix_scheduler_monthday{font-size:16px;font-weight:500}.webix_scheduler_day_header .webix_dataview_item.webix_scheduler_list_today .webix_scheduler_monthday{width:22px;height:22px;line-height:22px}.webix_scheduler_week_days{border-top-color:#edeff0;position:relative}.webix_scheduler_week .webix_unit_header{color:#313131;border-color:transparent;font-weight:normal;line-height:28px}.webix_scheduler_week .webix_unit_header_inner{margin-right:8px}.webix_scheduler_week .webix_scheduler_monthday{font-size:16px;font-weight:500}.webix_scheduler_week .webix_scheduler_monthday.webix_scheduler_today{width:22px;height:22px;line-height:22px}.webix_scheduler_multidays{border-left-color:#edeff0;border-bottom-color:transparent}.webix_scheduler_multidays .webix_dataview_item{border-color:transparent;cursor:default}.webix_scheduler_multidays .webix_scheduler_multiday_event{font-weight:500}.webix_scheduler_multidays .webix_scheduler_multi_more{transition:background-color .3s;background-color:#f4f5f9;text-align:center;border:0}.webix_scheduler_multidays .webix_scheduler_multi_more:hover{background-color:#e7e9f2;box-shadow:none}.webix_drag_event .webix_scheduler_multiday_event:hover,.webix_noselect .webix_scheduler_multiday_event:hover{box-shadow:none}.webix_drag_event .webix_scheduler_multiday_event.webix_scheduler_multi_more,.webix_noselect .webix_scheduler_multiday_event.webix_scheduler_multi_more{background-color:#e7e9f2}.webix_scheduler_list_today .webix_scheduler_monthday,.webix_scheduler_monthday.webix_scheduler_today{display:inline-block;width:20px;height:20px;line-height:20px;border-radius:50%;border:1px solid #1ca1c1;text-align:center}.webix_cal_day_with_event .webix_cal_day_inner{position:relative}.webix_cal_day_with_event .webix_cal_day_inner::after{content:\\\"\\\";position:absolute;display:block;top:70%;left:50%;width:4px;height:4px;margin-left:-2px;border-radius:50%;background-color:#1ca1c1}.webix_cal_select.webix_cal_day_with_event .webix_cal_day_inner::after{background-color:#fff}.webix_cal_outside.webix_cal_day_with_event .webix_cal_day_inner::after{background-color:#94a1b3}.webix_scheduler_calendar .webix_cal_day{position:relative;padding:2px 0 0 2px;line-height:20px;font-size:14px;cursor:default}.webix_scheduler_calendar .webix_cal_day:nth-child(7n){border-right-color:transparent}.webix_scheduler_calendar .webix_cal_event{color:#1ca1c1;font-weight:normal}.webix_scheduler_calendar .webix_event_marker{width:16px;margin-right:2px}.webix_scheduler_calendar .webix_event_marker_inner{margin:0 3px;vertical-align:middle}.webix_scheduler_calendar .webix_cal_date{display:inline-block;line-height:24px;height:24px;width:24px;border:1px solid transparent;cursor:pointer;text-align:center;border-radius:50%}.webix_scheduler_calendar .webix_cal_date:hover{background-color:#f4f5f9;color:#1ca1c1;font-weight:500}.webix_scheduler_calendar .webix_cal_today .webix_cal_date{border-color:#1ca1c1}.webix_scheduler_calendar .webix_event_time{font-weight:500;margin-right:4px}.webix_drag_event .webix_scheduler_month_event:hover,.webix_noselect .webix_scheduler_month_event:hover{box-shadow:none}.webix_drag_event .webix_scheduler_month_event_single:hover,.webix_noselect .webix_scheduler_month_event_single:hover{background-color:transparent}.webix_drag_event.webix_scheduler_more_list .webix_scheduler_month_event,.webix_drag_event.webix_scheduler_more_list .webix_scheduler_month_event_single{width:100%}.webix_scheduler_calendar_header .webix_dataview_item{text-align:center;line-height:32px;border-color:transparent;cursor:default}.webix_scheduler_month_events{position:relative}.webix_scheduler_month_event,.webix_scheduler_month_event_single{z-index:1;position:absolute;box-sizing:border-box;border-radius:2px;padding:0 8px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;user-select:none;cursor:pointer}.webix_scheduler_month_event.webix_scheduler_past_event,.webix_scheduler_month_event_single.webix_scheduler_past_event{color:#8393a9}.webix_scheduler_month_event{border-left:3px solid;transition:box-shadow .15s}.webix_scheduler_month_event_single{transition:background .15s;padding:0 8px 0 4px}.webix_scheduler_month_event:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_month_event_single:hover{background-color:#f4f5f9}.webix_scheduler_more{display:inline-block;border-radius:20px;height:20px;width:auto;padding:0 8px;color:#475466;font-size:14px;font-weight:500;transition:background .15s;position:absolute;right:8px;top:5px}.webix_scheduler_more:hover{background-color:#f4f5f9}.webix_scheduler_more_list .webix_scheduler_month_event,.webix_scheduler_more_list .webix_scheduler_month_event_single{box-sizing:border-box;width:calc(100% - 8px);display:block;border-radius:2px;line-height:20px}.webix_scheduler_more_list .webix_scheduler_month_event{padding:4px 8px}.webix_scheduler_more_list .webix_scheduler_month_event .webix_event_text{width:100%;padding:0}.webix_scheduler_more_list .webix_scheduler_month_event_single{padding:4px 8px 4px 4px}.webix_scheduler_more_list .webix_scheduler_month_event_single .webix_event_text{width:calc(100% - 14px)}.webix_scheduler_more_list .webix_list_item{padding:4px;border:0}.webix_scheduler_more_list .webix_event_marker{float:left;height:40px;margin-right:4px}.webix_scheduler_more_list .webix_event_marker_inner{margin-top:4px}.webix_scheduler_more_list .webix_event_text{float:left;font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.webix_scheduler_more_list .webix_event_time{float:left;font-size:12px;line-height:16px;margin-top:4px}.webix_scheduler_month_event_single.webix_scheduler_event_selected{background-color:#f4f5f9;box-shadow:none}.webix_scheduler_event_break_left::before,.webix_scheduler_event_break_right::after{content:\\\"\\\";height:100%;display:block;position:absolute;top:0;box-sizing:border-box;border-top:12px solid transparent;border-bottom:12px solid transparent;border-right:8px solid}.webix_scheduler_event_break_left{border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0;padding-left:11px}.webix_scheduler_event_break_left::before{left:0;border-right-color:inherit;border-top-color:#fff;border-bottom-color:#fff}.webix_scheduler_event_break_right::after{right:0;border-right-color:#fff}.webix_scheduler_event_break_left:hover,.webix_scheduler_event_break_left.webix_scheduler_event_selected{box-shadow:6px 6px 5px -4px rgba(0,0,0,0.3),5px 5px 2px -4px rgba(0,0,0,0.2)}.webix_scheduler_event_break_right:hover,.webix_scheduler_event_break_right.webix_scheduler_event_selected{box-shadow:-1px 5px 5px -3px rgba(0,0,0,0.3),-2px 4px 2px -3px rgba(0,0,0,0.2)}.webix_drag_zone .webix_scheduler_event_break_left::before,.webix_drag_zone .webix_scheduler_event_break_right::after{visibility:hidden}.webix_drag_zone .webix_scheduler_event_break_left{border-radius:2px;border-left-width:3px;padding-left:8px}.webix_scheduler_dnd_1 .webix_scheduler_event_break_left::before{border-top-color:#f4f5f9;border-bottom-color:#f4f5f9}.webix_scheduler_dnd_n .webix_scheduler_event_break_right::after{border-right-color:#f4f5f9}.webix_scheduler_year{justify-content:space-evenly}.webix_scheduler_year .webix_cal_month,.webix_scheduler_year .webix_cal_month .webix_cal_month_name{cursor:pointer}.webix_scheduler_year .webix_cal_month:hover .webix_cal_month_name{color:#1ca1c1}.webix_scheduler_year .webix_cal_outside{visibility:hidden}.webix_scheduler_absbutton{border-radius:50%;z-index:91}.webix_scheduler_absbutton .webix_el_box{background-color:#1ca1c1}.webix_scheduler_absbutton .webix_el_box .webix_icon_button:hover:before{background-color:#1992af}.webix_scheduler_absbutton .webix_el_box .webix_icon{color:#fff}.webix_scheduler_navlist .webix_icon{color:#94a1b3}.webix_scheduler_navlist .webix_selected .webix_icon{color:#1ca1c1}.webix_scheduler_navlist .webix_list_item,.webix_scheduler_navlist .webix_list_item.webix_selected{border-bottom-color:transparent}.webix_scheduler_navlist .webix_list_item:hover,.webix_scheduler_navlist .webix_list_item.webix_selected:hover{background-color:#f4f5f9}.webix_scheduler_navlist .webix_list_item.webix_selected{color:#475466;background-color:#f4f5f9}.webix_scheduler_cal_list .webix_list_item{padding:2px 8px 2px 0}.webix_scheduler_cal_list .webix_list_item span{float:left}.webix_scheduler_cal_list .webix_list_item .webix_icon{line-height:inherit}.webix_scheduler_cal_list .webix_list_item:hover .webix_scheduler_cal_edit{color:#94a1b3}.webix_scheduler_cal_list .webix_list_item.webix_selected{box-shadow:none;padding:2px 8px 2px 0;background-color:transparent}.webix_scheduler_cal_list .webix_list_item.webix_selected .webix_scheduler_cal_edit{color:#1ca1c1}.webix_scheduler_cal_list .webix_list_item.webix_selected .webix_scheduler_cal_edit::before{content:\\\"\\\"}.webix_scheduler_cal_list .webix_dt_editor input{padding-left:23px;border-color:transparent;border-bottom-color:#1ca1c1}.webix_scheduler_cal_popup .webix_win_head{border-bottom-color:transparent}.webix_scheduler_active{margin-right:4px}.webix_scheduler_cal_title{overflow:hidden;width:calc(100% - 24px - 29px - 4px);white-space:nowrap;text-overflow:ellipsis}.webix_scheduler_cal_edit{color:transparent;font-size:18px;width:31px;line-height:31px;border-radius:50%}.webix_scheduler_cal_edit:hover{color:#1ca1c1;background-color:#f4f5f9}.webix_scheduler_cal_edit.webix_scheduler_cal_visible{color:#94a1b3}.webix_scheduler_settings .webix_template{padding:0;text-align:center;font-weight:500;line-height:38px}.webix_scheduler_settings .webix_template:hover{background-color:#f4f5f9}.webix_event_overall{padding:0 8px 0 20px;height:100%;line-height:49px;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center}.webix_event_overall.webix_scheduler_past_event{color:#8393a9}.webix_event_overall.webix_scheduler_past_event .webix_event_time .end{color:#8393a9}.webix_event_overall .webix_event_time{flex-basis:70px;flex-shrink:0;display:block;text-align:center}.webix_event_overall .webix_event_time .start,.webix_event_overall .webix_event_time .end{font-size:12px;line-height:16px}.webix_event_overall .webix_event_time .end{color:#94a1b3}.webix_list_item .webix_event_text{padding-left:10px;display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;white-space:nowrap;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis}.webix_event_marker{display:inline-block;width:10px}.webix_event_marker_inner{display:inline-block;border-radius:50%;width:10px;height:10px}.webix_scheduler_event_selected{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_multi_space{text-align:center}.webix_scheduler_multi_space .webix_template{padding:0}.webix_scheduler_multi_space .webix_scheduler_more_icon{cursor:pointer;color:#94a1b3;transition:color .3s;position:relative;top:calc(100% - 26px);height:26px;width:26px}.webix_scheduler_multi_space .webix_scheduler_more_icon:hover{color:#475466}.webix_scheduler_multi_space .webix_scheduler_more_icon:after{content:\\\"\\\";transition:background-color .3s;height:26px;width:26px;border-radius:50%;position:absolute;top:-4px;left:0;z-index:-1}.webix_scheduler_multi_space .webix_scheduler_more_icon:hover:after{background-color:rgba(148,161,179,0.1)}.webix_scheduler_agenda .webix_scroll_cont{padding-left:120px}.webix_scheduler_agenda .webix_list_item{border-color:transparent;padding:0;width:calc(100% - 120px) !important}.webix_scheduler_agenda .webix_event_overall{line-height:40px;height:40px}.webix_scheduler_agenda .webix_event_overall:hover{background-color:#f4f5f9}.webix_scheduler_agenda .webix_event_overall.webix_scheduler_past_event{color:#8393a9}.webix_scheduler_agenda .webix_event_first{padding-top:8px}.webix_scheduler_agenda .webix_event_last{padding-bottom:8px}.webix_scheduler_agenda .webix_event_last:not(:last-child){border-color:#edeff0}.webix_scheduler_agenda .webix_agenda_selected{background-color:#f4f5f9}.webix_scheduler_agenda .webix_unit_header{float:left;margin-left:-120px;width:120px !important;background-color:transparent;border-bottom-width:0;line-height:18px;padding:6px 8px;box-sizing:border-box}.webix_scheduler_agenda .webix_unit_header:not(:first-child){border-top:1px solid #edeff0;margin-top:-1px}.webix_scheduler_agenda .webix_unit_header .webix_scheduler_dayofweek{color:#94a1b3;font-weight:normal;font-size:12px}.webix_scheduler_timeline_scale .webix_template{padding:0}.webix_scheduler_timeline_scale_row{display:flex;box-sizing:border-box}.webix_scheduler_timeline_scale_row:not(:last-child){border-bottom:1px solid #dadee0}.webix_scheduler_timeline_scale_cell{display:flex;flex:0 0 auto;justify-content:center;align-items:center;border-right:1px solid #dadee0;box-sizing:border-box;background-color:#f4f5f9}.webix_scheduler_timeline_event{position:absolute;box-sizing:border-box;border-radius:2px;color:#fff;cursor:pointer;border-left:3px solid;transition:box-shadow .15s;overflow:hidden}.webix_scheduler_timeline_event:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_timeline_content{text-align:center;line-height:30px;position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 12px}.webix_scheduler_timeline_task .webix_scheduler_timeline_content{padding:0 32px}.webix_scheduler_timeline_bars .webix_list_item,.webix_scheduler_timeline_sections .webix_cell{border-color:#dadee0;text-overflow:ellipsis}.webix_scheduler_timeline_bars .webix_list_item{cursor:default}.webix_scheduler_timeline_sections .webix_c_scroll_y div{color:transparent;background-color:transparent}.webix_scheduler_timeline_space{background-color:#f4f5f9}.webix_scheduler_timeline_event.webix_scheduler_multi_more{transition:background-color .3s;background-color:#f4f5f9}.webix_scheduler_timeline_event.webix_scheduler_multi_more .webix_scheduler_timeline_content{text-align:left;color:#475466}.webix_scheduler_timeline_event.webix_scheduler_multi_more:hover{background-color:#e7e9f2;box-shadow:none}.webix_scheduler_timeline_event.webix_scheduler_event_break_left{border-left-width:0;border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.webix_scheduler_timeline_event.webix_scheduler_event_break_left:hover{box-shadow:6px 6px 5px -4px rgba(0,0,0,0.2),5px 5px 2px -4px rgba(0,0,0,0.2)}.webix_scheduler_timeline_event.webix_scheduler_event_break_right:hover{box-shadow:-1px 5px 5px -3px rgba(0,0,0,0.3),-2px 4px 2px -3px rgba(0,0,0,0.2)}.webix_scheduler_copy.webix_scheduler_day_event.webix_scheduler_event_selected,.webix_scheduler_copy.webix_scheduler_day_event,.webix_scheduler_copy.webix_scheduler_month_event.webix_scheduler_event_selected,.webix_scheduler_copy.webix_scheduler_month_event,.webix_scheduler_copy.webix_scheduler_multiday_event,.webix_scheduler_copy.webix_scheduler_timeline_event.webix_scheduler_event_selected,.webix_scheduler_copy.webix_scheduler_timeline_event{box-shadow:2px 2px 5px #1ca1c1,1px 1px 2px #1ca1c1}.webix_scheduler_copy.webix_scheduler_multiday_event.webix_scheduler_event_break_right,.webix_scheduler_copy.webix_scheduler_month_event.webix_scheduler_event_break_right,.webix_scheduler_copy.webix_scheduler_timeline_event.webix_scheduler_event_break_right{box-shadow:3px 9px 5px -7px #1ca1c1,-6px 9px 3px -7px #1ca1c1}.webix_scheduler_copy.webix_scheduler_multiday_event.webix_scheduler_event_break_left,.webix_scheduler_copy.webix_scheduler_month_event.webix_scheduler_event_break_left,.webix_scheduler_copy.webix_scheduler_timeline_event.webix_scheduler_event_break_left{box-shadow:3px 9px 5px -7px #1ca1c1,2px 8px 2px -7px #1ca1c1}.webix_scheduler_copy .webix_scheduler_multiday_event.webix_scheduler_event_break_right{box-shadow:3px 9px 5px -7px #1ca1c1,-6px 9px 3px -7px #1ca1c1}.webix_scheduler_copy .webix_scheduler_multiday_event.webix_scheduler_event_break_left{box-shadow:3px 9px 5px -7px #1ca1c1,2px 8px 2px -7px #1ca1c1}.webix_scheduler_cut{opacity:.5}.webix_scheduler_month_event_single.webix_scheduler_event_selected.webix_scheduler_copy,.webix_scheduler_month_event_single.webix_scheduler_copy{background-color:rgba(28,161,193,0.2)}.webix_scheduler_paste_target{box-shadow:inset 0 2px 0 0 #1ca1c1,inset 0 -2px 0 0 #1ca1c1}.webix_scheduler_clipboard_target.webix_scheduler_calendar .webix_cal_day,.webix_scheduler_clipboard_target.webix_scheduler_timeline_bars .webix_list_item,.webix_scheduler_clipboard_target.webix_scheduler_day_events .webix_list_item,.webix_scheduler_clipboard_target.webix_scheduler_multilist{cursor:pointer}.webix_scheduler .webix_progress_top{z-index:10000}.webix_scheduler_action_popup .webix_win_head{border-bottom-color:transparent}.webix_scheduler_sidemenu{z-index:1 !important}.webix_toolbar.webix_scheduler_toolbar .webix_view,.webix_toolbar.webix_scheduler_toolbar .webix_control.webix_el_tabbar{background-color:transparent}.webix_toolbar.webix_scheduler_toolbar .webix_item_tab{background:transparent;color:#fff}.webix_toolbar.webix_scheduler_toolbar .webix_item_tab:hover{background-color:rgba(0,0,0,0.2)}.webix_toolbar.webix_scheduler_toolbar .webix_item_tab.webix_selected,.webix_toolbar.webix_scheduler_toolbar .webix_item_tab.webix_selected:focus{color:#fff;box-shadow:inset 0 -2px #fff}.webix_scheduler_cal_title{width:calc(100% - 24px - 31px - 4px)}.webix_scheduler_danger .webix_button{color:#ff5c4c;background-color:#fff1ef}.webix_scheduler_danger .webix_button:hover,.webix_scheduler_danger .webix_button:focus{background-color:#ffe7e5}.webix_scheduler_danger .webix_button:active{background-color:#ffdedb}.webix_scheduler_checkbox_allday .webix_custom_checkbox::before{margin-left:-2px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/components/scheduler/scheduler.min.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@charset \\\"UTF-8\\\";@font-face{font-family:\\\"scheduler-webfont\\\";src:url(\\\"fonts/scheduler-webfont.woff2\\\") format(\\\"woff2\\\"),url(\\\"fonts/scheduler-webfont.woff\\\") format(\\\"woff\\\");font-weight:normal;font-style:normal}[class^=shi-]:before,[class*=shi-]:before{font-family:\\\"scheduler-webfont\\\";display:inline-block;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.shi-agenda:before{content:\\\"\\\"}.shi-day:before{content:\\\"\\\"}.shi-month:before{content:\\\"\\\"}.shi-week:before{content:\\\"\\\"}.shi-back:before{content:\\\"\\\"}.shi-menu:before{content:\\\"\\\"}.shi-timeline:before{content:\\\"\\\"}.shi-units:before{content:\\\"\\\"}.shi-content-copy:before{content:\\\"\\\"}.shi-year:before{content:\\\"\\\"}.webix_scheduler_info .webix_template{overflow:auto;padding:0 0 0 2px}.webix_scheduler_info .webix_template .webix_scheduler_event_title{color:#313131;font-weight:500;margin-top:7px;margin-bottom:20px}.webix_scheduler_info .webix_template .webix_scheduler_event_from_to,.webix_scheduler_info .webix_template .webix_scheduler_event_recurring_pattern{margin-bottom:20px;line-height:20px}.webix_scheduler_info .webix_template .webix_scheduler_event_details_title,.webix_scheduler_info .webix_template .webix_scheduler_event_units_title{color:#313131;font-weight:500;margin-bottom:10px}.webix_scheduler_info .webix_template .webix_scheduler_event_text{line-height:20px}.webix_scheduler_info .webix_template .webix_scheduler_event_units{margin-bottom:10px}.webix_scheduler_info .webix_template .webix_scheduler_event_units .webix_scheduler_event_unit_item{display:inline-block;margin-right:6px}.webix_scheduler_section_tpl{margin-top:20px;margin-bottom:20px}.webix_scheduler_section_tpl .webix_scheduler_section_title{font-weight:500;color:#313131}.webix_scheduler_cal_color .webix_inp_static{padding-right:50px}.webix_scheduler_cal_color_suggest .webix_list_item,.webix_scheduler_cal_color_suggest .webix_list_item.webix_selected{position:relative;padding-right:32px}.webix_scheduler_cal_color_suggest .webix_scheduler_cal_marker{right:4px}.webix_scheduler_cal_marker{display:block;width:24px;height:24px;border-radius:2px;position:absolute;right:26px;top:50%;margin-top:-12px}.webix_scheduler_counter .webix_inp_counter_value{width:calc(100% - 60px)}.webix_scheduler_subform_popup{border-width:1px}.webix_scheduler_subform_popup .webix_win_head{border-bottom-color:transparent}.webix_scheduler_cal_disabled{color:#94a1b3}.webix_scheduler_cal_disabled .webix_scheduler_calendar_marker{opacity:.6}.webix_scheduler_day_events{border-color:#edeff0;position:relative}.webix_scheduler_day_events .webix_list_item{padding:0;cursor:default;padding:0}.webix_scheduler_day_event{padding:8px 8px 16px;overflow:hidden;cursor:pointer;position:absolute;border-radius:2px;border-left:3px solid;box-sizing:border-box;transition:box-shadow .15s}.webix_scheduler_day_event:hover{z-index:1;box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_day_event:hover .webix_scheduler_resizer{visibility:visible}.webix_active_resize .webix_scheduler_day_events .webix_scheduler_day_event,.webix_active_resize .webix_scheduler_day_events .webix_list_item{cursor:ns-resize}.webix_drag_event,.webix_drag_event:hover{border-radius:2px;box-shadow:3px 3px 7px rgba(0,0,0,0.3),2px 2px 4px rgba(0,0,0,0.2)}.webix_active_resize .webix_scheduler_day_event:hover,.webix_noselect .webix_scheduler_day_event:hover{box-shadow:none}.webix_active_resize .webix_scheduler_day_event:hover .webix_scheduler_resizer,.webix_noselect .webix_scheduler_day_event:hover .webix_scheduler_resizer{visibility:hidden}.webix_active_resize .webix_scheduler_day_event.webix_resize_event:hover .webix_scheduler_resizer{visibility:visible}.webix_resize_event{border-radius:2px;box-shadow:3px 3px 7px rgba(0,0,0,0.3),2px 2px 4px rgba(0,0,0,0.2)}.webix_resize_event .webix_scheduler_resizer{visibility:visible}.webix_scheduler_resizer{position:absolute;bottom:0;left:0;width:100%;height:16px;font-size:16px;visibility:hidden;cursor:ns-resize}.webix_scheduler_resizer::before{content:\\\"\\\";transform:rotate(90deg);position:absolute;margin-left:-10px}.webix_scheduler_multilist{border-left-color:#edeff0;border-bottom-color:transparent}.webix_scheduler_multilist .webix_list_item{cursor:default;padding:0;line-height:normal;font-weight:500;position:relative;border-color:transparent}.webix_scheduler_multilist .webix_scheduler_multi_more .webix_scheduler_multiday_event{transition:background-color .3s;background-color:#f4f5f9;text-align:center;border:0}.webix_scheduler_multilist .webix_scheduler_multi_more .webix_scheduler_multiday_event:hover{background-color:#e7e9f2;box-shadow:none}.webix_scheduler_multilist .webix_scheduler_multiday_event{top:4px;left:1px}.webix_scheduler_multiday_event{cursor:pointer;position:absolute;border-radius:2px;border-left:3px solid;padding:0 8px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:box-shadow .15s}.webix_scheduler_multiday_event:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_event_break_left.webix_scheduler_event_break_right:hover,.webix_scheduler_event_break_left.webix_scheduler_event_break_right.webix_scheduler_event_selected{box-shadow:3px 9px 5px -7px rgba(0,0,0,0.3),2px 8px 2px -7px rgba(0,0,0,0.2)}.webix_scheduler_event_name{display:inline-block;line-height:20px;font-weight:500;font-size:14px}.webix_scheduler_event_time{line-height:14px;margin-top:4px;font-size:12px}.webix_scheduler_scale .webix_list_item{cursor:default;padding:0;border-bottom-color:transparent;text-align:center}.webix_scheduler_inner_day{height:100%;overflow:hidden}.webix_scheduler_day_scroll{border-top-color:#edeff0;position:relative}.webix_scheduler_day_header .webix_template{font-weight:500;line-height:32px;text-align:center;padding:0 0 0 50px}.webix_scheduler_today_marker{z-index:2;position:absolute;background-color:#ea764f;width:100%;height:2px;margin-top:-1px;pointer-events:none}.webix_scheduler_today_marker:before{content:\\\"\\\";display:block;background:inherit;width:12px;height:12px;margin-top:-5px;border-radius:50%}.webix_scheduler_multilist .webix_drag_event.webix_list_item{box-shadow:none;background:transparent}.webix_scheduler_multilist .webix_drag_event.webix_list_item .webix_scheduler_multiday_event{box-shadow:3px 3px 7px rgba(0,0,0,0.3),2px 2px 4px rgba(0,0,0,0.2)}.webix_scheduler_day_header .webix_dataview_item{border-color:transparent;text-align:center;line-height:31px;padding:0;cursor:default}.webix_scheduler_day_header .webix_dataview_item .webix_scheduler_weekday{font-size:12px}.webix_scheduler_day_header .webix_dataview_item .webix_scheduler_monthday{font-size:16px;font-weight:500}.webix_scheduler_day_header .webix_dataview_item.webix_scheduler_list_today .webix_scheduler_monthday{width:22px;height:22px;line-height:22px}.webix_scheduler_week_days{border-top-color:#edeff0;position:relative}.webix_scheduler_week .webix_unit_header{color:#313131;border-color:transparent;font-weight:normal;line-height:28px}.webix_scheduler_week .webix_unit_header_inner{margin-right:8px}.webix_scheduler_week .webix_scheduler_monthday{font-size:16px;font-weight:500}.webix_scheduler_week .webix_scheduler_monthday.webix_scheduler_today{width:22px;height:22px;line-height:22px}.webix_scheduler_multidays{border-left-color:#edeff0;border-bottom-color:transparent}.webix_scheduler_multidays .webix_dataview_item{border-color:transparent;cursor:default}.webix_scheduler_multidays .webix_scheduler_multiday_event{font-weight:500}.webix_scheduler_multidays .webix_scheduler_multi_more{transition:background-color .3s;background-color:#f4f5f9;text-align:center;border:0}.webix_scheduler_multidays .webix_scheduler_multi_more:hover{background-color:#e7e9f2;box-shadow:none}.webix_drag_event .webix_scheduler_multiday_event:hover,.webix_noselect .webix_scheduler_multiday_event:hover{box-shadow:none}.webix_drag_event .webix_scheduler_multiday_event.webix_scheduler_multi_more,.webix_noselect .webix_scheduler_multiday_event.webix_scheduler_multi_more{background-color:#e7e9f2}.webix_scheduler_list_today .webix_scheduler_monthday,.webix_scheduler_monthday.webix_scheduler_today{display:inline-block;width:20px;height:20px;line-height:20px;border-radius:50%;border:1px solid #1ca1c1;text-align:center}.webix_cal_day_with_event .webix_cal_day_inner{position:relative}.webix_cal_day_with_event .webix_cal_day_inner::after{content:\\\"\\\";position:absolute;display:block;top:70%;left:50%;width:4px;height:4px;margin-left:-2px;border-radius:50%;background-color:#1ca1c1}.webix_cal_select.webix_cal_day_with_event .webix_cal_day_inner::after{background-color:#fff}.webix_cal_outside.webix_cal_day_with_event .webix_cal_day_inner::after{background-color:#94a1b3}.webix_scheduler_calendar .webix_cal_day{position:relative;padding:2px 0 0 2px;line-height:20px;font-size:14px;cursor:default}.webix_scheduler_calendar .webix_cal_day:nth-child(7n){border-right-color:transparent}.webix_scheduler_calendar .webix_cal_event{color:#1ca1c1;font-weight:normal}.webix_scheduler_calendar .webix_event_marker{width:16px;margin-right:2px}.webix_scheduler_calendar .webix_event_marker_inner{margin:0 3px;vertical-align:middle}.webix_scheduler_calendar .webix_cal_date{display:inline-block;line-height:24px;height:24px;width:24px;border:1px solid transparent;cursor:pointer;text-align:center;border-radius:50%}.webix_scheduler_calendar .webix_cal_date:hover{background-color:#f4f5f9;color:#1ca1c1;font-weight:500}.webix_scheduler_calendar .webix_cal_today .webix_cal_date{border-color:#1ca1c1}.webix_scheduler_calendar .webix_event_time{font-weight:500;margin-right:4px}.webix_drag_event .webix_scheduler_month_event:hover,.webix_noselect .webix_scheduler_month_event:hover{box-shadow:none}.webix_drag_event .webix_scheduler_month_event_single:hover,.webix_noselect .webix_scheduler_month_event_single:hover{background-color:transparent}.webix_drag_event.webix_scheduler_more_list .webix_scheduler_month_event,.webix_drag_event.webix_scheduler_more_list .webix_scheduler_month_event_single{width:100%}.webix_scheduler_calendar_header .webix_dataview_item{text-align:center;line-height:32px;border-color:transparent;cursor:default}.webix_scheduler_month_events{position:relative}.webix_scheduler_month_event,.webix_scheduler_month_event_single{z-index:1;position:absolute;box-sizing:border-box;border-radius:2px;padding:0 8px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;user-select:none;cursor:pointer}.webix_scheduler_month_event.webix_scheduler_past_event,.webix_scheduler_month_event_single.webix_scheduler_past_event{color:#8393a9}.webix_scheduler_month_event{border-left:3px solid;transition:box-shadow .15s}.webix_scheduler_month_event_single{transition:background .15s;padding:0 8px 0 4px}.webix_scheduler_month_event:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_month_event_single:hover{background-color:#f4f5f9}.webix_scheduler_more{display:inline-block;border-radius:20px;height:20px;width:auto;padding:0 8px;color:#475466;font-size:14px;font-weight:500;transition:background .15s;position:absolute;right:8px;top:5px}.webix_scheduler_more:hover{background-color:#f4f5f9}.webix_scheduler_more_list .webix_scheduler_month_event,.webix_scheduler_more_list .webix_scheduler_month_event_single{box-sizing:border-box;width:calc(100% - 8px);display:block;border-radius:2px;line-height:20px}.webix_scheduler_more_list .webix_scheduler_month_event{padding:4px 8px}.webix_scheduler_more_list .webix_scheduler_month_event .webix_event_text{width:100%;padding:0}.webix_scheduler_more_list .webix_scheduler_month_event_single{padding:4px 8px 4px 4px}.webix_scheduler_more_list .webix_scheduler_month_event_single .webix_event_text{width:calc(100% - 14px)}.webix_scheduler_more_list .webix_list_item{padding:4px;border:0}.webix_scheduler_more_list .webix_event_marker{float:left;height:40px;margin-right:4px}.webix_scheduler_more_list .webix_event_marker_inner{margin-top:4px}.webix_scheduler_more_list .webix_event_text{float:left;font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.webix_scheduler_more_list .webix_event_time{float:left;font-size:12px;line-height:16px;margin-top:4px}.webix_scheduler_month_event_single.webix_scheduler_event_selected{background-color:#f4f5f9;box-shadow:none}.webix_scheduler_event_break_left::before,.webix_scheduler_event_break_right::after{content:\\\"\\\";height:100%;display:block;position:absolute;top:0;box-sizing:border-box;border-top:12px solid transparent;border-bottom:12px solid transparent;border-right:8px solid}.webix_scheduler_event_break_left{border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0;padding-left:11px}.webix_scheduler_event_break_left::before{left:0;border-right-color:inherit;border-top-color:#fff;border-bottom-color:#fff}.webix_scheduler_event_break_right::after{right:0;border-right-color:#fff}.webix_scheduler_event_break_left:hover,.webix_scheduler_event_break_left.webix_scheduler_event_selected{box-shadow:6px 6px 5px -4px rgba(0,0,0,0.3),5px 5px 2px -4px rgba(0,0,0,0.2)}.webix_scheduler_event_break_right:hover,.webix_scheduler_event_break_right.webix_scheduler_event_selected{box-shadow:-1px 5px 5px -3px rgba(0,0,0,0.3),-2px 4px 2px -3px rgba(0,0,0,0.2)}.webix_drag_zone .webix_scheduler_event_break_left::before,.webix_drag_zone .webix_scheduler_event_break_right::after{visibility:hidden}.webix_drag_zone .webix_scheduler_event_break_left{border-radius:2px;border-left-width:3px;padding-left:8px}.webix_scheduler_dnd_1 .webix_scheduler_event_break_left::before{border-top-color:#f4f5f9;border-bottom-color:#f4f5f9}.webix_scheduler_dnd_n .webix_scheduler_event_break_right::after{border-right-color:#f4f5f9}.webix_scheduler_year{justify-content:space-evenly}.webix_scheduler_year .webix_cal_month,.webix_scheduler_year .webix_cal_month .webix_cal_month_name{cursor:pointer}.webix_scheduler_year .webix_cal_month:hover .webix_cal_month_name{color:#1ca1c1}.webix_scheduler_year .webix_cal_outside{visibility:hidden}.webix_scheduler_absbutton{border-radius:50%;z-index:91}.webix_scheduler_absbutton .webix_el_box{background-color:#1ca1c1}.webix_scheduler_absbutton .webix_el_box .webix_icon_button:hover:before{background-color:#1992af}.webix_scheduler_absbutton .webix_el_box .webix_icon{color:#fff}.webix_scheduler_navlist .webix_icon{color:#94a1b3}.webix_scheduler_navlist .webix_selected .webix_icon{color:#1ca1c1}.webix_scheduler_navlist .webix_list_item,.webix_scheduler_navlist .webix_list_item.webix_selected{border-bottom-color:transparent}.webix_scheduler_navlist .webix_list_item:hover,.webix_scheduler_navlist .webix_list_item.webix_selected:hover{background-color:#f4f5f9}.webix_scheduler_navlist .webix_list_item.webix_selected{color:#475466;background-color:#f4f5f9}.webix_scheduler_cal_list .webix_list_item{padding:2px 8px 2px 0}.webix_scheduler_cal_list .webix_list_item span{float:left}.webix_scheduler_cal_list .webix_list_item .webix_icon{line-height:inherit}.webix_scheduler_cal_list .webix_list_item:hover .webix_scheduler_cal_edit{color:#94a1b3}.webix_scheduler_cal_list .webix_list_item.webix_selected{box-shadow:none;padding:2px 8px 2px 0;background-color:transparent}.webix_scheduler_cal_list .webix_list_item.webix_selected .webix_scheduler_cal_edit{color:#1ca1c1}.webix_scheduler_cal_list .webix_list_item.webix_selected .webix_scheduler_cal_edit::before{content:\\\"\\\"}.webix_scheduler_cal_list .webix_dt_editor input{padding-left:23px;border-color:transparent;border-bottom-color:#1ca1c1}.webix_scheduler_cal_popup .webix_win_head{border-bottom-color:transparent}.webix_scheduler_active{margin-right:4px}.webix_scheduler_cal_title{overflow:hidden;width:calc(100% - 24px - 29px - 4px);white-space:nowrap;text-overflow:ellipsis}.webix_scheduler_cal_edit{color:transparent;font-size:18px;width:31px;line-height:31px;border-radius:50%}.webix_scheduler_cal_edit:hover{color:#1ca1c1;background-color:#f4f5f9}.webix_scheduler_cal_edit.webix_scheduler_cal_visible{color:#94a1b3}.webix_scheduler_settings .webix_template{padding:0;text-align:center;font-weight:500;line-height:38px}.webix_scheduler_settings .webix_template:hover{background-color:#f4f5f9}.webix_event_overall{padding:0 8px 0 20px;height:100%;line-height:49px;display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center}.webix_event_overall.webix_scheduler_past_event{color:#8393a9}.webix_event_overall.webix_scheduler_past_event .webix_event_time .end{color:#8393a9}.webix_event_overall .webix_event_time{flex-basis:70px;flex-shrink:0;display:block;text-align:center}.webix_event_overall .webix_event_time .start,.webix_event_overall .webix_event_time .end{font-size:12px;line-height:16px}.webix_event_overall .webix_event_time .end{color:#94a1b3}.webix_list_item .webix_event_text{padding-left:10px;display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;white-space:nowrap;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis}.webix_event_marker{display:inline-block;width:10px}.webix_event_marker_inner{display:inline-block;border-radius:50%;width:10px;height:10px}.webix_scheduler_event_selected{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_multi_space{text-align:center}.webix_scheduler_multi_space .webix_template{padding:0}.webix_scheduler_multi_space .webix_scheduler_more_icon{cursor:pointer;color:#94a1b3;transition:color .3s;position:relative;top:calc(100% - 26px);height:26px;width:26px}.webix_scheduler_multi_space .webix_scheduler_more_icon:hover{color:#475466}.webix_scheduler_multi_space .webix_scheduler_more_icon:after{content:\\\"\\\";transition:background-color .3s;height:26px;width:26px;border-radius:50%;position:absolute;top:-4px;left:0;z-index:-1}.webix_scheduler_multi_space .webix_scheduler_more_icon:hover:after{background-color:rgba(148,161,179,0.1)}.webix_scheduler_agenda .webix_scroll_cont{padding-left:120px}.webix_scheduler_agenda .webix_list_item{border-color:transparent;padding:0;width:calc(100% - 120px) !important}.webix_scheduler_agenda .webix_event_overall{line-height:40px;height:40px}.webix_scheduler_agenda .webix_event_overall:hover{background-color:#f4f5f9}.webix_scheduler_agenda .webix_event_overall.webix_scheduler_past_event{color:#8393a9}.webix_scheduler_agenda .webix_event_first{padding-top:8px}.webix_scheduler_agenda .webix_event_last{padding-bottom:8px}.webix_scheduler_agenda .webix_event_last:not(:last-child){border-color:#edeff0}.webix_scheduler_agenda .webix_agenda_selected{background-color:#f4f5f9}.webix_scheduler_agenda .webix_unit_header{float:left;margin-left:-120px;width:120px !important;background-color:transparent;border-bottom-width:0;line-height:18px;padding:6px 8px;box-sizing:border-box}.webix_scheduler_agenda .webix_unit_header:not(:first-child){border-top:1px solid #edeff0;margin-top:-1px}.webix_scheduler_agenda .webix_unit_header .webix_scheduler_dayofweek{color:#94a1b3;font-weight:normal;font-size:12px}.webix_scheduler_timeline_scale .webix_template{padding:0}.webix_scheduler_timeline_scale_row{display:flex;box-sizing:border-box}.webix_scheduler_timeline_scale_row:not(:last-child){border-bottom:1px solid #dadee0}.webix_scheduler_timeline_scale_cell{display:flex;flex:0 0 auto;justify-content:center;align-items:center;border-right:1px solid #dadee0;box-sizing:border-box;background-color:#f4f5f9}.webix_scheduler_timeline_event{position:absolute;box-sizing:border-box;border-radius:2px;color:#fff;cursor:pointer;border-left:3px solid;transition:box-shadow .15s;overflow:hidden}.webix_scheduler_timeline_event:hover{box-shadow:2px 2px 5px rgba(0,0,0,0.3),1px 1px 2px rgba(0,0,0,0.2)}.webix_scheduler_timeline_content{text-align:center;line-height:30px;position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 12px}.webix_scheduler_timeline_task .webix_scheduler_timeline_content{padding:0 32px}.webix_scheduler_timeline_bars .webix_list_item,.webix_scheduler_timeline_sections .webix_cell{border-color:#dadee0;text-overflow:ellipsis}.webix_scheduler_timeline_bars .webix_list_item{cursor:default}.webix_scheduler_timeline_sections .webix_c_scroll_y div{color:transparent;background-color:transparent}.webix_scheduler_timeline_space{background-color:#f4f5f9}.webix_scheduler_timeline_event.webix_scheduler_multi_more{transition:background-color .3s;background-color:#f4f5f9}.webix_scheduler_timeline_event.webix_scheduler_multi_more .webix_scheduler_timeline_content{text-align:left;color:#475466}.webix_scheduler_timeline_event.webix_scheduler_multi_more:hover{background-color:#e7e9f2;box-shadow:none}.webix_scheduler_timeline_event.webix_scheduler_event_break_left{border-left-width:0;border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.webix_scheduler_timeline_event.webix_scheduler_event_break_left:hover{box-shadow:6px 6px 5px -4px rgba(0,0,0,0.2),5px 5px 2px -4px rgba(0,0,0,0.2)}.webix_scheduler_timeline_event.webix_scheduler_event_break_right:hover{box-shadow:-1px 5px 5px -3px rgba(0,0,0,0.3),-2px 4px 2px -3px rgba(0,0,0,0.2)}.webix_scheduler_copy.webix_scheduler_day_event.webix_scheduler_event_selected,.webix_scheduler_copy.webix_scheduler_day_event,.webix_scheduler_copy.webix_scheduler_month_event.webix_scheduler_event_selected,.webix_scheduler_copy.webix_scheduler_month_event,.webix_scheduler_copy.webix_scheduler_multiday_event,.webix_scheduler_copy.webix_scheduler_timeline_event.webix_scheduler_event_selected,.webix_scheduler_copy.webix_scheduler_timeline_event{box-shadow:2px 2px 5px #1ca1c1,1px 1px 2px #1ca1c1}.webix_scheduler_copy.webix_scheduler_multiday_event.webix_scheduler_event_break_right,.webix_scheduler_copy.webix_scheduler_month_event.webix_scheduler_event_break_right,.webix_scheduler_copy.webix_scheduler_timeline_event.webix_scheduler_event_break_right{box-shadow:3px 9px 5px -7px #1ca1c1,-6px 9px 3px -7px #1ca1c1}.webix_scheduler_copy.webix_scheduler_multiday_event.webix_scheduler_event_break_left,.webix_scheduler_copy.webix_scheduler_month_event.webix_scheduler_event_break_left,.webix_scheduler_copy.webix_scheduler_timeline_event.webix_scheduler_event_break_left{box-shadow:3px 9px 5px -7px #1ca1c1,2px 8px 2px -7px #1ca1c1}.webix_scheduler_copy .webix_scheduler_multiday_event.webix_scheduler_event_break_right{box-shadow:3px 9px 5px -7px #1ca1c1,-6px 9px 3px -7px #1ca1c1}.webix_scheduler_copy .webix_scheduler_multiday_event.webix_scheduler_event_break_left{box-shadow:3px 9px 5px -7px #1ca1c1,2px 8px 2px -7px #1ca1c1}.webix_scheduler_cut{opacity:.5}.webix_scheduler_month_event_single.webix_scheduler_event_selected.webix_scheduler_copy,.webix_scheduler_month_event_single.webix_scheduler_copy{background-color:rgba(28,161,193,0.2)}.webix_scheduler_paste_target{box-shadow:inset 0 2px 0 0 #1ca1c1,inset 0 -2px 0 0 #1ca1c1}.webix_scheduler_clipboard_target.webix_scheduler_calendar .webix_cal_day,.webix_scheduler_clipboard_target.webix_scheduler_timeline_bars .webix_list_item,.webix_scheduler_clipboard_target.webix_scheduler_day_events .webix_list_item,.webix_scheduler_clipboard_target.webix_scheduler_multilist{cursor:pointer}.webix_scheduler .webix_progress_top{z-index:10000}.webix_scheduler_action_popup .webix_win_head{border-bottom-color:transparent}.webix_scheduler_sidemenu{z-index:1 !important}.webix_toolbar.webix_scheduler_toolbar .webix_view,.webix_toolbar.webix_scheduler_toolbar .webix_control.webix_el_tabbar{background-color:transparent}.webix_toolbar.webix_scheduler_toolbar .webix_item_tab{background:transparent;color:#fff}.webix_toolbar.webix_scheduler_toolbar .webix_item_tab:hover{background-color:rgba(0,0,0,0.2)}.webix_toolbar.webix_scheduler_toolbar .webix_item_tab.webix_selected,.webix_toolbar.webix_scheduler_toolbar .webix_item_tab.webix_selected:focus{color:#fff;box-shadow:inset 0 -2px #fff}.webix_scheduler_cal_title{width:calc(100% - 24px - 31px - 4px)}.webix_scheduler_danger .webix_button{color:#ff5c4c;background-color:#fff1ef}.webix_scheduler_danger .webix_button:hover,.webix_scheduler_danger .webix_button:focus{background-color:#ffe7e5}.webix_scheduler_danger .webix_button:active{background-color:#ffdedb}.webix_scheduler_checkbox_allday .webix_custom_checkbox::before{margin-left:-2px}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".webix_view {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n -webkit-font-smoothing: antialiased;\\n cursor: default;\\n overflow: hidden;\\n border: 0px solid #DADEE0;\\n background-color: #FFFFFF;\\n white-space: normal;\\n -webkit-appearance: none;\\n}\\n.webix_view.webix_form {\\n background-color: #FFFFFF;\\n}\\nbody {\\n -webkit-tap-highlight-color: transparent !important;\\n}\\n/*\\n\\twebix_layout_{type}\\n\\tknown types are: line, clean, wide, space;\\n*/\\n.webix_abslayout {\\n position: relative;\\n}\\n.webix_abslayout > .webix_view {\\n position: absolute !important;\\n z-index: 0;\\n}\\n.webix_layout_space {\\n background-color: #EBEDF0;\\n}\\n.webix_layout_wide {\\n background-color: #EBEDF0;\\n}\\n.webix_layout_line,\\n.webix_multiview,\\n.webix_layout_clean,\\n.webix_layout_accordion {\\n background: transparent;\\n}\\n.webix_overlay {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n z-index: 90;\\n text-align: center;\\n padding-top: 10px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_view > .webix_disabled {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n left: 0;\\n background-color: #ddd;\\n opacity: 0.4;\\n z-index: 92;\\n cursor: not-allowed;\\n}\\n.webix_disabled_view {\\n overflow: hidden !important;\\n position: relative;\\n}\\nbody.webix_full_screen {\\n margin: 0;\\n padding: 0;\\n overflow: hidden;\\n}\\nbody.webix_noselect {\\n overscroll-behavior: none;\\n}\\n.webix_noselect,\\n.webix_noselect div {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_selectable {\\n -moz-user-select: text;\\n -webkit-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n.webix_template {\\n height: 100%;\\n padding: 4px 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_clean {\\n background: transparent;\\n}\\n.webix_clean .webix_template {\\n padding: 0px;\\n}\\n.webix_section {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background-color: transparent;\\n position: relative;\\n color: #444;\\n font-size: 10px;\\n text-transform: uppercase;\\n line-height: 44px;\\n}\\n.webix_section:before {\\n content: '';\\n display: block;\\n width: 100%;\\n height: 1px;\\n background-color: #DADEE0;\\n position: absolute;\\n top: 50%;\\n}\\n.webix_section > .webix_template {\\n padding: 0px 8px;\\n margin-left: 30px;\\n background-color: #FFFFFF;\\n display: inline;\\n position: relative;\\n}\\n.webix_layout_space > .webix_section > .webix_template {\\n padding: 0px 8px;\\n background-color: #EBEDF0;\\n}\\n.webix_layout_wide > .webix_section > .webix_template {\\n padding: 0px 8px;\\n background-color: #EBEDF0;\\n}\\n.webix_layout_line > .webix_section > .webix_template,\\n.webix_layout_clean > .webix_section > .webix_template {\\n padding: 0px 8px;\\n background-color: #FFFFFF;\\n}\\n.webix_header {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n line-height: 42px;\\n}\\n.webix_header .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_header.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_header.webix_dark .webix_el_button,\\n.webix_header.webix_dark .webix_el_label .webix_el_box,\\n.webix_header.webix_dark .webix_inp_label,\\n.webix_header.webix_dark .webix_inp_top_label,\\n.webix_header.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_secondary .webix_icon,\\n.webix_header.webix_dark .webix_transparent .webix_icon,\\n.webix_header.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_header.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_header.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_header.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_transparent button:hover,\\n.webix_header.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_header.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_header.webix_dark .webix_secondary button,\\n.webix_header.webix_dark .webix_inp_counter_next,\\n.webix_header.webix_dark .webix_inp_counter_prev,\\n.webix_header.webix_dark .webix_segment_0,\\n.webix_header.webix_dark .webix_segment_1,\\n.webix_header.webix_dark .webix_segment_N,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_header.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_header.webix_dark .webix_secondary button:hover,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_header.webix_dark .webix_inp_counter_next:hover,\\n.webix_header.webix_dark .webix_inp_counter_prev:hover,\\n.webix_header.webix_dark .webix_segment_0:hover,\\n.webix_header.webix_dark .webix_segment_1:hover,\\n.webix_header.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_header.webix_dark .webix_secondary button:focus,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_header.webix_dark .webix_inp_counter_next:focus,\\n.webix_header.webix_dark .webix_inp_counter_prev:focus,\\n.webix_header.webix_dark .webix_segment_0:focus,\\n.webix_header.webix_dark .webix_segment_1:focus,\\n.webix_header.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_secondary button:active,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_header.webix_dark .webix_inp_counter_next:active,\\n.webix_header.webix_dark .webix_inp_counter_prev:active,\\n.webix_header.webix_dark .webix_segment_0:active,\\n.webix_header.webix_dark .webix_segment_1:active,\\n.webix_header.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_inp_static,\\n.webix_header.webix_dark input[type=text],\\n.webix_header.webix_dark input[type=combo],\\n.webix_header.webix_dark input[type=datepicker],\\n.webix_header.webix_dark textarea,\\n.webix_header.webix_dark select,\\n.webix_header.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_header.webix_dark .webix_el_texthighlight input,\\n.webix_header.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_header.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_header.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_multicombo_value,\\n.webix_header.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_header.webix_dark .webix_inp_static:focus,\\n.webix_header.webix_dark input[type=text]:focus,\\n.webix_header.webix_dark input[type=combo]:focus,\\n.webix_header.webix_dark input[type=datepicker]:focus,\\n.webix_header.webix_dark textarea:focus,\\n.webix_header.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_header.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_header.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_header.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0,\\n.webix_header.webix_dark .webix_selected.webix_segment_1,\\n.webix_header.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_header.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_header.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_header.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_header.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_header.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_header.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_header.webix_dark .webix_el_icon,\\n.webix_header.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_header.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_header.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_header.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_header.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_header.webix_dark .webix_custom_checkbox,\\n.webix_header.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_custom_checkbox:focus,\\n.webix_header.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_header.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_header.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_header.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_invalid .webix_el_box input,\\n.webix_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_header.webix_dark .webix_invalid .webix_el_box select,\\n.webix_header.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_header.webix_dark input.webix_invalid,\\n.webix_header.webix_dark select.webix_invalid,\\n.webix_header.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_header.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_header.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_header.webix_dark {\\n color: #FFFFFF;\\n}\\n.webix_header > div {\\n line-height: 44px;\\n padding-left: 10px;\\n padding-top: 0;\\n padding-bottom: 0;\\n}\\n.webix_spacer {\\n background: transparent;\\n}\\n.webix_view_animate {\\n position: relative;\\n width: 100%;\\n height: 100%;\\n}\\nx\\\\:ui {\\n display: none;\\n}\\n.webix_view.webix_flexlayout {\\n display: flex !important;\\n flex-wrap: wrap;\\n flex-direction: row;\\n overflow: hidden;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_flexlayout > div {\\n display: block !important;\\n}\\n.webix_view_align {\\n background: transparent;\\n}\\n.webix_view div,\\n.webix_view span,\\n.webix_view a.webix_list_item,\\n.webix_view.webix_window {\\n outline: none;\\n}\\ntextarea,\\ninput,\\nselect,\\nbutton,\\n.webix_view div.webix_inp_static:focus {\\n outline: none;\\n}\\n.webix_resize_area {\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n width: 100%;\\n height: 100%;\\n}\\n.webix_resize_handle_x .webix_handle_content,\\n.webix_resize_handle_y .webix_handle_content {\\n width: 100%;\\n height: 100%;\\n background: rgba(100, 100, 100, 0.1);\\n border: 1px dotted #ebebeb;\\n}\\n.webix_resize_handle_x {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n cursor: ew-resize;\\n width: 1px;\\n height: 100%;\\n position: absolute;\\n z-index: 2;\\n top: 0px;\\n}\\n.webix_resize_handle_x .webix_handle_content {\\n border-width: 0px 1px;\\n}\\n.webix_resize_origin_x {\\n cursor: ew-resize;\\n width: 3px;\\n height: 100%;\\n position: absolute;\\n z-index: 2;\\n top: 0px;\\n}\\n.webix_resize_handle_y {\\n cursor: ns-resize;\\n height: 1px;\\n width: 100%;\\n position: absolute;\\n z-index: 2;\\n left: 0px;\\n}\\n.webix_resize_handle_y .webix_handle_content {\\n border-width: 1px 0px;\\n}\\n.webix_resize_origin_y {\\n cursor: ns-resize;\\n height: 3px;\\n width: 100%;\\n position: absolute;\\n z-index: 2;\\n left: 0px;\\n}\\n.webix_resizer {\\n position: relative;\\n}\\n.webix_resizer.webix_disabled_view {\\n cursor: default;\\n}\\n.webix_resizer_vy {\\n cursor: ns-resize;\\n margin-top: 0px !important;\\n border: 0px !important;\\n padding: 0px !important;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAADAQMAAABCowZuAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA9JREFUCB1jXMUABoxAGgAJaAFXPIkJqAAAAABJRU5ErkJggg==\\\") no-repeat center center;\\n}\\n.webix_resizer_vx {\\n cursor: ew-resize;\\n margin-left: 0px !important;\\n border: 0px !important;\\n padding: 0px !important;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAXAQMAAAD0oWdxAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA5JREFUeF5jWMDAQDwGAKyuB4FpGQdzAAAAAElFTkSuQmCC\\\") no-repeat center center;\\n}\\n.webix_resizer_y {\\n cursor: ns-resize;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAADAQMAAABCowZuAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA9JREFUCB1jXMUABoxAGgAJaAFXPIkJqAAAAABJRU5ErkJggg==\\\") no-repeat center center;\\n background-color: #ffffff;\\n}\\n.webix_resizer_x {\\n cursor: ew-resize;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAXAQMAAAD0oWdxAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA5JREFUeF5jWMDAQDwGAKyuB4FpGQdzAAAAAElFTkSuQmCC\\\") no-repeat center center;\\n background-color: #ffffff;\\n}\\n.webix_accordionitem_body {\\n position: relative;\\n}\\n.webix_accordionitem_body > div {\\n border-width: 0px!important;\\n}\\n.webix_accordionitem_header {\\n border-bottom: 1px solid #DADEE0;\\n position: relative;\\n z-index: 2;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n line-height: 42px;\\n cursor: pointer;\\n overflow: hidden;\\n}\\n.webix_accordionitem_header.webix_dark {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_accordionitem_header.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_button,\\n.webix_accordionitem_header.webix_dark .webix_el_label .webix_el_box,\\n.webix_accordionitem_header.webix_dark .webix_inp_label,\\n.webix_accordionitem_header.webix_dark .webix_inp_top_label,\\n.webix_accordionitem_header.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_transparent .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_accordionitem_header.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_accordionitem_header.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_accordionitem_header.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_transparent button:hover,\\n.webix_accordionitem_header.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_accordionitem_header.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev,\\n.webix_accordionitem_header.webix_dark .webix_segment_0,\\n.webix_accordionitem_header.webix_dark .webix_segment_1,\\n.webix_accordionitem_header.webix_dark .webix_segment_N,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button:hover,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next:hover,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev:hover,\\n.webix_accordionitem_header.webix_dark .webix_segment_0:hover,\\n.webix_accordionitem_header.webix_dark .webix_segment_1:hover,\\n.webix_accordionitem_header.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button:focus,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next:focus,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev:focus,\\n.webix_accordionitem_header.webix_dark .webix_segment_0:focus,\\n.webix_accordionitem_header.webix_dark .webix_segment_1:focus,\\n.webix_accordionitem_header.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button:active,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next:active,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev:active,\\n.webix_accordionitem_header.webix_dark .webix_segment_0:active,\\n.webix_accordionitem_header.webix_dark .webix_segment_1:active,\\n.webix_accordionitem_header.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_inp_static,\\n.webix_accordionitem_header.webix_dark input[type=text],\\n.webix_accordionitem_header.webix_dark input[type=combo],\\n.webix_accordionitem_header.webix_dark input[type=datepicker],\\n.webix_accordionitem_header.webix_dark textarea,\\n.webix_accordionitem_header.webix_dark select,\\n.webix_accordionitem_header.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_texthighlight input,\\n.webix_accordionitem_header.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_accordionitem_header.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_multicombo_value,\\n.webix_accordionitem_header.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_accordionitem_header.webix_dark .webix_inp_static:focus,\\n.webix_accordionitem_header.webix_dark input[type=text]:focus,\\n.webix_accordionitem_header.webix_dark input[type=combo]:focus,\\n.webix_accordionitem_header.webix_dark input[type=datepicker]:focus,\\n.webix_accordionitem_header.webix_dark textarea:focus,\\n.webix_accordionitem_header.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_icon,\\n.webix_accordionitem_header.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_accordionitem_header.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_accordionitem_header.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_accordionitem_header.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_accordionitem_header.webix_dark .webix_custom_checkbox,\\n.webix_accordionitem_header.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_custom_checkbox:focus,\\n.webix_accordionitem_header.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_accordionitem_header.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_accordionitem_header.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_accordionitem_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_accordionitem_header.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box input,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box select,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_accordionitem_header.webix_dark input.webix_invalid,\\n.webix_accordionitem_header.webix_dark select.webix_invalid,\\n.webix_accordionitem_header.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_accordionitem_label {\\n height: 100%;\\n padding-left: 10px;\\n}\\n.webix_accordionitem_button {\\n float: right;\\n position: relative;\\n height: 11px;\\n width: 11px;\\n margin: 14.5px 13px;\\n}\\n.webix_carousel {\\n position: relative;\\n}\\n.webix_nav_panel {\\n bottom: 16px;\\n height: 14px;\\n line-height: 14px;\\n overflow: hidden;\\n position: absolute;\\n text-align: center;\\n padding: 2px 0;\\n}\\n.webix_nav_item {\\n display: inline-block;\\n height: 10px;\\n margin: 0 2px;\\n width: 10px;\\n cursor: pointer;\\n border-radius: 50%;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n}\\n.webix_nav_inactive {\\n border: 2px solid rgba(0, 0, 0, 0.15);\\n opacity: 0.6;\\n background: #fff;\\n}\\n.webix_nav_active {\\n border: 2px solid rgba(0, 0, 0, 0.1);\\n background: #fff;\\n}\\n.webix_nav_active:hover,\\n.webix_nav_active:focus {\\n box-shadow: 0 0 2px #fff;\\n}\\n.webix_nav_button_prev,\\n.webix_nav_button_next {\\n cursor: pointer;\\n display: block;\\n height: 32px;\\n line-height: 32px;\\n position: absolute;\\n width: 32px;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_nav_button_next .webix_nav_button_inner {\\n height: 100%;\\n width: 100%;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowNDNEOTBEMTYyNzQxMUUzOEU1N0MyQTEyMzIxMDVFQSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowNDNEOTBEMjYyNzQxMUUzOEU1N0MyQTEyMzIxMDVFQSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA0M0Q5MENGNjI3NDExRTM4RTU3QzJBMTIzMjEwNUVBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA0M0Q5MEQwNjI3NDExRTM4RTU3QzJBMTIzMjEwNUVBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+yGPRLgAAAPBJREFUeNpi+P//vycQP/tPfQAy05MRxGBgYJBkoA14DrLgPwMNARMDjcGgteAINN5CCaokI3UcB2I+UNQBsTghxaRacAaI+aH62IB4MzUtuAjEwlA9zEC8hhhNxFpwFYhFkQxfTqyriLHgFhBLQtWC8s18UsKUkAV3gVgGyfBZpKYIQhbYQtWAcBg5BRIhC26j+WAOtS0AgRvQ9A6L4IXUtgAELqOlopXUtgAEzgOxIFQPKxCvo7YFIHAKLSdvo7YFIHAUiHmgeiUIKSanNLUC4i1ALAHENoQUD48a7TkNzX8BsiAFxKCB4U+BOBkgwAAsAiGcWMs58QAAAABJRU5ErkJggg==\\\");\\n}\\n.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEODJBRDc2RTYyNzMxMUUzQTMxN0IxNjAwN0JBOUE4OSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEODJBRDc2RjYyNzMxMUUzQTMxN0IxNjAwN0JBOUE4OSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ4MkFENzZDNjI3MzExRTNBMzE3QjE2MDA3QkE5QTg5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ4MkFENzZENjI3MzExRTNBMzE3QjE2MDA3QkE5QTg5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+crpRPgAAAOhJREFUeNpi+P//vycQP/tPfQAy05MRxGBgYJBkoA14DrLgPwMNARMDjcGgsCAMGkdHyLKBiNQgDoomIOYH4uOkJiViLNgMxGxIlpyhtgUgsAaImaHqhYH4IrUtAIHlSJaIAvFValsAAvOBmBGqTxKIb1HbAhCYhWSJDBDfobYFIBAO1QvCNtS2YA6SD6SB+DY1LViIFNFiQHydmnGwEi0VXaZmKloHxKxQ9YJAfJ6a+WAbWk4+Re2cLAFVxwPER0lNEcSUpjZALAHEW4DYitTCdHjUaM9paP4LkAUpIAYNDH8KxMkAAQYAlwMhmq8XxigAAAAASUVORK5CYII=\\\");\\n}\\n.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_panel_corner {\\n right: 80px;\\n}\\n.webix_nav_button_corner.webix_nav_button_prev {\\n bottom: 9px;\\n right: 44px;\\n}\\n.webix_nav_button_corner.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_corner.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_button_corner.webix_nav_button_next {\\n bottom: 9px;\\n right: 8px;\\n}\\n.webix_nav_button_corner.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_corner.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_panel_side {\\n margin: 0 auto;\\n left: 0;\\n width: 100%;\\n}\\n.webix_nav_button_side {\\n height: 86px;\\n line-height: 86px;\\n width: 56px;\\n top: 50%;\\n margin-top: -43px;\\n}\\n.webix_nav_button_side.webix_nav_button_next {\\n left: auto;\\n right: 16px;\\n}\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTc4MTkxODY2MzBGMTFFMzk1MUQ4RTNCRjNCMUVFRUMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTc4MTkxODU2MzBGMTFFMzk1MUQ4RTNCRjNCMUVFRUMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4NjlGM0NFNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA4NjlGM0NGNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+D/KEcQAAAOhJREFUeNqs1jsOwjAMBuCKhR2uxsLGxg1a+hD0wVGYGJC4DgssnAFVQjLukKWk/WM7lv4OqfQ1UdLWCRGtOTdOz3lwtpzEkuFyp/9KreiX/JVa0DdNV6ZF9zRfmQYdcgbwQYNGhccDXQzYN4jgXIOa4bkntgAuNKgaDtlNMRx69hoAlxpUBEvfawRXGnRIjeBFIq8e3F9KZ5mDWXbS5QeBEjQYDEULALbSwy8GEYrARvpBUYNTaGkBfagZHKMIrKU/vioW6NANAE+aZuIVE3RoHxN06NUDHq2t5Ipz4Xw4T87O2vT+BBgAeQQKvezNqP0AAAAASUVORK5CYII=\\\");\\n}\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_button_side.webix_nav_button_prev {\\n left: 16px;\\n right: auto;\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjIzRTVCQkY2MzBGMTFFM0FDNTBDNzdDRkQ0NTI0NzciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjIzRTVCQkU2MzBGMTFFM0FDNTBDNzdDRkQ0NTI0NzciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4NjlGM0NFNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA4NjlGM0NGNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+wRT1eAAAAM9JREFUeNqs1jsKwlAQBdDBxlL3ZmVlmRXYaaVbCYg7kti4BQu1e85AhBDfZz73wm1ewsmfDKWUKNgNd+C+uVfuOgoe0n8uaFDyQoOSOxqU7NDgUfaDgxZUDWpRE6hBzWALdYE11A2W0BCYQ8PgHIWAUxQG/lAoKF0Q0ZLq+ZA1o35qnO3eevlweL4AgXOL5yhc2hCCa0d0w63744I1T9MMa989E2z5/NSw9Retgj3DRAveeseeGnyLDGgl+BkdJXNwH0WlHfcxDr09d/UVYADVjwptZ8mPvQAAAABJRU5ErkJggg==\\\");\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_carousel > .webix_scroll_x,\\n.webix_carousel > .webix_scroll_y {\\n background-color: rgba(0, 0, 0, 0);\\n}\\n.webix_dark .webix_nav_inactive {\\n background-color: #95a5a6;\\n}\\n.webix_dark .webix_nav_active {\\n background-color: #7f8c8d;\\n}\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSIURgotfwAAASxJREFUSMfNlbErhlEUh5/vJZOSQSijshgsFiklhdj0lcHw5SP7uX+A8we4d1c+g2RgsIjIxmCxGCzKRO9bMjCSWE5WpXPrO9MZbs9T5577u7XNrTgPtIBBfKsEmkUmOMZsFZngv5KCzNW2gmsbbT2H4AZY0CAVcOUtuAXmNMi7xtQF7HgK7oBZDfKmMXUAB8Cil+AemNEgrwbfB5a8LvnB4C8aU83Gsuy1RY/AtAYpDb4NNDzXtKFBnqyvA+ve72BXYxqy/shyy1UwDFxqTP0a5BvYAPa8X/KISfo0yBewChx6R8UocKEx9ZpkBTj2zqIx4Fxj6tEgn7aqZ95RMQ6cakzdGuTDxuUedhPAicY0AEz+dbjzn3E9ZX9ue3w4ZUZ+VQBrQJUB/gw0fwC/UlVpnH2f9AAAAABJRU5ErkJggg==\\\");\\n}\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSENCUzWfAAAAS1JREFUSMfN1TFLXEEUhuFnr8FKCBaGiK2FRQobG7GSgBG2E8IWFmE3wX7uD3B+QOb2QpaAiMWmsAkJBtMEizQ2FmmCXcIuhBRpDZI0g7XCXNhTD+8L53znTGf/ddrGEIvK1hiDqiW4zBxWLcFvJZWWayoEz3Mbz9sSfIl1mKCLr20I3sTUzMY6/MEzXJQWdHEcUzOTJVu4LD3kHRxlyW88xbfSKerldnViHX5lyffSMX2BgywZYxNXpffgVY6uWIcfWVpUMMQIYmqW8Lak4BB7sQ7/Ymoe4QzLpQQj9GMdbmJqFvAZK6WGfILdDJ/HJzwpFdOP6MU6/I2peYhTrJZctH6sw3VMzRw+YK30qdiIqXmM91i/b+Qe3OHNu6n/cMYt8icVXmLSAvwnBv8B+EFU7qlZ1xIAAAAASUVORK5CYII=\\\");\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSI77dsQJgAAARxJREFUSMet1jFqAkEUxvH/rkIqLVN5ES2CjScQG6tUESx3SWOMLKgggt7BC6SxsnIr9w4ewAsEEis3RTBE3N3ZmfemHB4/HsPMm89L0xTJilbrLrAAGsAWeKkKwTEw/bfVAy6ea6cZ4HV9+8ogwMm6UwMI8Owrg5MoDDa+MjgF8LXBUqgtaERdwELUFcxFJWAmKgXvUA3wBtUC/1BNEKBCra4KXjt9MNScbadYJd7t9nGSVIGnnJpOnCRf7VbzYNMpURi8A7OCumW0Wr9aodrw7T39hedS+P5FhcFYCme/fSGcP6UEcPE8dYTNk98BLvdHWcLlf1ML2CVMzIC3gpK+U5YywEdJQMuDP50CmuGMt55C6B0AI+AR+ACGPw26r6m12WOpAAAAAElFTkSuQmCC\\\");\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSE1IU5u4gAAAW1JREFUSMet1rtOwzAUgOG/5jbBwsQD8BAwIAa2TggegjmRgELbuFeo1GRlQEJMMDN264CUiYdgg0dolzIkFUEk9nHSbLGtT76cc+xaMA53gUegDnwCgfa9Vyp8CngCToFNYB940WF0WRWt57SPqsAK+C7oG+kwuiqLdg3992Xgtelk8jGN4w3gqGDMyTSOZ8eHB+8uM0X7XhMYGMbd6TC6dkIzcH8VsMr+aN9rCeCGEyqEhzZY5TWmcM8C3zihKdy2wIMiWJmWURZWtk1P4a4FvnVCUziwwP0srKQBLYSbALXFYuGU1zqMNBAYhrRUiSI0s/RvKcdZNoChcQt8Tz5TKSg/fQdQFqdJcJvAXha0Z1QCDixgW577drCbBxZXKRkYyOtpkm6lwf+VPwH7VcC/d5Qd7EjA39s0KQQ2UIvvfbZ3zoEHU2Rp3+u4vlDGqwSX6N4qwSX6ltMelAUB1oELYA6cAV/poTxXeZ/+AOFqn1e/Gh7yAAAAAElFTkSuQmCC\\\");\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_list_item {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 2px 12px;\\n line-height: 31px;\\n cursor: pointer;\\n border-bottom: 1px solid #EDEFF0;\\n text-align: left;\\n border-color: #EDEFF0;\\n}\\n.webix_list_icon {\\n vertical-align: middle;\\n margin-right: 4px;\\n}\\n.webix_list_item.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_list_item.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_list_item.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_list .webix_list_item.webix_selected {\\n border-bottom: 1px solid #EDEFF0;\\n padding: 2px 12px;\\n}\\n.webix_group {\\n position: relative;\\n}\\n.webix_group_back,\\n.webix_group_back.webix_selected {\\n position: relative;\\n background: #F4F5F9;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_arrow_icon {\\n position: absolute;\\n top: 50%;\\n bottom: 50%;\\n margin-top: -10px;\\n right: 8px;\\n width: 20px;\\n height: 20px;\\n line-height: 20px;\\n color: #475466;\\n font-size: 20px;\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_arrow_icon:before {\\n content: '\\\\F003';\\n}\\n.webix_group_back {\\n padding-left: 33px;\\n}\\n.webix_group_back .webix_arrow_icon {\\n left: 8px;\\n}\\n.webix_group_back .webix_arrow_icon:before {\\n content: '\\\\F002';\\n}\\n.dhx_pagelist {\\n position: relative;\\n}\\n.webix_list_count {\\n float: right;\\n width: 25px;\\n font-size: 14px;\\n text-align: center;\\n margin-right: 45px;\\n box-shadow: 0 1px 0 #000000;\\n text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.6);\\n}\\n.webix_unit_header {\\n padding: 0 12px;\\n line-height: 35px;\\n text-align: left;\\n background-color: #F4F5F9;\\n}\\n.webix_list-x .webix_list_item {\\n display: inline-block;\\n vertical-align: top;\\n border-right: 1px solid #EDEFF0;\\n border-bottom: none;\\n border-color: #EDEFF0;\\n}\\n.webix_list-x .webix_list_item.webix_selected {\\n border-left: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n padding-left: 11px;\\n}\\n.webix_list-x .webix_scroll_cont {\\n display: inline-block;\\n}\\n.webix_view.webix_list-x {\\n white-space: nowrap;\\n}\\n/* Style for disabled items */\\n.webix_list_item.webix_disabled {\\n color: #8b949e;\\n background-color: #FFFFFF;\\n cursor: not-allowed;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_list_item.webix_disabled:focus {\\n background-color: #FFFFFF;\\n}\\n.webix_list_item.webix_disabled .webix_badge {\\n background-color: #eab993;\\n}\\n.webix_list_item.webix_disabled .webix_submenu_icon {\\n visibility: hidden;\\n}\\n/*button of pager*/\\n.webix_view.webix_pager {\\n padding: 3px 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background-color: transparent;\\n}\\n.webix_pager_item,\\n.webix_pager_item_selected {\\n padding: 0 6px;\\n text-align: center;\\n height: 100%;\\n width: auto;\\n min-width: 32px;\\n margin: 0 2px;\\n cursor: pointer;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border-radius: 2px;\\n}\\n.webix_pager_item .webix_icon,\\n.webix_pager_item_selected .webix_icon {\\n line-height: 0;\\n font-size: 17px;\\n}\\n.webix_pager_item {\\n background: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_pager_item:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:active {\\n background-color: #daddeb;\\n}\\n.webix_pager_item:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:active {\\n background-color: #daddeb;\\n}\\n/*selected button of pager*/\\n.webix_pager_item_selected {\\n cursor: default;\\n}\\n.webix_pager_item_selected:hover {\\n background-color: #1992af;\\n}\\n.webix_pager_item_selected:focus {\\n background-color: #1992af;\\n}\\n.webix_pager_item_selected:active {\\n background-color: #17839d;\\n}\\n.webix_animation .webix_ss_header {\\n position: relative;\\n z-index: 1;\\n}\\n.webix_animation .webix_ss_vscroll_header {\\n z-index: 1;\\n}\\n.webix_animation .webix_ss_footer,\\n.webix_animation .webix_vscroll_x {\\n position: absolute;\\n bottom: 0px;\\n z-index: 1;\\n}\\n/*helper for allowing selection*/\\n.webix_allow_selection {\\n -moz-user-select: text;\\n -webkit-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n/*default item in dataview*/\\n.webix_dataview_item {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 2px 12px;\\n line-height: 31px;\\n cursor: pointer;\\n border-bottom: 1px solid #EDEFF0;\\n text-align: left;\\n border-color: #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_dataview_item.webix_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_dataview_item.webix_disabled {\\n color: #94A1B3;\\n}\\n.webix_dataview_item.webix_selected.webix_disabled {\\n box-shadow: inset 2px 0 #94A1B3;\\n}\\n.webix_dataview_item .webix_icon {\\n font-size: 20px;\\n}\\n/*default item in selected state*/\\n.webix_dataview_item.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n border-bottom: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_dataview_item.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_dataview_item.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_dataview_item.tiles {\\n border: 1px solid #EDEFF0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_drag_zone > .webix_dataview_item.tiles {\\n margin: 0 !important;\\n}\\n.webix_dataview .webix_scroll_cont {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n/*chart container*/\\n.webix_chart {\\n position: relative;\\n font-family: Roboto, sans-serif;\\n font-size: 13px;\\n color: #475466;\\n overflow: hidden;\\n z-index: 1;\\n}\\n.webix_chart canvas {\\n position: absolute;\\n}\\n/*labels*/\\n.webix_canvas_text {\\n position: absolute;\\n text-align: center;\\n overflow: hidden;\\n white-space: nowrap;\\n font-size: 12px;\\n z-index: 80;\\n}\\n.webix_chart .webix_canvas_text {\\n border-radius: 4px;\\n}\\n.webix_chart .webix_canvas_text.webix_inner_text_dark {\\n color: #475466;\\n text-shadow: 0 0 4px #ffffff;\\n padding: 0 2px;\\n}\\n.webix_chart .webix_canvas_text.webix_inner_text_light {\\n color: #ffffff;\\n text-shadow: 0 0 4px #475466;\\n padding: 0 2px;\\n}\\n/*map*/\\n.webix_map_img {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n border: 0px;\\n opacity: 0;\\n -webkit-user-select: none;\\n}\\n/*scales*/\\n.webix_axis_item_y {\\n position: absolute;\\n height: 18px;\\n line-height: 18px;\\n margin-top: -4px;\\n text-align: right;\\n}\\n.webix_axis_item_x {\\n padding-top: 2px;\\n}\\n.webix_axis_title_x {\\n text-align: center;\\n font-size: 13px;\\n}\\n.webix_axis_title_y {\\n text-align: center;\\n font-family: Verdana;\\n font-size: 13px;\\n transform: rotate(-90deg);\\n padding-left: 3px;\\n}\\n/*legend block*/\\n.webix_chart_legend {\\n position: absolute;\\n z-index: 81;\\n}\\n.webix_chart_legend_item {\\n height: 18px;\\n line-height: 18px;\\n padding: 2px;\\n cursor: pointer;\\n}\\n.webix_chart_legend_item.hidden {\\n color: #cfd5dd;\\n}\\n.webix_axis_item_y.webix_radar {\\n color: #555;\\n font-size: 11px;\\n padding-right: 3px;\\n height: 13px;\\n line-height: 13px;\\n margin-top: 0px;\\n}\\n.webix_canvas_text.webix_axis_radar_title {\\n margin-top: 0px;\\n padding-top: 0px;\\n color: #74869f;\\n font-size: 12px;\\n}\\n.webix_axis_item_y,\\n.webix_axis_item_x {\\n color: #74869f;\\n}\\n/*data frame*/\\n.webix_chart_frame {\\n background-color: #a0cfef;\\n height: 100%;\\n opacity: 0.3;\\n position: absolute;\\n top: 0;\\n z-index: 82;\\n border-left: 1px solid #3498db;\\n border-right: 1px solid #3498db;\\n cursor: w-resize;\\n}\\n.webix_chart_resizer {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAYAAAAx8TU7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTJCMjdFNENBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTJCMjdFNERBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5MkIyN0U0QUFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5MkIyN0U0QkFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Powz/icAAAAaSURBVHjaYmBgYDBjgAA4zcSABQysIECAAQBn+ACx2PqtbAAAAABJRU5ErkJggg==\\\");\\n background-position: 3px center;\\n background-repeat: no-repeat;\\n border-radius: 2px;\\n height: 20px;\\n bottom: 0;\\n width: 11px;\\n z-index: 83;\\n position: absolute;\\n background-color: #fff;\\n border: 1px solid #cccccc;\\n cursor: w-resize;\\n}\\n.webix_chart_resizer:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_wresize_cursor {\\n cursor: w-resize;\\n}\\n/* donut center text */\\n.webix_donut_center_text {\\n display: inline-block;\\n line-height: normal;\\n white-space: normal;\\n vertical-align: middle;\\n}\\n.webix_dt_editor {\\n position: absolute;\\n z-index: 2;\\n overflow: visible;\\n background: #FFFFFF;\\n}\\n.webix_dt_editor input,\\n.webix_dt_editor select {\\n width: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 0 11px;\\n margin: 0;\\n border: 1px solid #ffd700;\\n height: 100%;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_dt_editor input[type=\\\"checkbox\\\"] {\\n margin: 11px 13px 0px;\\n height: auto;\\n width: auto;\\n}\\n.webix_dt_editor select {\\n padding: 0 7px;\\n}\\n.webix_clipbuffer {\\n width: 2000px;\\n height: 1px;\\n padding: 0;\\n margin: 0;\\n border: 0;\\n left: 0px;\\n top: 0px;\\n white-space: pre-wrap;\\n position: fixed;\\n opacity: 0;\\n pointer-events: none;\\n cursor: default;\\n}\\n.webix_dt_editor.webix_password_editor {\\n overflow: hidden;\\n}\\n.webix_password_editor input {\\n padding-right: 26px;\\n}\\n.webix_password_editor .webix_icon {\\n position: absolute;\\n right: 4px;\\n top: 50%;\\n margin-top: -9px;\\n font-size: 18px;\\n cursor: pointer;\\n color: #94A1B3;\\n}\\n.webix_password_editor .webix_icon:hover {\\n color: #1CA1C1;\\n}\\n.webix_column,\\n.webix_hcolumn {\\n position: absolute;\\n top: 0px;\\n}\\n.webix_cell {\\n overflow: hidden;\\n line-height: 33px;\\n white-space: nowrap;\\n}\\n.webix_hcell {\\n width: 100%;\\n overflow: hidden;\\n}\\n.webix_cell,\\n.webix_hcell {\\n background: inherit;\\n font: inherit;\\n text-align: inherit;\\n color: inherit;\\n}\\n.webix_ss_body {\\n overflow: hidden;\\n position: relative;\\n}\\n.webix_hs_center,\\n.webix_hs_right,\\n.webix_hs_left,\\n.webix_ss_center,\\n.webix_ss_right,\\n.webix_ss_left {\\n overflow: hidden;\\n float: left;\\n position: relative;\\n}\\n.webix_ss_center_scroll {\\n height: 100%;\\n position: relative;\\n overflow: hidden;\\n min-height: 1px;\\n}\\n.webix_ss_hscroll {\\n bottom: 0px;\\n}\\n.webix_ss_vscroll {\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n z-index: 2;\\n}\\n.webix_ss_vscroll_footer {\\n position: absolute;\\n bottom: 0px;\\n right: 0px;\\n border-left: 1px solid #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n z-index: 1;\\n}\\n.webix_ss_vscroll_header {\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n border-left: 1px solid #DADEE0;\\n border-bottom: 1px solid #DADEE0;\\n z-index: 1;\\n}\\n.webix_dtable {\\n position: relative;\\n cursor: default;\\n z-index: 0;\\n}\\n.webix_ss_footer,\\n.webix_ss_header {\\n clear: both;\\n overflow: hidden;\\n}\\n.webix_table_cell,\\n.webix_view.webix_table_cell,\\n.webix_block_selection,\\n.webix_hcell,\\n.webix_cell {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_table_cell {\\n font-size: 14px;\\n}\\n.webix_block_selection {\\n position: absolute;\\n}\\n.webix_ss_sort_asc,\\n.webix_ss_sort_desc {\\n position: absolute;\\n top: 50%;\\n right: 2px;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 20px;\\n width: 24px;\\n height: 24px;\\n line-height: 24px;\\n margin-top: -12px;\\n float: none;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_ss_sort_asc.webix_ss_sort_single,\\n.webix_ss_sort_desc.webix_ss_sort_single {\\n width: 20px;\\n text-align: center;\\n}\\n.webix_ss_sort_asc:before {\\n content: '\\\\F004';\\n}\\n.webix_ss_sort_desc:before {\\n content: '\\\\F001';\\n}\\n.webix_ss_sort_num {\\n position: absolute;\\n top: 0;\\n right: 0;\\n height: 12px;\\n line-height: 12px;\\n font-family: Roboto, sans-serif;\\n font-size: 10px;\\n text-align: right;\\n color: #1CA1C1;\\n}\\n.webix_ss_sort_single .webix_ss_sort_num {\\n display: none;\\n}\\n.webix_hcell .webix_excel_filter {\\n position: absolute;\\n top: 50%;\\n right: 2px;\\n width: 20px;\\n height: 20px;\\n line-height: 20px;\\n margin-top: -10px;\\n vertical-align: middle;\\n text-align: center;\\n cursor: pointer;\\n color: #94A1B3;\\n}\\n.webix_hcell .webix_excel_filter:hover {\\n color: #1CA1C1;\\n}\\n.webix_excel_filter ~ .webix_ss_sort_asc,\\n.webix_excel_filter ~ .webix_ss_sort_desc {\\n right: 24px;\\n}\\n.webix_hcell.webix_ss_excel_filter {\\n position: relative;\\n}\\n.webix_hcell.webix_ss_filter_active .webix_excel_filter {\\n color: #1CA1C1;\\n}\\n.webix_hcell.webix_ss_filter_active .webix_excel_filter:hover {\\n color: #17839d;\\n}\\n.webix_hcell.webix_ss_filter {\\n padding: 3px 5px 3px 5px;\\n}\\n.webix_hcell .webix_tree_close,\\n.webix_hcell .webix_tree_open {\\n margin-right: 5px;\\n}\\n.webix_table_checkbox,\\n.webix_hcell input[type=\\\"checkbox\\\"] {\\n margin: 0px 1px 2px;\\n vertical-align: middle;\\n}\\n.webix_ss_filter select,\\n.webix_ss_filter input {\\n width: 100%;\\n font-size: inherit;\\n color: #475466 !important;\\n height: 38px;\\n margin-top: -2px;\\n padding: 0 3px;\\n vertical-align: top;\\n border: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-family: Roboto, sans-serif;\\n}\\n.webix_richfilter {\\n margin-top: 1px;\\n line-height: 32px;\\n}\\n.webix_ss_filter select {\\n padding: 3px;\\n}\\n/*headers and footers*/\\n.webix_ss_header,\\n.webix_hcolumn,\\n.webix_ss_vscroll_header,\\n.webix_dd_drag_column,\\n.webix_hs_left,\\n.webix_hs_center,\\n.webix_hs_right {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n background: #F4F5F9;\\n}\\n.webix_ss_footer,\\n.webix_ss_footer .webix_hcolumn,\\n.webix_ss_footer .webix_hs_left,\\n.webix_ss_footer .webix_hs_center,\\n.webix_ss_footer .webix_hs_right,\\n.webix_ss_footer div.webix_ss_vscroll_footer {\\n background: #fafafa;\\n}\\n.webix_hcell.webix_measure_size {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n/*content in header and footer*/\\n.webix_hcell {\\n padding: 0px 12px 0px 12px;\\n text-align: left;\\n}\\n/*borders in header and footer*/\\n.webix_ss_header .webix_hcolumn .webix_hcell,\\n.webix_ss_header .webix_span {\\n border-right: 1px solid #DADEE0;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_ss_footer .webix_hcolumn .webix_hcell,\\n.webix_ss_footer .webix_span {\\n border-right: 1px solid #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n}\\n/*remove rightmost borders*/\\n.webix_hs_right .webix_hcell.webix_last,\\n.webix_hs_center .webix_hcell.webix_last {\\n border-right-width: 0px;\\n}\\n/*right inner border*/\\n.webix_column.webix_last > div {\\n border-right-width: 0px;\\n}\\n/*borders between split areas*/\\n.webix_ss_right .webix_column.webix_first > div,\\n.webix_hs_right .webix_first {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_ss_left .webix_column.webix_last > div {\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_last_topcell.webix_cell {\\n border-bottom: 1px solid #DADEE0;\\n}\\n/*normal data cell of the table*/\\n.webix_column > div,\\n.webix_table_cell {\\n border-right: 1px solid #EDEFF0;\\n padding: 0 12px;\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_column,\\n.webix_hcolumn {\\n text-align: left;\\n}\\n/*header selection in column mode, column dnd*/\\n.webix_ss_header .webix_sel_hcell,\\n.webix_ss_footer .webix_sel_hcell,\\n.webix_ss_header .webix_dd_over_column {\\n background-color: #c9eaf5;\\n}\\n.webix_block_selection {\\n z-index: 2;\\n background: rgba(0, 0, 0, 0.1);\\n border: 2px solid #EDEFF0;\\n}\\n.webix_dd_drag {\\n white-space: nowrap;\\n overflow: hidden;\\n border-left: 1px solid #EDEFF0;\\n height: 36px;\\n}\\n.webix_dd_drag > div {\\n display: inline-block;\\n vertical-align: top;\\n background: #FFFFFF;\\n border-top: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n border-bottom: 1px solid #EDEFF0;\\n padding: 5px 12px;\\n height: 36px;\\n line-height: 28px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_dd_drag_column {\\n padding: 5px 10px 5px 10px;\\n}\\n.webix_column > .webix_drag_over.webix_cell {\\n background-color: #e6e6e6;\\n color: #475466;\\n}\\n.webix_column > .webix_drag_over.webix_cell.webix_row_select,\\n.webix_column > .webix_drag_over.webix_cell.webix_cell_select {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_column > .webix_drag_over.webix_cell.webix_row_select:focus,\\n.webix_column > .webix_drag_over.webix_cell.webix_cell_select:focus {\\n background: #edeff5;\\n}\\n.webix_cell.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_invalid_cell {\\n position: relative;\\n}\\n.webix_invalid_cell:after {\\n content: \\\"\\\";\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n width: 0px;\\n height: 1px;\\n border-top: 8px solid #f44;\\n border-left: 8px solid transparent;\\n}\\n/*selection*/\\n.webix_column > div.webix_cell_select,\\n.webix_column > div.webix_column_select,\\n.webix_column > div.webix_row_select {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_column > div.webix_cell_select:focus,\\n.webix_column > div.webix_column_select:focus,\\n.webix_column > div.webix_row_select:focus {\\n background: #edeff5;\\n}\\n/*extra borders, for selection in cell mode*/\\n.webix_column > div.webix_cell_select {\\n border-bottom: 1px solid #EDEFF0;\\n border-left: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n padding-top: 0px;\\n padding-left: 11px;\\n}\\n.webix_ss_right .webix_column.webix_first > div.webix_cell_select {\\n padding-left: 12px;\\n}\\n/*extra borders, for selection in row mode*/\\n.webix_column > div.webix_row_select {\\n border-bottom: 1px solid #EDEFF0;\\n padding-top: 0px;\\n}\\n/*extra borders for selection in column mode*/\\n.webix_column > div.webix_column_select {\\n border-left: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n padding-left: 11px;\\n}\\n.webix_cell.webix_dtable_colrow,\\n.webix_cell.webix_dtable_subrow,\\n.webix_dtable_subview {\\n position: absolute;\\n left: 0px;\\n top: 0px;\\n background-color: #FFFFFF;\\n width: 100%;\\n padding-right: 30px;\\n padding-left: 12px;\\n padding-top: 1px;\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_cell.webix_dtable_colrow.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_cell.webix_dtable_colrow.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_dtable_subrow {\\n border-top: 1px solid #EDEFF0;\\n text-align: right;\\n}\\n.webix_dtable_subview {\\n background: #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n padding: 0px 0px 0px 0px;\\n padding-left: 10px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.number .webix_cell {\\n text-align: right;\\n}\\n.webix_rotate {\\n transform: rotate(-90deg);\\n line-height: normal;\\n}\\n.webix_measure_rotate {\\n line-height: normal;\\n white-space: normal;\\n padding: 10px;\\n}\\n.webix_span_layer,\\n.webix_span_layer_top {\\n background: transparent;\\n position: absolute;\\n left: 0px;\\n top: 0px;\\n height: 0px;\\n width: 0px;\\n overflow: visible;\\n}\\n.webix_span_layer_top {\\n z-index: 1;\\n}\\n.webix_ss_right .webix_span_layer,\\n.webix_ss_right .webix_span_layer_top {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_dtable_span {\\n position: absolute;\\n background: #FFFFFF;\\n text-align: left;\\n}\\n.webix_dtable_span.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_dtable_span.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_hcell .webix_input_icon {\\n background-color: #DADEE0;\\n}\\n.webix_area_selection_layer {\\n position: absolute;\\n z-index: 2;\\n}\\n.webix_area_selection {\\n position: absolute;\\n background: #475466;\\n}\\n.webix_dtable_focused .webix_area_selection {\\n background-color: #3f4a5a;\\n}\\n.webix_area_selection_top,\\n.webix_area_selection_bottom {\\n height: 2px;\\n}\\n.webix_area_selection_left,\\n.webix_area_selection_right {\\n width: 2px;\\n}\\n.webix_area_selection_handle {\\n position: absolute;\\n width: 6px;\\n height: 6px;\\n border: 1px solid #fff;\\n background: #475466;\\n cursor: crosshair;\\n margin: -6px 0 0 -6px;\\n}\\n.webix_topcell {\\n position: relative;\\n background: #FFFFFF;\\n z-index: 1;\\n}\\n.webix_dtable .webix_resize_handle_x .webix_handle_content,\\n.webix_dtable .webix_resize_handle_y .webix_handle_content {\\n border: none;\\n background-color: #1CA1C1;\\n}\\n.webix_dtable_focused .webix_column > div.webix_row_select,\\n.webix_dtable_focused .webix_column > div.webix_column_select {\\n background: #edeff5;\\n}\\n.webix_window {\\n position: absolute;\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_window:focus {\\n box-shadow: 0 1px 14px 0 rgba(0, 0, 0, 0.12), 0 4px 10px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_win_body {\\n overflow: hidden;\\n}\\n.webix_window,\\n.webix_win_content,\\n.webix_win_body,\\n.webix_win_body > .webix_view {\\n border-radius: 0px;\\n}\\n.webix_win_body > .webix_view .webix_cal_month {\\n border-radius: 0px;\\n}\\n.webix_win_head {\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_win_title {\\n text-align: center;\\n}\\n/*----------------------------*/\\n/* DO NOT CHANGE STYLES BELOW */\\n/*----------------------------*/\\n.webix_win_content {\\n height: auto;\\n width: auto;\\n overflow: hidden;\\n}\\n.webix_modal {\\n width: 100%;\\n height: 100%;\\n position: fixed;\\n top: 0;\\n left: 0;\\n background-color: black;\\n opacity: 0.2;\\n}\\n.webix_modalbox_inside {\\n pointer-events: none;\\n}\\n.webix_point_top,\\n.webix_point_right,\\n.webix_point_bottom,\\n.webix_point_left {\\n position: absolute;\\n}\\n.webix_point_top,\\n.webix_point_bottom {\\n width: 13px;\\n height: 7px;\\n}\\n.webix_point_left,\\n.webix_point_right {\\n width: 7px;\\n height: 13px;\\n}\\n.webix_point_top,\\n.webix_point_bottom,\\n.webix_point_right,\\n.webix_point_left {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAArCAIAAADHSy4DAAAABnRSTlMAAAAAAABupgeRAAAACXBIWXMAAABPAAAATwFjiv3XAAAAhElEQVR4nMXVQQoAIQhAUe9/FC/pLAYayUm/EeT6YWGmoqpWharKG7n+XK5nt9L/LurMeV27oZHrReN0M6Oupr5S1GU0vhN1J7L27hp1QYXX1WtE5UxnNXI0ep7+pEGRpr95ooWObbXUm1npXWkFaF3vTqj9c+h8pVOb7gK6Yeje4tvwARi4FgcAh2V/AAAAAElFTkSuQmCC\\\");\\n}\\n.webix_point_top {\\n background-position: 0 -36px;\\n}\\n.webix_point_bottom {\\n background-position: 0 0;\\n}\\n.webix_point_right {\\n background-position: 0 -22px;\\n}\\n.webix_point_left {\\n background-position: 0 -9px;\\n}\\n.webix_resize_handle {\\n position: absolute;\\n z-index: 2;\\n width: 15px;\\n height: 15px;\\n bottom: 0px;\\n line-height: 15px;\\n right: -1px;\\n text-align: center;\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);\\n cursor: nw-resize;\\n}\\n.webix_resize_frame {\\n position: absolute;\\n opacity: 0.1;\\n background: #1CA1C1;\\n display: block;\\n border: 1px solid #0f5768;\\n box-shadow: 1px 3px 6px #000;\\n}\\n.webix_resize_cursor {\\n cursor: nw-resize;\\n}\\n.webix_shadow_medium,\\n.webix_shadow_small,\\n.webix_shadow_big {\\n position: relative;\\n}\\n.webix_shadow_medium {\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_shadow_small {\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_shadow_big {\\n box-shadow: 0 1px 14px 0 rgba(0, 0, 0, 0.12), 0 4px 10px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_shadow_none {\\n box-shadow: none !important;\\n}\\n.webix_toolbar.webix_shadow_small,\\n.webix_toolbar.webix_shadow_medium,\\n.webix_toolbar.webix_shadow_big {\\n z-index: 1;\\n}\\n/*basis*/\\n.webix_tree .webix_scroll_cont > .webix_tree_leaves {\\n display: inline-block;\\n padding: 8px;\\n}\\n.webix_tree_item {\\n clear: both;\\n height: 24px;\\n line-height: 24px;\\n white-space: nowrap;\\n}\\n.webix_tree_item.webix_selected {\\n background: transparent;\\n}\\n.webix_tree_item.webix_selected span {\\n padding: 4px 10px 4px 4px;\\n margin-left: -4px;\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_tree_item.webix_selected span:focus {\\n background: #edeff5;\\n}\\n.webix_tree_item.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_tree_checkbox {\\n margin: 0px;\\n padding: 0px;\\n vertical-align: top;\\n height: 100%;\\n width: 13px;\\n}\\n.webix_indeterminate {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAZUlEQVR4nGPw8Mhldw9ObXAPTp1JBG4AqWcAawhNs2QgArgFp1q5haTVgzTNZCABuIekzSJdU3DqTOpoqq+vZ3IPSfsPwyD+INJECNBREzSeGkAxTYwG16B0a3CKICXtgTSA0h4ApZxpTQmN4jEAAAAASUVORK5CYII=\\\");\\n background-repeat: no-repeat;\\n background-position: left center;\\n height: 100%;\\n width: 13px;\\n margin-top: 0 !important;\\n display: inline-block;\\n}\\n.webix_measure_size {\\n font-family: Roboto, sans-serif;\\n}\\n.webix_measure_size input,\\n.webix_measure_size textarea,\\n.webix_measure_size select {\\n width: 5px;\\n}\\n.webix_measure_size div {\\n float: none;\\n}\\n.webix_measure_size div,\\n.webix_measure_size a {\\n display: inline-block !important;\\n position: static !important;\\n}\\n.webix_tree_close,\\n.webix_tree_open,\\n.webix_tree_none,\\n.webix_tree_folder,\\n.webix_tree_file,\\n.webix_tree_folder_open {\\n display: inline-block;\\n vertical-align: top;\\n width: 20px;\\n height: 100%;\\n cursor: pointer;\\n margin: 0;\\n background-repeat: no-repeat;\\n}\\n.webix_tree_close,\\n.webix_tree_open,\\n.webix_tree_none {\\n background-position: center center;\\n}\\n.webix_cell .webix_tree_close,\\n.webix_cell .webix_tree_open,\\n.webix_cell .webix_tree_none {\\n background-color: transparent;\\n}\\n.webix_tree_folder,\\n.webix_tree_file,\\n.webix_tree_folder_open {\\n background-position: 0 center ;\\n}\\n.webix_tree_file,\\n.webix_tree_folder,\\n.webix_tree_folder_open {\\n margin: 0px 2px;\\n}\\n.webix_tree_leaves .webix_tree_leaves {\\n display: block;\\n margin-left: 20px;\\n}\\n.webix_line_tree .webix_tree_leaves {\\n margin-left: 0px;\\n}\\n.webix_tree_file {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAInjI+JwM26XAtPyTnTfU5veGyXJ2ZhaRpoSq0AicKlLNJftNojyCMFADs=\\\");\\n}\\n.webix_tree_folder {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAIhjI+py90AI3Syvoqj27mfnn2gZYxkYEpiCqypa27yTC8FADs=\\\");\\n}\\n.webix_tree_folder_open {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAIjjI+py90AI3SyvorjkQ7pDAJBSJaTaGpjKq7pxsJmR9c2UwAAOw==\\\");\\n}\\n.webix_tree_img {\\n background-color: #FFFFFF;\\n float: left;\\n width: 24px;\\n height: 24px;\\n background-position: 0 0;\\n}\\n.webix_tree_line1 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIxjI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKrKg68GbjNGVTeGZmeiRP+IphBbi0EgrAAA7\\\");\\n}\\n.webix_tree_line2 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIpjI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKgLuC7/mTNf2jef6zvc+XgAAOw==\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_tree_line3 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAI1jI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKgLuC78VC9KeveGYPpsJTwFmfCeixahABoQRXQEAOw==\\\");\\n}\\n.webix_tree_line4 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIjjI+py+0Po5y02ouz3rxDAIZi+HGAiW6nmmqr22avHGMzUwAAOw==\\\");\\n}\\n.webix_cal_month {\\n height: 24px;\\n line-height: 24px;\\n text-align: center;\\n position: relative;\\n font-size: 14px;\\n font-weight: bold;\\n padding: 0 0 6px;\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n}\\n.webix_cal_prev_button,\\n.webix_cal_next_button {\\n cursor: pointer;\\n position: absolute;\\n top: 0;\\n width: 24px;\\n height: 24px;\\n background-repeat: no-repeat;\\n background-position: 8px 6px;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_cal_prev_button {\\n left: 0;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAASUlEQVR42p2QMQoAQQgD79EZ0Mqn5xCu2cPdYgUbJ0rMMxXgLeiuKq8gsJAz8weQ0QiwJEfECnr4wdlEnwJ68+yyhReC+c85oRecj0Um+pmo9wAAAABJRU5ErkJggg==\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_cal_next_button {\\n right: 0;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAARElEQVR42qXPsQoAIAhF0T76PdDJT7cUmtQhcmk4N8QVQ9JXN2bmgWOgqp+BiCRG2AYAMoi3/LxYdyagAnhA6G93TrABZaJFJjrFY8IAAAAASUVORK5CYII=\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_view > .webix_cal_header {\\n height: 24px;\\n}\\n.webix_view > .webix_cal_header div {\\n float: left;\\n text-align: center;\\n height: 19px;\\n font-size: 11px;\\n color: #475466;\\n border-bottom: #DADEE0 1px solid;\\n}\\n.webix_cal_body .webix_cal_row > div {\\n float: left;\\n text-align: center;\\n height: 100%;\\n}\\n.webix_cal_body .webix_selected,\\n.webix_cal_body .webix_cal_select,\\n.webix_cal_body .webix_cal_select.webix_cal_today {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_cal_day,\\n.webix_cal_week_num {\\n cursor: pointer;\\n font-size: 12px;\\n color: #475466;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_cal_week_num {\\n color: #a2adbe;\\n cursor: default;\\n margin-right: 0px;\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_cal_event {\\n font-weight: bold;\\n color: #C66200;\\n}\\n.webix_cal_outside {\\n color: #b1bbc8;\\n}\\n.webix_cal_inactive {\\n background: #888;\\n}\\n.webix_cal_inactive {\\n background: #888;\\n}\\n.webix_cal_day_disabled,\\n.webix_cal_day_disabled.webix_cal_event {\\n color: #b1bbc8;\\n background: #f0f0f0;\\n}\\n.webix_cal_day_disabled.webix_cal_day,\\n.webix_cal_day_disabled.webix_cal_block {\\n cursor: not-allowed;\\n}\\n.webix_hours .webix_cal_day_disabled,\\n.webix_minutes .webix_cal_day_disabled,\\n.webix_hours .webix_cal_day_disabled.webix_cal_event,\\n.webix_minutes .webix_cal_day_disabled.webix_cal_event {\\n background: #FFFFFF;\\n font-weight: normal;\\n text-decoration: line-through;\\n}\\n.webix_cal_month_name {\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_cal_block {\\n float: left;\\n text-align: center;\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_selected {\\n background: #F4F5F9;\\n color: #475466;\\n}\\n.webix_cal_footer {\\n text-align: center;\\n font-size: 12px;\\n color: #444;\\n height: 24px;\\n padding: 6px 0 0;\\n cursor: pointer;\\n}\\n.webix_cal_icons {\\n float: right;\\n height: 20px;\\n line-height: 20px;\\n padding: 4px 4px 0;\\n}\\n.webix_cal_time {\\n height: 20px;\\n line-height: 20px;\\n padding: 4px 4px 0;\\n}\\n.webix_cal_time_icons {\\n float: left;\\n}\\n.webix_cal_icons .webix_cal_icon {\\n text-align: center;\\n padding: 0 4px;\\n}\\n.webix_cal_icon:hover,\\n.webix_cal_time:hover,\\n.webix_cal_month_name:hover {\\n text-decoration: underline;\\n color: #1CA1C1;\\n}\\n.webix_cal_icon:focus,\\n.webix_cal_time:focus,\\n.webix_cal_month_name:focus {\\n color: #1CA1C1;\\n}\\n.webix_cal_month_name.webix_readonly {\\n cursor: default;\\n}\\n.webix_cal_month_name.webix_readonly:hover,\\n.webix_cal_month_name.webix_readonly:focus {\\n text-decoration: none;\\n color: inherit;\\n}\\n.webix_time_header {\\n padding: 0 0 6px;\\n}\\n.webix_time_header .webix_cal_hours,\\n.webix_time_header .webix_cal_minutes {\\n display: inline-block;\\n font-size: 14px;\\n text-align: center;\\n height: 24px;\\n line-height: 24px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_time_header .webix_cal_minutes {\\n padding-left: 1px;\\n border-left: none;\\n}\\n.webix_time_header .webix_cal_hours {\\n border-right: none !important;\\n}\\n.webix_cal_body .webix_hours {\\n float: left;\\n border-right: 1px solid #DADEE0;\\n padding-right: 1px;\\n}\\n.webix_cal_body .webix_minutes {\\n float: left;\\n padding-left: 1px;\\n}\\n.webix_cal_block_empty {\\n float: left;\\n text-align: center;\\n}\\n.webix_time_footer {\\n text-align: center;\\n font-size: 12px;\\n height: 24px;\\n padding: 6px 0 0;\\n cursor: pointer;\\n}\\n.webix_cal_done {\\n height: 24px;\\n padding: 2px 8px;\\n font-size: 12px;\\n border-radius: 2px;\\n border: 1px solid #DADEE0;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n outline: none;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n float: right;\\n}\\n.webix_cal_done:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_cal_done:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_cal_done:active {\\n background-color: #daddeb;\\n}\\n.webix_cal_blurred_hours {\\n background-color: #f7f7f7;\\n}\\n.webix_property_line {\\n width: 100%;\\n height: auto;\\n line-height: 0;\\n}\\n.webix_property_line.webix_focused > div,\\n.webix_property_line:focus > div {\\n background-color: #f7f8fb;\\n}\\n.webix_property_label,\\n.webix_property_value {\\n display: inline-block;\\n padding-left: 12px;\\n border-bottom: 1px solid #EDEFF0;\\n overflow: hidden;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_property_label {\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_property_label_line {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n line-height: 42px;\\n padding-left: 12px;\\n border-bottom: 1px solid #EDEFF0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_property_label_line .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_property_label_line.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_property_label_line.webix_dark .webix_el_button,\\n.webix_property_label_line.webix_dark .webix_el_label .webix_el_box,\\n.webix_property_label_line.webix_dark .webix_inp_label,\\n.webix_property_label_line.webix_dark .webix_inp_top_label,\\n.webix_property_label_line.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_secondary .webix_icon,\\n.webix_property_label_line.webix_dark .webix_transparent .webix_icon,\\n.webix_property_label_line.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_property_label_line.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_property_label_line.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_property_label_line.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_transparent button:hover,\\n.webix_property_label_line.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_property_label_line.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev,\\n.webix_property_label_line.webix_dark .webix_segment_0,\\n.webix_property_label_line.webix_dark .webix_segment_1,\\n.webix_property_label_line.webix_dark .webix_segment_N,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button:hover,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next:hover,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev:hover,\\n.webix_property_label_line.webix_dark .webix_segment_0:hover,\\n.webix_property_label_line.webix_dark .webix_segment_1:hover,\\n.webix_property_label_line.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button:focus,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next:focus,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev:focus,\\n.webix_property_label_line.webix_dark .webix_segment_0:focus,\\n.webix_property_label_line.webix_dark .webix_segment_1:focus,\\n.webix_property_label_line.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button:active,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next:active,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev:active,\\n.webix_property_label_line.webix_dark .webix_segment_0:active,\\n.webix_property_label_line.webix_dark .webix_segment_1:active,\\n.webix_property_label_line.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_inp_static,\\n.webix_property_label_line.webix_dark input[type=text],\\n.webix_property_label_line.webix_dark input[type=combo],\\n.webix_property_label_line.webix_dark input[type=datepicker],\\n.webix_property_label_line.webix_dark textarea,\\n.webix_property_label_line.webix_dark select,\\n.webix_property_label_line.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_property_label_line.webix_dark .webix_el_texthighlight input,\\n.webix_property_label_line.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_property_label_line.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_property_label_line.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_multicombo_value,\\n.webix_property_label_line.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_property_label_line.webix_dark .webix_inp_static:focus,\\n.webix_property_label_line.webix_dark input[type=text]:focus,\\n.webix_property_label_line.webix_dark input[type=combo]:focus,\\n.webix_property_label_line.webix_dark input[type=datepicker]:focus,\\n.webix_property_label_line.webix_dark textarea:focus,\\n.webix_property_label_line.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_property_label_line.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_property_label_line.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_property_label_line.webix_dark .webix_el_icon,\\n.webix_property_label_line.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_property_label_line.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_property_label_line.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_property_label_line.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_property_label_line.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_property_label_line.webix_dark .webix_custom_checkbox,\\n.webix_property_label_line.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_custom_checkbox:focus,\\n.webix_property_label_line.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_property_label_line.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_property_label_line.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_property_label_line.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_property_label_line.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_property_label_line.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box input,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box select,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_property_label_line.webix_dark input.webix_invalid,\\n.webix_property_label_line.webix_dark select.webix_invalid,\\n.webix_property_label_line.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_property_label_line.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_property_label_line.webix_dark {\\n color: #FFFFFF;\\n}\\n.webix_property_col_ind {\\n float: right;\\n cursor: pointer;\\n margin: 0 8px 0 0;\\n border: 1px solid #DADEE0;\\n background: #ffffff;\\n border-radius: 3px;\\n width: 16px;\\n height: 16px;\\n}\\n.webix_property_value {\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.webix_property_check {\\n margin: 0;\\n vertical-align: middle;\\n}\\n/*style used by tooltip's container*/\\n.webix_tooltip {\\n display: none;\\n position: absolute;\\n z-index: 10000;\\n background-color: #FFFFFF;\\n padding: 5px 10px;\\n border: 1px solid #DADEE0;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n border-radius: 0px;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n.webix_global_tooltip {\\n pointer-events: none;\\n}\\n/*comments list*/\\n.webix_comments .webix_list .webix_list_item {\\n margin-top: 24px;\\n border: none;\\n cursor: default;\\n}\\n.webix_comments .webix_list .webix_comments_more_item {\\n margin-top: 12px;\\n}\\n/* comments list templates */\\n.webix_comments_name {\\n margin-left: 16px;\\n font-weight: 500;\\n color: rgba(0, 0, 0, 0.7);\\n}\\n.webix_comments_menu.webix_icon {\\n line-height: 30px;\\n width: 6px;\\n visibility: hidden;\\n float: right;\\n cursor: pointer;\\n color: #94A1B3;\\n margin: 0 4px 0 0;\\n}\\n.webix_comments_current:hover .webix_comments_menu,\\n.webix_comments_current.active_menu .webix_comments_menu {\\n visibility: visible;\\n}\\n.webix_comments_message {\\n white-space: pre-wrap;\\n line-height: 20px;\\n margin-left: 70px;\\n margin-right: 10px;\\n}\\n.webix_comments_message a {\\n color: #1CA1C1;\\n text-decoration: none;\\n word-break: break-all;\\n}\\n.webix_comments_message a:hover {\\n text-decoration: underline;\\n}\\n.webix_comments_message a:visited {\\n color: #7e57c2;\\n}\\n.webix_comments_message .webix_comments_mention {\\n font-weight: 500;\\n white-space: nowrap;\\n}\\n.webix_comments_mention {\\n color: #1CA1C1;\\n}\\n.webix_comments_avatar {\\n margin-left: 14px;\\n float: left;\\n position: relative;\\n width: 40px;\\n height: 40px;\\n}\\n.webix_comments_status {\\n z-index: 1;\\n top: 30px;\\n left: 30px;\\n border-radius: 50%;\\n border: 2px solid #FFFFFF;\\n position: absolute;\\n height: 12px;\\n width: 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_comments_status.active {\\n background-color: #55CD97;\\n}\\n.webix_comments_status.busy {\\n background-color: #FF5C4C;\\n}\\n.webix_comments_status.away {\\n background-color: #FDBF4C;\\n}\\n.webix_comments_status.none {\\n background-color: #d0d5dd;\\n}\\n.webix_comments_avatar_image {\\n width: 100%;\\n height: 100%;\\n overflow: hidden;\\n border-radius: 50%;\\n float: left;\\n position: relative;\\n}\\n.webix_comments_photo {\\n width: auto;\\n height: 100%;\\n margin: 0 auto;\\n}\\n.webix_comments_avatar_text {\\n font-size: 16px;\\n color: #1CA1C1;\\n line-height: 40px;\\n text-align: center;\\n background-color: #DFE2E6;\\n}\\n.webix_comments_avatar_text .webix_icon {\\n margin: 0;\\n}\\n.webix_comments_date {\\n float: right;\\n color: #94A1B3;\\n font-size: 12px;\\n}\\n.webix_comments_image {\\n max-width: 100%;\\n max-height: 300px;\\n display: block;\\n}\\n/* buttons*/\\n.webix_comments_more {\\n font-weight: 500;\\n text-align: center;\\n cursor: pointer;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n border: none;\\n border-radius: 2px;\\n}\\n.webix_comments_more:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_comments_send .webix_el_box {\\n float: right !important;\\n}\\n.webix_message_area {\\n position: fixed;\\n right: 5px;\\n width: 250px;\\n z-index: 1000;\\n}\\n.webix_message {\\n min-width: 120px;\\n font-family: Roboto, sans-serif;\\n z-index: 10000;\\n overflow: hidden;\\n margin: 4px 4px 12px;\\n transition: all 0.5s ease;\\n}\\n.webix_message.hidden {\\n height: 0px;\\n min-height: 0px;\\n padding-top: 0px;\\n padding-bottom: 0px;\\n border-width: 0px;\\n margin-top: 0px;\\n margin-bottom: 0px;\\n box-shadow: none;\\n overflow: hidden;\\n}\\n.webix_modal_box {\\n pointer-events: auto;\\n overflow: hidden;\\n display: inline-block;\\n min-width: 250px;\\n width: 250px;\\n text-align: center;\\n position: fixed;\\n background-color: #FFFFFF;\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n font-family: Roboto, sans-serif;\\n z-index: 20000;\\n border-radius: 0px;\\n border: 1px solid #DADEE0;\\n outline: none;\\n}\\n.webix_modal_box .webix_popup_button {\\n margin-top: 8px;\\n}\\n.webix_message,\\n.webix_popup_button {\\n cursor: pointer;\\n}\\n.webix_popup_controls {\\n padding: 4px 12px 12px;\\n}\\n.webix_popup_button {\\n height: 30px;\\n line-height: 30px;\\n display: inline-block;\\n margin: 0 4px;\\n border-radius: 2px;\\n}\\n.webix_popup_button {\\n min-width: 100px;\\n}\\ndiv.webix_modal_cover {\\n background-color: #000;\\n cursor: default;\\n opacity: 0.1;\\n position: fixed;\\n z-index: 19999;\\n left: 0px;\\n top: 0px;\\n width: 100%;\\n height: 100%;\\n border: none;\\n zoom: 1;\\n}\\n.webix_message img,\\n.webix_modal_box img {\\n float: left;\\n margin-right: 8px;\\n}\\n/*Skin section*/\\n.webix_popup_button {\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n outline: none;\\n}\\n.webix_popup_button:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_popup_button:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_popup_button:active {\\n background-color: #daddeb;\\n}\\n.webix_popup_button.confirm {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_popup_button.confirm:hover {\\n background-color: #1992af;\\n}\\n.webix_popup_button.confirm:focus {\\n background-color: #1992af;\\n}\\n.webix_popup_button.confirm:active {\\n background-color: #17839d;\\n}\\n.webix_popup_input.webix_el_text {\\n outline: none;\\n overflow: hidden;\\n padding: 3px 2px;\\n}\\n.webix_popup_input.webix_el_text input {\\n width: 100%;\\n height: 30px;\\n font-size: 14px;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_popup_input.webix_el_text.webix_required::before {\\n position: absolute;\\n right: 18px;\\n padding-top: 1px;\\n content: \\\"*\\\";\\n color: #FF5C4C;\\n}\\n.webix_popup_input.webix_el_text.webix_popup_invalid input {\\n background-color: #ffedee;\\n border-color: #fea5a8;\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n}\\n.webix_popup_title {\\n color: #475466;\\n line-height: 20px;\\n padding: 20px 16px 12px 16px;\\n font-size: 16px;\\n font-weight: 500;\\n}\\n.webix_popup_title + div.webix_popup_text {\\n padding-top: 0;\\n box-shadow: none;\\n}\\n.webix_popup_text {\\n overflow: hidden;\\n padding: 24px 16px 0px 16px;\\n font-size: 14px;\\n color: #475466;\\n line-height: 20px;\\n}\\n.webix_popup_text.webix_popup_label {\\n text-align: left;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_alert .webix_popup_title,\\n.webix_confirm .webix_popup_title,\\n.webix_prompt .webix_popup_title,\\n.webix_alert .webix_popup_text,\\n.webix_confirm .webix_popup_text,\\n.webix_prompt .webix_popup_text {\\n box-shadow: inset 0 4px #1CA1C1;\\n}\\n.webix_alert-warning .webix_popup_title,\\n.webix_confirm-warning .webix_popup_title,\\n.webix_prompt-warning .webix_popup_title,\\n.webix_alert-warning .webix_popup_text,\\n.webix_confirm-warning .webix_popup_text,\\n.webix_prompt-warning .webix_popup_text {\\n box-shadow: inset 0 4px #FDBF4C;\\n}\\n.webix_alert-error .webix_popup_title,\\n.webix_confirm-error .webix_popup_title,\\n.webix_prompt-error .webix_popup_title,\\n.webix_alert-error .webix_popup_text,\\n.webix_confirm-error .webix_popup_text,\\n.webix_prompt-error .webix_popup_text {\\n box-shadow: inset 0 4px #FF5C4C;\\n}\\n.webix_message {\\n font-size: 14px;\\n color: #475466;\\n box-shadow: 0 1px 14px 0 rgba(0, 0, 0, 0.12), 0 4px 10px 0 rgba(0, 0, 0, 0.1);\\n line-height: 20px;\\n border-radius: 2px;\\n border: 1px solid #DADEE0;\\n background-color: #FFFFFF;\\n}\\n.webix_message.webix_debug {\\n color: #313131;\\n border-color: #fed282;\\n background-color: #fff2db;\\n}\\n.webix_message.webix_error {\\n color: #313131;\\n border-color: #ff8d82;\\n background-color: #ffdedb;\\n}\\n.webix_message.webix_success {\\n color: #313131;\\n border-color: #88dcb6;\\n background-color: #ddf5ea;\\n}\\n.webix_message div {\\n padding: 11px 12px;\\n}\\n.webix_color_row {\\n clear: both;\\n white-space: nowrap;\\n}\\n.webix_color_palette {\\n text-align: left;\\n padding: 4px;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_color_palette.webix_palette_classic {\\n padding: 0;\\n}\\n.webix_color_row,\\n.webix_color_row div {\\n line-height: 0;\\n font-size: 0;\\n}\\n.webix_color_row div {\\n display: inline-block;\\n position: relative;\\n}\\n.webix_color_row div > * {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_color_row .webix_color_selected > * {\\n border: 1px solid;\\n border-color: #FFFFFF;\\n border-radius: 2px;\\n box-shadow: rgba(28, 161, 193, 0.6) 0 0 0 2px;\\n}\\n.webix_color_row .webix_color_selected:focus > * {\\n box-shadow: #1CA1C1 0 0 0 2px;\\n}\\n.webix_palette_classic .webix_color_row .webix_color_selected > * {\\n border: 2px solid #f3f3f3;\\n border-radius: 0px;\\n box-shadow: none;\\n}\\n.webix_palette_classic .webix_color_row .webix_color_selected:focus > * {\\n box-shadow: inset 0 0 15px #fff;\\n}\\n.webix_palette_classic .webix_color_item {\\n width: 100%;\\n height: 100%;\\n cursor: pointer;\\n}\\n.webix_palette_material .webix_color_item {\\n display: inline-block;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border-radius: 2px;\\n cursor: pointer;\\n width: 100%;\\n height: 100%;\\n}\\n.webix_palette_material .webix_color_row > div {\\n margin: 0 4px 4px 0;\\n}\\n.webix_color_area {\\n width: 100%;\\n height: 100%;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_color_block {\\n position: relative;\\n border-radius: 2px;\\n margin: 12px 12px 14px;\\n}\\n.webix_color_block:before,\\n.webix_color_block:after {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n left: 0;\\n}\\n.webix_color_block:before {\\n background-image: linear-gradient(0deg, #000, hsla(0, 0%, 100%, 0));\\n z-index: 2;\\n}\\n.webix_color_block:after {\\n background-image: linear-gradient(90deg, #fff, hsla(20, 42%, 65%, 0));\\n z-index: 1;\\n}\\n.webix_color_line {\\n position: relative;\\n height: 8px;\\n margin: 0 12px;\\n border-radius: 8px;\\n background-image: linear-gradient(90deg, red, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red);\\n}\\n.webix_color_circle {\\n width: 8px;\\n height: 8px;\\n margin: -6px 0 0 -6px;\\n border: 2px solid #FFFFFF;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\\n border-radius: 50%;\\n position: absolute;\\n left: 0;\\n top: 0;\\n z-index: 3;\\n}\\n.webix_color_circle:focus,\\n.webix_color_area_active .webix_color_circle {\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 0 4px #FFFFFF;\\n}\\n.webix_color_line_circle {\\n width: 12px;\\n height: 12px;\\n margin: -4px 0 0 -8px;\\n border: 2px solid #FFFFFF;\\n border-radius: 50%;\\n position: absolute;\\n left: 0;\\n top: 0;\\n background: #12FF08;\\n}\\n.webix_color_line_circle:focus,\\n.webix_color_area_active .webix_color_line_circle {\\n box-shadow: inset 0 0 8px #FFFFFF;\\n}\\n.webix_color_area_active .webix_color_circle,\\n.webix_color_area_active .webix_color_line_circle {\\n pointer-events: none;\\n}\\n.webix_color_out_block,\\n.webix_color_out_text {\\n height: 32px;\\n float: left;\\n border: 1px solid #CCD7E6;\\n margin: 12px 0px 12px 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_color_out_text {\\n color: #475466;\\n font-size: 14px;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n padding: 0px 12px;\\n}\\n.webix_color_out_text:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_color_area .webix_button {\\n width: calc(100% - 12px*2);\\n height: 32px;\\n margin: 0px 0px 12px 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_daterange .webix_view {\\n background-color: #FFFFFF;\\n}\\n.webix_daterange .webix_range_0 .webix_cal_next_button,\\n.webix_daterange .webix_range_N .webix_cal_prev_button {\\n visibility: hidden;\\n}\\n.webix_daterange .webix_range_1 .webix_cal_next_button,\\n.webix_daterange .webix_range_1 .webix_cal_prev_button {\\n visibility: hidden;\\n}\\n.webix_daterange .webix_range_1 .webix_cal_next_button:hover,\\n.webix_daterange .webix_range_1 .webix_cal_prev_button:hover {\\n cursor: default;\\n}\\n.webix_daterange .webix_range_left .webix_cal_next_button:hover,\\n.webix_daterange .webix_range_right .webix_cal_prev_button:hover {\\n cursor: default;\\n}\\n.webix_cal_range {\\n background-color: #ffffff;\\n}\\n.webix_cal_range_start {\\n border-radius: 3px 0 0 3px;\\n}\\n.webix_cal_range_end {\\n border-radius: 0 3px 3px 0;\\n}\\n.webix_cal_range_start,\\n.webix_cal_range_end,\\n.webix_cal_event.webix_cal_range_start,\\n.webix_cal_event.webix_cal_range_end,\\n.webix_cal_body .webix_cal_today.webix_cal_range_start,\\n.webix_cal_body .webix_cal_today.webix_cal_range_end {\\n background-color: #F4F5F9;\\n color: #475466;\\n}\\n.webix_cal_outside.webix_cal_range,\\n.webix_cal_body .webix_cal_outside.webix_cal_range_start,\\n.webix_cal_body .webix_cal_outside.webix_cal_range_end,\\n.webix_cal_body .webix_cal_outside.webix_cal_today.webix_cal_range_start,\\n.webix_cal_body .webix_cal_outside.webix_cal_today.webix_cal_range_end {\\n background-color: transparent;\\n color: #b1bbc8;\\n}\\n.webix_daterange .webix_cal_icons {\\n text-align: right;\\n padding: 0 4px;\\n}\\n.webix_daterange .webix_cal_icons .webix_cal_icon {\\n border-top: 1px solid #DADEE0;\\n}\\n.webix_daterange .webix_cal_time {\\n display: none;\\n}\\n.webix_daterange .webix_cal_timepicker .webix_range_time_start {\\n display: block;\\n}\\n.webix_daterange .webix_range_timepicker .webix_cal_time {\\n display: block;\\n padding: 5px 15px;\\n}\\n.webix_daterange .webix_range_timepicker .webix_range_time_start {\\n float: left;\\n}\\n.webix_daterange .webix_range_timepicker .webix_range_time_end {\\n float: right;\\n}\\n.webix_daterange .webix_range_footer .webix_cal_footer {\\n padding: 0;\\n}\\n.webix_timeboard .webix_slider_title {\\n text-align: left;\\n margin-left: 10px;\\n}\\n.webix_timeboard .webix_colon_template .webix_template {\\n padding: 0;\\n text-align: center;\\n line-height: 100%;\\n font-size: 30px;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_timeboard .webix_day_part .webix_el_box {\\n padding-left: 6px;\\n color: #1CA1C1;\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_timeboard .webix_day_part .webix_el_box:hover,\\n.webix_timeboard .webix_day_part .webix_el_box:focus {\\n color: #17839d;\\n}\\n.webix_drag_zone {\\n position: absolute;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n background-color: #FFFFFF;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n pointer-events: none;\\n}\\n.webix_drag_zone .webix_tree_item {\\n padding: 0 8px;\\n}\\n.webix_drag_zone .webix_tree_item .webix_tree_open,\\n.webix_drag_zone .webix_tree_item .webix_tree_close,\\n.webix_drag_zone .webix_tree_item .webix_tree_none {\\n display: none;\\n}\\n.webix_drag_zone .webix_ss_hscroll,\\n.webix_drag_zone .webix_ss_vscroll {\\n display: none !important;\\n}\\n.webix_drag_over,\\n.webix_drop_zone {\\n background-color: #e6e6e6;\\n}\\n.webix_drag_main {\\n position: relative;\\n background-color: #FFFFFF;\\n}\\n.webix_drag_main .webix_tree_item,\\n.webix_drag_main .webix_list_item,\\n.webix_drag_main .webix_dataview_item {\\n border: 1px solid #EDEFF0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_drag_multiple,\\n.webix_drag_multiple_last {\\n height: 100%;\\n width: 100%;\\n position: absolute;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border: 1px solid #EDEFF0;\\n background-color: #FFFFFF;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_drag_multiple {\\n bottom: 8px;\\n left: 8px;\\n}\\n.webix_drag_multiple_last {\\n bottom: 16px;\\n left: 16px;\\n}\\n.webix_drag_zone > .webix_badge {\\n top: -14px;\\n right: -14px;\\n}\\n.webix_invisible {\\n display: none !important;\\n}\\n.webix_drop_area,\\n.webix_drop_area_inner {\\n height: 36px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background-color: #f1f2f7;\\n}\\n.webix_list-x .webix_drop_area {\\n display: inline-block;\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_tree .webix_drop_area {\\n height: 24px;\\n}\\n.webix_list .webix_drop_area {\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_dataview .webix_drop_area {\\n float: left;\\n background-color: transparent;\\n}\\n.webix_dataview .webix_drop_area_inner {\\n border-right: 1px solid #EDEFF0;\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_vscroll_x {\\n height: 0px;\\n width: 100%;\\n overflow-y: hidden;\\n overflow-x: scroll;\\n}\\n.webix_vscroll_y {\\n width: 0px;\\n height: 100%;\\n overflow-x: hidden;\\n overflow-y: scroll;\\n}\\n.webix_vscroll_body {\\n width: 16px;\\n height: 16px;\\n}\\n.webix_scroll_x {\\n width: 50px;\\n height: 4px !important;\\n left: 1px;\\n bottom: 3px;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n position: absolute;\\n border-radius: 4px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_scroll_y {\\n width: 4px !important;\\n height: 50px;\\n top: 1px;\\n right: 3px;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n position: absolute;\\n border-radius: 4px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_custom_scroll {\\n -ms-overflow-style: none;\\n /* IE, Edge */\\n scrollbar-width: none;\\n /* Firefox */\\n}\\n.webix_custom_scroll::-webkit-scrollbar {\\n display: none;\\n /* Chrome, Edge(chromium), Opera, Safari, all browsers on iOS */\\n}\\n.webix_c_scroll_y {\\n position: absolute;\\n z-index: 3;\\n width: 10px;\\n right: 0px;\\n}\\n.webix_c_scroll_y > div {\\n transition: width 0.3s 0.2s, margin 0.3s 0.2s;\\n width: 4px;\\n height: 100%;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n border-radius: 4px;\\n margin: 0px 3px;\\n}\\n.webix_c_scroll_y:hover > div,\\n.webix_c_scroll_y.webix_scroll_active div {\\n width: 10px;\\n margin: 0px;\\n}\\n.webix_c_scroll_x {\\n position: absolute;\\n z-index: 3;\\n height: 10px;\\n bottom: 0px;\\n}\\n.webix_c_scroll_x > div {\\n transition: height 0.3s 0.2s, margin 0.3s 0.2s;\\n height: 4px;\\n width: 100%;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n border-radius: 4px;\\n margin: 3px 0px;\\n}\\n.webix_c_scroll_x:hover > div,\\n.webix_c_scroll_x.webix_scroll_active div {\\n height: 10px;\\n margin: 0px;\\n}\\n.webix_c_scroll_bar_y,\\n.webix_c_scroll_bar_x {\\n position: absolute;\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.webix_c_scroll_bar_y {\\n height: 100%;\\n width: 10px;\\n right: 0px;\\n}\\n.webix_c_scroll_bar_x {\\n width: 100%;\\n height: 10px;\\n bottom: 0px;\\n}\\n.webix_scroll_cont {\\n width: 100%;\\n height: auto;\\n clear: both;\\n position: relative;\\n}\\n.webix_secondary .webix_button {\\n background: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_secondary .webix_button:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_secondary .webix_button:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_secondary .webix_button:active {\\n background-color: #daddeb;\\n}\\n.webix_secondary .webix_button .webix_icon,\\n.webix_secondary .webix_button .webix_img_btn_text,\\n.webix_secondary .webix_button .webix_icon_btn {\\n color: #1CA1C1;\\n}\\n.webix_secondary .webix_pressed .webix_button {\\n background-color: #daddeb;\\n}\\n.webix_primary .webix_button {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_primary .webix_button:hover {\\n background-color: #1992af;\\n}\\n.webix_primary .webix_button:focus {\\n background-color: #1992af;\\n}\\n.webix_primary .webix_button:active {\\n background-color: #17839d;\\n}\\n.webix_primary .webix_button .webix_icon,\\n.webix_primary .webix_button .webix_img_btn_text,\\n.webix_primary .webix_button .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_primary .webix_pressed .webix_button {\\n background-color: #17839d;\\n}\\n.webix_danger .webix_button {\\n background: #FF5C4C;\\n color: #ffffff;\\n}\\n.webix_danger .webix_button:hover {\\n background-color: #ff4938;\\n}\\n.webix_danger .webix_button:focus {\\n background-color: #ff4938;\\n}\\n.webix_danger .webix_button:active {\\n background-color: #ff3723;\\n}\\n.webix_danger .webix_button .webix_icon,\\n.webix_danger .webix_button .webix_img_btn_text,\\n.webix_danger .webix_button .webix_icon_btn {\\n color: #ffffff;\\n}\\n.webix_danger .webix_pressed .webix_button {\\n background-color: #ff3723;\\n}\\n.webix_transparent .webix_button {\\n color: #475466;\\n background: transparent;\\n border: none;\\n}\\n.webix_transparent .webix_button .webix_img_btn_text {\\n color: #475466;\\n}\\n.webix_transparent .webix_button .webix_icon,\\n.webix_transparent .webix_button .webix_icon_btn {\\n color: #94A1B3;\\n}\\n.webix_transparent .webix_button:hover {\\n background-color: rgba(0, 0, 0, 0.04);\\n}\\n.webix_transparent .webix_button:focus {\\n background-color: rgba(0, 0, 0, 0.04);\\n}\\n.webix_transparent .webix_button:active {\\n background-color: rgba(0, 0, 0, 0.05);\\n}\\n.webix_transparent .webix_pressed .webix_button {\\n background-color: rgba(0, 0, 0, 0.05);\\n}\\n.webix_button,\\n.webixbutton {\\n border-radius: 2px;\\n height: 100%;\\n width: 100%;\\n cursor: pointer;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n -webkit-appearance: none;\\n padding: 0 6px;\\n}\\n.webix_el_button .webix_el_box,\\n.webix_el_toggle .webix_el_box {\\n position: relative;\\n}\\n.webix_img_btn,\\n.webix_img_btn_top {\\n vertical-align: top;\\n border: none;\\n width: 100%;\\n padding: 0;\\n}\\n.webix_img_btn .webix_icon {\\n color: #1CA1C1;\\n margin-right: 4px;\\n}\\n.webix_img_btn_top .webix_icon,\\n.webix_img_btn_top .webix_image {\\n font-size: 20px;\\n position: absolute;\\n top: 8px;\\n display: inline-block;\\n left: 50%;\\n transform: translateX(-50%);\\n}\\n.webix_img_btn .webix_image {\\n display: inline-block;\\n margin-right: 4px;\\n vertical-align: middle;\\n}\\n.webix_img_btn_text {\\n position: absolute;\\n left: 0;\\n bottom: 4px;\\n width: 100%;\\n text-align: center;\\n cursor: pointer;\\n color: #1CA1C1;\\n}\\n.webix_pressed .webix_button {\\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_button {\\n color: #94A1B3;\\n background: #f4f5f9;\\n border-color: #f4f5f9;\\n text-shadow: none;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: #94A1B3;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_image {\\n opacity: 0.4;\\n}\\n.webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_disabled_view.webix_control .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: #94A1B3;\\n}\\n.webixbutton {\\n width: auto;\\n height: auto;\\n padding: 8px 15px;\\n}\\n.webix_richtext_editor {\\n height: 100%;\\n}\\n.webix_template .webix_richtext_editor:focus {\\n outline: none;\\n}\\n.webix_richtext_container .webix_template {\\n padding: 10px;\\n overflow-x: auto;\\n border: solid #DADEE0;\\n border-width: 0px 1px 1px;\\n border-radius: 0px 0px 6px 6px;\\n}\\n.webix_richtext_inp_label .webix_template {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n color: #475466;\\n text-transform: none;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n float: left;\\n padding-top: 1px;\\n padding-left: 0;\\n padding-right: 9px;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n padding-right: 8px;\\n margin-bottom: 0px;\\n padding-top: 10px;\\n float: none;\\n}\\n.webix_richtext .wxi-underline,\\n.webix_richtext .wxi-italic,\\n.webix_richtext .wxi-bold {\\n vertical-align: sub;\\n font-size: 24px;\\n width: 24px;\\n}\\n.webix_control {\\n background: transparent;\\n}\\n.webix_control input,\\n.webix_control button,\\n.webix_control textarea,\\n.webix_el_label,\\n.webix_inp_label,\\n.webix_inp_top_label,\\n.webix_inp_bottom_label {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-family: Roboto, sans-serif;\\n}\\n.webix_el_box {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 3px 2px;\\n height: 100%;\\n width: 100%;\\n font-size: 14px;\\n overflow: hidden;\\n}\\n.webixtoolbarlabel {\\n font-size: 16px;\\n}\\n.webix_el_text input,\\n.webix_el_search input,\\n.webix_el_combo input,\\n.webix_el_datepicker input,\\n.webix_el_colorpicker input {\\n font-size: 14px;\\n height: 100%;\\n padding: 0px 12px;\\n border: 1px solid #DADEE0;\\n color: #475466;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n -webkit-appearance: none;\\n border-radius: 0;\\n}\\n.webix_multitext_icon:hover,\\n.webix_multitext_icon:active {\\n color: #1CA1C1;\\n background: inherit;\\n cursor: pointer;\\n}\\n.webix_inp_label,\\n.webix_inp_top_label,\\n.webix_label_right {\\n color: #475466;\\n text-transform: none;\\n font-size: 14px;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n}\\n.webix_inp_label {\\n float: left;\\n padding-top: 1px;\\n padding-left: 0;\\n padding-right: 9px;\\n}\\n.webix_inp_top_label {\\n float: none;\\n padding: 3px 2px;\\n padding-bottom: 0px;\\n}\\n.webix_inp_bottom_label {\\n font-size: 12px;\\n color: #516075;\\n}\\n.webix_label_right {\\n padding-left: 9px;\\n}\\n.webix_el_checkbox .webix_label_right {\\n display: inline-block;\\n padding-top: 1px;\\n}\\n.webix_el_label {\\n color: #475466;\\n}\\n.webix_toolbar .webix_el_label {\\n text-transform: none;\\n}\\n.webix_el_select select {\\n height: 100%;\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n border: 1px solid #DADEE0;\\n}\\nbody:not(:-moz-handler-blocked) .webix_el_select select {\\n padding: 0.2em;\\n}\\n.webix_el_group,\\n.webix_all_segments {\\n height: 100%;\\n white-space: nowrap;\\n}\\n.webix_inp_counter_next,\\n.webix_inp_counter_prev,\\n.webix_inp_counter_value {\\n border: 1px solid #DADEE0;\\n cursor: pointer;\\n -webkit-appearance: none;\\n width: 20px;\\n height: 100%;\\n vertical-align: top;\\n}\\n.webix_inp_counter_value {\\n font-size: 14px;\\n width: 50px;\\n color: #475466;\\n text-align: center;\\n border-left-width: 0px;\\n border-right-width: 0px;\\n -webkit-appearance: none;\\n border-radius: 0;\\n}\\n.webix_inp_counter_prev {\\n padding: 0;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.webix_inp_counter_prev:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_prev:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_prev:active {\\n background-color: #daddeb;\\n}\\n.webix_inp_counter_next {\\n padding: 0;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_inp_counter_next:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:active {\\n background-color: #daddeb;\\n}\\n.webix_el_textarea textarea,\\n.webix_textarea_measure {\\n border: 1px solid #DADEE0;\\n height: 100%;\\n margin: 0;\\n padding: 5px;\\n color: #475466;\\n resize: none;\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n padding-left: 12px;\\n padding-right: 12px;\\n}\\n.webix_textarea_measure {\\n box-sizing: border-box;\\n overflow: hidden;\\n}\\n.webix_el_textarea .webix_inp_label {\\n padding-top: 10px;\\n}\\n.webix_noscroll.webix_el_textarea textarea {\\n overflow: hidden;\\n}\\n.webix_segment_0,\\n.webix_segment_1 {\\n border: 1px solid #DADEE0;\\n border-right-width: 0px;\\n height: 100%;\\n}\\n.webix_segment_0 {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.webix_segment_N {\\n border: 1px solid #DADEE0;\\n height: 100%;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_segment_N:first-child {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_segment_0,\\n.webix_segment_1,\\n.webix_segment_N {\\n -webkit-appearance: none;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n outline: none;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n cursor: pointer;\\n padding: 0;\\n}\\n.webix_segment_0:hover,\\n.webix_segment_1:hover,\\n.webix_segment_N:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:focus,\\n.webix_segment_1:focus,\\n.webix_segment_N:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:active,\\n.webix_segment_1:active,\\n.webix_segment_N:active {\\n background-color: #daddeb;\\n}\\n.webix_segment_0.webix_selected,\\n.webix_segment_1.webix_selected,\\n.webix_segment_N.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n border-color: #1CA1C1;\\n background-color: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_segment_0.webix_selected:focus,\\n.webix_segment_1.webix_selected:focus,\\n.webix_segment_N.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_segment_0.webix_disabled,\\n.webix_segment_1.webix_disabled,\\n.webix_segment_N.webix_disabled {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n border-color: transparent;\\n cursor: not-allowed;\\n}\\n.webix_segment_0.webix_disabled:hover,\\n.webix_segment_1.webix_disabled:hover,\\n.webix_segment_N.webix_disabled:hover,\\n.webix_segment_0.webix_disabled:focus,\\n.webix_segment_1.webix_disabled:focus,\\n.webix_segment_N.webix_disabled:focus,\\n.webix_segment_0.webix_disabled:active,\\n.webix_segment_1.webix_disabled:active,\\n.webix_segment_N.webix_disabled:active {\\n box-shadow: none;\\n background-color: #fbfbfd;\\n}\\n.webix_segment_0.webix_disabled.webix_selected,\\n.webix_segment_1.webix_disabled.webix_selected,\\n.webix_segment_N.webix_disabled.webix_selected,\\n.webix_segment_0.webix_disabled.webix_selected:hover,\\n.webix_segment_1.webix_disabled.webix_selected:hover,\\n.webix_segment_N.webix_disabled.webix_selected:hover,\\n.webix_segment_0.webix_disabled.webix_selected:focus,\\n.webix_segment_1.webix_disabled.webix_selected:focus,\\n.webix_segment_N.webix_disabled.webix_selected:focus {\\n background-color: #dde0ec;\\n}\\n.webix_inp_static {\\n border: 1px solid #DADEE0;\\n overflow: hidden;\\n padding: 0px 12px;\\n height: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n float: left;\\n}\\n.webix_placeholder {\\n color: #94A1B3;\\n}\\n::-webkit-input-placeholder {\\n color: #94A1B3;\\n}\\n::-moz-placeholder {\\n color: #94A1B3;\\n}\\n/* Firefox 19+ */\\n:-moz-placeholder {\\n color: #94A1B3;\\n}\\n/* Firefox 18- */\\n:-ms-input-placeholder {\\n color: #94A1B3;\\n}\\n.webix_el_combo,\\n.webix_el_richselect,\\n.webix_el_datepicker,\\n.webix_el_colorpicker,\\n.webix_el_search {\\n font-size: 14px;\\n}\\n.webix_el_combo input,\\n.webix_el_richselect input,\\n.webix_el_datepicker input,\\n.webix_el_colorpicker input,\\n.webix_el_search input,\\n.webix_el_combo .webix_inp_static,\\n.webix_el_richselect .webix_inp_static,\\n.webix_el_datepicker .webix_inp_static,\\n.webix_el_colorpicker .webix_inp_static,\\n.webix_el_search .webix_inp_static {\\n color: #475466;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n -webkit-appearance: none;\\n}\\n.webix_el_combo .webix_el_box,\\n.webix_el_richselect .webix_el_box,\\n.webix_el_datepicker .webix_el_box,\\n.webix_el_colorpicker .webix_el_box,\\n.webix_el_search .webix_el_box,\\n.webix_el_text .webix_el_box,\\n.webix_el_texthighlight .webix_el_box {\\n color: #475466;\\n position: relative;\\n}\\n.webix_el_combo .webix_input_icon,\\n.webix_el_richselect .webix_input_icon,\\n.webix_el_datepicker .webix_input_icon,\\n.webix_el_colorpicker .webix_input_icon,\\n.webix_el_search .webix_input_icon,\\n.webix_el_text .webix_input_icon,\\n.webix_el_texthighlight .webix_input_icon {\\n background-color: transparent;\\n position: absolute;\\n z-index: 1;\\n padding-left: 4px;\\n width: 24px;\\n}\\n.webix_clear_icon:hover {\\n color: #FF5C4C;\\n cursor: pointer;\\n}\\n.webix_clear_icon:hover::before {\\n content: \\\"\\\\F011\\\";\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_view input::-ms-clear {\\n display: none;\\n}\\n/*Remove button padding in FF*/\\n.webix_view button::-moz-focus-inner {\\n padding: 0;\\n border: 0;\\n}\\n.webix_el_radio .webix_inp_label {\\n line-height: normal !important;\\n padding-top: 7px;\\n}\\n.webix_inp_radio_border input,\\n.webix_el_checkbox input {\\n margin: 0px;\\n padding: 0px;\\n float: left;\\n}\\n.webix_line_break {\\n clear: both;\\n}\\n.webix_custom_checkbox,\\n.webix_custom_radio {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_radio_option.webix_disabled .webix_label_right,\\n.webix_radio_option.webix_disabled .webix_inp_radio_border {\\n color: #94A1B3;\\n cursor: not-allowed;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_el_radio .webix_radio_option.webix_disabled .webix_custom_radio {\\n color: #94A1B3;\\n cursor: not-allowed;\\n}\\n.webix_radio_option {\\n display: table;\\n float: left;\\n height: 32px;\\n margin-right: 20px;\\n}\\n.webix_inp_radio_border,\\n.webix_el_radio .webix_label_right {\\n display: table-cell;\\n vertical-align: middle;\\n}\\n.webix_measure_size .webix_inp_radio_border,\\n.webix_measure_size.webix_el_radio .webix_label_right {\\n display: table-cell !important;\\n}\\n.webix_measure_size .webix_radio_option {\\n display: table !important;\\n float: left !important;\\n}\\n.webix_measure_size .webix_line_break {\\n display: block !important;\\n}\\n.webix_invalid .webix_el_box input,\\n.webix_invalid .webix_custom_radio,\\n.webix_invalid .webix_el_box .webix_inp_static,\\n.webix_invalid .webix_el_box select,\\n.webix_invalid .webix_el_box textarea,\\ninput.webix_invalid,\\nselect.webix_invalid,\\ntextarea.webix_invalid {\\n background-color: #fff6f6;\\n border-color: #fea5a8;\\n}\\n.webix_invalid .webix_inp_bottom_label {\\n font-size: 12px;\\n color: #fd595f;\\n}\\n.webix_el_colorpicker .webix_input_icon {\\n padding-left: 0;\\n width: 24px;\\n height: 24px;\\n border-radius: 2px;\\n}\\n.webix_el_search .webix_el_box {\\n position: relative;\\n}\\n.webix_el_search input {\\n padding-right: 30px;\\n}\\n.webix_el_search span {\\n position: absolute;\\n right: 19px;\\n cursor: pointer;\\n padding-left: 7px;\\n}\\n.webix_view.webix_control > .webix_disabled {\\n opacity: 0;\\n}\\n.webix_disabled_view.webix_control .webix_image {\\n -webkit-filter: grayscale(100%);\\n filter: grayscale(100%);\\n}\\n.webix_el_label.webix_disabled_view {\\n color: #94A1B3;\\n}\\n.webix_view.webix_control .webix_disabled_box label,\\n.webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_view.webix_control .webix_disabled_box button,\\n.webix_view.webix_control .webix_disabled_box .webix_slider_title {\\n color: #94A1B3;\\n}\\n.webix_view.webix_control .webix_disabled_box input,\\n.webix_view.webix_control .webix_disabled_box select,\\n.webix_view.webix_control .webix_disabled_box textarea,\\n.webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_view.webix_control .webix_disabled_box .webix_slider_right,\\n.webix_view.webix_control .webix_disabled_box .webix_slider_handle {\\n color: #94A1B3;\\n background: #fbfbfd;\\n border-color: #EDEFF0;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_view.webix_control .webix_disabled_box .webix_inp_counter_next,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_N {\\n color: #94A1B3;\\n background: #f4f5f9;\\n border-color: #f4f5f9;\\n text-shadow: none;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: #dde0ec;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_slider_left {\\n background-color: #94A1B3;\\n}\\n.webix_disabled_top_label {\\n color: #94A1B3;\\n}\\nlabel.webix_required:after,\\nlegend.webix_required:after,\\n.webix_measure_size.webix_required:after,\\n.webix_richtext_inp_label.webix_required .webix_template:after {\\n content: \\\"*\\\";\\n padding-left: 4px;\\n color: #FF5C4C;\\n}\\n.webix_multicombo .webix_inp_static {\\n padding: 0 3px 0 0;\\n}\\n.webix_el_text .webix_multicombo_input {\\n background-color: transparent;\\n border: 0;\\n float: left;\\n vertical-align: middle;\\n font-size: 14px;\\n padding: 0px;\\n color: #475466;\\n font-family: Roboto, sans-serif;\\n margin-left: 9px;\\n}\\n.webix_el_text .webix_multicombo_input:focus {\\n border: 0;\\n box-shadow: none;\\n}\\n.webix_multicombo_listbox {\\n width: auto;\\n line-height: 1;\\n margin: 0;\\n padding: 0;\\n list-style: none;\\n}\\n.webix_multicombo_value,\\n.webix_multicombo_tag {\\n float: left;\\n position: relative;\\n background-color: #f2f2f2;\\n display: inline-block;\\n margin: 3px 0 0 3px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n border-radius: 2px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_multicombo_value {\\n padding: 0 20px 0 5px;\\n}\\n.webix_multicombo_tag {\\n min-width: 15px;\\n text-align: center;\\n}\\n.webix_multicombo_tag,\\n.webix_multicombo_value.webix_readonly {\\n padding: 0 5px 0 5px;\\n}\\n.webix_multicombo_delete {\\n position: absolute;\\n top: 50%;\\n right: 4px;\\n margin-top: -8px;\\n font-size: 16px;\\n height: 16px;\\n line-height: 1;\\n color: #475466;\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_multicombo_delete::after {\\n content: \\\"\\\\F011\\\";\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_multilist .webix_list_item {\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n}\\n.webix_multilist .webix_selected {\\n background: #f2f2f2;\\n color: #475466;\\n}\\n.webix_multilist .wxi-checkbox-marked,\\n.webix_multilist .wxi-checkbox-blank {\\n vertical-align: middle;\\n font-size: 24px;\\n width: 24px;\\n margin-right: 4px;\\n}\\n.webix_checksuggest_select_all {\\n border-color: transparent;\\n border-bottom: 1px solid #DADEE0;\\n margin-bottom: 1px;\\n}\\n.webix_checksuggest_select_all .webix_label_right {\\n text-transform: capitalize;\\n display: block;\\n padding: 4px 12px 0 12px;\\n}\\n.webix_checksuggest_select_all input {\\n display: none;\\n}\\n.webix_checksuggest_select_all:hover {\\n cursor: pointer;\\n}\\n.webix_checksuggest_select_all:hover .webix_label_right {\\n cursor: pointer;\\n color: #F4F5F9;\\n}\\n.webix_el_texthighlight {\\n position: relative;\\n}\\n.webix_el_texthighlight.webix_el_text .webix_text_highlight_value {\\n position: relative;\\n top: 50%;\\n transform: translate(0, -50%);\\n overflow: hidden;\\n white-space: pre;\\n}\\n.webix_el_texthighlight.webix_el_text input,\\n.webix_el_texthighlight.webix_el_text .webix_text_highlight {\\n -ms-overflow-style: -ms-autohiding-scrollbar;\\n padding: 0 12px;\\n}\\n.webix_el_texthighlight.webix_el_text .webix_input_icon {\\n top: 3px;\\n}\\n.webix_el_texthighlight.webix_el_textarea textarea {\\n padding: 5px 12px;\\n}\\n.webix_el_texthighlight.webix_el_textarea .webix_text_highlight_value {\\n word-wrap: break-word;\\n margin: 5px 12px;\\n white-space: pre-wrap;\\n}\\n.webix_el_texthighlight.webix_disabled_view .webix_text_highlight {\\n background-color: #fbfbfd;\\n}\\n.webix_el_texthighlight .webix_text_highlight,\\n.webix_el_texthighlight input,\\n.webix_el_texthighlight textarea {\\n line-height: normal;\\n letter-spacing: normal;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_el_texthighlight .webix_text_highlight {\\n -webkit-text-size-adjust: none;\\n height: 100%;\\n position: absolute;\\n border: 1px solid transparent;\\n border-radius: 2px;\\n background-color: #fff;\\n overflow: auto;\\n}\\n.webix_el_texthighlight .webix_text_highlight .webix_text_highlight_value {\\n text-align: left;\\n}\\n.webix_el_texthighlight.webix_control .webix_el_box input,\\n.webix_el_texthighlight.webix_control .webix_el_box textarea {\\n display: block;\\n position: relative;\\n z-index: 1;\\n color: transparent;\\n caret-color: #475466;\\n background: transparent;\\n resize: none;\\n}\\n.webix_el_texthighlight textarea {\\n overflow: auto;\\n}\\n.webix_el_tabbar {\\n background: transparent;\\n}\\n.webix_all_tabs {\\n height: 100%;\\n display: table;\\n}\\n.webix_tab_filler {\\n display: table-cell;\\n background: transparent;\\n font-size: 1px;\\n border-bottom: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_tab_filler:first-child {\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_item_tab:first-child {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_item_tab {\\n display: table-cell;\\n text-align: center;\\n vertical-align: middle;\\n overflow: hidden;\\n cursor: pointer;\\n border: 1px solid #DADEE0;\\n border-left-width: 0px;\\n background: #FFFFFF;\\n color: #1CA1C1;\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 0px;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 0px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webixtype_bottom .webix_item_tab {\\n border-radius: 0;\\n}\\n.webix_item_tab.webix_selected {\\n border-bottom-width: 0px;\\n background: #FFFFFF;\\n color: #1CA1C1;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected {\\n border-bottom-width: 1px;\\n}\\n.webix_before_all_tabs {\\n width: 100%;\\n}\\n.webix_after_all_tabs {\\n width: 100%;\\n border-left: 1px solid #DADEE0;\\n border-right: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: #94A1B3;\\n background: #f4f5f9;\\n border-color: #f4f5f9;\\n text-shadow: none;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin: 0 auto;\\n text-align: center;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin: 0 3px;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab,\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab,\\n.webix_el_tabbar .webixtype_image .webix_item_tab {\\n padding: 3px 0;\\n border-radius: 0;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn_top,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top {\\n background-position: center 0;\\n position: relative;\\n height: 100%;\\n}\\n.webix_tab_more_icon {\\n cursor: pointer;\\n display: table-cell;\\n overflow: hidden;\\n text-align: center;\\n vertical-align: middle;\\n padding: 0 3px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_tab_more_icon .webix_icon {\\n width: 100%;\\n}\\n.webix_tab_list .webix_list_item:last-child {\\n border-bottom: none;\\n}\\n.webix_icon.webix_tab_close {\\n font-size: 12px;\\n float: right;\\n padding: 4px;\\n margin-top: -4px;\\n}\\n.webix_icon.webix_tab_close:focus {\\n color: #FF5C4C;\\n}\\n.webix_all_tabs .webix_item_tab.webix_disabled {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n border-color: transparent;\\n cursor: not-allowed;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_all_tabs .webix_item_tab.webix_disabled:hover,\\n.webix_all_tabs .webix_item_tab.webix_disabled.webix_selected,\\n.webix_all_tabs .webix_item_tab.webix_disabled.webix_selected:hover {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n border-color: transparent;\\n}\\n.webix_menu .webix_list_item:hover,\\n.webix_menu-x .webix_list_item:hover,\\n.webix_menu .webix_list_item:active,\\n.webix_menu-x .webix_list_item:active,\\n.webix_menu .webix_list_item:focus,\\n.webix_menu-x .webix_list_item:focus {\\n background: rgba(100, 100, 100, 0.1);\\n}\\n.webix_menu .webix_list_item,\\n.webix_menu-x .webix_list_item {\\n border: none;\\n text-decoration: none;\\n background: #FFFFFF;\\n height: 36px;\\n}\\n.webix_menu .webix_list_item .webix_submenu_icon,\\n.webix_menu-x .webix_list_item .webix_submenu_icon {\\n float: right;\\n text-align: right;\\n position: relative;\\n margin-left: 4px;\\n}\\n.webix_menu-x {\\n border-color: transparent;\\n background: transparent;\\n color: #FFFFFF;\\n}\\n.webix_menu-x .webix_list_item:first-child {\\n margin-left: 0;\\n}\\n.webix_menu-x .webix_submenu_icon {\\n top: 14px;\\n}\\n.webix_menu-x .webix_list_item {\\n display: inline-block;\\n line-height: 32px;\\n}\\n.webix_menu-x .webix_list_item {\\n border-right: 1px solid #fff;\\n border-left: 0px;\\n background: #1CA1C1;\\n color: #fff;\\n font-size: 14px;\\n}\\n.webix_menu-x .webix_list_item .webix_submenu_icon:before {\\n content: '\\\\F001';\\n}\\n.webix_menu-x .webix_list_item .webix_icon_btn {\\n color: #fff;\\n text-align: left;\\n}\\n.webix_menu-x .webix_list_item.webix_selected {\\n box-shadow: none;\\n}\\n.webix_menu-x .webix_list_item:hover,\\n.webix_menu-x .webix_list_item:active,\\n.webix_menu-x .webix_list_item:focus {\\n background-color: #1992af;\\n}\\n.webix_menu-x .webix_list_item:first-child {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.webix_menu-x .webix_list_item:last-child {\\n border-right: none;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_menu-x .webix_list_item.webix_disabled {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n}\\n.webix_menu-x.webix_disabled_view .webix_disabled {\\n background-color: transparent;\\n}\\n.webix_menu-x.webix_disabled_view .webix_list_item.menu {\\n color: #94A1B3;\\n background: #f4f5f9;\\n}\\n/* Submenu */\\n.webix_menu {\\n background: #FFFFFF;\\n border: 1px solid #DADEE0;\\n border-radius: 0px;\\n}\\n.webix_menu .webix_list_item {\\n display: block;\\n}\\n.webix_menu .webix_context_separator {\\n height: 3px;\\n padding: 1px 3px 0 3px;\\n}\\n.webix_menu .webix_context_separator .sep_line {\\n height: 1px;\\n border-top: 1px solid #DADEE0;\\n}\\n.webix_menu .webix_submenu_icon {\\n top: 12px;\\n}\\n.webix_menu .webix_context_spacer {\\n height: 36px;\\n}\\n.webix_menu_link {\\n color: inherit;\\n text-decoration: none;\\n display: block;\\n height: 100%;\\n}\\n/* Toolbar */\\n.webix_toolbar.webix_layout_subbar .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_button,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_label .webix_el_box,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_label,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_top_label,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_static,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=text],\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=combo],\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=datepicker],\\n.webix_toolbar.webix_layout_subbar.webix_dark textarea,\\n.webix_toolbar.webix_layout_subbar.webix_dark select,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_texthighlight input,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_multicombo_value,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_static:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=text]:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=combo]:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=datepicker]:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark textarea:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_checkbox,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_checkbox:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box input,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box select,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_toolbar.webix_layout_subbar.webix_dark input.webix_invalid,\\n.webix_toolbar.webix_layout_subbar.webix_dark select.webix_invalid,\\n.webix_toolbar.webix_layout_subbar.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar .webix_layout_line,\\n.webix_toolbar .webix_layout_clean {\\n background: transparent;\\n}\\n.webix_hidden_upload,\\n.webix_el_button .webix_hidden_upload {\\n height: 1px;\\n width: 1px;\\n border: 0 !important;\\n font-size: 1px;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n z-index: -1;\\n opacity: 0;\\n}\\n.webix_upload_client,\\n.webix_upload_error,\\n.webix_upload_server {\\n width: 60px;\\n text-align: center;\\n float: right;\\n}\\n.webix_error_icon,\\n.webix_cancel_icon {\\n display: inline-block;\\n background-repeat: no-repeat;\\n}\\n.webix_error_icon {\\n width: 18px;\\n height: 16px;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAYAAAAbBi9cAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZFMDdENjlDNjE2QzExRTI5QzhBQUU2OUI3RDY4RTFCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjZFMDdENjlENjE2QzExRTI5QzhBQUU2OUI3RDY4RTFCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NkUwN0Q2OUE2MTZDMTFFMjlDOEFBRTY5QjdENjhFMUIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NkUwN0Q2OUI2MTZDMTFFMjlDOEFBRTY5QjdENjhFMUIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4ZJnE7AAABdklEQVR42mK80aLPgAcwA/EcIOYB4mgg/oWuQL36AphmYcAPYvl5WBOYmBgY3n/6fQTIn4hLIRMeQ0CuaBHgY2EQ4GMF8euAWIgcg6qF+NmkOdiZGdhYmRiEBdhAhrSQapAKEBcJC7DCBUQE2UBUGhAbkGLQBDEhdjYmJkaGtHVMDD4LmBk+/2RgEBdhBwX+ZGINcuLiZPYW5Ie45tknRrAhIFqAl5WBh4vFBijsR8ggkI29IA0wwMsOo/+DaWjA9wIxGz6D0oAKDXi5EalCkvc/2DApPgifm5OZQZCPFRyGuAwCxwqya0AAZADMVTAgyA92TDUQS2MzqAUUxcAgRjPoP9hVyICVhREUi6B01g4TY4RmES0gvqSuyMPMQAK4ef/LXyBlAswmF2DWd4kJs2M1pGgLIvrRAXJyAIWqNzcXi7cgHysDqQAUnt9//LW52WoQBfLaDRlxDnWgYQzkAKBBDI+ef38E0n3nycsf6gyUgUcAAQYA9DZJKVXGocQAAAAASUVORK5CYII=\\\");\\n}\\n.webix_upload_server {\\n color: #55CD97;\\n}\\n.webix_remove_upload {\\n float: right;\\n}\\n.webix_cancel_icon {\\n margin-top: 9px;\\n width: 14px;\\n height: 14px;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAQAAAC1QeVaAAAAsElEQVR4XoVQUQbDQBScAywIuUcpKCWglBJCDlBKf0vpbymhd5mDhIDcoAcoJQSEsn2G5KmWzMDsPG92ZyGAgVfWfBtrUwEOZnwwOu2UjaPCbScLAEzYmzxyxafMgaUlRXMTsJJ1B7jgy0Y7gHt5FdgyimeAS+a6ZpDTQkLkCQbmk9OBHaPv+p6x99jLFFuOsTMPSlXl8FVlrSopFBP/sIQAbn6+bwsHA29sNGhMBQgf1cri4JYEbDkAAAAASUVORK5CYII=\\\");\\n}\\n.webix_upload_flash {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n bottom: 0;\\n left: 0;\\n background: #fff;\\n}\\n.webix_drop_file {\\n background: #f4f4f4;\\n position: relative;\\n}\\n.webix_drop_file::before {\\n position: absolute;\\n bottom: 10px;\\n left: 0px;\\n width: 100%;\\n text-align: center;\\n pointer-events: none;\\n}\\n.webix_fieldset > fieldset {\\n border: 1px solid #DADEE0;\\n margin: 0px;\\n padding: 5px 8px;\\n}\\n.webix_fieldset_label {\\n color: #475466;\\n font-size: 12px;\\n padding: 0px 8px;\\n text-transform: uppercase;\\n}\\n.webix_forminput > fieldset {\\n border: none;\\n margin: 0px;\\n padding: 0px;\\n}\\n.webix_forminput_label {\\n color: #475466;\\n font-family: Roboto, sans-serif;\\n float: left;\\n line-height: 32px;\\n padding: 3px 2px;\\n padding-right: 9px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\nlegend.webix_forminput_label_top {\\n width: 100%;\\n padding: 3px 2px 0;\\n}\\n.webix_slider_box {\\n position: relative;\\n padding: 0px 10px;\\n height: 100%;\\n float: left;\\n border-radius: 5px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin-top: -11px;\\n padding-top: 15px;\\n}\\n.webix_slider_box .webix_slider_left {\\n height: 10px;\\n float: left;\\n width: 100px;\\n background: #cbeff7;\\n border: 1px solid #e8eaec;\\n border-top-left-radius: 5px;\\n border-bottom-left-radius: 5px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_slider_box .webix_slider_right {\\n height: 10px;\\n float: left;\\n width: 100px;\\n background: #fff;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 5px;\\n border-bottom-right-radius: 5px;\\n border: 1px solid #e8eaec;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_slider_box .webix_slider_handle {\\n z-index: 1;\\n position: absolute;\\n width: 14px;\\n height: 14px;\\n top: 12px;\\n border-radius: 8px;\\n}\\n.webix_slider_box .webix_slider_handle:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_slider_box .webix_slider_left {\\n height: 6px;\\n border: 1px solid #CCD7E6;\\n background: #1CA1C1;\\n}\\n.webix_slider_box .webix_slider_right {\\n height: 6px;\\n border-color: #CCD7E6;\\n}\\n.webix_slider_box .webix_slider_handle {\\n width: 14px;\\n height: 14px;\\n border: 1px solid #CCD7E6;\\n background-color: #FFFFFF;\\n top: 10px;\\n}\\n.webix_rangeslider .webix_slider_box .webix_slider_left {\\n position: absolute;\\n}\\n.webix_rangeslider .webix_slider_box .webix_slider_active {\\n z-index: 2;\\n}\\n.webix_rangeslider .webix_slider_box .webix_slider_right {\\n border-radius: 5px;\\n}\\n.webix_rangeslider .webix_slider_title_box {\\n position: relative;\\n float: left;\\n height: 18px;\\n width: 1px;\\n}\\n.webix_rangeslider .webix_slider_title.webix_slider_move {\\n position: absolute;\\n}\\n.webix_rangeslider.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n border-top-left-radius: 5px;\\n border-bottom-left-radius: 5px;\\n border-top-right-radius: 5px;\\n border-bottom-right-radius: 5px;\\n}\\n.webix_rangeslider.webix_slider_vertical .webix_slider_title.webix_slider_move {\\n display: block;\\n position: relative;\\n}\\n.webix_slider_alt.webix_slider_vertical .webix_slider_box .webix_slider_handle {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFAQMAAABCXz8WAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAZQTFRFAAAAAAAApWe5zwAAAAJ0Uk5TNgD/j1xNAAAADklEQVR4nGNgYPjPAMYACgAB/xSLTywAAAAASUVORK5CYII=\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_left {\\n border: 1px solid #e1e1e1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_right {\\n border: 1px solid #e1e1e1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_handle {\\n width: 11px;\\n margin: 0 2px;\\n height: 14px;\\n top: 12px;\\n border-radius: 2px;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAYAAAAx8TU7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTJCMjdFNENBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTJCMjdFNERBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5MkIyN0U0QUFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5MkIyN0U0QkFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Powz/icAAAAaSURBVHjaYmBgYDBjgAA4zcSABQysIECAAQBn+ACx2PqtbAAAAABJRU5ErkJggg==\\\");\\n background-repeat: no-repeat;\\n background-position: 3px center;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_handle:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_left {\\n border: 1px solid #CCD7E6;\\n background: #1CA1C1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_right {\\n border-color: #CCD7E6;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_handle {\\n background-color: #FFFFFF;\\n border: 1px solid #CCD7E6;\\n top: 10px;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_left,\\n.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n width: 10px;\\n float: none;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_left {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 5px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 5px;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n border-top-left-radius: 5px;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 5px;\\n border-bottom-right-radius: 0;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_handle {\\n left: 7px;\\n}\\n.webix_slider_vertical .webix_slider_title {\\n padding-top: 1px;\\n text-align: left;\\n}\\n.webix_slider_vertical.webix_slider_alt .webix_slider_handle {\\n height: 11px;\\n width: 14px;\\n left: 5px;\\n}\\n.webix_slider_title {\\n text-align: center;\\n}\\n.webix_slider_title.webix_slider_move {\\n position: relative;\\n text-align: left;\\n display: inline-block;\\n width: auto;\\n white-space: nowrap;\\n}\\n.webix_switch_toggle {\\n position: absolute;\\n visibility: hidden;\\n}\\n.webix_switch_box {\\n display: block;\\n position: relative;\\n top: 50%;\\n margin-top: -12px;\\n height: 24px;\\n cursor: pointer;\\n background-color: #f1f1f1;\\n border: 1px solid #DADEE0;\\n border-radius: 60px;\\n transition: background-color 0.4s ease;\\n color: #666;\\n text-align: center;\\n float: left;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_el_switch .webix_label_right {\\n display: block;\\n padding-top: 3px;\\n margin-top: 4px;\\n}\\n.webix_switch_handle {\\n height: 22px;\\n width: 22px;\\n border-radius: 100%;\\n box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3);\\n border: 1px solid #eee;\\n position: absolute;\\n top: 0px;\\n background-color: #fff;\\n transition: left 0.3s ease;\\n cursor: pointer;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_switch_handle:focus,\\n.webix_switch_box:active .webix_switch_handle {\\n box-shadow: 0 0px 2px 2px rgba(0, 0, 0, 0.2);\\n}\\n.webix_switch_text {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n padding: 1px 0 0 18px;\\n display: inline-block;\\n width: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_switch_on .webix_switch_text {\\n padding: 1px 18px 0 0;\\n}\\n.webix_switch_box.webix_switch_on {\\n background-color: #F4F5F9;\\n color: #fff;\\n}\\n.webix_progress_top,\\n.webix_progress_bottom {\\n width: 100%;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n height: 6px;\\n overflow: hidden;\\n z-index: 95;\\n background: #f2f2f2;\\n}\\n.webix_progress_bottom {\\n bottom: 0px;\\n top: auto;\\n height: 17px;\\n}\\n.webix_progress_top .webix_progress_state,\\n.webix_progress_bottom .webix_progress_state {\\n width: 0px;\\n height: 6px;\\n background: #F4F5F9;\\n transition: width 3s;\\n}\\n.webix_progress_bottom .webix_progress_state {\\n height: 17px;\\n}\\n.webix_progress_icon {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n z-index: 95;\\n}\\n.webix_progress_icon .webix_progress_state {\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 50px;\\n position: absolute;\\n left: 50%;\\n top: 50%;\\n margin-left: -25px;\\n margin-top: -25px;\\n display: inline-block;\\n color: #93a0b3;\\n}\\n.webix_gage_box {\\n display: table;\\n height: 100%;\\n width: 100%;\\n}\\n.webix_gage_box > div {\\n display: table-cell;\\n vertical-align: middle;\\n}\\n.webix_gage_body {\\n height: 100%;\\n width: 100%;\\n transform: rotate(180deg);\\n}\\n.webix_gage_label {\\n font-size: 0.9em;\\n text-align: center;\\n margin-top: 10px;\\n}\\n.webix_gage_placeholder {\\n margin-top: -20px;\\n}\\n.webix_gage_info {\\n text-align: center;\\n font-size: 0.7em;\\n position: relative;\\n margin: 0 auto 10px auto;\\n}\\n.webix_gage_min_range {\\n left: -23%;\\n}\\n.webix_gage_max_range {\\n right: -23%;\\n}\\n.webix_gage_min_range,\\n.webix_gage_max_range {\\n display: inline-block;\\n margin-top: 20px;\\n position: absolute;\\n text-align: center;\\n width: 46%;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_gage_range_info {\\n font-size: 1.2em;\\n line-height: 1;\\n}\\n.webix_gage_value {\\n font-size: 2.2em;\\n color: #475466;\\n}\\n.webix_gage_value,\\n.webix_gage_range_info {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_gage_gradient_point_animated {\\n transition: transform 1.3s linear;\\n}\\n.webix_gage_animated {\\n stroke: hsl(120, 100%, 50%);\\n animation: gage_dash 1.3s linear forwards;\\n transition: stroke 1.3s linear, stroke-dasharray 1.3s linear;\\n}\\n@keyframes gage_dash {\\n to {\\n stroke-dashoffset: 0;\\n }\\n}\\n.webix_gage_small_font .webix_gage_info,\\n.webix_gage_small_font .webix_gage_range_info {\\n font-size: 1em;\\n}\\n.webix_gage_small_font .webix_gage_label,\\n.webix_gage_small_font .webix_gage_value {\\n font-weight: 500;\\n font-size: 1.2em;\\n}\\n.webix_gage_small_font .webix_gage_min_range,\\n.webix_gage_small_font .webix_gage_max_range {\\n margin-top: 0;\\n}\\n.webix_gage_small_font .webix_gage_placeholder {\\n margin-top: 0;\\n padding-top: 20px;\\n}\\n.webix_bullet_header {\\n font-weight: 500;\\n}\\n.webix_bullet_header,\\n.webix_bullet_subheader {\\n font-size: 14px;\\n fill: #475466;\\n}\\n.webix_bullet_scale {\\n fill: #74869f;\\n font-size: 12px;\\n font-weight: 500;\\n stroke: none;\\n text-anchor: middle;\\n}\\n.webix_bullet_scale_lines {\\n stroke: #74869f;\\n}\\n.webix_bullet_marker {\\n y: 5px;\\n width: 3px;\\n}\\n.webix_timeline .webix_scroll_cont {\\n padding-top: 28px;\\n}\\n.webix_timeline_item {\\n line-height: 0;\\n padding: 0 12px;\\n position: relative;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_timeline_date,\\n.webix_timeline_event {\\n line-height: 20px;\\n overflow: hidden;\\n position: absolute;\\n top: 0px;\\n}\\n.webix_timeline_left .webix_timeline_date,\\n.webix_timeline_right .webix_timeline_details,\\n.webix_timeline_right .webix_timeline_value {\\n text-align: right;\\n}\\n.webix_timeline_value {\\n font-weight: 500;\\n}\\n.webix_timeline_details {\\n color: #94A1B3;\\n padding-top: 2px;\\n}\\n.webix_timeline_date {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_timeline_horizontal .webix_scroll_cont {\\n white-space: nowrap;\\n display: inline-block;\\n padding-left: 28px;\\n height: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_timeline_horizontal .webix_timeline_item {\\n display: inline-block;\\n height: 100%;\\n padding: 12px 0 12px 0;\\n white-space: normal;\\n}\\n.webix_timeline_horizontal .webix_timeline_item .webix_timeline_date,\\n.webix_timeline_horizontal .webix_timeline_item .webix_timeline_event {\\n left: 0px;\\n}\\n.webix_timeline_horizontal .webix_timeline_item.webix_timeline_bottom .webix_timeline_event {\\n top: initial;\\n}\\n.webix_treemap {\\n background-color: #f5f5f5;\\n}\\n.webix_treemap .webix_scroll_cont {\\n position: relative;\\n height: 100%;\\n width: 100%;\\n}\\n.webix_treemap_item {\\n position: absolute;\\n color: #444;\\n overflow: hidden;\\n text-align: left;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 3px 5px;\\n border-width: 0px 1px 1px 0;\\n border-style: solid;\\n border-color: rgba(0, 0, 0, 0.2);\\n background: transparent;\\n cursor: pointer;\\n}\\n.webix_treemap_level_top {\\n z-index: 1;\\n border-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_treemap_item_bottom {\\n border-bottom-width: 0;\\n}\\n.webix_treemap_item_right {\\n border-right-width: 0;\\n}\\n.webix_treemap_item:hover {\\n box-shadow: inset 0 0 5px #666;\\n}\\n.webix_treemap_item.webix_selected {\\n border-color: #F4F5F9;\\n box-shadow: inset 0 0 1px 2px #F4F5F9;\\n}\\n.webix_treemap_header {\\n width: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_treemap_header {\\n padding: 0 10px;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_treemap_header_item {\\n cursor: pointer;\\n}\\n.webix_treemap_header_item:last-child {\\n cursor: default;\\n}\\n.webix_treemap_reset {\\n float: right;\\n width: 25px;\\n text-align: center;\\n}\\n.webix_treemap_reset:before {\\n content: \\\"\\\\F011\\\";\\n color: #475466;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 16px;\\n display: block;\\n cursor: pointer;\\n}\\n.webix_treemap_path_icon {\\n width: 20px;\\n text-align: center;\\n}\\n.webix_barcode {\\n position: relative;\\n}\\n.webix_barcode .webix_canvas_text {\\n font-size: 14px;\\n padding: 0 2px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.portlet_drag {\\n position: absolute;\\n z-index: 1;\\n top: 5px;\\n right: 5px;\\n width: 18px;\\n opacity: 0.5;\\n cursor: pointer;\\n}\\n.portlet_in_drag {\\n opacity: 0.4;\\n}\\n.portlet_marker,\\n.portlet_markertop,\\n.portlet_markerbottom,\\n.portlet_markerleft,\\n.portlet_markerright {\\n opacity: 0.5;\\n background: #9169BE;\\n position: absolute;\\n z-index: 2;\\n transition: top 0.5s, left 0.5s, width 0.5s, height 0.5s;\\n top: 0px;\\n left: 0px;\\n width: 100%;\\n height: 100%;\\n}\\n.portlet_markertop {\\n height: 50%;\\n}\\n.portlet_markerbottom {\\n height: 50%;\\n top: 50%;\\n}\\n.portlet_markerleft {\\n width: 50%;\\n}\\n.portlet_markerright {\\n width: 50%;\\n left: 50%;\\n}\\n.panel_icon {\\n position: absolute;\\n z-index: 93;\\n top: 5px;\\n right: 5px;\\n line-height: normal;\\n font-size: 13px;\\n width: 18px;\\n opacity: 0.5;\\n cursor: pointer;\\n}\\n.webix_disabled_view .panel_icon {\\n z-index: 91;\\n}\\n.panel_target {\\n position: absolute;\\n z-index: 3;\\n background: rgba(0, 0, 0, 0.04);\\n border: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_left {\\n border-width: 0 1px 0 0;\\n box-shadow: 2px 0 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_left.webix_animate {\\n transition: left 0.6s;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_right {\\n left: auto;\\n border-width: 0 0 0 1px;\\n box-shadow: -2px 0px 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_right.webix_animate {\\n transition: right 0.6s;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_top {\\n border-width: 0 0 1px 0 ;\\n box-shadow: 0 2px 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_top .webix_win_body {\\n position: relative;\\n}\\n.webix_sidemenu_top .webix_win_body > .webix_view {\\n position: absolute;\\n top: auto;\\n left: 0;\\n bottom: 0;\\n}\\n.webix_sidemenu_top.webix_animate,\\n.webix_sidemenu_top.webix_animate .webix_win_body {\\n transition: height 0.6s;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_bottom {\\n border-width: 1px 0 0 0 ;\\n top: auto;\\n box-shadow: 0 -2px 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_bottom.webix_animate,\\n.webix_sidemenu_bottom.webix_animate .webix_win_body {\\n transition: height 0.6s;\\n}\\n/* SideBar*/\\n.webix_sidebar {\\n background: #ECEFF1;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected:focus span {\\n background: transparent;\\n}\\n.webix_sidebar .webix_tree_item {\\n color: #454545;\\n height: 44px;\\n line-height: 43px;\\n}\\n.webix_sidebar .webix_scroll_cont > .webix_tree_leaves {\\n display: block;\\n padding: 0;\\n}\\n.webix_sidebar .webix_tree_leaves .webix_tree_leaves {\\n margin-left: 0px;\\n}\\n.webix_sidebar_selected,\\n.webix_sidebar_expanded .webix_tree_item:hover {\\n background-color: rgba(0, 0, 0, 0.02);\\n}\\n.webix_sidebar .webix_tree_item.webix_selected,\\n.webix_sidebar .webix_tree_item.webix_selected span {\\n background-color: #F4F5F9;\\n padding-right: 0;\\n}\\n.webix_sidebar .webix_tree_branch_1 .webix_tree_item {\\n padding-left: 44px;\\n}\\n.webix_sidebar .webix_tree_branch_1 > .webix_tree_item {\\n height: 44px;\\n line-height: 44px;\\n padding-left: 0;\\n}\\n.webix_sidebar .webix_tree_branch_1 {\\n border-bottom: 1px solid #e5e5e5;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected span,\\n.webix_sidebar .webix_tree_item span {\\n margin: 0;\\n padding: 0px;\\n}\\n.webix_icon.webix_sidebar_icon {\\n width: 44px;\\n text-align: center;\\n}\\nspan.webix_sidebar_dir_icon {\\n float: right;\\n line-height: inherit;\\n}\\n/*SubMenu (Popup) */\\n.webix_sidebar_popup {\\n border: none !important;\\n box-shadow: 2px 3px 3px #ddd;\\n}\\n.webix_sidebar_popup,\\n.webix_sidebar_popup .webix_list_item {\\n border-radius: 0;\\n}\\n.webix_sidebar_popup_right {\\n box-shadow: -3px 3px 3px #ddd;\\n}\\n.webix_sidebar_popup_list.webix_sidebar_popup_left .webix_icon {\\n float: right;\\n line-height: inherit;\\n width: 8px;\\n}\\n.webix_sidebar_popup_list.webix_sidebar_popup_right .webix_icon {\\n float: left;\\n line-height: inherit;\\n}\\n/*SubMenu: title*/\\n.webix_sidebar_popup_title {\\n background: #ECEFF1;\\n}\\n.webix_sidebar_popup_title.webix_selected {\\n border-left-color: #F4F5F9;\\n background: #F4F5F9;\\n}\\n.webix_sidebar_popup_title .webix_template {\\n line-height: 44px;\\n padding: 0 10px;\\n border: 1px solid #E5E5E5;\\n border-left: none;\\n}\\n.webix_sidebar_popup_right .webix_sidebar_popup_title .webix_template {\\n border: 1px solid #E5E5E5;\\n border-right: none;\\n}\\n.webix_sidebar_selected.webix_sidebar_popup_title .webix_template {\\n background: rgba(0, 0, 0, 0.03);\\n border-left: none;\\n}\\n.webix_sidebar_popup_list .webix_list_item {\\n border-left: 1px solid #E5E5E5;\\n border-right: 1px solid #E5E5E5;\\n}\\n/*SubMenu: list*/\\n.webix_sidebar_popup_list .webix_list_item:first-child {\\n border-top: 1px solid #E5E5E5;\\n}\\n.webix_sidebar_popup_list .webix_list_item:hover {\\n background: #f6f9fb;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_selected:hover {\\n background: #F4F5F9;\\n}\\n.webix_menu .webix_list_item.webix_sidebar_selected {\\n background: rgba(0, 0, 0, 0.02);\\n}\\n.webix_menu .webix_list_item.webix_sidebar_selected:hover {\\n background: rgba(0, 0, 0, 0.02) !important;\\n}\\n.webix_view.webix_pdf {\\n background-color: #404040;\\n overflow: auto;\\n}\\n.webix_pdf .canvas_wrapper {\\n margin: 0px auto;\\n box-shadow: 5px 5px 15px #1c1c1c;\\n width: 100%;\\n height: 100%;\\n}\\n.webix_toolbar.pdf_bar .webix_img_btn {\\n text-align: center;\\n}\\n.webix_toolbar.pdf_bar .webix_view {\\n background-color: transparent;\\n}\\n.webix_toolbar.pdf_bar .webix_icon_btn {\\n margin: 0;\\n}\\n.webix_toolbar.pdf_bar .webix_template {\\n background-color: transparent;\\n color: #fff;\\n line-height: 2em;\\n}\\n.webix_toolbar.pdf_bar .webix_el_box input,\\n.webix_toolbar.pdf_bar .webix_inp_static {\\n background-color: #5c5c5c;\\n color: #fff;\\n border-color: #404040;\\n}\\n.webix_toolbar.pdf_bar .webix_el_box input:focus,\\n.webix_toolbar.pdf_bar .webix_inp_static:focus {\\n border-color: #333;\\n}\\n.webix_toolbar.pdf_bar .webix_el_box .webix_input_icon {\\n color: #fff;\\n}\\n.webix_view.webix_popup.pdf_opt_list {\\n border: none;\\n}\\n.pdf_opt_list .webix_list {\\n background-color: #404040;\\n color: #fff;\\n}\\n.pdf_opt_list .webix_list .webix_list_item {\\n border-color: #474747;\\n line-height: 1.5em;\\n}\\n.pdf_opt_list .webix_list .webix_list_item.webix_selected,\\n.pdf_opt_list .webix_list .webix_list_item:hover {\\n color: #404040;\\n background-color: #fff;\\n}\\n.webix_dbllist .bottom_label {\\n text-align: center;\\n font-size: 10px;\\n}\\n.webix_dbllist .webix_list,\\n.webix_dbllist .bottom_label {\\n background: #ededed;\\n}\\n.webix_dbllist .webix_list_item {\\n background: #FFFFFF;\\n margin: 3px 4px 0px 4px;\\n border: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_dbllist .webix_list_item.webix_selected {\\n border-bottom-color: #DADEE0;\\n background-color: #F4F5F9;\\n color: #475466;\\n}\\n.webix_dbllist .dbllist_button {\\n width: 45%;\\n height: 30px;\\n margin-top: 4px;\\n padding: 0;\\n border-radius: 2px;\\n border: 1px solid #DADEE0;\\n cursor: pointer;\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n background-color: #F4F5F9;\\n}\\n.webix_dbllist .dbllist_button .webix_icon {\\n color: #1CA1C1;\\n font-size: 20px;\\n width: 26px;\\n}\\n.webix_dbllist .dbllist_button:first-child {\\n margin-top: 36px;\\n margin-right: 4px;\\n}\\n.webix_dbllist .dbllist_button:last-child {\\n margin-left: 4px;\\n}\\n.webix_dbllist .dbllist_button:hover,\\n.webix_dbllist .dbllist_button:focus,\\n.webix_dbllist .dbllist_button:active {\\n background-color: #e7e9f2;\\n}\\n.webix_invalid .webix_list {\\n background: #f8e2e2;\\n}\\n.dbllist_buttons .webix_template {\\n padding: 0 0 0 4px;\\n}\\n.webix_sparklines {\\n padding: 1px 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_sparklines svg {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_sparklines_line {\\n stroke: #3498db;\\n stroke-width: 1;\\n fill: transparent;\\n stroke-linecap: round;\\n}\\n.webix_sparklines_item {\\n fill: #3498db;\\n stroke-width: 1;\\n}\\n.webix_sparklines_bar {\\n fill: #6dbcf0;\\n}\\n.webix_sparklines_bar_negative {\\n fill: #d86c79;\\n}\\n.webix_sparklines_area {\\n fill: #e5eef4;\\n opacity: 0.5;\\n}\\n.webix_sparklines_origin {\\n stroke: #888;\\n stroke-width: 1;\\n fill: transparent;\\n}\\n.webix_sparklines_event_area {\\n fill: transparent;\\n}\\n.webix_sparklines_donut_hole {\\n fill: #FFFFFF;\\n}\\n.webix_sparklines_line_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_area_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_splinearea_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_radar_chart .webix_sparklines_event_area:hover {\\n fill: rgba(220, 220, 220, 0.4);\\n stroke: rgba(255, 255, 255, 0.6);\\n}\\n.webix_sparklines_pie_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_bar_chart .webix_sparklines_event_area:hover {\\n fill: rgba(255, 255, 255, 0.3);\\n}\\n/* print css rules*/\\n.webix_ui_print,\\n.webix_print_pdf {\\n display: none;\\n}\\nbody.webix_print {\\n margin-top: 0px;\\n}\\n@media print {\\n body.webix_print {\\n overflow: visible !important;\\n background-color: none !important;\\n }\\n body.webix_print > * {\\n display: none;\\n }\\n body.webix_print * {\\n visibility: hidden;\\n }\\n .webix_ui_print {\\n display: block !important;\\n margin: 0 0 0 0!important;\\n visibility: visible !important;\\n }\\n .webix_ui_print * {\\n visibility: visible !important;\\n }\\n .webix_print_noscroll {\\n height: auto !important;\\n width: auto !important;\\n }\\n .webix_print_noscroll,\\n .webix_print_noscroll .webix_scroll_cont {\\n overflow: visible !important;\\n }\\n .webix_print_pagebreak {\\n page-break-after: always;\\n }\\n .webix_print_header,\\n .webix_print_footer {\\n display: block !important;\\n padding: 20px 0px;\\n text-align: center;\\n height: auto !important;\\n visibility: visible !important;\\n }\\n .webix_print_header *,\\n .webix_print_footer * {\\n visibility: visible !important;\\n }\\n /*datatable specific*/\\n .webix_table_print {\\n display: table;\\n visibility: visible !important;\\n table-layout: fixed;\\n width: 100%;\\n border: 1px solid #ebebeb;\\n margin-bottom: 20px;\\n position: initial;\\n }\\n .webix_table_print td {\\n overflow: hidden;\\n }\\n .webix_table_print tr {\\n page-break-inside: avoid;\\n }\\n .webix_table_print .webix_print_top_split .webix_cell {\\n border-bottom: 1px solid #d2d2d2;\\n }\\n .webix_table_print .webix_cell {\\n display: table-cell !important;\\n border-right: 1px solid #ebebeb;\\n border-bottom: 1px solid #ebebeb;\\n padding: 0px 10px;\\n white-space: nowrap;\\n }\\n .webix_table_print .webix_header_cell {\\n display: table-cell;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n background: #F4F5F9;\\n border-right: 1px solid #DADEE0;\\n border-bottom: 1px solid #DADEE0;\\n }\\n .webix_table_print .webix_footer_cell {\\n display: table-cell;\\n background: #fafafa;\\n border-right: 1px solid #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n border-bottom: 1px solid #EDEFF0;\\n }\\n .webix_table_print .webix_cell.webix_dtable_span {\\n position: initial !important;\\n white-space: normal;\\n }\\n .webix_table_print .webix_rotate {\\n transform-origin: center 40% !important;\\n }\\n .webix_table_print.borderless,\\n .webix_table_print.borderless .webix_cell {\\n border: none;\\n }\\n /* x-list specific*/\\n .webix_table_print.webix_view.webix_list-x {\\n white-space: normal;\\n }\\n .webix_table_print.webix_view.webix_list-x .webix_list_item {\\n display: table-cell;\\n }\\n}\\n.webix_fullscreen_html .webix_template > * {\\n width: 100% !important;\\n height: 100% !important;\\n margin: 0px !important;\\n}\\n.webix_icon,\\n.webix_icon_btn,\\n.webix_input_icon {\\n display: inline-block;\\n font-family: \\\"Webix Material Icons\\\";\\n font-style: normal;\\n font-weight: normal;\\n line-height: 1;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n transform: translate(0, 0);\\n}\\n.webix_icon,\\n.webix_input_icon {\\n font-size: 17px;\\n display: inline-block;\\n width: 20px;\\n}\\n.webix_input_icon {\\n float: right;\\n font-size: 20px;\\n color: #94A1B3;\\n}\\n.webix_icon_button {\\n background-color: transparent;\\n border: none;\\n padding: 0;\\n cursor: pointer;\\n vertical-align: middle;\\n}\\n.webix_el_icon .webix_el_box {\\n padding: 0;\\n margin: 0 auto;\\n text-align: center;\\n position: relative;\\n overflow: visible;\\n cursor: pointer;\\n}\\n.webix_icon_button .webix_icon {\\n font-size: 20px;\\n height: 20px;\\n width: 20px;\\n display: inline-block;\\n text-align: center;\\n color: #94A1B3;\\n}\\n.webix_icon_btn {\\n font-size: 20px;\\n display: inline-block;\\n text-align: center;\\n width: 20px;\\n margin-right: 4px;\\n color: #94A1B3;\\n}\\n.webix_icon {\\n text-align: center;\\n}\\n.webix_badge {\\n background-color: #ff8839;\\n color: #FFFFFF;\\n border-radius: 11px;\\n font-size: 12px;\\n height: 22px;\\n min-width: 22px;\\n padding: 0 4px;\\n text-align: center;\\n line-height: 22px;\\n position: absolute;\\n right: 0;\\n top: 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_badge.webix_measure_size {\\n right: auto;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_list_item .webix_badge {\\n position: static;\\n float: right;\\n margin: 4px -5px 0 12px;\\n}\\n@font-face {\\n font-family: Roboto;\\n src: url('fonts/Roboto-Regular-webfont.woff2') format('woff2'), url('fonts/Roboto-Regular-webfont.woff') format('woff');\\n font-weight: normal;\\n font-style: normal;\\n}\\n@font-face {\\n font-family: Roboto;\\n src: url('fonts/Roboto-Medium-webfont.woff2') format('woff2'), url('fonts/Roboto-Medium-webfont.woff') format('woff');\\n font-style: normal;\\n font-weight: 500;\\n}\\n.mainFont {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.buttonFont {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n}\\n.selectFocusRule {\\n background: #edeff5;\\n}\\n.layoutBarBG .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.layoutBarBG.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.layoutBarBG.webix_dark .webix_el_button,\\n.layoutBarBG.webix_dark .webix_el_label .webix_el_box,\\n.layoutBarBG.webix_dark .webix_inp_label,\\n.layoutBarBG.webix_dark .webix_inp_top_label,\\n.layoutBarBG.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_secondary .webix_icon,\\n.layoutBarBG.webix_dark .webix_transparent .webix_icon,\\n.layoutBarBG.webix_dark .webix_secondary .webix_img_btn_text,\\n.layoutBarBG.webix_dark .webix_transparent .webix_img_btn_text,\\n.layoutBarBG.webix_dark .webix_secondary .webix_icon_btn,\\n.layoutBarBG.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_transparent button:hover,\\n.layoutBarBG.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.layoutBarBG.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_secondary button,\\n.layoutBarBG.webix_dark .webix_inp_counter_next,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev,\\n.layoutBarBG.webix_dark .webix_segment_0,\\n.layoutBarBG.webix_dark .webix_segment_1,\\n.layoutBarBG.webix_dark .webix_segment_N,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.layoutBarBG.webix_dark .webix_secondary button:hover,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item:hover,\\n.layoutBarBG.webix_dark .webix_inp_counter_next:hover,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev:hover,\\n.layoutBarBG.webix_dark .webix_segment_0:hover,\\n.layoutBarBG.webix_dark .webix_segment_1:hover,\\n.layoutBarBG.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_secondary button:focus,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item:focus,\\n.layoutBarBG.webix_dark .webix_inp_counter_next:focus,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev:focus,\\n.layoutBarBG.webix_dark .webix_segment_0:focus,\\n.layoutBarBG.webix_dark .webix_segment_1:focus,\\n.layoutBarBG.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_secondary button:active,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item:active,\\n.layoutBarBG.webix_dark .webix_inp_counter_next:active,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev:active,\\n.layoutBarBG.webix_dark .webix_segment_0:active,\\n.layoutBarBG.webix_dark .webix_segment_1:active,\\n.layoutBarBG.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_inp_static,\\n.layoutBarBG.webix_dark input[type=text],\\n.layoutBarBG.webix_dark input[type=combo],\\n.layoutBarBG.webix_dark input[type=datepicker],\\n.layoutBarBG.webix_dark textarea,\\n.layoutBarBG.webix_dark select,\\n.layoutBarBG.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.layoutBarBG.webix_dark .webix_el_texthighlight input,\\n.layoutBarBG.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.layoutBarBG.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.layoutBarBG.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_multicombo_value,\\n.layoutBarBG.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.layoutBarBG.webix_dark .webix_inp_static:focus,\\n.layoutBarBG.webix_dark input[type=text]:focus,\\n.layoutBarBG.webix_dark input[type=combo]:focus,\\n.layoutBarBG.webix_dark input[type=datepicker]:focus,\\n.layoutBarBG.webix_dark textarea:focus,\\n.layoutBarBG.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.layoutBarBG.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.layoutBarBG.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0:hover,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1:hover,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0:focus,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1:focus,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0:active,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1:active,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.layoutBarBG.webix_dark .webix_el_icon,\\n.layoutBarBG.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.layoutBarBG.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.layoutBarBG.webix_dark .webix_icon_button:hover .webix_icon,\\n.layoutBarBG.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.layoutBarBG.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.layoutBarBG.webix_dark .webix_custom_checkbox,\\n.layoutBarBG.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_custom_checkbox:focus,\\n.layoutBarBG.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.layoutBarBG.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.layoutBarBG.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.layoutBarBG.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.layoutBarBG.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.layoutBarBG.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box input,\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box select,\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box textarea,\\n.layoutBarBG.webix_dark input.webix_invalid,\\n.layoutBarBG.webix_dark select.webix_invalid,\\n.layoutBarBG.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.layoutBarBG.webix_dark .webix_invalid .webix_multicombo_value,\\n.layoutBarBG.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_toolbar.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_toolbar.webix_dark .webix_el_button,\\n.webix_toolbar.webix_dark .webix_el_label .webix_el_box,\\n.webix_toolbar.webix_dark .webix_inp_label,\\n.webix_toolbar.webix_dark .webix_inp_top_label,\\n.webix_toolbar.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_secondary .webix_icon,\\n.webix_toolbar.webix_dark .webix_transparent .webix_icon,\\n.webix_toolbar.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_toolbar.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_toolbar.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_toolbar.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_transparent button:hover,\\n.webix_toolbar.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_secondary button,\\n.webix_toolbar.webix_dark .webix_inp_counter_next,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev,\\n.webix_toolbar.webix_dark .webix_segment_0,\\n.webix_toolbar.webix_dark .webix_segment_1,\\n.webix_toolbar.webix_dark .webix_segment_N,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_toolbar.webix_dark .webix_secondary button:hover,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_toolbar.webix_dark .webix_inp_counter_next:hover,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev:hover,\\n.webix_toolbar.webix_dark .webix_segment_0:hover,\\n.webix_toolbar.webix_dark .webix_segment_1:hover,\\n.webix_toolbar.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_secondary button:focus,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_toolbar.webix_dark .webix_inp_counter_next:focus,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev:focus,\\n.webix_toolbar.webix_dark .webix_segment_0:focus,\\n.webix_toolbar.webix_dark .webix_segment_1:focus,\\n.webix_toolbar.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_secondary button:active,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_toolbar.webix_dark .webix_inp_counter_next:active,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev:active,\\n.webix_toolbar.webix_dark .webix_segment_0:active,\\n.webix_toolbar.webix_dark .webix_segment_1:active,\\n.webix_toolbar.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_inp_static,\\n.webix_toolbar.webix_dark input[type=text],\\n.webix_toolbar.webix_dark input[type=combo],\\n.webix_toolbar.webix_dark input[type=datepicker],\\n.webix_toolbar.webix_dark textarea,\\n.webix_toolbar.webix_dark select,\\n.webix_toolbar.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_dark .webix_el_texthighlight input,\\n.webix_toolbar.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_multicombo_value,\\n.webix_toolbar.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_toolbar.webix_dark .webix_inp_static:focus,\\n.webix_toolbar.webix_dark input[type=text]:focus,\\n.webix_toolbar.webix_dark input[type=combo]:focus,\\n.webix_toolbar.webix_dark input[type=datepicker]:focus,\\n.webix_toolbar.webix_dark textarea:focus,\\n.webix_toolbar.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_toolbar.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_toolbar.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_toolbar.webix_dark .webix_el_icon,\\n.webix_toolbar.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_toolbar.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_toolbar.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_toolbar.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_toolbar.webix_dark .webix_custom_checkbox,\\n.webix_toolbar.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_custom_checkbox:focus,\\n.webix_toolbar.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_toolbar.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_toolbar.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_toolbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_toolbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_toolbar.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box input,\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box select,\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_toolbar.webix_dark input.webix_invalid,\\n.webix_toolbar.webix_dark select.webix_invalid,\\n.webix_toolbar.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_toolbar.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_toolbar.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_layout_space > .webix_toolbar {\\n border-radius: 2px;\\n}\\n.webix_view.webix_layout_accordion {\\n background-color: #EBEDF0;\\n}\\n.webix_accordionitem .webix_accordionitem_button {\\n float: right;\\n position: relative;\\n height: 19px;\\n width: 19px;\\n margin: 13.5px 13px;\\n}\\n.webix_accordionitem .webix_accordionitem_header {\\n line-height: 44px;\\n}\\n.webix_accordionitem .webix_accordionitem_header:hover,\\n.webix_accordionitem .webix_accordionitem_header:focus {\\n background-color: #fafafa;\\n}\\n.webix_accordionitem.collapsed .webix_accordionitem_button {\\n float: right;\\n position: relative;\\n margin-top: 12.5px;\\n}\\n.webix_accordionitem.horizontal.collapsed,\\n.webix_accordionitem.collapsed {\\n background-color: #F4F5F9;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header,\\n.webix_accordionitem.collapsed .webix_accordionitem_header {\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header .webix_accordionitem_button,\\n.webix_accordionitem.collapsed .webix_accordionitem_header .webix_accordionitem_button {\\n color: #1CA1C1;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header .webix_accordionitem_label .webix_icon,\\n.webix_accordionitem.collapsed .webix_accordionitem_header .webix_accordionitem_label .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:hover,\\n.webix_accordionitem.collapsed .webix_accordionitem_header:hover,\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:focus,\\n.webix_accordionitem.collapsed .webix_accordionitem_header:focus {\\n background-color: #edeff5;\\n}\\n.webix_accordionitem_label {\\n padding-left: 12px;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header .webix_accordionitem_button {\\n color: #FFFFFF;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header.collapsed {\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header.collapsed .webix_accordionitem_button {\\n color: #1CA1C1;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header:hover,\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header:focus {\\n background-color: #61707e;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:hover,\\n.webix_layout_accordion.webix_dark .webix_accordionitem.collapsed .webix_accordionitem_header:hover,\\n.webix_layout_accordion.webix_dark .webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:focus,\\n.webix_layout_accordion.webix_dark .webix_accordionitem.collapsed .webix_accordionitem_header:focus {\\n background-color: #edeff5;\\n}\\n.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button {\\n color: #94A1B3;\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n text-align: center;\\n width: 24px;\\n height: 43px;\\n margin: 0 10px 0 10px;\\n}\\n.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_label .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F002';\\n}\\n.webix_accordionitem .webix_accordionitem_header.collapsed .webix_accordionitem_button:before {\\n content: '\\\\F004';\\n}\\n.webix_accordionitem.horizontal:last-child > .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F003';\\n}\\n.webix_accordionitem.horizontal.collapsed:last-child > .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F001';\\n}\\n.webix_accordionitem.vertical > .webix_accordionitem_header .webix_accordionitem_button {\\n height: 43px;\\n margin: 0px 10px 0 10px;\\n}\\n.webix_accordionitem.vertical > .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F004';\\n}\\n.webix_accordionitem.vertical > .webix_accordionitem_header.collapsed .webix_accordionitem_button:before {\\n content: '\\\\F001';\\n}\\n.webix_toolbar.webix_layout_subbar {\\n background: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar .webix_view {\\n color: #475466;\\n}\\n.webix_el_tabbar + .webix_multiview {\\n background-color: #FFFFFF;\\n}\\n.webix_layout_space > .webix_view,\\n.webix_layout_wide > .webix_view {\\n border-radius: 2px;\\n}\\n.webix_layout_space .webix_layout_accordion .webix_accordionitem,\\n.webix_layout_wide .webix_layout_accordion .webix_accordionitem {\\n border-radius: 2px;\\n}\\n.webix_popup_button {\\n border-color: #F4F5F9;\\n}\\n.webix_popup_button.confirm {\\n border-color: #1CA1C1;\\n}\\n.webix_popup_button div {\\n border-radius: 0;\\n}\\n.dataHeaderFont {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_dtable .webix_ss_header .webix_hcell,\\n.webix_dtable .webix_ss_footer .webix_hcell {\\n border-color: transparent;\\n}\\n.webix_dtable .webix_ss_body .webix_column > div,\\n.webix_dtable .webix_ss_body .webix_table_cell {\\n border-right-color: transparent;\\n border-left-color: transparent;\\n}\\n.webix_dtable.webix_header_border .webix_ss_header .webix_hcolumn > div,\\n.webix_dtable.webix_header_border .webix_ss_header .webix_span {\\n border-right-color: #DADEE0;\\n border-bottom-color: #DADEE0;\\n}\\n.webix_dtable.webix_footer_border .webix_ss_footer .webix_hcolumn > div,\\n.webix_dtable.webix_footer_border .webix_ss_footer .webix_span {\\n border-right-color: #DADEE0;\\n border-top-color: #DADEE0;\\n}\\n.webix_dtable.webix_data_border .webix_ss_body .webix_column > div,\\n.webix_dtable.webix_data_border .webix_table_cell {\\n border-right-color: #EDEFF0;\\n}\\n.webix_dtable .webix_ss_left .webix_column.webix_last > div,\\n.webix_dtable .webix_table_cell.webix_last_rightcell {\\n border-right: 1px solid #ccd2d4;\\n}\\n.webix_dtable div.webix_last_topcell {\\n border-bottom: 1px solid #ccd2d4;\\n}\\n.webix_dtable .webix_ss_right .webix_column.webix_first > div {\\n border-left: 1px solid #ccd2d4;\\n}\\n.webix_dtable .webix_hs_right .webix_hcell.webix_first {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_dtable .webix_hs_left .webix_hcell.webix_last {\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_dtable .webix_hcell.webix_ss_filter {\\n padding: 0px 4px;\\n}\\n.webix_dtable .webix_hcell.webix_div_filter {\\n padding: 1px 4px;\\n}\\n.webix_dtable .webix_dtable_subview {\\n background: #FFFFFF;\\n}\\n.webix_dtable .webix_dtable_subview .webix_view {\\n border-left-width: 1px;\\n border-right-width: 1px;\\n border-color: #EDEFF0;\\n}\\n.webix_dtable .webix_ss_filter select,\\n.webix_dtable .webix_ss_filter input {\\n height: 32px;\\n vertical-align: middle;\\n border-radius: 2px;\\n border-color: #CCD7E6;\\n}\\n.webix_dtable .webix_ss_filter select:focus,\\n.webix_dtable .webix_ss_filter input:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_dtable .webix_select_mark > div.webix_row_select {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_dtable .webix_ss_header .webix_hcolumn div.webix_last_row,\\n.webix_dtable .webix_ss_header .webix_span.webix_last_row {\\n border-bottom: 1px solid #5ccce7;\\n}\\n.webix_dtable .webix_ss_footer .webix_hcolumn > div:first-child,\\n.webix_dtable .webix_ss_footer .webix_hcell[row=\\\"0\\\"] {\\n border-top: 1px solid #5ccce7;\\n}\\n.webix_dtable .webix_ss_footer,\\n.webix_dtable .webix_ss_footer .webix_hcolumn,\\n.webix_dtable .webix_ss_footer .webix_hs_left,\\n.webix_dtable .webix_ss_footer .webix_hs_center,\\n.webix_dtable .webix_ss_footer .webix_hs_right,\\n.webix_dtable .webix_ss_footer div.webix_ss_vscroll_footer {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n background: #F4F5F9;\\n}\\n.webix_dtable .webix_column > .webix_drag_over.webix_cell {\\n background-color: #F4F5F9;\\n}\\n.webix_block_selection {\\n border: none;\\n background: #1CA1C1;\\n opacity: 0.1;\\n}\\n.webix_area_selection,\\n.webix_area_selection_handle {\\n background: #1CA1C1;\\n}\\n.webix_dtable_focused .webix_area_selection,\\n.webix_dtable_focused .webix_area_selection_handle {\\n background-color: #1992af;\\n}\\n.dtBodyCell {\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_dtable div.webix_ss_vscroll_header {\\n border-bottom-color: #5ccce7;\\n}\\n.webix_dtable div.webix_ss_vscroll_footer {\\n border-top-color: #5ccce7;\\n border-left-color: #DADEE0;\\n}\\n.webix_view .webix_dt_editor input,\\n.webix_view .webix_dt_editor select {\\n border-color: #1CA1C1;\\n border-radius: 2px;\\n}\\n.dataItemStyle {\\n border-color: #EDEFF0;\\n}\\n.webix_list_item.webix_group_back {\\n color: #313131;\\n background: #F4F5F9;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_dataview_item {\\n border-right-color: #EDEFF0;\\n line-height: 24px;\\n}\\n.webix_dataview_item.webix_selected {\\n box-shadow: none;\\n}\\n.webix_dataview_item.tiles.webix_selected {\\n border-color: #5ccce7;\\n}\\n.webix_view .webix_pager_item {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n outline: none;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_view .webix_pager_item:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_view .webix_pager_item:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_view .webix_pager_item:active {\\n background-color: #daddeb;\\n}\\n.webix_view .webix_pager_item_selected {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_view .webix_pager_item_selected:hover {\\n background-color: #1992af;\\n}\\n.webix_view .webix_pager_item_selected:focus {\\n background-color: #1992af;\\n}\\n.webix_view .webix_pager_item_selected:active {\\n background-color: #17839d;\\n}\\n.webix_view .webix_pager_item,\\n.webix_view .webix_pager_item_selected {\\n border-radius: 2px;\\n border-width: 0px;\\n}\\n.webix_list .webix_unit_header {\\n font-weight: normal;\\n text-shadow: none;\\n border-bottom: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background: #F4F5F9;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_list .webix_unit_header:not(:first-child) {\\n border-top: 1px solid #DADEE0;\\n margin-top: -1px;\\n}\\n.webix_tree .webix_tree_item.webix_selected {\\n background-color: #F4F5F9;\\n}\\n.webix_tree .webix_tree_item.webix_selected:focus {\\n background-color: #edeff5;\\n}\\n.webix_tree .webix_tree_item.webix_selected span {\\n background-color: transparent;\\n padding: 0;\\n margin: 0;\\n}\\n.webix_tree .webix_tree_item.webix_selected div {\\n background-color: transparent;\\n}\\n.webix_tree .webix_tree_item,\\n.webix_tree .webix_tree_item.webix_selected {\\n padding-right: 12px;\\n}\\n.webix_tree_open,\\n.webix_tree_close {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n text-align: center;\\n color: #94A1B3;\\n}\\n.webix_tree_open:before {\\n margin-left: -2px;\\n content: \\\"\\\\F027\\\";\\n}\\n.webix_tree_close:before {\\n margin-left: -2px;\\n content: \\\"\\\\F028\\\";\\n}\\n.webix_tree_folder,\\n.webix_tree_folder_open,\\n.webix_tree_file {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 20px;\\n margin: 0 4px 0 0;\\n width: 24px;\\n text-align: center;\\n color: #DADEE0;\\n}\\n.webix_tree_folder:before {\\n content: \\\"\\\\F030\\\";\\n}\\n.webix_tree_folder_open:before {\\n content: \\\"\\\\F031\\\";\\n}\\n.webix_tree_file:before {\\n content: \\\"\\\\F032\\\";\\n}\\n.webix_menu-x .webix_list_item .webix_submenu_icon,\\n.webix_view.webix_menu .webix_list_item .webix_submenu_icon {\\n font-size: 14px;\\n font-family: \\\"Webix Material Icons\\\";\\n width: 6px;\\n top: 0;\\n margin-left: 0;\\n}\\n.webix_view.webix_popup.webix_menu {\\n border: none;\\n}\\n.webix_menu.webix_view .webix_list_item:hover,\\n.webix_menu.webix_view .webix_list_item:active {\\n background-color: #edeff5;\\n}\\n.webix_menu.webix_view .webix_list_item .webix_submenu_icon:before {\\n content: '\\\\F003';\\n}\\n.webix_menu.webix_view .webix_list_item.webix_selected {\\n background: #F4F5F9;\\n}\\n.webix_menu.webix_view .webix_list_item.webix_disabled {\\n background-color: #FFFFFF;\\n}\\n.webix_menu.webix_view .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_property .webix_property_label_line {\\n background-color: #F4F5F9;\\n}\\n.webix_drag_over,\\n.webix_drop_zone {\\n background-color: #F4F5F9;\\n}\\n.webix_view button,\\n.webix_view input[type=button] {\\n -webkit-appearance: none;\\n}\\n.focusStyle {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_search input,\\n.webix_el_combo input,\\n.webix_el_colorpicker input {\\n padding-right: 28px;\\n}\\n.webix_el_search input,\\n.webix_el_text input,\\n.webix_el_combo input,\\n.webix_el_colorpicker input,\\n.webix_el_datepicker input {\\n border-radius: 2px;\\n}\\n.webix_el_search input:focus,\\n.webix_el_text input:focus,\\n.webix_el_combo input:focus,\\n.webix_el_colorpicker input:focus,\\n.webix_el_datepicker input:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_richselect .webix_inp_static,\\n.webix_el_datepicker .webix_inp_static,\\n.webix_el_colorpicker .webix_inp_static {\\n border-radius: 2px;\\n padding-right: 28px;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n}\\n.webix_el_richselect .webix_inp_static:focus,\\n.webix_el_datepicker .webix_inp_static:focus,\\n.webix_el_colorpicker .webix_inp_static:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_textarea textarea:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_select select:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_select select,\\n.webix_el_textarea textarea {\\n border-radius: 2px;\\n}\\n.webix_el_text .webix_inp_static {\\n border-radius: 2px;\\n white-space: nowrap;\\n}\\n.webix_focused .webix_inp_static {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_multilist .wxi-checkbox-marked {\\n color: #1CA1C1;\\n}\\n.webix_multilist .wxi-checkbox-blank {\\n color: #94A1B3;\\n}\\n.webix_multicombo_value,\\n.webix_multicombo_tag,\\n.webix_multicombo_value.webix_readonly {\\n background-color: #EBEDF0;\\n border-radius: 100px;\\n padding: 0 12px 0 12px;\\n}\\n.webix_multicombo_value:has(> .webix_multicombo_delete) {\\n padding: 0 26px 0 12px;\\n}\\n.webix_multicombo_delete {\\n color: #94A1B3;\\n margin-top: -10px;\\n font-size: 20px;\\n height: 20px;\\n}\\n.webix_multicombo_delete::after {\\n content: \\\"\\\\F033\\\";\\n}\\n.webix_checksuggest_select_all:hover {\\n background-color: #F4F5F9;\\n border-radius: 2px;\\n}\\n.webix_checksuggest_select_all:hover .webix_label_right {\\n color: #1CA1C1;\\n}\\n.webix_checksuggest_select_all .webix_label_right {\\n text-align: center;\\n font-size: 16px;\\n color: #1CA1C1;\\n}\\n.webix_checksuggest_select_all.webix_el_checkbox .webix_label_right {\\n padding-top: 5px;\\n}\\n.buttonStyle {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n}\\n.webix_el_colorpicker div.webix_inp_static div {\\n margin: 2.5px -20px 0px -5px;\\n}\\ndiv.webix_inp_static,\\n.webix_el_textarea textarea {\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n}\\n.webix_el_select select {\\n font-family: Roboto, sans-serif;\\n border-color: #DADEE0;\\n}\\n.webix_el_checkbox input {\\n border-color: #DADEE0;\\n}\\n.webix_el_counter .webix_inp_counter_value {\\n width: 42px;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n}\\n.webix_el_counter .webix_inp_counter_prev,\\n.webix_el_counter .webix_inp_counter_next {\\n background: #F4F5F9;\\n width: 30px;\\n border: 1px solid #CCD7E6;\\n font-weight: bold;\\n font-family: \\\"Courier New\\\", Courier, monospace;\\n}\\n.webix_el_counter .webix_inp_counter_prev {\\n font-size: 20px;\\n border-right: none;\\n}\\n.webix_el_counter .webix_inp_counter_next {\\n font-size: 20px;\\n border-left: none;\\n}\\n.webix_view.webix_control.webix_el_tabbar {\\n background: #FFFFFF;\\n}\\n.webix_all_tabs .webix_item_tab {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n border: none;\\n}\\n.webix_all_tabs .webix_item_tab:hover {\\n background-color: #F4F5F9;\\n}\\n.webix_all_tabs .webix_item_tab .webix_icon.webix_tab_close {\\n width: 28px;\\n font-size: 20px;\\n padding: 0;\\n margin-top: 1px;\\n color: #94A1B3;\\n}\\n.webix_all_tabs .webix_item_tab .webix_icon.webix_tab_close:focus {\\n color: #FF5C4C;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected {\\n box-shadow: inset 0 -2px #1CA1C1;\\n padding-bottom: 0;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected:hover {\\n background-color: transparent;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected:focus {\\n color: #17839d;\\n box-shadow: inset 0 -2px #17839d;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected.webix_disabled {\\n box-shadow: inset 0 -2px #94A1B3;\\n}\\n.webix_all_tabs .webix_tab_filler {\\n border: none;\\n}\\n.webix_all_tabs .webix_tab_more_icon .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_all_tabs .webix_tab_more_icon:hover,\\n.webix_all_tabs .webix_tab_more_icon:focus {\\n background-color: #F4F5F9;\\n}\\n.webixtype_bottom .webix_item_tab,\\n.webixtype_bottom .webix_item_tab.webix_selected {\\n background: #FFFFFF;\\n padding: 0;\\n}\\n.webixtype_bottom .webix_item_tab:last-child,\\n.webixtype_bottom .webix_item_tab.webix_selected:last-child {\\n border-right: none;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected {\\n box-shadow: inset 0 2px #1CA1C1;\\n background: #FFFFFF;\\n color: #1CA1C1;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected:focus {\\n box-shadow: inset 0 2px #17839d;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected.webix_disabled {\\n box-shadow: inset 0 2px #94A1B3;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin: 0 auto;\\n text-align: center;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-size: 24px;\\n margin: 0 3px;\\n height: 100%;\\n line-height: inherit;\\n vertical-align: top;\\n width: 100%;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab.webix_selected {\\n background: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn:active,\\n.webix_el_tabbar .webixtype_icon .webix_img_btn_top:active {\\n background-color: #FFFFFF;\\n}\\n.webix_accordionitem_label .webix_icon {\\n margin-right: 8px;\\n}\\n.webix_el_tabbar .webixtype_iconTop,\\n.webix_el_tabbar .webixtype_image {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab,\\n.webix_el_tabbar .webixtype_image .webix_item_tab {\\n font-size: 14px;\\n padding-top: 2px;\\n padding-bottom: 2px;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top .webix_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top .webix_image,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top .webix_image {\\n top: 0;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_text,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_text {\\n bottom: 0px;\\n font-size: 14px;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected {\\n background: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_img_btn_text,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_img_btn_text {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_icon_btn,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_icon_btn {\\n background-color: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_img_btn,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_img_btn {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab,\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab,\\n.webix_el_tabbar .webixtype_image .webix_item_tab {\\n padding: 0;\\n border-radius: 0;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab .webix_img_btn,\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab .webix_img_btn,\\n.webix_el_tabbar .webixtype_image .webix_item_tab .webix_img_btn {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon {\\n background: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon .webix_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon .webix_icon,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon:focus,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon:focus,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon:focus,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon:focus {\\n background-color: #F4F5F9;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn:hover,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn:hover,\\n.webix_el_tabbar .webixtype_image .webix_img_btn:hover,\\n.webix_el_tabbar .webixtype_icon .webix_img_btn_top:hover,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top:hover,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top:hover {\\n background-color: transparent;\\n}\\n.webix_tab_filler:first-child {\\n border-right: 0;\\n}\\n.passiveBarBG {\\n background: #FFFFFF;\\n color: #1CA1C1;\\n}\\n.webix_cancel_icon {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 17px;\\n margin: 0;\\n height: auto;\\n width: 20px;\\n}\\n.webix_cancel_icon:hover {\\n color: #FF5C4C;\\n}\\n.webix_cancel_icon:before {\\n content: \\\"\\\\F011\\\";\\n}\\n.webix_error_icon {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 20px;\\n height: auto;\\n width: 20px;\\n color: #FF5C4C;\\n}\\n.webix_error_icon:before {\\n content: \\\"\\\\F034\\\";\\n}\\n.webix_inp_counter_next:hover,\\n.webix_inp_counter_prev:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:focus,\\n.webix_inp_counter_prev:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:active,\\n.webix_inp_counter_prev:active {\\n background-color: #daddeb;\\n}\\n.webix_el_button button,\\n.webix_el_toggle button,\\n.webixbutton,\\n.webix_view button,\\n.webix_view input[type=button] {\\n border-width: 0px;\\n}\\n.webix_segment_0:hover,\\n.webix_segment_1:hover,\\n.webix_segment_N:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:focus,\\n.webix_segment_1:focus,\\n.webix_segment_N:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:active,\\n.webix_segment_1:active,\\n.webix_segment_N:active {\\n background-color: #daddeb;\\n}\\n.webix_selected.webix_segment_0:hover,\\n.webix_selected.webix_segment_1:hover,\\n.webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_selected.webix_segment_0:focus,\\n.webix_selected.webix_segment_1:focus,\\n.webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_selected.webix_segment_0:active,\\n.webix_selected.webix_segment_1:active,\\n.webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_all_segments .webix_segment_1,\\n.webix_all_segments .webix_segment_N {\\n margin-left: 1px;\\n border-left: none;\\n}\\n.webix_segment_0,\\n.webix_segment_1,\\n.webix_segment_N {\\n border-color: #F4F5F9;\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_left,\\n.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n width: 6px;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_handle {\\n left: 5px;\\n}\\n.webix_slider_vertical.webix_slider_alt .webix_slider_handle {\\n left: 3px;\\n}\\n.webix_section > .webix_template {\\n font-family: Roboto, sans-serif;\\n font-size: 12px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_view.webix_control .webix_disabled_box .webix_custom_checkbox,\\n.webix_view.webix_control .webix_disabled_box .webix_custom_radio {\\n color: #DADEE0;\\n}\\n.webix_view > .webix_disabled {\\n background-color: #EBEDF0;\\n opacity: 0.6;\\n}\\n.webix_disabled_view .webix_disabled_top_label {\\n color: #94A1B3;\\n}\\n.webix_custom_checkbox:before {\\n content: \\\"\\\\F013\\\";\\n font-family: \\\"Webix Material Icons\\\";\\n cursor: pointer;\\n}\\n.webix_checkbox_1 .webix_custom_checkbox:before {\\n content: \\\"\\\\F012\\\";\\n}\\n.webix_checkbox_1 .webix_custom_checkbox {\\n color: #1CA1C1;\\n}\\n.webix_custom_checkbox {\\n float: left;\\n position: relative;\\n font-size: 24px;\\n height: 100%;\\n padding: 0;\\n margin-top: 1px;\\n border: none;\\n background-color: transparent;\\n color: #94A1B3;\\n}\\n.webix_custom_checkbox:focus {\\n color: #188ba6;\\n}\\n.webix_el_radio .webix_custom_radio:before {\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n content: \\\"\\\\F035\\\";\\n display: block;\\n}\\n.webix_el_radio .webix_radio_1 .webix_custom_radio {\\n color: #1CA1C1;\\n}\\n.webix_el_radio .webix_radio_1 .webix_custom_radio:before {\\n content: \\\"\\\\F036\\\";\\n}\\n.webix_el_radio .webix_custom_radio {\\n padding: 0;\\n display: block;\\n background-color: transparent;\\n border-color: transparent;\\n color: #94A1B3;\\n cursor: pointer;\\n}\\n.webix_el_radio .webix_custom_radio:focus {\\n color: #188ba6;\\n}\\n.webix_cal_icon,\\n.webix_cal_time,\\n.webix_cal_month_name {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_cal_icon:hover,\\n.webix_cal_time:hover,\\n.webix_cal_month_name:hover,\\n.webix_cal_icon:focus,\\n.webix_cal_time:focus,\\n.webix_cal_month_name:focus {\\n text-decoration: none;\\n color: #1CA1C1;\\n}\\n.webix_cal_month_name,\\n.webix_time_header .webix_cal_hours,\\n.webix_time_header .webix_cal_minutes {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_cal_month_name.webix_readonly:hover,\\n.webix_cal_month_name.webix_readonly:focus {\\n color: #313131;\\n}\\n.webix_cal_prev_button,\\n.webix_cal_next_button {\\n background-image: none;\\n width: 24px;\\n font-size: 24px;\\n font-family: \\\"Webix Material Icons\\\";\\n color: #94A1B3;\\n}\\n.webix_cal_prev_button:hover,\\n.webix_cal_next_button:hover,\\n.webix_cal_prev_button:focus,\\n.webix_cal_next_button:focus {\\n color: #1CA1C1;\\n}\\n.webix_cal_prev_button:before {\\n content: \\\"\\\\F029\\\";\\n}\\n.webix_cal_next_button:before {\\n content: \\\"\\\\F028\\\";\\n}\\n.webix_time_header .webix_cal_hours,\\n.webix_time_header .webix_cal_minutes,\\n.webix_cal_body .webix_cal_block_empty {\\n font-weight: 500;\\n border-bottom: none;\\n}\\n.webix_view > .webix_cal_header {\\n height: 18px;\\n}\\n.webix_view > .webix_cal_header div {\\n height: 17px;\\n line-height: 18px;\\n font-size: 12px;\\n border-bottom-color: transparent;\\n}\\n.webix_cal_body .webix_cal_week_num {\\n color: #475466;\\n}\\n.webix_cal_body .webix_cal_today .webix_cal_day_inner {\\n box-shadow: inset 0 0 0 1px #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_day_inner {\\n display: inline-block;\\n font-size: 12px;\\n border-radius: 50%;\\n}\\n.webix_cal_body .webix_cal_day_inner:hover {\\n background-color: #F4F5F9;\\n}\\n.webix_cal_body .webix_cal_event {\\n font-weight: 500;\\n color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_outside {\\n color: #94A1B3;\\n font-weight: normal;\\n}\\n.webix_cal_body .webix_cal_select,\\n.webix_cal_body .webix_cal_today.webix_cal_select {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_select .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_select .webix_cal_day_inner {\\n color: #FFFFFF;\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_select .webix_cal_day_inner:hover,\\n.webix_cal_body .webix_cal_today.webix_cal_select .webix_cal_day_inner:hover {\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_select:focus .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_select:focus .webix_cal_day_inner {\\n background-color: #1992af;\\n}\\n.webix_cal_body .webix_cal_block {\\n font-family: Roboto, sans-serif;\\n font-size: 12px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected span {\\n background-color: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected span:hover {\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected:focus span {\\n background-color: #1992af;\\n}\\n.webix_cal_body .webix_cal_block span {\\n border-radius: 50%;\\n}\\n.webix_cal_body .webix_cal_block span:hover {\\n background-color: #F4F5F9;\\n}\\n.webix_cal_body .webix_hours .webix_cal_day_disabled,\\n.webix_cal_body .webix_hours .webix_cal_day_disabled.webix_cal_event,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled.webix_cal_event,\\n.webix_cal_body .webix_cal_day_disabled,\\n.webix_cal_body .webix_cal_day_disabled.webix_cal_event {\\n background-color: #fbfbfd;\\n color: #94A1B3;\\n}\\n.webix_cal_body .webix_hours .webix_cal_day_disabled span:hover,\\n.webix_cal_body .webix_hours .webix_cal_day_disabled.webix_cal_event span:hover,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled span:hover,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled.webix_cal_event span:hover,\\n.webix_cal_body .webix_cal_day_disabled span:hover,\\n.webix_cal_body .webix_cal_day_disabled.webix_cal_event span:hover {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_range_first,\\n.webix_cal_body .webix_cal_range_last {\\n position: relative;\\n}\\n.webix_cal_body .webix_cal_range_last + .webix_cal_outside {\\n background-color: #FFFFFF;\\n}\\n.webix_cal_body .webix_cal_range_first:before,\\n.webix_cal_body .webix_cal_range_last:after {\\n content: \\\"\\\";\\n display: block;\\n width: 50%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n background: #e1f6fb;\\n}\\n.webix_cal_body .webix_cal_range_first:before {\\n right: 100%;\\n}\\n.webix_cal_body .webix_cal_range_last:after {\\n left: 100%;\\n}\\n.webix_cal_body .webix_cal_range_start,\\n.webix_cal_body .webix_cal_range_end {\\n position: relative;\\n z-index: 1;\\n}\\n.webix_cal_body .webix_cal_range_last + .webix_cal_outside {\\n position: relative;\\n z-index: 1;\\n background-color: #FFFFFF;\\n}\\n.webix_cal_body .webix_cal_range:first-child:before,\\n.webix_cal_body .webix_cal_range:last-child:after,\\n.webix_cal_body .webix_cal_outside + .webix_cal_range_first:before {\\n width: 0;\\n}\\n.webix_cal_body .webix_cal_range_start,\\n.webix_cal_body .webix_cal_range_end,\\n.webix_cal_body .webix_cal_today.webix_cal_range_start,\\n.webix_cal_body .webix_cal_today.webix_cal_range_end {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_range_start .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_range_end .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_range_start .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_range_end .webix_cal_day_inner {\\n color: #FFFFFF;\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_range {\\n background-color: #e1f6fb;\\n}\\n.webix_daterange .webix_range_timepicker .webix_cal_time {\\n padding: 4px;\\n}\\n.webix_daterange .webix_cal_icons .webix_cal_icon {\\n border-top: none;\\n}\\n.webix_progress_top .webix_progress_state,\\n.webix_progress_bottom .webix_progress_state {\\n background: #1CA1C1;\\n background-image: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0.1) 75%, transparent 75%, transparent);\\n}\\n.webix_progress_top .webix_progress_state {\\n background-size: 10px 10px;\\n}\\n.webix_progress_bottom .webix_progress_state {\\n background-size: 14px 14px;\\n}\\n.webix_switch_box {\\n color: #475466;\\n background-color: #F4F5F9;\\n}\\n.webix_switch_box.webix_switch_on {\\n background-color: #1CA1C1;\\n}\\n.webix_switch_box .webix_switch_text {\\n padding-top: 2px;\\n}\\n.webix_sidebar {\\n background-color: #FFFFFF;\\n}\\n.webix_sidebar .webix_tree_item:hover {\\n background-color: #edeff5;\\n}\\n.webix_sidebar.webix_sidebar_left .webix_tree_item.webix_sidebar_selected + .webix_tree_leaves .webix_tree_item,\\n.webix_sidebar.webix_sidebar_left .webix_tree_item.webix_selected,\\n.webix_sidebar.webix_sidebar_left .webix_tree_item.webix_sidebar_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_sidebar.webix_sidebar_right .webix_tree_item.webix_sidebar_selected + .webix_tree_leaves .webix_tree_item,\\n.webix_sidebar.webix_sidebar_right .webix_tree_item.webix_selected,\\n.webix_sidebar.webix_sidebar_right .webix_tree_item.webix_sidebar_selected {\\n box-shadow: inset -2px 0 #1CA1C1;\\n}\\n.webix_sidebar .webix_tree_branch_1 {\\n border: none;\\n}\\n.webix_sidebar .webix_tree_branch_1 .webix_tree_item {\\n padding-right: 12px;\\n}\\n.webix_sidebar .webix_tree_branch_1 > .webix_tree_item {\\n padding-left: 12px;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected .webix_sidebar_icon,\\n.webix_sidebar .webix_tree_item .webix_sidebar_icon {\\n margin-right: 8px;\\n}\\n.webix_sidebar .webix_sidebar_icon {\\n width: 20px;\\n vertical-align: middle;\\n}\\n.webix_sidebar .webix_sidebar_icon,\\n.webix_sidebar .webix_sidebar_dir_icon {\\n color: #94A1B3;\\n font-size: 20px;\\n}\\n.webix_sidebar .webix_tree_item,\\n.webix_sidebar .webix_tree_branch_1 > .webix_tree_item {\\n color: #475466;\\n cursor: pointer;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected,\\n.webix_sidebar .webix_tree_item.webix_sidebar_selected {\\n color: #1CA1C1;\\n background-color: #F4F5F9;\\n font-weight: 500;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected .webix_sidebar_icon,\\n.webix_sidebar .webix_tree_item.webix_sidebar_selected .webix_sidebar_icon,\\n.webix_sidebar .webix_tree_item.webix_selected .webix_sidebar_dir_icon,\\n.webix_sidebar .webix_tree_item.webix_sidebar_selected .webix_sidebar_dir_icon {\\n color: #1CA1C1;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected span {\\n background-color: transparent;\\n color: #1CA1C1;\\n}\\n.webix_sidebar.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected {\\n background-color: transparent;\\n}\\n.webix_sidebar.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected:hover {\\n background-color: #edeff5;\\n}\\n.webix_sidebar_popup_list .webix_list_item,\\n.webix_sidebar_popup_list .webix_list_item:first-child {\\n border-width: 0px;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_sidebar_selected {\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_sidebar_selected:hover {\\n background-color: #F4F5F9 !important;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_selected {\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_sidebar_popup_list .webix_tree_branch_1 > .webix_tree_item {\\n height: 44px;\\n line-height: 44px;\\n}\\n.webix_sidebar_popup_left .webix_list_item.webix_selected,\\n.webix_sidebar_popup_left .webix_list_item.webix_sidebar_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_sidebar_popup_right .webix_list_item.webix_selected,\\n.webix_sidebar_popup_right .webix_list_item.webix_sidebar_selected {\\n box-shadow: inset -2px 0 #1CA1C1;\\n}\\n.webix_sidebar_popup_list.webix_sidebar_popup_right .webix_icon {\\n margin-left: -8px;\\n}\\n.webix_sidebar_popup.webix_sidebar_popup_left,\\n.webix_sidebar_popup.webix_sidebar_popup_right {\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_sidebar_popup.webix_sidebar_popup_right .webix_sidebar_popup_right {\\n box-shadow: none;\\n}\\n.webix_sidebar_popup .webix_sidebar_popup_title {\\n background-color: #F4F5F9;\\n}\\n.webix_sidebar_popup .webix_sidebar_popup_title .webix_template {\\n border: none;\\n line-height: 44px;\\n}\\n.webix_sidebar_popup .webix_sidebar_popup_title.webix_selected {\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_sidebar_popup_right {\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_sidebar.webix_dark {\\n border-color: #4A4E58;\\n background-color: #4A4E58;\\n}\\n.webix_sidebar.webix_dark .webix_tree_item {\\n color: #FFFFFF;\\n}\\n.webix_sidebar.webix_dark .webix_tree_item:hover {\\n background-color: #33353c;\\n}\\n.webix_sidebar.webix_dark .webix_tree_item.webix_selected,\\n.webix_sidebar.webix_dark .webix_tree_item.webix_sidebar_selected {\\n color: #1CA1C1;\\n background-color: #373a42;\\n}\\n.webix_sidebar.webix_dark.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected {\\n background-color: transparent;\\n}\\n.webix_sidebar.webix_dark.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected:hover {\\n background-color: #33353c;\\n}\\n.webix_sidebar_popup.webix_dark .webix_sidebar_popup_title {\\n background-color: #373a42;\\n}\\n.webix_sidebar_popup.webix_dark .webix_sidebar_popup_title .webix_template {\\n border-color: #373a42;\\n color: #FFFFFF;\\n}\\n.webix_sidebar_popup.webix_dark .webix_sidebar_popup_title.webix_selected .webix_template {\\n color: #1CA1C1;\\n}\\n.webix_sidebar_popup_list.webix_dark {\\n background-color: #4A4E58;\\n border-color: #373a42;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item {\\n background: #4A4E58;\\n color: #FFFFFF;\\n border-color: #373a42;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_selected,\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_sidebar_selected {\\n background-color: #373a42;\\n color: #1CA1C1;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item:hover {\\n background-color: #33353c;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_selected {\\n background-color: #373a42;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_sidebar_selected:hover {\\n background-color: #373a42 !important;\\n}\\n.webix_sidebar_popup.webix_dark {\\n border-color: #373a42;\\n}\\n.webix_list_item.webix_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_list_item.webix_disabled {\\n color: #94A1B3;\\n}\\n.webix_list_item.webix_selected.webix_disabled {\\n box-shadow: inset 2px 0 #94A1B3;\\n}\\n.webix_list_item .webix_icon {\\n font-size: 20px;\\n}\\n.webix_list-x .webix_list_item.webix_selected {\\n box-shadow: none;\\n border-left: none;\\n padding-left: 12px;\\n}\\n.webix_header > div {\\n padding-left: 12px;\\n}\\n.webix_icon,\\n.webix_icon_btn,\\n.webix_input_icon {\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_icon_button {\\n position: relative;\\n z-index: 0;\\n}\\n.webix_icon_button:before {\\n content: '';\\n opacity: 0;\\n position: absolute;\\n transition-duration: 0.15s;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n z-index: -1;\\n bottom: 0px;\\n left: 0px;\\n right: 0px;\\n top: 0px;\\n border-radius: 50%;\\n transform: scale(0);\\n transition-property: transform, opacity;\\n}\\n.webix_icon_button:hover .webix_icon,\\n.webix_icon_button:focus .webix_icon {\\n color: #475466;\\n}\\n.webix_icon_button:hover:before {\\n background-color: #F4F5F9;\\n opacity: 1;\\n transform: scale(1);\\n}\\n.webix_icon_btn,\\n.webix_input_icon {\\n width: 20px;\\n}\\n.webix_img_btn_top .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_icon_btn {\\n vertical-align: text-bottom;\\n}\\n.webix_resize_frame {\\n box-shadow: 0 2px 6px 0 #000, 0 1px 4px 0 #000;\\n}\\n.webix_tooltip {\\n padding: 4px 8px;\\n background-color: #475466;\\n color: #FFFFFF;\\n font-weight: 500;\\n line-height: 20px;\\n border-radius: 2px;\\n border: none;\\n}\\n.portlet_marker,\\n.portlet_markertop,\\n.portlet_markerbottom,\\n.portlet_markerleft,\\n.portlet_markerright {\\n background: #1CA1C1;\\n}\\n.webix_treemap_item:hover {\\n box-shadow: inset 0 0 0 1px #5ccce7;\\n}\\n.webix_treemap_item.webix_selected {\\n border-color: inherit;\\n box-shadow: inset 0 0 0 2px #1CA1C1;\\n}\\n.webixlabel {\\n font-weight: 500;\\n}\\n.webixtoolbarlabel {\\n letter-spacing: 0;\\n}\\n.webix_inp_label,\\n.webix_inp_top_label,\\nlegend.webix_forminput_label,\\n.webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_inp_label,\\n.webix_forminput_label {\\n padding-right: 8px;\\n}\\n.webix_label_right {\\n padding-left: 4px;\\n}\\n.webix_el_checkbox .webix_label_right {\\n display: block;\\n}\\n.webix_richtext .webix_richtext_container {\\n box-shadow: inset 0 1px #DADEE0;\\n}\\n.webix_dbllist .bottom_label {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #94A1B3;\\n letter-spacing: 0.2px;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_left,\\n.webix_popup.webix_sidemenu.webix_sidemenu_right,\\n.webix_popup.webix_sidemenu.webix_sidemenu_top,\\n.webix_popup.webix_sidemenu.webix_sidemenu_bottom {\\n border: none;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_chart .webix_chart_legend_item,\\n.webix_chart .webix_canvas_text,\\n.webix_chart .webix_axis_title_x,\\n.webix_chart .webix_axis_title_y {\\n font-family: Roboto, sans-serif;\\n font-size: 12px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_chart .webix_canvas_text.webix_axis_item_x,\\n.webix_chart .webix_canvas_text.webix_axis_item_y,\\n.webix_chart .webix_axis_title_x,\\n.webix_chart .webix_axis_title_y,\\n.webix_chart .webix_canvas_text.webix_axis_radar_title {\\n color: #94A1B3;\\n}\\n.webix_bullet_scale {\\n fill: #94A1B3;\\n font-size: 12px;\\n}\\n.webix_bullet_scale_lines {\\n stroke: #94A1B3;\\n}\\n.webix_toolbar.pdf_bar {\\n background-color: #474747;\\n}\\n.webix_toolbar.pdf_bar .webix_icon_btn {\\n font-size: 20px;\\n vertical-align: middle;\\n}\\n.webix_toolbar.pdf_bar .webix_img_btn:focus,\\n.webix_toolbar.pdf_bar .webix_img_btn:hover {\\n background-color: #333333;\\n}\\n.invalidStyle {\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n}\\n.webix_list_item.webix_invalid,\\n.webix_tree_item.webix_invalid,\\n.webix_dataview_item.webix_invalid,\\n.webix_cell.webix_invalid {\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n}\\n.webix_invalid .webix_el_box input,\\n.webix_invalid .webix_el_box .webix_inp_static,\\n.webix_invalid .webix_el_box select,\\n.webix_invalid .webix_el_box textarea,\\ninput.webix_invalid,\\nselect.webix_invalid,\\ntextarea.webix_invalid {\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n border-color: #ff8d82;\\n}\\n.webix_invalid .webix_inp_bottom_label {\\n color: #FF5C4C;\\n}\\n.webix_nav_panel .webix_nav_item {\\n background-color: transparent;\\n border-color: rgba(255, 255, 255, 0.4);\\n opacity: 1;\\n}\\n.webix_nav_panel .webix_nav_item:hover {\\n border-color: rgba(255, 255, 255, 0.6);\\n}\\n.webix_nav_panel .webix_nav_active {\\n background-color: #FFFFFF;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 1;\\n background-image: none;\\n text-align: center;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n color: #FFFFFF;\\n border-radius: 50%;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_nav_button_next .webix_nav_button_inner:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n transition: 0.15s;\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 1;\\n text-align: center;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 48px;\\n color: #FFFFFF;\\n background: rgba(0, 0, 0, 0.2);\\n border-radius: 2px;\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n background: rgba(0, 0, 0, 0.4);\\n}\\n.webix_nav_button_side.webix_nav_button_next {\\n right: 0;\\n}\\n.webix_nav_button_side.webix_nav_button_prev {\\n left: 0;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner:before {\\n content: \\\"\\\\F002\\\";\\n}\\n.webix_nav_button_next .webix_nav_button_inner:before {\\n content: \\\"\\\\F003\\\";\\n}\\n.webix_dark .webix_nav_item {\\n border-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_dark .webix_nav_item:hover {\\n border-color: rgba(0, 0, 0, 0.6);\\n}\\n.webix_dark .webix_nav_inactive {\\n background-color: transparent;\\n}\\n.webix_dark .webix_nav_active {\\n background-color: #000000;\\n}\\n.webix_dark .webix_nav_active:hover,\\n.webix_dark .webix_nav_active:focus {\\n box-shadow: 0 0 2px #000;\\n}\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner,\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner {\\n background-image: none;\\n color: #313131;\\n}\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner:focus {\\n background-color: rgba(255, 255, 255, 0.2);\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n background: rgba(255, 255, 255, 0.2);\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n background: rgba(255, 255, 255, 0.4);\\n}\\n.webix_skin_mark {\\n height: 230px;\\n}\\n/* based on MaterialDesignIcons.com */\\n@font-face {\\n font-family: \\\"Webix Material Icons\\\";\\n src: url('fonts/webixmdi-webfont.woff2') format('woff2'), url('fonts/webixmdi-webfont.woff') format('woff');\\n font-weight: normal;\\n font-style: normal;\\n}\\n/* icons collection common for above fonts*/\\n.wxi-angle-down:before {\\n content: \\\"\\\\F001\\\";\\n}\\n.wxi-angle-left:before {\\n content: \\\"\\\\F002\\\";\\n}\\n.wxi-angle-right:before {\\n content: \\\"\\\\F003\\\";\\n}\\n.wxi-angle-up:before {\\n content: \\\"\\\\F004\\\";\\n}\\n.wxi-angle-double-right:before {\\n content: \\\"\\\\F005\\\";\\n}\\n.wxi-angle-double-left:before {\\n content: \\\"\\\\F006\\\";\\n}\\n.wxi-clock:before {\\n content: \\\"\\\\F007\\\";\\n}\\n.wxi-calendar:before {\\n content: \\\"\\\\F008\\\";\\n}\\n.wxi-search:before {\\n content: \\\"\\\\F009\\\";\\n}\\n.wxi-dots:before {\\n content: \\\"\\\\F010\\\";\\n}\\n.wxi-close:before {\\n content: \\\"\\\\F011\\\";\\n}\\n.wxi-checkbox-marked:before {\\n content: \\\"\\\\F012\\\";\\n}\\n.wxi-checkbox-blank:before {\\n content: \\\"\\\\F013\\\";\\n}\\n.wxi-trash:before {\\n content: \\\"\\\\F014\\\";\\n}\\n.wxi-pencil:before {\\n content: \\\"\\\\F015\\\";\\n}\\n.wxi-eye:before {\\n content: \\\"\\\\F016\\\";\\n}\\n.wxi-eye-slash:before {\\n content: \\\"\\\\F017\\\";\\n}\\n.wxi-columns:before {\\n content: \\\"\\\\F018\\\";\\n}\\n.wxi-drag:before {\\n content: \\\"\\\\F019\\\";\\n}\\n.wxi-check:before {\\n content: \\\"\\\\F020\\\";\\n}\\n.wxi-underline:before {\\n content: \\\"\\\\F021\\\";\\n}\\n.wxi-bold:before {\\n content: \\\"\\\\F022\\\";\\n}\\n.wxi-italic:before {\\n content: \\\"\\\\F023\\\";\\n}\\n.wxi-sync:before {\\n content: \\\"\\\\F024\\\";\\n}\\n.wxi-plus-square:before {\\n content: \\\"\\\\F025\\\";\\n}\\n.wxi-minus-square:before {\\n content: \\\"\\\\F026\\\";\\n}\\n.wxi-menu-down:before {\\n content: \\\"\\\\F027\\\";\\n}\\n.wxi-menu-right:before {\\n content: \\\"\\\\F028\\\";\\n}\\n.wxi-menu-left:before {\\n content: \\\"\\\\F029\\\";\\n}\\n.wxi-folder:before {\\n content: \\\"\\\\F030\\\";\\n}\\n.wxi-folder-open:before {\\n content: \\\"\\\\F031\\\";\\n}\\n.wxi-file:before {\\n content: \\\"\\\\F032\\\";\\n}\\n.wxi-close-circle:before {\\n content: \\\"\\\\F033\\\";\\n}\\n.wxi-alert:before {\\n content: \\\"\\\\F034\\\";\\n}\\n.wxi-radiobox-blank:before {\\n content: \\\"\\\\F035\\\";\\n}\\n.wxi-radiobox-marked:before {\\n content: \\\"\\\\F036\\\";\\n}\\n.wxi-angle-double-down:before {\\n content: \\\"\\\\F037\\\";\\n}\\n.wxi-angle-double-up:before {\\n content: \\\"\\\\F038\\\";\\n}\\n.wxi-plus-circle:before {\\n content: \\\"\\\\F039\\\";\\n}\\n.wxi-minus-circle:before {\\n content: \\\"\\\\F040\\\";\\n}\\n.wxi-plus:before {\\n content: \\\"\\\\F041\\\";\\n}\\n.wxi-minus:before {\\n content: \\\"\\\\F042\\\";\\n}\\n.wxi-download:before {\\n content: \\\"\\\\F043\\\";\\n}\\n.wxi-user:before {\\n content: \\\"\\\\F044\\\";\\n}\\n.wxi-filter:before {\\n content: \\\"\\\\F045\\\";\\n}\\n.wxi-menu-up:before {\\n content: \\\"\\\\F046\\\";\\n}\\n/*predefined styles for text lables inside a item*/\\n.webix_strong {\\n font-weight: 500;\\n white-space: nowrap;\\n}\\n.webix_light {\\n color: #b3b3b3;\\n}\\n/*contr-styles for bootstrap*/\\n.webix_view,\\n.webix_input_icon {\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n}\\n.webix_view.webix_el_label {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_inp_label,\\n.webix_inp_top_label,\\n.webix_label_right {\\n margin-bottom: 0px;\\n}\\n.webix_view table {\\n border-collapse: initial;\\n}\\n/* Spin*/\\n.webix_spin {\\n animation: webix_spin 2s infinite linear;\\n}\\n@-webkit-keyframes webix_spin {\\n 0% {\\n transform: rotate(0deg);\\n }\\n 100% {\\n transform: rotate(359deg);\\n }\\n}\\n@keyframes webix_spin {\\n 0% {\\n transform: rotate(0deg);\\n }\\n 100% {\\n transform: rotate(359deg);\\n }\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./js/webix/webix.css\"],\"names\":[],\"mappings\":\"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AEE,qCAAqC;AACvC;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;;;;;EAME,qBAAqB;EACrB,gBAAgB;AAClB;AACA;EACE,oCAAoC;AACtC;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;;;EAGE,mBAAmB;EACnB,cAAc;AAChB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;EAEE,cAAc;AAChB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,oCAAoC;AACtC;AACA;;EAEE,UAAU;AACZ;AACA;EACE,cAAc;EACd,YAAY;AACd;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;EACE,+BAA+B;AACjC;AACA;;EAEE,+BAA+B;AACjC;AACA;EACE,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;;;;EAME,+BAA+B;EAC/B,oCAAoC;EACpC,yBAAyB;AAC3B;AACA;EACE,6BAA6B;AAC/B;AACA;;;;EAIE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;;;EAGE,qCAAqC;AACvC;AACA;EACE,+BAA+B;AACjC;AACA;;;;;;;EAOE,cAAc;EACd,wCAAwC;EACxC,qBAAqB;AACvB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,YAAY;EACZ,kBAAkB;AACpB;AACA;EACE,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ,WAAW;EACX,mBAAmB;AACrB;AACA;EACE,kBAAkB;AACpB;AACA;E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CrB;AACA;;EAEE,eAAe;EACf,eAAe;EACf,cAAc;EACd,sBAAsB;EACtB,yBAAyB;EACzB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,cAAc;EACd,eAAe;EACf,iBAAiB;EACjB,+BAA+B;AACjC;AACA;EACE,iBAAiB;EACjB,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;;EAEE,cAAc;EACd,mBAAmB;AACrB;AACA;;EAEE,mBAAmB;AACrB;AACA;;;;EAIE,mBAAmB;EACnB,mBAAmB;EACnB,6BAA6B;AAC/B;AACA;EACE,eAAe;EACf,sBAAsB;EACtB,yBAAyB;EACzB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,WAAW;EACX,kBAAkB;EAClB,eAAe;EACf,sBAAsB;EACtB,yBAAyB;EACzB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,mBAAmB;EACnB,cAAc;AAChB;AACA;EACE,kBAAkB;EAClB,eAAe;EACf,WAAW;EACX,YAAY;EACZ,gBAAgB;EAChB,eAAe;AACjB;AACA;EACE,YAAY;EACZ,YAAY;EACZ,iBAAiB;EACjB,kBAAkB;AACpB;AACA;EACE,YAAY;EACZ,iBAAiB;EACjB,kBAAkB;AACpB;AACA;EACE,WAAW;AACb;AACA;EACE,kBAAkB;EAClB,cAAc;AAChB;AACA;;;EAGE,0BAA0B;EAC1B,cAAc;AAChB;AACA;;;EAGE,cAAc;AAChB;AACA;EACE,eAAe;AACjB;AACA;;EAEE,qBAAqB;EACrB,cAAc;AAChB;AACA;EACE,gBAAgB;AAClB;AACA;;EAEE,qBAAqB;EACrB,eAAe;EACf,kBAAkB;EAClB,YAAY;EACZ,iBAAiB;EACjB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;EACtB,gCAAgC;AAClC;AACA;EACE,iBAAiB;EACjB,iBAAiB;AACnB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,WAAW;EACX,+BAA+B;EAC/B,kBAAkB;AACpB;AACA;EACE,WAAW;EACX,iBAAiB;AACnB;AACA;EACE,WAAW;EACX,kBAAkB;AACpB;AACA;EACE,kBAAkB;EAClB,eAAe;EACf,YAAY;EACZ,gBAAgB;EAChB,eAAe;AACjB;AACA;EACE,YAAY;EACZ,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,yBAAyB;EACzB,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,mBAAmB;EACnB,aAAa;EACb,mBAAmB;EACnB,cAAc;EACd,YAAY;AACd;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,WAAW;EACX,YAAY;EACZ,cAAc;AAChB;AACA;;EAEE,yBAAyB;AAC3B;AACA;;EAEE,qBAAqB;EACrB,kBAAkB;EAClB,gCAAgC;EAChC,gBAAgB;EAChB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;EACnB,iBAAiB;EACjB,kBAAkB;EAClB,gCAAgC;EAChC,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,mBAAmB;EACnB,qBAAqB;AACvB;AACA;;;;;EAKE,cAAc;AAChB;AACA;;;;;;EAME,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;;EAEE,oCAAoC;AACtC;AACA;EACE,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;EACd,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,yBAAyB;AAC3B;AACA;;;;;;;EAOE,cAAc;EACd,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,yBAAyB;EACzB,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;EAEE,qCAAqC;AACvC;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;;;;;EAME,qBAAqB;EACrB,gBAAgB;AAClB;AACA;EACE,oCAAoC;AACtC;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;;;EAGE,mBAAmB;EACnB,cAAc;AAChB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;EAEE,cAAc;AAChB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,oCAAoC;AACtC;AACA;;EAEE,UAAU;AACZ;AACA;EACE,cAAc;EACd,YAAY;AACd;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;EACE,+BAA+B;AACjC;AACA;;EAEE,+BAA+B;AACjC;AACA;EACE,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;;;;EAME,+BAA+B;EAC/B,oCAAoC;EACpC,yBAAyB;AAC3B;AACA;EACE,6BAA6B;AAC/B;AACA;;;;EAIE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;;;EAGE,qCAAqC;AACvC;AACA;EACE,+BAA+B;AACjC;AACA;;;;;;;EAOE,cAAc;EACd,wCAAwC;EACxC,qBAAqB;AACvB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,cAAc;AAChB;AACA;EACE,YAAY;EACZ,eAAe;EACf,iBAAiB;EACjB,yBAAyB;EACzB,mBAAmB;EACnB,kBAAkB;EAClB,WAAW;EACX,YAAY;AACd;AACA;EACE,uBAAuB;EACvB,mBAAmB;AACrB;AACA;EACE,SAAS;EACT,sBAAsB;AACxB;AACA,oCAAoC;AACpC;EACE,aAAa;EACb,kBAAkB;EAClB,cAAc;EACd,yBAAyB;EACzB,iBAAiB;EACjB,yBAAyB;EACzB,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;EACrB,kBAAkB;EAClB,0CAA0C;EAC1C,mCAAmC;EACnC,kCAAkC;AACpC;AACA;EACE,oBAAoB;AACtB;AACA,gBAAgB;AAChB;EACE,gBAAgB;EAChB,YAAY;EACZ,eAAe;AACjB;AACA;EACE,gBAAgB;AAClB;AACA,4BAA4B;AAC5B;EACE,iBAAiB;EACjB,gBAAgB;EAChB,yBAAyB;AAC3B;AACA;EACE,iBAAiB;EACjB,UAAU;EACV,kBAAkB;EAClB,YAAY;EACZ,eAAe;EACf,cAAc;EACd,iBAAiB;AACnB;AACA;;EAEE,mBAAmB;AACrB;AACA;EACE,qBAAqB;EACrB,iBAAiB;EACjB,iBAAiB;EACjB,kBAAkB;AACpB;AACA;EACE,cAAc;EACd,qBAAqB;EACrB,qBAAqB;AACvB;AACA;EACE,0BAA0B;AAC5B;AACA;EACE,cAAc;AAChB;AACA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;AACA;EACE,cAAc;AAChB;AACA;EACE,iBAAiB;EACjB,WAAW;EACX,kBAAkB;EAClB,WAAW;EACX,YAAY;AACd;AACA;EACE,UAAU;EACV,SAAS;EACT,UAAU;EACV,kBAAkB;EAClB,yBAAyB;EACzB,kBAAkB;EAClB,YAAY;EACZ,WAAW;EACX,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,WAAW;EACX,YAAY;EACZ,gBAAgB;EAChB,kBAAkB;EAClB,WAAW;EACX,kBAAkB;AACpB;AACA;EACE,WAAW;EACX,YAAY;EACZ,cAAc;AAChB;AACA;EACE,eAAe;EACf,cAAc;EACd,iBAAiB;EACjB,kBAAkB;E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AA8B;AAC9B;EACE,UAAU;EACV,SAAS;AACX;AACA;EACE,8BAA8B;EAC9B,gBAAgB;AAClB;AACA;;EAEE,WAAW;EACX,YAAY;EACZ,WAAW;AACb;AACA;EACE,WAAW;AACb;AACA;;EAEE,sBAAsB;EACtB,yBAAyB;EACzB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;;EAEE,cAAc;EACd,mBAAmB;EACnB,sBAAsB;EACtB,yBAAyB;EACzB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,cAAc;EACd,WAAW;EACX,YAAY;EACZ,kBAAkB;AACpB;AACA;;EAEE,mBAAmB;EACnB,sBAAsB;AACxB;AACA;;EAEE,8BAA8B;AAChC;AACA;EACE,yBAAyB;EACzB,sBAAsB;AACxB;AACA;EACE,yBAAyB;AAC3B;AACA;;;;;;;;EAQE,yBAAyB;EACzB,qBAAqB;AACvB;AACA;EACE,eAAe;EACf,cAAc;AAChB;AACA;EACE,eAAe;EACf,WAAW;EACX,YAAY;EACZ,kBAAkB;AACpB;AACA;EACE,kBAAkB;AACpB;AACA;EACE,mBAAmB;AACrB;AACA;EACE,kBAAkB;EAClB,WAAW;EACX,eAAe;EACf,iBAAiB;AACnB;AACA;EACE,UAAU;AACZ;AACA;EACE,+BAA+B;EAC/B,uBAAuB;AACzB;AACA;EACE,cAAc;AAChB;AACA;;;;EAIE,cAAc;AAChB;AACA;;;;;;EAME,cAAc;EACd,mBAAmB;EACnB,qBAAqB;AACvB;AACA;;;;;EAKE,cAAc;EACd,mBAAmB;EACnB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,cAAc;AAChB;AACA;;;;EAIE,YAAY;EACZ,iBAAiB;EACjB,cAAc;AAChB;AACA;EACE,kBAAkB;AACpB;AACA;EACE,6BAA6B;EAC7B,SAAS;EACT,WAAW;EACX,sBAAsB;EACtB,eAAe;EACf,YAAY;EACZ,cAAc;EACd,+BAA+B;EAC/B,gBAAgB;AAClB;AACA;EACE,SAAS;EA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AAmB;AACrB;AACA;EACE,eAAe;EACf,YAAY;EACZ,YAAY;EACZ,gBAAgB;AAClB;AACA;EACE,cAAc;AAChB;AACA;EACE,cAAc;EACd,yBAAyB;EACzB,yBAAyB;EACzB,mBAAmB;EACnB,sBAAsB;EACtB,yBAAyB;EACzB,qBAAqB;EACrB,iBAAiB;AACnB;AACA;;;EAGE,cAAc;EACd,yBAAyB;EACzB,yBAAyB;AAC3B;AACA;;;;;;EAME,oCAAoC;AACtC;AACA;;EAEE,YAAY;EACZ,qBAAqB;EACrB,mBAAmB;EACnB,YAAY;AACd;AACA;;EAEE,YAAY;EACZ,iBAAiB;EACjB,kBAAkB;EAClB,gBAAgB;AAClB;AACA;EACE,yBAAyB;EACzB,uBAAuB;EACvB,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,SAAS;AACX;AACA;EACE,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,4BAA4B;EAC5B,gBAAgB;EAChB,mBAAmB;EACnB,WAAW;EACX,eAAe;AACjB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,WAAW;EACX,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;EACE,2BAA2B;EAC3B,8BAA8B;EAC9B,0BAA0B;EAC1B,6BAA6B;AAC/B;AACA;EACE,kBAAkB;EAClB,yBAAyB;EACzB,4BAA4B;EAC5B,4BAA4B;EAC5B,+BAA+B;AACjC;AACA;EACE,cAAc;EACd,yBAAyB;AAC3B;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,cAAc;EACd,mBAAmB;AACrB;AACA,YAAY;AACZ;EACE,mBAAmB;EACnB,yBAAyB;EACzB,kBAAkB;AACpB;AACA;EACE,cAAc;AAChB;AACA;EACE,WAAW;EACX,sBAAsB;AACxB;AACA;EACE,WAAW;EACX,6BAA6B;AAC/B;AACA;EACE,SAAS;AACX;AACA;EACE,YAAY;AACd;AACA;EACE,cAAc;EACd,qBAAqB;EACrB,cAAc;EACd,YAAY;AACd;AACA,YAAY;AACZ;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,mBAAmB;EACnB,qBAAqB;AACvB;AACA;;;;;EAKE,cAAc;AAChB;AACA;;;;;;EAME,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;;EAEE,oCAAoC;AACtC;AACA;EACE,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;EACd,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,yBAAyB;AAC3B;AACA;;;;;;;EAOE,cAAc;EACd,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,yBAAyB;EACzB,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;EAEE,qCAAqC;AACvC;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;;;;;EAME,qBAAqB;EACrB,gBAAgB;AAClB;AACA;EACE,oCAAoC;AACtC;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;;;EAGE,mBAAmB;EACnB,cAAc;AAChB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;EAEE,cAAc;AAChB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,oCAAoC;AACtC;AACA;;EAEE,UAAU;AACZ;AACA;EACE,cAAc;EACd,YAAY;AACd;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;EACE,+BAA+B;AACjC;AACA;;EAEE,+BAA+B;AACjC;AACA;EACE,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;;;;EAME,+BAA+B;EAC/B,oCAAoC;EACpC,yBAAyB;AAC3B;AACA;EACE,6BAA6B;AAC/B;AACA;;;;EAIE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;;;EAGE,qCAAqC;AACvC;AACA;EACE,+BAA+B;AACjC;AACA;;;;;;;EAOE,cAAc;EACd,wCAAwC;EACxC,qBAAqB;AACvB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,6BAA6B;AAC/B;AACA;;EAEE,uBAAuB;AACzB;AACA;;EAEE,WAAW;EACX,UAAU;EACV,oBAAoB;EACpB,cAAc;EACd,kBAAkB;EAClB,QAAQ;EACR,SAAS;EACT,WAAW;EACX,UAAU;AACZ;AACA;;;EAGE,WAAW;EACX,kBAAkB;EAClB,YAAY;AACd;AACA;;EAEE,qBAAqB;EACrB,4BAA4B;AAC9B;AACA;EACE,WAAW;EACX,YAAY;EACZ,2tDAA2tD;AAC7tD;AACA;EACE,cAAc;AAChB;AACA;EACE,YAAY;AACd;AACA;EACE,eAAe;EACf,WAAW;EACX,YAAY;EACZ,uWAAuW;AACzW;AACA;EACE,WAAW;EACX,YAAY;EACZ,kBAAkB;EAClB,SAAS;EACT,OAAO;EACP,gBAAgB;AAClB;AACA;EACE,mBAAmB;EACnB,kBAAkB;AACpB;AACA;EACE,kBAAkB;EAClB,YAAY;EACZ,SAAS;EACT,WAAW;EACX,kBAAkB;EAClB,oBAAoB;AACtB;AACA;EACE,yBAAyB;EACzB,WAAW;EACX,gBAAgB;AAClB;AACA;EACE,cAAc;EACd,eAAe;EACf,gBAAgB;EAChB,yBAAyB;AAC3B;AACA;EACE,YAAY;EACZ,WAAW;EACX,YAAY;AACd;AACA;EACE,cAAc;EACd,+BAA+B;EAC/B,WAAW;EACX,iBAAiB;EACjB,gBAAgB;EAChB,kBAAkB;EAClB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,WAAW;EACX,kBAAkB;AACpB;AACA;EACE,kBAAkB;EAClB,iBAAiB;EACjB,YAAY;EACZ,WAAW;EACX,kBAAkB;EAClB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;EACtB,iBAAiB;EACjB,iBAAiB;AACnB;AACA;EACE,YAAY;EACZ,WAAW;EACX,YAAY;EACZ,mBAAmB;EACnB,yBAAyB;EACzB,2BAA2B;EAC3B,8BAA8B;EAC9B,0BAA0B;EAC1B,6BAA6B;EAC7B,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,YAAY;EACZ,WAAW;EACX,YAAY;EACZ,gBAAgB;EAChB,yBAAyB;EACzB,4BAA4B;EAC5B,4BAA4B;EAC5B,+BAA+B;EAC/B,yBAAyB;EACzB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,UAAU;EACV,kBAAkB;EAClB,WAAW;EACX,YAAY;EACZ,SAAS;EACT,kBAAkB;AACpB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,WAAW;EACX,yBAAyB;EACzB,mBAAmB;AACrB;AACA;EACE,WAAW;EACX,qBAAqB;AACvB;AACA;EACE,WAAW;EACX,YAAY;EACZ,yBAAyB;EACzB,yBAAyB;EACzB,SAAS;AACX;AACA;EACE,kBAAkB;AACpB;AACA;EACE,UAAU;AACZ;AACA;EACE,kBAAkB;AACpB;AACA;EACE,kBAAkB;EAClB,WAAW;EACX,YAAY;EACZ,UAAU;AACZ;AACA;EACE,kBAAkB;AACpB;AACA;EACE,2BAA2B;EAC3B,8BAA8B;EAC9B,4BAA4B;EAC5B,+BAA+B;AACjC;AACA;EACE,cAAc;EACd,kBAAkB;AACpB;AACA;EACE,uOAAuO;EACvO,4BAA4B;AAC9B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,WAAW;EACX,aAAa;EACb,YAAY;EACZ,SAAS;EACT,kBAAkB;EAClB,+wCAA+wC;EAC/wC,4BAA4B;EAC5B,+BAA+B;AACjC;AACA;EACE,qBAAqB;AACvB;AACA;EACE,yBAAyB;EACzB,mBAAmB;AACrB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,yBAAyB;EACzB,yBAAyB;EACzB,SAAS;AACX;AACA;;EAEE,WAAW;EACX,WAAW;AACb;AACA;EACE,yBAAyB;EACzB,8BAA8B;EAC9B,0BAA0B;EAC1B,+BAA+B;AACjC;AACA;EACE,2BAA2B;EAC3B,4BAA4B;EAC5B,4BAA4B;EAC5B,6BAA6B;AAC/B;AACA;EACE,SAAS;AACX;AACA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;AACA;EACE,YAAY;EACZ,WAAW;EACX,SAAS;AACX;AACA;EACE,kBAAkB;AACpB;AACA;EACE,kBAAkB;EAClB,gBAAgB;EAChB,qBAAqB;EACrB,WAAW;EACX,mBAAmB;AACrB;AACA;EACE,kBAAkB;EAClB,kBAAkB;AACpB;AACA;EACE,cAAc;EACd,kBAAkB;EAClB,QAAQ;EACR,iBAAiB;EACjB,YAAY;EACZ,eAAe;EACf,yBAAyB;EACzB,yBAAyB;EACzB,mBAAmB;EACnB,sCAAsC;EACtC,WAAW;EACX,kBAAkB;EAClB,WAAW;EACX,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,cAAc;EACd,gBAAgB;EAChB,eAAe;AACjB;AACA;EACE,YAAY;EACZ,WAAW;EACX,mBAAmB;EACnB,wCAAwC;EACxC,sBAAsB;EACtB,kBAAkB;EAClB,QAAQ;EACR,sBAAsB;EACtB,0BAA0B;EAC1B,eAAe;EACf,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;;EAEE,4CAA4C;AAC9C;AACA;EACE,sBAAsB;EACtB,yBAAyB;EACzB,qBAAqB;EACrB,iBAAiB;EACjB,qBAAqB;EACrB,qBAAqB;EACrB,WAAW;EACX,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,yBAAyB;EACzB,WAAW;AACb;AACA;;EAEE,WAAW;EACX,kBAAkB;EAClB,QAAQ;EACR,SAAS;EACT,WAAW;EACX,gBAAgB;EAChB,WAAW;EACX,mBAAmB;AACrB;AACA;EACE,WAAW;EACX,SAAS;EACT,YAAY;AACd;AACA;;EAEE,UAAU;EACV,WAAW;EACX,mBAAmB;EACnB,oBAAoB;AACtB;AACA;EACE,YAAY;AACd;AACA;EACE,WAAW;EACX,YAAY;EACZ,kBAAkB;EAClB,QAAQ;EACR,SAAS;EACT,WAAW;AACb;AACA;EACE,mCAAmC;EACnC,eAAe;EACf,kBAAkB;EAClB,SAAS;EACT,QAAQ;EACR,kBAAkB;EAClB,iBAAiB;EACjB,qBAAqB;EACrB,cAAc;AAChB;AACA;EACE,cAAc;EACd,YAAY;EACZ,WAAW;AACb;AACA;EACE,mBAAmB;EACnB,sBAAsB;AACxB;AACA;EACE,YAAY;EACZ,WAAW;EACX,yBAAyB;AAC3B;AACA;EACE,gBAAgB;EAChB,kBAAkB;EAClB,gBAAgB;AAClB;AACA;EACE,iBAAiB;AACnB;AACA;EACE,kBAAkB;EAClB,gBAAgB;EAChB,kBAAkB;EAClB,wBAAwB;AAC1B;AACA;EACE,UAAU;AACZ;AACA;EACE,WAAW;AACb;AACA;;EAEE,qBAAqB;EACrB,gBAAgB;EAChB,kBAAkB;EAClB,kBAAkB;EAClB,UAAU;EACV,gBAAgB;EAChB,uBAAuB;AACzB;AACA;EACE,gBAAgB;EAChB,cAAc;AAChB;AACA;EACE,gBAAgB;EAChB,cAAc;AAChB;AACA;;EAEE,gBAAgB;EAChB,uBAAuB;AACzB;AACA;EACE,iCAAiC;AACnC;AACA;EACE,2BAA2B;EAC3B,yCAAyC;EACzC,4DAA4D;AAC9D;AACA;EACE;IACE,oBAAoB;EACtB;AACF;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,gBAAgB;EAChB,gBAAgB;AAClB;AACA;;EAEE,aAAa;AACf;AACA;EACE,aAAa;EACb,iBAAiB;AACnB;AACA;EACE,gBAAgB;AAClB;AACA;;EAEE,eAAe;EACf,aAAa;AACf;AACA;EACE,aAAa;EACb,eAAe;EACf,gBAAgB;EAChB,YAAY;EACZ,mBAAmB;AACrB;AACA;EACE,eAAe;AACjB;AACA;EACE,MAAM;EACN,UAAU;AACZ;AACA;EACE,iBAAiB;AACnB;AACA;EACE,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;;EAEE,iBAAiB;EACjB,gBAAgB;EAChB,kBAAkB;EAClB,QAAQ;AACV;AACA;;;EAGE,iBAAiB;AACnB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,cAAc;EACd,gBAAgB;AAClB;AACA;EACE,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;AACA;EACE,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,qBAAqB;EACrB,YAAY;EACZ,sBAAsB;EACtB,mBAAmB;AACrB;AACA;;EAEE,SAAS;AACX;AACA;EACE,YAAY;AACd;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,kBAAkB;EAClB,YAAY;EACZ,WAAW;AACb;AACA;EACE,kBAAkB;EAClB,WAAW;EACX,gBAAgB;EAChB,gBAAgB;EAChB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;EACtB,gBAAgB;EAChB,2BAA2B;EAC3B,mBAAmB;EACnB,gCAAgC;EAChC,uBAAuB;EACvB,eAAe;AACjB;AACA;EACE,UAAU;EACV,gCAAgC;AAClC;AACA;EACE,sBAAsB;AACxB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,8BAA8B;AAChC;AACA;EACE,qBAAqB;EACrB,qCAAqC;AACvC;AACA;EACE,WAAW;EACX,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,eAAe;EACf,gCAAgC;AAClC;AACA;EACE,eAAe;AACjB;AACA;EACE,eAAe;AACjB;AACA;EACE,YAAY;EACZ,WAAW;EACX,kBAAkB;AACpB;AACA;EACE,gBAAgB;EAChB,cAAc;EACd,mCAAmC;EACnC,eAAe;EACf,cAAc;EACd,eAAe;AACjB;AACA;EACE,WAAW;EACX,kBAAkB;AACpB;AACA;EACE,kBAAkB;AACpB;AACA;EACE,eAAe;EACf,cAAc;EACd,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,kBAAkB;EAClB,UAAU;EACV,QAAQ;EACR,UAAU;EACV,WAAW;EACX,YAAY;EACZ,eAAe;AACjB;AACA;EACE,YAAY;AACd;AACA;;;;;EAKE,YAAY;EACZ,mBAAmB;EACnB,kBAAkB;EAClB,UAAU;EACV,wDAAwD;EACxD,QAAQ;EACR,SAAS;EACT,WAAW;EACX,YAAY;AACd;AACA;EACE,WAAW;AACb;AACA;EACE,WAAW;EACX,QAAQ;AACV;AACA;EACE,UAAU;AACZ;AACA;EACE,UAAU;EACV,SAAS;AACX;AACA;EACE,kBAAkB;EAClB,WAAW;EACX,QAAQ;EACR,UAAU;EACV,mBAAmB;EACnB,eAAe;EACf,WAAW;EACX,YAAY;EACZ,eAAe;AACjB;AACA;EACE,WAAW;AACb;AACA;EACE,kBAAkB;EAClB,UAAU;EACV,+BAA+B;EAC/B,yBAAyB;EACzB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,uBAAuB;EACvB,yCAAyC;AAC3C;AACA;EACE,qBAAqB;AACvB;AACA;EACE,UAAU;EACV,uBAAuB;EACvB,4CAA4C;AAC9C;AACA;EACE,sBAAsB;AACxB;AACA;EACE,wBAAwB;EACxB,yCAAyC;AAC3C;AACA;EACE,kBAAkB;AACpB;AACA;EACE,kBAAkB;EAClB,SAAS;EACT,OAAO;EACP,SAAS;AACX;AACA;;EAEE,uBAAuB;AACzB;AACA;EACE,wBAAwB;EACxB,SAAS;EACT,0CAA0C;AAC5C;AACA;;EAEE,uBAAuB;AACzB;AACA,WAAW;AACX;EACE,mBAAmB;AACrB;AACA;EACE,uBAAuB;AACzB;AACA;EACE,cAAc;EACd,YAAY;EACZ,iBAAiB;AACnB;AACA;EACE,cAAc;EACd,UAAU;AACZ;AACA;EACE,gBAAgB;AAClB;AACA;;EAEE,qCAAqC;AACvC;AACA;;EAEE,yBAAyB;EACzB,gBAAgB;AAClB;AACA;EACE,kBAAkB;AACpB;AACA;EACE,YAAY;EACZ,iBAAiB;EACjB,eAAe;AACjB;AACA;EACE,gCAAgC;AAClC;AACA;;EAEE,SAAS;EACT,YAAY;AACd;AACA;EACE,WAAW;EACX,kBAAkB;AACpB;AACA;EACE,YAAY;EACZ,oBAAoB;AACtB;AACA,mBAAmB;AACnB;EACE,uBAAuB;EACvB,4BAA4B;AAC9B;AACA;;EAEE,gBAAgB;AAClB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,YAAY;EACZ,oBAAoB;EACpB,UAAU;AACZ;AACA;EACE,WAAW;EACX,oBAAoB;AACtB;AACA,iBAAiB;AACjB;EACE,mBAAmB;AACrB;AACA;EACE,0BAA0B;EAC1B,mBAAmB;AACrB;AACA;EACE,iBAAiB;EACjB,eAAe;EACf,yBAAyB;EACzB,iBAAiB;AACnB;AACA;EACE,yBAAyB;EACzB,kBAAkB;AACpB;AACA;EACE,+BAA+B;EAC/B,iBAAiB;AACnB;AACA;EACE,8BAA8B;EAC9B,+BAA+B;AACjC;AACA,gBAAgB;AAChB;EACE,6BAA6B;AAC/B;AACA;EACE,mBAAmB;AACrB;AACA;EACE,mBAAmB;AACrB;AACA;EACE,+BAA+B;AACjC;AACA;EACE,0CAA0C;AAC5C;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;EACE,gBAAgB;EAChB,gCAAgC;EAChC,WAAW;EACX,YAAY;AACd;AACA;EACE,kBAAkB;AACpB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,SAAS;AACX;AACA;EACE,6BAA6B;EAC7B,WAAW;EACX,gBAAgB;AAClB;AACA;;EAEE,yBAAyB;EACzB,WAAW;EACX,qBAAqB;AACvB;AACA;;EAEE,kBAAkB;AACpB;AACA;EACE,WAAW;AACb;AACA;EACE,YAAY;AACd;AACA;EACE,yBAAyB;EACzB,WAAW;AACb;AACA;EACE,qBAAqB;EACrB,kBAAkB;AACpB;AACA;;EAEE,cAAc;EACd,sBAAsB;AACxB;AACA;EACE,kBAAkB;EAClB,eAAe;AACjB;AACA;;EAEE,mBAAmB;AACrB;AACA;EACE,mBAAmB;EACnB,uBAAuB;EACvB,yBAAyB;EACzB,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,4BAA4B;EAC5B,yBAAyB;EACzB,cAAc;AAChB;AACA;EACE,UAAU;EACV,YAAY;EACZ,eAAe;EACf,UAAU;EACV,kBAAkB;EAClB,yBAAyB;EACzB,eAAe;EACf,eAAe;EACf,+BAA+B;EAC/B,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,eAAe;EACf,WAAW;AACb;AACA;EACE,gBAAgB;EAChB,iBAAiB;AACnB;AACA;EACE,gBAAgB;AAClB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;EACE,mBAAmB;AACrB;AACA;EACE,kBAAkB;AACpB;AACA;EACE,cAAc;EACd,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,eAAe;EACf,eAAe;EACf,iBAAiB;EACjB,qBAAqB;AACvB;AACA;EACE,aAAa;EACb,eAAe;AACjB;AACA;EACE,aAAa;AACf;AACA;EACE,aAAa;AACf;AACA;EACE,aAAa;EACb,YAAY;AACd;AACA;EACE,YAAY;EACZ,eAAe;EACf,iBAAiB;AACnB;AACA;EACE,iBAAiB;AACnB;AACA;EACE,aAAa;AACf;AACA;;;;EAIE,8BAA8B;EAC9B,gCAAgC;AAClC;AACA;;EAEE,8BAA8B;AAChC;AACA,mBAAmB;AACnB;;EAEE,aAAa;AACf;AACA;EACE,eAAe;AACjB;AACA;EACE;IACE,4BAA4B;IAC5B,iCAAiC;EACnC;EACA;IACE,aAAa;EACf;EACA;IACE,kBAAkB;EACpB;EACA;IACE,yBAAyB;IACzB,yBAAyB;IACzB,8BAA8B;EAChC;EACA;IACE,8BAA8B;EAChC;EACA;IACE,uBAAuB;IACvB,sBAAsB;EACxB;EACA;;IAEE,4BAA4B;EAC9B;EACA;IACE,wBAAwB;EAC1B;EACA;;IAEE,yBAAyB;IACzB,iBAAiB;IACjB,kBAAkB;IAClB,uBAAuB;IACvB,8BAA8B;EAChC;EACA;;IAEE,8BAA8B;EAChC;EACA,qBAAqB;EACrB;IACE,cAAc;IACd,8BAA8B;IAC9B,mBAAmB;IACnB,WAAW;IACX,yBAAyB;IACzB,mBAAmB;IACnB,iBAAiB;EACnB;EACA;IACE,gBAAgB;EAClB;EACA;IACE,wBAAwB;EAC1B;EACA;IACE,gCAAgC;EAClC;EACA;IACE,8BAA8B;IAC9B,+BAA+B;IAC/B,gCAAgC;IAChC,iBAAiB;IACjB,mBAAmB;EACrB;EACA;IACE,mBAAmB;IACnB,+BAA+B;IAC/B,eAAe;IACf,gBAAgB;IAChB,cAAc;IACd,qBAAqB;IACrB,mBAAmB;IACnB,+BAA+B;IAC/B,gCAAgC;EAClC;EACA;IACE,mBAAmB;IACnB,mBAAmB;IACnB,+BAA+B;IAC/B,6BAA6B;IAC7B,gCAAgC;EAClC;EACA;IACE,4BAA4B;IAC5B,mBAAmB;EACrB;EACA;IACE,uCAAuC;EACzC;EACA;;IAEE,YAAY;EACd;EACA,mBAAmB;EACnB;IACE,mBAAmB;EACrB;EACA;IACE,mBAAmB;EACrB;AACF;AACA;EACE,sBAAsB;EACtB,uBAAuB;EACvB,sBAAsB;AACxB;AACA;;;EAGE,qBAAqB;EACrB,mCAAmC;EACnC,kBAAkB;EAClB,mBAAmB;EACnB,cAAc;EACd,mCAAmC;EACnC,kCAAkC;EAClC,0BAA0B;AAC5B;AACA;;EAEE,eAAe;EACf,qBAAqB;EACrB,WAAW;AACb;AACA;EACE,YAAY;EACZ,eAAe;EACf,cAAc;AAChB;AACA;EACE,6BAA6B;EAC7B,YAAY;EACZ,UAAU;EACV,eAAe;EACf,sBAAsB;AACxB;AACA;EACE,UAAU;EACV,cAAc;EACd,kBAAkB;EAClB,kBAAkB;EAClB,iBAAiB;EACjB,eAAe;AACjB;AACA;EACE,eAAe;EACf,YAAY;EACZ,WAAW;EACX,qBAAqB;EACrB,kBAAkB;EAClB,cAAc;AAChB;AACA;EACE,eAAe;EACf,qBAAqB;EACrB,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,cAAc;AAChB;AACA;EACE,kBAAkB;AACpB;AACA;EACE,yBAAyB;EACzB,cAAc;EACd,mBAAmB;EACnB,eAAe;EACf,YAAY;EACZ,eAAe;EACf,cAAc;EACd,kBAAkB;EAClB,iBAAiB;EACjB,kBAAkB;EAClB,QAAQ;EACR,MAAM;EACN,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,WAAW;EACX,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;EACE,gBAAgB;EAChB,YAAY;EACZ,uBAAuB;AACzB;AACA;EACE,mBAAmB;EACnB,uHAAuH;EACvH,mBAAmB;EACnB,kBAAkB;AACpB;AACA;EACE,mBAAmB;EACnB,qHAAqH;EACrH,kBAAkB;EAClB,gBAAgB;AAClB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,mBAAmB;AACrB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,mBAAmB;EACnB,qBAAqB;AACvB;AACA;;;;;EAKE,cAAc;AAChB;AACA;;;;;;EAME,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;;EAEE,oCAAoC;AACtC;AACA;EACE,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;EACd,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,yBAAyB;AAC3B;AACA;;;;;;;EAOE,cAAc;EACd,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,yBAAyB;EACzB,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;EAEE,qCAAqC;AACvC;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;;;;;EAME,qBAAqB;EACrB,gBAAgB;AAClB;AACA;EACE,oCAAoC;AACtC;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;;;EAGE,mBAAmB;EACnB,cAAc;AAChB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;EAEE,cAAc;AAChB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,oCAAoC;AACtC;AACA;;EAEE,UAAU;AACZ;AACA;EACE,cAAc;EACd,YAAY;AACd;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;EACE,+BAA+B;AACjC;AACA;;EAEE,+BAA+B;AACjC;AACA;EACE,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;;;;EAME,+BAA+B;EAC/B,oCAAoC;EACpC,yBAAyB;AAC3B;AACA;EACE,6BAA6B;AAC/B;AACA;;;;EAIE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;;;EAGE,qCAAqC;AACvC;AACA;EACE,+BAA+B;AACjC;AACA;;;;;;;EAOE,cAAc;EACd,wCAAwC;EACxC,qBAAqB;AACvB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;AACrB;AACA;EACE,mBAAmB;EACnB,qBAAqB;AACvB;AACA;;;;;EAKE,cAAc;AAChB;AACA;;;;;;EAME,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;;EAEE,oCAAoC;AACtC;AACA;EACE,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;EACd,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,yBAAyB;AAC3B;AACA;;;;;;;EAOE,cAAc;EACd,oCAAoC;AACtC;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,oCAAoC;EACpC,cAAc;AAChB;AACA;;;;;;;EAOE,yBAAyB;EACzB,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;EAEE,qCAAqC;AACvC;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;;;;;EAME,qBAAqB;EACrB,gBAAgB;AAClB;AACA;EACE,oCAAoC;AACtC;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;AACjC;AACA;;;EAGE,mBAAmB;EACnB,cAAc;AAChB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;EAEE,cAAc;AAChB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,oCAAoC;AACtC;AACA;;EAEE,UAAU;AACZ;AACA;EACE,cAAc;EACd,YAAY;AACd;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;EACE,+BAA+B;AACjC;AACA;;EAEE,+BAA+B;AACjC;AACA;EACE,oCAAoC;EACpC,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;;;;EAME,+BAA+B;EAC/B,oCAAoC;EACpC,yBAAyB;AAC3B;AACA;EACE,6BAA6B;AAC/B;AACA;;;;EAIE,+BAA+B;EAC/B,oCAAoC;EACpC,iBAAiB;AACnB;AACA;;;EAGE,qCAAqC;AACvC;AACA;EACE,+BAA+B;AACjC;AACA;;;;;;;EAOE,cAAc;EACd,wCAAwC;EACxC,qBAAqB;AACvB;AACA;;EAEE,cAAc;AAChB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,kBAAkB;AACpB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ,WAAW;EACX,mBAAmB;AACrB;AACA;EACE,iBAAiB;AACnB;AACA;;EAEE,yBAAyB;AAC3B;AACA;EACE,YAAY;EACZ,kBAAkB;EAClB,kBAAkB;AACpB;AACA;;EAEE,yBAAyB;AAC3B;AACA;;EAEE,yBAAyB;EACzB,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;EAEE,cAAc;AAChB;AACA;;;;EAIE,yBAAyB;AAC3B;AACA;EACE,kBAAkB;AACpB;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,yBAAyB;EACzB,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;;EAEE,yBAAyB;AAC3B;AACA;;;;EAIE,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,sBAAsB;EACtB,mCAAmC;EACnC,eAAe;EACf,kBAAkB;EAClB,WAAW;EACX,YAAY;EACZ,qBAAqB;AACvB;AACA;EACE,cAAc;AAChB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,YAAY;EACZ,uBAAuB;AACzB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,uBAAuB;AACzB;AACA;EACE,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,kBAAkB;AACpB;AACA;;EAEE,kBAAkB;AACpB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB;AACA;;EAEE,yBAAyB;AAC3B;AACA;;EAEE,+BAA+B;EAC/B,8BAA8B;AAChC;AACA;;EAEE,2BAA2B;EAC3B,4BAA4B;AAC9B;AACA;;EAEE,2BAA2B;EAC3B,yBAAyB;AAC3B;AACA;;EAEE,2BAA2B;AAC7B;AACA;;EAEE,+BAA+B;AACjC;AACA;EACE,gCAAgC;AAClC;AACA;EACE,8BAA8B;AAChC;AACA;EACE,8BAA8B;AAChC;AACA;EACE,+BAA+B;AACjC;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,mBAAmB;AACrB;AACA;EACE,sBAAsB;EACtB,uBAAuB;EACvB,qBAAqB;AACvB;AACA;;EAEE,YAAY;EACZ,sBAAsB;EACtB,kBAAkB;EAClB,qBAAqB;AACvB;AACA;;EAEE,qBAAqB;AACvB;AACA;EACE,+BAA+B;AACjC;AACA;;EAEE,gCAAgC;AAClC;AACA;;EAEE,6BAA6B;AAC/B;AACA;;;;;;EAME,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;EACrB,mBAAmB;AACrB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,YAAY;EACZ,mBAAmB;EACnB,YAAY;AACd;AACA;;EAEE,mBAAmB;AACrB;AACA;;EAEE,yBAAyB;AAC3B;AACA;EACE,gCAAgC;AAClC;AACA;EACE,4BAA4B;AAC9B;AACA;EACE,yBAAyB;EACzB,0BAA0B;AAC5B;AACA;;EAEE,qBAAqB;EACrB,kBAAkB;AACpB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,cAAc;EACd,mBAAmB;EACnB,gCAAgC;AAClC;AACA;EACE,2BAA2B;EAC3B,iBAAiB;AACnB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,mBAAmB;EACnB,aAAa;EACb,mBAAmB;EACnB,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;EACnB,aAAa;EACb,mBAAmB;EACnB,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,kBAAkB;EAClB,iBAAiB;AACnB;AACA;EACE,mBAAmB;EACnB,iBAAiB;EACjB,gCAAgC;EAChC,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;EACtB,mBAAmB;EACnB,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB;AACA;EACE,6BAA6B;EAC7B,gBAAgB;AAClB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,6BAA6B;EAC7B,UAAU;EACV,SAAS;AACX;AACA;EACE,6BAA6B;AAC/B;AACA;;EAEE,mBAAmB;AACrB;AACA;;EAEE,sBAAsB;EACtB,mCAAmC;EACnC,eAAe;EACf,kBAAkB;EAClB,cAAc;AAChB;AACA;EACE,iBAAiB;EACjB,gBAAgB;AAClB;AACA;EACE,iBAAiB;EACjB,gBAAgB;AAClB;AACA;;;EAGE,sBAAsB;EACtB,mCAAmC;EACnC,eAAe;EACf,iBAAiB;EACjB,WAAW;EACX,kBAAkB;EAClB,cAAc;AAChB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;;EAEE,eAAe;EACf,mCAAmC;EACnC,UAAU;EACV,MAAM;EACN,cAAc;AAChB;AACA;EACE,YAAY;AACd;AACA;;EAEE,yBAAyB;AAC3B;AACA;EACE,gBAAgB;AAClB;AACA;EACE,mBAAmB;AACrB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,yBAAyB;AAC3B;AACA;;EAEE,wBAAwB;AAC1B;AACA;EACE,yBAAyB;AAC3B;AACA;;;EAGE,mBAAmB;AACrB;AACA;;;;;EAKE,kBAAkB;AACpB;AACA;;;;;EAKE,yBAAyB;AAC3B;AACA;;;EAGE,kBAAkB;EAClB,mBAAmB;EACnB,mBAAmB;EACnB,uBAAuB;AACzB;AACA;;;EAGE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,kBAAkB;AACpB;AACA;EACE,kBAAkB;EAClB,mBAAmB;AACrB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;;;EAGE,yBAAyB;EACzB,oBAAoB;EACpB,sBAAsB;AACxB;AACA;EACE,sBAAsB;AACxB;AACA;EACE,cAAc;EACd,iBAAiB;EACjB,eAAe;EACf,YAAY;AACd;AACA;EACE,gBAAgB;AAClB;AACA;EACE,yBAAyB;EACzB,kBAAkB;AACpB;AACA;EACE,cAAc;AAChB;AACA;EACE,kBAAkB;EAClB,eAAe;EACf,cAAc;AAChB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;EACnB,aAAa;AACf;AACA;EACE,4BAA4B;AAC9B;AACA;;EAEE,mBAAmB;EACnB,+BAA+B;EAC/B,qBAAqB;AACvB;AACA;EACE,+BAA+B;EAC/B,qBAAqB;AACvB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,WAAW;EACX,mBAAmB;EACnB,+BAA+B;EAC/B,qBAAqB;AACvB;AACA;;EAEE,mBAAmB;EACnB,WAAW;EACX,yBAAyB;EACzB,iBAAiB;EACjB,8CAA8C;AAChD;AACA;EACE,eAAe;EACf,kBAAkB;AACpB;AACA;EACE,eAAe;EACf,iBAAiB;AACnB;AACA;EACE,mBAAmB;AACrB;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;EACnB,YAAY;AACd;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,WAAW;EACX,eAAe;EACf,UAAU;EACV,eAAe;EACf,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,gCAAgC;EAChC,iBAAiB;AACnB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,cAAc;EACd,gCAAgC;AAClC;AACA;EACE,gCAAgC;AAClC;AACA;EACE,YAAY;AACd;AACA;EACE,cAAc;AAChB;AACA;;EAEE,yBAAyB;AAC3B;AACA;;EAEE,mBAAmB;EACnB,UAAU;AACZ;AACA;;EAEE,kBAAkB;AACpB;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EACd,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,gBAAgB;AAClB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;;;EAGE,+BAA+B;AACjC;AACA;;;EAGE,gCAAgC;AAClC;AACA;EACE,YAAY;AACd;AACA;EACE,mBAAmB;AACrB;AACA;EACE,kBAAkB;AACpB;AACA;;EAEE,iBAAiB;AACnB;AACA;EACE,WAAW;EACX,sBAAsB;AACxB;AACA;;EAEE,cAAc;EACd,eAAe;AACjB;AACA;;EAEE,cAAc;EACd,eAAe;AACjB;AACA;;EAEE,cAAc;EACd,yBAAyB;EACzB,gBAAgB;AAClB;AACA;;;;EAIE,cAAc;AAChB;AACA;EACE,6BAA6B;EAC7B,cAAc;AAChB;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,iBAAiB;AACnB;AACA;EACE,yBAAyB;EACzB,cAAc;EACd,gBAAgB;AAClB;AACA;EACE,oCAAoC;AACtC;AACA;EACE,cAAc;EACd,gBAAgB;AAClB;AACA;EACE,YAAY;EACZ,iBAAiB;AACnB;AACA;;EAEE,+BAA+B;AACjC;AACA;;EAEE,gCAAgC;AAClC;AACA;EACE,iBAAiB;AACnB;AACA;;EAEE,2EAA2E;AAC7E;AACA;EACE,gBAAgB;AAClB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,YAAY;EACZ,iBAAiB;AACnB;AACA;EACE,cAAc;EACd,gBAAgB;AAClB;AACA;EACE,2EAA2E;AAC7E;AACA;EACE,qBAAqB;EACrB,yBAAyB;AAC3B;AACA;EACE,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,cAAc;EACd,yBAAyB;AAC3B;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,qBAAqB;EACrB,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;EACE,yBAAyB;EACzB,qBAAqB;AACvB;AACA;EACE,mBAAmB;EACnB,cAAc;EACd,qBAAqB;AACvB;AACA;;EAEE,yBAAyB;EACzB,cAAc;AAChB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,oCAAoC;AACtC;AACA;EACE,qBAAqB;AACvB;AACA;EACE,+BAA+B;AACjC;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;AACjC;AACA;EACE,eAAe;AACjB;AACA;EACE,gBAAgB;EAChB,iBAAiB;EACjB,kBAAkB;AACpB;AACA;EACE,kBAAkB;AACpB;AACA;;;EAGE,mCAAmC;AACrC;AACA;EACE,kBAAkB;EAClB,UAAU;AACZ;AACA;EACE,WAAW;EACX,UAAU;EACV,kBAAkB;EAClB,0BAA0B;EAC1B,wDAAwD;EACxD,WAAW;EACX,WAAW;EACX,SAAS;EACT,UAAU;EACV,QAAQ;EACR,kBAAkB;EAClB,mBAAmB;EACnB,uCAAuC;AACzC;AACA;;EAEE,cAAc;AAChB;AACA;EACE,yBAAyB;EACzB,UAAU;EACV,mBAAmB;AACrB;AACA;;EAEE,WAAW;AACb;AACA;EACE,cAAc;AAChB;AACA;EACE,2BAA2B;AAC7B;AACA;EACE,8CAA8C;AAChD;AACA;EACE,gBAAgB;EAChB,yBAAyB;EACzB,cAAc;EACd,gBAAgB;EAChB,iBAAiB;EACjB,kBAAkB;EAClB,YAAY;AACd;AACA;;;;;EAKE,mBAAmB;AACrB;AACA;EACE,mCAAmC;AACrC;AACA;EACE,qBAAqB;EACrB,mCAAmC;AACrC;AACA;EACE,gBAAgB;AAClB;AACA;EACE,iBAAiB;AACnB;AACA;;;;EAIE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB;AACA;;EAEE,kBAAkB;AACpB;AACA;EACE,iBAAiB;AACnB;AACA;EACE,cAAc;AAChB;AACA;EACE,+BAA+B;AACjC;AACA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB;AACA;;;;EAIE,YAAY;EACZ,0CAA0C;AAC5C;AACA;;;;EAIE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB;AACA;;;;;EAKE,cAAc;AAChB;AACA;EACE,aAAa;EACb,eAAe;AACjB;AACA;EACE,eAAe;AACjB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,eAAe;EACf,sBAAsB;AACxB;AACA;;EAEE,yBAAyB;AAC3B;AACA;EACE,cAAc;EACd,yBAAyB;AAC3B;AACA;;;;EAIE,cAAc;EACd,yBAAyB;AAC3B;AACA;;;;;;;EAOE,cAAc;EACd,yBAAyB;EACzB,qBAAqB;AACvB;AACA;EACE,cAAc;AAChB;AACA;EACE,6BAA6B;EAC7B,sCAAsC;EACtC,UAAU;AACZ;AACA;EACE,sCAAsC;AACxC;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,UAAU;EACV,sBAAsB;EACtB,kBAAkB;EAClB,mCAAmC;EACnC,eAAe;EACf,cAAc;EACd,kBAAkB;AACpB;AACA;;;;EAIE,oCAAoC;EACpC,iBAAiB;AACnB;AACA;;EAEE,UAAU;EACV,kBAAkB;EAClB,mCAAmC;EACnC,eAAe;EACf,cAAc;EACd,8BAA8B;EAC9B,kBAAkB;AACpB;AACA;;;;EAIE,8BAA8B;AAChC;AACA;EACE,QAAQ;AACV;AACA;EACE,OAAO;AACT;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gCAAgC;AAClC;AACA;EACE,gCAAgC;AAClC;AACA;EACE,6BAA6B;AAC/B;AACA;EACE,yBAAyB;AAC3B;AACA;;EAEE,wBAAwB;AAC1B;AACA;;EAEE,sBAAsB;EACtB,cAAc;AAChB;AACA;;;;EAIE,0CAA0C;AAC5C;AACA;;EAEE,oCAAoC;AACtC;AACA;;;;EAIE,oCAAoC;AACtC;AACA;EACE,aAAa;AACf;AACA,qCAAqC;AACrC;EACE,mCAAmC;EACnC,2GAA2G;EAC3G,mBAAmB;EACnB,kBAAkB;AACpB;AACA,2CAA2C;AAC3C;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA;EACE,gBAAgB;AAClB;AACA,kDAAkD;AAClD;EACE,gBAAgB;EAChB,mBAAmB;AACrB;AACA;EACE,cAAc;AAChB;AACA,6BAA6B;AAC7B;;EAEE,4BAA4B;EAC5B,+BAA+B;EAC/B,uBAAuB;AACzB;AACA;EACE,2BAA2B;EAC3B,8BAA8B;EAC9B,sBAAsB;AACxB;AACA;;;EAGE,kBAAkB;AACpB;AACA;EACE,wBAAwB;AAC1B;AACA,QAAQ;AACR;EACE,wCAAwC;AAC1C;AACA;EACE;IACE,uBAAuB;EACzB;EACA;IACE,yBAAyB;EAC3B;AACF;AACA;EACE;IACE,uBAAuB;EACzB;EACA;IACE,yBAAyB;EAC3B;AACF\",\"sourcesContent\":[\".webix_view {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n -webkit-font-smoothing: antialiased;\\n cursor: default;\\n overflow: hidden;\\n border: 0px solid #DADEE0;\\n background-color: #FFFFFF;\\n white-space: normal;\\n -webkit-appearance: none;\\n}\\n.webix_view.webix_form {\\n background-color: #FFFFFF;\\n}\\nbody {\\n -webkit-tap-highlight-color: transparent !important;\\n}\\n/*\\n\\twebix_layout_{type}\\n\\tknown types are: line, clean, wide, space;\\n*/\\n.webix_abslayout {\\n position: relative;\\n}\\n.webix_abslayout > .webix_view {\\n position: absolute !important;\\n z-index: 0;\\n}\\n.webix_layout_space {\\n background-color: #EBEDF0;\\n}\\n.webix_layout_wide {\\n background-color: #EBEDF0;\\n}\\n.webix_layout_line,\\n.webix_multiview,\\n.webix_layout_clean,\\n.webix_layout_accordion {\\n background: transparent;\\n}\\n.webix_overlay {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n z-index: 90;\\n text-align: center;\\n padding-top: 10px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_view > .webix_disabled {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n left: 0;\\n background-color: #ddd;\\n opacity: 0.4;\\n z-index: 92;\\n cursor: not-allowed;\\n}\\n.webix_disabled_view {\\n overflow: hidden !important;\\n position: relative;\\n}\\nbody.webix_full_screen {\\n margin: 0;\\n padding: 0;\\n overflow: hidden;\\n}\\nbody.webix_noselect {\\n overscroll-behavior: none;\\n}\\n.webix_noselect,\\n.webix_noselect div {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_selectable {\\n -moz-user-select: text;\\n -webkit-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n.webix_template {\\n height: 100%;\\n padding: 4px 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_clean {\\n background: transparent;\\n}\\n.webix_clean .webix_template {\\n padding: 0px;\\n}\\n.webix_section {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background-color: transparent;\\n position: relative;\\n color: #444;\\n font-size: 10px;\\n text-transform: uppercase;\\n line-height: 44px;\\n}\\n.webix_section:before {\\n content: '';\\n display: block;\\n width: 100%;\\n height: 1px;\\n background-color: #DADEE0;\\n position: absolute;\\n top: 50%;\\n}\\n.webix_section > .webix_template {\\n padding: 0px 8px;\\n margin-left: 30px;\\n background-color: #FFFFFF;\\n display: inline;\\n position: relative;\\n}\\n.webix_layout_space > .webix_section > .webix_template {\\n padding: 0px 8px;\\n background-color: #EBEDF0;\\n}\\n.webix_layout_wide > .webix_section > .webix_template {\\n padding: 0px 8px;\\n background-color: #EBEDF0;\\n}\\n.webix_layout_line > .webix_section > .webix_template,\\n.webix_layout_clean > .webix_section > .webix_template {\\n padding: 0px 8px;\\n background-color: #FFFFFF;\\n}\\n.webix_header {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n line-height: 42px;\\n}\\n.webix_header .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_header.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_header.webix_dark .webix_el_button,\\n.webix_header.webix_dark .webix_el_label .webix_el_box,\\n.webix_header.webix_dark .webix_inp_label,\\n.webix_header.webix_dark .webix_inp_top_label,\\n.webix_header.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_secondary .webix_icon,\\n.webix_header.webix_dark .webix_transparent .webix_icon,\\n.webix_header.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_header.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_header.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_header.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_transparent button:hover,\\n.webix_header.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_header.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_header.webix_dark .webix_secondary button,\\n.webix_header.webix_dark .webix_inp_counter_next,\\n.webix_header.webix_dark .webix_inp_counter_prev,\\n.webix_header.webix_dark .webix_segment_0,\\n.webix_header.webix_dark .webix_segment_1,\\n.webix_header.webix_dark .webix_segment_N,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_header.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_header.webix_dark .webix_secondary button:hover,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_header.webix_dark .webix_inp_counter_next:hover,\\n.webix_header.webix_dark .webix_inp_counter_prev:hover,\\n.webix_header.webix_dark .webix_segment_0:hover,\\n.webix_header.webix_dark .webix_segment_1:hover,\\n.webix_header.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_header.webix_dark .webix_secondary button:focus,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_header.webix_dark .webix_inp_counter_next:focus,\\n.webix_header.webix_dark .webix_inp_counter_prev:focus,\\n.webix_header.webix_dark .webix_segment_0:focus,\\n.webix_header.webix_dark .webix_segment_1:focus,\\n.webix_header.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_secondary button:active,\\n.webix_header.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_header.webix_dark .webix_inp_counter_next:active,\\n.webix_header.webix_dark .webix_inp_counter_prev:active,\\n.webix_header.webix_dark .webix_segment_0:active,\\n.webix_header.webix_dark .webix_segment_1:active,\\n.webix_header.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_inp_static,\\n.webix_header.webix_dark input[type=text],\\n.webix_header.webix_dark input[type=combo],\\n.webix_header.webix_dark input[type=datepicker],\\n.webix_header.webix_dark textarea,\\n.webix_header.webix_dark select,\\n.webix_header.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_header.webix_dark .webix_el_texthighlight input,\\n.webix_header.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_header.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_header.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_multicombo_value,\\n.webix_header.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_header.webix_dark .webix_inp_static:focus,\\n.webix_header.webix_dark input[type=text]:focus,\\n.webix_header.webix_dark input[type=combo]:focus,\\n.webix_header.webix_dark input[type=datepicker]:focus,\\n.webix_header.webix_dark textarea:focus,\\n.webix_header.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_header.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_header.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_header.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0,\\n.webix_header.webix_dark .webix_selected.webix_segment_1,\\n.webix_header.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_header.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_header.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_header.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_header.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_header.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_header.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_header.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_header.webix_dark .webix_el_icon,\\n.webix_header.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_header.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_header.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_header.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_header.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_header.webix_dark .webix_custom_checkbox,\\n.webix_header.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_custom_checkbox:focus,\\n.webix_header.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_header.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_header.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_header.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_header.webix_dark .webix_invalid .webix_el_box input,\\n.webix_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_header.webix_dark .webix_invalid .webix_el_box select,\\n.webix_header.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_header.webix_dark input.webix_invalid,\\n.webix_header.webix_dark select.webix_invalid,\\n.webix_header.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_header.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_header.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_header.webix_dark {\\n color: #FFFFFF;\\n}\\n.webix_header > div {\\n line-height: 44px;\\n padding-left: 10px;\\n padding-top: 0;\\n padding-bottom: 0;\\n}\\n.webix_spacer {\\n background: transparent;\\n}\\n.webix_view_animate {\\n position: relative;\\n width: 100%;\\n height: 100%;\\n}\\nx\\\\:ui {\\n display: none;\\n}\\n.webix_view.webix_flexlayout {\\n display: flex !important;\\n flex-wrap: wrap;\\n flex-direction: row;\\n overflow: hidden;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_flexlayout > div {\\n display: block !important;\\n}\\n.webix_view_align {\\n background: transparent;\\n}\\n.webix_view div,\\n.webix_view span,\\n.webix_view a.webix_list_item,\\n.webix_view.webix_window {\\n outline: none;\\n}\\ntextarea,\\ninput,\\nselect,\\nbutton,\\n.webix_view div.webix_inp_static:focus {\\n outline: none;\\n}\\n.webix_resize_area {\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n width: 100%;\\n height: 100%;\\n}\\n.webix_resize_handle_x .webix_handle_content,\\n.webix_resize_handle_y .webix_handle_content {\\n width: 100%;\\n height: 100%;\\n background: rgba(100, 100, 100, 0.1);\\n border: 1px dotted #ebebeb;\\n}\\n.webix_resize_handle_x {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n cursor: ew-resize;\\n width: 1px;\\n height: 100%;\\n position: absolute;\\n z-index: 2;\\n top: 0px;\\n}\\n.webix_resize_handle_x .webix_handle_content {\\n border-width: 0px 1px;\\n}\\n.webix_resize_origin_x {\\n cursor: ew-resize;\\n width: 3px;\\n height: 100%;\\n position: absolute;\\n z-index: 2;\\n top: 0px;\\n}\\n.webix_resize_handle_y {\\n cursor: ns-resize;\\n height: 1px;\\n width: 100%;\\n position: absolute;\\n z-index: 2;\\n left: 0px;\\n}\\n.webix_resize_handle_y .webix_handle_content {\\n border-width: 1px 0px;\\n}\\n.webix_resize_origin_y {\\n cursor: ns-resize;\\n height: 3px;\\n width: 100%;\\n position: absolute;\\n z-index: 2;\\n left: 0px;\\n}\\n.webix_resizer {\\n position: relative;\\n}\\n.webix_resizer.webix_disabled_view {\\n cursor: default;\\n}\\n.webix_resizer_vy {\\n cursor: ns-resize;\\n margin-top: 0px !important;\\n border: 0px !important;\\n padding: 0px !important;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAADAQMAAABCowZuAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA9JREFUCB1jXMUABoxAGgAJaAFXPIkJqAAAAABJRU5ErkJggg==\\\") no-repeat center center;\\n}\\n.webix_resizer_vx {\\n cursor: ew-resize;\\n margin-left: 0px !important;\\n border: 0px !important;\\n padding: 0px !important;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAXAQMAAAD0oWdxAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA5JREFUeF5jWMDAQDwGAKyuB4FpGQdzAAAAAElFTkSuQmCC\\\") no-repeat center center;\\n}\\n.webix_resizer_y {\\n cursor: ns-resize;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAADAQMAAABCowZuAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA9JREFUCB1jXMUABoxAGgAJaAFXPIkJqAAAAABJRU5ErkJggg==\\\") no-repeat center center;\\n background-color: #ffffff;\\n}\\n.webix_resizer_x {\\n cursor: ew-resize;\\n background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAXAQMAAAD0oWdxAAAABlBMVEUAAACkvtSA7tmIAAAAAXRSTlMAQObYZgAAAA5JREFUeF5jWMDAQDwGAKyuB4FpGQdzAAAAAElFTkSuQmCC\\\") no-repeat center center;\\n background-color: #ffffff;\\n}\\n.webix_accordionitem_body {\\n position: relative;\\n}\\n.webix_accordionitem_body > div {\\n border-width: 0px!important;\\n}\\n.webix_accordionitem_header {\\n border-bottom: 1px solid #DADEE0;\\n position: relative;\\n z-index: 2;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n line-height: 42px;\\n cursor: pointer;\\n overflow: hidden;\\n}\\n.webix_accordionitem_header.webix_dark {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_accordionitem_header.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_button,\\n.webix_accordionitem_header.webix_dark .webix_el_label .webix_el_box,\\n.webix_accordionitem_header.webix_dark .webix_inp_label,\\n.webix_accordionitem_header.webix_dark .webix_inp_top_label,\\n.webix_accordionitem_header.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_transparent .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_accordionitem_header.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_accordionitem_header.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_accordionitem_header.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_transparent button:hover,\\n.webix_accordionitem_header.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_accordionitem_header.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev,\\n.webix_accordionitem_header.webix_dark .webix_segment_0,\\n.webix_accordionitem_header.webix_dark .webix_segment_1,\\n.webix_accordionitem_header.webix_dark .webix_segment_N,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button:hover,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next:hover,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev:hover,\\n.webix_accordionitem_header.webix_dark .webix_segment_0:hover,\\n.webix_accordionitem_header.webix_dark .webix_segment_1:hover,\\n.webix_accordionitem_header.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button:focus,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next:focus,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev:focus,\\n.webix_accordionitem_header.webix_dark .webix_segment_0:focus,\\n.webix_accordionitem_header.webix_dark .webix_segment_1:focus,\\n.webix_accordionitem_header.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_secondary button:active,\\n.webix_accordionitem_header.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_next:active,\\n.webix_accordionitem_header.webix_dark .webix_inp_counter_prev:active,\\n.webix_accordionitem_header.webix_dark .webix_segment_0:active,\\n.webix_accordionitem_header.webix_dark .webix_segment_1:active,\\n.webix_accordionitem_header.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_inp_static,\\n.webix_accordionitem_header.webix_dark input[type=text],\\n.webix_accordionitem_header.webix_dark input[type=combo],\\n.webix_accordionitem_header.webix_dark input[type=datepicker],\\n.webix_accordionitem_header.webix_dark textarea,\\n.webix_accordionitem_header.webix_dark select,\\n.webix_accordionitem_header.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_texthighlight input,\\n.webix_accordionitem_header.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_accordionitem_header.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_multicombo_value,\\n.webix_accordionitem_header.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_accordionitem_header.webix_dark .webix_inp_static:focus,\\n.webix_accordionitem_header.webix_dark input[type=text]:focus,\\n.webix_accordionitem_header.webix_dark input[type=combo]:focus,\\n.webix_accordionitem_header.webix_dark input[type=datepicker]:focus,\\n.webix_accordionitem_header.webix_dark textarea:focus,\\n.webix_accordionitem_header.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_accordionitem_header.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_accordionitem_header.webix_dark .webix_el_icon,\\n.webix_accordionitem_header.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_accordionitem_header.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_accordionitem_header.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_accordionitem_header.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_accordionitem_header.webix_dark .webix_custom_checkbox,\\n.webix_accordionitem_header.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_custom_checkbox:focus,\\n.webix_accordionitem_header.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_accordionitem_header.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_accordionitem_header.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_accordionitem_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_accordionitem_header.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_accordionitem_header.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_accordionitem_header.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box input,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box select,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_accordionitem_header.webix_dark input.webix_invalid,\\n.webix_accordionitem_header.webix_dark select.webix_invalid,\\n.webix_accordionitem_header.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_accordionitem_header.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_accordionitem_label {\\n height: 100%;\\n padding-left: 10px;\\n}\\n.webix_accordionitem_button {\\n float: right;\\n position: relative;\\n height: 11px;\\n width: 11px;\\n margin: 14.5px 13px;\\n}\\n.webix_carousel {\\n position: relative;\\n}\\n.webix_nav_panel {\\n bottom: 16px;\\n height: 14px;\\n line-height: 14px;\\n overflow: hidden;\\n position: absolute;\\n text-align: center;\\n padding: 2px 0;\\n}\\n.webix_nav_item {\\n display: inline-block;\\n height: 10px;\\n margin: 0 2px;\\n width: 10px;\\n cursor: pointer;\\n border-radius: 50%;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n}\\n.webix_nav_inactive {\\n border: 2px solid rgba(0, 0, 0, 0.15);\\n opacity: 0.6;\\n background: #fff;\\n}\\n.webix_nav_active {\\n border: 2px solid rgba(0, 0, 0, 0.1);\\n background: #fff;\\n}\\n.webix_nav_active:hover,\\n.webix_nav_active:focus {\\n box-shadow: 0 0 2px #fff;\\n}\\n.webix_nav_button_prev,\\n.webix_nav_button_next {\\n cursor: pointer;\\n display: block;\\n height: 32px;\\n line-height: 32px;\\n position: absolute;\\n width: 32px;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_nav_button_next .webix_nav_button_inner {\\n height: 100%;\\n width: 100%;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowNDNEOTBEMTYyNzQxMUUzOEU1N0MyQTEyMzIxMDVFQSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowNDNEOTBEMjYyNzQxMUUzOEU1N0MyQTEyMzIxMDVFQSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA0M0Q5MENGNjI3NDExRTM4RTU3QzJBMTIzMjEwNUVBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA0M0Q5MEQwNjI3NDExRTM4RTU3QzJBMTIzMjEwNUVBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+yGPRLgAAAPBJREFUeNpi+P//vycQP/tPfQAy05MRxGBgYJBkoA14DrLgPwMNARMDjcGgteAINN5CCaokI3UcB2I+UNQBsTghxaRacAaI+aH62IB4MzUtuAjEwlA9zEC8hhhNxFpwFYhFkQxfTqyriLHgFhBLQtWC8s18UsKUkAV3gVgGyfBZpKYIQhbYQtWAcBg5BRIhC26j+WAOtS0AgRvQ9A6L4IXUtgAELqOlopXUtgAEzgOxIFQPKxCvo7YFIHAKLSdvo7YFIHAUiHmgeiUIKSanNLUC4i1ALAHENoQUD48a7TkNzX8BsiAFxKCB4U+BOBkgwAAsAiGcWMs58QAAAABJRU5ErkJggg==\\\");\\n}\\n.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEODJBRDc2RTYyNzMxMUUzQTMxN0IxNjAwN0JBOUE4OSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEODJBRDc2RjYyNzMxMUUzQTMxN0IxNjAwN0JBOUE4OSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ4MkFENzZDNjI3MzExRTNBMzE3QjE2MDA3QkE5QTg5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ4MkFENzZENjI3MzExRTNBMzE3QjE2MDA3QkE5QTg5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+crpRPgAAAOhJREFUeNpi+P//vycQP/tPfQAy05MRxGBgYJBkoA14DrLgPwMNARMDjcGgsCAMGkdHyLKBiNQgDoomIOYH4uOkJiViLNgMxGxIlpyhtgUgsAaImaHqhYH4IrUtAIHlSJaIAvFValsAAvOBmBGqTxKIb1HbAhCYhWSJDBDfobYFIBAO1QvCNtS2YA6SD6SB+DY1LViIFNFiQHydmnGwEi0VXaZmKloHxKxQ9YJAfJ6a+WAbWk4+Re2cLAFVxwPER0lNEcSUpjZALAHEW4DYitTCdHjUaM9paP4LkAUpIAYNDH8KxMkAAQYAlwMhmq8XxigAAAAASUVORK5CYII=\\\");\\n}\\n.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_panel_corner {\\n right: 80px;\\n}\\n.webix_nav_button_corner.webix_nav_button_prev {\\n bottom: 9px;\\n right: 44px;\\n}\\n.webix_nav_button_corner.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_corner.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_button_corner.webix_nav_button_next {\\n bottom: 9px;\\n right: 8px;\\n}\\n.webix_nav_button_corner.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_corner.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_panel_side {\\n margin: 0 auto;\\n left: 0;\\n width: 100%;\\n}\\n.webix_nav_button_side {\\n height: 86px;\\n line-height: 86px;\\n width: 56px;\\n top: 50%;\\n margin-top: -43px;\\n}\\n.webix_nav_button_side.webix_nav_button_next {\\n left: auto;\\n right: 16px;\\n}\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTc4MTkxODY2MzBGMTFFMzk1MUQ4RTNCRjNCMUVFRUMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTc4MTkxODU2MzBGMTFFMzk1MUQ4RTNCRjNCMUVFRUMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4NjlGM0NFNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA4NjlGM0NGNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+D/KEcQAAAOhJREFUeNqs1jsOwjAMBuCKhR2uxsLGxg1a+hD0wVGYGJC4DgssnAFVQjLukKWk/WM7lv4OqfQ1UdLWCRGtOTdOz3lwtpzEkuFyp/9KreiX/JVa0DdNV6ZF9zRfmQYdcgbwQYNGhccDXQzYN4jgXIOa4bkntgAuNKgaDtlNMRx69hoAlxpUBEvfawRXGnRIjeBFIq8e3F9KZ5mDWXbS5QeBEjQYDEULALbSwy8GEYrARvpBUYNTaGkBfagZHKMIrKU/vioW6NANAE+aZuIVE3RoHxN06NUDHq2t5Ipz4Xw4T87O2vT+BBgAeQQKvezNqP0AAAAASUVORK5CYII=\\\");\\n}\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_nav_button_side.webix_nav_button_prev {\\n left: 16px;\\n right: auto;\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner {\\n opacity: 0.8;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjIzRTVCQkY2MzBGMTFFM0FDNTBDNzdDRkQ0NTI0NzciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjIzRTVCQkU2MzBGMTFFM0FDNTBDNzdDRkQ0NTI0NzciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4NjlGM0NFNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA4NjlGM0NGNjE4OTExRTNBRjMwOTNFODNBRTJCRENBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+wRT1eAAAAM9JREFUeNqs1jsKwlAQBdDBxlL3ZmVlmRXYaaVbCYg7kti4BQu1e85AhBDfZz73wm1ewsmfDKWUKNgNd+C+uVfuOgoe0n8uaFDyQoOSOxqU7NDgUfaDgxZUDWpRE6hBzWALdYE11A2W0BCYQ8PgHIWAUxQG/lAoKF0Q0ZLq+ZA1o35qnO3eevlweL4AgXOL5yhc2hCCa0d0w63744I1T9MMa989E2z5/NSw9Retgj3DRAveeseeGnyLDGgl+BkdJXNwH0WlHfcxDr09d/UVYADVjwptZ8mPvQAAAABJRU5ErkJggg==\\\");\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_carousel > .webix_scroll_x,\\n.webix_carousel > .webix_scroll_y {\\n background-color: rgba(0, 0, 0, 0);\\n}\\n.webix_dark .webix_nav_inactive {\\n background-color: #95a5a6;\\n}\\n.webix_dark .webix_nav_active {\\n background-color: #7f8c8d;\\n}\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSIURgotfwAAASxJREFUSMfNlbErhlEUh5/vJZOSQSijshgsFiklhdj0lcHw5SP7uX+A8we4d1c+g2RgsIjIxmCxGCzKRO9bMjCSWE5WpXPrO9MZbs9T5577u7XNrTgPtIBBfKsEmkUmOMZsFZngv5KCzNW2gmsbbT2H4AZY0CAVcOUtuAXmNMi7xtQF7HgK7oBZDfKmMXUAB8Cil+AemNEgrwbfB5a8LvnB4C8aU83Gsuy1RY/AtAYpDb4NNDzXtKFBnqyvA+ve72BXYxqy/shyy1UwDFxqTP0a5BvYAPa8X/KISfo0yBewChx6R8UocKEx9ZpkBTj2zqIx4Fxj6tEgn7aqZ95RMQ6cakzdGuTDxuUedhPAicY0AEz+dbjzn3E9ZX9ue3w4ZUZ+VQBrQJUB/gw0fwC/UlVpnH2f9AAAAABJRU5ErkJggg==\\\");\\n}\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSENCUzWfAAAAS1JREFUSMfN1TFLXEEUhuFnr8FKCBaGiK2FRQobG7GSgBG2E8IWFmE3wX7uD3B+QOb2QpaAiMWmsAkJBtMEizQ2FmmCXcIuhBRpDZI0g7XCXNhTD+8L53znTGf/ddrGEIvK1hiDqiW4zBxWLcFvJZWWayoEz3Mbz9sSfIl1mKCLr20I3sTUzMY6/MEzXJQWdHEcUzOTJVu4LD3kHRxlyW88xbfSKerldnViHX5lyffSMX2BgywZYxNXpffgVY6uWIcfWVpUMMQIYmqW8Lak4BB7sQ7/Ymoe4QzLpQQj9GMdbmJqFvAZK6WGfILdDJ/HJzwpFdOP6MU6/I2peYhTrJZctH6sw3VMzRw+YK30qdiIqXmM91i/b+Qe3OHNu6n/cMYt8icVXmLSAvwnBv8B+EFU7qlZ1xIAAAAASUVORK5CYII=\\\");\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSI77dsQJgAAARxJREFUSMet1jFqAkEUxvH/rkIqLVN5ES2CjScQG6tUESx3SWOMLKgggt7BC6SxsnIr9w4ewAsEEis3RTBE3N3ZmfemHB4/HsPMm89L0xTJilbrLrAAGsAWeKkKwTEw/bfVAy6ea6cZ4HV9+8ogwMm6UwMI8Owrg5MoDDa+MjgF8LXBUqgtaERdwELUFcxFJWAmKgXvUA3wBtUC/1BNEKBCra4KXjt9MNScbadYJd7t9nGSVIGnnJpOnCRf7VbzYNMpURi8A7OCumW0Wr9aodrw7T39hedS+P5FhcFYCme/fSGcP6UEcPE8dYTNk98BLvdHWcLlf1ML2CVMzIC3gpK+U5YywEdJQMuDP50CmuGMt55C6B0AI+AR+ACGPw26r6m12WOpAAAAAElFTkSuQmCC\\\");\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAiCAYAAACwaJKDAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gcdCSE1IU5u4gAAAW1JREFUSMet1rtOwzAUgOG/5jbBwsQD8BAwIAa2TggegjmRgELbuFeo1GRlQEJMMDN264CUiYdgg0dolzIkFUEk9nHSbLGtT76cc+xaMA53gUegDnwCgfa9Vyp8CngCToFNYB940WF0WRWt57SPqsAK+C7oG+kwuiqLdg3992Xgtelk8jGN4w3gqGDMyTSOZ8eHB+8uM0X7XhMYGMbd6TC6dkIzcH8VsMr+aN9rCeCGEyqEhzZY5TWmcM8C3zihKdy2wIMiWJmWURZWtk1P4a4FvnVCUziwwP0srKQBLYSbALXFYuGU1zqMNBAYhrRUiSI0s/RvKcdZNoChcQt8Tz5TKSg/fQdQFqdJcJvAXha0Z1QCDixgW577drCbBxZXKRkYyOtpkm6lwf+VPwH7VcC/d5Qd7EjA39s0KQQ2UIvvfbZ3zoEHU2Rp3+u4vlDGqwSX6N4qwSX6ltMelAUB1oELYA6cAV/poTxXeZ/+AOFqn1e/Gh7yAAAAAElFTkSuQmCC\\\");\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n opacity: 1;\\n}\\n.webix_list_item {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 2px 12px;\\n line-height: 31px;\\n cursor: pointer;\\n border-bottom: 1px solid #EDEFF0;\\n text-align: left;\\n border-color: #EDEFF0;\\n}\\n.webix_list_icon {\\n vertical-align: middle;\\n margin-right: 4px;\\n}\\n.webix_list_item.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_list_item.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_list_item.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_list .webix_list_item.webix_selected {\\n border-bottom: 1px solid #EDEFF0;\\n padding: 2px 12px;\\n}\\n.webix_group {\\n position: relative;\\n}\\n.webix_group_back,\\n.webix_group_back.webix_selected {\\n position: relative;\\n background: #F4F5F9;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_arrow_icon {\\n position: absolute;\\n top: 50%;\\n bottom: 50%;\\n margin-top: -10px;\\n right: 8px;\\n width: 20px;\\n height: 20px;\\n line-height: 20px;\\n color: #475466;\\n font-size: 20px;\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_arrow_icon:before {\\n content: '\\\\F003';\\n}\\n.webix_group_back {\\n padding-left: 33px;\\n}\\n.webix_group_back .webix_arrow_icon {\\n left: 8px;\\n}\\n.webix_group_back .webix_arrow_icon:before {\\n content: '\\\\F002';\\n}\\n.dhx_pagelist {\\n position: relative;\\n}\\n.webix_list_count {\\n float: right;\\n width: 25px;\\n font-size: 14px;\\n text-align: center;\\n margin-right: 45px;\\n box-shadow: 0 1px 0 #000000;\\n text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.6);\\n}\\n.webix_unit_header {\\n padding: 0 12px;\\n line-height: 35px;\\n text-align: left;\\n background-color: #F4F5F9;\\n}\\n.webix_list-x .webix_list_item {\\n display: inline-block;\\n vertical-align: top;\\n border-right: 1px solid #EDEFF0;\\n border-bottom: none;\\n border-color: #EDEFF0;\\n}\\n.webix_list-x .webix_list_item.webix_selected {\\n border-left: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n padding-left: 11px;\\n}\\n.webix_list-x .webix_scroll_cont {\\n display: inline-block;\\n}\\n.webix_view.webix_list-x {\\n white-space: nowrap;\\n}\\n/* Style for disabled items */\\n.webix_list_item.webix_disabled {\\n color: #8b949e;\\n background-color: #FFFFFF;\\n cursor: not-allowed;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_list_item.webix_disabled:focus {\\n background-color: #FFFFFF;\\n}\\n.webix_list_item.webix_disabled .webix_badge {\\n background-color: #eab993;\\n}\\n.webix_list_item.webix_disabled .webix_submenu_icon {\\n visibility: hidden;\\n}\\n/*button of pager*/\\n.webix_view.webix_pager {\\n padding: 3px 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background-color: transparent;\\n}\\n.webix_pager_item,\\n.webix_pager_item_selected {\\n padding: 0 6px;\\n text-align: center;\\n height: 100%;\\n width: auto;\\n min-width: 32px;\\n margin: 0 2px;\\n cursor: pointer;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border-radius: 2px;\\n}\\n.webix_pager_item .webix_icon,\\n.webix_pager_item_selected .webix_icon {\\n line-height: 0;\\n font-size: 17px;\\n}\\n.webix_pager_item {\\n background: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_pager_item:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:active {\\n background-color: #daddeb;\\n}\\n.webix_pager_item:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_pager_item:active {\\n background-color: #daddeb;\\n}\\n/*selected button of pager*/\\n.webix_pager_item_selected {\\n cursor: default;\\n}\\n.webix_pager_item_selected:hover {\\n background-color: #1992af;\\n}\\n.webix_pager_item_selected:focus {\\n background-color: #1992af;\\n}\\n.webix_pager_item_selected:active {\\n background-color: #17839d;\\n}\\n.webix_animation .webix_ss_header {\\n position: relative;\\n z-index: 1;\\n}\\n.webix_animation .webix_ss_vscroll_header {\\n z-index: 1;\\n}\\n.webix_animation .webix_ss_footer,\\n.webix_animation .webix_vscroll_x {\\n position: absolute;\\n bottom: 0px;\\n z-index: 1;\\n}\\n/*helper for allowing selection*/\\n.webix_allow_selection {\\n -moz-user-select: text;\\n -webkit-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n/*default item in dataview*/\\n.webix_dataview_item {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 2px 12px;\\n line-height: 31px;\\n cursor: pointer;\\n border-bottom: 1px solid #EDEFF0;\\n text-align: left;\\n border-color: #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_dataview_item.webix_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_dataview_item.webix_disabled {\\n color: #94A1B3;\\n}\\n.webix_dataview_item.webix_selected.webix_disabled {\\n box-shadow: inset 2px 0 #94A1B3;\\n}\\n.webix_dataview_item .webix_icon {\\n font-size: 20px;\\n}\\n/*default item in selected state*/\\n.webix_dataview_item.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n border-bottom: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_dataview_item.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_dataview_item.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_dataview_item.tiles {\\n border: 1px solid #EDEFF0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_drag_zone > .webix_dataview_item.tiles {\\n margin: 0 !important;\\n}\\n.webix_dataview .webix_scroll_cont {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n/*chart container*/\\n.webix_chart {\\n position: relative;\\n font-family: Roboto, sans-serif;\\n font-size: 13px;\\n color: #475466;\\n overflow: hidden;\\n z-index: 1;\\n}\\n.webix_chart canvas {\\n position: absolute;\\n}\\n/*labels*/\\n.webix_canvas_text {\\n position: absolute;\\n text-align: center;\\n overflow: hidden;\\n white-space: nowrap;\\n font-size: 12px;\\n z-index: 80;\\n}\\n.webix_chart .webix_canvas_text {\\n border-radius: 4px;\\n}\\n.webix_chart .webix_canvas_text.webix_inner_text_dark {\\n color: #475466;\\n text-shadow: 0 0 4px #ffffff;\\n padding: 0 2px;\\n}\\n.webix_chart .webix_canvas_text.webix_inner_text_light {\\n color: #ffffff;\\n text-shadow: 0 0 4px #475466;\\n padding: 0 2px;\\n}\\n/*map*/\\n.webix_map_img {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n border: 0px;\\n opacity: 0;\\n -webkit-user-select: none;\\n}\\n/*scales*/\\n.webix_axis_item_y {\\n position: absolute;\\n height: 18px;\\n line-height: 18px;\\n margin-top: -4px;\\n text-align: right;\\n}\\n.webix_axis_item_x {\\n padding-top: 2px;\\n}\\n.webix_axis_title_x {\\n text-align: center;\\n font-size: 13px;\\n}\\n.webix_axis_title_y {\\n text-align: center;\\n font-family: Verdana;\\n font-size: 13px;\\n transform: rotate(-90deg);\\n padding-left: 3px;\\n}\\n/*legend block*/\\n.webix_chart_legend {\\n position: absolute;\\n z-index: 81;\\n}\\n.webix_chart_legend_item {\\n height: 18px;\\n line-height: 18px;\\n padding: 2px;\\n cursor: pointer;\\n}\\n.webix_chart_legend_item.hidden {\\n color: #cfd5dd;\\n}\\n.webix_axis_item_y.webix_radar {\\n color: #555;\\n font-size: 11px;\\n padding-right: 3px;\\n height: 13px;\\n line-height: 13px;\\n margin-top: 0px;\\n}\\n.webix_canvas_text.webix_axis_radar_title {\\n margin-top: 0px;\\n padding-top: 0px;\\n color: #74869f;\\n font-size: 12px;\\n}\\n.webix_axis_item_y,\\n.webix_axis_item_x {\\n color: #74869f;\\n}\\n/*data frame*/\\n.webix_chart_frame {\\n background-color: #a0cfef;\\n height: 100%;\\n opacity: 0.3;\\n position: absolute;\\n top: 0;\\n z-index: 82;\\n border-left: 1px solid #3498db;\\n border-right: 1px solid #3498db;\\n cursor: w-resize;\\n}\\n.webix_chart_resizer {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAYAAAAx8TU7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTJCMjdFNENBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTJCMjdFNERBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5MkIyN0U0QUFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5MkIyN0U0QkFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Powz/icAAAAaSURBVHjaYmBgYDBjgAA4zcSABQysIECAAQBn+ACx2PqtbAAAAABJRU5ErkJggg==\\\");\\n background-position: 3px center;\\n background-repeat: no-repeat;\\n border-radius: 2px;\\n height: 20px;\\n bottom: 0;\\n width: 11px;\\n z-index: 83;\\n position: absolute;\\n background-color: #fff;\\n border: 1px solid #cccccc;\\n cursor: w-resize;\\n}\\n.webix_chart_resizer:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_wresize_cursor {\\n cursor: w-resize;\\n}\\n/* donut center text */\\n.webix_donut_center_text {\\n display: inline-block;\\n line-height: normal;\\n white-space: normal;\\n vertical-align: middle;\\n}\\n.webix_dt_editor {\\n position: absolute;\\n z-index: 2;\\n overflow: visible;\\n background: #FFFFFF;\\n}\\n.webix_dt_editor input,\\n.webix_dt_editor select {\\n width: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 0 11px;\\n margin: 0;\\n border: 1px solid #ffd700;\\n height: 100%;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_dt_editor input[type=\\\"checkbox\\\"] {\\n margin: 11px 13px 0px;\\n height: auto;\\n width: auto;\\n}\\n.webix_dt_editor select {\\n padding: 0 7px;\\n}\\n.webix_clipbuffer {\\n width: 2000px;\\n height: 1px;\\n padding: 0;\\n margin: 0;\\n border: 0;\\n left: 0px;\\n top: 0px;\\n white-space: pre-wrap;\\n position: fixed;\\n opacity: 0;\\n pointer-events: none;\\n cursor: default;\\n}\\n.webix_dt_editor.webix_password_editor {\\n overflow: hidden;\\n}\\n.webix_password_editor input {\\n padding-right: 26px;\\n}\\n.webix_password_editor .webix_icon {\\n position: absolute;\\n right: 4px;\\n top: 50%;\\n margin-top: -9px;\\n font-size: 18px;\\n cursor: pointer;\\n color: #94A1B3;\\n}\\n.webix_password_editor .webix_icon:hover {\\n color: #1CA1C1;\\n}\\n.webix_column,\\n.webix_hcolumn {\\n position: absolute;\\n top: 0px;\\n}\\n.webix_cell {\\n overflow: hidden;\\n line-height: 33px;\\n white-space: nowrap;\\n}\\n.webix_hcell {\\n width: 100%;\\n overflow: hidden;\\n}\\n.webix_cell,\\n.webix_hcell {\\n background: inherit;\\n font: inherit;\\n text-align: inherit;\\n color: inherit;\\n}\\n.webix_ss_body {\\n overflow: hidden;\\n position: relative;\\n}\\n.webix_hs_center,\\n.webix_hs_right,\\n.webix_hs_left,\\n.webix_ss_center,\\n.webix_ss_right,\\n.webix_ss_left {\\n overflow: hidden;\\n float: left;\\n position: relative;\\n}\\n.webix_ss_center_scroll {\\n height: 100%;\\n position: relative;\\n overflow: hidden;\\n min-height: 1px;\\n}\\n.webix_ss_hscroll {\\n bottom: 0px;\\n}\\n.webix_ss_vscroll {\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n z-index: 2;\\n}\\n.webix_ss_vscroll_footer {\\n position: absolute;\\n bottom: 0px;\\n right: 0px;\\n border-left: 1px solid #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n z-index: 1;\\n}\\n.webix_ss_vscroll_header {\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n border-left: 1px solid #DADEE0;\\n border-bottom: 1px solid #DADEE0;\\n z-index: 1;\\n}\\n.webix_dtable {\\n position: relative;\\n cursor: default;\\n z-index: 0;\\n}\\n.webix_ss_footer,\\n.webix_ss_header {\\n clear: both;\\n overflow: hidden;\\n}\\n.webix_table_cell,\\n.webix_view.webix_table_cell,\\n.webix_block_selection,\\n.webix_hcell,\\n.webix_cell {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_table_cell {\\n font-size: 14px;\\n}\\n.webix_block_selection {\\n position: absolute;\\n}\\n.webix_ss_sort_asc,\\n.webix_ss_sort_desc {\\n position: absolute;\\n top: 50%;\\n right: 2px;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 20px;\\n width: 24px;\\n height: 24px;\\n line-height: 24px;\\n margin-top: -12px;\\n float: none;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_ss_sort_asc.webix_ss_sort_single,\\n.webix_ss_sort_desc.webix_ss_sort_single {\\n width: 20px;\\n text-align: center;\\n}\\n.webix_ss_sort_asc:before {\\n content: '\\\\F004';\\n}\\n.webix_ss_sort_desc:before {\\n content: '\\\\F001';\\n}\\n.webix_ss_sort_num {\\n position: absolute;\\n top: 0;\\n right: 0;\\n height: 12px;\\n line-height: 12px;\\n font-family: Roboto, sans-serif;\\n font-size: 10px;\\n text-align: right;\\n color: #1CA1C1;\\n}\\n.webix_ss_sort_single .webix_ss_sort_num {\\n display: none;\\n}\\n.webix_hcell .webix_excel_filter {\\n position: absolute;\\n top: 50%;\\n right: 2px;\\n width: 20px;\\n height: 20px;\\n line-height: 20px;\\n margin-top: -10px;\\n vertical-align: middle;\\n text-align: center;\\n cursor: pointer;\\n color: #94A1B3;\\n}\\n.webix_hcell .webix_excel_filter:hover {\\n color: #1CA1C1;\\n}\\n.webix_excel_filter ~ .webix_ss_sort_asc,\\n.webix_excel_filter ~ .webix_ss_sort_desc {\\n right: 24px;\\n}\\n.webix_hcell.webix_ss_excel_filter {\\n position: relative;\\n}\\n.webix_hcell.webix_ss_filter_active .webix_excel_filter {\\n color: #1CA1C1;\\n}\\n.webix_hcell.webix_ss_filter_active .webix_excel_filter:hover {\\n color: #17839d;\\n}\\n.webix_hcell.webix_ss_filter {\\n padding: 3px 5px 3px 5px;\\n}\\n.webix_hcell .webix_tree_close,\\n.webix_hcell .webix_tree_open {\\n margin-right: 5px;\\n}\\n.webix_table_checkbox,\\n.webix_hcell input[type=\\\"checkbox\\\"] {\\n margin: 0px 1px 2px;\\n vertical-align: middle;\\n}\\n.webix_ss_filter select,\\n.webix_ss_filter input {\\n width: 100%;\\n font-size: inherit;\\n color: #475466 !important;\\n height: 38px;\\n margin-top: -2px;\\n padding: 0 3px;\\n vertical-align: top;\\n border: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-family: Roboto, sans-serif;\\n}\\n.webix_richfilter {\\n margin-top: 1px;\\n line-height: 32px;\\n}\\n.webix_ss_filter select {\\n padding: 3px;\\n}\\n/*headers and footers*/\\n.webix_ss_header,\\n.webix_hcolumn,\\n.webix_ss_vscroll_header,\\n.webix_dd_drag_column,\\n.webix_hs_left,\\n.webix_hs_center,\\n.webix_hs_right {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n background: #F4F5F9;\\n}\\n.webix_ss_footer,\\n.webix_ss_footer .webix_hcolumn,\\n.webix_ss_footer .webix_hs_left,\\n.webix_ss_footer .webix_hs_center,\\n.webix_ss_footer .webix_hs_right,\\n.webix_ss_footer div.webix_ss_vscroll_footer {\\n background: #fafafa;\\n}\\n.webix_hcell.webix_measure_size {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n/*content in header and footer*/\\n.webix_hcell {\\n padding: 0px 12px 0px 12px;\\n text-align: left;\\n}\\n/*borders in header and footer*/\\n.webix_ss_header .webix_hcolumn .webix_hcell,\\n.webix_ss_header .webix_span {\\n border-right: 1px solid #DADEE0;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_ss_footer .webix_hcolumn .webix_hcell,\\n.webix_ss_footer .webix_span {\\n border-right: 1px solid #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n}\\n/*remove rightmost borders*/\\n.webix_hs_right .webix_hcell.webix_last,\\n.webix_hs_center .webix_hcell.webix_last {\\n border-right-width: 0px;\\n}\\n/*right inner border*/\\n.webix_column.webix_last > div {\\n border-right-width: 0px;\\n}\\n/*borders between split areas*/\\n.webix_ss_right .webix_column.webix_first > div,\\n.webix_hs_right .webix_first {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_ss_left .webix_column.webix_last > div {\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_last_topcell.webix_cell {\\n border-bottom: 1px solid #DADEE0;\\n}\\n/*normal data cell of the table*/\\n.webix_column > div,\\n.webix_table_cell {\\n border-right: 1px solid #EDEFF0;\\n padding: 0 12px;\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_column,\\n.webix_hcolumn {\\n text-align: left;\\n}\\n/*header selection in column mode, column dnd*/\\n.webix_ss_header .webix_sel_hcell,\\n.webix_ss_footer .webix_sel_hcell,\\n.webix_ss_header .webix_dd_over_column {\\n background-color: #c9eaf5;\\n}\\n.webix_block_selection {\\n z-index: 2;\\n background: rgba(0, 0, 0, 0.1);\\n border: 2px solid #EDEFF0;\\n}\\n.webix_dd_drag {\\n white-space: nowrap;\\n overflow: hidden;\\n border-left: 1px solid #EDEFF0;\\n height: 36px;\\n}\\n.webix_dd_drag > div {\\n display: inline-block;\\n vertical-align: top;\\n background: #FFFFFF;\\n border-top: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n border-bottom: 1px solid #EDEFF0;\\n padding: 5px 12px;\\n height: 36px;\\n line-height: 28px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_dd_drag_column {\\n padding: 5px 10px 5px 10px;\\n}\\n.webix_column > .webix_drag_over.webix_cell {\\n background-color: #e6e6e6;\\n color: #475466;\\n}\\n.webix_column > .webix_drag_over.webix_cell.webix_row_select,\\n.webix_column > .webix_drag_over.webix_cell.webix_cell_select {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_column > .webix_drag_over.webix_cell.webix_row_select:focus,\\n.webix_column > .webix_drag_over.webix_cell.webix_cell_select:focus {\\n background: #edeff5;\\n}\\n.webix_cell.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_invalid_cell {\\n position: relative;\\n}\\n.webix_invalid_cell:after {\\n content: \\\"\\\";\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n width: 0px;\\n height: 1px;\\n border-top: 8px solid #f44;\\n border-left: 8px solid transparent;\\n}\\n/*selection*/\\n.webix_column > div.webix_cell_select,\\n.webix_column > div.webix_column_select,\\n.webix_column > div.webix_row_select {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_column > div.webix_cell_select:focus,\\n.webix_column > div.webix_column_select:focus,\\n.webix_column > div.webix_row_select:focus {\\n background: #edeff5;\\n}\\n/*extra borders, for selection in cell mode*/\\n.webix_column > div.webix_cell_select {\\n border-bottom: 1px solid #EDEFF0;\\n border-left: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n padding-top: 0px;\\n padding-left: 11px;\\n}\\n.webix_ss_right .webix_column.webix_first > div.webix_cell_select {\\n padding-left: 12px;\\n}\\n/*extra borders, for selection in row mode*/\\n.webix_column > div.webix_row_select {\\n border-bottom: 1px solid #EDEFF0;\\n padding-top: 0px;\\n}\\n/*extra borders for selection in column mode*/\\n.webix_column > div.webix_column_select {\\n border-left: 1px solid #EDEFF0;\\n border-right: 1px solid #EDEFF0;\\n padding-left: 11px;\\n}\\n.webix_cell.webix_dtable_colrow,\\n.webix_cell.webix_dtable_subrow,\\n.webix_dtable_subview {\\n position: absolute;\\n left: 0px;\\n top: 0px;\\n background-color: #FFFFFF;\\n width: 100%;\\n padding-right: 30px;\\n padding-left: 12px;\\n padding-top: 1px;\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_cell.webix_dtable_colrow.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_cell.webix_dtable_colrow.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_dtable_subrow {\\n border-top: 1px solid #EDEFF0;\\n text-align: right;\\n}\\n.webix_dtable_subview {\\n background: #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n padding: 0px 0px 0px 0px;\\n padding-left: 10px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.number .webix_cell {\\n text-align: right;\\n}\\n.webix_rotate {\\n transform: rotate(-90deg);\\n line-height: normal;\\n}\\n.webix_measure_rotate {\\n line-height: normal;\\n white-space: normal;\\n padding: 10px;\\n}\\n.webix_span_layer,\\n.webix_span_layer_top {\\n background: transparent;\\n position: absolute;\\n left: 0px;\\n top: 0px;\\n height: 0px;\\n width: 0px;\\n overflow: visible;\\n}\\n.webix_span_layer_top {\\n z-index: 1;\\n}\\n.webix_ss_right .webix_span_layer,\\n.webix_ss_right .webix_span_layer_top {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_dtable_span {\\n position: absolute;\\n background: #FFFFFF;\\n text-align: left;\\n}\\n.webix_dtable_span.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_dtable_span.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_hcell .webix_input_icon {\\n background-color: #DADEE0;\\n}\\n.webix_area_selection_layer {\\n position: absolute;\\n z-index: 2;\\n}\\n.webix_area_selection {\\n position: absolute;\\n background: #475466;\\n}\\n.webix_dtable_focused .webix_area_selection {\\n background-color: #3f4a5a;\\n}\\n.webix_area_selection_top,\\n.webix_area_selection_bottom {\\n height: 2px;\\n}\\n.webix_area_selection_left,\\n.webix_area_selection_right {\\n width: 2px;\\n}\\n.webix_area_selection_handle {\\n position: absolute;\\n width: 6px;\\n height: 6px;\\n border: 1px solid #fff;\\n background: #475466;\\n cursor: crosshair;\\n margin: -6px 0 0 -6px;\\n}\\n.webix_topcell {\\n position: relative;\\n background: #FFFFFF;\\n z-index: 1;\\n}\\n.webix_dtable .webix_resize_handle_x .webix_handle_content,\\n.webix_dtable .webix_resize_handle_y .webix_handle_content {\\n border: none;\\n background-color: #1CA1C1;\\n}\\n.webix_dtable_focused .webix_column > div.webix_row_select,\\n.webix_dtable_focused .webix_column > div.webix_column_select {\\n background: #edeff5;\\n}\\n.webix_window {\\n position: absolute;\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_window:focus {\\n box-shadow: 0 1px 14px 0 rgba(0, 0, 0, 0.12), 0 4px 10px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_win_body {\\n overflow: hidden;\\n}\\n.webix_window,\\n.webix_win_content,\\n.webix_win_body,\\n.webix_win_body > .webix_view {\\n border-radius: 0px;\\n}\\n.webix_win_body > .webix_view .webix_cal_month {\\n border-radius: 0px;\\n}\\n.webix_win_head {\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_win_title {\\n text-align: center;\\n}\\n/*----------------------------*/\\n/* DO NOT CHANGE STYLES BELOW */\\n/*----------------------------*/\\n.webix_win_content {\\n height: auto;\\n width: auto;\\n overflow: hidden;\\n}\\n.webix_modal {\\n width: 100%;\\n height: 100%;\\n position: fixed;\\n top: 0;\\n left: 0;\\n background-color: black;\\n opacity: 0.2;\\n}\\n.webix_modalbox_inside {\\n pointer-events: none;\\n}\\n.webix_point_top,\\n.webix_point_right,\\n.webix_point_bottom,\\n.webix_point_left {\\n position: absolute;\\n}\\n.webix_point_top,\\n.webix_point_bottom {\\n width: 13px;\\n height: 7px;\\n}\\n.webix_point_left,\\n.webix_point_right {\\n width: 7px;\\n height: 13px;\\n}\\n.webix_point_top,\\n.webix_point_bottom,\\n.webix_point_right,\\n.webix_point_left {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAArCAIAAADHSy4DAAAABnRSTlMAAAAAAABupgeRAAAACXBIWXMAAABPAAAATwFjiv3XAAAAhElEQVR4nMXVQQoAIQhAUe9/FC/pLAYayUm/EeT6YWGmoqpWharKG7n+XK5nt9L/LurMeV27oZHrReN0M6Oupr5S1GU0vhN1J7L27hp1QYXX1WtE5UxnNXI0ep7+pEGRpr95ooWObbXUm1npXWkFaF3vTqj9c+h8pVOb7gK6Yeje4tvwARi4FgcAh2V/AAAAAElFTkSuQmCC\\\");\\n}\\n.webix_point_top {\\n background-position: 0 -36px;\\n}\\n.webix_point_bottom {\\n background-position: 0 0;\\n}\\n.webix_point_right {\\n background-position: 0 -22px;\\n}\\n.webix_point_left {\\n background-position: 0 -9px;\\n}\\n.webix_resize_handle {\\n position: absolute;\\n z-index: 2;\\n width: 15px;\\n height: 15px;\\n bottom: 0px;\\n line-height: 15px;\\n right: -1px;\\n text-align: center;\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABZJREFUeAFjIAUwUshlpJDLSIhLGAAACQ4AFk79JaMAAAAASUVORK5CYII=);\\n cursor: nw-resize;\\n}\\n.webix_resize_frame {\\n position: absolute;\\n opacity: 0.1;\\n background: #1CA1C1;\\n display: block;\\n border: 1px solid #0f5768;\\n box-shadow: 1px 3px 6px #000;\\n}\\n.webix_resize_cursor {\\n cursor: nw-resize;\\n}\\n.webix_shadow_medium,\\n.webix_shadow_small,\\n.webix_shadow_big {\\n position: relative;\\n}\\n.webix_shadow_medium {\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_shadow_small {\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_shadow_big {\\n box-shadow: 0 1px 14px 0 rgba(0, 0, 0, 0.12), 0 4px 10px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_shadow_none {\\n box-shadow: none !important;\\n}\\n.webix_toolbar.webix_shadow_small,\\n.webix_toolbar.webix_shadow_medium,\\n.webix_toolbar.webix_shadow_big {\\n z-index: 1;\\n}\\n/*basis*/\\n.webix_tree .webix_scroll_cont > .webix_tree_leaves {\\n display: inline-block;\\n padding: 8px;\\n}\\n.webix_tree_item {\\n clear: both;\\n height: 24px;\\n line-height: 24px;\\n white-space: nowrap;\\n}\\n.webix_tree_item.webix_selected {\\n background: transparent;\\n}\\n.webix_tree_item.webix_selected span {\\n padding: 4px 10px 4px 4px;\\n margin-left: -4px;\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_tree_item.webix_selected span:focus {\\n background: #edeff5;\\n}\\n.webix_tree_item.webix_invalid {\\n background-color: #ffeeee;\\n}\\n.webix_tree_checkbox {\\n margin: 0px;\\n padding: 0px;\\n vertical-align: top;\\n height: 100%;\\n width: 13px;\\n}\\n.webix_indeterminate {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAZUlEQVR4nGPw8Mhldw9ObXAPTp1JBG4AqWcAawhNs2QgArgFp1q5haTVgzTNZCABuIekzSJdU3DqTOpoqq+vZ3IPSfsPwyD+INJECNBREzSeGkAxTYwG16B0a3CKICXtgTSA0h4ApZxpTQmN4jEAAAAASUVORK5CYII=\\\");\\n background-repeat: no-repeat;\\n background-position: left center;\\n height: 100%;\\n width: 13px;\\n margin-top: 0 !important;\\n display: inline-block;\\n}\\n.webix_measure_size {\\n font-family: Roboto, sans-serif;\\n}\\n.webix_measure_size input,\\n.webix_measure_size textarea,\\n.webix_measure_size select {\\n width: 5px;\\n}\\n.webix_measure_size div {\\n float: none;\\n}\\n.webix_measure_size div,\\n.webix_measure_size a {\\n display: inline-block !important;\\n position: static !important;\\n}\\n.webix_tree_close,\\n.webix_tree_open,\\n.webix_tree_none,\\n.webix_tree_folder,\\n.webix_tree_file,\\n.webix_tree_folder_open {\\n display: inline-block;\\n vertical-align: top;\\n width: 20px;\\n height: 100%;\\n cursor: pointer;\\n margin: 0;\\n background-repeat: no-repeat;\\n}\\n.webix_tree_close,\\n.webix_tree_open,\\n.webix_tree_none {\\n background-position: center center;\\n}\\n.webix_cell .webix_tree_close,\\n.webix_cell .webix_tree_open,\\n.webix_cell .webix_tree_none {\\n background-color: transparent;\\n}\\n.webix_tree_folder,\\n.webix_tree_file,\\n.webix_tree_folder_open {\\n background-position: 0 center ;\\n}\\n.webix_tree_file,\\n.webix_tree_folder,\\n.webix_tree_folder_open {\\n margin: 0px 2px;\\n}\\n.webix_tree_leaves .webix_tree_leaves {\\n display: block;\\n margin-left: 20px;\\n}\\n.webix_line_tree .webix_tree_leaves {\\n margin-left: 0px;\\n}\\n.webix_tree_file {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAInjI+JwM26XAtPyTnTfU5veGyXJ2ZhaRpoSq0AicKlLNJftNojyCMFADs=\\\");\\n}\\n.webix_tree_folder {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAIhjI+py90AI3Syvoqj27mfnn2gZYxkYEpiCqypa27yTC8FADs=\\\");\\n}\\n.webix_tree_folder_open {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhEgASAIABAI6Pj////yH5BAEKAAEALAAAAAASABIAAAIjjI+py90AI3SyvorjkQ7pDAJBSJaTaGpjKq7pxsJmR9c2UwAAOw==\\\");\\n}\\n.webix_tree_img {\\n background-color: #FFFFFF;\\n float: left;\\n width: 24px;\\n height: 24px;\\n background-position: 0 0;\\n}\\n.webix_tree_line1 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIxjI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKrKg68GbjNGVTeGZmeiRP+IphBbi0EgrAAA7\\\");\\n}\\n.webix_tree_line2 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIpjI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKgLuC7/mTNf2jef6zvc+XgAAOw==\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_tree_line3 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAI1jI8Gyc3r4pP0wCovdnpPz4Gh+JFIZ6KkKgLuC78VC9KeveGYPpsJTwFmfCeixahABoQRXQEAOw==\\\");\\n}\\n.webix_tree_line4 {\\n background-image: url(\\\"data:image/gif;base64,R0lGODlhGQAcAIABAMHBwf///yH5BAEKAAEALAAAAAAZABwAAAIjjI+py+0Po5y02ouz3rxDAIZi+HGAiW6nmmqr22avHGMzUwAAOw==\\\");\\n}\\n.webix_cal_month {\\n height: 24px;\\n line-height: 24px;\\n text-align: center;\\n position: relative;\\n font-size: 14px;\\n font-weight: bold;\\n padding: 0 0 6px;\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n}\\n.webix_cal_prev_button,\\n.webix_cal_next_button {\\n cursor: pointer;\\n position: absolute;\\n top: 0;\\n width: 24px;\\n height: 24px;\\n background-repeat: no-repeat;\\n background-position: 8px 6px;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_cal_prev_button {\\n left: 0;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAASUlEQVR42p2QMQoAQQgD79EZ0Mqn5xCu2cPdYgUbJ0rMMxXgLeiuKq8gsJAz8weQ0QiwJEfECnr4wdlEnwJ68+yyhReC+c85oRecj0Um+pmo9wAAAABJRU5ErkJggg==\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_cal_next_button {\\n right: 0;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAALCAYAAACzkJeoAAAARElEQVR42qXPsQoAIAhF0T76PdDJT7cUmtQhcmk4N8QVQ9JXN2bmgWOgqp+BiCRG2AYAMoi3/LxYdyagAnhA6G93TrABZaJFJjrFY8IAAAAASUVORK5CYII=\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_view > .webix_cal_header {\\n height: 24px;\\n}\\n.webix_view > .webix_cal_header div {\\n float: left;\\n text-align: center;\\n height: 19px;\\n font-size: 11px;\\n color: #475466;\\n border-bottom: #DADEE0 1px solid;\\n}\\n.webix_cal_body .webix_cal_row > div {\\n float: left;\\n text-align: center;\\n height: 100%;\\n}\\n.webix_cal_body .webix_selected,\\n.webix_cal_body .webix_cal_select,\\n.webix_cal_body .webix_cal_select.webix_cal_today {\\n color: #475466;\\n background: #F4F5F9;\\n}\\n.webix_cal_day,\\n.webix_cal_week_num {\\n cursor: pointer;\\n font-size: 12px;\\n color: #475466;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_cal_week_num {\\n color: #a2adbe;\\n cursor: default;\\n margin-right: 0px;\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_cal_event {\\n font-weight: bold;\\n color: #C66200;\\n}\\n.webix_cal_outside {\\n color: #b1bbc8;\\n}\\n.webix_cal_inactive {\\n background: #888;\\n}\\n.webix_cal_inactive {\\n background: #888;\\n}\\n.webix_cal_day_disabled,\\n.webix_cal_day_disabled.webix_cal_event {\\n color: #b1bbc8;\\n background: #f0f0f0;\\n}\\n.webix_cal_day_disabled.webix_cal_day,\\n.webix_cal_day_disabled.webix_cal_block {\\n cursor: not-allowed;\\n}\\n.webix_hours .webix_cal_day_disabled,\\n.webix_minutes .webix_cal_day_disabled,\\n.webix_hours .webix_cal_day_disabled.webix_cal_event,\\n.webix_minutes .webix_cal_day_disabled.webix_cal_event {\\n background: #FFFFFF;\\n font-weight: normal;\\n text-decoration: line-through;\\n}\\n.webix_cal_month_name {\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_cal_block {\\n float: left;\\n text-align: center;\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_selected {\\n background: #F4F5F9;\\n color: #475466;\\n}\\n.webix_cal_footer {\\n text-align: center;\\n font-size: 12px;\\n color: #444;\\n height: 24px;\\n padding: 6px 0 0;\\n cursor: pointer;\\n}\\n.webix_cal_icons {\\n float: right;\\n height: 20px;\\n line-height: 20px;\\n padding: 4px 4px 0;\\n}\\n.webix_cal_time {\\n height: 20px;\\n line-height: 20px;\\n padding: 4px 4px 0;\\n}\\n.webix_cal_time_icons {\\n float: left;\\n}\\n.webix_cal_icons .webix_cal_icon {\\n text-align: center;\\n padding: 0 4px;\\n}\\n.webix_cal_icon:hover,\\n.webix_cal_time:hover,\\n.webix_cal_month_name:hover {\\n text-decoration: underline;\\n color: #1CA1C1;\\n}\\n.webix_cal_icon:focus,\\n.webix_cal_time:focus,\\n.webix_cal_month_name:focus {\\n color: #1CA1C1;\\n}\\n.webix_cal_month_name.webix_readonly {\\n cursor: default;\\n}\\n.webix_cal_month_name.webix_readonly:hover,\\n.webix_cal_month_name.webix_readonly:focus {\\n text-decoration: none;\\n color: inherit;\\n}\\n.webix_time_header {\\n padding: 0 0 6px;\\n}\\n.webix_time_header .webix_cal_hours,\\n.webix_time_header .webix_cal_minutes {\\n display: inline-block;\\n font-size: 14px;\\n text-align: center;\\n height: 24px;\\n line-height: 24px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_time_header .webix_cal_minutes {\\n padding-left: 1px;\\n border-left: none;\\n}\\n.webix_time_header .webix_cal_hours {\\n border-right: none !important;\\n}\\n.webix_cal_body .webix_hours {\\n float: left;\\n border-right: 1px solid #DADEE0;\\n padding-right: 1px;\\n}\\n.webix_cal_body .webix_minutes {\\n float: left;\\n padding-left: 1px;\\n}\\n.webix_cal_block_empty {\\n float: left;\\n text-align: center;\\n}\\n.webix_time_footer {\\n text-align: center;\\n font-size: 12px;\\n height: 24px;\\n padding: 6px 0 0;\\n cursor: pointer;\\n}\\n.webix_cal_done {\\n height: 24px;\\n padding: 2px 8px;\\n font-size: 12px;\\n border-radius: 2px;\\n border: 1px solid #DADEE0;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n outline: none;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n float: right;\\n}\\n.webix_cal_done:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_cal_done:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_cal_done:active {\\n background-color: #daddeb;\\n}\\n.webix_cal_blurred_hours {\\n background-color: #f7f7f7;\\n}\\n.webix_property_line {\\n width: 100%;\\n height: auto;\\n line-height: 0;\\n}\\n.webix_property_line.webix_focused > div,\\n.webix_property_line:focus > div {\\n background-color: #f7f8fb;\\n}\\n.webix_property_label,\\n.webix_property_value {\\n display: inline-block;\\n padding-left: 12px;\\n border-bottom: 1px solid #EDEFF0;\\n overflow: hidden;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_property_label {\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_property_label_line {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n line-height: 42px;\\n padding-left: 12px;\\n border-bottom: 1px solid #EDEFF0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_property_label_line .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_property_label_line.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_property_label_line.webix_dark .webix_el_button,\\n.webix_property_label_line.webix_dark .webix_el_label .webix_el_box,\\n.webix_property_label_line.webix_dark .webix_inp_label,\\n.webix_property_label_line.webix_dark .webix_inp_top_label,\\n.webix_property_label_line.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_secondary .webix_icon,\\n.webix_property_label_line.webix_dark .webix_transparent .webix_icon,\\n.webix_property_label_line.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_property_label_line.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_property_label_line.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_property_label_line.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_transparent button:hover,\\n.webix_property_label_line.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_property_label_line.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev,\\n.webix_property_label_line.webix_dark .webix_segment_0,\\n.webix_property_label_line.webix_dark .webix_segment_1,\\n.webix_property_label_line.webix_dark .webix_segment_N,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button:hover,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next:hover,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev:hover,\\n.webix_property_label_line.webix_dark .webix_segment_0:hover,\\n.webix_property_label_line.webix_dark .webix_segment_1:hover,\\n.webix_property_label_line.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button:focus,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next:focus,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev:focus,\\n.webix_property_label_line.webix_dark .webix_segment_0:focus,\\n.webix_property_label_line.webix_dark .webix_segment_1:focus,\\n.webix_property_label_line.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_secondary button:active,\\n.webix_property_label_line.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_property_label_line.webix_dark .webix_inp_counter_next:active,\\n.webix_property_label_line.webix_dark .webix_inp_counter_prev:active,\\n.webix_property_label_line.webix_dark .webix_segment_0:active,\\n.webix_property_label_line.webix_dark .webix_segment_1:active,\\n.webix_property_label_line.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_inp_static,\\n.webix_property_label_line.webix_dark input[type=text],\\n.webix_property_label_line.webix_dark input[type=combo],\\n.webix_property_label_line.webix_dark input[type=datepicker],\\n.webix_property_label_line.webix_dark textarea,\\n.webix_property_label_line.webix_dark select,\\n.webix_property_label_line.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_property_label_line.webix_dark .webix_el_texthighlight input,\\n.webix_property_label_line.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_property_label_line.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_property_label_line.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_multicombo_value,\\n.webix_property_label_line.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_property_label_line.webix_dark .webix_inp_static:focus,\\n.webix_property_label_line.webix_dark input[type=text]:focus,\\n.webix_property_label_line.webix_dark input[type=combo]:focus,\\n.webix_property_label_line.webix_dark input[type=datepicker]:focus,\\n.webix_property_label_line.webix_dark textarea:focus,\\n.webix_property_label_line.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_property_label_line.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_property_label_line.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_property_label_line.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_property_label_line.webix_dark .webix_el_icon,\\n.webix_property_label_line.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_property_label_line.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_property_label_line.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_property_label_line.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_property_label_line.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_property_label_line.webix_dark .webix_custom_checkbox,\\n.webix_property_label_line.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_custom_checkbox:focus,\\n.webix_property_label_line.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_property_label_line.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_property_label_line.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_property_label_line.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_property_label_line.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_property_label_line.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_property_label_line.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box input,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box select,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_property_label_line.webix_dark input.webix_invalid,\\n.webix_property_label_line.webix_dark select.webix_invalid,\\n.webix_property_label_line.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_property_label_line.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_property_label_line.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_property_label_line.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_property_label_line.webix_dark {\\n color: #FFFFFF;\\n}\\n.webix_property_col_ind {\\n float: right;\\n cursor: pointer;\\n margin: 0 8px 0 0;\\n border: 1px solid #DADEE0;\\n background: #ffffff;\\n border-radius: 3px;\\n width: 16px;\\n height: 16px;\\n}\\n.webix_property_value {\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.webix_property_check {\\n margin: 0;\\n vertical-align: middle;\\n}\\n/*style used by tooltip's container*/\\n.webix_tooltip {\\n display: none;\\n position: absolute;\\n z-index: 10000;\\n background-color: #FFFFFF;\\n padding: 5px 10px;\\n border: 1px solid #DADEE0;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n border-radius: 0px;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n.webix_global_tooltip {\\n pointer-events: none;\\n}\\n/*comments list*/\\n.webix_comments .webix_list .webix_list_item {\\n margin-top: 24px;\\n border: none;\\n cursor: default;\\n}\\n.webix_comments .webix_list .webix_comments_more_item {\\n margin-top: 12px;\\n}\\n/* comments list templates */\\n.webix_comments_name {\\n margin-left: 16px;\\n font-weight: 500;\\n color: rgba(0, 0, 0, 0.7);\\n}\\n.webix_comments_menu.webix_icon {\\n line-height: 30px;\\n width: 6px;\\n visibility: hidden;\\n float: right;\\n cursor: pointer;\\n color: #94A1B3;\\n margin: 0 4px 0 0;\\n}\\n.webix_comments_current:hover .webix_comments_menu,\\n.webix_comments_current.active_menu .webix_comments_menu {\\n visibility: visible;\\n}\\n.webix_comments_message {\\n white-space: pre-wrap;\\n line-height: 20px;\\n margin-left: 70px;\\n margin-right: 10px;\\n}\\n.webix_comments_message a {\\n color: #1CA1C1;\\n text-decoration: none;\\n word-break: break-all;\\n}\\n.webix_comments_message a:hover {\\n text-decoration: underline;\\n}\\n.webix_comments_message a:visited {\\n color: #7e57c2;\\n}\\n.webix_comments_message .webix_comments_mention {\\n font-weight: 500;\\n white-space: nowrap;\\n}\\n.webix_comments_mention {\\n color: #1CA1C1;\\n}\\n.webix_comments_avatar {\\n margin-left: 14px;\\n float: left;\\n position: relative;\\n width: 40px;\\n height: 40px;\\n}\\n.webix_comments_status {\\n z-index: 1;\\n top: 30px;\\n left: 30px;\\n border-radius: 50%;\\n border: 2px solid #FFFFFF;\\n position: absolute;\\n height: 12px;\\n width: 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_comments_status.active {\\n background-color: #55CD97;\\n}\\n.webix_comments_status.busy {\\n background-color: #FF5C4C;\\n}\\n.webix_comments_status.away {\\n background-color: #FDBF4C;\\n}\\n.webix_comments_status.none {\\n background-color: #d0d5dd;\\n}\\n.webix_comments_avatar_image {\\n width: 100%;\\n height: 100%;\\n overflow: hidden;\\n border-radius: 50%;\\n float: left;\\n position: relative;\\n}\\n.webix_comments_photo {\\n width: auto;\\n height: 100%;\\n margin: 0 auto;\\n}\\n.webix_comments_avatar_text {\\n font-size: 16px;\\n color: #1CA1C1;\\n line-height: 40px;\\n text-align: center;\\n background-color: #DFE2E6;\\n}\\n.webix_comments_avatar_text .webix_icon {\\n margin: 0;\\n}\\n.webix_comments_date {\\n float: right;\\n color: #94A1B3;\\n font-size: 12px;\\n}\\n.webix_comments_image {\\n max-width: 100%;\\n max-height: 300px;\\n display: block;\\n}\\n/* buttons*/\\n.webix_comments_more {\\n font-weight: 500;\\n text-align: center;\\n cursor: pointer;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n border: none;\\n border-radius: 2px;\\n}\\n.webix_comments_more:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_comments_send .webix_el_box {\\n float: right !important;\\n}\\n.webix_message_area {\\n position: fixed;\\n right: 5px;\\n width: 250px;\\n z-index: 1000;\\n}\\n.webix_message {\\n min-width: 120px;\\n font-family: Roboto, sans-serif;\\n z-index: 10000;\\n overflow: hidden;\\n margin: 4px 4px 12px;\\n transition: all 0.5s ease;\\n}\\n.webix_message.hidden {\\n height: 0px;\\n min-height: 0px;\\n padding-top: 0px;\\n padding-bottom: 0px;\\n border-width: 0px;\\n margin-top: 0px;\\n margin-bottom: 0px;\\n box-shadow: none;\\n overflow: hidden;\\n}\\n.webix_modal_box {\\n pointer-events: auto;\\n overflow: hidden;\\n display: inline-block;\\n min-width: 250px;\\n width: 250px;\\n text-align: center;\\n position: fixed;\\n background-color: #FFFFFF;\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n font-family: Roboto, sans-serif;\\n z-index: 20000;\\n border-radius: 0px;\\n border: 1px solid #DADEE0;\\n outline: none;\\n}\\n.webix_modal_box .webix_popup_button {\\n margin-top: 8px;\\n}\\n.webix_message,\\n.webix_popup_button {\\n cursor: pointer;\\n}\\n.webix_popup_controls {\\n padding: 4px 12px 12px;\\n}\\n.webix_popup_button {\\n height: 30px;\\n line-height: 30px;\\n display: inline-block;\\n margin: 0 4px;\\n border-radius: 2px;\\n}\\n.webix_popup_button {\\n min-width: 100px;\\n}\\ndiv.webix_modal_cover {\\n background-color: #000;\\n cursor: default;\\n opacity: 0.1;\\n position: fixed;\\n z-index: 19999;\\n left: 0px;\\n top: 0px;\\n width: 100%;\\n height: 100%;\\n border: none;\\n zoom: 1;\\n}\\n.webix_message img,\\n.webix_modal_box img {\\n float: left;\\n margin-right: 8px;\\n}\\n/*Skin section*/\\n.webix_popup_button {\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n outline: none;\\n}\\n.webix_popup_button:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_popup_button:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_popup_button:active {\\n background-color: #daddeb;\\n}\\n.webix_popup_button.confirm {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_popup_button.confirm:hover {\\n background-color: #1992af;\\n}\\n.webix_popup_button.confirm:focus {\\n background-color: #1992af;\\n}\\n.webix_popup_button.confirm:active {\\n background-color: #17839d;\\n}\\n.webix_popup_input.webix_el_text {\\n outline: none;\\n overflow: hidden;\\n padding: 3px 2px;\\n}\\n.webix_popup_input.webix_el_text input {\\n width: 100%;\\n height: 30px;\\n font-size: 14px;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_popup_input.webix_el_text.webix_required::before {\\n position: absolute;\\n right: 18px;\\n padding-top: 1px;\\n content: \\\"*\\\";\\n color: #FF5C4C;\\n}\\n.webix_popup_input.webix_el_text.webix_popup_invalid input {\\n background-color: #ffedee;\\n border-color: #fea5a8;\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n}\\n.webix_popup_title {\\n color: #475466;\\n line-height: 20px;\\n padding: 20px 16px 12px 16px;\\n font-size: 16px;\\n font-weight: 500;\\n}\\n.webix_popup_title + div.webix_popup_text {\\n padding-top: 0;\\n box-shadow: none;\\n}\\n.webix_popup_text {\\n overflow: hidden;\\n padding: 24px 16px 0px 16px;\\n font-size: 14px;\\n color: #475466;\\n line-height: 20px;\\n}\\n.webix_popup_text.webix_popup_label {\\n text-align: left;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_alert .webix_popup_title,\\n.webix_confirm .webix_popup_title,\\n.webix_prompt .webix_popup_title,\\n.webix_alert .webix_popup_text,\\n.webix_confirm .webix_popup_text,\\n.webix_prompt .webix_popup_text {\\n box-shadow: inset 0 4px #1CA1C1;\\n}\\n.webix_alert-warning .webix_popup_title,\\n.webix_confirm-warning .webix_popup_title,\\n.webix_prompt-warning .webix_popup_title,\\n.webix_alert-warning .webix_popup_text,\\n.webix_confirm-warning .webix_popup_text,\\n.webix_prompt-warning .webix_popup_text {\\n box-shadow: inset 0 4px #FDBF4C;\\n}\\n.webix_alert-error .webix_popup_title,\\n.webix_confirm-error .webix_popup_title,\\n.webix_prompt-error .webix_popup_title,\\n.webix_alert-error .webix_popup_text,\\n.webix_confirm-error .webix_popup_text,\\n.webix_prompt-error .webix_popup_text {\\n box-shadow: inset 0 4px #FF5C4C;\\n}\\n.webix_message {\\n font-size: 14px;\\n color: #475466;\\n box-shadow: 0 1px 14px 0 rgba(0, 0, 0, 0.12), 0 4px 10px 0 rgba(0, 0, 0, 0.1);\\n line-height: 20px;\\n border-radius: 2px;\\n border: 1px solid #DADEE0;\\n background-color: #FFFFFF;\\n}\\n.webix_message.webix_debug {\\n color: #313131;\\n border-color: #fed282;\\n background-color: #fff2db;\\n}\\n.webix_message.webix_error {\\n color: #313131;\\n border-color: #ff8d82;\\n background-color: #ffdedb;\\n}\\n.webix_message.webix_success {\\n color: #313131;\\n border-color: #88dcb6;\\n background-color: #ddf5ea;\\n}\\n.webix_message div {\\n padding: 11px 12px;\\n}\\n.webix_color_row {\\n clear: both;\\n white-space: nowrap;\\n}\\n.webix_color_palette {\\n text-align: left;\\n padding: 4px;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_color_palette.webix_palette_classic {\\n padding: 0;\\n}\\n.webix_color_row,\\n.webix_color_row div {\\n line-height: 0;\\n font-size: 0;\\n}\\n.webix_color_row div {\\n display: inline-block;\\n position: relative;\\n}\\n.webix_color_row div > * {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_color_row .webix_color_selected > * {\\n border: 1px solid;\\n border-color: #FFFFFF;\\n border-radius: 2px;\\n box-shadow: rgba(28, 161, 193, 0.6) 0 0 0 2px;\\n}\\n.webix_color_row .webix_color_selected:focus > * {\\n box-shadow: #1CA1C1 0 0 0 2px;\\n}\\n.webix_palette_classic .webix_color_row .webix_color_selected > * {\\n border: 2px solid #f3f3f3;\\n border-radius: 0px;\\n box-shadow: none;\\n}\\n.webix_palette_classic .webix_color_row .webix_color_selected:focus > * {\\n box-shadow: inset 0 0 15px #fff;\\n}\\n.webix_palette_classic .webix_color_item {\\n width: 100%;\\n height: 100%;\\n cursor: pointer;\\n}\\n.webix_palette_material .webix_color_item {\\n display: inline-block;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border-radius: 2px;\\n cursor: pointer;\\n width: 100%;\\n height: 100%;\\n}\\n.webix_palette_material .webix_color_row > div {\\n margin: 0 4px 4px 0;\\n}\\n.webix_color_area {\\n width: 100%;\\n height: 100%;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_color_block {\\n position: relative;\\n border-radius: 2px;\\n margin: 12px 12px 14px;\\n}\\n.webix_color_block:before,\\n.webix_color_block:after {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n left: 0;\\n}\\n.webix_color_block:before {\\n background-image: linear-gradient(0deg, #000, hsla(0, 0%, 100%, 0));\\n z-index: 2;\\n}\\n.webix_color_block:after {\\n background-image: linear-gradient(90deg, #fff, hsla(20, 42%, 65%, 0));\\n z-index: 1;\\n}\\n.webix_color_line {\\n position: relative;\\n height: 8px;\\n margin: 0 12px;\\n border-radius: 8px;\\n background-image: linear-gradient(90deg, red, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red);\\n}\\n.webix_color_circle {\\n width: 8px;\\n height: 8px;\\n margin: -6px 0 0 -6px;\\n border: 2px solid #FFFFFF;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\\n border-radius: 50%;\\n position: absolute;\\n left: 0;\\n top: 0;\\n z-index: 3;\\n}\\n.webix_color_circle:focus,\\n.webix_color_area_active .webix_color_circle {\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 0 4px #FFFFFF;\\n}\\n.webix_color_line_circle {\\n width: 12px;\\n height: 12px;\\n margin: -4px 0 0 -8px;\\n border: 2px solid #FFFFFF;\\n border-radius: 50%;\\n position: absolute;\\n left: 0;\\n top: 0;\\n background: #12FF08;\\n}\\n.webix_color_line_circle:focus,\\n.webix_color_area_active .webix_color_line_circle {\\n box-shadow: inset 0 0 8px #FFFFFF;\\n}\\n.webix_color_area_active .webix_color_circle,\\n.webix_color_area_active .webix_color_line_circle {\\n pointer-events: none;\\n}\\n.webix_color_out_block,\\n.webix_color_out_text {\\n height: 32px;\\n float: left;\\n border: 1px solid #CCD7E6;\\n margin: 12px 0px 12px 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_color_out_text {\\n color: #475466;\\n font-size: 14px;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n padding: 0px 12px;\\n}\\n.webix_color_out_text:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_color_area .webix_button {\\n width: calc(100% - 12px*2);\\n height: 32px;\\n margin: 0px 0px 12px 12px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_daterange .webix_view {\\n background-color: #FFFFFF;\\n}\\n.webix_daterange .webix_range_0 .webix_cal_next_button,\\n.webix_daterange .webix_range_N .webix_cal_prev_button {\\n visibility: hidden;\\n}\\n.webix_daterange .webix_range_1 .webix_cal_next_button,\\n.webix_daterange .webix_range_1 .webix_cal_prev_button {\\n visibility: hidden;\\n}\\n.webix_daterange .webix_range_1 .webix_cal_next_button:hover,\\n.webix_daterange .webix_range_1 .webix_cal_prev_button:hover {\\n cursor: default;\\n}\\n.webix_daterange .webix_range_left .webix_cal_next_button:hover,\\n.webix_daterange .webix_range_right .webix_cal_prev_button:hover {\\n cursor: default;\\n}\\n.webix_cal_range {\\n background-color: #ffffff;\\n}\\n.webix_cal_range_start {\\n border-radius: 3px 0 0 3px;\\n}\\n.webix_cal_range_end {\\n border-radius: 0 3px 3px 0;\\n}\\n.webix_cal_range_start,\\n.webix_cal_range_end,\\n.webix_cal_event.webix_cal_range_start,\\n.webix_cal_event.webix_cal_range_end,\\n.webix_cal_body .webix_cal_today.webix_cal_range_start,\\n.webix_cal_body .webix_cal_today.webix_cal_range_end {\\n background-color: #F4F5F9;\\n color: #475466;\\n}\\n.webix_cal_outside.webix_cal_range,\\n.webix_cal_body .webix_cal_outside.webix_cal_range_start,\\n.webix_cal_body .webix_cal_outside.webix_cal_range_end,\\n.webix_cal_body .webix_cal_outside.webix_cal_today.webix_cal_range_start,\\n.webix_cal_body .webix_cal_outside.webix_cal_today.webix_cal_range_end {\\n background-color: transparent;\\n color: #b1bbc8;\\n}\\n.webix_daterange .webix_cal_icons {\\n text-align: right;\\n padding: 0 4px;\\n}\\n.webix_daterange .webix_cal_icons .webix_cal_icon {\\n border-top: 1px solid #DADEE0;\\n}\\n.webix_daterange .webix_cal_time {\\n display: none;\\n}\\n.webix_daterange .webix_cal_timepicker .webix_range_time_start {\\n display: block;\\n}\\n.webix_daterange .webix_range_timepicker .webix_cal_time {\\n display: block;\\n padding: 5px 15px;\\n}\\n.webix_daterange .webix_range_timepicker .webix_range_time_start {\\n float: left;\\n}\\n.webix_daterange .webix_range_timepicker .webix_range_time_end {\\n float: right;\\n}\\n.webix_daterange .webix_range_footer .webix_cal_footer {\\n padding: 0;\\n}\\n.webix_timeboard .webix_slider_title {\\n text-align: left;\\n margin-left: 10px;\\n}\\n.webix_timeboard .webix_colon_template .webix_template {\\n padding: 0;\\n text-align: center;\\n line-height: 100%;\\n font-size: 30px;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_timeboard .webix_day_part .webix_el_box {\\n padding-left: 6px;\\n color: #1CA1C1;\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_timeboard .webix_day_part .webix_el_box:hover,\\n.webix_timeboard .webix_day_part .webix_el_box:focus {\\n color: #17839d;\\n}\\n.webix_drag_zone {\\n position: absolute;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n background-color: #FFFFFF;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n pointer-events: none;\\n}\\n.webix_drag_zone .webix_tree_item {\\n padding: 0 8px;\\n}\\n.webix_drag_zone .webix_tree_item .webix_tree_open,\\n.webix_drag_zone .webix_tree_item .webix_tree_close,\\n.webix_drag_zone .webix_tree_item .webix_tree_none {\\n display: none;\\n}\\n.webix_drag_zone .webix_ss_hscroll,\\n.webix_drag_zone .webix_ss_vscroll {\\n display: none !important;\\n}\\n.webix_drag_over,\\n.webix_drop_zone {\\n background-color: #e6e6e6;\\n}\\n.webix_drag_main {\\n position: relative;\\n background-color: #FFFFFF;\\n}\\n.webix_drag_main .webix_tree_item,\\n.webix_drag_main .webix_list_item,\\n.webix_drag_main .webix_dataview_item {\\n border: 1px solid #EDEFF0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_drag_multiple,\\n.webix_drag_multiple_last {\\n height: 100%;\\n width: 100%;\\n position: absolute;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border: 1px solid #EDEFF0;\\n background-color: #FFFFFF;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_drag_multiple {\\n bottom: 8px;\\n left: 8px;\\n}\\n.webix_drag_multiple_last {\\n bottom: 16px;\\n left: 16px;\\n}\\n.webix_drag_zone > .webix_badge {\\n top: -14px;\\n right: -14px;\\n}\\n.webix_invisible {\\n display: none !important;\\n}\\n.webix_drop_area,\\n.webix_drop_area_inner {\\n height: 36px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background-color: #f1f2f7;\\n}\\n.webix_list-x .webix_drop_area {\\n display: inline-block;\\n border-right: 1px solid #EDEFF0;\\n}\\n.webix_tree .webix_drop_area {\\n height: 24px;\\n}\\n.webix_list .webix_drop_area {\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_dataview .webix_drop_area {\\n float: left;\\n background-color: transparent;\\n}\\n.webix_dataview .webix_drop_area_inner {\\n border-right: 1px solid #EDEFF0;\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_vscroll_x {\\n height: 0px;\\n width: 100%;\\n overflow-y: hidden;\\n overflow-x: scroll;\\n}\\n.webix_vscroll_y {\\n width: 0px;\\n height: 100%;\\n overflow-x: hidden;\\n overflow-y: scroll;\\n}\\n.webix_vscroll_body {\\n width: 16px;\\n height: 16px;\\n}\\n.webix_scroll_x {\\n width: 50px;\\n height: 4px !important;\\n left: 1px;\\n bottom: 3px;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n position: absolute;\\n border-radius: 4px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_scroll_y {\\n width: 4px !important;\\n height: 50px;\\n top: 1px;\\n right: 3px;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n position: absolute;\\n border-radius: 4px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_custom_scroll {\\n -ms-overflow-style: none;\\n /* IE, Edge */\\n scrollbar-width: none;\\n /* Firefox */\\n}\\n.webix_custom_scroll::-webkit-scrollbar {\\n display: none;\\n /* Chrome, Edge(chromium), Opera, Safari, all browsers on iOS */\\n}\\n.webix_c_scroll_y {\\n position: absolute;\\n z-index: 3;\\n width: 10px;\\n right: 0px;\\n}\\n.webix_c_scroll_y > div {\\n transition: width 0.3s 0.2s, margin 0.3s 0.2s;\\n width: 4px;\\n height: 100%;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n border-radius: 4px;\\n margin: 0px 3px;\\n}\\n.webix_c_scroll_y:hover > div,\\n.webix_c_scroll_y.webix_scroll_active div {\\n width: 10px;\\n margin: 0px;\\n}\\n.webix_c_scroll_x {\\n position: absolute;\\n z-index: 3;\\n height: 10px;\\n bottom: 0px;\\n}\\n.webix_c_scroll_x > div {\\n transition: height 0.3s 0.2s, margin 0.3s 0.2s;\\n height: 4px;\\n width: 100%;\\n background-color: silver;\\n background: rgba(0, 0, 0, 0.4);\\n border-radius: 4px;\\n margin: 3px 0px;\\n}\\n.webix_c_scroll_x:hover > div,\\n.webix_c_scroll_x.webix_scroll_active div {\\n height: 10px;\\n margin: 0px;\\n}\\n.webix_c_scroll_bar_y,\\n.webix_c_scroll_bar_x {\\n position: absolute;\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.webix_c_scroll_bar_y {\\n height: 100%;\\n width: 10px;\\n right: 0px;\\n}\\n.webix_c_scroll_bar_x {\\n width: 100%;\\n height: 10px;\\n bottom: 0px;\\n}\\n.webix_scroll_cont {\\n width: 100%;\\n height: auto;\\n clear: both;\\n position: relative;\\n}\\n.webix_secondary .webix_button {\\n background: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_secondary .webix_button:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_secondary .webix_button:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_secondary .webix_button:active {\\n background-color: #daddeb;\\n}\\n.webix_secondary .webix_button .webix_icon,\\n.webix_secondary .webix_button .webix_img_btn_text,\\n.webix_secondary .webix_button .webix_icon_btn {\\n color: #1CA1C1;\\n}\\n.webix_secondary .webix_pressed .webix_button {\\n background-color: #daddeb;\\n}\\n.webix_primary .webix_button {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_primary .webix_button:hover {\\n background-color: #1992af;\\n}\\n.webix_primary .webix_button:focus {\\n background-color: #1992af;\\n}\\n.webix_primary .webix_button:active {\\n background-color: #17839d;\\n}\\n.webix_primary .webix_button .webix_icon,\\n.webix_primary .webix_button .webix_img_btn_text,\\n.webix_primary .webix_button .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_primary .webix_pressed .webix_button {\\n background-color: #17839d;\\n}\\n.webix_danger .webix_button {\\n background: #FF5C4C;\\n color: #ffffff;\\n}\\n.webix_danger .webix_button:hover {\\n background-color: #ff4938;\\n}\\n.webix_danger .webix_button:focus {\\n background-color: #ff4938;\\n}\\n.webix_danger .webix_button:active {\\n background-color: #ff3723;\\n}\\n.webix_danger .webix_button .webix_icon,\\n.webix_danger .webix_button .webix_img_btn_text,\\n.webix_danger .webix_button .webix_icon_btn {\\n color: #ffffff;\\n}\\n.webix_danger .webix_pressed .webix_button {\\n background-color: #ff3723;\\n}\\n.webix_transparent .webix_button {\\n color: #475466;\\n background: transparent;\\n border: none;\\n}\\n.webix_transparent .webix_button .webix_img_btn_text {\\n color: #475466;\\n}\\n.webix_transparent .webix_button .webix_icon,\\n.webix_transparent .webix_button .webix_icon_btn {\\n color: #94A1B3;\\n}\\n.webix_transparent .webix_button:hover {\\n background-color: rgba(0, 0, 0, 0.04);\\n}\\n.webix_transparent .webix_button:focus {\\n background-color: rgba(0, 0, 0, 0.04);\\n}\\n.webix_transparent .webix_button:active {\\n background-color: rgba(0, 0, 0, 0.05);\\n}\\n.webix_transparent .webix_pressed .webix_button {\\n background-color: rgba(0, 0, 0, 0.05);\\n}\\n.webix_button,\\n.webixbutton {\\n border-radius: 2px;\\n height: 100%;\\n width: 100%;\\n cursor: pointer;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n -webkit-appearance: none;\\n padding: 0 6px;\\n}\\n.webix_el_button .webix_el_box,\\n.webix_el_toggle .webix_el_box {\\n position: relative;\\n}\\n.webix_img_btn,\\n.webix_img_btn_top {\\n vertical-align: top;\\n border: none;\\n width: 100%;\\n padding: 0;\\n}\\n.webix_img_btn .webix_icon {\\n color: #1CA1C1;\\n margin-right: 4px;\\n}\\n.webix_img_btn_top .webix_icon,\\n.webix_img_btn_top .webix_image {\\n font-size: 20px;\\n position: absolute;\\n top: 8px;\\n display: inline-block;\\n left: 50%;\\n transform: translateX(-50%);\\n}\\n.webix_img_btn .webix_image {\\n display: inline-block;\\n margin-right: 4px;\\n vertical-align: middle;\\n}\\n.webix_img_btn_text {\\n position: absolute;\\n left: 0;\\n bottom: 4px;\\n width: 100%;\\n text-align: center;\\n cursor: pointer;\\n color: #1CA1C1;\\n}\\n.webix_pressed .webix_button {\\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_button {\\n color: #94A1B3;\\n background: #f4f5f9;\\n border-color: #f4f5f9;\\n text-shadow: none;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: #94A1B3;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_image {\\n opacity: 0.4;\\n}\\n.webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_disabled_view.webix_control .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: #94A1B3;\\n}\\n.webixbutton {\\n width: auto;\\n height: auto;\\n padding: 8px 15px;\\n}\\n.webix_richtext_editor {\\n height: 100%;\\n}\\n.webix_template .webix_richtext_editor:focus {\\n outline: none;\\n}\\n.webix_richtext_container .webix_template {\\n padding: 10px;\\n overflow-x: auto;\\n border: solid #DADEE0;\\n border-width: 0px 1px 1px;\\n border-radius: 0px 0px 6px 6px;\\n}\\n.webix_richtext_inp_label .webix_template {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n color: #475466;\\n text-transform: none;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n float: left;\\n padding-top: 1px;\\n padding-left: 0;\\n padding-right: 9px;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n padding-right: 8px;\\n margin-bottom: 0px;\\n padding-top: 10px;\\n float: none;\\n}\\n.webix_richtext .wxi-underline,\\n.webix_richtext .wxi-italic,\\n.webix_richtext .wxi-bold {\\n vertical-align: sub;\\n font-size: 24px;\\n width: 24px;\\n}\\n.webix_control {\\n background: transparent;\\n}\\n.webix_control input,\\n.webix_control button,\\n.webix_control textarea,\\n.webix_el_label,\\n.webix_inp_label,\\n.webix_inp_top_label,\\n.webix_inp_bottom_label {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-family: Roboto, sans-serif;\\n}\\n.webix_el_box {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 3px 2px;\\n height: 100%;\\n width: 100%;\\n font-size: 14px;\\n overflow: hidden;\\n}\\n.webixtoolbarlabel {\\n font-size: 16px;\\n}\\n.webix_el_text input,\\n.webix_el_search input,\\n.webix_el_combo input,\\n.webix_el_datepicker input,\\n.webix_el_colorpicker input {\\n font-size: 14px;\\n height: 100%;\\n padding: 0px 12px;\\n border: 1px solid #DADEE0;\\n color: #475466;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n -webkit-appearance: none;\\n border-radius: 0;\\n}\\n.webix_multitext_icon:hover,\\n.webix_multitext_icon:active {\\n color: #1CA1C1;\\n background: inherit;\\n cursor: pointer;\\n}\\n.webix_inp_label,\\n.webix_inp_top_label,\\n.webix_label_right {\\n color: #475466;\\n text-transform: none;\\n font-size: 14px;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n}\\n.webix_inp_label {\\n float: left;\\n padding-top: 1px;\\n padding-left: 0;\\n padding-right: 9px;\\n}\\n.webix_inp_top_label {\\n float: none;\\n padding: 3px 2px;\\n padding-bottom: 0px;\\n}\\n.webix_inp_bottom_label {\\n font-size: 12px;\\n color: #516075;\\n}\\n.webix_label_right {\\n padding-left: 9px;\\n}\\n.webix_el_checkbox .webix_label_right {\\n display: inline-block;\\n padding-top: 1px;\\n}\\n.webix_el_label {\\n color: #475466;\\n}\\n.webix_toolbar .webix_el_label {\\n text-transform: none;\\n}\\n.webix_el_select select {\\n height: 100%;\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n border: 1px solid #DADEE0;\\n}\\nbody:not(:-moz-handler-blocked) .webix_el_select select {\\n padding: 0.2em;\\n}\\n.webix_el_group,\\n.webix_all_segments {\\n height: 100%;\\n white-space: nowrap;\\n}\\n.webix_inp_counter_next,\\n.webix_inp_counter_prev,\\n.webix_inp_counter_value {\\n border: 1px solid #DADEE0;\\n cursor: pointer;\\n -webkit-appearance: none;\\n width: 20px;\\n height: 100%;\\n vertical-align: top;\\n}\\n.webix_inp_counter_value {\\n font-size: 14px;\\n width: 50px;\\n color: #475466;\\n text-align: center;\\n border-left-width: 0px;\\n border-right-width: 0px;\\n -webkit-appearance: none;\\n border-radius: 0;\\n}\\n.webix_inp_counter_prev {\\n padding: 0;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.webix_inp_counter_prev:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_prev:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_prev:active {\\n background-color: #daddeb;\\n}\\n.webix_inp_counter_next {\\n padding: 0;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_inp_counter_next:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:active {\\n background-color: #daddeb;\\n}\\n.webix_el_textarea textarea,\\n.webix_textarea_measure {\\n border: 1px solid #DADEE0;\\n height: 100%;\\n margin: 0;\\n padding: 5px;\\n color: #475466;\\n resize: none;\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n padding-left: 12px;\\n padding-right: 12px;\\n}\\n.webix_textarea_measure {\\n box-sizing: border-box;\\n overflow: hidden;\\n}\\n.webix_el_textarea .webix_inp_label {\\n padding-top: 10px;\\n}\\n.webix_noscroll.webix_el_textarea textarea {\\n overflow: hidden;\\n}\\n.webix_segment_0,\\n.webix_segment_1 {\\n border: 1px solid #DADEE0;\\n border-right-width: 0px;\\n height: 100%;\\n}\\n.webix_segment_0 {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.webix_segment_N {\\n border: 1px solid #DADEE0;\\n height: 100%;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_segment_N:first-child {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_segment_0,\\n.webix_segment_1,\\n.webix_segment_N {\\n -webkit-appearance: none;\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n outline: none;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n cursor: pointer;\\n padding: 0;\\n}\\n.webix_segment_0:hover,\\n.webix_segment_1:hover,\\n.webix_segment_N:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:focus,\\n.webix_segment_1:focus,\\n.webix_segment_N:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:active,\\n.webix_segment_1:active,\\n.webix_segment_N:active {\\n background-color: #daddeb;\\n}\\n.webix_segment_0.webix_selected,\\n.webix_segment_1.webix_selected,\\n.webix_segment_N.webix_selected {\\n color: #475466;\\n background: #F4F5F9;\\n border-color: #1CA1C1;\\n background-color: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_segment_0.webix_selected:focus,\\n.webix_segment_1.webix_selected:focus,\\n.webix_segment_N.webix_selected:focus {\\n background: #edeff5;\\n}\\n.webix_segment_0.webix_disabled,\\n.webix_segment_1.webix_disabled,\\n.webix_segment_N.webix_disabled {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n border-color: transparent;\\n cursor: not-allowed;\\n}\\n.webix_segment_0.webix_disabled:hover,\\n.webix_segment_1.webix_disabled:hover,\\n.webix_segment_N.webix_disabled:hover,\\n.webix_segment_0.webix_disabled:focus,\\n.webix_segment_1.webix_disabled:focus,\\n.webix_segment_N.webix_disabled:focus,\\n.webix_segment_0.webix_disabled:active,\\n.webix_segment_1.webix_disabled:active,\\n.webix_segment_N.webix_disabled:active {\\n box-shadow: none;\\n background-color: #fbfbfd;\\n}\\n.webix_segment_0.webix_disabled.webix_selected,\\n.webix_segment_1.webix_disabled.webix_selected,\\n.webix_segment_N.webix_disabled.webix_selected,\\n.webix_segment_0.webix_disabled.webix_selected:hover,\\n.webix_segment_1.webix_disabled.webix_selected:hover,\\n.webix_segment_N.webix_disabled.webix_selected:hover,\\n.webix_segment_0.webix_disabled.webix_selected:focus,\\n.webix_segment_1.webix_disabled.webix_selected:focus,\\n.webix_segment_N.webix_disabled.webix_selected:focus {\\n background-color: #dde0ec;\\n}\\n.webix_inp_static {\\n border: 1px solid #DADEE0;\\n overflow: hidden;\\n padding: 0px 12px;\\n height: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n float: left;\\n}\\n.webix_placeholder {\\n color: #94A1B3;\\n}\\n::-webkit-input-placeholder {\\n color: #94A1B3;\\n}\\n::-moz-placeholder {\\n color: #94A1B3;\\n}\\n/* Firefox 19+ */\\n:-moz-placeholder {\\n color: #94A1B3;\\n}\\n/* Firefox 18- */\\n:-ms-input-placeholder {\\n color: #94A1B3;\\n}\\n.webix_el_combo,\\n.webix_el_richselect,\\n.webix_el_datepicker,\\n.webix_el_colorpicker,\\n.webix_el_search {\\n font-size: 14px;\\n}\\n.webix_el_combo input,\\n.webix_el_richselect input,\\n.webix_el_datepicker input,\\n.webix_el_colorpicker input,\\n.webix_el_search input,\\n.webix_el_combo .webix_inp_static,\\n.webix_el_richselect .webix_inp_static,\\n.webix_el_datepicker .webix_inp_static,\\n.webix_el_colorpicker .webix_inp_static,\\n.webix_el_search .webix_inp_static {\\n color: #475466;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n -webkit-appearance: none;\\n}\\n.webix_el_combo .webix_el_box,\\n.webix_el_richselect .webix_el_box,\\n.webix_el_datepicker .webix_el_box,\\n.webix_el_colorpicker .webix_el_box,\\n.webix_el_search .webix_el_box,\\n.webix_el_text .webix_el_box,\\n.webix_el_texthighlight .webix_el_box {\\n color: #475466;\\n position: relative;\\n}\\n.webix_el_combo .webix_input_icon,\\n.webix_el_richselect .webix_input_icon,\\n.webix_el_datepicker .webix_input_icon,\\n.webix_el_colorpicker .webix_input_icon,\\n.webix_el_search .webix_input_icon,\\n.webix_el_text .webix_input_icon,\\n.webix_el_texthighlight .webix_input_icon {\\n background-color: transparent;\\n position: absolute;\\n z-index: 1;\\n padding-left: 4px;\\n width: 24px;\\n}\\n.webix_clear_icon:hover {\\n color: #FF5C4C;\\n cursor: pointer;\\n}\\n.webix_clear_icon:hover::before {\\n content: \\\"\\\\F011\\\";\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_view input::-ms-clear {\\n display: none;\\n}\\n/*Remove button padding in FF*/\\n.webix_view button::-moz-focus-inner {\\n padding: 0;\\n border: 0;\\n}\\n.webix_el_radio .webix_inp_label {\\n line-height: normal !important;\\n padding-top: 7px;\\n}\\n.webix_inp_radio_border input,\\n.webix_el_checkbox input {\\n margin: 0px;\\n padding: 0px;\\n float: left;\\n}\\n.webix_line_break {\\n clear: both;\\n}\\n.webix_custom_checkbox,\\n.webix_custom_radio {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_radio_option.webix_disabled .webix_label_right,\\n.webix_radio_option.webix_disabled .webix_inp_radio_border {\\n color: #94A1B3;\\n cursor: not-allowed;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_el_radio .webix_radio_option.webix_disabled .webix_custom_radio {\\n color: #94A1B3;\\n cursor: not-allowed;\\n}\\n.webix_radio_option {\\n display: table;\\n float: left;\\n height: 32px;\\n margin-right: 20px;\\n}\\n.webix_inp_radio_border,\\n.webix_el_radio .webix_label_right {\\n display: table-cell;\\n vertical-align: middle;\\n}\\n.webix_measure_size .webix_inp_radio_border,\\n.webix_measure_size.webix_el_radio .webix_label_right {\\n display: table-cell !important;\\n}\\n.webix_measure_size .webix_radio_option {\\n display: table !important;\\n float: left !important;\\n}\\n.webix_measure_size .webix_line_break {\\n display: block !important;\\n}\\n.webix_invalid .webix_el_box input,\\n.webix_invalid .webix_custom_radio,\\n.webix_invalid .webix_el_box .webix_inp_static,\\n.webix_invalid .webix_el_box select,\\n.webix_invalid .webix_el_box textarea,\\ninput.webix_invalid,\\nselect.webix_invalid,\\ntextarea.webix_invalid {\\n background-color: #fff6f6;\\n border-color: #fea5a8;\\n}\\n.webix_invalid .webix_inp_bottom_label {\\n font-size: 12px;\\n color: #fd595f;\\n}\\n.webix_el_colorpicker .webix_input_icon {\\n padding-left: 0;\\n width: 24px;\\n height: 24px;\\n border-radius: 2px;\\n}\\n.webix_el_search .webix_el_box {\\n position: relative;\\n}\\n.webix_el_search input {\\n padding-right: 30px;\\n}\\n.webix_el_search span {\\n position: absolute;\\n right: 19px;\\n cursor: pointer;\\n padding-left: 7px;\\n}\\n.webix_view.webix_control > .webix_disabled {\\n opacity: 0;\\n}\\n.webix_disabled_view.webix_control .webix_image {\\n -webkit-filter: grayscale(100%);\\n filter: grayscale(100%);\\n}\\n.webix_el_label.webix_disabled_view {\\n color: #94A1B3;\\n}\\n.webix_view.webix_control .webix_disabled_box label,\\n.webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_view.webix_control .webix_disabled_box button,\\n.webix_view.webix_control .webix_disabled_box .webix_slider_title {\\n color: #94A1B3;\\n}\\n.webix_view.webix_control .webix_disabled_box input,\\n.webix_view.webix_control .webix_disabled_box select,\\n.webix_view.webix_control .webix_disabled_box textarea,\\n.webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_view.webix_control .webix_disabled_box .webix_slider_right,\\n.webix_view.webix_control .webix_disabled_box .webix_slider_handle {\\n color: #94A1B3;\\n background: #fbfbfd;\\n border-color: #EDEFF0;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_view.webix_control .webix_disabled_box .webix_inp_counter_next,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_N {\\n color: #94A1B3;\\n background: #f4f5f9;\\n border-color: #f4f5f9;\\n text-shadow: none;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: #dde0ec;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_slider_left {\\n background-color: #94A1B3;\\n}\\n.webix_disabled_top_label {\\n color: #94A1B3;\\n}\\nlabel.webix_required:after,\\nlegend.webix_required:after,\\n.webix_measure_size.webix_required:after,\\n.webix_richtext_inp_label.webix_required .webix_template:after {\\n content: \\\"*\\\";\\n padding-left: 4px;\\n color: #FF5C4C;\\n}\\n.webix_multicombo .webix_inp_static {\\n padding: 0 3px 0 0;\\n}\\n.webix_el_text .webix_multicombo_input {\\n background-color: transparent;\\n border: 0;\\n float: left;\\n vertical-align: middle;\\n font-size: 14px;\\n padding: 0px;\\n color: #475466;\\n font-family: Roboto, sans-serif;\\n margin-left: 9px;\\n}\\n.webix_el_text .webix_multicombo_input:focus {\\n border: 0;\\n box-shadow: none;\\n}\\n.webix_multicombo_listbox {\\n width: auto;\\n line-height: 1;\\n margin: 0;\\n padding: 0;\\n list-style: none;\\n}\\n.webix_multicombo_value,\\n.webix_multicombo_tag {\\n float: left;\\n position: relative;\\n background-color: #f2f2f2;\\n display: inline-block;\\n margin: 3px 0 0 3px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n border-radius: 2px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_multicombo_value {\\n padding: 0 20px 0 5px;\\n}\\n.webix_multicombo_tag {\\n min-width: 15px;\\n text-align: center;\\n}\\n.webix_multicombo_tag,\\n.webix_multicombo_value.webix_readonly {\\n padding: 0 5px 0 5px;\\n}\\n.webix_multicombo_delete {\\n position: absolute;\\n top: 50%;\\n right: 4px;\\n margin-top: -8px;\\n font-size: 16px;\\n height: 16px;\\n line-height: 1;\\n color: #475466;\\n cursor: pointer;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_multicombo_delete::after {\\n content: \\\"\\\\F011\\\";\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_multilist .webix_list_item {\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n}\\n.webix_multilist .webix_selected {\\n background: #f2f2f2;\\n color: #475466;\\n}\\n.webix_multilist .wxi-checkbox-marked,\\n.webix_multilist .wxi-checkbox-blank {\\n vertical-align: middle;\\n font-size: 24px;\\n width: 24px;\\n margin-right: 4px;\\n}\\n.webix_checksuggest_select_all {\\n border-color: transparent;\\n border-bottom: 1px solid #DADEE0;\\n margin-bottom: 1px;\\n}\\n.webix_checksuggest_select_all .webix_label_right {\\n text-transform: capitalize;\\n display: block;\\n padding: 4px 12px 0 12px;\\n}\\n.webix_checksuggest_select_all input {\\n display: none;\\n}\\n.webix_checksuggest_select_all:hover {\\n cursor: pointer;\\n}\\n.webix_checksuggest_select_all:hover .webix_label_right {\\n cursor: pointer;\\n color: #F4F5F9;\\n}\\n.webix_el_texthighlight {\\n position: relative;\\n}\\n.webix_el_texthighlight.webix_el_text .webix_text_highlight_value {\\n position: relative;\\n top: 50%;\\n transform: translate(0, -50%);\\n overflow: hidden;\\n white-space: pre;\\n}\\n.webix_el_texthighlight.webix_el_text input,\\n.webix_el_texthighlight.webix_el_text .webix_text_highlight {\\n -ms-overflow-style: -ms-autohiding-scrollbar;\\n padding: 0 12px;\\n}\\n.webix_el_texthighlight.webix_el_text .webix_input_icon {\\n top: 3px;\\n}\\n.webix_el_texthighlight.webix_el_textarea textarea {\\n padding: 5px 12px;\\n}\\n.webix_el_texthighlight.webix_el_textarea .webix_text_highlight_value {\\n word-wrap: break-word;\\n margin: 5px 12px;\\n white-space: pre-wrap;\\n}\\n.webix_el_texthighlight.webix_disabled_view .webix_text_highlight {\\n background-color: #fbfbfd;\\n}\\n.webix_el_texthighlight .webix_text_highlight,\\n.webix_el_texthighlight input,\\n.webix_el_texthighlight textarea {\\n line-height: normal;\\n letter-spacing: normal;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_el_texthighlight .webix_text_highlight {\\n -webkit-text-size-adjust: none;\\n height: 100%;\\n position: absolute;\\n border: 1px solid transparent;\\n border-radius: 2px;\\n background-color: #fff;\\n overflow: auto;\\n}\\n.webix_el_texthighlight .webix_text_highlight .webix_text_highlight_value {\\n text-align: left;\\n}\\n.webix_el_texthighlight.webix_control .webix_el_box input,\\n.webix_el_texthighlight.webix_control .webix_el_box textarea {\\n display: block;\\n position: relative;\\n z-index: 1;\\n color: transparent;\\n caret-color: #475466;\\n background: transparent;\\n resize: none;\\n}\\n.webix_el_texthighlight textarea {\\n overflow: auto;\\n}\\n.webix_el_tabbar {\\n background: transparent;\\n}\\n.webix_all_tabs {\\n height: 100%;\\n display: table;\\n}\\n.webix_tab_filler {\\n display: table-cell;\\n background: transparent;\\n font-size: 1px;\\n border-bottom: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_tab_filler:first-child {\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_item_tab:first-child {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_item_tab {\\n display: table-cell;\\n text-align: center;\\n vertical-align: middle;\\n overflow: hidden;\\n cursor: pointer;\\n border: 1px solid #DADEE0;\\n border-left-width: 0px;\\n background: #FFFFFF;\\n color: #1CA1C1;\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 0px;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 0px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webixtype_bottom .webix_item_tab {\\n border-radius: 0;\\n}\\n.webix_item_tab.webix_selected {\\n border-bottom-width: 0px;\\n background: #FFFFFF;\\n color: #1CA1C1;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected {\\n border-bottom-width: 1px;\\n}\\n.webix_before_all_tabs {\\n width: 100%;\\n}\\n.webix_after_all_tabs {\\n width: 100%;\\n border-left: 1px solid #DADEE0;\\n border-right: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: #94A1B3;\\n background: #f4f5f9;\\n border-color: #f4f5f9;\\n text-shadow: none;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin: 0 auto;\\n text-align: center;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin: 0 3px;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab,\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab,\\n.webix_el_tabbar .webixtype_image .webix_item_tab {\\n padding: 3px 0;\\n border-radius: 0;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn_top,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top {\\n background-position: center 0;\\n position: relative;\\n height: 100%;\\n}\\n.webix_tab_more_icon {\\n cursor: pointer;\\n display: table-cell;\\n overflow: hidden;\\n text-align: center;\\n vertical-align: middle;\\n padding: 0 3px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_tab_more_icon .webix_icon {\\n width: 100%;\\n}\\n.webix_tab_list .webix_list_item:last-child {\\n border-bottom: none;\\n}\\n.webix_icon.webix_tab_close {\\n font-size: 12px;\\n float: right;\\n padding: 4px;\\n margin-top: -4px;\\n}\\n.webix_icon.webix_tab_close:focus {\\n color: #FF5C4C;\\n}\\n.webix_all_tabs .webix_item_tab.webix_disabled {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n border-color: transparent;\\n cursor: not-allowed;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n.webix_all_tabs .webix_item_tab.webix_disabled:hover,\\n.webix_all_tabs .webix_item_tab.webix_disabled.webix_selected,\\n.webix_all_tabs .webix_item_tab.webix_disabled.webix_selected:hover {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n border-color: transparent;\\n}\\n.webix_menu .webix_list_item:hover,\\n.webix_menu-x .webix_list_item:hover,\\n.webix_menu .webix_list_item:active,\\n.webix_menu-x .webix_list_item:active,\\n.webix_menu .webix_list_item:focus,\\n.webix_menu-x .webix_list_item:focus {\\n background: rgba(100, 100, 100, 0.1);\\n}\\n.webix_menu .webix_list_item,\\n.webix_menu-x .webix_list_item {\\n border: none;\\n text-decoration: none;\\n background: #FFFFFF;\\n height: 36px;\\n}\\n.webix_menu .webix_list_item .webix_submenu_icon,\\n.webix_menu-x .webix_list_item .webix_submenu_icon {\\n float: right;\\n text-align: right;\\n position: relative;\\n margin-left: 4px;\\n}\\n.webix_menu-x {\\n border-color: transparent;\\n background: transparent;\\n color: #FFFFFF;\\n}\\n.webix_menu-x .webix_list_item:first-child {\\n margin-left: 0;\\n}\\n.webix_menu-x .webix_submenu_icon {\\n top: 14px;\\n}\\n.webix_menu-x .webix_list_item {\\n display: inline-block;\\n line-height: 32px;\\n}\\n.webix_menu-x .webix_list_item {\\n border-right: 1px solid #fff;\\n border-left: 0px;\\n background: #1CA1C1;\\n color: #fff;\\n font-size: 14px;\\n}\\n.webix_menu-x .webix_list_item .webix_submenu_icon:before {\\n content: '\\\\F001';\\n}\\n.webix_menu-x .webix_list_item .webix_icon_btn {\\n color: #fff;\\n text-align: left;\\n}\\n.webix_menu-x .webix_list_item.webix_selected {\\n box-shadow: none;\\n}\\n.webix_menu-x .webix_list_item:hover,\\n.webix_menu-x .webix_list_item:active,\\n.webix_menu-x .webix_list_item:focus {\\n background-color: #1992af;\\n}\\n.webix_menu-x .webix_list_item:first-child {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.webix_menu-x .webix_list_item:last-child {\\n border-right: none;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_menu-x .webix_list_item.webix_disabled {\\n color: #94A1B3;\\n background-color: #fbfbfd;\\n}\\n.webix_menu-x.webix_disabled_view .webix_disabled {\\n background-color: transparent;\\n}\\n.webix_menu-x.webix_disabled_view .webix_list_item.menu {\\n color: #94A1B3;\\n background: #f4f5f9;\\n}\\n/* Submenu */\\n.webix_menu {\\n background: #FFFFFF;\\n border: 1px solid #DADEE0;\\n border-radius: 0px;\\n}\\n.webix_menu .webix_list_item {\\n display: block;\\n}\\n.webix_menu .webix_context_separator {\\n height: 3px;\\n padding: 1px 3px 0 3px;\\n}\\n.webix_menu .webix_context_separator .sep_line {\\n height: 1px;\\n border-top: 1px solid #DADEE0;\\n}\\n.webix_menu .webix_submenu_icon {\\n top: 12px;\\n}\\n.webix_menu .webix_context_spacer {\\n height: 36px;\\n}\\n.webix_menu_link {\\n color: inherit;\\n text-decoration: none;\\n display: block;\\n height: 100%;\\n}\\n/* Toolbar */\\n.webix_toolbar.webix_layout_subbar .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_button,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_label .webix_el_box,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_label,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_top_label,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_secondary button:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_next:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_counter_prev:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_0:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_1:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_static,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=text],\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=combo],\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=datepicker],\\n.webix_toolbar.webix_layout_subbar.webix_dark textarea,\\n.webix_toolbar.webix_layout_subbar.webix_dark select,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_texthighlight input,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_multicombo_value,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_inp_static:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=text]:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=combo]:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark input[type=datepicker]:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark textarea:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_el_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_checkbox,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_checkbox:focus,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box input,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box select,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_toolbar.webix_layout_subbar.webix_dark input.webix_invalid,\\n.webix_toolbar.webix_layout_subbar.webix_dark select.webix_invalid,\\n.webix_toolbar.webix_layout_subbar.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_toolbar.webix_layout_subbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar .webix_layout_line,\\n.webix_toolbar .webix_layout_clean {\\n background: transparent;\\n}\\n.webix_hidden_upload,\\n.webix_el_button .webix_hidden_upload {\\n height: 1px;\\n width: 1px;\\n border: 0 !important;\\n font-size: 1px;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n z-index: -1;\\n opacity: 0;\\n}\\n.webix_upload_client,\\n.webix_upload_error,\\n.webix_upload_server {\\n width: 60px;\\n text-align: center;\\n float: right;\\n}\\n.webix_error_icon,\\n.webix_cancel_icon {\\n display: inline-block;\\n background-repeat: no-repeat;\\n}\\n.webix_error_icon {\\n width: 18px;\\n height: 16px;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAYAAAAbBi9cAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZFMDdENjlDNjE2QzExRTI5QzhBQUU2OUI3RDY4RTFCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjZFMDdENjlENjE2QzExRTI5QzhBQUU2OUI3RDY4RTFCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NkUwN0Q2OUE2MTZDMTFFMjlDOEFBRTY5QjdENjhFMUIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NkUwN0Q2OUI2MTZDMTFFMjlDOEFBRTY5QjdENjhFMUIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4ZJnE7AAABdklEQVR42mK80aLPgAcwA/EcIOYB4mgg/oWuQL36AphmYcAPYvl5WBOYmBgY3n/6fQTIn4hLIRMeQ0CuaBHgY2EQ4GMF8euAWIgcg6qF+NmkOdiZGdhYmRiEBdhAhrSQapAKEBcJC7DCBUQE2UBUGhAbkGLQBDEhdjYmJkaGtHVMDD4LmBk+/2RgEBdhBwX+ZGINcuLiZPYW5Ie45tknRrAhIFqAl5WBh4vFBijsR8ggkI29IA0wwMsOo/+DaWjA9wIxGz6D0oAKDXi5EalCkvc/2DApPgifm5OZQZCPFRyGuAwCxwqya0AAZADMVTAgyA92TDUQS2MzqAUUxcAgRjPoP9hVyICVhREUi6B01g4TY4RmES0gvqSuyMPMQAK4ef/LXyBlAswmF2DWd4kJs2M1pGgLIvrRAXJyAIWqNzcXi7cgHysDqQAUnt9//LW52WoQBfLaDRlxDnWgYQzkAKBBDI+ef38E0n3nycsf6gyUgUcAAQYA9DZJKVXGocQAAAAASUVORK5CYII=\\\");\\n}\\n.webix_upload_server {\\n color: #55CD97;\\n}\\n.webix_remove_upload {\\n float: right;\\n}\\n.webix_cancel_icon {\\n margin-top: 9px;\\n width: 14px;\\n height: 14px;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAQAAAC1QeVaAAAAsElEQVR4XoVQUQbDQBScAywIuUcpKCWglBJCDlBKf0vpbymhd5mDhIDcoAcoJQSEsn2G5KmWzMDsPG92ZyGAgVfWfBtrUwEOZnwwOu2UjaPCbScLAEzYmzxyxafMgaUlRXMTsJJ1B7jgy0Y7gHt5FdgyimeAS+a6ZpDTQkLkCQbmk9OBHaPv+p6x99jLFFuOsTMPSlXl8FVlrSopFBP/sIQAbn6+bwsHA29sNGhMBQgf1cri4JYEbDkAAAAASUVORK5CYII=\\\");\\n}\\n.webix_upload_flash {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n bottom: 0;\\n left: 0;\\n background: #fff;\\n}\\n.webix_drop_file {\\n background: #f4f4f4;\\n position: relative;\\n}\\n.webix_drop_file::before {\\n position: absolute;\\n bottom: 10px;\\n left: 0px;\\n width: 100%;\\n text-align: center;\\n pointer-events: none;\\n}\\n.webix_fieldset > fieldset {\\n border: 1px solid #DADEE0;\\n margin: 0px;\\n padding: 5px 8px;\\n}\\n.webix_fieldset_label {\\n color: #475466;\\n font-size: 12px;\\n padding: 0px 8px;\\n text-transform: uppercase;\\n}\\n.webix_forminput > fieldset {\\n border: none;\\n margin: 0px;\\n padding: 0px;\\n}\\n.webix_forminput_label {\\n color: #475466;\\n font-family: Roboto, sans-serif;\\n float: left;\\n line-height: 32px;\\n padding: 3px 2px;\\n padding-right: 9px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\nlegend.webix_forminput_label_top {\\n width: 100%;\\n padding: 3px 2px 0;\\n}\\n.webix_slider_box {\\n position: relative;\\n padding: 0px 10px;\\n height: 100%;\\n float: left;\\n border-radius: 5px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin-top: -11px;\\n padding-top: 15px;\\n}\\n.webix_slider_box .webix_slider_left {\\n height: 10px;\\n float: left;\\n width: 100px;\\n background: #cbeff7;\\n border: 1px solid #e8eaec;\\n border-top-left-radius: 5px;\\n border-bottom-left-radius: 5px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_slider_box .webix_slider_right {\\n height: 10px;\\n float: left;\\n width: 100px;\\n background: #fff;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 5px;\\n border-bottom-right-radius: 5px;\\n border: 1px solid #e8eaec;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_slider_box .webix_slider_handle {\\n z-index: 1;\\n position: absolute;\\n width: 14px;\\n height: 14px;\\n top: 12px;\\n border-radius: 8px;\\n}\\n.webix_slider_box .webix_slider_handle:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_slider_box .webix_slider_left {\\n height: 6px;\\n border: 1px solid #CCD7E6;\\n background: #1CA1C1;\\n}\\n.webix_slider_box .webix_slider_right {\\n height: 6px;\\n border-color: #CCD7E6;\\n}\\n.webix_slider_box .webix_slider_handle {\\n width: 14px;\\n height: 14px;\\n border: 1px solid #CCD7E6;\\n background-color: #FFFFFF;\\n top: 10px;\\n}\\n.webix_rangeslider .webix_slider_box .webix_slider_left {\\n position: absolute;\\n}\\n.webix_rangeslider .webix_slider_box .webix_slider_active {\\n z-index: 2;\\n}\\n.webix_rangeslider .webix_slider_box .webix_slider_right {\\n border-radius: 5px;\\n}\\n.webix_rangeslider .webix_slider_title_box {\\n position: relative;\\n float: left;\\n height: 18px;\\n width: 1px;\\n}\\n.webix_rangeslider .webix_slider_title.webix_slider_move {\\n position: absolute;\\n}\\n.webix_rangeslider.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n border-top-left-radius: 5px;\\n border-bottom-left-radius: 5px;\\n border-top-right-radius: 5px;\\n border-bottom-right-radius: 5px;\\n}\\n.webix_rangeslider.webix_slider_vertical .webix_slider_title.webix_slider_move {\\n display: block;\\n position: relative;\\n}\\n.webix_slider_alt.webix_slider_vertical .webix_slider_box .webix_slider_handle {\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFAQMAAABCXz8WAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAZQTFRFAAAAAAAApWe5zwAAAAJ0Uk5TNgD/j1xNAAAADklEQVR4nGNgYPjPAMYACgAB/xSLTywAAAAASUVORK5CYII=\\\");\\n background-repeat: no-repeat;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_left {\\n border: 1px solid #e1e1e1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_right {\\n border: 1px solid #e1e1e1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_handle {\\n width: 11px;\\n margin: 0 2px;\\n height: 14px;\\n top: 12px;\\n border-radius: 2px;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAYAAAAx8TU7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTJCMjdFNENBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTJCMjdFNERBRTg4MTFFMjk2NjJGMTJENjkyNDA2NTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5MkIyN0U0QUFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5MkIyN0U0QkFFODgxMUUyOTY2MkYxMkQ2OTI0MDY1OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Powz/icAAAAaSURBVHjaYmBgYDBjgAA4zcSABQysIECAAQBn+ACx2PqtbAAAAABJRU5ErkJggg==\\\");\\n background-repeat: no-repeat;\\n background-position: 3px center;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_handle:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_left {\\n border: 1px solid #CCD7E6;\\n background: #1CA1C1;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_right {\\n border-color: #CCD7E6;\\n}\\n.webix_slider_alt .webix_slider_box .webix_slider_handle {\\n background-color: #FFFFFF;\\n border: 1px solid #CCD7E6;\\n top: 10px;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_left,\\n.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n width: 10px;\\n float: none;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_left {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 5px;\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 5px;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n border-top-left-radius: 5px;\\n border-bottom-left-radius: 0;\\n border-top-right-radius: 5px;\\n border-bottom-right-radius: 0;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_handle {\\n left: 7px;\\n}\\n.webix_slider_vertical .webix_slider_title {\\n padding-top: 1px;\\n text-align: left;\\n}\\n.webix_slider_vertical.webix_slider_alt .webix_slider_handle {\\n height: 11px;\\n width: 14px;\\n left: 5px;\\n}\\n.webix_slider_title {\\n text-align: center;\\n}\\n.webix_slider_title.webix_slider_move {\\n position: relative;\\n text-align: left;\\n display: inline-block;\\n width: auto;\\n white-space: nowrap;\\n}\\n.webix_switch_toggle {\\n position: absolute;\\n visibility: hidden;\\n}\\n.webix_switch_box {\\n display: block;\\n position: relative;\\n top: 50%;\\n margin-top: -12px;\\n height: 24px;\\n cursor: pointer;\\n background-color: #f1f1f1;\\n border: 1px solid #DADEE0;\\n border-radius: 60px;\\n transition: background-color 0.4s ease;\\n color: #666;\\n text-align: center;\\n float: left;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_el_switch .webix_label_right {\\n display: block;\\n padding-top: 3px;\\n margin-top: 4px;\\n}\\n.webix_switch_handle {\\n height: 22px;\\n width: 22px;\\n border-radius: 100%;\\n box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3);\\n border: 1px solid #eee;\\n position: absolute;\\n top: 0px;\\n background-color: #fff;\\n transition: left 0.3s ease;\\n cursor: pointer;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_switch_handle:focus,\\n.webix_switch_box:active .webix_switch_handle {\\n box-shadow: 0 0px 2px 2px rgba(0, 0, 0, 0.2);\\n}\\n.webix_switch_text {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n padding: 1px 0 0 18px;\\n display: inline-block;\\n width: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_switch_on .webix_switch_text {\\n padding: 1px 18px 0 0;\\n}\\n.webix_switch_box.webix_switch_on {\\n background-color: #F4F5F9;\\n color: #fff;\\n}\\n.webix_progress_top,\\n.webix_progress_bottom {\\n width: 100%;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n height: 6px;\\n overflow: hidden;\\n z-index: 95;\\n background: #f2f2f2;\\n}\\n.webix_progress_bottom {\\n bottom: 0px;\\n top: auto;\\n height: 17px;\\n}\\n.webix_progress_top .webix_progress_state,\\n.webix_progress_bottom .webix_progress_state {\\n width: 0px;\\n height: 6px;\\n background: #F4F5F9;\\n transition: width 3s;\\n}\\n.webix_progress_bottom .webix_progress_state {\\n height: 17px;\\n}\\n.webix_progress_icon {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0px;\\n left: 0px;\\n z-index: 95;\\n}\\n.webix_progress_icon .webix_progress_state {\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 50px;\\n position: absolute;\\n left: 50%;\\n top: 50%;\\n margin-left: -25px;\\n margin-top: -25px;\\n display: inline-block;\\n color: #93a0b3;\\n}\\n.webix_gage_box {\\n display: table;\\n height: 100%;\\n width: 100%;\\n}\\n.webix_gage_box > div {\\n display: table-cell;\\n vertical-align: middle;\\n}\\n.webix_gage_body {\\n height: 100%;\\n width: 100%;\\n transform: rotate(180deg);\\n}\\n.webix_gage_label {\\n font-size: 0.9em;\\n text-align: center;\\n margin-top: 10px;\\n}\\n.webix_gage_placeholder {\\n margin-top: -20px;\\n}\\n.webix_gage_info {\\n text-align: center;\\n font-size: 0.7em;\\n position: relative;\\n margin: 0 auto 10px auto;\\n}\\n.webix_gage_min_range {\\n left: -23%;\\n}\\n.webix_gage_max_range {\\n right: -23%;\\n}\\n.webix_gage_min_range,\\n.webix_gage_max_range {\\n display: inline-block;\\n margin-top: 20px;\\n position: absolute;\\n text-align: center;\\n width: 46%;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_gage_range_info {\\n font-size: 1.2em;\\n line-height: 1;\\n}\\n.webix_gage_value {\\n font-size: 2.2em;\\n color: #475466;\\n}\\n.webix_gage_value,\\n.webix_gage_range_info {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_gage_gradient_point_animated {\\n transition: transform 1.3s linear;\\n}\\n.webix_gage_animated {\\n stroke: hsl(120, 100%, 50%);\\n animation: gage_dash 1.3s linear forwards;\\n transition: stroke 1.3s linear, stroke-dasharray 1.3s linear;\\n}\\n@keyframes gage_dash {\\n to {\\n stroke-dashoffset: 0;\\n }\\n}\\n.webix_gage_small_font .webix_gage_info,\\n.webix_gage_small_font .webix_gage_range_info {\\n font-size: 1em;\\n}\\n.webix_gage_small_font .webix_gage_label,\\n.webix_gage_small_font .webix_gage_value {\\n font-weight: 500;\\n font-size: 1.2em;\\n}\\n.webix_gage_small_font .webix_gage_min_range,\\n.webix_gage_small_font .webix_gage_max_range {\\n margin-top: 0;\\n}\\n.webix_gage_small_font .webix_gage_placeholder {\\n margin-top: 0;\\n padding-top: 20px;\\n}\\n.webix_bullet_header {\\n font-weight: 500;\\n}\\n.webix_bullet_header,\\n.webix_bullet_subheader {\\n font-size: 14px;\\n fill: #475466;\\n}\\n.webix_bullet_scale {\\n fill: #74869f;\\n font-size: 12px;\\n font-weight: 500;\\n stroke: none;\\n text-anchor: middle;\\n}\\n.webix_bullet_scale_lines {\\n stroke: #74869f;\\n}\\n.webix_bullet_marker {\\n y: 5px;\\n width: 3px;\\n}\\n.webix_timeline .webix_scroll_cont {\\n padding-top: 28px;\\n}\\n.webix_timeline_item {\\n line-height: 0;\\n padding: 0 12px;\\n position: relative;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_timeline_date,\\n.webix_timeline_event {\\n line-height: 20px;\\n overflow: hidden;\\n position: absolute;\\n top: 0px;\\n}\\n.webix_timeline_left .webix_timeline_date,\\n.webix_timeline_right .webix_timeline_details,\\n.webix_timeline_right .webix_timeline_value {\\n text-align: right;\\n}\\n.webix_timeline_value {\\n font-weight: 500;\\n}\\n.webix_timeline_details {\\n color: #94A1B3;\\n padding-top: 2px;\\n}\\n.webix_timeline_date {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_timeline_horizontal .webix_scroll_cont {\\n white-space: nowrap;\\n display: inline-block;\\n padding-left: 28px;\\n height: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_timeline_horizontal .webix_timeline_item {\\n display: inline-block;\\n height: 100%;\\n padding: 12px 0 12px 0;\\n white-space: normal;\\n}\\n.webix_timeline_horizontal .webix_timeline_item .webix_timeline_date,\\n.webix_timeline_horizontal .webix_timeline_item .webix_timeline_event {\\n left: 0px;\\n}\\n.webix_timeline_horizontal .webix_timeline_item.webix_timeline_bottom .webix_timeline_event {\\n top: initial;\\n}\\n.webix_treemap {\\n background-color: #f5f5f5;\\n}\\n.webix_treemap .webix_scroll_cont {\\n position: relative;\\n height: 100%;\\n width: 100%;\\n}\\n.webix_treemap_item {\\n position: absolute;\\n color: #444;\\n overflow: hidden;\\n text-align: left;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n padding: 3px 5px;\\n border-width: 0px 1px 1px 0;\\n border-style: solid;\\n border-color: rgba(0, 0, 0, 0.2);\\n background: transparent;\\n cursor: pointer;\\n}\\n.webix_treemap_level_top {\\n z-index: 1;\\n border-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_treemap_item_bottom {\\n border-bottom-width: 0;\\n}\\n.webix_treemap_item_right {\\n border-right-width: 0;\\n}\\n.webix_treemap_item:hover {\\n box-shadow: inset 0 0 5px #666;\\n}\\n.webix_treemap_item.webix_selected {\\n border-color: #F4F5F9;\\n box-shadow: inset 0 0 1px 2px #F4F5F9;\\n}\\n.webix_treemap_header {\\n width: 100%;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_treemap_header {\\n padding: 0 10px;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_treemap_header_item {\\n cursor: pointer;\\n}\\n.webix_treemap_header_item:last-child {\\n cursor: default;\\n}\\n.webix_treemap_reset {\\n float: right;\\n width: 25px;\\n text-align: center;\\n}\\n.webix_treemap_reset:before {\\n content: \\\"\\\\F011\\\";\\n color: #475466;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 16px;\\n display: block;\\n cursor: pointer;\\n}\\n.webix_treemap_path_icon {\\n width: 20px;\\n text-align: center;\\n}\\n.webix_barcode {\\n position: relative;\\n}\\n.webix_barcode .webix_canvas_text {\\n font-size: 14px;\\n padding: 0 2px;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.portlet_drag {\\n position: absolute;\\n z-index: 1;\\n top: 5px;\\n right: 5px;\\n width: 18px;\\n opacity: 0.5;\\n cursor: pointer;\\n}\\n.portlet_in_drag {\\n opacity: 0.4;\\n}\\n.portlet_marker,\\n.portlet_markertop,\\n.portlet_markerbottom,\\n.portlet_markerleft,\\n.portlet_markerright {\\n opacity: 0.5;\\n background: #9169BE;\\n position: absolute;\\n z-index: 2;\\n transition: top 0.5s, left 0.5s, width 0.5s, height 0.5s;\\n top: 0px;\\n left: 0px;\\n width: 100%;\\n height: 100%;\\n}\\n.portlet_markertop {\\n height: 50%;\\n}\\n.portlet_markerbottom {\\n height: 50%;\\n top: 50%;\\n}\\n.portlet_markerleft {\\n width: 50%;\\n}\\n.portlet_markerright {\\n width: 50%;\\n left: 50%;\\n}\\n.panel_icon {\\n position: absolute;\\n z-index: 93;\\n top: 5px;\\n right: 5px;\\n line-height: normal;\\n font-size: 13px;\\n width: 18px;\\n opacity: 0.5;\\n cursor: pointer;\\n}\\n.webix_disabled_view .panel_icon {\\n z-index: 91;\\n}\\n.panel_target {\\n position: absolute;\\n z-index: 3;\\n background: rgba(0, 0, 0, 0.04);\\n border: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_left {\\n border-width: 0 1px 0 0;\\n box-shadow: 2px 0 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_left.webix_animate {\\n transition: left 0.6s;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_right {\\n left: auto;\\n border-width: 0 0 0 1px;\\n box-shadow: -2px 0px 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_right.webix_animate {\\n transition: right 0.6s;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_top {\\n border-width: 0 0 1px 0 ;\\n box-shadow: 0 2px 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_top .webix_win_body {\\n position: relative;\\n}\\n.webix_sidemenu_top .webix_win_body > .webix_view {\\n position: absolute;\\n top: auto;\\n left: 0;\\n bottom: 0;\\n}\\n.webix_sidemenu_top.webix_animate,\\n.webix_sidemenu_top.webix_animate .webix_win_body {\\n transition: height 0.6s;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_bottom {\\n border-width: 1px 0 0 0 ;\\n top: auto;\\n box-shadow: 0 -2px 2px rgba(0, 0, 0, 0.05);\\n}\\n.webix_sidemenu_bottom.webix_animate,\\n.webix_sidemenu_bottom.webix_animate .webix_win_body {\\n transition: height 0.6s;\\n}\\n/* SideBar*/\\n.webix_sidebar {\\n background: #ECEFF1;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected:focus span {\\n background: transparent;\\n}\\n.webix_sidebar .webix_tree_item {\\n color: #454545;\\n height: 44px;\\n line-height: 43px;\\n}\\n.webix_sidebar .webix_scroll_cont > .webix_tree_leaves {\\n display: block;\\n padding: 0;\\n}\\n.webix_sidebar .webix_tree_leaves .webix_tree_leaves {\\n margin-left: 0px;\\n}\\n.webix_sidebar_selected,\\n.webix_sidebar_expanded .webix_tree_item:hover {\\n background-color: rgba(0, 0, 0, 0.02);\\n}\\n.webix_sidebar .webix_tree_item.webix_selected,\\n.webix_sidebar .webix_tree_item.webix_selected span {\\n background-color: #F4F5F9;\\n padding-right: 0;\\n}\\n.webix_sidebar .webix_tree_branch_1 .webix_tree_item {\\n padding-left: 44px;\\n}\\n.webix_sidebar .webix_tree_branch_1 > .webix_tree_item {\\n height: 44px;\\n line-height: 44px;\\n padding-left: 0;\\n}\\n.webix_sidebar .webix_tree_branch_1 {\\n border-bottom: 1px solid #e5e5e5;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected span,\\n.webix_sidebar .webix_tree_item span {\\n margin: 0;\\n padding: 0px;\\n}\\n.webix_icon.webix_sidebar_icon {\\n width: 44px;\\n text-align: center;\\n}\\nspan.webix_sidebar_dir_icon {\\n float: right;\\n line-height: inherit;\\n}\\n/*SubMenu (Popup) */\\n.webix_sidebar_popup {\\n border: none !important;\\n box-shadow: 2px 3px 3px #ddd;\\n}\\n.webix_sidebar_popup,\\n.webix_sidebar_popup .webix_list_item {\\n border-radius: 0;\\n}\\n.webix_sidebar_popup_right {\\n box-shadow: -3px 3px 3px #ddd;\\n}\\n.webix_sidebar_popup_list.webix_sidebar_popup_left .webix_icon {\\n float: right;\\n line-height: inherit;\\n width: 8px;\\n}\\n.webix_sidebar_popup_list.webix_sidebar_popup_right .webix_icon {\\n float: left;\\n line-height: inherit;\\n}\\n/*SubMenu: title*/\\n.webix_sidebar_popup_title {\\n background: #ECEFF1;\\n}\\n.webix_sidebar_popup_title.webix_selected {\\n border-left-color: #F4F5F9;\\n background: #F4F5F9;\\n}\\n.webix_sidebar_popup_title .webix_template {\\n line-height: 44px;\\n padding: 0 10px;\\n border: 1px solid #E5E5E5;\\n border-left: none;\\n}\\n.webix_sidebar_popup_right .webix_sidebar_popup_title .webix_template {\\n border: 1px solid #E5E5E5;\\n border-right: none;\\n}\\n.webix_sidebar_selected.webix_sidebar_popup_title .webix_template {\\n background: rgba(0, 0, 0, 0.03);\\n border-left: none;\\n}\\n.webix_sidebar_popup_list .webix_list_item {\\n border-left: 1px solid #E5E5E5;\\n border-right: 1px solid #E5E5E5;\\n}\\n/*SubMenu: list*/\\n.webix_sidebar_popup_list .webix_list_item:first-child {\\n border-top: 1px solid #E5E5E5;\\n}\\n.webix_sidebar_popup_list .webix_list_item:hover {\\n background: #f6f9fb;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_selected:hover {\\n background: #F4F5F9;\\n}\\n.webix_menu .webix_list_item.webix_sidebar_selected {\\n background: rgba(0, 0, 0, 0.02);\\n}\\n.webix_menu .webix_list_item.webix_sidebar_selected:hover {\\n background: rgba(0, 0, 0, 0.02) !important;\\n}\\n.webix_view.webix_pdf {\\n background-color: #404040;\\n overflow: auto;\\n}\\n.webix_pdf .canvas_wrapper {\\n margin: 0px auto;\\n box-shadow: 5px 5px 15px #1c1c1c;\\n width: 100%;\\n height: 100%;\\n}\\n.webix_toolbar.pdf_bar .webix_img_btn {\\n text-align: center;\\n}\\n.webix_toolbar.pdf_bar .webix_view {\\n background-color: transparent;\\n}\\n.webix_toolbar.pdf_bar .webix_icon_btn {\\n margin: 0;\\n}\\n.webix_toolbar.pdf_bar .webix_template {\\n background-color: transparent;\\n color: #fff;\\n line-height: 2em;\\n}\\n.webix_toolbar.pdf_bar .webix_el_box input,\\n.webix_toolbar.pdf_bar .webix_inp_static {\\n background-color: #5c5c5c;\\n color: #fff;\\n border-color: #404040;\\n}\\n.webix_toolbar.pdf_bar .webix_el_box input:focus,\\n.webix_toolbar.pdf_bar .webix_inp_static:focus {\\n border-color: #333;\\n}\\n.webix_toolbar.pdf_bar .webix_el_box .webix_input_icon {\\n color: #fff;\\n}\\n.webix_view.webix_popup.pdf_opt_list {\\n border: none;\\n}\\n.pdf_opt_list .webix_list {\\n background-color: #404040;\\n color: #fff;\\n}\\n.pdf_opt_list .webix_list .webix_list_item {\\n border-color: #474747;\\n line-height: 1.5em;\\n}\\n.pdf_opt_list .webix_list .webix_list_item.webix_selected,\\n.pdf_opt_list .webix_list .webix_list_item:hover {\\n color: #404040;\\n background-color: #fff;\\n}\\n.webix_dbllist .bottom_label {\\n text-align: center;\\n font-size: 10px;\\n}\\n.webix_dbllist .webix_list,\\n.webix_dbllist .bottom_label {\\n background: #ededed;\\n}\\n.webix_dbllist .webix_list_item {\\n background: #FFFFFF;\\n margin: 3px 4px 0px 4px;\\n border: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_dbllist .webix_list_item.webix_selected {\\n border-bottom-color: #DADEE0;\\n background-color: #F4F5F9;\\n color: #475466;\\n}\\n.webix_dbllist .dbllist_button {\\n width: 45%;\\n height: 30px;\\n margin-top: 4px;\\n padding: 0;\\n border-radius: 2px;\\n border: 1px solid #DADEE0;\\n cursor: pointer;\\n font-size: 14px;\\n font-family: Roboto, sans-serif;\\n background-color: #F4F5F9;\\n}\\n.webix_dbllist .dbllist_button .webix_icon {\\n color: #1CA1C1;\\n font-size: 20px;\\n width: 26px;\\n}\\n.webix_dbllist .dbllist_button:first-child {\\n margin-top: 36px;\\n margin-right: 4px;\\n}\\n.webix_dbllist .dbllist_button:last-child {\\n margin-left: 4px;\\n}\\n.webix_dbllist .dbllist_button:hover,\\n.webix_dbllist .dbllist_button:focus,\\n.webix_dbllist .dbllist_button:active {\\n background-color: #e7e9f2;\\n}\\n.webix_invalid .webix_list {\\n background: #f8e2e2;\\n}\\n.dbllist_buttons .webix_template {\\n padding: 0 0 0 4px;\\n}\\n.webix_sparklines {\\n padding: 1px 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_sparklines svg {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_sparklines_line {\\n stroke: #3498db;\\n stroke-width: 1;\\n fill: transparent;\\n stroke-linecap: round;\\n}\\n.webix_sparklines_item {\\n fill: #3498db;\\n stroke-width: 1;\\n}\\n.webix_sparklines_bar {\\n fill: #6dbcf0;\\n}\\n.webix_sparklines_bar_negative {\\n fill: #d86c79;\\n}\\n.webix_sparklines_area {\\n fill: #e5eef4;\\n opacity: 0.5;\\n}\\n.webix_sparklines_origin {\\n stroke: #888;\\n stroke-width: 1;\\n fill: transparent;\\n}\\n.webix_sparklines_event_area {\\n fill: transparent;\\n}\\n.webix_sparklines_donut_hole {\\n fill: #FFFFFF;\\n}\\n.webix_sparklines_line_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_area_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_splinearea_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_radar_chart .webix_sparklines_event_area:hover {\\n fill: rgba(220, 220, 220, 0.4);\\n stroke: rgba(255, 255, 255, 0.6);\\n}\\n.webix_sparklines_pie_chart .webix_sparklines_event_area:hover,\\n.webix_sparklines_bar_chart .webix_sparklines_event_area:hover {\\n fill: rgba(255, 255, 255, 0.3);\\n}\\n/* print css rules*/\\n.webix_ui_print,\\n.webix_print_pdf {\\n display: none;\\n}\\nbody.webix_print {\\n margin-top: 0px;\\n}\\n@media print {\\n body.webix_print {\\n overflow: visible !important;\\n background-color: none !important;\\n }\\n body.webix_print > * {\\n display: none;\\n }\\n body.webix_print * {\\n visibility: hidden;\\n }\\n .webix_ui_print {\\n display: block !important;\\n margin: 0 0 0 0!important;\\n visibility: visible !important;\\n }\\n .webix_ui_print * {\\n visibility: visible !important;\\n }\\n .webix_print_noscroll {\\n height: auto !important;\\n width: auto !important;\\n }\\n .webix_print_noscroll,\\n .webix_print_noscroll .webix_scroll_cont {\\n overflow: visible !important;\\n }\\n .webix_print_pagebreak {\\n page-break-after: always;\\n }\\n .webix_print_header,\\n .webix_print_footer {\\n display: block !important;\\n padding: 20px 0px;\\n text-align: center;\\n height: auto !important;\\n visibility: visible !important;\\n }\\n .webix_print_header *,\\n .webix_print_footer * {\\n visibility: visible !important;\\n }\\n /*datatable specific*/\\n .webix_table_print {\\n display: table;\\n visibility: visible !important;\\n table-layout: fixed;\\n width: 100%;\\n border: 1px solid #ebebeb;\\n margin-bottom: 20px;\\n position: initial;\\n }\\n .webix_table_print td {\\n overflow: hidden;\\n }\\n .webix_table_print tr {\\n page-break-inside: avoid;\\n }\\n .webix_table_print .webix_print_top_split .webix_cell {\\n border-bottom: 1px solid #d2d2d2;\\n }\\n .webix_table_print .webix_cell {\\n display: table-cell !important;\\n border-right: 1px solid #ebebeb;\\n border-bottom: 1px solid #ebebeb;\\n padding: 0px 10px;\\n white-space: nowrap;\\n }\\n .webix_table_print .webix_header_cell {\\n display: table-cell;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n background: #F4F5F9;\\n border-right: 1px solid #DADEE0;\\n border-bottom: 1px solid #DADEE0;\\n }\\n .webix_table_print .webix_footer_cell {\\n display: table-cell;\\n background: #fafafa;\\n border-right: 1px solid #EDEFF0;\\n border-top: 1px solid #EDEFF0;\\n border-bottom: 1px solid #EDEFF0;\\n }\\n .webix_table_print .webix_cell.webix_dtable_span {\\n position: initial !important;\\n white-space: normal;\\n }\\n .webix_table_print .webix_rotate {\\n transform-origin: center 40% !important;\\n }\\n .webix_table_print.borderless,\\n .webix_table_print.borderless .webix_cell {\\n border: none;\\n }\\n /* x-list specific*/\\n .webix_table_print.webix_view.webix_list-x {\\n white-space: normal;\\n }\\n .webix_table_print.webix_view.webix_list-x .webix_list_item {\\n display: table-cell;\\n }\\n}\\n.webix_fullscreen_html .webix_template > * {\\n width: 100% !important;\\n height: 100% !important;\\n margin: 0px !important;\\n}\\n.webix_icon,\\n.webix_icon_btn,\\n.webix_input_icon {\\n display: inline-block;\\n font-family: \\\"Webix Material Icons\\\";\\n font-style: normal;\\n font-weight: normal;\\n line-height: 1;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n transform: translate(0, 0);\\n}\\n.webix_icon,\\n.webix_input_icon {\\n font-size: 17px;\\n display: inline-block;\\n width: 20px;\\n}\\n.webix_input_icon {\\n float: right;\\n font-size: 20px;\\n color: #94A1B3;\\n}\\n.webix_icon_button {\\n background-color: transparent;\\n border: none;\\n padding: 0;\\n cursor: pointer;\\n vertical-align: middle;\\n}\\n.webix_el_icon .webix_el_box {\\n padding: 0;\\n margin: 0 auto;\\n text-align: center;\\n position: relative;\\n overflow: visible;\\n cursor: pointer;\\n}\\n.webix_icon_button .webix_icon {\\n font-size: 20px;\\n height: 20px;\\n width: 20px;\\n display: inline-block;\\n text-align: center;\\n color: #94A1B3;\\n}\\n.webix_icon_btn {\\n font-size: 20px;\\n display: inline-block;\\n text-align: center;\\n width: 20px;\\n margin-right: 4px;\\n color: #94A1B3;\\n}\\n.webix_icon {\\n text-align: center;\\n}\\n.webix_badge {\\n background-color: #ff8839;\\n color: #FFFFFF;\\n border-radius: 11px;\\n font-size: 12px;\\n height: 22px;\\n min-width: 22px;\\n padding: 0 4px;\\n text-align: center;\\n line-height: 22px;\\n position: absolute;\\n right: 0;\\n top: 0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_badge.webix_measure_size {\\n right: auto;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_list_item .webix_badge {\\n position: static;\\n float: right;\\n margin: 4px -5px 0 12px;\\n}\\n@font-face {\\n font-family: Roboto;\\n src: url('fonts/Roboto-Regular-webfont.woff2') format('woff2'), url('fonts/Roboto-Regular-webfont.woff') format('woff');\\n font-weight: normal;\\n font-style: normal;\\n}\\n@font-face {\\n font-family: Roboto;\\n src: url('fonts/Roboto-Medium-webfont.woff2') format('woff2'), url('fonts/Roboto-Medium-webfont.woff') format('woff');\\n font-style: normal;\\n font-weight: 500;\\n}\\n.mainFont {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.buttonFont {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n}\\n.selectFocusRule {\\n background: #edeff5;\\n}\\n.layoutBarBG .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.layoutBarBG.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.layoutBarBG.webix_dark .webix_el_button,\\n.layoutBarBG.webix_dark .webix_el_label .webix_el_box,\\n.layoutBarBG.webix_dark .webix_inp_label,\\n.layoutBarBG.webix_dark .webix_inp_top_label,\\n.layoutBarBG.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_secondary .webix_icon,\\n.layoutBarBG.webix_dark .webix_transparent .webix_icon,\\n.layoutBarBG.webix_dark .webix_secondary .webix_img_btn_text,\\n.layoutBarBG.webix_dark .webix_transparent .webix_img_btn_text,\\n.layoutBarBG.webix_dark .webix_secondary .webix_icon_btn,\\n.layoutBarBG.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_transparent button:hover,\\n.layoutBarBG.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.layoutBarBG.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_secondary button,\\n.layoutBarBG.webix_dark .webix_inp_counter_next,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev,\\n.layoutBarBG.webix_dark .webix_segment_0,\\n.layoutBarBG.webix_dark .webix_segment_1,\\n.layoutBarBG.webix_dark .webix_segment_N,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.layoutBarBG.webix_dark .webix_secondary button:hover,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item:hover,\\n.layoutBarBG.webix_dark .webix_inp_counter_next:hover,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev:hover,\\n.layoutBarBG.webix_dark .webix_segment_0:hover,\\n.layoutBarBG.webix_dark .webix_segment_1:hover,\\n.layoutBarBG.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_secondary button:focus,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item:focus,\\n.layoutBarBG.webix_dark .webix_inp_counter_next:focus,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev:focus,\\n.layoutBarBG.webix_dark .webix_segment_0:focus,\\n.layoutBarBG.webix_dark .webix_segment_1:focus,\\n.layoutBarBG.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_secondary button:active,\\n.layoutBarBG.webix_dark .webix_menu-x .webix_list_item:active,\\n.layoutBarBG.webix_dark .webix_inp_counter_next:active,\\n.layoutBarBG.webix_dark .webix_inp_counter_prev:active,\\n.layoutBarBG.webix_dark .webix_segment_0:active,\\n.layoutBarBG.webix_dark .webix_segment_1:active,\\n.layoutBarBG.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_inp_static,\\n.layoutBarBG.webix_dark input[type=text],\\n.layoutBarBG.webix_dark input[type=combo],\\n.layoutBarBG.webix_dark input[type=datepicker],\\n.layoutBarBG.webix_dark textarea,\\n.layoutBarBG.webix_dark select,\\n.layoutBarBG.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.layoutBarBG.webix_dark .webix_el_texthighlight input,\\n.layoutBarBG.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.layoutBarBG.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.layoutBarBG.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_multicombo_value,\\n.layoutBarBG.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.layoutBarBG.webix_dark .webix_inp_static:focus,\\n.layoutBarBG.webix_dark input[type=text]:focus,\\n.layoutBarBG.webix_dark input[type=combo]:focus,\\n.layoutBarBG.webix_dark input[type=datepicker]:focus,\\n.layoutBarBG.webix_dark textarea:focus,\\n.layoutBarBG.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.layoutBarBG.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.layoutBarBG.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0:hover,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1:hover,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0:focus,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1:focus,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_0:active,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_1:active,\\n.layoutBarBG.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.layoutBarBG.webix_dark .webix_el_icon,\\n.layoutBarBG.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.layoutBarBG.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.layoutBarBG.webix_dark .webix_icon_button:hover .webix_icon,\\n.layoutBarBG.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.layoutBarBG.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.layoutBarBG.webix_dark .webix_custom_checkbox,\\n.layoutBarBG.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_custom_checkbox:focus,\\n.layoutBarBG.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.layoutBarBG.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.layoutBarBG.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.layoutBarBG.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.layoutBarBG.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.layoutBarBG.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.layoutBarBG.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box input,\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box select,\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box textarea,\\n.layoutBarBG.webix_dark input.webix_invalid,\\n.layoutBarBG.webix_dark select.webix_invalid,\\n.layoutBarBG.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.layoutBarBG.webix_dark .webix_invalid .webix_multicombo_value,\\n.layoutBarBG.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.layoutBarBG.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar .webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #475466;\\n letter-spacing: 0px;\\n}\\n.webix_toolbar.webix_dark {\\n background: #657584;\\n border-color: #657584;\\n}\\n.webix_toolbar.webix_dark .webix_el_button,\\n.webix_toolbar.webix_dark .webix_el_label .webix_el_box,\\n.webix_toolbar.webix_dark .webix_inp_label,\\n.webix_toolbar.webix_dark .webix_inp_top_label,\\n.webix_toolbar.webix_dark .webix_slider_title {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_secondary .webix_icon,\\n.webix_toolbar.webix_dark .webix_transparent .webix_icon,\\n.webix_toolbar.webix_dark .webix_secondary .webix_img_btn_text,\\n.webix_toolbar.webix_dark .webix_transparent .webix_img_btn_text,\\n.webix_toolbar.webix_dark .webix_secondary .webix_icon_btn,\\n.webix_toolbar.webix_dark .webix_transparent .webix_icon_btn {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_transparent button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_transparent button:hover,\\n.webix_toolbar.webix_dark .webix_transparent button:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_dark .webix_transparent button:active {\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_secondary button,\\n.webix_toolbar.webix_dark .webix_inp_counter_next,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev,\\n.webix_toolbar.webix_dark .webix_segment_0,\\n.webix_toolbar.webix_dark .webix_segment_1,\\n.webix_toolbar.webix_dark .webix_segment_N,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #FFFFFF;\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_view > .webix_template {\\n color: #FFFFFF;\\n background-color: #657584;\\n}\\n.webix_toolbar.webix_dark .webix_secondary button:hover,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item:hover,\\n.webix_toolbar.webix_dark .webix_inp_counter_next:hover,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev:hover,\\n.webix_toolbar.webix_dark .webix_segment_0:hover,\\n.webix_toolbar.webix_dark .webix_segment_1:hover,\\n.webix_toolbar.webix_dark .webix_segment_N:hover {\\n color: #FFFFFF;\\n background-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_secondary button:focus,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item:focus,\\n.webix_toolbar.webix_dark .webix_inp_counter_next:focus,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev:focus,\\n.webix_toolbar.webix_dark .webix_segment_0:focus,\\n.webix_toolbar.webix_dark .webix_segment_1:focus,\\n.webix_toolbar.webix_dark .webix_segment_N:focus {\\n background-color: rgba(0, 0, 0, 0.4);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_secondary button:active,\\n.webix_toolbar.webix_dark .webix_menu-x .webix_list_item:active,\\n.webix_toolbar.webix_dark .webix_inp_counter_next:active,\\n.webix_toolbar.webix_dark .webix_inp_counter_prev:active,\\n.webix_toolbar.webix_dark .webix_segment_0:active,\\n.webix_toolbar.webix_dark .webix_segment_1:active,\\n.webix_toolbar.webix_dark .webix_segment_N:active {\\n background-color: rgba(0, 0, 0, 0.5);\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_inp_static,\\n.webix_toolbar.webix_dark input[type=text],\\n.webix_toolbar.webix_dark input[type=combo],\\n.webix_toolbar.webix_dark input[type=datepicker],\\n.webix_toolbar.webix_dark textarea,\\n.webix_toolbar.webix_dark select,\\n.webix_toolbar.webix_dark .webix_text_highlight {\\n border-color: transparent;\\n background-color: rgba(0, 0, 0, 0.2);\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_dark .webix_el_texthighlight input,\\n.webix_toolbar.webix_dark .webix_el_texthighlight textarea {\\n caret-color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_dark .webix_inp_static input[type=text] {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_dark select option {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_multicombo_value,\\n.webix_toolbar.webix_dark .webix_multicombo_tag {\\n color: #657584;\\n}\\n.webix_toolbar.webix_dark .webix_inp_static:focus,\\n.webix_toolbar.webix_dark input[type=text]:focus,\\n.webix_toolbar.webix_dark input[type=combo]:focus,\\n.webix_toolbar.webix_dark input[type=datepicker]:focus,\\n.webix_toolbar.webix_dark textarea:focus,\\n.webix_toolbar.webix_dark select:focus {\\n border-color: #FFFFFF;\\n box-shadow: none;\\n}\\n.webix_toolbar.webix_dark .webix_el_counter button {\\n background-color: rgba(0, 0, 0, 0.3);\\n}\\n.webix_toolbar.webix_dark .webix_el_counter input[type=text]:focus {\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark ::-webkit-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark ::-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark :-moz-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark :-ms-input-placeholder {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_input_icon {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N {\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0:hover,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1:hover,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0:focus,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1:focus,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_0:active,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_1:active,\\n.webix_toolbar.webix_dark .webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_toolbar.webix_dark .webix_el_icon,\\n.webix_toolbar.webix_dark .webix_icon_button {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_control {\\n border-color: #1CA1C1;\\n}\\n.webix_toolbar.webix_dark .webix_icon_button:hover:before {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n.webix_toolbar.webix_dark .webix_icon_button:hover .webix_icon,\\n.webix_toolbar.webix_dark .webix_icon_button:focus .webix_icon {\\n opacity: 1;\\n}\\n.webix_toolbar.webix_dark .webix_icon_button .webix_icon {\\n color: #FFFFFF;\\n opacity: 0.7;\\n}\\n.webix_toolbar.webix_dark .webix_custom_checkbox,\\n.webix_toolbar.webix_dark .webix_custom_radio {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_custom_checkbox:focus,\\n.webix_toolbar.webix_dark .webix_custom_radio:focus {\\n color: #f0f0f0;\\n}\\n.webix_toolbar.webix_dark .webix_label_right {\\n color: #FFFFFF;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_button {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_img_btn_text {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_disabled_view.webix_control .webix_icon_btn,\\n.webix_toolbar.webix_dark .webix_disabled_view.webix_control .webix_icon {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_disabled_view.webix_menu-x .webix_list_item.menu {\\n background-color: rgba(0, 0, 0, 0.1);\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon,\\n.webix_toolbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_disabled_box .webix_img_btn_text,\\n.webix_toolbar.webix_dark .webix_toolbar .webix_disabled_view.webix_control .webix_icon_btn {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box label,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box button {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box input,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box select,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box textarea,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_prev,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_counter_next {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n border-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_item_tab {\\n color: rgba(255, 255, 255, 0.4);\\n background-color: rgba(0, 0, 0, 0.1);\\n text-shadow: none;\\n}\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_0.webix_selected,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_1.webix_selected,\\n.webix_toolbar.webix_dark .webix_view.webix_control .webix_disabled_box .webix_segment_N.webix_selected {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.webix_toolbar.webix_dark .webix_disabled_top_label {\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box input,\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static,\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box select,\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box textarea,\\n.webix_toolbar.webix_dark input.webix_invalid,\\n.webix_toolbar.webix_dark select.webix_invalid,\\n.webix_toolbar.webix_dark textarea.webix_invalid {\\n color: #ffdedb;\\n background-color: rgba(255, 92, 76, 0.3);\\n border-color: #ff8d82;\\n}\\n.webix_toolbar.webix_dark .webix_invalid .webix_multicombo_value,\\n.webix_toolbar.webix_dark .webix_invalid .webix_multicombo_tag {\\n color: #FF5C4C;\\n}\\n.webix_toolbar.webix_dark .webix_invalid .webix_el_box .webix_inp_static input {\\n background-color: transparent;\\n}\\n.webix_layout_space > .webix_toolbar {\\n border-radius: 2px;\\n}\\n.webix_view.webix_layout_accordion {\\n background-color: #EBEDF0;\\n}\\n.webix_accordionitem .webix_accordionitem_button {\\n float: right;\\n position: relative;\\n height: 19px;\\n width: 19px;\\n margin: 13.5px 13px;\\n}\\n.webix_accordionitem .webix_accordionitem_header {\\n line-height: 44px;\\n}\\n.webix_accordionitem .webix_accordionitem_header:hover,\\n.webix_accordionitem .webix_accordionitem_header:focus {\\n background-color: #fafafa;\\n}\\n.webix_accordionitem.collapsed .webix_accordionitem_button {\\n float: right;\\n position: relative;\\n margin-top: 12.5px;\\n}\\n.webix_accordionitem.horizontal.collapsed,\\n.webix_accordionitem.collapsed {\\n background-color: #F4F5F9;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header,\\n.webix_accordionitem.collapsed .webix_accordionitem_header {\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header .webix_accordionitem_button,\\n.webix_accordionitem.collapsed .webix_accordionitem_header .webix_accordionitem_button {\\n color: #1CA1C1;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header .webix_accordionitem_label .webix_icon,\\n.webix_accordionitem.collapsed .webix_accordionitem_header .webix_accordionitem_label .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:hover,\\n.webix_accordionitem.collapsed .webix_accordionitem_header:hover,\\n.webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:focus,\\n.webix_accordionitem.collapsed .webix_accordionitem_header:focus {\\n background-color: #edeff5;\\n}\\n.webix_accordionitem_label {\\n padding-left: 12px;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header {\\n background-color: #657584;\\n color: #FFFFFF;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header .webix_accordionitem_button {\\n color: #FFFFFF;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header.collapsed {\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header.collapsed .webix_accordionitem_button {\\n color: #1CA1C1;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header:hover,\\n.webix_layout_accordion.webix_dark .webix_accordionitem_header:focus {\\n background-color: #61707e;\\n}\\n.webix_layout_accordion.webix_dark .webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:hover,\\n.webix_layout_accordion.webix_dark .webix_accordionitem.collapsed .webix_accordionitem_header:hover,\\n.webix_layout_accordion.webix_dark .webix_accordionitem.horizontal.collapsed .webix_accordionitem_header:focus,\\n.webix_layout_accordion.webix_dark .webix_accordionitem.collapsed .webix_accordionitem_header:focus {\\n background-color: #edeff5;\\n}\\n.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button {\\n color: #94A1B3;\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n text-align: center;\\n width: 24px;\\n height: 43px;\\n margin: 0 10px 0 10px;\\n}\\n.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_label .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_accordionitem .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F002';\\n}\\n.webix_accordionitem .webix_accordionitem_header.collapsed .webix_accordionitem_button:before {\\n content: '\\\\F004';\\n}\\n.webix_accordionitem.horizontal:last-child > .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F003';\\n}\\n.webix_accordionitem.horizontal.collapsed:last-child > .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F001';\\n}\\n.webix_accordionitem.vertical > .webix_accordionitem_header .webix_accordionitem_button {\\n height: 43px;\\n margin: 0px 10px 0 10px;\\n}\\n.webix_accordionitem.vertical > .webix_accordionitem_header .webix_accordionitem_button:before {\\n content: '\\\\F004';\\n}\\n.webix_accordionitem.vertical > .webix_accordionitem_header.collapsed .webix_accordionitem_button:before {\\n content: '\\\\F001';\\n}\\n.webix_toolbar.webix_layout_subbar {\\n background: transparent;\\n}\\n.webix_toolbar.webix_layout_subbar .webix_view {\\n color: #475466;\\n}\\n.webix_el_tabbar + .webix_multiview {\\n background-color: #FFFFFF;\\n}\\n.webix_layout_space > .webix_view,\\n.webix_layout_wide > .webix_view {\\n border-radius: 2px;\\n}\\n.webix_layout_space .webix_layout_accordion .webix_accordionitem,\\n.webix_layout_wide .webix_layout_accordion .webix_accordionitem {\\n border-radius: 2px;\\n}\\n.webix_popup_button {\\n border-color: #F4F5F9;\\n}\\n.webix_popup_button.confirm {\\n border-color: #1CA1C1;\\n}\\n.webix_popup_button div {\\n border-radius: 0;\\n}\\n.dataHeaderFont {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_dtable .webix_ss_header .webix_hcell,\\n.webix_dtable .webix_ss_footer .webix_hcell {\\n border-color: transparent;\\n}\\n.webix_dtable .webix_ss_body .webix_column > div,\\n.webix_dtable .webix_ss_body .webix_table_cell {\\n border-right-color: transparent;\\n border-left-color: transparent;\\n}\\n.webix_dtable.webix_header_border .webix_ss_header .webix_hcolumn > div,\\n.webix_dtable.webix_header_border .webix_ss_header .webix_span {\\n border-right-color: #DADEE0;\\n border-bottom-color: #DADEE0;\\n}\\n.webix_dtable.webix_footer_border .webix_ss_footer .webix_hcolumn > div,\\n.webix_dtable.webix_footer_border .webix_ss_footer .webix_span {\\n border-right-color: #DADEE0;\\n border-top-color: #DADEE0;\\n}\\n.webix_dtable.webix_data_border .webix_ss_body .webix_column > div,\\n.webix_dtable.webix_data_border .webix_table_cell {\\n border-right-color: #EDEFF0;\\n}\\n.webix_dtable .webix_ss_left .webix_column.webix_last > div,\\n.webix_dtable .webix_table_cell.webix_last_rightcell {\\n border-right: 1px solid #ccd2d4;\\n}\\n.webix_dtable div.webix_last_topcell {\\n border-bottom: 1px solid #ccd2d4;\\n}\\n.webix_dtable .webix_ss_right .webix_column.webix_first > div {\\n border-left: 1px solid #ccd2d4;\\n}\\n.webix_dtable .webix_hs_right .webix_hcell.webix_first {\\n border-left: 1px solid #DADEE0;\\n}\\n.webix_dtable .webix_hs_left .webix_hcell.webix_last {\\n border-right: 1px solid #DADEE0;\\n}\\n.webix_dtable .webix_hcell.webix_ss_filter {\\n padding: 0px 4px;\\n}\\n.webix_dtable .webix_hcell.webix_div_filter {\\n padding: 1px 4px;\\n}\\n.webix_dtable .webix_dtable_subview {\\n background: #FFFFFF;\\n}\\n.webix_dtable .webix_dtable_subview .webix_view {\\n border-left-width: 1px;\\n border-right-width: 1px;\\n border-color: #EDEFF0;\\n}\\n.webix_dtable .webix_ss_filter select,\\n.webix_dtable .webix_ss_filter input {\\n height: 32px;\\n vertical-align: middle;\\n border-radius: 2px;\\n border-color: #CCD7E6;\\n}\\n.webix_dtable .webix_ss_filter select:focus,\\n.webix_dtable .webix_ss_filter input:focus {\\n border-color: #1CA1C1;\\n}\\n.webix_dtable .webix_select_mark > div.webix_row_select {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_dtable .webix_ss_header .webix_hcolumn div.webix_last_row,\\n.webix_dtable .webix_ss_header .webix_span.webix_last_row {\\n border-bottom: 1px solid #5ccce7;\\n}\\n.webix_dtable .webix_ss_footer .webix_hcolumn > div:first-child,\\n.webix_dtable .webix_ss_footer .webix_hcell[row=\\\"0\\\"] {\\n border-top: 1px solid #5ccce7;\\n}\\n.webix_dtable .webix_ss_footer,\\n.webix_dtable .webix_ss_footer .webix_hcolumn,\\n.webix_dtable .webix_ss_footer .webix_hs_left,\\n.webix_dtable .webix_ss_footer .webix_hs_center,\\n.webix_dtable .webix_ss_footer .webix_hs_right,\\n.webix_dtable .webix_ss_footer div.webix_ss_vscroll_footer {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n background: #F4F5F9;\\n}\\n.webix_dtable .webix_column > .webix_drag_over.webix_cell {\\n background-color: #F4F5F9;\\n}\\n.webix_block_selection {\\n border: none;\\n background: #1CA1C1;\\n opacity: 0.1;\\n}\\n.webix_area_selection,\\n.webix_area_selection_handle {\\n background: #1CA1C1;\\n}\\n.webix_dtable_focused .webix_area_selection,\\n.webix_dtable_focused .webix_area_selection_handle {\\n background-color: #1992af;\\n}\\n.dtBodyCell {\\n border-bottom: 1px solid #EDEFF0;\\n}\\n.webix_dtable div.webix_ss_vscroll_header {\\n border-bottom-color: #5ccce7;\\n}\\n.webix_dtable div.webix_ss_vscroll_footer {\\n border-top-color: #5ccce7;\\n border-left-color: #DADEE0;\\n}\\n.webix_view .webix_dt_editor input,\\n.webix_view .webix_dt_editor select {\\n border-color: #1CA1C1;\\n border-radius: 2px;\\n}\\n.dataItemStyle {\\n border-color: #EDEFF0;\\n}\\n.webix_list_item.webix_group_back {\\n color: #313131;\\n background: #F4F5F9;\\n border-bottom: 1px solid #DADEE0;\\n}\\n.webix_dataview_item {\\n border-right-color: #EDEFF0;\\n line-height: 24px;\\n}\\n.webix_dataview_item.webix_selected {\\n box-shadow: none;\\n}\\n.webix_dataview_item.tiles.webix_selected {\\n border-color: #5ccce7;\\n}\\n.webix_view .webix_pager_item {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n letter-spacing: 0px;\\n outline: none;\\n background: #F4F5F9;\\n color: #1CA1C1;\\n}\\n.webix_view .webix_pager_item:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_view .webix_pager_item:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_view .webix_pager_item:active {\\n background-color: #daddeb;\\n}\\n.webix_view .webix_pager_item_selected {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n background: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_view .webix_pager_item_selected:hover {\\n background-color: #1992af;\\n}\\n.webix_view .webix_pager_item_selected:focus {\\n background-color: #1992af;\\n}\\n.webix_view .webix_pager_item_selected:active {\\n background-color: #17839d;\\n}\\n.webix_view .webix_pager_item,\\n.webix_view .webix_pager_item_selected {\\n border-radius: 2px;\\n border-width: 0px;\\n}\\n.webix_list .webix_unit_header {\\n font-weight: normal;\\n text-shadow: none;\\n border-bottom: 1px solid #DADEE0;\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n background: #F4F5F9;\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_list .webix_unit_header:not(:first-child) {\\n border-top: 1px solid #DADEE0;\\n margin-top: -1px;\\n}\\n.webix_tree .webix_tree_item.webix_selected {\\n background-color: #F4F5F9;\\n}\\n.webix_tree .webix_tree_item.webix_selected:focus {\\n background-color: #edeff5;\\n}\\n.webix_tree .webix_tree_item.webix_selected span {\\n background-color: transparent;\\n padding: 0;\\n margin: 0;\\n}\\n.webix_tree .webix_tree_item.webix_selected div {\\n background-color: transparent;\\n}\\n.webix_tree .webix_tree_item,\\n.webix_tree .webix_tree_item.webix_selected {\\n padding-right: 12px;\\n}\\n.webix_tree_open,\\n.webix_tree_close {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n text-align: center;\\n color: #94A1B3;\\n}\\n.webix_tree_open:before {\\n margin-left: -2px;\\n content: \\\"\\\\F027\\\";\\n}\\n.webix_tree_close:before {\\n margin-left: -2px;\\n content: \\\"\\\\F028\\\";\\n}\\n.webix_tree_folder,\\n.webix_tree_folder_open,\\n.webix_tree_file {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 20px;\\n margin: 0 4px 0 0;\\n width: 24px;\\n text-align: center;\\n color: #DADEE0;\\n}\\n.webix_tree_folder:before {\\n content: \\\"\\\\F030\\\";\\n}\\n.webix_tree_folder_open:before {\\n content: \\\"\\\\F031\\\";\\n}\\n.webix_tree_file:before {\\n content: \\\"\\\\F032\\\";\\n}\\n.webix_menu-x .webix_list_item .webix_submenu_icon,\\n.webix_view.webix_menu .webix_list_item .webix_submenu_icon {\\n font-size: 14px;\\n font-family: \\\"Webix Material Icons\\\";\\n width: 6px;\\n top: 0;\\n margin-left: 0;\\n}\\n.webix_view.webix_popup.webix_menu {\\n border: none;\\n}\\n.webix_menu.webix_view .webix_list_item:hover,\\n.webix_menu.webix_view .webix_list_item:active {\\n background-color: #edeff5;\\n}\\n.webix_menu.webix_view .webix_list_item .webix_submenu_icon:before {\\n content: '\\\\F003';\\n}\\n.webix_menu.webix_view .webix_list_item.webix_selected {\\n background: #F4F5F9;\\n}\\n.webix_menu.webix_view .webix_list_item.webix_disabled {\\n background-color: #FFFFFF;\\n}\\n.webix_menu.webix_view .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_property .webix_property_label_line {\\n background-color: #F4F5F9;\\n}\\n.webix_drag_over,\\n.webix_drop_zone {\\n background-color: #F4F5F9;\\n}\\n.webix_view button,\\n.webix_view input[type=button] {\\n -webkit-appearance: none;\\n}\\n.focusStyle {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_search input,\\n.webix_el_combo input,\\n.webix_el_colorpicker input {\\n padding-right: 28px;\\n}\\n.webix_el_search input,\\n.webix_el_text input,\\n.webix_el_combo input,\\n.webix_el_colorpicker input,\\n.webix_el_datepicker input {\\n border-radius: 2px;\\n}\\n.webix_el_search input:focus,\\n.webix_el_text input:focus,\\n.webix_el_combo input:focus,\\n.webix_el_colorpicker input:focus,\\n.webix_el_datepicker input:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_richselect .webix_inp_static,\\n.webix_el_datepicker .webix_inp_static,\\n.webix_el_colorpicker .webix_inp_static {\\n border-radius: 2px;\\n padding-right: 28px;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n}\\n.webix_el_richselect .webix_inp_static:focus,\\n.webix_el_datepicker .webix_inp_static:focus,\\n.webix_el_colorpicker .webix_inp_static:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_textarea textarea:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_select select:focus {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_el_select select,\\n.webix_el_textarea textarea {\\n border-radius: 2px;\\n}\\n.webix_el_text .webix_inp_static {\\n border-radius: 2px;\\n white-space: nowrap;\\n}\\n.webix_focused .webix_inp_static {\\n border: 1px solid #1CA1C1;\\n}\\n.webix_multilist .wxi-checkbox-marked {\\n color: #1CA1C1;\\n}\\n.webix_multilist .wxi-checkbox-blank {\\n color: #94A1B3;\\n}\\n.webix_multicombo_value,\\n.webix_multicombo_tag,\\n.webix_multicombo_value.webix_readonly {\\n background-color: #EBEDF0;\\n border-radius: 100px;\\n padding: 0 12px 0 12px;\\n}\\n.webix_multicombo_value:has(> .webix_multicombo_delete) {\\n padding: 0 26px 0 12px;\\n}\\n.webix_multicombo_delete {\\n color: #94A1B3;\\n margin-top: -10px;\\n font-size: 20px;\\n height: 20px;\\n}\\n.webix_multicombo_delete::after {\\n content: \\\"\\\\F033\\\";\\n}\\n.webix_checksuggest_select_all:hover {\\n background-color: #F4F5F9;\\n border-radius: 2px;\\n}\\n.webix_checksuggest_select_all:hover .webix_label_right {\\n color: #1CA1C1;\\n}\\n.webix_checksuggest_select_all .webix_label_right {\\n text-align: center;\\n font-size: 16px;\\n color: #1CA1C1;\\n}\\n.webix_checksuggest_select_all.webix_el_checkbox .webix_label_right {\\n padding-top: 5px;\\n}\\n.buttonStyle {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n outline: none;\\n}\\n.webix_el_colorpicker div.webix_inp_static div {\\n margin: 2.5px -20px 0px -5px;\\n}\\ndiv.webix_inp_static,\\n.webix_el_textarea textarea {\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n}\\n.webix_el_select select {\\n font-family: Roboto, sans-serif;\\n border-color: #DADEE0;\\n}\\n.webix_el_checkbox input {\\n border-color: #DADEE0;\\n}\\n.webix_el_counter .webix_inp_counter_value {\\n width: 42px;\\n background: #ffffff;\\n font-family: Roboto, sans-serif;\\n border-color: #CCD7E6;\\n}\\n.webix_el_counter .webix_inp_counter_prev,\\n.webix_el_counter .webix_inp_counter_next {\\n background: #F4F5F9;\\n width: 30px;\\n border: 1px solid #CCD7E6;\\n font-weight: bold;\\n font-family: \\\"Courier New\\\", Courier, monospace;\\n}\\n.webix_el_counter .webix_inp_counter_prev {\\n font-size: 20px;\\n border-right: none;\\n}\\n.webix_el_counter .webix_inp_counter_next {\\n font-size: 20px;\\n border-left: none;\\n}\\n.webix_view.webix_control.webix_el_tabbar {\\n background: #FFFFFF;\\n}\\n.webix_all_tabs .webix_item_tab {\\n font-family: Roboto, sans-serif;\\n font-size: 16px;\\n font-weight: 500;\\n color: #1CA1C1;\\n letter-spacing: 0px;\\n border: none;\\n}\\n.webix_all_tabs .webix_item_tab:hover {\\n background-color: #F4F5F9;\\n}\\n.webix_all_tabs .webix_item_tab .webix_icon.webix_tab_close {\\n width: 28px;\\n font-size: 20px;\\n padding: 0;\\n margin-top: 1px;\\n color: #94A1B3;\\n}\\n.webix_all_tabs .webix_item_tab .webix_icon.webix_tab_close:focus {\\n color: #FF5C4C;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected {\\n box-shadow: inset 0 -2px #1CA1C1;\\n padding-bottom: 0;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected:hover {\\n background-color: transparent;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected:focus {\\n color: #17839d;\\n box-shadow: inset 0 -2px #17839d;\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected.webix_disabled {\\n box-shadow: inset 0 -2px #94A1B3;\\n}\\n.webix_all_tabs .webix_tab_filler {\\n border: none;\\n}\\n.webix_all_tabs .webix_tab_more_icon .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_all_tabs .webix_tab_more_icon:hover,\\n.webix_all_tabs .webix_tab_more_icon:focus {\\n background-color: #F4F5F9;\\n}\\n.webixtype_bottom .webix_item_tab,\\n.webixtype_bottom .webix_item_tab.webix_selected {\\n background: #FFFFFF;\\n padding: 0;\\n}\\n.webixtype_bottom .webix_item_tab:last-child,\\n.webixtype_bottom .webix_item_tab.webix_selected:last-child {\\n border-right: none;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected {\\n box-shadow: inset 0 2px #1CA1C1;\\n background: #FFFFFF;\\n color: #1CA1C1;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected:focus {\\n box-shadow: inset 0 2px #17839d;\\n}\\n.webixtype_bottom .webix_item_tab.webix_selected.webix_disabled {\\n box-shadow: inset 0 2px #94A1B3;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n margin: 0 auto;\\n text-align: center;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn .webix_icon_btn {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n font-size: 24px;\\n margin: 0 3px;\\n height: 100%;\\n line-height: inherit;\\n vertical-align: top;\\n width: 100%;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab.webix_selected {\\n background: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn:active,\\n.webix_el_tabbar .webixtype_icon .webix_img_btn_top:active {\\n background-color: #FFFFFF;\\n}\\n.webix_accordionitem_label .webix_icon {\\n margin-right: 8px;\\n}\\n.webix_el_tabbar .webixtype_iconTop,\\n.webix_el_tabbar .webixtype_image {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab,\\n.webix_el_tabbar .webixtype_image .webix_item_tab {\\n font-size: 14px;\\n padding-top: 2px;\\n padding-bottom: 2px;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top .webix_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top .webix_image,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top .webix_image {\\n top: 0;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_text,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_text {\\n bottom: 0px;\\n font-size: 14px;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected {\\n background: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_img_btn_text,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_img_btn_text {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_icon_btn,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_icon_btn {\\n background-color: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab.webix_selected .webix_img_btn,\\n.webix_el_tabbar .webixtype_image .webix_item_tab.webix_selected .webix_img_btn {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab,\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab,\\n.webix_el_tabbar .webixtype_image .webix_item_tab {\\n padding: 0;\\n border-radius: 0;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_item_tab .webix_img_btn,\\n.webix_el_tabbar .webixtype_iconTop .webix_item_tab .webix_img_btn,\\n.webix_el_tabbar .webixtype_image .webix_item_tab .webix_img_btn {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon {\\n background: #FFFFFF;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon .webix_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon .webix_icon,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon .webix_icon,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon .webix_icon {\\n color: #1CA1C1;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon:hover,\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon:focus,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon:focus,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon:focus,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon:focus {\\n background-color: #F4F5F9;\\n}\\n.webix_el_tabbar .webixtype_icon .webix_img_btn:hover,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn:hover,\\n.webix_el_tabbar .webixtype_image .webix_img_btn:hover,\\n.webix_el_tabbar .webixtype_icon .webix_img_btn_top:hover,\\n.webix_el_tabbar .webixtype_iconTop .webix_img_btn_top:hover,\\n.webix_el_tabbar .webixtype_image .webix_img_btn_top:hover {\\n background-color: transparent;\\n}\\n.webix_tab_filler:first-child {\\n border-right: 0;\\n}\\n.passiveBarBG {\\n background: #FFFFFF;\\n color: #1CA1C1;\\n}\\n.webix_cancel_icon {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 17px;\\n margin: 0;\\n height: auto;\\n width: 20px;\\n}\\n.webix_cancel_icon:hover {\\n color: #FF5C4C;\\n}\\n.webix_cancel_icon:before {\\n content: \\\"\\\\F011\\\";\\n}\\n.webix_error_icon {\\n background-image: none;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 20px;\\n height: auto;\\n width: 20px;\\n color: #FF5C4C;\\n}\\n.webix_error_icon:before {\\n content: \\\"\\\\F034\\\";\\n}\\n.webix_inp_counter_next:hover,\\n.webix_inp_counter_prev:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:focus,\\n.webix_inp_counter_prev:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_inp_counter_next:active,\\n.webix_inp_counter_prev:active {\\n background-color: #daddeb;\\n}\\n.webix_el_button button,\\n.webix_el_toggle button,\\n.webixbutton,\\n.webix_view button,\\n.webix_view input[type=button] {\\n border-width: 0px;\\n}\\n.webix_segment_0:hover,\\n.webix_segment_1:hover,\\n.webix_segment_N:hover {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:focus,\\n.webix_segment_1:focus,\\n.webix_segment_N:focus {\\n background-color: #e7e9f2;\\n}\\n.webix_segment_0:active,\\n.webix_segment_1:active,\\n.webix_segment_N:active {\\n background-color: #daddeb;\\n}\\n.webix_selected.webix_segment_0:hover,\\n.webix_selected.webix_segment_1:hover,\\n.webix_selected.webix_segment_N:hover {\\n background-color: #1992af;\\n}\\n.webix_selected.webix_segment_0:focus,\\n.webix_selected.webix_segment_1:focus,\\n.webix_selected.webix_segment_N:focus {\\n background-color: #1992af;\\n}\\n.webix_selected.webix_segment_0:active,\\n.webix_selected.webix_segment_1:active,\\n.webix_selected.webix_segment_N:active {\\n background-color: #17839d;\\n}\\n.webix_all_segments .webix_segment_1,\\n.webix_all_segments .webix_segment_N {\\n margin-left: 1px;\\n border-left: none;\\n}\\n.webix_segment_0,\\n.webix_segment_1,\\n.webix_segment_N {\\n border-color: #F4F5F9;\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_left,\\n.webix_slider_vertical .webix_slider_box .webix_slider_right {\\n width: 6px;\\n}\\n.webix_slider_vertical .webix_slider_box .webix_slider_handle {\\n left: 5px;\\n}\\n.webix_slider_vertical.webix_slider_alt .webix_slider_handle {\\n left: 3px;\\n}\\n.webix_section > .webix_template {\\n font-family: Roboto, sans-serif;\\n font-size: 12px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_view.webix_control .webix_disabled_box .webix_input_icon,\\n.webix_view.webix_control .webix_disabled_box .webix_custom_checkbox,\\n.webix_view.webix_control .webix_disabled_box .webix_custom_radio {\\n color: #DADEE0;\\n}\\n.webix_view > .webix_disabled {\\n background-color: #EBEDF0;\\n opacity: 0.6;\\n}\\n.webix_disabled_view .webix_disabled_top_label {\\n color: #94A1B3;\\n}\\n.webix_custom_checkbox:before {\\n content: \\\"\\\\F013\\\";\\n font-family: \\\"Webix Material Icons\\\";\\n cursor: pointer;\\n}\\n.webix_checkbox_1 .webix_custom_checkbox:before {\\n content: \\\"\\\\F012\\\";\\n}\\n.webix_checkbox_1 .webix_custom_checkbox {\\n color: #1CA1C1;\\n}\\n.webix_custom_checkbox {\\n float: left;\\n position: relative;\\n font-size: 24px;\\n height: 100%;\\n padding: 0;\\n margin-top: 1px;\\n border: none;\\n background-color: transparent;\\n color: #94A1B3;\\n}\\n.webix_custom_checkbox:focus {\\n color: #188ba6;\\n}\\n.webix_el_radio .webix_custom_radio:before {\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n content: \\\"\\\\F035\\\";\\n display: block;\\n}\\n.webix_el_radio .webix_radio_1 .webix_custom_radio {\\n color: #1CA1C1;\\n}\\n.webix_el_radio .webix_radio_1 .webix_custom_radio:before {\\n content: \\\"\\\\F036\\\";\\n}\\n.webix_el_radio .webix_custom_radio {\\n padding: 0;\\n display: block;\\n background-color: transparent;\\n border-color: transparent;\\n color: #94A1B3;\\n cursor: pointer;\\n}\\n.webix_el_radio .webix_custom_radio:focus {\\n color: #188ba6;\\n}\\n.webix_cal_icon,\\n.webix_cal_time,\\n.webix_cal_month_name {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_cal_icon:hover,\\n.webix_cal_time:hover,\\n.webix_cal_month_name:hover,\\n.webix_cal_icon:focus,\\n.webix_cal_time:focus,\\n.webix_cal_month_name:focus {\\n text-decoration: none;\\n color: #1CA1C1;\\n}\\n.webix_cal_month_name,\\n.webix_time_header .webix_cal_hours,\\n.webix_time_header .webix_cal_minutes {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_cal_month_name.webix_readonly:hover,\\n.webix_cal_month_name.webix_readonly:focus {\\n color: #313131;\\n}\\n.webix_cal_prev_button,\\n.webix_cal_next_button {\\n background-image: none;\\n width: 24px;\\n font-size: 24px;\\n font-family: \\\"Webix Material Icons\\\";\\n color: #94A1B3;\\n}\\n.webix_cal_prev_button:hover,\\n.webix_cal_next_button:hover,\\n.webix_cal_prev_button:focus,\\n.webix_cal_next_button:focus {\\n color: #1CA1C1;\\n}\\n.webix_cal_prev_button:before {\\n content: \\\"\\\\F029\\\";\\n}\\n.webix_cal_next_button:before {\\n content: \\\"\\\\F028\\\";\\n}\\n.webix_time_header .webix_cal_hours,\\n.webix_time_header .webix_cal_minutes,\\n.webix_cal_body .webix_cal_block_empty {\\n font-weight: 500;\\n border-bottom: none;\\n}\\n.webix_view > .webix_cal_header {\\n height: 18px;\\n}\\n.webix_view > .webix_cal_header div {\\n height: 17px;\\n line-height: 18px;\\n font-size: 12px;\\n border-bottom-color: transparent;\\n}\\n.webix_cal_body .webix_cal_week_num {\\n color: #475466;\\n}\\n.webix_cal_body .webix_cal_today .webix_cal_day_inner {\\n box-shadow: inset 0 0 0 1px #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_day_inner {\\n display: inline-block;\\n font-size: 12px;\\n border-radius: 50%;\\n}\\n.webix_cal_body .webix_cal_day_inner:hover {\\n background-color: #F4F5F9;\\n}\\n.webix_cal_body .webix_cal_event {\\n font-weight: 500;\\n color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_outside {\\n color: #94A1B3;\\n font-weight: normal;\\n}\\n.webix_cal_body .webix_cal_select,\\n.webix_cal_body .webix_cal_today.webix_cal_select {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_select .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_select .webix_cal_day_inner {\\n color: #FFFFFF;\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_select .webix_cal_day_inner:hover,\\n.webix_cal_body .webix_cal_today.webix_cal_select .webix_cal_day_inner:hover {\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_select:focus .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_select:focus .webix_cal_day_inner {\\n background-color: #1992af;\\n}\\n.webix_cal_body .webix_cal_block {\\n font-family: Roboto, sans-serif;\\n font-size: 12px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected span {\\n background-color: #1CA1C1;\\n color: #FFFFFF;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected span:hover {\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_block.webix_selected:focus span {\\n background-color: #1992af;\\n}\\n.webix_cal_body .webix_cal_block span {\\n border-radius: 50%;\\n}\\n.webix_cal_body .webix_cal_block span:hover {\\n background-color: #F4F5F9;\\n}\\n.webix_cal_body .webix_hours .webix_cal_day_disabled,\\n.webix_cal_body .webix_hours .webix_cal_day_disabled.webix_cal_event,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled.webix_cal_event,\\n.webix_cal_body .webix_cal_day_disabled,\\n.webix_cal_body .webix_cal_day_disabled.webix_cal_event {\\n background-color: #fbfbfd;\\n color: #94A1B3;\\n}\\n.webix_cal_body .webix_hours .webix_cal_day_disabled span:hover,\\n.webix_cal_body .webix_hours .webix_cal_day_disabled.webix_cal_event span:hover,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled span:hover,\\n.webix_cal_body .webix_minutes .webix_cal_day_disabled.webix_cal_event span:hover,\\n.webix_cal_body .webix_cal_day_disabled span:hover,\\n.webix_cal_body .webix_cal_day_disabled.webix_cal_event span:hover {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_range_first,\\n.webix_cal_body .webix_cal_range_last {\\n position: relative;\\n}\\n.webix_cal_body .webix_cal_range_last + .webix_cal_outside {\\n background-color: #FFFFFF;\\n}\\n.webix_cal_body .webix_cal_range_first:before,\\n.webix_cal_body .webix_cal_range_last:after {\\n content: \\\"\\\";\\n display: block;\\n width: 50%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n background: #e1f6fb;\\n}\\n.webix_cal_body .webix_cal_range_first:before {\\n right: 100%;\\n}\\n.webix_cal_body .webix_cal_range_last:after {\\n left: 100%;\\n}\\n.webix_cal_body .webix_cal_range_start,\\n.webix_cal_body .webix_cal_range_end {\\n position: relative;\\n z-index: 1;\\n}\\n.webix_cal_body .webix_cal_range_last + .webix_cal_outside {\\n position: relative;\\n z-index: 1;\\n background-color: #FFFFFF;\\n}\\n.webix_cal_body .webix_cal_range:first-child:before,\\n.webix_cal_body .webix_cal_range:last-child:after,\\n.webix_cal_body .webix_cal_outside + .webix_cal_range_first:before {\\n width: 0;\\n}\\n.webix_cal_body .webix_cal_range_start,\\n.webix_cal_body .webix_cal_range_end,\\n.webix_cal_body .webix_cal_today.webix_cal_range_start,\\n.webix_cal_body .webix_cal_today.webix_cal_range_end {\\n background-color: transparent;\\n}\\n.webix_cal_body .webix_cal_range_start .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_range_end .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_range_start .webix_cal_day_inner,\\n.webix_cal_body .webix_cal_today.webix_cal_range_end .webix_cal_day_inner {\\n color: #FFFFFF;\\n background-color: #1CA1C1;\\n}\\n.webix_cal_body .webix_cal_range {\\n background-color: #e1f6fb;\\n}\\n.webix_daterange .webix_range_timepicker .webix_cal_time {\\n padding: 4px;\\n}\\n.webix_daterange .webix_cal_icons .webix_cal_icon {\\n border-top: none;\\n}\\n.webix_progress_top .webix_progress_state,\\n.webix_progress_bottom .webix_progress_state {\\n background: #1CA1C1;\\n background-image: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0.1) 75%, transparent 75%, transparent);\\n}\\n.webix_progress_top .webix_progress_state {\\n background-size: 10px 10px;\\n}\\n.webix_progress_bottom .webix_progress_state {\\n background-size: 14px 14px;\\n}\\n.webix_switch_box {\\n color: #475466;\\n background-color: #F4F5F9;\\n}\\n.webix_switch_box.webix_switch_on {\\n background-color: #1CA1C1;\\n}\\n.webix_switch_box .webix_switch_text {\\n padding-top: 2px;\\n}\\n.webix_sidebar {\\n background-color: #FFFFFF;\\n}\\n.webix_sidebar .webix_tree_item:hover {\\n background-color: #edeff5;\\n}\\n.webix_sidebar.webix_sidebar_left .webix_tree_item.webix_sidebar_selected + .webix_tree_leaves .webix_tree_item,\\n.webix_sidebar.webix_sidebar_left .webix_tree_item.webix_selected,\\n.webix_sidebar.webix_sidebar_left .webix_tree_item.webix_sidebar_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_sidebar.webix_sidebar_right .webix_tree_item.webix_sidebar_selected + .webix_tree_leaves .webix_tree_item,\\n.webix_sidebar.webix_sidebar_right .webix_tree_item.webix_selected,\\n.webix_sidebar.webix_sidebar_right .webix_tree_item.webix_sidebar_selected {\\n box-shadow: inset -2px 0 #1CA1C1;\\n}\\n.webix_sidebar .webix_tree_branch_1 {\\n border: none;\\n}\\n.webix_sidebar .webix_tree_branch_1 .webix_tree_item {\\n padding-right: 12px;\\n}\\n.webix_sidebar .webix_tree_branch_1 > .webix_tree_item {\\n padding-left: 12px;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected .webix_sidebar_icon,\\n.webix_sidebar .webix_tree_item .webix_sidebar_icon {\\n margin-right: 8px;\\n}\\n.webix_sidebar .webix_sidebar_icon {\\n width: 20px;\\n vertical-align: middle;\\n}\\n.webix_sidebar .webix_sidebar_icon,\\n.webix_sidebar .webix_sidebar_dir_icon {\\n color: #94A1B3;\\n font-size: 20px;\\n}\\n.webix_sidebar .webix_tree_item,\\n.webix_sidebar .webix_tree_branch_1 > .webix_tree_item {\\n color: #475466;\\n cursor: pointer;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected,\\n.webix_sidebar .webix_tree_item.webix_sidebar_selected {\\n color: #1CA1C1;\\n background-color: #F4F5F9;\\n font-weight: 500;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected .webix_sidebar_icon,\\n.webix_sidebar .webix_tree_item.webix_sidebar_selected .webix_sidebar_icon,\\n.webix_sidebar .webix_tree_item.webix_selected .webix_sidebar_dir_icon,\\n.webix_sidebar .webix_tree_item.webix_sidebar_selected .webix_sidebar_dir_icon {\\n color: #1CA1C1;\\n}\\n.webix_sidebar .webix_tree_item.webix_selected span {\\n background-color: transparent;\\n color: #1CA1C1;\\n}\\n.webix_sidebar.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected {\\n background-color: transparent;\\n}\\n.webix_sidebar.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected:hover {\\n background-color: #edeff5;\\n}\\n.webix_sidebar_popup_list .webix_list_item,\\n.webix_sidebar_popup_list .webix_list_item:first-child {\\n border-width: 0px;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_sidebar_selected {\\n background-color: #F4F5F9;\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_sidebar_selected:hover {\\n background-color: #F4F5F9 !important;\\n}\\n.webix_sidebar_popup_list .webix_list_item.webix_selected {\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_sidebar_popup_list .webix_tree_branch_1 > .webix_tree_item {\\n height: 44px;\\n line-height: 44px;\\n}\\n.webix_sidebar_popup_left .webix_list_item.webix_selected,\\n.webix_sidebar_popup_left .webix_list_item.webix_sidebar_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_sidebar_popup_right .webix_list_item.webix_selected,\\n.webix_sidebar_popup_right .webix_list_item.webix_sidebar_selected {\\n box-shadow: inset -2px 0 #1CA1C1;\\n}\\n.webix_sidebar_popup_list.webix_sidebar_popup_right .webix_icon {\\n margin-left: -8px;\\n}\\n.webix_sidebar_popup.webix_sidebar_popup_left,\\n.webix_sidebar_popup.webix_sidebar_popup_right {\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_sidebar_popup.webix_sidebar_popup_right .webix_sidebar_popup_right {\\n box-shadow: none;\\n}\\n.webix_sidebar_popup .webix_sidebar_popup_title {\\n background-color: #F4F5F9;\\n}\\n.webix_sidebar_popup .webix_sidebar_popup_title .webix_template {\\n border: none;\\n line-height: 44px;\\n}\\n.webix_sidebar_popup .webix_sidebar_popup_title.webix_selected {\\n color: #1CA1C1;\\n font-weight: 500;\\n}\\n.webix_sidebar_popup_right {\\n box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.1), 0 1px 7px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_sidebar.webix_dark {\\n border-color: #4A4E58;\\n background-color: #4A4E58;\\n}\\n.webix_sidebar.webix_dark .webix_tree_item {\\n color: #FFFFFF;\\n}\\n.webix_sidebar.webix_dark .webix_tree_item:hover {\\n background-color: #33353c;\\n}\\n.webix_sidebar.webix_dark .webix_tree_item.webix_selected,\\n.webix_sidebar.webix_dark .webix_tree_item.webix_sidebar_selected {\\n color: #1CA1C1;\\n background-color: #373a42;\\n}\\n.webix_sidebar.webix_dark.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected {\\n background-color: transparent;\\n}\\n.webix_sidebar.webix_dark.webix_sidebar_expanded .webix_tree_item.webix_sidebar_selected:hover {\\n background-color: #33353c;\\n}\\n.webix_sidebar_popup.webix_dark .webix_sidebar_popup_title {\\n background-color: #373a42;\\n}\\n.webix_sidebar_popup.webix_dark .webix_sidebar_popup_title .webix_template {\\n border-color: #373a42;\\n color: #FFFFFF;\\n}\\n.webix_sidebar_popup.webix_dark .webix_sidebar_popup_title.webix_selected .webix_template {\\n color: #1CA1C1;\\n}\\n.webix_sidebar_popup_list.webix_dark {\\n background-color: #4A4E58;\\n border-color: #373a42;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item {\\n background: #4A4E58;\\n color: #FFFFFF;\\n border-color: #373a42;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_selected,\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_sidebar_selected {\\n background-color: #373a42;\\n color: #1CA1C1;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item:hover {\\n background-color: #33353c;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_selected {\\n background-color: #373a42;\\n}\\n.webix_sidebar_popup_list.webix_dark .webix_list_item.webix_sidebar_selected:hover {\\n background-color: #373a42 !important;\\n}\\n.webix_sidebar_popup.webix_dark {\\n border-color: #373a42;\\n}\\n.webix_list_item.webix_selected {\\n box-shadow: inset 2px 0 #1CA1C1;\\n}\\n.webix_list_item.webix_disabled {\\n color: #94A1B3;\\n}\\n.webix_list_item.webix_selected.webix_disabled {\\n box-shadow: inset 2px 0 #94A1B3;\\n}\\n.webix_list_item .webix_icon {\\n font-size: 20px;\\n}\\n.webix_list-x .webix_list_item.webix_selected {\\n box-shadow: none;\\n border-left: none;\\n padding-left: 12px;\\n}\\n.webix_header > div {\\n padding-left: 12px;\\n}\\n.webix_icon,\\n.webix_icon_btn,\\n.webix_input_icon {\\n font-family: \\\"Webix Material Icons\\\";\\n}\\n.webix_icon_button {\\n position: relative;\\n z-index: 0;\\n}\\n.webix_icon_button:before {\\n content: '';\\n opacity: 0;\\n position: absolute;\\n transition-duration: 0.15s;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n z-index: -1;\\n bottom: 0px;\\n left: 0px;\\n right: 0px;\\n top: 0px;\\n border-radius: 50%;\\n transform: scale(0);\\n transition-property: transform, opacity;\\n}\\n.webix_icon_button:hover .webix_icon,\\n.webix_icon_button:focus .webix_icon {\\n color: #475466;\\n}\\n.webix_icon_button:hover:before {\\n background-color: #F4F5F9;\\n opacity: 1;\\n transform: scale(1);\\n}\\n.webix_icon_btn,\\n.webix_input_icon {\\n width: 20px;\\n}\\n.webix_img_btn_top .webix_icon {\\n color: #94A1B3;\\n}\\n.webix_icon_btn {\\n vertical-align: text-bottom;\\n}\\n.webix_resize_frame {\\n box-shadow: 0 2px 6px 0 #000, 0 1px 4px 0 #000;\\n}\\n.webix_tooltip {\\n padding: 4px 8px;\\n background-color: #475466;\\n color: #FFFFFF;\\n font-weight: 500;\\n line-height: 20px;\\n border-radius: 2px;\\n border: none;\\n}\\n.portlet_marker,\\n.portlet_markertop,\\n.portlet_markerbottom,\\n.portlet_markerleft,\\n.portlet_markerright {\\n background: #1CA1C1;\\n}\\n.webix_treemap_item:hover {\\n box-shadow: inset 0 0 0 1px #5ccce7;\\n}\\n.webix_treemap_item.webix_selected {\\n border-color: inherit;\\n box-shadow: inset 0 0 0 2px #1CA1C1;\\n}\\n.webixlabel {\\n font-weight: 500;\\n}\\n.webixtoolbarlabel {\\n letter-spacing: 0;\\n}\\n.webix_inp_label,\\n.webix_inp_top_label,\\nlegend.webix_forminput_label,\\n.webix_el_label .webix_el_box {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 500;\\n color: #313131;\\n letter-spacing: 0.2px;\\n}\\n.webix_inp_label,\\n.webix_forminput_label {\\n padding-right: 8px;\\n}\\n.webix_label_right {\\n padding-left: 4px;\\n}\\n.webix_el_checkbox .webix_label_right {\\n display: block;\\n}\\n.webix_richtext .webix_richtext_container {\\n box-shadow: inset 0 1px #DADEE0;\\n}\\n.webix_dbllist .bottom_label {\\n font-family: Roboto, sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n color: #94A1B3;\\n letter-spacing: 0.2px;\\n}\\n.webix_popup.webix_sidemenu.webix_sidemenu_left,\\n.webix_popup.webix_sidemenu.webix_sidemenu_right,\\n.webix_popup.webix_sidemenu.webix_sidemenu_top,\\n.webix_popup.webix_sidemenu.webix_sidemenu_bottom {\\n border: none;\\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.1);\\n}\\n.webix_chart .webix_chart_legend_item,\\n.webix_chart .webix_canvas_text,\\n.webix_chart .webix_axis_title_x,\\n.webix_chart .webix_axis_title_y {\\n font-family: Roboto, sans-serif;\\n font-size: 12px;\\n font-weight: 400;\\n color: #475466;\\n letter-spacing: 0.2px;\\n}\\n.webix_chart .webix_canvas_text.webix_axis_item_x,\\n.webix_chart .webix_canvas_text.webix_axis_item_y,\\n.webix_chart .webix_axis_title_x,\\n.webix_chart .webix_axis_title_y,\\n.webix_chart .webix_canvas_text.webix_axis_radar_title {\\n color: #94A1B3;\\n}\\n.webix_bullet_scale {\\n fill: #94A1B3;\\n font-size: 12px;\\n}\\n.webix_bullet_scale_lines {\\n stroke: #94A1B3;\\n}\\n.webix_toolbar.pdf_bar {\\n background-color: #474747;\\n}\\n.webix_toolbar.pdf_bar .webix_icon_btn {\\n font-size: 20px;\\n vertical-align: middle;\\n}\\n.webix_toolbar.pdf_bar .webix_img_btn:focus,\\n.webix_toolbar.pdf_bar .webix_img_btn:hover {\\n background-color: #333333;\\n}\\n.invalidStyle {\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n}\\n.webix_list_item.webix_invalid,\\n.webix_tree_item.webix_invalid,\\n.webix_dataview_item.webix_invalid,\\n.webix_cell.webix_invalid {\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n}\\n.webix_invalid .webix_el_box input,\\n.webix_invalid .webix_el_box .webix_inp_static,\\n.webix_invalid .webix_el_box select,\\n.webix_invalid .webix_el_box textarea,\\ninput.webix_invalid,\\nselect.webix_invalid,\\ntextarea.webix_invalid {\\n color: #FF5C4C;\\n background-color: #ffdedb;\\n border-color: #ff8d82;\\n}\\n.webix_invalid .webix_inp_bottom_label {\\n color: #FF5C4C;\\n}\\n.webix_nav_panel .webix_nav_item {\\n background-color: transparent;\\n border-color: rgba(255, 255, 255, 0.4);\\n opacity: 1;\\n}\\n.webix_nav_panel .webix_nav_item:hover {\\n border-color: rgba(255, 255, 255, 0.6);\\n}\\n.webix_nav_panel .webix_nav_active {\\n background-color: #FFFFFF;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 1;\\n background-image: none;\\n text-align: center;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 24px;\\n color: #FFFFFF;\\n border-radius: 50%;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_nav_button_next .webix_nav_button_inner:focus {\\n background-color: rgba(0, 0, 0, 0.2);\\n transition: 0.15s;\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n opacity: 1;\\n text-align: center;\\n font-family: \\\"Webix Material Icons\\\";\\n font-size: 48px;\\n color: #FFFFFF;\\n background: rgba(0, 0, 0, 0.2);\\n border-radius: 2px;\\n}\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n background: rgba(0, 0, 0, 0.4);\\n}\\n.webix_nav_button_side.webix_nav_button_next {\\n right: 0;\\n}\\n.webix_nav_button_side.webix_nav_button_prev {\\n left: 0;\\n}\\n.webix_nav_button_prev .webix_nav_button_inner:before {\\n content: \\\"\\\\F002\\\";\\n}\\n.webix_nav_button_next .webix_nav_button_inner:before {\\n content: \\\"\\\\F003\\\";\\n}\\n.webix_dark .webix_nav_item {\\n border-color: rgba(0, 0, 0, 0.4);\\n}\\n.webix_dark .webix_nav_item:hover {\\n border-color: rgba(0, 0, 0, 0.6);\\n}\\n.webix_dark .webix_nav_inactive {\\n background-color: transparent;\\n}\\n.webix_dark .webix_nav_active {\\n background-color: #000000;\\n}\\n.webix_dark .webix_nav_active:hover,\\n.webix_dark .webix_nav_active:focus {\\n box-shadow: 0 0 2px #000;\\n}\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner,\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner {\\n background-image: none;\\n color: #313131;\\n}\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_dark .webix_nav_button_next .webix_nav_button_inner:focus {\\n background-color: rgba(255, 255, 255, 0.2);\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner {\\n background: rgba(255, 255, 255, 0.2);\\n}\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:hover,\\n.webix_dark .webix_nav_button_side.webix_nav_button_prev .webix_nav_button_inner:focus,\\n.webix_dark .webix_nav_button_side.webix_nav_button_next .webix_nav_button_inner:focus {\\n background: rgba(255, 255, 255, 0.4);\\n}\\n.webix_skin_mark {\\n height: 230px;\\n}\\n/* based on MaterialDesignIcons.com */\\n@font-face {\\n font-family: \\\"Webix Material Icons\\\";\\n src: url('fonts/webixmdi-webfont.woff2') format('woff2'), url('fonts/webixmdi-webfont.woff') format('woff');\\n font-weight: normal;\\n font-style: normal;\\n}\\n/* icons collection common for above fonts*/\\n.wxi-angle-down:before {\\n content: \\\"\\\\F001\\\";\\n}\\n.wxi-angle-left:before {\\n content: \\\"\\\\F002\\\";\\n}\\n.wxi-angle-right:before {\\n content: \\\"\\\\F003\\\";\\n}\\n.wxi-angle-up:before {\\n content: \\\"\\\\F004\\\";\\n}\\n.wxi-angle-double-right:before {\\n content: \\\"\\\\F005\\\";\\n}\\n.wxi-angle-double-left:before {\\n content: \\\"\\\\F006\\\";\\n}\\n.wxi-clock:before {\\n content: \\\"\\\\F007\\\";\\n}\\n.wxi-calendar:before {\\n content: \\\"\\\\F008\\\";\\n}\\n.wxi-search:before {\\n content: \\\"\\\\F009\\\";\\n}\\n.wxi-dots:before {\\n content: \\\"\\\\F010\\\";\\n}\\n.wxi-close:before {\\n content: \\\"\\\\F011\\\";\\n}\\n.wxi-checkbox-marked:before {\\n content: \\\"\\\\F012\\\";\\n}\\n.wxi-checkbox-blank:before {\\n content: \\\"\\\\F013\\\";\\n}\\n.wxi-trash:before {\\n content: \\\"\\\\F014\\\";\\n}\\n.wxi-pencil:before {\\n content: \\\"\\\\F015\\\";\\n}\\n.wxi-eye:before {\\n content: \\\"\\\\F016\\\";\\n}\\n.wxi-eye-slash:before {\\n content: \\\"\\\\F017\\\";\\n}\\n.wxi-columns:before {\\n content: \\\"\\\\F018\\\";\\n}\\n.wxi-drag:before {\\n content: \\\"\\\\F019\\\";\\n}\\n.wxi-check:before {\\n content: \\\"\\\\F020\\\";\\n}\\n.wxi-underline:before {\\n content: \\\"\\\\F021\\\";\\n}\\n.wxi-bold:before {\\n content: \\\"\\\\F022\\\";\\n}\\n.wxi-italic:before {\\n content: \\\"\\\\F023\\\";\\n}\\n.wxi-sync:before {\\n content: \\\"\\\\F024\\\";\\n}\\n.wxi-plus-square:before {\\n content: \\\"\\\\F025\\\";\\n}\\n.wxi-minus-square:before {\\n content: \\\"\\\\F026\\\";\\n}\\n.wxi-menu-down:before {\\n content: \\\"\\\\F027\\\";\\n}\\n.wxi-menu-right:before {\\n content: \\\"\\\\F028\\\";\\n}\\n.wxi-menu-left:before {\\n content: \\\"\\\\F029\\\";\\n}\\n.wxi-folder:before {\\n content: \\\"\\\\F030\\\";\\n}\\n.wxi-folder-open:before {\\n content: \\\"\\\\F031\\\";\\n}\\n.wxi-file:before {\\n content: \\\"\\\\F032\\\";\\n}\\n.wxi-close-circle:before {\\n content: \\\"\\\\F033\\\";\\n}\\n.wxi-alert:before {\\n content: \\\"\\\\F034\\\";\\n}\\n.wxi-radiobox-blank:before {\\n content: \\\"\\\\F035\\\";\\n}\\n.wxi-radiobox-marked:before {\\n content: \\\"\\\\F036\\\";\\n}\\n.wxi-angle-double-down:before {\\n content: \\\"\\\\F037\\\";\\n}\\n.wxi-angle-double-up:before {\\n content: \\\"\\\\F038\\\";\\n}\\n.wxi-plus-circle:before {\\n content: \\\"\\\\F039\\\";\\n}\\n.wxi-minus-circle:before {\\n content: \\\"\\\\F040\\\";\\n}\\n.wxi-plus:before {\\n content: \\\"\\\\F041\\\";\\n}\\n.wxi-minus:before {\\n content: \\\"\\\\F042\\\";\\n}\\n.wxi-download:before {\\n content: \\\"\\\\F043\\\";\\n}\\n.wxi-user:before {\\n content: \\\"\\\\F044\\\";\\n}\\n.wxi-filter:before {\\n content: \\\"\\\\F045\\\";\\n}\\n.wxi-menu-up:before {\\n content: \\\"\\\\F046\\\";\\n}\\n/*predefined styles for text lables inside a item*/\\n.webix_strong {\\n font-weight: 500;\\n white-space: nowrap;\\n}\\n.webix_light {\\n color: #b3b3b3;\\n}\\n/*contr-styles for bootstrap*/\\n.webix_view,\\n.webix_input_icon {\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n}\\n.webix_view.webix_el_label {\\n -moz-box-sizing: border-box;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n}\\n.webix_inp_label,\\n.webix_inp_top_label,\\n.webix_label_right {\\n margin-bottom: 0px;\\n}\\n.webix_view table {\\n border-collapse: initial;\\n}\\n/* Spin*/\\n.webix_spin {\\n animation: webix_spin 2s infinite linear;\\n}\\n@-webkit-keyframes webix_spin {\\n 0% {\\n transform: rotate(0deg);\\n }\\n 100% {\\n transform: rotate(359deg);\\n }\\n}\\n@keyframes webix_spin {\\n 0% {\\n transform: rotate(0deg);\\n }\\n 100% {\\n transform: rotate(359deg);\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/*!\\n * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\\n * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\\n */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\\\";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\\\";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\\\";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\\\";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\\\"\\\\f000\\\"}.fa-music:before{content:\\\"\\\\f001\\\"}.fa-search:before{content:\\\"\\\\f002\\\"}.fa-envelope-o:before{content:\\\"\\\\f003\\\"}.fa-heart:before{content:\\\"\\\\f004\\\"}.fa-star:before{content:\\\"\\\\f005\\\"}.fa-star-o:before{content:\\\"\\\\f006\\\"}.fa-user:before{content:\\\"\\\\f007\\\"}.fa-film:before{content:\\\"\\\\f008\\\"}.fa-th-large:before{content:\\\"\\\\f009\\\"}.fa-th:before{content:\\\"\\\\f00a\\\"}.fa-th-list:before{content:\\\"\\\\f00b\\\"}.fa-check:before{content:\\\"\\\\f00c\\\"}.fa-remove:before,.fa-close:before,.fa-times:before{content:\\\"\\\\f00d\\\"}.fa-search-plus:before{content:\\\"\\\\f00e\\\"}.fa-search-minus:before{content:\\\"\\\\f010\\\"}.fa-power-off:before{content:\\\"\\\\f011\\\"}.fa-signal:before{content:\\\"\\\\f012\\\"}.fa-gear:before,.fa-cog:before{content:\\\"\\\\f013\\\"}.fa-trash-o:before{content:\\\"\\\\f014\\\"}.fa-home:before{content:\\\"\\\\f015\\\"}.fa-file-o:before{content:\\\"\\\\f016\\\"}.fa-clock-o:before{content:\\\"\\\\f017\\\"}.fa-road:before{content:\\\"\\\\f018\\\"}.fa-download:before{content:\\\"\\\\f019\\\"}.fa-arrow-circle-o-down:before{content:\\\"\\\\f01a\\\"}.fa-arrow-circle-o-up:before{content:\\\"\\\\f01b\\\"}.fa-inbox:before{content:\\\"\\\\f01c\\\"}.fa-play-circle-o:before{content:\\\"\\\\f01d\\\"}.fa-rotate-right:before,.fa-repeat:before{content:\\\"\\\\f01e\\\"}.fa-refresh:before{content:\\\"\\\\f021\\\"}.fa-list-alt:before{content:\\\"\\\\f022\\\"}.fa-lock:before{content:\\\"\\\\f023\\\"}.fa-flag:before{content:\\\"\\\\f024\\\"}.fa-headphones:before{content:\\\"\\\\f025\\\"}.fa-volume-off:before{content:\\\"\\\\f026\\\"}.fa-volume-down:before{content:\\\"\\\\f027\\\"}.fa-volume-up:before{content:\\\"\\\\f028\\\"}.fa-qrcode:before{content:\\\"\\\\f029\\\"}.fa-barcode:before{content:\\\"\\\\f02a\\\"}.fa-tag:before{content:\\\"\\\\f02b\\\"}.fa-tags:before{content:\\\"\\\\f02c\\\"}.fa-book:before{content:\\\"\\\\f02d\\\"}.fa-bookmark:before{content:\\\"\\\\f02e\\\"}.fa-print:before{content:\\\"\\\\f02f\\\"}.fa-camera:before{content:\\\"\\\\f030\\\"}.fa-font:before{content:\\\"\\\\f031\\\"}.fa-bold:before{content:\\\"\\\\f032\\\"}.fa-italic:before{content:\\\"\\\\f033\\\"}.fa-text-height:before{content:\\\"\\\\f034\\\"}.fa-text-width:before{content:\\\"\\\\f035\\\"}.fa-align-left:before{content:\\\"\\\\f036\\\"}.fa-align-center:before{content:\\\"\\\\f037\\\"}.fa-align-right:before{content:\\\"\\\\f038\\\"}.fa-align-justify:before{content:\\\"\\\\f039\\\"}.fa-list:before{content:\\\"\\\\f03a\\\"}.fa-dedent:before,.fa-outdent:before{content:\\\"\\\\f03b\\\"}.fa-indent:before{content:\\\"\\\\f03c\\\"}.fa-video-camera:before{content:\\\"\\\\f03d\\\"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:\\\"\\\\f03e\\\"}.fa-pencil:before{content:\\\"\\\\f040\\\"}.fa-map-marker:before{content:\\\"\\\\f041\\\"}.fa-adjust:before{content:\\\"\\\\f042\\\"}.fa-tint:before{content:\\\"\\\\f043\\\"}.fa-edit:before,.fa-pencil-square-o:before{content:\\\"\\\\f044\\\"}.fa-share-square-o:before{content:\\\"\\\\f045\\\"}.fa-check-square-o:before{content:\\\"\\\\f046\\\"}.fa-arrows:before{content:\\\"\\\\f047\\\"}.fa-step-backward:before{content:\\\"\\\\f048\\\"}.fa-fast-backward:before{content:\\\"\\\\f049\\\"}.fa-backward:before{content:\\\"\\\\f04a\\\"}.fa-play:before{content:\\\"\\\\f04b\\\"}.fa-pause:before{content:\\\"\\\\f04c\\\"}.fa-stop:before{content:\\\"\\\\f04d\\\"}.fa-forward:before{content:\\\"\\\\f04e\\\"}.fa-fast-forward:before{content:\\\"\\\\f050\\\"}.fa-step-forward:before{content:\\\"\\\\f051\\\"}.fa-eject:before{content:\\\"\\\\f052\\\"}.fa-chevron-left:before{content:\\\"\\\\f053\\\"}.fa-chevron-right:before{content:\\\"\\\\f054\\\"}.fa-plus-circle:before{content:\\\"\\\\f055\\\"}.fa-minus-circle:before{content:\\\"\\\\f056\\\"}.fa-times-circle:before{content:\\\"\\\\f057\\\"}.fa-check-circle:before{content:\\\"\\\\f058\\\"}.fa-question-circle:before{content:\\\"\\\\f059\\\"}.fa-info-circle:before{content:\\\"\\\\f05a\\\"}.fa-crosshairs:before{content:\\\"\\\\f05b\\\"}.fa-times-circle-o:before{content:\\\"\\\\f05c\\\"}.fa-check-circle-o:before{content:\\\"\\\\f05d\\\"}.fa-ban:before{content:\\\"\\\\f05e\\\"}.fa-arrow-left:before{content:\\\"\\\\f060\\\"}.fa-arrow-right:before{content:\\\"\\\\f061\\\"}.fa-arrow-up:before{content:\\\"\\\\f062\\\"}.fa-arrow-down:before{content:\\\"\\\\f063\\\"}.fa-mail-forward:before,.fa-share:before{content:\\\"\\\\f064\\\"}.fa-expand:before{content:\\\"\\\\f065\\\"}.fa-compress:before{content:\\\"\\\\f066\\\"}.fa-plus:before{content:\\\"\\\\f067\\\"}.fa-minus:before{content:\\\"\\\\f068\\\"}.fa-asterisk:before{content:\\\"\\\\f069\\\"}.fa-exclamation-circle:before{content:\\\"\\\\f06a\\\"}.fa-gift:before{content:\\\"\\\\f06b\\\"}.fa-leaf:before{content:\\\"\\\\f06c\\\"}.fa-fire:before{content:\\\"\\\\f06d\\\"}.fa-eye:before{content:\\\"\\\\f06e\\\"}.fa-eye-slash:before{content:\\\"\\\\f070\\\"}.fa-warning:before,.fa-exclamation-triangle:before{content:\\\"\\\\f071\\\"}.fa-plane:before{content:\\\"\\\\f072\\\"}.fa-calendar:before{content:\\\"\\\\f073\\\"}.fa-random:before{content:\\\"\\\\f074\\\"}.fa-comment:before{content:\\\"\\\\f075\\\"}.fa-magnet:before{content:\\\"\\\\f076\\\"}.fa-chevron-up:before{content:\\\"\\\\f077\\\"}.fa-chevron-down:before{content:\\\"\\\\f078\\\"}.fa-retweet:before{content:\\\"\\\\f079\\\"}.fa-shopping-cart:before{content:\\\"\\\\f07a\\\"}.fa-folder:before{content:\\\"\\\\f07b\\\"}.fa-folder-open:before{content:\\\"\\\\f07c\\\"}.fa-arrows-v:before{content:\\\"\\\\f07d\\\"}.fa-arrows-h:before{content:\\\"\\\\f07e\\\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\\\"\\\\f080\\\"}.fa-twitter-square:before{content:\\\"\\\\f081\\\"}.fa-facebook-square:before{content:\\\"\\\\f082\\\"}.fa-camera-retro:before{content:\\\"\\\\f083\\\"}.fa-key:before{content:\\\"\\\\f084\\\"}.fa-gears:before,.fa-cogs:before{content:\\\"\\\\f085\\\"}.fa-comments:before{content:\\\"\\\\f086\\\"}.fa-thumbs-o-up:before{content:\\\"\\\\f087\\\"}.fa-thumbs-o-down:before{content:\\\"\\\\f088\\\"}.fa-star-half:before{content:\\\"\\\\f089\\\"}.fa-heart-o:before{content:\\\"\\\\f08a\\\"}.fa-sign-out:before{content:\\\"\\\\f08b\\\"}.fa-linkedin-square:before{content:\\\"\\\\f08c\\\"}.fa-thumb-tack:before{content:\\\"\\\\f08d\\\"}.fa-external-link:before{content:\\\"\\\\f08e\\\"}.fa-sign-in:before{content:\\\"\\\\f090\\\"}.fa-trophy:before{content:\\\"\\\\f091\\\"}.fa-github-square:before{content:\\\"\\\\f092\\\"}.fa-upload:before{content:\\\"\\\\f093\\\"}.fa-lemon-o:before{content:\\\"\\\\f094\\\"}.fa-phone:before{content:\\\"\\\\f095\\\"}.fa-square-o:before{content:\\\"\\\\f096\\\"}.fa-bookmark-o:before{content:\\\"\\\\f097\\\"}.fa-phone-square:before{content:\\\"\\\\f098\\\"}.fa-twitter:before{content:\\\"\\\\f099\\\"}.fa-facebook-f:before,.fa-facebook:before{content:\\\"\\\\f09a\\\"}.fa-github:before{content:\\\"\\\\f09b\\\"}.fa-unlock:before{content:\\\"\\\\f09c\\\"}.fa-credit-card:before{content:\\\"\\\\f09d\\\"}.fa-feed:before,.fa-rss:before{content:\\\"\\\\f09e\\\"}.fa-hdd-o:before{content:\\\"\\\\f0a0\\\"}.fa-bullhorn:before{content:\\\"\\\\f0a1\\\"}.fa-bell:before{content:\\\"\\\\f0f3\\\"}.fa-certificate:before{content:\\\"\\\\f0a3\\\"}.fa-hand-o-right:before{content:\\\"\\\\f0a4\\\"}.fa-hand-o-left:before{content:\\\"\\\\f0a5\\\"}.fa-hand-o-up:before{content:\\\"\\\\f0a6\\\"}.fa-hand-o-down:before{content:\\\"\\\\f0a7\\\"}.fa-arrow-circle-left:before{content:\\\"\\\\f0a8\\\"}.fa-arrow-circle-right:before{content:\\\"\\\\f0a9\\\"}.fa-arrow-circle-up:before{content:\\\"\\\\f0aa\\\"}.fa-arrow-circle-down:before{content:\\\"\\\\f0ab\\\"}.fa-globe:before{content:\\\"\\\\f0ac\\\"}.fa-wrench:before{content:\\\"\\\\f0ad\\\"}.fa-tasks:before{content:\\\"\\\\f0ae\\\"}.fa-filter:before{content:\\\"\\\\f0b0\\\"}.fa-briefcase:before{content:\\\"\\\\f0b1\\\"}.fa-arrows-alt:before{content:\\\"\\\\f0b2\\\"}.fa-group:before,.fa-users:before{content:\\\"\\\\f0c0\\\"}.fa-chain:before,.fa-link:before{content:\\\"\\\\f0c1\\\"}.fa-cloud:before{content:\\\"\\\\f0c2\\\"}.fa-flask:before{content:\\\"\\\\f0c3\\\"}.fa-cut:before,.fa-scissors:before{content:\\\"\\\\f0c4\\\"}.fa-copy:before,.fa-files-o:before{content:\\\"\\\\f0c5\\\"}.fa-paperclip:before{content:\\\"\\\\f0c6\\\"}.fa-save:before,.fa-floppy-o:before{content:\\\"\\\\f0c7\\\"}.fa-square:before{content:\\\"\\\\f0c8\\\"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:\\\"\\\\f0c9\\\"}.fa-list-ul:before{content:\\\"\\\\f0ca\\\"}.fa-list-ol:before{content:\\\"\\\\f0cb\\\"}.fa-strikethrough:before{content:\\\"\\\\f0cc\\\"}.fa-underline:before{content:\\\"\\\\f0cd\\\"}.fa-table:before{content:\\\"\\\\f0ce\\\"}.fa-magic:before{content:\\\"\\\\f0d0\\\"}.fa-truck:before{content:\\\"\\\\f0d1\\\"}.fa-pinterest:before{content:\\\"\\\\f0d2\\\"}.fa-pinterest-square:before{content:\\\"\\\\f0d3\\\"}.fa-google-plus-square:before{content:\\\"\\\\f0d4\\\"}.fa-google-plus:before{content:\\\"\\\\f0d5\\\"}.fa-money:before{content:\\\"\\\\f0d6\\\"}.fa-caret-down:before{content:\\\"\\\\f0d7\\\"}.fa-caret-up:before{content:\\\"\\\\f0d8\\\"}.fa-caret-left:before{content:\\\"\\\\f0d9\\\"}.fa-caret-right:before{content:\\\"\\\\f0da\\\"}.fa-columns:before{content:\\\"\\\\f0db\\\"}.fa-unsorted:before,.fa-sort:before{content:\\\"\\\\f0dc\\\"}.fa-sort-down:before,.fa-sort-desc:before{content:\\\"\\\\f0dd\\\"}.fa-sort-up:before,.fa-sort-asc:before{content:\\\"\\\\f0de\\\"}.fa-envelope:before{content:\\\"\\\\f0e0\\\"}.fa-linkedin:before{content:\\\"\\\\f0e1\\\"}.fa-rotate-left:before,.fa-undo:before{content:\\\"\\\\f0e2\\\"}.fa-legal:before,.fa-gavel:before{content:\\\"\\\\f0e3\\\"}.fa-dashboard:before,.fa-tachometer:before{content:\\\"\\\\f0e4\\\"}.fa-comment-o:before{content:\\\"\\\\f0e5\\\"}.fa-comments-o:before{content:\\\"\\\\f0e6\\\"}.fa-flash:before,.fa-bolt:before{content:\\\"\\\\f0e7\\\"}.fa-sitemap:before{content:\\\"\\\\f0e8\\\"}.fa-umbrella:before{content:\\\"\\\\f0e9\\\"}.fa-paste:before,.fa-clipboard:before{content:\\\"\\\\f0ea\\\"}.fa-lightbulb-o:before{content:\\\"\\\\f0eb\\\"}.fa-exchange:before{content:\\\"\\\\f0ec\\\"}.fa-cloud-download:before{content:\\\"\\\\f0ed\\\"}.fa-cloud-upload:before{content:\\\"\\\\f0ee\\\"}.fa-user-md:before{content:\\\"\\\\f0f0\\\"}.fa-stethoscope:before{content:\\\"\\\\f0f1\\\"}.fa-suitcase:before{content:\\\"\\\\f0f2\\\"}.fa-bell-o:before{content:\\\"\\\\f0a2\\\"}.fa-coffee:before{content:\\\"\\\\f0f4\\\"}.fa-cutlery:before{content:\\\"\\\\f0f5\\\"}.fa-file-text-o:before{content:\\\"\\\\f0f6\\\"}.fa-building-o:before{content:\\\"\\\\f0f7\\\"}.fa-hospital-o:before{content:\\\"\\\\f0f8\\\"}.fa-ambulance:before{content:\\\"\\\\f0f9\\\"}.fa-medkit:before{content:\\\"\\\\f0fa\\\"}.fa-fighter-jet:before{content:\\\"\\\\f0fb\\\"}.fa-beer:before{content:\\\"\\\\f0fc\\\"}.fa-h-square:before{content:\\\"\\\\f0fd\\\"}.fa-plus-square:before{content:\\\"\\\\f0fe\\\"}.fa-angle-double-left:before{content:\\\"\\\\f100\\\"}.fa-angle-double-right:before{content:\\\"\\\\f101\\\"}.fa-angle-double-up:before{content:\\\"\\\\f102\\\"}.fa-angle-double-down:before{content:\\\"\\\\f103\\\"}.fa-angle-left:before{content:\\\"\\\\f104\\\"}.fa-angle-right:before{content:\\\"\\\\f105\\\"}.fa-angle-up:before{content:\\\"\\\\f106\\\"}.fa-angle-down:before{content:\\\"\\\\f107\\\"}.fa-desktop:before{content:\\\"\\\\f108\\\"}.fa-laptop:before{content:\\\"\\\\f109\\\"}.fa-tablet:before{content:\\\"\\\\f10a\\\"}.fa-mobile-phone:before,.fa-mobile:before{content:\\\"\\\\f10b\\\"}.fa-circle-o:before{content:\\\"\\\\f10c\\\"}.fa-quote-left:before{content:\\\"\\\\f10d\\\"}.fa-quote-right:before{content:\\\"\\\\f10e\\\"}.fa-spinner:before{content:\\\"\\\\f110\\\"}.fa-circle:before{content:\\\"\\\\f111\\\"}.fa-mail-reply:before,.fa-reply:before{content:\\\"\\\\f112\\\"}.fa-github-alt:before{content:\\\"\\\\f113\\\"}.fa-folder-o:before{content:\\\"\\\\f114\\\"}.fa-folder-open-o:before{content:\\\"\\\\f115\\\"}.fa-smile-o:before{content:\\\"\\\\f118\\\"}.fa-frown-o:before{content:\\\"\\\\f119\\\"}.fa-meh-o:before{content:\\\"\\\\f11a\\\"}.fa-gamepad:before{content:\\\"\\\\f11b\\\"}.fa-keyboard-o:before{content:\\\"\\\\f11c\\\"}.fa-flag-o:before{content:\\\"\\\\f11d\\\"}.fa-flag-checkered:before{content:\\\"\\\\f11e\\\"}.fa-terminal:before{content:\\\"\\\\f120\\\"}.fa-code:before{content:\\\"\\\\f121\\\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\\\"\\\\f122\\\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\\\"\\\\f123\\\"}.fa-location-arrow:before{content:\\\"\\\\f124\\\"}.fa-crop:before{content:\\\"\\\\f125\\\"}.fa-code-fork:before{content:\\\"\\\\f126\\\"}.fa-unlink:before,.fa-chain-broken:before{content:\\\"\\\\f127\\\"}.fa-question:before{content:\\\"\\\\f128\\\"}.fa-info:before{content:\\\"\\\\f129\\\"}.fa-exclamation:before{content:\\\"\\\\f12a\\\"}.fa-superscript:before{content:\\\"\\\\f12b\\\"}.fa-subscript:before{content:\\\"\\\\f12c\\\"}.fa-eraser:before{content:\\\"\\\\f12d\\\"}.fa-puzzle-piece:before{content:\\\"\\\\f12e\\\"}.fa-microphone:before{content:\\\"\\\\f130\\\"}.fa-microphone-slash:before{content:\\\"\\\\f131\\\"}.fa-shield:before{content:\\\"\\\\f132\\\"}.fa-calendar-o:before{content:\\\"\\\\f133\\\"}.fa-fire-extinguisher:before{content:\\\"\\\\f134\\\"}.fa-rocket:before{content:\\\"\\\\f135\\\"}.fa-maxcdn:before{content:\\\"\\\\f136\\\"}.fa-chevron-circle-left:before{content:\\\"\\\\f137\\\"}.fa-chevron-circle-right:before{content:\\\"\\\\f138\\\"}.fa-chevron-circle-up:before{content:\\\"\\\\f139\\\"}.fa-chevron-circle-down:before{content:\\\"\\\\f13a\\\"}.fa-html5:before{content:\\\"\\\\f13b\\\"}.fa-css3:before{content:\\\"\\\\f13c\\\"}.fa-anchor:before{content:\\\"\\\\f13d\\\"}.fa-unlock-alt:before{content:\\\"\\\\f13e\\\"}.fa-bullseye:before{content:\\\"\\\\f140\\\"}.fa-ellipsis-h:before{content:\\\"\\\\f141\\\"}.fa-ellipsis-v:before{content:\\\"\\\\f142\\\"}.fa-rss-square:before{content:\\\"\\\\f143\\\"}.fa-play-circle:before{content:\\\"\\\\f144\\\"}.fa-ticket:before{content:\\\"\\\\f145\\\"}.fa-minus-square:before{content:\\\"\\\\f146\\\"}.fa-minus-square-o:before{content:\\\"\\\\f147\\\"}.fa-level-up:before{content:\\\"\\\\f148\\\"}.fa-level-down:before{content:\\\"\\\\f149\\\"}.fa-check-square:before{content:\\\"\\\\f14a\\\"}.fa-pencil-square:before{content:\\\"\\\\f14b\\\"}.fa-external-link-square:before{content:\\\"\\\\f14c\\\"}.fa-share-square:before{content:\\\"\\\\f14d\\\"}.fa-compass:before{content:\\\"\\\\f14e\\\"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:\\\"\\\\f150\\\"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:\\\"\\\\f151\\\"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:\\\"\\\\f152\\\"}.fa-euro:before,.fa-eur:before{content:\\\"\\\\f153\\\"}.fa-gbp:before{content:\\\"\\\\f154\\\"}.fa-dollar:before,.fa-usd:before{content:\\\"\\\\f155\\\"}.fa-rupee:before,.fa-inr:before{content:\\\"\\\\f156\\\"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:\\\"\\\\f157\\\"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:\\\"\\\\f158\\\"}.fa-won:before,.fa-krw:before{content:\\\"\\\\f159\\\"}.fa-bitcoin:before,.fa-btc:before{content:\\\"\\\\f15a\\\"}.fa-file:before{content:\\\"\\\\f15b\\\"}.fa-file-text:before{content:\\\"\\\\f15c\\\"}.fa-sort-alpha-asc:before{content:\\\"\\\\f15d\\\"}.fa-sort-alpha-desc:before{content:\\\"\\\\f15e\\\"}.fa-sort-amount-asc:before{content:\\\"\\\\f160\\\"}.fa-sort-amount-desc:before{content:\\\"\\\\f161\\\"}.fa-sort-numeric-asc:before{content:\\\"\\\\f162\\\"}.fa-sort-numeric-desc:before{content:\\\"\\\\f163\\\"}.fa-thumbs-up:before{content:\\\"\\\\f164\\\"}.fa-thumbs-down:before{content:\\\"\\\\f165\\\"}.fa-youtube-square:before{content:\\\"\\\\f166\\\"}.fa-youtube:before{content:\\\"\\\\f167\\\"}.fa-xing:before{content:\\\"\\\\f168\\\"}.fa-xing-square:before{content:\\\"\\\\f169\\\"}.fa-youtube-play:before{content:\\\"\\\\f16a\\\"}.fa-dropbox:before{content:\\\"\\\\f16b\\\"}.fa-stack-overflow:before{content:\\\"\\\\f16c\\\"}.fa-instagram:before{content:\\\"\\\\f16d\\\"}.fa-flickr:before{content:\\\"\\\\f16e\\\"}.fa-adn:before{content:\\\"\\\\f170\\\"}.fa-bitbucket:before{content:\\\"\\\\f171\\\"}.fa-bitbucket-square:before{content:\\\"\\\\f172\\\"}.fa-tumblr:before{content:\\\"\\\\f173\\\"}.fa-tumblr-square:before{content:\\\"\\\\f174\\\"}.fa-long-arrow-down:before{content:\\\"\\\\f175\\\"}.fa-long-arrow-up:before{content:\\\"\\\\f176\\\"}.fa-long-arrow-left:before{content:\\\"\\\\f177\\\"}.fa-long-arrow-right:before{content:\\\"\\\\f178\\\"}.fa-apple:before{content:\\\"\\\\f179\\\"}.fa-windows:before{content:\\\"\\\\f17a\\\"}.fa-android:before{content:\\\"\\\\f17b\\\"}.fa-linux:before{content:\\\"\\\\f17c\\\"}.fa-dribbble:before{content:\\\"\\\\f17d\\\"}.fa-skype:before{content:\\\"\\\\f17e\\\"}.fa-foursquare:before{content:\\\"\\\\f180\\\"}.fa-trello:before{content:\\\"\\\\f181\\\"}.fa-female:before{content:\\\"\\\\f182\\\"}.fa-male:before{content:\\\"\\\\f183\\\"}.fa-gittip:before,.fa-gratipay:before{content:\\\"\\\\f184\\\"}.fa-sun-o:before{content:\\\"\\\\f185\\\"}.fa-moon-o:before{content:\\\"\\\\f186\\\"}.fa-archive:before{content:\\\"\\\\f187\\\"}.fa-bug:before{content:\\\"\\\\f188\\\"}.fa-vk:before{content:\\\"\\\\f189\\\"}.fa-weibo:before{content:\\\"\\\\f18a\\\"}.fa-renren:before{content:\\\"\\\\f18b\\\"}.fa-pagelines:before{content:\\\"\\\\f18c\\\"}.fa-stack-exchange:before{content:\\\"\\\\f18d\\\"}.fa-arrow-circle-o-right:before{content:\\\"\\\\f18e\\\"}.fa-arrow-circle-o-left:before{content:\\\"\\\\f190\\\"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:\\\"\\\\f191\\\"}.fa-dot-circle-o:before{content:\\\"\\\\f192\\\"}.fa-wheelchair:before{content:\\\"\\\\f193\\\"}.fa-vimeo-square:before{content:\\\"\\\\f194\\\"}.fa-turkish-lira:before,.fa-try:before{content:\\\"\\\\f195\\\"}.fa-plus-square-o:before{content:\\\"\\\\f196\\\"}.fa-space-shuttle:before{content:\\\"\\\\f197\\\"}.fa-slack:before{content:\\\"\\\\f198\\\"}.fa-envelope-square:before{content:\\\"\\\\f199\\\"}.fa-wordpress:before{content:\\\"\\\\f19a\\\"}.fa-openid:before{content:\\\"\\\\f19b\\\"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:\\\"\\\\f19c\\\"}.fa-mortar-board:before,.fa-graduation-cap:before{content:\\\"\\\\f19d\\\"}.fa-yahoo:before{content:\\\"\\\\f19e\\\"}.fa-google:before{content:\\\"\\\\f1a0\\\"}.fa-reddit:before{content:\\\"\\\\f1a1\\\"}.fa-reddit-square:before{content:\\\"\\\\f1a2\\\"}.fa-stumbleupon-circle:before{content:\\\"\\\\f1a3\\\"}.fa-stumbleupon:before{content:\\\"\\\\f1a4\\\"}.fa-delicious:before{content:\\\"\\\\f1a5\\\"}.fa-digg:before{content:\\\"\\\\f1a6\\\"}.fa-pied-piper-pp:before{content:\\\"\\\\f1a7\\\"}.fa-pied-piper-alt:before{content:\\\"\\\\f1a8\\\"}.fa-drupal:before{content:\\\"\\\\f1a9\\\"}.fa-joomla:before{content:\\\"\\\\f1aa\\\"}.fa-language:before{content:\\\"\\\\f1ab\\\"}.fa-fax:before{content:\\\"\\\\f1ac\\\"}.fa-building:before{content:\\\"\\\\f1ad\\\"}.fa-child:before{content:\\\"\\\\f1ae\\\"}.fa-paw:before{content:\\\"\\\\f1b0\\\"}.fa-spoon:before{content:\\\"\\\\f1b1\\\"}.fa-cube:before{content:\\\"\\\\f1b2\\\"}.fa-cubes:before{content:\\\"\\\\f1b3\\\"}.fa-behance:before{content:\\\"\\\\f1b4\\\"}.fa-behance-square:before{content:\\\"\\\\f1b5\\\"}.fa-steam:before{content:\\\"\\\\f1b6\\\"}.fa-steam-square:before{content:\\\"\\\\f1b7\\\"}.fa-recycle:before{content:\\\"\\\\f1b8\\\"}.fa-automobile:before,.fa-car:before{content:\\\"\\\\f1b9\\\"}.fa-cab:before,.fa-taxi:before{content:\\\"\\\\f1ba\\\"}.fa-tree:before{content:\\\"\\\\f1bb\\\"}.fa-spotify:before{content:\\\"\\\\f1bc\\\"}.fa-deviantart:before{content:\\\"\\\\f1bd\\\"}.fa-soundcloud:before{content:\\\"\\\\f1be\\\"}.fa-database:before{content:\\\"\\\\f1c0\\\"}.fa-file-pdf-o:before{content:\\\"\\\\f1c1\\\"}.fa-file-word-o:before{content:\\\"\\\\f1c2\\\"}.fa-file-excel-o:before{content:\\\"\\\\f1c3\\\"}.fa-file-powerpoint-o:before{content:\\\"\\\\f1c4\\\"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:\\\"\\\\f1c5\\\"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:\\\"\\\\f1c6\\\"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:\\\"\\\\f1c7\\\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\\\"\\\\f1c8\\\"}.fa-file-code-o:before{content:\\\"\\\\f1c9\\\"}.fa-vine:before{content:\\\"\\\\f1ca\\\"}.fa-codepen:before{content:\\\"\\\\f1cb\\\"}.fa-jsfiddle:before{content:\\\"\\\\f1cc\\\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:\\\"\\\\f1cd\\\"}.fa-circle-o-notch:before{content:\\\"\\\\f1ce\\\"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:\\\"\\\\f1d0\\\"}.fa-ge:before,.fa-empire:before{content:\\\"\\\\f1d1\\\"}.fa-git-square:before{content:\\\"\\\\f1d2\\\"}.fa-git:before{content:\\\"\\\\f1d3\\\"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:\\\"\\\\f1d4\\\"}.fa-tencent-weibo:before{content:\\\"\\\\f1d5\\\"}.fa-qq:before{content:\\\"\\\\f1d6\\\"}.fa-wechat:before,.fa-weixin:before{content:\\\"\\\\f1d7\\\"}.fa-send:before,.fa-paper-plane:before{content:\\\"\\\\f1d8\\\"}.fa-send-o:before,.fa-paper-plane-o:before{content:\\\"\\\\f1d9\\\"}.fa-history:before{content:\\\"\\\\f1da\\\"}.fa-circle-thin:before{content:\\\"\\\\f1db\\\"}.fa-header:before{content:\\\"\\\\f1dc\\\"}.fa-paragraph:before{content:\\\"\\\\f1dd\\\"}.fa-sliders:before{content:\\\"\\\\f1de\\\"}.fa-share-alt:before{content:\\\"\\\\f1e0\\\"}.fa-share-alt-square:before{content:\\\"\\\\f1e1\\\"}.fa-bomb:before{content:\\\"\\\\f1e2\\\"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:\\\"\\\\f1e3\\\"}.fa-tty:before{content:\\\"\\\\f1e4\\\"}.fa-binoculars:before{content:\\\"\\\\f1e5\\\"}.fa-plug:before{content:\\\"\\\\f1e6\\\"}.fa-slideshare:before{content:\\\"\\\\f1e7\\\"}.fa-twitch:before{content:\\\"\\\\f1e8\\\"}.fa-yelp:before{content:\\\"\\\\f1e9\\\"}.fa-newspaper-o:before{content:\\\"\\\\f1ea\\\"}.fa-wifi:before{content:\\\"\\\\f1eb\\\"}.fa-calculator:before{content:\\\"\\\\f1ec\\\"}.fa-paypal:before{content:\\\"\\\\f1ed\\\"}.fa-google-wallet:before{content:\\\"\\\\f1ee\\\"}.fa-cc-visa:before{content:\\\"\\\\f1f0\\\"}.fa-cc-mastercard:before{content:\\\"\\\\f1f1\\\"}.fa-cc-discover:before{content:\\\"\\\\f1f2\\\"}.fa-cc-amex:before{content:\\\"\\\\f1f3\\\"}.fa-cc-paypal:before{content:\\\"\\\\f1f4\\\"}.fa-cc-stripe:before{content:\\\"\\\\f1f5\\\"}.fa-bell-slash:before{content:\\\"\\\\f1f6\\\"}.fa-bell-slash-o:before{content:\\\"\\\\f1f7\\\"}.fa-trash:before{content:\\\"\\\\f1f8\\\"}.fa-copyright:before{content:\\\"\\\\f1f9\\\"}.fa-at:before{content:\\\"\\\\f1fa\\\"}.fa-eyedropper:before{content:\\\"\\\\f1fb\\\"}.fa-paint-brush:before{content:\\\"\\\\f1fc\\\"}.fa-birthday-cake:before{content:\\\"\\\\f1fd\\\"}.fa-area-chart:before{content:\\\"\\\\f1fe\\\"}.fa-pie-chart:before{content:\\\"\\\\f200\\\"}.fa-line-chart:before{content:\\\"\\\\f201\\\"}.fa-lastfm:before{content:\\\"\\\\f202\\\"}.fa-lastfm-square:before{content:\\\"\\\\f203\\\"}.fa-toggle-off:before{content:\\\"\\\\f204\\\"}.fa-toggle-on:before{content:\\\"\\\\f205\\\"}.fa-bicycle:before{content:\\\"\\\\f206\\\"}.fa-bus:before{content:\\\"\\\\f207\\\"}.fa-ioxhost:before{content:\\\"\\\\f208\\\"}.fa-angellist:before{content:\\\"\\\\f209\\\"}.fa-cc:before{content:\\\"\\\\f20a\\\"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:\\\"\\\\f20b\\\"}.fa-meanpath:before{content:\\\"\\\\f20c\\\"}.fa-buysellads:before{content:\\\"\\\\f20d\\\"}.fa-connectdevelop:before{content:\\\"\\\\f20e\\\"}.fa-dashcube:before{content:\\\"\\\\f210\\\"}.fa-forumbee:before{content:\\\"\\\\f211\\\"}.fa-leanpub:before{content:\\\"\\\\f212\\\"}.fa-sellsy:before{content:\\\"\\\\f213\\\"}.fa-shirtsinbulk:before{content:\\\"\\\\f214\\\"}.fa-simplybuilt:before{content:\\\"\\\\f215\\\"}.fa-skyatlas:before{content:\\\"\\\\f216\\\"}.fa-cart-plus:before{content:\\\"\\\\f217\\\"}.fa-cart-arrow-down:before{content:\\\"\\\\f218\\\"}.fa-diamond:before{content:\\\"\\\\f219\\\"}.fa-ship:before{content:\\\"\\\\f21a\\\"}.fa-user-secret:before{content:\\\"\\\\f21b\\\"}.fa-motorcycle:before{content:\\\"\\\\f21c\\\"}.fa-street-view:before{content:\\\"\\\\f21d\\\"}.fa-heartbeat:before{content:\\\"\\\\f21e\\\"}.fa-venus:before{content:\\\"\\\\f221\\\"}.fa-mars:before{content:\\\"\\\\f222\\\"}.fa-mercury:before{content:\\\"\\\\f223\\\"}.fa-intersex:before,.fa-transgender:before{content:\\\"\\\\f224\\\"}.fa-transgender-alt:before{content:\\\"\\\\f225\\\"}.fa-venus-double:before{content:\\\"\\\\f226\\\"}.fa-mars-double:before{content:\\\"\\\\f227\\\"}.fa-venus-mars:before{content:\\\"\\\\f228\\\"}.fa-mars-stroke:before{content:\\\"\\\\f229\\\"}.fa-mars-stroke-v:before{content:\\\"\\\\f22a\\\"}.fa-mars-stroke-h:before{content:\\\"\\\\f22b\\\"}.fa-neuter:before{content:\\\"\\\\f22c\\\"}.fa-genderless:before{content:\\\"\\\\f22d\\\"}.fa-facebook-official:before{content:\\\"\\\\f230\\\"}.fa-pinterest-p:before{content:\\\"\\\\f231\\\"}.fa-whatsapp:before{content:\\\"\\\\f232\\\"}.fa-server:before{content:\\\"\\\\f233\\\"}.fa-user-plus:before{content:\\\"\\\\f234\\\"}.fa-user-times:before{content:\\\"\\\\f235\\\"}.fa-hotel:before,.fa-bed:before{content:\\\"\\\\f236\\\"}.fa-viacoin:before{content:\\\"\\\\f237\\\"}.fa-train:before{content:\\\"\\\\f238\\\"}.fa-subway:before{content:\\\"\\\\f239\\\"}.fa-medium:before{content:\\\"\\\\f23a\\\"}.fa-yc:before,.fa-y-combinator:before{content:\\\"\\\\f23b\\\"}.fa-optin-monster:before{content:\\\"\\\\f23c\\\"}.fa-opencart:before{content:\\\"\\\\f23d\\\"}.fa-expeditedssl:before{content:\\\"\\\\f23e\\\"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:\\\"\\\\f240\\\"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:\\\"\\\\f241\\\"}.fa-battery-2:before,.fa-battery-half:before{content:\\\"\\\\f242\\\"}.fa-battery-1:before,.fa-battery-quarter:before{content:\\\"\\\\f243\\\"}.fa-battery-0:before,.fa-battery-empty:before{content:\\\"\\\\f244\\\"}.fa-mouse-pointer:before{content:\\\"\\\\f245\\\"}.fa-i-cursor:before{content:\\\"\\\\f246\\\"}.fa-object-group:before{content:\\\"\\\\f247\\\"}.fa-object-ungroup:before{content:\\\"\\\\f248\\\"}.fa-sticky-note:before{content:\\\"\\\\f249\\\"}.fa-sticky-note-o:before{content:\\\"\\\\f24a\\\"}.fa-cc-jcb:before{content:\\\"\\\\f24b\\\"}.fa-cc-diners-club:before{content:\\\"\\\\f24c\\\"}.fa-clone:before{content:\\\"\\\\f24d\\\"}.fa-balance-scale:before{content:\\\"\\\\f24e\\\"}.fa-hourglass-o:before{content:\\\"\\\\f250\\\"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:\\\"\\\\f251\\\"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:\\\"\\\\f252\\\"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:\\\"\\\\f253\\\"}.fa-hourglass:before{content:\\\"\\\\f254\\\"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:\\\"\\\\f255\\\"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:\\\"\\\\f256\\\"}.fa-hand-scissors-o:before{content:\\\"\\\\f257\\\"}.fa-hand-lizard-o:before{content:\\\"\\\\f258\\\"}.fa-hand-spock-o:before{content:\\\"\\\\f259\\\"}.fa-hand-pointer-o:before{content:\\\"\\\\f25a\\\"}.fa-hand-peace-o:before{content:\\\"\\\\f25b\\\"}.fa-trademark:before{content:\\\"\\\\f25c\\\"}.fa-registered:before{content:\\\"\\\\f25d\\\"}.fa-creative-commons:before{content:\\\"\\\\f25e\\\"}.fa-gg:before{content:\\\"\\\\f260\\\"}.fa-gg-circle:before{content:\\\"\\\\f261\\\"}.fa-tripadvisor:before{content:\\\"\\\\f262\\\"}.fa-odnoklassniki:before{content:\\\"\\\\f263\\\"}.fa-odnoklassniki-square:before{content:\\\"\\\\f264\\\"}.fa-get-pocket:before{content:\\\"\\\\f265\\\"}.fa-wikipedia-w:before{content:\\\"\\\\f266\\\"}.fa-safari:before{content:\\\"\\\\f267\\\"}.fa-chrome:before{content:\\\"\\\\f268\\\"}.fa-firefox:before{content:\\\"\\\\f269\\\"}.fa-opera:before{content:\\\"\\\\f26a\\\"}.fa-internet-explorer:before{content:\\\"\\\\f26b\\\"}.fa-tv:before,.fa-television:before{content:\\\"\\\\f26c\\\"}.fa-contao:before{content:\\\"\\\\f26d\\\"}.fa-500px:before{content:\\\"\\\\f26e\\\"}.fa-amazon:before{content:\\\"\\\\f270\\\"}.fa-calendar-plus-o:before{content:\\\"\\\\f271\\\"}.fa-calendar-minus-o:before{content:\\\"\\\\f272\\\"}.fa-calendar-times-o:before{content:\\\"\\\\f273\\\"}.fa-calendar-check-o:before{content:\\\"\\\\f274\\\"}.fa-industry:before{content:\\\"\\\\f275\\\"}.fa-map-pin:before{content:\\\"\\\\f276\\\"}.fa-map-signs:before{content:\\\"\\\\f277\\\"}.fa-map-o:before{content:\\\"\\\\f278\\\"}.fa-map:before{content:\\\"\\\\f279\\\"}.fa-commenting:before{content:\\\"\\\\f27a\\\"}.fa-commenting-o:before{content:\\\"\\\\f27b\\\"}.fa-houzz:before{content:\\\"\\\\f27c\\\"}.fa-vimeo:before{content:\\\"\\\\f27d\\\"}.fa-black-tie:before{content:\\\"\\\\f27e\\\"}.fa-fonticons:before{content:\\\"\\\\f280\\\"}.fa-reddit-alien:before{content:\\\"\\\\f281\\\"}.fa-edge:before{content:\\\"\\\\f282\\\"}.fa-credit-card-alt:before{content:\\\"\\\\f283\\\"}.fa-codiepie:before{content:\\\"\\\\f284\\\"}.fa-modx:before{content:\\\"\\\\f285\\\"}.fa-fort-awesome:before{content:\\\"\\\\f286\\\"}.fa-usb:before{content:\\\"\\\\f287\\\"}.fa-product-hunt:before{content:\\\"\\\\f288\\\"}.fa-mixcloud:before{content:\\\"\\\\f289\\\"}.fa-scribd:before{content:\\\"\\\\f28a\\\"}.fa-pause-circle:before{content:\\\"\\\\f28b\\\"}.fa-pause-circle-o:before{content:\\\"\\\\f28c\\\"}.fa-stop-circle:before{content:\\\"\\\\f28d\\\"}.fa-stop-circle-o:before{content:\\\"\\\\f28e\\\"}.fa-shopping-bag:before{content:\\\"\\\\f290\\\"}.fa-shopping-basket:before{content:\\\"\\\\f291\\\"}.fa-hashtag:before{content:\\\"\\\\f292\\\"}.fa-bluetooth:before{content:\\\"\\\\f293\\\"}.fa-bluetooth-b:before{content:\\\"\\\\f294\\\"}.fa-percent:before{content:\\\"\\\\f295\\\"}.fa-gitlab:before{content:\\\"\\\\f296\\\"}.fa-wpbeginner:before{content:\\\"\\\\f297\\\"}.fa-wpforms:before{content:\\\"\\\\f298\\\"}.fa-envira:before{content:\\\"\\\\f299\\\"}.fa-universal-access:before{content:\\\"\\\\f29a\\\"}.fa-wheelchair-alt:before{content:\\\"\\\\f29b\\\"}.fa-question-circle-o:before{content:\\\"\\\\f29c\\\"}.fa-blind:before{content:\\\"\\\\f29d\\\"}.fa-audio-description:before{content:\\\"\\\\f29e\\\"}.fa-volume-control-phone:before{content:\\\"\\\\f2a0\\\"}.fa-braille:before{content:\\\"\\\\f2a1\\\"}.fa-assistive-listening-systems:before{content:\\\"\\\\f2a2\\\"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:\\\"\\\\f2a3\\\"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:\\\"\\\\f2a4\\\"}.fa-glide:before{content:\\\"\\\\f2a5\\\"}.fa-glide-g:before{content:\\\"\\\\f2a6\\\"}.fa-signing:before,.fa-sign-language:before{content:\\\"\\\\f2a7\\\"}.fa-low-vision:before{content:\\\"\\\\f2a8\\\"}.fa-viadeo:before{content:\\\"\\\\f2a9\\\"}.fa-viadeo-square:before{content:\\\"\\\\f2aa\\\"}.fa-snapchat:before{content:\\\"\\\\f2ab\\\"}.fa-snapchat-ghost:before{content:\\\"\\\\f2ac\\\"}.fa-snapchat-square:before{content:\\\"\\\\f2ad\\\"}.fa-pied-piper:before{content:\\\"\\\\f2ae\\\"}.fa-first-order:before{content:\\\"\\\\f2b0\\\"}.fa-yoast:before{content:\\\"\\\\f2b1\\\"}.fa-themeisle:before{content:\\\"\\\\f2b2\\\"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:\\\"\\\\f2b3\\\"}.fa-fa:before,.fa-font-awesome:before{content:\\\"\\\\f2b4\\\"}.fa-handshake-o:before{content:\\\"\\\\f2b5\\\"}.fa-envelope-open:before{content:\\\"\\\\f2b6\\\"}.fa-envelope-open-o:before{content:\\\"\\\\f2b7\\\"}.fa-linode:before{content:\\\"\\\\f2b8\\\"}.fa-address-book:before{content:\\\"\\\\f2b9\\\"}.fa-address-book-o:before{content:\\\"\\\\f2ba\\\"}.fa-vcard:before,.fa-address-card:before{content:\\\"\\\\f2bb\\\"}.fa-vcard-o:before,.fa-address-card-o:before{content:\\\"\\\\f2bc\\\"}.fa-user-circle:before{content:\\\"\\\\f2bd\\\"}.fa-user-circle-o:before{content:\\\"\\\\f2be\\\"}.fa-user-o:before{content:\\\"\\\\f2c0\\\"}.fa-id-badge:before{content:\\\"\\\\f2c1\\\"}.fa-drivers-license:before,.fa-id-card:before{content:\\\"\\\\f2c2\\\"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:\\\"\\\\f2c3\\\"}.fa-quora:before{content:\\\"\\\\f2c4\\\"}.fa-free-code-camp:before{content:\\\"\\\\f2c5\\\"}.fa-telegram:before{content:\\\"\\\\f2c6\\\"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:\\\"\\\\f2c7\\\"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:\\\"\\\\f2c8\\\"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:\\\"\\\\f2c9\\\"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:\\\"\\\\f2ca\\\"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:\\\"\\\\f2cb\\\"}.fa-shower:before{content:\\\"\\\\f2cc\\\"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:\\\"\\\\f2cd\\\"}.fa-podcast:before{content:\\\"\\\\f2ce\\\"}.fa-window-maximize:before{content:\\\"\\\\f2d0\\\"}.fa-window-minimize:before{content:\\\"\\\\f2d1\\\"}.fa-window-restore:before{content:\\\"\\\\f2d2\\\"}.fa-times-rectangle:before,.fa-window-close:before{content:\\\"\\\\f2d3\\\"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:\\\"\\\\f2d4\\\"}.fa-bandcamp:before{content:\\\"\\\\f2d5\\\"}.fa-grav:before{content:\\\"\\\\f2d6\\\"}.fa-etsy:before{content:\\\"\\\\f2d7\\\"}.fa-imdb:before{content:\\\"\\\\f2d8\\\"}.fa-ravelry:before{content:\\\"\\\\f2d9\\\"}.fa-eercast:before{content:\\\"\\\\f2da\\\"}.fa-microchip:before{content:\\\"\\\\f2db\\\"}.fa-snowflake-o:before{content:\\\"\\\\f2dc\\\"}.fa-superpowers:before{content:\\\"\\\\f2dd\\\"}.fa-wpexplorer:before{content:\\\"\\\\f2de\\\"}.fa-meetup:before{content:\\\"\\\\f2e0\\\"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./styles/font-awesome.min.css\"],\"names\":[],\"mappings\":\"AAAA;;;EAGE,CAAC,WAAW,yBAAyB,CAAC,mDAAmD,CAAC,4WAA4W,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,oBAAoB,CAAC,4CAA4C,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,kCAAkC,CAAC,iCAAiC,CAAC,OAAO,sBAAsB,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,aAAa,CAAC,OAAO,aAAa,CAAC,OAAO,aAAa,CAAC,OAAO,aAAa,CAAC,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,cAAc,CAAC,wBAAwB,CAAC,oBAAoB,CAAC,UAAU,iBAAiB,CAAC,OAAO,iBAAiB,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,eAAe,CAAC,iBAAiB,CAAC,aAAa,kBAAkB,CAAC,WAAW,wBAAwB,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,cAAc,UAAU,CAAC,eAAe,WAAW,CAAC,iBAAiB,iBAAiB,CAAC,kBAAkB,gBAAgB,CAAC,YAAY,WAAW,CAAC,WAAW,UAAU,CAAC,cAAc,iBAAiB,CAAC,eAAe,gBAAgB,CAAC,SAAS,4CAA4C,CAAC,oCAAoC,CAAC,UAAU,8CAA8C,CAAC,sCAAsC,CAAC,2BAA2B,GAAG,8BAA8B,CAAC,sBAAsB,CAAC,KAAK,gCAAgC,CAAC,wBAAwB,CAAC,CAAC,mBAAmB,GAAG,8BAA8B,CAAC,sBAAsB,CAAC,KAAK,gCAAgC,CAAC,wBAAwB,CAAC,CAAC,cAAc,qEAAqE,CAAC,+BAA+B,CAAC,2BAA2B,CAAC,uBAAuB,CAAC,eAAe,qEAAqE,CAAC,gCAAgC,CAAC,4BAA4B,CAAC,wBAAwB,CAAC,eAAe,qEAAqE,CAAC,gCAAgC,CAAC,4BAA4B,CAAC,wBAAwB,CAAC,oBAAoB,+EAA+E,CAAC,8BAA8B,CAAC,0BAA0B,CAAC,sBAAsB,CAAC,kBAAkB,+EAA+E,CAAC,8BAA8B,CAAC,0BAA0B,CAAC,sBAAsB,CAAC,gHAAgH,WAAW,CAAC,UAAU,iBAAiB,CAAC,oBAAoB,CAAC,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC,qBAAqB,CAAC,0BAA0B,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,aAAa,mBAAmB,CAAC,aAAa,aAAa,CAAC,YAAY,UAAU,CAAC,iBAAiB,eAAe,CAAC,iBAAiB,eAAe,CAAC,kBAAkB,eAAe,CAAC,sBAAsB,eAAe,CAAC,iBAAiB,eAAe,CAAC,gBAAgB,eAAe,CAAC,kBAAkB,eAAe,CAAC,gBAAgB,eAAe,CAAC,gBAAgB,eAAe,CAAC,oBAAoB,eAAe,CAAC,cAAc,eAAe,CAAC,mBAAmB,eAAe,CAAC,iBAAiB,eAAe,CAAC,oDAAoD,eAAe,CAAC,uBAAuB,eAAe,CAAC,wBAAwB,eAAe,CAAC,qBAAqB,eAAe,CAAC,kBAAkB,eAAe,CAAC,+BAA+B,eAAe,CAAC,mBAAmB,eAAe,CAAC,gBAAgB,eAAe,CAAC,kBAAkB,eAAe,CAAC,mBAAmB,eAAe,CAAC,gBAAgB,eAAe,CAAC,oBAAoB,eAAe,CAAC,+BAA+B,eAAe,CAAC,6BAA6B,eAAe,CAAC,iBAAiB,eAAe,CAAC,yBAAyB,eAAe,CAAC,0CAA0C,eAAe,CAAC,mBAAmB,eAAe,CAAC,oBAAoB,eAAe,CAAC,gBAAgB,eAAe,CAAC,gBAAgB,eAAe,CAAC,sBAAsB,eAAe,CAAC,sBAAsB,eAAe,CAAC,uBAAuB,eAAe,CAAC,qBAAqB,eAAe,CAAC,kBAAkB,eAAe,CAAC,mBAAmB,eAAe,CAAC,eAAe,eAAe,CAAC,gBAAgB,eAAe,CAAC,gBAAgB,eAAe,CAAC,oBAAoB,eAAe,CAAC,iBAAiB,eAAe,CAAC,kBAAkB,eAAe,CAAC,gBAAgB,eAAe,CAAC,gBAAgB,eAAe,CAAC,kBAAkB,eAAe,CAAC,uBAAuB,eAAe,CAAC,sBAAsB,eAAe,CAAC,sBAAsB,eAAe,CAAC,wBAAwB,eAAe,CAAC,uBAAuB,eAAe,CAAC,yBAAyB,eAAe,CAAC,gBAAgB,eAAe,CAAC,qCAAqC,eAAe,CAAC,kBAAkB,eAAe,CAAC,wBAAwB,eAAe,CAAC,uDAAuD,eAAe,CAAC,kBAAkB,eAAe,CAAC,sBAAsB,eAAe,CAAC,kBAAkB,eAAe,CAAC,gBAAgB,eAAe,CAAC,2CAA2C,eAAe,CAAC,0BAA0B,eAAe,CAAC,0BAA0B,eAAe,CAAC,kBAAkB,eAAe,CAAC,yBAAyB,eAAe,CAAC,yBAAyB,eAAe,CAAC,oBAAoB,eAAe,CAAC,gBAAgB,eAAe,CAAC,iBAAiB,eAAe,CAAC,gBAAgB,eAAe,CAAC,mBAAmB,eAAe,CAAC,wBAAwB,eAAe,CAAC,wBAAwB,eAAe,CAAC,iBAAiB,eAAe,CAAC,wBAAwB,eAAe,CAAC,yBAAyB,eAAe,CAAC,uBAAuB,eAAe,CAAC,wBAAwB,eAAe,CAAC,wBAAwB,eAAe,CAAC,wBAAwB,eAAe,CAAC,2BAA2B,eAAe,CAAC,uBAAuB,eAAe,CAAC,sBAAsB,eAAe,CAAC,0BAA0B,eAAe,CAAC,0BAA0B,eAAe,CAAC,eAAe,eAAe,CAAC,sBAAsB,eAAe,CAAC,uBAAuB,eAAe,CAAC,oBAAoB,eAAe,CAAC,sBAAsB,eAAe,CAAC,yCAAyC,eAAe,CAAC,kBAAkB,eAAe,CAAC,oBAAoB,eAAe,CAAC,gBAAgB,eAAe,CAAC,iBAAiB,eAAe,CAAC,oBAAoB,eAAe,CAAC,8BAA8B,eAAe,CAAC,gBAAgB,eAAe,CAAC,gBAAgB,eAAe,CAAC,gBAAgB,eAAe,CAAC,eAAe,eAAe,CAAC,qBAAqB,eAAe,CAAC,mDAAmD,eAAe,CAAC,iBAAiB,eAAe,CAAC,oBAAoB,eAAe,CAAC,kBAAkB,eAAe,CAAC,mBAAmB,eAAe,CAAC,kBAAkB,eAAe,CAAC,sBAAsB,eAAe,CAAC,wBAAwB,eAAe,CAAC,mBAAmB,eAAe,CAAC,yBAAyB,eAAe,CAAC,kBAAkB,eAAe,CAAC,uBAAuB,eAAe,CAAC,oBAAoB,eAAe,CAAC,oBAAoB,eAAe,CAAC,4CAA4C,eAAe,CAAC,0BAA0B,eAAe,CAAC,2BAA2B,eAAe,CAAC,wBAAwB,eAAe,CAAC,eAAe,eAAe,CAAC,iCAAiC,eAAe,CAAC,oBAAoB,eAAe,CAAC,uBAAuB,eAAe,CAAC,yBAAyB,eAAe,CAAC,qBAAqB,eAAe,CAAC,mBAAmB,eAAe,CAAC,oBAAoB,eAAe,CAAC,2BAA2B,eAAe,CAAC,sBAAsB,eAAe,CAAC,yBAAyB,eAAe,CAAC,mBAAmB,eAAe,CAAC,kBAAkB,eAAe,CAAC,yBAAyB,eAAe,CAAC,kBAAkB,eAAe,CAAC,mBAAmB,eAAe,CAAC,iBAAiB,eAAe,CAAC,oBAAoB,eAAe,CAAC,sBAAsB,eAAe,CAAC,wBAAwB,eAAe,CAAC,mBAAmB,eAAe,CAAC,0CAA0C,eAAe,CAAC,kBAAkB,eAAe,CAAC,kBAAkB,eAAe,CAAC,uBAAuB,eAAe,CAAC,+BAA+B,eAAe,CAAC,iBAAiB,eAAe,CAAC,oBAAoB,eAAe,CAAC,gBAAgB,eAAe,CAAC,uBAAuB,eAAe,CAAC,wBAAwB,eAAe,CAAC,uBAAuB,eAAe,CAAC,qBAAqB,eAAe,CAAC,uBAAuB,eAAe,CAAC,6BAA6B,eAAe,CAAC,8BAA8B,eAAe,CAAC,2BAA2B,eAAe,CAAC,6BAA6B,eAAe,CAAC,iBAAiB,eAAe,CAAC,kBAAkB,eAAe,CAAC,iBAAiB,eAAe,CAAC,kBAAkB,eAAe,CAAC,qBAAqB,eAAe,CAAC,sBAAsB,eAAe,CAAC,kCAAkC,eAAe,CAAC,iCAAiC,eAAe,CAAC,iBAAiB,eAAe,CAAC,iBAAiB,eAAe,CAAC,mCAAmC,eAAe,CAAC,mCAAmC,eAAe,CAAC,qBAAqB,eAAe,CAAC,oCAAoC,eAAe,CAAC,kBAAkB,eAAe,CAAC,sDAAsD,eAAe,CAAC,mBAAmB,eAAe,CAAC,mBAAmB,eAAe,CAAC,yBAAyB,eAAe,CAAC,qBAAqB,eAAe,CAAC,iBAAiB,eAAe,CAAC,iBAAiB,eAAe,CAAC,iBAAiB,eAAe,CAAC,qBAAqB,eAAe,CAAC,4BAA4B,eAAe,CAAC,8BAA8B,eAAe,CAAC,uBAAuB,eAAe,CAAC,iBAAiB,eAAe,CAAC,sBAAsB,eAAe,CAAC,oBAAoB,eAAe,CAAC,sBAAsB,eAAe,CAAC,uBAAuB,eAAe,CAAC,mBAAmB,eAAe,CAAC,oCAAoC,eAAe,CAAC,0CAA0C,eAAe,CAAC,uCAAuC,eAAe,CAAC,oBAAoB,eAAe,CAAC,oBAAoB,eAAe,CAAC,uCAAuC,eAAe,CAAC,kCAAkC,eAAe,CAAC,2CAA2C,eAAe,CAAC,qBAAqB,eAAe,CAAC,sBAAsB,eAAe,CAAC,iCAAiC,eAAe,CAAC,mBAAmB,eAAe,CAAC,oBAAoB,eAAe,CAAC,sCAAsC,eAAe,CAAC,uBAAuB,eAAe,CAAC,oBAAoB,eAAe,CAAC,0BAA0B,eAAe,CAAC,wBAAwB,eAAe,CAAC,mBAAmB,eAAe,CAAC,uBAAuB,eAAe,CAAC,oBAAoB,eAAe,CAAC,kBAAkB,eAAe,CAAC,kBAAkB,eAAe,CAAC,mBAAmB,eAAe,CAAC,uBAAuB,eAAe,CAAC,sBAAsB,eAAe,CAAC,sBAAsB,eAAe,CAAC,qBAAqB,eAAe,CAAC,kBAAkB,eAAe,CAAC,uBAAuB,eAAe,CAAC,gBAAgB,eAAe,CAAC,oBAAoB,eAAe,CAAC,uBAAuB,eAAe,CAAC,6BAA6B,eAAe,CAAC,8BAA8B,eAAe,CAAC,2BAA2B,eAAe,CAAC,6BAA6B,eAAe,CAAC,sBAAsB,eAAe,CAAC,uBAAuB,eAAe,CAAC,oBAAoB,eAAe,CAAC,sBAAsB,eAAe,CAAC,mBAAmB,eAAe,CAAC,kBAAkB,eAAe,CAAC,kBAAkB,eAAe,CAAC,0CAA0C,eAAe,CAAC,oBAAoB,eAAe,CAAC,sBAAsB,eAAe,CAAC,uBAAuB,eAAe,CAAC,mBAAmB,eAAe,CAAC,kBAAkB,eAAe,CAAC,uCAAuC,eAAe,CAAC,sBAAsB,eAAe,CAAC,oBAAoB,eAAe,CAAC,yBAAyB,eAAe,CAAC,mBAAmB,eAAe,CAAC,mBAAmB,eAAe,CAAC,iBAAiB,eAAe,CAAC,mBAAmB,eAAe,CAAC,sBAAsB,eAAe,CAAC,kBAAkB,eAAe,CAAC,0BAA0B,eAAe,CAAC,oBAAoB,eAAe,CAAC,gBAAgB,eAAe,CAAC,+CAA+C,eAAe,CAAC,4EAA4E,eAAe,CAAC,0BAA0B,eAAe,CAAC,gBAAgB,eAAe,CAAC,qBAAqB,eAAe,CAAC,0CAA0C,eAAe,CAAC,oBAAoB,eAAe,CAAC,gBAAgB,eAAe,CAAC,uBAAuB,eAAe,CAAC,uBAAuB,eAAe,CAAC,qBAAqB,eAAe,CAAC,kBAAkB,eAAe,CAAC,wBAAwB,eAAe,CAAC,sBAAsB,eAAe,CAAC,4BAA4B,eAAe,CAAC,kBAAkB,eAAe,CAAC,sBAAsB,eAAe,CAAC,6BAA6B,eAAe,CAAC,kBAAkB,eAAe,CAAC,kBAAkB,eAAe,CAAC,+BAA+B,eAAe,CAAC,gCAAgC,eAAe,CAAC,6BAA6B,eAAe,CAAC,+BAA+B,eAAe,CAAC,iBAAiB,eAAe,CAAC,gBAAgB,eAAe,CAAC,kBAAkB,eAAe,CAAC,sBAAsB,eAAe,CAAC,oBAAoB,eAAe,CAAC,sBAAsB,eAAe,CAAC,sBAAsB,eAAe,CAAC,sBAAsB,eAAe,CAAC,uBAAuB,eAAe,CAAC,kBAAkB,eAAe,CAAC,wBAAwB,eAAe,CAAC,0BAA0B,eAAe,CAAC,oBAAoB,eAAe,CAAC,sBAAsB,eAAe,CAAC,wBAAwB,eAAe,CAAC,yBAAyB,eAAe,CAAC,gCAAgC,eAAe,CAAC,wBAAwB,eAAe,CAAC,mBAAmB,eAAe,CAAC,sDAAsD,eAAe,CAAC,kDAAkD,eAAe,CAAC,wDAAwD,eAAe,CAAC,+BAA+B,eAAe,CAAC,eAAe,eAAe,CAAC,iCAAiC,eAAe,CAAC,gCAAgC,eAAe,CAAC,4DAA4D,eAAe,CAAC,kDAAkD,eAAe,CAAC,8BAA8B,eAAe,CAAC,kCAAkC,eAAe,CAAC,gBAAgB,eAAe,CAAC,qBAAqB,eAAe,CAAC,0BAA0B,eAAe,CAAC,2BAA2B,eAAe,CAAC,2BAA2B,eAAe,CAAC,4BAA4B,eAAe,CAAC,4BAA4B,eAAe,CAAC,6BAA6B,eAAe,CAAC,qBAAqB,eAAe,CAAC,uBAAuB,eAAe,CAAC,0BAA0B,eAAe,CAAC,mBAAmB,eAAe,CAAC,gBAAgB,eAAe,CAAC,uBAAuB,eAAe,CAAC,wBAAwB,eAAe,CAAC,mBAAmB,eAAe,CAAC,0BAA0B,eAAe,CAAC,qBAAqB,eAAe,CAAC,kBAAkB,eAAe,CAAC,eAAe,eAAe,CAAC,qBAAqB,eAAe,CAAC,4BAA4B,eAAe,CAAC,kBAAkB,eAAe,CAAC,yBAAyB,eAAe,CAAC,2BAA2B,eAAe,CAAC,yBAAyB,eAAe,CAAC,2BAA2B,eAAe,CAAC,4BAA4B,eAAe,CAAC,iBAAiB,eAAe,CAAC,mBAAmB,eAAe,CAAC,mBAAmB,eAAe,CAAC,iBAAiB,eAAe,CAAC,oBAAoB,eAAe,CAAC,iBAAiB,eAAe,CAAC,sBAAsB,eAAe,CAAC,kBAAkB,eAAe,CAAC,kBAAkB,eAAe,CAAC,gBAAgB,eAAe,CAAC,sCAAsC,eAAe,CAAC,iBAAiB,eAAe,CAAC,kBAAkB,eAAe,CAAC,mBAAmB,eAAe,CAAC,eAAe,eAAe,CAAC,cAAc,eAAe,CAAC,iBAAiB,eAAe,CAAC,kBAAkB,eAAe,CAAC,qBAAqB,eAAe,CAAC,0BAA0B,eAAe,CAAC,gCAAgC,eAAe,CAAC,+BAA+B,eAAe,CAAC,sDAAsD,eAAe,CAAC,wBAAwB,eAAe,CAAC,sBAAsB,eAAe,CAAC,wBAAwB,eAAe,CAAC,uCAAuC,eAAe,CAAC,yBAAyB,eAAe,CAAC,yBAAyB,eAAe,CAAC,iBAAiB,eAAe,CAAC,2BAA2B,eAAe,CAAC,qBAAqB,eAAe,CAAC,kBAAkB,eAAe,CAAC,6DAA6D,eAAe,CAAC,kDAAkD,eAAe,CAAC,iBAAiB,eAAe,CAAC,kBAAkB,eAAe,CAAC,kBAAkB,eAAe,CAAC,yBAAyB,eAAe,CAAC,8BAA8B,eAAe,CAAC,uBAAuB,eAAe,CAAC,qBAAqB,eAAe,CAAC,gBAAgB,eAAe,CAAC,yBAAyB,eAAe,CAAC,0BAA0B,eAAe,CAAC,kBAAkB,eAAe,CAAC,kBAAkB,eAAe,CAAC,oBAAoB,eAAe,CAAC,eAAe,eAAe,CAAC,oBAAoB,eAAe,CAAC,iBAAiB,eAAe,CAAC,eAAe,eAAe,CAAC,iBAAiB,eAAe,CAAC,gBAAgB,eAAe,CAAC,iBAAiB,eAAe,CAAC,mBAAmB,eAAe,CAAC,0BAA0B,eAAe,CAAC,iBAAiB,eAAe,CAAC,wBAAwB,eAAe,CAAC,mBAAmB,eAAe,CAAC,qCAAqC,eAAe,CAAC,+BAA+B,eAAe,CAAC,gBAAgB,eAAe,CAAC,mBAAmB,eAAe,CAAC,sBAAsB,eAAe,CAAC,sBAAsB,eAAe,CAAC,oBAAoB,eAAe,CAAC,sBAAsB,eAAe,CAAC,uBAAuB,eAAe,CAAC,wBAAwB,eAAe,CAAC,6BAA6B,eAAe,CAAC,0EAA0E,eAAe,CAAC,gDAAgD,eAAe,CAAC,gDAAgD,eAAe,CAAC,gDAAgD,eAAe,CAAC,uBAAuB,eAAe,CAAC,gBAAgB,eAAe,CAAC,mBAAmB,eAAe,CAAC,oBAAoB,eAAe,CAAC,wGAAwG,eAAe,CAAC,0BAA0B,eAAe,CAAC,qDAAqD,eAAe,CAAC,gCAAgC,eAAe,CAAC,sBAAsB,eAAe,CAAC,eAAe,eAAe,CAAC,2EAA2E,eAAe,CAAC,yBAAyB,eAAe,CAAC,cAAc,eAAe,CAAC,oCAAoC,eAAe,CAAC,uCAAuC,eAAe,CAAC,2CAA2C,eAAe,CAAC,mBAAmB,eAAe,CAAC,uBAAuB,eAAe,CAAC,kBAAkB,eAAe,CAAC,qBAAqB,eAAe,CAAC,mBAAmB,eAAe,CAAC,qBAAqB,eAAe,CAAC,4BAA4B,eAAe,CAAC,gBAAgB,eAAe,CAAC,6CAA6C,eAAe,CAAC,eAAe,eAAe,CAAC,sBAAsB,eAAe,CAAC,gBAAgB,eAAe,CAAC,sBAAsB,eAAe,CAAC,kBAAkB,eAAe,CAAC,gBAAgB,eAAe,CAAC,uBAAuB,eAAe,CAAC,gBAAgB,eAAe,CAAC,sBAAsB,eAAe,CAAC,kBAAkB,eAAe,CAAC,yBAAyB,eAAe,CAAC,mBAAmB,eAAe,CAAC,yBAAyB,eAAe,CAAC,uBAAuB,eAAe,CAAC,mBAAmB,eAAe,CAAC,qBAAqB,eAAe,CAAC,qBAAqB,eAAe,CAAC,sBAAsB,eAAe,CAAC,wBAAwB,eAAe,CAAC,iBAAiB,eAAe,CAAC,qBAAqB,eAAe,CAAC,cAAc,eAAe,CAAC,sBAAsB,eAAe,CAAC,uBAAuB,eAAe,CAAC,yBAAyB,eAAe,CAAC,sBAAsB,eAAe,CAAC,qBAAqB,eAAe,CAAC,sBAAsB,eAAe,CAAC,kBAAkB,eAAe,CAAC,yBAAyB,eAAe,CAAC,sBAAsB,eAAe,CAAC,qBAAqB,eAAe,CAAC,mBAAmB,eAAe,CAAC,eAAe,eAAe,CAAC,mBAAmB,eAAe,CAAC,qBAAqB,eAAe,CAAC,cAAc,eAAe,CAAC,mDAAmD,eAAe,CAAC,oBAAoB,eAAe,CAAC,sBAAsB,eAAe,CAAC,0BAA0B,eAAe,CAAC,oBAAoB,eAAe,CAAC,oBAAoB,eAAe,CAAC,mBAAmB,eAAe,CAAC,kBAAkB,eAAe,CAAC,wBAAwB,eAAe,CAAC,uBAAuB,eAAe,CAAC,oBAAoB,eAAe,CAAC,qBAAqB,eAAe,CAAC,2BAA2B,eAAe,CAAC,mBAAmB,eAAe,CAAC,gBAAgB,eAAe,CAAC,uBAAuB,eAAe,CAAC,sBAAsB,eAAe,CAAC,uBAAuB,eAAe,CAAC,qBAAqB,eAAe,CAAC,iBAAiB,eAAe,CAAC,gBAAgB,eAAe,CAAC,mBAAmB,eAAe,CAAC,2CAA2C,eAAe,CAAC,2BAA2B,eAAe,CAAC,wBAAwB,eAAe,CAAC,uBAAuB,eAAe,CAAC,sBAAsB,eAAe,CAAC,uBAAuB,eAAe,CAAC,yBAAyB,eAAe,CAAC,yBAAyB,eAAe,CAAC,kBAAkB,eAAe,CAAC,sBAAsB,eAAe,CAAC,6BAA6B,eAAe,CAAC,uBAAuB,eAAe,CAAC,oBAAoB,eAAe,CAAC,kBAAkB,eAAe,CAAC,qBAAqB,eAAe,CAAC,sBAAsB,eAAe,CAAC,gCAAgC,eAAe,CAAC,mBAAmB,eAAe,CAAC,iBAAiB,eAAe,CAAC,kBAAkB,eAAe,CAAC,kBAAkB,eAAe,CAAC,sCAAsC,eAAe,CAAC,yBAAyB,eAAe,CAAC,oBAAoB,eAAe,CAAC,wBAAwB,eAAe,CAAC,gEAAgE,eAAe,CAAC,uDAAuD,eAAe,CAAC,6CAA6C,eAAe,CAAC,gDAAgD,eAAe,CAAC,8CAA8C,eAAe,CAAC,yBAAyB,eAAe,CAAC,oBAAoB,eAAe,CAAC,wBAAwB,eAAe,CAAC,0BAA0B,eAAe,CAAC,uBAAuB,eAAe,CAAC,yBAAyB,eAAe,CAAC,kBAAkB,eAAe,CAAC,0BAA0B,eAAe,CAAC,iBAAiB,eAAe,CAAC,yBAAyB,eAAe,CAAC,uBAAuB,eAAe,CAAC,kDAAkD,eAAe,CAAC,iDAAiD,eAAe,CAAC,gDAAgD,eAAe,CAAC,qBAAqB,eAAe,CAAC,8CAA8C,eAAe,CAAC,+CAA+C,eAAe,CAAC,2BAA2B,eAAe,CAAC,yBAAyB,eAAe,CAAC,wBAAwB,eAAe,CAAC,0BAA0B,eAAe,CAAC,wBAAwB,eAAe,CAAC,qBAAqB,eAAe,CAAC,sBAAsB,eAAe,CAAC,4BAA4B,eAAe,CAAC,cAAc,eAAe,CAAC,qBAAqB,eAAe,CAAC,uBAAuB,eAAe,CAAC,yBAAyB,eAAe,CAAC,gCAAgC,eAAe,CAAC,sBAAsB,eAAe,CAAC,uBAAuB,eAAe,CAAC,kBAAkB,eAAe,CAAC,kBAAkB,eAAe,CAAC,mBAAmB,eAAe,CAAC,iBAAiB,eAAe,CAAC,6BAA6B,eAAe,CAAC,oCAAoC,eAAe,CAAC,kBAAkB,eAAe,CAAC,iBAAiB,eAAe,CAAC,kBAAkB,eAAe,CAAC,2BAA2B,eAAe,CAAC,4BAA4B,eAAe,CAAC,4BAA4B,eAAe,CAAC,4BAA4B,eAAe,CAAC,oBAAoB,eAAe,CAAC,mBAAmB,eAAe,CAAC,qBAAqB,eAAe,CAAC,iBAAiB,eAAe,CAAC,eAAe,eAAe,CAAC,sBAAsB,eAAe,CAAC,wBAAwB,eAAe,CAAC,iBAAiB,eAAe,CAAC,iBAAiB,eAAe,CAAC,qBAAqB,eAAe,CAAC,qBAAqB,eAAe,CAAC,wBAAwB,eAAe,CAAC,gBAAgB,eAAe,CAAC,2BAA2B,eAAe,CAAC,oBAAoB,eAAe,CAAC,gBAAgB,eAAe,CAAC,wBAAwB,eAAe,CAAC,eAAe,eAAe,CAAC,wBAAwB,eAAe,CAAC,oBAAoB,eAAe,CAAC,kBAAkB,eAAe,CAAC,wBAAwB,eAAe,CAAC,0BAA0B,eAAe,CAAC,uBAAuB,eAAe,CAAC,yBAAyB,eAAe,CAAC,wBAAwB,eAAe,CAAC,2BAA2B,eAAe,CAAC,mBAAmB,eAAe,CAAC,qBAAqB,eAAe,CAAC,uBAAuB,eAAe,CAAC,mBAAmB,eAAe,CAAC,kBAAkB,eAAe,CAAC,sBAAsB,eAAe,CAAC,mBAAmB,eAAe,CAAC,kBAAkB,eAAe,CAAC,4BAA4B,eAAe,CAAC,0BAA0B,eAAe,CAAC,6BAA6B,eAAe,CAAC,iBAAiB,eAAe,CAAC,6BAA6B,eAAe,CAAC,gCAAgC,eAAe,CAAC,mBAAmB,eAAe,CAAC,uCAAuC,eAAe,CAAC,2EAA2E,eAAe,CAAC,+DAA+D,eAAe,CAAC,iBAAiB,eAAe,CAAC,mBAAmB,eAAe,CAAC,4CAA4C,eAAe,CAAC,sBAAsB,eAAe,CAAC,kBAAkB,eAAe,CAAC,yBAAyB,eAAe,CAAC,oBAAoB,eAAe,CAAC,0BAA0B,eAAe,CAAC,2BAA2B,eAAe,CAAC,sBAAsB,eAAe,CAAC,uBAAuB,eAAe,CAAC,iBAAiB,eAAe,CAAC,qBAAqB,eAAe,CAAC,8DAA8D,eAAe,CAAC,sCAAsC,eAAe,CAAC,uBAAuB,eAAe,CAAC,yBAAyB,eAAe,CAAC,2BAA2B,eAAe,CAAC,kBAAkB,eAAe,CAAC,wBAAwB,eAAe,CAAC,0BAA0B,eAAe,CAAC,yCAAyC,eAAe,CAAC,6CAA6C,eAAe,CAAC,uBAAuB,eAAe,CAAC,yBAAyB,eAAe,CAAC,kBAAkB,eAAe,CAAC,oBAAoB,eAAe,CAAC,8CAA8C,eAAe,CAAC,kDAAkD,eAAe,CAAC,iBAAiB,eAAe,CAAC,0BAA0B,eAAe,CAAC,oBAAoB,eAAe,CAAC,4EAA4E,eAAe,CAAC,+DAA+D,eAAe,CAAC,qDAAqD,eAAe,CAAC,wDAAwD,eAAe,CAAC,sDAAsD,eAAe,CAAC,kBAAkB,eAAe,CAAC,kDAAkD,eAAe,CAAC,mBAAmB,eAAe,CAAC,2BAA2B,eAAe,CAAC,2BAA2B,eAAe,CAAC,0BAA0B,eAAe,CAAC,mDAAmD,eAAe,CAAC,uDAAuD,eAAe,CAAC,oBAAoB,eAAe,CAAC,gBAAgB,eAAe,CAAC,gBAAgB,eAAe,CAAC,gBAAgB,eAAe,CAAC,mBAAmB,eAAe,CAAC,mBAAmB,eAAe,CAAC,qBAAqB,eAAe,CAAC,uBAAuB,eAAe,CAAC,uBAAuB,eAAe,CAAC,sBAAsB,eAAe,CAAC,kBAAkB,eAAe,CAAC,SAAS,iBAAiB,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,eAAe,CAAC,qBAAqB,CAAC,QAAQ,CAAC,mDAAmD,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS\",\"sourcesContent\":[\"/*!\\n * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\\n * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\\n */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\\\";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\\\";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\\\";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\\\";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:\\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\\\"\\\\f000\\\"}.fa-music:before{content:\\\"\\\\f001\\\"}.fa-search:before{content:\\\"\\\\f002\\\"}.fa-envelope-o:before{content:\\\"\\\\f003\\\"}.fa-heart:before{content:\\\"\\\\f004\\\"}.fa-star:before{content:\\\"\\\\f005\\\"}.fa-star-o:before{content:\\\"\\\\f006\\\"}.fa-user:before{content:\\\"\\\\f007\\\"}.fa-film:before{content:\\\"\\\\f008\\\"}.fa-th-large:before{content:\\\"\\\\f009\\\"}.fa-th:before{content:\\\"\\\\f00a\\\"}.fa-th-list:before{content:\\\"\\\\f00b\\\"}.fa-check:before{content:\\\"\\\\f00c\\\"}.fa-remove:before,.fa-close:before,.fa-times:before{content:\\\"\\\\f00d\\\"}.fa-search-plus:before{content:\\\"\\\\f00e\\\"}.fa-search-minus:before{content:\\\"\\\\f010\\\"}.fa-power-off:before{content:\\\"\\\\f011\\\"}.fa-signal:before{content:\\\"\\\\f012\\\"}.fa-gear:before,.fa-cog:before{content:\\\"\\\\f013\\\"}.fa-trash-o:before{content:\\\"\\\\f014\\\"}.fa-home:before{content:\\\"\\\\f015\\\"}.fa-file-o:before{content:\\\"\\\\f016\\\"}.fa-clock-o:before{content:\\\"\\\\f017\\\"}.fa-road:before{content:\\\"\\\\f018\\\"}.fa-download:before{content:\\\"\\\\f019\\\"}.fa-arrow-circle-o-down:before{content:\\\"\\\\f01a\\\"}.fa-arrow-circle-o-up:before{content:\\\"\\\\f01b\\\"}.fa-inbox:before{content:\\\"\\\\f01c\\\"}.fa-play-circle-o:before{content:\\\"\\\\f01d\\\"}.fa-rotate-right:before,.fa-repeat:before{content:\\\"\\\\f01e\\\"}.fa-refresh:before{content:\\\"\\\\f021\\\"}.fa-list-alt:before{content:\\\"\\\\f022\\\"}.fa-lock:before{content:\\\"\\\\f023\\\"}.fa-flag:before{content:\\\"\\\\f024\\\"}.fa-headphones:before{content:\\\"\\\\f025\\\"}.fa-volume-off:before{content:\\\"\\\\f026\\\"}.fa-volume-down:before{content:\\\"\\\\f027\\\"}.fa-volume-up:before{content:\\\"\\\\f028\\\"}.fa-qrcode:before{content:\\\"\\\\f029\\\"}.fa-barcode:before{content:\\\"\\\\f02a\\\"}.fa-tag:before{content:\\\"\\\\f02b\\\"}.fa-tags:before{content:\\\"\\\\f02c\\\"}.fa-book:before{content:\\\"\\\\f02d\\\"}.fa-bookmark:before{content:\\\"\\\\f02e\\\"}.fa-print:before{content:\\\"\\\\f02f\\\"}.fa-camera:before{content:\\\"\\\\f030\\\"}.fa-font:before{content:\\\"\\\\f031\\\"}.fa-bold:before{content:\\\"\\\\f032\\\"}.fa-italic:before{content:\\\"\\\\f033\\\"}.fa-text-height:before{content:\\\"\\\\f034\\\"}.fa-text-width:before{content:\\\"\\\\f035\\\"}.fa-align-left:before{content:\\\"\\\\f036\\\"}.fa-align-center:before{content:\\\"\\\\f037\\\"}.fa-align-right:before{content:\\\"\\\\f038\\\"}.fa-align-justify:before{content:\\\"\\\\f039\\\"}.fa-list:before{content:\\\"\\\\f03a\\\"}.fa-dedent:before,.fa-outdent:before{content:\\\"\\\\f03b\\\"}.fa-indent:before{content:\\\"\\\\f03c\\\"}.fa-video-camera:before{content:\\\"\\\\f03d\\\"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:\\\"\\\\f03e\\\"}.fa-pencil:before{content:\\\"\\\\f040\\\"}.fa-map-marker:before{content:\\\"\\\\f041\\\"}.fa-adjust:before{content:\\\"\\\\f042\\\"}.fa-tint:before{content:\\\"\\\\f043\\\"}.fa-edit:before,.fa-pencil-square-o:before{content:\\\"\\\\f044\\\"}.fa-share-square-o:before{content:\\\"\\\\f045\\\"}.fa-check-square-o:before{content:\\\"\\\\f046\\\"}.fa-arrows:before{content:\\\"\\\\f047\\\"}.fa-step-backward:before{content:\\\"\\\\f048\\\"}.fa-fast-backward:before{content:\\\"\\\\f049\\\"}.fa-backward:before{content:\\\"\\\\f04a\\\"}.fa-play:before{content:\\\"\\\\f04b\\\"}.fa-pause:before{content:\\\"\\\\f04c\\\"}.fa-stop:before{content:\\\"\\\\f04d\\\"}.fa-forward:before{content:\\\"\\\\f04e\\\"}.fa-fast-forward:before{content:\\\"\\\\f050\\\"}.fa-step-forward:before{content:\\\"\\\\f051\\\"}.fa-eject:before{content:\\\"\\\\f052\\\"}.fa-chevron-left:before{content:\\\"\\\\f053\\\"}.fa-chevron-right:before{content:\\\"\\\\f054\\\"}.fa-plus-circle:before{content:\\\"\\\\f055\\\"}.fa-minus-circle:before{content:\\\"\\\\f056\\\"}.fa-times-circle:before{content:\\\"\\\\f057\\\"}.fa-check-circle:before{content:\\\"\\\\f058\\\"}.fa-question-circle:before{content:\\\"\\\\f059\\\"}.fa-info-circle:before{content:\\\"\\\\f05a\\\"}.fa-crosshairs:before{content:\\\"\\\\f05b\\\"}.fa-times-circle-o:before{content:\\\"\\\\f05c\\\"}.fa-check-circle-o:before{content:\\\"\\\\f05d\\\"}.fa-ban:before{content:\\\"\\\\f05e\\\"}.fa-arrow-left:before{content:\\\"\\\\f060\\\"}.fa-arrow-right:before{content:\\\"\\\\f061\\\"}.fa-arrow-up:before{content:\\\"\\\\f062\\\"}.fa-arrow-down:before{content:\\\"\\\\f063\\\"}.fa-mail-forward:before,.fa-share:before{content:\\\"\\\\f064\\\"}.fa-expand:before{content:\\\"\\\\f065\\\"}.fa-compress:before{content:\\\"\\\\f066\\\"}.fa-plus:before{content:\\\"\\\\f067\\\"}.fa-minus:before{content:\\\"\\\\f068\\\"}.fa-asterisk:before{content:\\\"\\\\f069\\\"}.fa-exclamation-circle:before{content:\\\"\\\\f06a\\\"}.fa-gift:before{content:\\\"\\\\f06b\\\"}.fa-leaf:before{content:\\\"\\\\f06c\\\"}.fa-fire:before{content:\\\"\\\\f06d\\\"}.fa-eye:before{content:\\\"\\\\f06e\\\"}.fa-eye-slash:before{content:\\\"\\\\f070\\\"}.fa-warning:before,.fa-exclamation-triangle:before{content:\\\"\\\\f071\\\"}.fa-plane:before{content:\\\"\\\\f072\\\"}.fa-calendar:before{content:\\\"\\\\f073\\\"}.fa-random:before{content:\\\"\\\\f074\\\"}.fa-comment:before{content:\\\"\\\\f075\\\"}.fa-magnet:before{content:\\\"\\\\f076\\\"}.fa-chevron-up:before{content:\\\"\\\\f077\\\"}.fa-chevron-down:before{content:\\\"\\\\f078\\\"}.fa-retweet:before{content:\\\"\\\\f079\\\"}.fa-shopping-cart:before{content:\\\"\\\\f07a\\\"}.fa-folder:before{content:\\\"\\\\f07b\\\"}.fa-folder-open:before{content:\\\"\\\\f07c\\\"}.fa-arrows-v:before{content:\\\"\\\\f07d\\\"}.fa-arrows-h:before{content:\\\"\\\\f07e\\\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\\\"\\\\f080\\\"}.fa-twitter-square:before{content:\\\"\\\\f081\\\"}.fa-facebook-square:before{content:\\\"\\\\f082\\\"}.fa-camera-retro:before{content:\\\"\\\\f083\\\"}.fa-key:before{content:\\\"\\\\f084\\\"}.fa-gears:before,.fa-cogs:before{content:\\\"\\\\f085\\\"}.fa-comments:before{content:\\\"\\\\f086\\\"}.fa-thumbs-o-up:before{content:\\\"\\\\f087\\\"}.fa-thumbs-o-down:before{content:\\\"\\\\f088\\\"}.fa-star-half:before{content:\\\"\\\\f089\\\"}.fa-heart-o:before{content:\\\"\\\\f08a\\\"}.fa-sign-out:before{content:\\\"\\\\f08b\\\"}.fa-linkedin-square:before{content:\\\"\\\\f08c\\\"}.fa-thumb-tack:before{content:\\\"\\\\f08d\\\"}.fa-external-link:before{content:\\\"\\\\f08e\\\"}.fa-sign-in:before{content:\\\"\\\\f090\\\"}.fa-trophy:before{content:\\\"\\\\f091\\\"}.fa-github-square:before{content:\\\"\\\\f092\\\"}.fa-upload:before{content:\\\"\\\\f093\\\"}.fa-lemon-o:before{content:\\\"\\\\f094\\\"}.fa-phone:before{content:\\\"\\\\f095\\\"}.fa-square-o:before{content:\\\"\\\\f096\\\"}.fa-bookmark-o:before{content:\\\"\\\\f097\\\"}.fa-phone-square:before{content:\\\"\\\\f098\\\"}.fa-twitter:before{content:\\\"\\\\f099\\\"}.fa-facebook-f:before,.fa-facebook:before{content:\\\"\\\\f09a\\\"}.fa-github:before{content:\\\"\\\\f09b\\\"}.fa-unlock:before{content:\\\"\\\\f09c\\\"}.fa-credit-card:before{content:\\\"\\\\f09d\\\"}.fa-feed:before,.fa-rss:before{content:\\\"\\\\f09e\\\"}.fa-hdd-o:before{content:\\\"\\\\f0a0\\\"}.fa-bullhorn:before{content:\\\"\\\\f0a1\\\"}.fa-bell:before{content:\\\"\\\\f0f3\\\"}.fa-certificate:before{content:\\\"\\\\f0a3\\\"}.fa-hand-o-right:before{content:\\\"\\\\f0a4\\\"}.fa-hand-o-left:before{content:\\\"\\\\f0a5\\\"}.fa-hand-o-up:before{content:\\\"\\\\f0a6\\\"}.fa-hand-o-down:before{content:\\\"\\\\f0a7\\\"}.fa-arrow-circle-left:before{content:\\\"\\\\f0a8\\\"}.fa-arrow-circle-right:before{content:\\\"\\\\f0a9\\\"}.fa-arrow-circle-up:before{content:\\\"\\\\f0aa\\\"}.fa-arrow-circle-down:before{content:\\\"\\\\f0ab\\\"}.fa-globe:before{content:\\\"\\\\f0ac\\\"}.fa-wrench:before{content:\\\"\\\\f0ad\\\"}.fa-tasks:before{content:\\\"\\\\f0ae\\\"}.fa-filter:before{content:\\\"\\\\f0b0\\\"}.fa-briefcase:before{content:\\\"\\\\f0b1\\\"}.fa-arrows-alt:before{content:\\\"\\\\f0b2\\\"}.fa-group:before,.fa-users:before{content:\\\"\\\\f0c0\\\"}.fa-chain:before,.fa-link:before{content:\\\"\\\\f0c1\\\"}.fa-cloud:before{content:\\\"\\\\f0c2\\\"}.fa-flask:before{content:\\\"\\\\f0c3\\\"}.fa-cut:before,.fa-scissors:before{content:\\\"\\\\f0c4\\\"}.fa-copy:before,.fa-files-o:before{content:\\\"\\\\f0c5\\\"}.fa-paperclip:before{content:\\\"\\\\f0c6\\\"}.fa-save:before,.fa-floppy-o:before{content:\\\"\\\\f0c7\\\"}.fa-square:before{content:\\\"\\\\f0c8\\\"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:\\\"\\\\f0c9\\\"}.fa-list-ul:before{content:\\\"\\\\f0ca\\\"}.fa-list-ol:before{content:\\\"\\\\f0cb\\\"}.fa-strikethrough:before{content:\\\"\\\\f0cc\\\"}.fa-underline:before{content:\\\"\\\\f0cd\\\"}.fa-table:before{content:\\\"\\\\f0ce\\\"}.fa-magic:before{content:\\\"\\\\f0d0\\\"}.fa-truck:before{content:\\\"\\\\f0d1\\\"}.fa-pinterest:before{content:\\\"\\\\f0d2\\\"}.fa-pinterest-square:before{content:\\\"\\\\f0d3\\\"}.fa-google-plus-square:before{content:\\\"\\\\f0d4\\\"}.fa-google-plus:before{content:\\\"\\\\f0d5\\\"}.fa-money:before{content:\\\"\\\\f0d6\\\"}.fa-caret-down:before{content:\\\"\\\\f0d7\\\"}.fa-caret-up:before{content:\\\"\\\\f0d8\\\"}.fa-caret-left:before{content:\\\"\\\\f0d9\\\"}.fa-caret-right:before{content:\\\"\\\\f0da\\\"}.fa-columns:before{content:\\\"\\\\f0db\\\"}.fa-unsorted:before,.fa-sort:before{content:\\\"\\\\f0dc\\\"}.fa-sort-down:before,.fa-sort-desc:before{content:\\\"\\\\f0dd\\\"}.fa-sort-up:before,.fa-sort-asc:before{content:\\\"\\\\f0de\\\"}.fa-envelope:before{content:\\\"\\\\f0e0\\\"}.fa-linkedin:before{content:\\\"\\\\f0e1\\\"}.fa-rotate-left:before,.fa-undo:before{content:\\\"\\\\f0e2\\\"}.fa-legal:before,.fa-gavel:before{content:\\\"\\\\f0e3\\\"}.fa-dashboard:before,.fa-tachometer:before{content:\\\"\\\\f0e4\\\"}.fa-comment-o:before{content:\\\"\\\\f0e5\\\"}.fa-comments-o:before{content:\\\"\\\\f0e6\\\"}.fa-flash:before,.fa-bolt:before{content:\\\"\\\\f0e7\\\"}.fa-sitemap:before{content:\\\"\\\\f0e8\\\"}.fa-umbrella:before{content:\\\"\\\\f0e9\\\"}.fa-paste:before,.fa-clipboard:before{content:\\\"\\\\f0ea\\\"}.fa-lightbulb-o:before{content:\\\"\\\\f0eb\\\"}.fa-exchange:before{content:\\\"\\\\f0ec\\\"}.fa-cloud-download:before{content:\\\"\\\\f0ed\\\"}.fa-cloud-upload:before{content:\\\"\\\\f0ee\\\"}.fa-user-md:before{content:\\\"\\\\f0f0\\\"}.fa-stethoscope:before{content:\\\"\\\\f0f1\\\"}.fa-suitcase:before{content:\\\"\\\\f0f2\\\"}.fa-bell-o:before{content:\\\"\\\\f0a2\\\"}.fa-coffee:before{content:\\\"\\\\f0f4\\\"}.fa-cutlery:before{content:\\\"\\\\f0f5\\\"}.fa-file-text-o:before{content:\\\"\\\\f0f6\\\"}.fa-building-o:before{content:\\\"\\\\f0f7\\\"}.fa-hospital-o:before{content:\\\"\\\\f0f8\\\"}.fa-ambulance:before{content:\\\"\\\\f0f9\\\"}.fa-medkit:before{content:\\\"\\\\f0fa\\\"}.fa-fighter-jet:before{content:\\\"\\\\f0fb\\\"}.fa-beer:before{content:\\\"\\\\f0fc\\\"}.fa-h-square:before{content:\\\"\\\\f0fd\\\"}.fa-plus-square:before{content:\\\"\\\\f0fe\\\"}.fa-angle-double-left:before{content:\\\"\\\\f100\\\"}.fa-angle-double-right:before{content:\\\"\\\\f101\\\"}.fa-angle-double-up:before{content:\\\"\\\\f102\\\"}.fa-angle-double-down:before{content:\\\"\\\\f103\\\"}.fa-angle-left:before{content:\\\"\\\\f104\\\"}.fa-angle-right:before{content:\\\"\\\\f105\\\"}.fa-angle-up:before{content:\\\"\\\\f106\\\"}.fa-angle-down:before{content:\\\"\\\\f107\\\"}.fa-desktop:before{content:\\\"\\\\f108\\\"}.fa-laptop:before{content:\\\"\\\\f109\\\"}.fa-tablet:before{content:\\\"\\\\f10a\\\"}.fa-mobile-phone:before,.fa-mobile:before{content:\\\"\\\\f10b\\\"}.fa-circle-o:before{content:\\\"\\\\f10c\\\"}.fa-quote-left:before{content:\\\"\\\\f10d\\\"}.fa-quote-right:before{content:\\\"\\\\f10e\\\"}.fa-spinner:before{content:\\\"\\\\f110\\\"}.fa-circle:before{content:\\\"\\\\f111\\\"}.fa-mail-reply:before,.fa-reply:before{content:\\\"\\\\f112\\\"}.fa-github-alt:before{content:\\\"\\\\f113\\\"}.fa-folder-o:before{content:\\\"\\\\f114\\\"}.fa-folder-open-o:before{content:\\\"\\\\f115\\\"}.fa-smile-o:before{content:\\\"\\\\f118\\\"}.fa-frown-o:before{content:\\\"\\\\f119\\\"}.fa-meh-o:before{content:\\\"\\\\f11a\\\"}.fa-gamepad:before{content:\\\"\\\\f11b\\\"}.fa-keyboard-o:before{content:\\\"\\\\f11c\\\"}.fa-flag-o:before{content:\\\"\\\\f11d\\\"}.fa-flag-checkered:before{content:\\\"\\\\f11e\\\"}.fa-terminal:before{content:\\\"\\\\f120\\\"}.fa-code:before{content:\\\"\\\\f121\\\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\\\"\\\\f122\\\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\\\"\\\\f123\\\"}.fa-location-arrow:before{content:\\\"\\\\f124\\\"}.fa-crop:before{content:\\\"\\\\f125\\\"}.fa-code-fork:before{content:\\\"\\\\f126\\\"}.fa-unlink:before,.fa-chain-broken:before{content:\\\"\\\\f127\\\"}.fa-question:before{content:\\\"\\\\f128\\\"}.fa-info:before{content:\\\"\\\\f129\\\"}.fa-exclamation:before{content:\\\"\\\\f12a\\\"}.fa-superscript:before{content:\\\"\\\\f12b\\\"}.fa-subscript:before{content:\\\"\\\\f12c\\\"}.fa-eraser:before{content:\\\"\\\\f12d\\\"}.fa-puzzle-piece:before{content:\\\"\\\\f12e\\\"}.fa-microphone:before{content:\\\"\\\\f130\\\"}.fa-microphone-slash:before{content:\\\"\\\\f131\\\"}.fa-shield:before{content:\\\"\\\\f132\\\"}.fa-calendar-o:before{content:\\\"\\\\f133\\\"}.fa-fire-extinguisher:before{content:\\\"\\\\f134\\\"}.fa-rocket:before{content:\\\"\\\\f135\\\"}.fa-maxcdn:before{content:\\\"\\\\f136\\\"}.fa-chevron-circle-left:before{content:\\\"\\\\f137\\\"}.fa-chevron-circle-right:before{content:\\\"\\\\f138\\\"}.fa-chevron-circle-up:before{content:\\\"\\\\f139\\\"}.fa-chevron-circle-down:before{content:\\\"\\\\f13a\\\"}.fa-html5:before{content:\\\"\\\\f13b\\\"}.fa-css3:before{content:\\\"\\\\f13c\\\"}.fa-anchor:before{content:\\\"\\\\f13d\\\"}.fa-unlock-alt:before{content:\\\"\\\\f13e\\\"}.fa-bullseye:before{content:\\\"\\\\f140\\\"}.fa-ellipsis-h:before{content:\\\"\\\\f141\\\"}.fa-ellipsis-v:before{content:\\\"\\\\f142\\\"}.fa-rss-square:before{content:\\\"\\\\f143\\\"}.fa-play-circle:before{content:\\\"\\\\f144\\\"}.fa-ticket:before{content:\\\"\\\\f145\\\"}.fa-minus-square:before{content:\\\"\\\\f146\\\"}.fa-minus-square-o:before{content:\\\"\\\\f147\\\"}.fa-level-up:before{content:\\\"\\\\f148\\\"}.fa-level-down:before{content:\\\"\\\\f149\\\"}.fa-check-square:before{content:\\\"\\\\f14a\\\"}.fa-pencil-square:before{content:\\\"\\\\f14b\\\"}.fa-external-link-square:before{content:\\\"\\\\f14c\\\"}.fa-share-square:before{content:\\\"\\\\f14d\\\"}.fa-compass:before{content:\\\"\\\\f14e\\\"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:\\\"\\\\f150\\\"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:\\\"\\\\f151\\\"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:\\\"\\\\f152\\\"}.fa-euro:before,.fa-eur:before{content:\\\"\\\\f153\\\"}.fa-gbp:before{content:\\\"\\\\f154\\\"}.fa-dollar:before,.fa-usd:before{content:\\\"\\\\f155\\\"}.fa-rupee:before,.fa-inr:before{content:\\\"\\\\f156\\\"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:\\\"\\\\f157\\\"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:\\\"\\\\f158\\\"}.fa-won:before,.fa-krw:before{content:\\\"\\\\f159\\\"}.fa-bitcoin:before,.fa-btc:before{content:\\\"\\\\f15a\\\"}.fa-file:before{content:\\\"\\\\f15b\\\"}.fa-file-text:before{content:\\\"\\\\f15c\\\"}.fa-sort-alpha-asc:before{content:\\\"\\\\f15d\\\"}.fa-sort-alpha-desc:before{content:\\\"\\\\f15e\\\"}.fa-sort-amount-asc:before{content:\\\"\\\\f160\\\"}.fa-sort-amount-desc:before{content:\\\"\\\\f161\\\"}.fa-sort-numeric-asc:before{content:\\\"\\\\f162\\\"}.fa-sort-numeric-desc:before{content:\\\"\\\\f163\\\"}.fa-thumbs-up:before{content:\\\"\\\\f164\\\"}.fa-thumbs-down:before{content:\\\"\\\\f165\\\"}.fa-youtube-square:before{content:\\\"\\\\f166\\\"}.fa-youtube:before{content:\\\"\\\\f167\\\"}.fa-xing:before{content:\\\"\\\\f168\\\"}.fa-xing-square:before{content:\\\"\\\\f169\\\"}.fa-youtube-play:before{content:\\\"\\\\f16a\\\"}.fa-dropbox:before{content:\\\"\\\\f16b\\\"}.fa-stack-overflow:before{content:\\\"\\\\f16c\\\"}.fa-instagram:before{content:\\\"\\\\f16d\\\"}.fa-flickr:before{content:\\\"\\\\f16e\\\"}.fa-adn:before{content:\\\"\\\\f170\\\"}.fa-bitbucket:before{content:\\\"\\\\f171\\\"}.fa-bitbucket-square:before{content:\\\"\\\\f172\\\"}.fa-tumblr:before{content:\\\"\\\\f173\\\"}.fa-tumblr-square:before{content:\\\"\\\\f174\\\"}.fa-long-arrow-down:before{content:\\\"\\\\f175\\\"}.fa-long-arrow-up:before{content:\\\"\\\\f176\\\"}.fa-long-arrow-left:before{content:\\\"\\\\f177\\\"}.fa-long-arrow-right:before{content:\\\"\\\\f178\\\"}.fa-apple:before{content:\\\"\\\\f179\\\"}.fa-windows:before{content:\\\"\\\\f17a\\\"}.fa-android:before{content:\\\"\\\\f17b\\\"}.fa-linux:before{content:\\\"\\\\f17c\\\"}.fa-dribbble:before{content:\\\"\\\\f17d\\\"}.fa-skype:before{content:\\\"\\\\f17e\\\"}.fa-foursquare:before{content:\\\"\\\\f180\\\"}.fa-trello:before{content:\\\"\\\\f181\\\"}.fa-female:before{content:\\\"\\\\f182\\\"}.fa-male:before{content:\\\"\\\\f183\\\"}.fa-gittip:before,.fa-gratipay:before{content:\\\"\\\\f184\\\"}.fa-sun-o:before{content:\\\"\\\\f185\\\"}.fa-moon-o:before{content:\\\"\\\\f186\\\"}.fa-archive:before{content:\\\"\\\\f187\\\"}.fa-bug:before{content:\\\"\\\\f188\\\"}.fa-vk:before{content:\\\"\\\\f189\\\"}.fa-weibo:before{content:\\\"\\\\f18a\\\"}.fa-renren:before{content:\\\"\\\\f18b\\\"}.fa-pagelines:before{content:\\\"\\\\f18c\\\"}.fa-stack-exchange:before{content:\\\"\\\\f18d\\\"}.fa-arrow-circle-o-right:before{content:\\\"\\\\f18e\\\"}.fa-arrow-circle-o-left:before{content:\\\"\\\\f190\\\"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:\\\"\\\\f191\\\"}.fa-dot-circle-o:before{content:\\\"\\\\f192\\\"}.fa-wheelchair:before{content:\\\"\\\\f193\\\"}.fa-vimeo-square:before{content:\\\"\\\\f194\\\"}.fa-turkish-lira:before,.fa-try:before{content:\\\"\\\\f195\\\"}.fa-plus-square-o:before{content:\\\"\\\\f196\\\"}.fa-space-shuttle:before{content:\\\"\\\\f197\\\"}.fa-slack:before{content:\\\"\\\\f198\\\"}.fa-envelope-square:before{content:\\\"\\\\f199\\\"}.fa-wordpress:before{content:\\\"\\\\f19a\\\"}.fa-openid:before{content:\\\"\\\\f19b\\\"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:\\\"\\\\f19c\\\"}.fa-mortar-board:before,.fa-graduation-cap:before{content:\\\"\\\\f19d\\\"}.fa-yahoo:before{content:\\\"\\\\f19e\\\"}.fa-google:before{content:\\\"\\\\f1a0\\\"}.fa-reddit:before{content:\\\"\\\\f1a1\\\"}.fa-reddit-square:before{content:\\\"\\\\f1a2\\\"}.fa-stumbleupon-circle:before{content:\\\"\\\\f1a3\\\"}.fa-stumbleupon:before{content:\\\"\\\\f1a4\\\"}.fa-delicious:before{content:\\\"\\\\f1a5\\\"}.fa-digg:before{content:\\\"\\\\f1a6\\\"}.fa-pied-piper-pp:before{content:\\\"\\\\f1a7\\\"}.fa-pied-piper-alt:before{content:\\\"\\\\f1a8\\\"}.fa-drupal:before{content:\\\"\\\\f1a9\\\"}.fa-joomla:before{content:\\\"\\\\f1aa\\\"}.fa-language:before{content:\\\"\\\\f1ab\\\"}.fa-fax:before{content:\\\"\\\\f1ac\\\"}.fa-building:before{content:\\\"\\\\f1ad\\\"}.fa-child:before{content:\\\"\\\\f1ae\\\"}.fa-paw:before{content:\\\"\\\\f1b0\\\"}.fa-spoon:before{content:\\\"\\\\f1b1\\\"}.fa-cube:before{content:\\\"\\\\f1b2\\\"}.fa-cubes:before{content:\\\"\\\\f1b3\\\"}.fa-behance:before{content:\\\"\\\\f1b4\\\"}.fa-behance-square:before{content:\\\"\\\\f1b5\\\"}.fa-steam:before{content:\\\"\\\\f1b6\\\"}.fa-steam-square:before{content:\\\"\\\\f1b7\\\"}.fa-recycle:before{content:\\\"\\\\f1b8\\\"}.fa-automobile:before,.fa-car:before{content:\\\"\\\\f1b9\\\"}.fa-cab:before,.fa-taxi:before{content:\\\"\\\\f1ba\\\"}.fa-tree:before{content:\\\"\\\\f1bb\\\"}.fa-spotify:before{content:\\\"\\\\f1bc\\\"}.fa-deviantart:before{content:\\\"\\\\f1bd\\\"}.fa-soundcloud:before{content:\\\"\\\\f1be\\\"}.fa-database:before{content:\\\"\\\\f1c0\\\"}.fa-file-pdf-o:before{content:\\\"\\\\f1c1\\\"}.fa-file-word-o:before{content:\\\"\\\\f1c2\\\"}.fa-file-excel-o:before{content:\\\"\\\\f1c3\\\"}.fa-file-powerpoint-o:before{content:\\\"\\\\f1c4\\\"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:\\\"\\\\f1c5\\\"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:\\\"\\\\f1c6\\\"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:\\\"\\\\f1c7\\\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\\\"\\\\f1c8\\\"}.fa-file-code-o:before{content:\\\"\\\\f1c9\\\"}.fa-vine:before{content:\\\"\\\\f1ca\\\"}.fa-codepen:before{content:\\\"\\\\f1cb\\\"}.fa-jsfiddle:before{content:\\\"\\\\f1cc\\\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:\\\"\\\\f1cd\\\"}.fa-circle-o-notch:before{content:\\\"\\\\f1ce\\\"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:\\\"\\\\f1d0\\\"}.fa-ge:before,.fa-empire:before{content:\\\"\\\\f1d1\\\"}.fa-git-square:before{content:\\\"\\\\f1d2\\\"}.fa-git:before{content:\\\"\\\\f1d3\\\"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:\\\"\\\\f1d4\\\"}.fa-tencent-weibo:before{content:\\\"\\\\f1d5\\\"}.fa-qq:before{content:\\\"\\\\f1d6\\\"}.fa-wechat:before,.fa-weixin:before{content:\\\"\\\\f1d7\\\"}.fa-send:before,.fa-paper-plane:before{content:\\\"\\\\f1d8\\\"}.fa-send-o:before,.fa-paper-plane-o:before{content:\\\"\\\\f1d9\\\"}.fa-history:before{content:\\\"\\\\f1da\\\"}.fa-circle-thin:before{content:\\\"\\\\f1db\\\"}.fa-header:before{content:\\\"\\\\f1dc\\\"}.fa-paragraph:before{content:\\\"\\\\f1dd\\\"}.fa-sliders:before{content:\\\"\\\\f1de\\\"}.fa-share-alt:before{content:\\\"\\\\f1e0\\\"}.fa-share-alt-square:before{content:\\\"\\\\f1e1\\\"}.fa-bomb:before{content:\\\"\\\\f1e2\\\"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:\\\"\\\\f1e3\\\"}.fa-tty:before{content:\\\"\\\\f1e4\\\"}.fa-binoculars:before{content:\\\"\\\\f1e5\\\"}.fa-plug:before{content:\\\"\\\\f1e6\\\"}.fa-slideshare:before{content:\\\"\\\\f1e7\\\"}.fa-twitch:before{content:\\\"\\\\f1e8\\\"}.fa-yelp:before{content:\\\"\\\\f1e9\\\"}.fa-newspaper-o:before{content:\\\"\\\\f1ea\\\"}.fa-wifi:before{content:\\\"\\\\f1eb\\\"}.fa-calculator:before{content:\\\"\\\\f1ec\\\"}.fa-paypal:before{content:\\\"\\\\f1ed\\\"}.fa-google-wallet:before{content:\\\"\\\\f1ee\\\"}.fa-cc-visa:before{content:\\\"\\\\f1f0\\\"}.fa-cc-mastercard:before{content:\\\"\\\\f1f1\\\"}.fa-cc-discover:before{content:\\\"\\\\f1f2\\\"}.fa-cc-amex:before{content:\\\"\\\\f1f3\\\"}.fa-cc-paypal:before{content:\\\"\\\\f1f4\\\"}.fa-cc-stripe:before{content:\\\"\\\\f1f5\\\"}.fa-bell-slash:before{content:\\\"\\\\f1f6\\\"}.fa-bell-slash-o:before{content:\\\"\\\\f1f7\\\"}.fa-trash:before{content:\\\"\\\\f1f8\\\"}.fa-copyright:before{content:\\\"\\\\f1f9\\\"}.fa-at:before{content:\\\"\\\\f1fa\\\"}.fa-eyedropper:before{content:\\\"\\\\f1fb\\\"}.fa-paint-brush:before{content:\\\"\\\\f1fc\\\"}.fa-birthday-cake:before{content:\\\"\\\\f1fd\\\"}.fa-area-chart:before{content:\\\"\\\\f1fe\\\"}.fa-pie-chart:before{content:\\\"\\\\f200\\\"}.fa-line-chart:before{content:\\\"\\\\f201\\\"}.fa-lastfm:before{content:\\\"\\\\f202\\\"}.fa-lastfm-square:before{content:\\\"\\\\f203\\\"}.fa-toggle-off:before{content:\\\"\\\\f204\\\"}.fa-toggle-on:before{content:\\\"\\\\f205\\\"}.fa-bicycle:before{content:\\\"\\\\f206\\\"}.fa-bus:before{content:\\\"\\\\f207\\\"}.fa-ioxhost:before{content:\\\"\\\\f208\\\"}.fa-angellist:before{content:\\\"\\\\f209\\\"}.fa-cc:before{content:\\\"\\\\f20a\\\"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:\\\"\\\\f20b\\\"}.fa-meanpath:before{content:\\\"\\\\f20c\\\"}.fa-buysellads:before{content:\\\"\\\\f20d\\\"}.fa-connectdevelop:before{content:\\\"\\\\f20e\\\"}.fa-dashcube:before{content:\\\"\\\\f210\\\"}.fa-forumbee:before{content:\\\"\\\\f211\\\"}.fa-leanpub:before{content:\\\"\\\\f212\\\"}.fa-sellsy:before{content:\\\"\\\\f213\\\"}.fa-shirtsinbulk:before{content:\\\"\\\\f214\\\"}.fa-simplybuilt:before{content:\\\"\\\\f215\\\"}.fa-skyatlas:before{content:\\\"\\\\f216\\\"}.fa-cart-plus:before{content:\\\"\\\\f217\\\"}.fa-cart-arrow-down:before{content:\\\"\\\\f218\\\"}.fa-diamond:before{content:\\\"\\\\f219\\\"}.fa-ship:before{content:\\\"\\\\f21a\\\"}.fa-user-secret:before{content:\\\"\\\\f21b\\\"}.fa-motorcycle:before{content:\\\"\\\\f21c\\\"}.fa-street-view:before{content:\\\"\\\\f21d\\\"}.fa-heartbeat:before{content:\\\"\\\\f21e\\\"}.fa-venus:before{content:\\\"\\\\f221\\\"}.fa-mars:before{content:\\\"\\\\f222\\\"}.fa-mercury:before{content:\\\"\\\\f223\\\"}.fa-intersex:before,.fa-transgender:before{content:\\\"\\\\f224\\\"}.fa-transgender-alt:before{content:\\\"\\\\f225\\\"}.fa-venus-double:before{content:\\\"\\\\f226\\\"}.fa-mars-double:before{content:\\\"\\\\f227\\\"}.fa-venus-mars:before{content:\\\"\\\\f228\\\"}.fa-mars-stroke:before{content:\\\"\\\\f229\\\"}.fa-mars-stroke-v:before{content:\\\"\\\\f22a\\\"}.fa-mars-stroke-h:before{content:\\\"\\\\f22b\\\"}.fa-neuter:before{content:\\\"\\\\f22c\\\"}.fa-genderless:before{content:\\\"\\\\f22d\\\"}.fa-facebook-official:before{content:\\\"\\\\f230\\\"}.fa-pinterest-p:before{content:\\\"\\\\f231\\\"}.fa-whatsapp:before{content:\\\"\\\\f232\\\"}.fa-server:before{content:\\\"\\\\f233\\\"}.fa-user-plus:before{content:\\\"\\\\f234\\\"}.fa-user-times:before{content:\\\"\\\\f235\\\"}.fa-hotel:before,.fa-bed:before{content:\\\"\\\\f236\\\"}.fa-viacoin:before{content:\\\"\\\\f237\\\"}.fa-train:before{content:\\\"\\\\f238\\\"}.fa-subway:before{content:\\\"\\\\f239\\\"}.fa-medium:before{content:\\\"\\\\f23a\\\"}.fa-yc:before,.fa-y-combinator:before{content:\\\"\\\\f23b\\\"}.fa-optin-monster:before{content:\\\"\\\\f23c\\\"}.fa-opencart:before{content:\\\"\\\\f23d\\\"}.fa-expeditedssl:before{content:\\\"\\\\f23e\\\"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:\\\"\\\\f240\\\"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:\\\"\\\\f241\\\"}.fa-battery-2:before,.fa-battery-half:before{content:\\\"\\\\f242\\\"}.fa-battery-1:before,.fa-battery-quarter:before{content:\\\"\\\\f243\\\"}.fa-battery-0:before,.fa-battery-empty:before{content:\\\"\\\\f244\\\"}.fa-mouse-pointer:before{content:\\\"\\\\f245\\\"}.fa-i-cursor:before{content:\\\"\\\\f246\\\"}.fa-object-group:before{content:\\\"\\\\f247\\\"}.fa-object-ungroup:before{content:\\\"\\\\f248\\\"}.fa-sticky-note:before{content:\\\"\\\\f249\\\"}.fa-sticky-note-o:before{content:\\\"\\\\f24a\\\"}.fa-cc-jcb:before{content:\\\"\\\\f24b\\\"}.fa-cc-diners-club:before{content:\\\"\\\\f24c\\\"}.fa-clone:before{content:\\\"\\\\f24d\\\"}.fa-balance-scale:before{content:\\\"\\\\f24e\\\"}.fa-hourglass-o:before{content:\\\"\\\\f250\\\"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:\\\"\\\\f251\\\"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:\\\"\\\\f252\\\"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:\\\"\\\\f253\\\"}.fa-hourglass:before{content:\\\"\\\\f254\\\"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:\\\"\\\\f255\\\"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:\\\"\\\\f256\\\"}.fa-hand-scissors-o:before{content:\\\"\\\\f257\\\"}.fa-hand-lizard-o:before{content:\\\"\\\\f258\\\"}.fa-hand-spock-o:before{content:\\\"\\\\f259\\\"}.fa-hand-pointer-o:before{content:\\\"\\\\f25a\\\"}.fa-hand-peace-o:before{content:\\\"\\\\f25b\\\"}.fa-trademark:before{content:\\\"\\\\f25c\\\"}.fa-registered:before{content:\\\"\\\\f25d\\\"}.fa-creative-commons:before{content:\\\"\\\\f25e\\\"}.fa-gg:before{content:\\\"\\\\f260\\\"}.fa-gg-circle:before{content:\\\"\\\\f261\\\"}.fa-tripadvisor:before{content:\\\"\\\\f262\\\"}.fa-odnoklassniki:before{content:\\\"\\\\f263\\\"}.fa-odnoklassniki-square:before{content:\\\"\\\\f264\\\"}.fa-get-pocket:before{content:\\\"\\\\f265\\\"}.fa-wikipedia-w:before{content:\\\"\\\\f266\\\"}.fa-safari:before{content:\\\"\\\\f267\\\"}.fa-chrome:before{content:\\\"\\\\f268\\\"}.fa-firefox:before{content:\\\"\\\\f269\\\"}.fa-opera:before{content:\\\"\\\\f26a\\\"}.fa-internet-explorer:before{content:\\\"\\\\f26b\\\"}.fa-tv:before,.fa-television:before{content:\\\"\\\\f26c\\\"}.fa-contao:before{content:\\\"\\\\f26d\\\"}.fa-500px:before{content:\\\"\\\\f26e\\\"}.fa-amazon:before{content:\\\"\\\\f270\\\"}.fa-calendar-plus-o:before{content:\\\"\\\\f271\\\"}.fa-calendar-minus-o:before{content:\\\"\\\\f272\\\"}.fa-calendar-times-o:before{content:\\\"\\\\f273\\\"}.fa-calendar-check-o:before{content:\\\"\\\\f274\\\"}.fa-industry:before{content:\\\"\\\\f275\\\"}.fa-map-pin:before{content:\\\"\\\\f276\\\"}.fa-map-signs:before{content:\\\"\\\\f277\\\"}.fa-map-o:before{content:\\\"\\\\f278\\\"}.fa-map:before{content:\\\"\\\\f279\\\"}.fa-commenting:before{content:\\\"\\\\f27a\\\"}.fa-commenting-o:before{content:\\\"\\\\f27b\\\"}.fa-houzz:before{content:\\\"\\\\f27c\\\"}.fa-vimeo:before{content:\\\"\\\\f27d\\\"}.fa-black-tie:before{content:\\\"\\\\f27e\\\"}.fa-fonticons:before{content:\\\"\\\\f280\\\"}.fa-reddit-alien:before{content:\\\"\\\\f281\\\"}.fa-edge:before{content:\\\"\\\\f282\\\"}.fa-credit-card-alt:before{content:\\\"\\\\f283\\\"}.fa-codiepie:before{content:\\\"\\\\f284\\\"}.fa-modx:before{content:\\\"\\\\f285\\\"}.fa-fort-awesome:before{content:\\\"\\\\f286\\\"}.fa-usb:before{content:\\\"\\\\f287\\\"}.fa-product-hunt:before{content:\\\"\\\\f288\\\"}.fa-mixcloud:before{content:\\\"\\\\f289\\\"}.fa-scribd:before{content:\\\"\\\\f28a\\\"}.fa-pause-circle:before{content:\\\"\\\\f28b\\\"}.fa-pause-circle-o:before{content:\\\"\\\\f28c\\\"}.fa-stop-circle:before{content:\\\"\\\\f28d\\\"}.fa-stop-circle-o:before{content:\\\"\\\\f28e\\\"}.fa-shopping-bag:before{content:\\\"\\\\f290\\\"}.fa-shopping-basket:before{content:\\\"\\\\f291\\\"}.fa-hashtag:before{content:\\\"\\\\f292\\\"}.fa-bluetooth:before{content:\\\"\\\\f293\\\"}.fa-bluetooth-b:before{content:\\\"\\\\f294\\\"}.fa-percent:before{content:\\\"\\\\f295\\\"}.fa-gitlab:before{content:\\\"\\\\f296\\\"}.fa-wpbeginner:before{content:\\\"\\\\f297\\\"}.fa-wpforms:before{content:\\\"\\\\f298\\\"}.fa-envira:before{content:\\\"\\\\f299\\\"}.fa-universal-access:before{content:\\\"\\\\f29a\\\"}.fa-wheelchair-alt:before{content:\\\"\\\\f29b\\\"}.fa-question-circle-o:before{content:\\\"\\\\f29c\\\"}.fa-blind:before{content:\\\"\\\\f29d\\\"}.fa-audio-description:before{content:\\\"\\\\f29e\\\"}.fa-volume-control-phone:before{content:\\\"\\\\f2a0\\\"}.fa-braille:before{content:\\\"\\\\f2a1\\\"}.fa-assistive-listening-systems:before{content:\\\"\\\\f2a2\\\"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:\\\"\\\\f2a3\\\"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:\\\"\\\\f2a4\\\"}.fa-glide:before{content:\\\"\\\\f2a5\\\"}.fa-glide-g:before{content:\\\"\\\\f2a6\\\"}.fa-signing:before,.fa-sign-language:before{content:\\\"\\\\f2a7\\\"}.fa-low-vision:before{content:\\\"\\\\f2a8\\\"}.fa-viadeo:before{content:\\\"\\\\f2a9\\\"}.fa-viadeo-square:before{content:\\\"\\\\f2aa\\\"}.fa-snapchat:before{content:\\\"\\\\f2ab\\\"}.fa-snapchat-ghost:before{content:\\\"\\\\f2ac\\\"}.fa-snapchat-square:before{content:\\\"\\\\f2ad\\\"}.fa-pied-piper:before{content:\\\"\\\\f2ae\\\"}.fa-first-order:before{content:\\\"\\\\f2b0\\\"}.fa-yoast:before{content:\\\"\\\\f2b1\\\"}.fa-themeisle:before{content:\\\"\\\\f2b2\\\"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:\\\"\\\\f2b3\\\"}.fa-fa:before,.fa-font-awesome:before{content:\\\"\\\\f2b4\\\"}.fa-handshake-o:before{content:\\\"\\\\f2b5\\\"}.fa-envelope-open:before{content:\\\"\\\\f2b6\\\"}.fa-envelope-open-o:before{content:\\\"\\\\f2b7\\\"}.fa-linode:before{content:\\\"\\\\f2b8\\\"}.fa-address-book:before{content:\\\"\\\\f2b9\\\"}.fa-address-book-o:before{content:\\\"\\\\f2ba\\\"}.fa-vcard:before,.fa-address-card:before{content:\\\"\\\\f2bb\\\"}.fa-vcard-o:before,.fa-address-card-o:before{content:\\\"\\\\f2bc\\\"}.fa-user-circle:before{content:\\\"\\\\f2bd\\\"}.fa-user-circle-o:before{content:\\\"\\\\f2be\\\"}.fa-user-o:before{content:\\\"\\\\f2c0\\\"}.fa-id-badge:before{content:\\\"\\\\f2c1\\\"}.fa-drivers-license:before,.fa-id-card:before{content:\\\"\\\\f2c2\\\"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:\\\"\\\\f2c3\\\"}.fa-quora:before{content:\\\"\\\\f2c4\\\"}.fa-free-code-camp:before{content:\\\"\\\\f2c5\\\"}.fa-telegram:before{content:\\\"\\\\f2c6\\\"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:\\\"\\\\f2c7\\\"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:\\\"\\\\f2c8\\\"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:\\\"\\\\f2c9\\\"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:\\\"\\\\f2ca\\\"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:\\\"\\\\f2cb\\\"}.fa-shower:before{content:\\\"\\\\f2cc\\\"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:\\\"\\\\f2cd\\\"}.fa-podcast:before{content:\\\"\\\\f2ce\\\"}.fa-window-maximize:before{content:\\\"\\\\f2d0\\\"}.fa-window-minimize:before{content:\\\"\\\\f2d1\\\"}.fa-window-restore:before{content:\\\"\\\\f2d2\\\"}.fa-times-rectangle:before,.fa-window-close:before{content:\\\"\\\\f2d3\\\"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:\\\"\\\\f2d4\\\"}.fa-bandcamp:before{content:\\\"\\\\f2d5\\\"}.fa-grav:before{content:\\\"\\\\f2d6\\\"}.fa-etsy:before{content:\\\"\\\\f2d7\\\"}.fa-imdb:before{content:\\\"\\\\f2d8\\\"}.fa-ravelry:before{content:\\\"\\\\f2d9\\\"}.fa-eercast:before{content:\\\"\\\\f2da\\\"}.fa-microchip:before{content:\\\"\\\\f2db\\\"}.fa-snowflake-o:before{content:\\\"\\\\f2dc\\\"}.fa-superpowers:before{content:\\\"\\\\f2dd\\\"}.fa-wpexplorer:before{content:\\\"\\\\f2de\\\"}.fa-meetup:before{content:\\\"\\\\f2e0\\\"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".lds-default {\\n display: inline-block;\\n position: relative;\\n width: 80px;\\n height: 80px;\\n}\\n.lds-default div {\\n position: absolute;\\n width: 6px;\\n height: 6px;\\n background: #475466;\\n border-radius: 50%;\\n animation: lds-default 1.2s linear infinite;\\n}\\n.lds-default div:nth-child(1) {\\n animation-delay: 0s;\\n top: 37px;\\n left: 66px;\\n}\\n.lds-default div:nth-child(2) {\\n animation-delay: -0.1s;\\n top: 22px;\\n left: 62px;\\n}\\n.lds-default div:nth-child(3) {\\n animation-delay: -0.2s;\\n top: 11px;\\n left: 52px;\\n}\\n.lds-default div:nth-child(4) {\\n animation-delay: -0.3s;\\n top: 7px;\\n left: 37px;\\n}\\n.lds-default div:nth-child(5) {\\n animation-delay: -0.4s;\\n top: 11px;\\n left: 22px;\\n}\\n.lds-default div:nth-child(6) {\\n animation-delay: -0.5s;\\n top: 22px;\\n left: 11px;\\n}\\n.lds-default div:nth-child(7) {\\n animation-delay: -0.6s;\\n top: 37px;\\n left: 7px;\\n}\\n.lds-default div:nth-child(8) {\\n animation-delay: -0.7s;\\n top: 52px;\\n left: 11px;\\n}\\n.lds-default div:nth-child(9) {\\n animation-delay: -0.8s;\\n top: 62px;\\n left: 22px;\\n}\\n.lds-default div:nth-child(10) {\\n animation-delay: -0.9s;\\n top: 66px;\\n left: 37px;\\n}\\n.lds-default div:nth-child(11) {\\n animation-delay: -1s;\\n top: 62px;\\n left: 52px;\\n}\\n.lds-default div:nth-child(12) {\\n animation-delay: -1.1s;\\n top: 52px;\\n left: 62px;\\n}\\n@keyframes lds-default {\\n 0%, 20%, 80%, 100% {\\n transform: scale(1);\\n }\\n 50% {\\n transform: scale(1.5);\\n }\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./styles/loader.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,qBAAqB;EACrB,kBAAkB;EAClB,WAAW;EACX,YAAY;AACd;AACA;EACE,kBAAkB;EAClB,UAAU;EACV,WAAW;EACX,mBAAmB;EACnB,kBAAkB;EAClB,2CAA2C;AAC7C;AACA;EACE,mBAAmB;EACnB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,QAAQ;EACR,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,SAAS;AACX;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE,oBAAoB;EACpB,SAAS;EACT,UAAU;AACZ;AACA;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;AACZ;AACA;EACE;IACE,mBAAmB;EACrB;EACA;IACE,qBAAqB;EACvB;AACF\",\"sourcesContent\":[\".lds-default {\\n display: inline-block;\\n position: relative;\\n width: 80px;\\n height: 80px;\\n}\\n.lds-default div {\\n position: absolute;\\n width: 6px;\\n height: 6px;\\n background: #475466;\\n border-radius: 50%;\\n animation: lds-default 1.2s linear infinite;\\n}\\n.lds-default div:nth-child(1) {\\n animation-delay: 0s;\\n top: 37px;\\n left: 66px;\\n}\\n.lds-default div:nth-child(2) {\\n animation-delay: -0.1s;\\n top: 22px;\\n left: 62px;\\n}\\n.lds-default div:nth-child(3) {\\n animation-delay: -0.2s;\\n top: 11px;\\n left: 52px;\\n}\\n.lds-default div:nth-child(4) {\\n animation-delay: -0.3s;\\n top: 7px;\\n left: 37px;\\n}\\n.lds-default div:nth-child(5) {\\n animation-delay: -0.4s;\\n top: 11px;\\n left: 22px;\\n}\\n.lds-default div:nth-child(6) {\\n animation-delay: -0.5s;\\n top: 22px;\\n left: 11px;\\n}\\n.lds-default div:nth-child(7) {\\n animation-delay: -0.6s;\\n top: 37px;\\n left: 7px;\\n}\\n.lds-default div:nth-child(8) {\\n animation-delay: -0.7s;\\n top: 52px;\\n left: 11px;\\n}\\n.lds-default div:nth-child(9) {\\n animation-delay: -0.8s;\\n top: 62px;\\n left: 22px;\\n}\\n.lds-default div:nth-child(10) {\\n animation-delay: -0.9s;\\n top: 66px;\\n left: 37px;\\n}\\n.lds-default div:nth-child(11) {\\n animation-delay: -1s;\\n top: 62px;\\n left: 52px;\\n}\\n.lds-default div:nth-child(12) {\\n animation-delay: -1.1s;\\n top: 52px;\\n left: 62px;\\n}\\n@keyframes lds-default {\\n 0%, 20%, 80%, 100% {\\n transform: scale(1);\\n }\\n 50% {\\n transform: scale(1.5);\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".mainSidebar.webix_sidebar.webix_dark,\\n.darkScrollview {\\n background: #444 !important;\\n}\\n.appDevDesigns {\\n background-color: rgb(68, 68, 68) !important;\\n width: 100%;\\n height: 100%;\\n background-image: url(assets/images/appdev_logo_white.png);\\n background-size: auto 110px;\\n background-repeat: no-repeat;\\n background-position: center;\\n}\\n.policyLink {\\n background-color: rgb(68, 68, 68);\\n border-width: 0px !important;\\n margin-top: 0px !important;\\n}\\na.policyMenu {\\n color: #BBB;\\n text-decoration: none;\\n}\\na.policyAuth {\\n color: #475466;\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_sidebar_icon {\\n margin-right: 15px;\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_tree_branch_1 {\\n //border-top: 1px solid rgba(255,255,255,0.1);\\n border-bottom: 1px solid rgba(0, 0, 0, 0.4);\\n box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.1);\\n}\\n.mainToolbar .webix_icon {\\n margin-top: -2px;\\n}\\n.mainToolbar.webix_toolbar.webix_dark {\\n background: #333;\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_tree_item:hover {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.mainSidebar.webix_sidebar.webix_dark\\n .webix_tree_item:hover\\n .webix_sidebar_icon {\\n color: rgba(255, 255, 255, 0.8);\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_tree_item.webix_selected,\\n.mainSidebar .webix_tree_item.webix_sidebar_selected {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #1ca1c1;\\n}\\n.mainSidebar.webix_sidebar.webix_dark\\n .webix_tree_item.webix_selected\\n .webix_icon {\\n color: #1ca1c1;\\n}\\n.webix_toolbar.webix_dark .webix_secondary.activePage button {\\n background-color: #1ca1c1 !important;\\n}\\n.webix_toolbar.webix_dark .userMenu.webix_menu-x .webix_list_item {\\n background-color: transparent;\\n padding: 3px 10px;\\n opacity: 0.7;\\n}\\n.webix_toolbar.webix_dark .inbox.webix_secondary button {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_dark .inbox.webix_secondary button .webix_icon_btn {\\n opacity: 0.7;\\n font-size: 20px;\\n}\\n.appPages .webix_button {\\n font-size: 14px;\\n color: rgba(255, 255, 255, 0.8) !important;\\n}\\n.appPages .webix_icon_btn {\\n opacity: 0.4;\\n}\\n\\n/* Styles imported from AppBuilder v1 */\\nlabel {\\n font-weight: 500;\\n}\\n/* Custom Webix Badge */\\n.webix_badge {\\n font-size: 8pt;\\n height: 18px;\\n line-height: 18px;\\n min-width: 18px;\\n right: 0;\\n}\\n/* Custom selectivity */\\n.webix_checksuggest_select_all .webix_el_box {\\n height: auto !important;\\n}\\n.webix_multicombo_tag,\\n.webix_multicombo_value {\\n box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.3);\\n border-bottom: 1px solid #fff;\\n margin: 3px 3px 1px;\\n max-height: 27px;\\n overflow: hidden;\\n line-height: 26px;\\n font-weight: normal;\\n color: #475466 !important;\\n}\\n.badgeContainer {\\n position: relative;\\n}\\n.webix_tooltip .webix_badge.selectivityBadge {\\n display: none;\\n}\\n.editConnectedPage {\\n margin-left: -5px;\\n margin-right: 5px;\\n opacity: 0.4;\\n}\\n.editConnectedPage:hover {\\n opacity: 1;\\n cursor: pointer;\\n}\\n.webix_tooltip .webix_multicombo_delete {\\n display: none;\\n}\\n.webix_multicombo_delete:hover:after {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n.webix_multicombo_delete:hover {\\n transform: scale(1.1);\\n}\\n.webix_multicombo_delete.clear-combo-value {\\n transition: all 0.2s ease-in-out;\\n}\\n.webix_multicombo_value {\\n display: flex;\\n /* width: 100%; */\\n}\\n.webix_multicombo_value .ellip {\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n}\\n.webix_cell .webix_multicombo_tag,\\n.webix_cell .webix_multicombo_value {\\n line-height: 26px;\\n margin: 4px 1.5px;\\n}\\n.webix_el_combo .webix_progress_state {\\n font-size: 35px !important;\\n}\\n.webix_list_item .editConnectedPage {\\n display: none;\\n}\\n.hascustomcolor {\\n color: white !important;\\n text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.3) !important;\\n}\\n.combowithcolors .webix_inp_static {\\n padding-left: 0px;\\n}\\n.webix_multicombo_delete:after {\\n color: rgba(0, 0, 0, 0.4);\\n text-shadow: none;\\n}\\n.hideWebixMulticomboTag .webix_multicombo_tag {\\n box-shadow: none;\\n padding: 0;\\n border: 0;\\n margin: 0;\\n background: transparent;\\n border-radius: 0;\\n max-height: none;\\n}\\n.selectivity-placeholder {\\n text-indent: 10px;\\n color: #666;\\n}\\n.selectivity-multiple-input-container {\\n background: transparent !important;\\n padding: 0px !important;\\n overflow: hidden !important;\\n max-height: unset;\\n /* border-radius: 6px; */\\n}\\n.selectivity-single-result-container {\\n left: 2px;\\n}\\n.selectivity-multiple-selected-item,\\n.selectivity-single-selected-item {\\n background: #337ab7 !important;\\n padding: 0 10px;\\n border-radius: 15px !important;\\n color: #fff !important;\\n line-height: 29px;\\n display: inline-block;\\n height: unset !important;\\n margin: 2px;\\n /*max-width: 100px !important;*/\\n}\\n.selectivity-multiple-input,\\ninput[type=\\\"text\\\"].selectivity-multiple-input {\\n height: 33px;\\n text-indent: 10px;\\n}\\n.selectivity-single-selected-item-remove {\\n color: #fff;\\n float: none;\\n padding: 7px 5px 7px 0px;\\n}\\n.selectivity-multiple-selected-item-edit,\\n.selectivity-multiple-selected-item-remove {\\n padding: 5px 0 5px 5px;\\n}\\n.selectivity-single-selected-item-edit,\\n.selectivity-multiple-selected-item-edit,\\n.selectivity-single-selected-item-edit:hover,\\n.selectivity-multiple-selected-item-edit:hover {\\n color: #fff;\\n cursor: pointer;\\n text-decoration: none !important;\\n background: #1ca1c1;\\n margin-left: -9pt;\\n padding: 5px 5px 5px 10px;\\n margin-right: 5px;\\n}\\n.customField {\\n line-height: 33px;\\n}\\n.customField .selectivity-multiple-input-container {\\n border: 1px solid #ccd7e6;\\n /* border-radius: 6px; */\\n margin-right: 4px;\\n}\\n.readonlyField {\\n background-color: #fff;\\n}\\n.selectivity-single-select {\\n background: transparent !important;\\n}\\n.webix_cell .form-entry {\\n border: 0;\\n}\\n.form-entry {\\n border-radius: 6px;\\n height: 100%;\\n border: 1px solid #ddd;\\n color: #666;\\n background: #fff;\\n border-color: #ccc;\\n margin-right: 2px;\\n}\\n.form-entry .selectivity-multiple-selected-item {\\n float: none;\\n}\\n.webix_template .selectivity-single-select {\\n padding: 0;\\n border: 1px solid #ccd7e6;\\n /* border-radius: 6px; */\\n margin-right: 4px;\\n}\\n.selectivity-single-select input {\\n padding: 0;\\n border: 0;\\n}\\n.selectivity-single-selected-item {\\n color: #666;\\n}\\n.selectivity-single-result-container {\\n top: 0em !important;\\n}\\n.selectivity-caret {\\n top: 0.4em !important;\\n}\\n.selectivityBadge {\\n top: 6px;\\n right: -5px;\\n background: #aaa;\\n}\\n.list-data-values,\\n.connect-data-values {\\n position: relative;\\n}\\n\\n.ab-app-list-info {\\n float: left;\\n height: 100%;\\n}\\n.ab-tree-ui .webix_scroll_cont .webix_tree_leaves {\\n display: block !important;\\n}\\n.ab-app-list-edit,\\n.ab-object-list-edit,\\n.ab-page-list-edit {\\n float: right;\\n height: 100%;\\n opacity: 0.6;\\n}\\n.ab-app-list-edit:hover,\\n.ab-object-list-edit:hover,\\n.ab-page-list-edit:hover {\\n opacity: 1;\\n}\\n.ab-app-list-edit .webix_list_item {\\n line-height: 50px;\\n}\\n.ab-app-list-edit .webix_icon {\\n line-height: 59px;\\n}\\n.ab-app-list-item {\\n height: 100%;\\n clear: both;\\n}\\n.ab-app-list-edit .webix_list_item {\\n padding: 10px;\\n}\\n.ab-app-list-name {\\n font-size: 20px;\\n line-height: 20px;\\n margin-top: 10px;\\n}\\n.ab-app-list-description {\\n opacity: 0.6;\\n}\\n\\n.webix_list_item .webix_icon {\\n font-size: inherit;\\n}\\n.webix_list_item .webix_icon.wxi-checkbox-marked {\\n font-size: 20px;\\n}\\n.emptypane {\\n line-height: auto;\\n}\\n.opsportal-area-site-default-appbuilder a,\\n.webix_view a {\\n opacity: 1;\\n}\\n.webix_list_item.menu.selected {\\n background: #657584;\\n}\\n.webix_icon_btn {\\n font-size: 20px;\\n}\\n.appTitle .webix_el_box {\\n font-size: 20px !important;\\n}\\n.webix_dark .webix_icon_btn {\\n opacity: 0.4;\\n}\\n.ab_amp .webix_dark .webix_icon_btn {\\n opacity: 1;\\n}\\n.webix_el_button button {\\n /* font-size: 14px; */\\n}\\n.webix_el_button button.webixtype_standard:hover {\\n text-decoration: underline;\\n}\\n.webix_menu-x .webix_list_item {\\n line-height: 31px;\\n}\\n.bg-white {\\n background: white;\\n}\\n.ab-component-tools {\\n position: absolute;\\n top: 2px;\\n right: 33px;\\n}\\n.ab-component-tools.ab-tab-tools {\\n right: 0;\\n z-index: 100;\\n}\\n.ab-component-remove,\\n.ab-component-edit {\\n width: 31px;\\n height: 31px;\\n display: inline-block;\\n margin-right: 1px;\\n font-size: 18px;\\n text-align: center;\\n line-height: 33px !important;\\n background: #4caf50;\\n color: white;\\n top: -2px;\\n position: relative;\\n overflow: hidden;\\n float: right;\\n}\\n.ab-component-remove:hover,\\n.ab-component-edit:hover {\\n cursor: pointer;\\n}\\n.ab-component-remove {\\n background: #ff3b30;\\n}\\n.panel_icon {\\n font-size: 16px;\\n width: 22px;\\n height: 24px;\\n line-height: 24px;\\n}\\n.webix_fieldset_label {\\n width: auto;\\n margin-bottom: 0;\\n border: 0;\\n}\\n.ab-widget-header {\\n background: #eee;\\n}\\n.ab-component-header .webix_el_box {\\n font-size: 24px;\\n}\\n.ab-component-description .webix_el_box {\\n color: #666;\\n}\\n.bg_gray {\\n background-color: #ebedf0;\\n}\\n.noBackground, .webix_dark .webix_sidebar {\\n background-color: transparent;\\n}\\n.webix_dark .webix_view {\\n background-color: transparent;\\n color: white;\\n}\\n.ab_amp .webix_dark .webix_view {\\n background-color: white;\\n color: inherit;\\n}\\n.webix_dark .webix_list-x .webix_list_item {\\n border-right: 0;\\n}\\n.ab-text .ab-detail-component-holder {\\n line-height: 32px;\\n}\\n.webix_tree_checkbox {\\n margin: 5px 6px 0 0 !important;\\n height: 14px;\\n width: 14px;\\n}\\n.ab-menu-left .webix_scroll_cont {\\n text-align: left;\\n}\\n.ab-menu-right .webix_scroll_cont {\\n text-align: right;\\n}\\n.ab-menu-center .webix_scroll_cont {\\n text-align: center;\\n}\\n.ab-menu-link.webix_menu-x .webix_list_item {\\n background: transparent;\\n color: #337ab7;\\n font-weight: bold;\\n padding: 0;\\n margin-right: 15px;\\n}\\n.ab-menu-link.webix_menu-x .webix_list_item:hover {\\n text-decoration: underline;\\n}\\n.ab-custom-field {\\n overflow: visible;\\n}\\n.ab-custom-field .webix_template {\\n padding: 0;\\n}\\n.ab-custom-field legend {\\n border-bottom: none;\\n}\\n\\n.ab-component-form-rule {\\n background-color: #dcdcdc;\\n}\\n.ab-main-container .webix_querybuilder_wrap .webix_layout_form,\\n.ab-main-container .ab-component-form-rules .webix_layout_form {\\n background: inherit !important;\\n}\\n.ab-component-form-rules .webix_view {\\n background: transparent !important;\\n}\\n.ab-component-form-rules {\\n background: #ddd;\\n border-radius: 5px;\\n box-shadow: inset 0px 2px 5px 0px rgba(0, 0, 0, 0.4);\\n position: relative;\\n overflow: visible;\\n}\\n.ab-component-form-rules-delete {\\n background: transparent;\\n}\\n.ab-component-form-rules-delete .ab-component-remove {\\n position: absolute;\\n top: -6px;\\n right: -8px;\\n border-radius: 100%;\\n}\\n/* Connect object data */\\n.ab-connect-add-new a.fa {\\n width: 35px;\\n height: 35px;\\n display: block;\\n float: left;\\n border-radius: 4px;\\n background: #1ca1c1;\\n color: white;\\n opacity: 1;\\n text-align: center;\\n line-height: 35px;\\n}\\n.ab-connect-add-new a.fa:hover {\\n text-decoration: none;\\n background-color: #1992af;\\n}\\n.ab-connect-data-info {\\n display: inline-block;\\n width: 90px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.ab-connect-data-disable {\\n background-color: #aaa;\\n}\\n.stop-scrolling {\\n height: 100%;\\n overflow: hidden;\\n}\\n.ab-scroll-y {\\n overflow-y: auto !important;\\n}\\n.ab-ellipses-text,\\n.ab-ellipses-text > div {\\n overflow: hidden;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n}\\n.webix_dtable .webix_ss_footer .webix_hcell:hover,\\n.webix_dtable .webix_ss_header .webix_hcell:hover {\\n border-right-color: #dadee0;\\n}\\n\\n/* Interface Editor */\\n.ab-widget-header {\\n background-color: #ddd;\\n}\\n.ab-widget-header .webix_icon_btn {\\n opacity: 0.7;\\n margin-left: 5px;\\n}\\n.ab-main-container .widget_drag {\\n position: absolute;\\n z-index: 1;\\n top: 0px;\\n right: 0px;\\n width: 33px;\\n opacity: 1;\\n cursor: move;\\n background-color: #aaa;\\n height: 31px;\\n color: #fff;\\n}\\n.ab-main-container .widget_drag:hover {\\n opacity: 0.8;\\n}\\n.ab-main-container .widget_drag .webix_icon {\\n line-height: 28px;\\n width: 33px;\\n height: 33px;\\n text-align: center;\\n}\\n.webix_el_checkbox .webix_label_right {\\n padding-top: 0;\\n}\\n.webix_cell .ab-image-data-field {\\n /* pointer-events: none; */\\n padding: 0;\\n}\\n.ab-image-holder, .ab-image-holder .webix_template {\\n padding: 0;\\n overflow: visible;\\n}\\n.ab-image-data-field {\\n width: 100%;\\n height: 100%;\\n}\\n.ab-image-data-field-download {\\n position: absolute;\\n left: 0;\\n background-color: #dcdcdc;\\n padding: 3px 1px 1px 1px;\\n opacity: 0.5 !important;\\n text-decoration: none;\\n color: #000;\\n}\\n.ab-image-data-field-download:hover {\\n opacity: 1 !important;\\n text-decoration: none;\\n color: #000;\\n}\\n.detailsView .webix_icon:hover,\\n.edit .webix_icon:hover,\\n.trash .webix_icon:hover {\\n cursor: pointer;\\n}\\n.ab-layout-header {\\n position: relative;\\n}\\n.ab-layout-header > .ab-component-tools {\\n right: 0px;\\n}\\n\\n.transparent {\\n background: transparent !important;\\n}\\n.borderless {\\n border: none !important;\\n}\\n.nopadding {\\n padding: 0 !important;\\n}\\n.nomargin {\\n margin: 0 !important;\\n}\\n.webix_modal {\\n opacity: 0.8;\\n}\\n.modal_title .webix_el_box {\\n font-size: 18px;\\n}\\n/* Loading Screen */\\n.ab-loading-screen {\\n background: #000;\\n opacity: 0.7;\\n position: absolute !important;\\n}\\n.ab-loading-body {\\n background: #000;\\n border-width: 0px !important;\\n}\\n.ab-loading-message {\\n color: #fff !important;\\n background: #000 !important;\\n font-size: 30px !important;\\n text-align: center;\\n vertical-align: middle;\\n border-width: 0px !important;\\n padding-top: 20% !important;\\n height: 100px !important;\\n}\\n.ab-loading-button {\\n text-align: center;\\n}\\n.ab-loading-button button {\\n background-color: #003b7e;\\n width: 200px;\\n}\\n.ab-loading-cancel-button {\\n text-align: center;\\n background: transparent;\\n}\\n.ab-loading-cancel-button a {\\n color: #fff !important;\\n}\\n.ab-loading-screen .webix_progress_bottom {\\n height: 40px !important;\\n opacity: 1;\\n}\\n.ab-loading-screen .webix_progress_bottom .webix_progress_state {\\n height: 40px !important;\\n}\\n.webix_menu-x .webix_list_item:last-child {\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_menu-x .webix_list_item:first-child {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n}\\n.preview_item {\\n background: #999;\\n}\\n.panel_drag_view {\\n border-width: 0 1px 1px 1px;\\n border-color: 1px solid #dadee0;\\n border-style: solid;\\n}\\n.panel_drag_view:before {\\n content: \\\"\\\";\\n display: block;\\n height: 100%;\\n width: 100%;\\n background: rgb(255, 255, 255);\\n background: linear-gradient(\\n 0deg,\\n rgba(255, 255, 255, 1) 15%,\\n rgba(255, 255, 255, 0) 80%\\n );\\n position: absolute;\\n z-index: 1;\\n top: 31px;\\n}\\n.ab-datacollection-table .ab-component-in-page {\\n text-align: center;\\n line-height: 15px;\\n vertical-align: middle;\\n display: table-cell;\\n}\\n.ab-datacollection-table .webix_dataview_item {\\n display: table;\\n}\\n.ab-datacollection-table .fa {\\n color: #337ab7;\\n margin-bottom: 10px;\\n}\\n.ab-datacollection-table.borderless .webix_dataview_item,\\n.borderless .webix_dataview_item {\\n border: none;\\n padding: 12px;\\n}\\n.ab-datacollection-table .webix_dataview_item:hover {\\n background: #edeff0;\\n border-radius: 5px;\\n}\\n.webix_list_item:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected,\\n.webix_all_tabs .webix_item_tab.webix_selected:hover,\\n.webix_all_tabs .webix_item_tab.webix_selected:active,\\n.webix_all_tabs .webix_item_tab.webix_selected:focus {\\n color: white;\\n background: #1ca1c199 !important;\\n box-shadow: inset 0 -3px #1ca1c1;\\n}\\n.webix_all_tabs .webix_item_tab,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon {\\n box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.25);\\n background: #ebedf0;\\n}\\n.ab-tab-back:hover,\\n.ab-tab-next:hover,\\n.ab-tab-up:hover,\\n.ab-tab-down:hover {\\n cursor: e-resize;\\n opacity: 1;\\n}\\n.ab-tab-back:hover {\\n cursor: w-resize;\\n}\\n.ab-tab-up:hover {\\n cursor: n-resize;\\n opacity: 1;\\n}\\n.ab-tab-down:hover {\\n cursor: s-resize;\\n}\\n.ab-tab-back,\\n.ab-tab-next,\\n.ab-tab-up,\\n.ab-tab-down {\\n float: left;\\n margin-left: 10px;\\n background: #1ca1c1;\\n opacity: 0.8;\\n width: 20px;\\n height: 20px;\\n border-radius: 10px;\\n line-height: 18px;\\n padding-right: 2px;\\n color: white;\\n}\\n.ab-tab-edit {\\n opacity: 0.4;\\n}\\n.ab-tab-edit:hover {\\n opacity: 1;\\n}\\n.ab-tab-next {\\n float: right;\\n margin-right: 10px;\\n padding-left: 6px;\\n}\\n.ab-tab-up,\\n.ab-tab-down {\\n float: right;\\n margin: 12px -2px 12px 15px;\\n padding-left: 6px;\\n}\\n.webix_all_tabs div:nth-child(1) .ab-tab-back {\\n display: none;\\n}\\n.webix_all_tabs div:nth-last-child(1) .ab-tab-next {\\n display: none;\\n}\\n.webix_tab_filler:nth-last-child(1) {\\n width: 17px !important;\\n}\\n.ab-tabview-scrollview {\\n /* margin-top: -1px; */\\n}\\n.ab-tabIconContainer {\\n display: inline-block;\\n}\\n\\n.webix_view.webix_control.webix_el_tabbar.webix_dark {\\n background: #4a4e58;\\n}\\n.webix_el_tabbar.webix_dark .webix_all_tabs .webix_item_tab {\\n background: transparent;\\n color: white;\\n}\\n.webix_el_tabbar.webix_dark .webix_all_tabs .webix_item_tab:hover {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n.webix_sidebar.webix_dark .webix_tree_item.webix_selected span {\\n color: white;\\n}\\n.webix_sidebar.webix_dark\\n .webix_tree_item.webix_selected\\n span.webix_sidebar_icon {\\n color: inherit;\\n}\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_inp_counter_next,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_inp_counter_prev,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_menu-x .webix_list_item,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_segment_0,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_segment_1,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_segment_N,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webixtype_base,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webixtype_next,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webixtype_prev {\\n border-color: rgba(0, 0, 0, 0.1);\\n}\\n.webix_tree_none {\\n /* display: none; */\\n}\\n.ab-background-lightgray {\\n background: #c0c5cc;\\n}\\n.ab-background-gray {\\n background: #475466;\\n}\\n.ab-background-gray::before {\\n content: \\\"\\\";\\n background: #475466;\\n display: block;\\n position: absolute;\\n left: 0;\\n width: 100%;\\n height: 100vh;\\n}\\n.ab-background-gray .webix_view.webix_layout_form {\\n background: transparent;\\n}\\n.webix_carousel .image {\\n background: #333;\\n}\\n.webix_nav_panel .webix_nav_item {\\n box-sizing: border-box;\\n}\\n.ab-carousel-image-container {\\n position: relative;\\n height: 100%;\\n}\\n.ab-carousel-image-container img {\\n width: 100%;\\n height: 100%;\\n object-fit: contain;\\n}\\n.ab-carousel-image-title {\\n position: absolute;\\n top: 0;\\n left: 0;\\n font-size: 18px;\\n padding: 4px;\\n background: rgba(0, 0, 0, 0.4);\\n border-bottom-right-radius: 8px;\\n color: #fff;\\n}\\n.ab-carousel-image-icon {\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n font-size: 20px;\\n border-bottom-left-radius: 8px;\\n background: rgba(255, 255, 255, 0.4);\\n}\\n.ab-carousel-image-icon span {\\n opacity: 0.6;\\n margin: 6px;\\n}\\n.ab-carousel-image-icon span:hover {\\n opacity: 1;\\n cursor: pointer;\\n}\\n.webix_carousel.fullscreen .ab-carousel-fullscreen {\\n display: none;\\n}\\n.ab-detail-view .webix_accordionitem {\\n border-radius: 5px;\\n box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 2px 0px;\\n border-color: transparent;\\n}\\n.ab-detail-page.ab-detail-hover .webix_accordionitem:hover {\\n box-shadow: rgba(0, 0, 0, 0.2) 0px 3px 2px 0px;\\n}\\n.ab-detail-page .webix_accordionitem:hover .webix_accordionitem_body:after {\\n background: #1da1c14f;\\n width: 100%;\\n height: 100%;\\n display: block;\\n position: absolute;\\n cursor: pointer;\\n top: 0;\\n font-family: \\\"FontAwesome\\\";\\n content: \\\"\\\";\\n color: white;\\n text-align: center;\\n font-size: 72px;\\n vertical-align: middle;\\n}\\n.ab-edit-page .webix_accordionitem:hover {\\n position: relative;\\n}\\n.ab-edit-page .webix_accordionitem:hover .webix_accordionitem_header {\\n display: block !important;\\n position: absolute;\\n right: 0;\\n top: 0;\\n border: 0;\\n z-index: 1;\\n border-bottom-left-radius: 10px;\\n}\\n.ab-edit-page\\n .webix_accordionitem:hover\\n .webix_accordionitem_header\\n .webix_accordionitem_button:before {\\n content: \\\"\\\\f013\\\";\\n font-family: \\\"FontAwesome\\\";\\n color: #94a1b3;\\n}\\n.ab-edit-page.ab-detail-page\\n .webix_accordionitem:hover\\n .webix_accordionitem_header\\n .webix_accordionitem_button:before {\\n color: white;\\n}\\n.ab-edit-page\\n .webix_accordionitem\\n .webix_accordionitem_header:hover\\n .webix_accordionitem_button:before {\\n color: #94a1b3 !important;\\n}\\n.ab-custom-template .webix_template {\\n padding: 10px;\\n}\\n\\n.image-data-field-image {\\n position: relative;\\n border: 5px solid white;\\n background-size: contain;\\n background-position: center;\\n overflow: visible;\\n background-repeat: no-repeat;\\n background-color: #333;\\n}\\n.ab-delete-photo {\\n position: absolute;\\n top: 0;\\n right: 0;\\n}\\n.hasDataCollection {\\n color: #1ca1c1;\\n margin: 5px;\\n position: absolute;\\n right: 0;\\n background: white;\\n}\\n.sidebarCustomIcon {\\n font-family: \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n font-size: 12px !important;\\n background: #94a1b3 !important;\\n border-radius: 100%;\\n width: 20px !important;\\n height: 20px;\\n line-height: 20px;\\n color: #fff !important;\\n font-weight: bold;\\n vertical-align: unset !important;\\n}\\n.webix_dark .sidebarCustomIcon {\\n color: #4a4e58 !important;\\n}\\n.webix_dark .webix_selected .sidebarCustomIcon {\\n background: #1ca1c1 !important;\\n color: #4a4e58 !important;\\n}\\n.webix_selected .sidebarCustomIcon {\\n color: #fff !important;\\n background: #1ca1c1 !important;\\n}\\n\\n/* FormBuilder Clases */\\n.formbuilder {\\n padding: 20px;\\n}\\n.card-header .btn {\\n color: #333;\\n}\\n.card {\\n position: relative;\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-direction: column;\\n flex-direction: column;\\n min-width: 0;\\n word-wrap: break-word;\\n background-color: #fff;\\n background-clip: border-box;\\n border: 1px solid rgba(0, 0, 0, 0.125);\\n border-radius: 0.25rem;\\n}\\n\\n.card > hr {\\n margin-right: 0;\\n margin-left: 0;\\n}\\n\\n.card > .list-group:first-child .list-group-item:first-child {\\n border-top-left-radius: 0.25rem;\\n border-top-right-radius: 0.25rem;\\n}\\n\\n.card > .list-group:last-child .list-group-item:last-child {\\n border-bottom-right-radius: 0.25rem;\\n border-bottom-left-radius: 0.25rem;\\n}\\n\\n.card-body {\\n -ms-flex: 1 1 auto;\\n flex: 1 1 auto;\\n min-height: 1px;\\n padding: 1.25rem;\\n}\\n\\n.card-title {\\n margin-bottom: 0.75rem;\\n}\\n\\n.card-subtitle {\\n margin-top: -0.375rem;\\n margin-bottom: 0;\\n}\\n\\n.card-text:last-child {\\n margin-bottom: 0;\\n}\\n\\n.card-link:hover {\\n text-decoration: none;\\n}\\n\\n.card-link + .card-link {\\n margin-left: 1.25rem;\\n}\\n\\n.card-header {\\n padding: 0.75rem 1.25rem;\\n margin-bottom: 0;\\n background-color: rgba(0, 0, 0, 0.03);\\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-header:first-child {\\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\\n}\\n\\n.card-header + .list-group .list-group-item:first-child {\\n border-top: 0;\\n}\\n\\n.card-footer {\\n padding: 0.75rem 1.25rem;\\n background-color: rgba(0, 0, 0, 0.03);\\n border-top: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-footer:last-child {\\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\\n}\\n\\n.card-header-tabs {\\n margin-right: -0.625rem;\\n margin-bottom: -0.75rem;\\n margin-left: -0.625rem;\\n border-bottom: 0;\\n}\\n\\n.card-header-pills {\\n margin-right: -0.625rem;\\n margin-left: -0.625rem;\\n}\\n\\n.card-img-overlay {\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n padding: 1.25rem;\\n}\\n\\n.card-img,\\n.card-img-bottom,\\n.card-img-top {\\n -ms-flex-negative: 0;\\n flex-shrink: 0;\\n width: 100%;\\n}\\n\\n.card-img,\\n.card-img-top {\\n border-top-left-radius: calc(0.25rem - 1px);\\n border-top-right-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-img,\\n.card-img-bottom {\\n border-bottom-right-radius: calc(0.25rem - 1px);\\n border-bottom-left-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-deck .card {\\n margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n .card-deck {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-flow: row wrap;\\n flex-flow: row wrap;\\n margin-right: -15px;\\n margin-left: -15px;\\n }\\n .card-deck .card {\\n -ms-flex: 1 0 0%;\\n flex: 1 0 0%;\\n margin-right: 15px;\\n margin-bottom: 0;\\n margin-left: 15px;\\n }\\n}\\n\\n.card-group > .card {\\n margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n .card-group {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-flow: row wrap;\\n flex-flow: row wrap;\\n }\\n .card-group > .card {\\n -ms-flex: 1 0 0%;\\n flex: 1 0 0%;\\n margin-bottom: 0;\\n }\\n .card-group > .card + .card {\\n margin-left: 0;\\n border-left: 0;\\n }\\n .card-group > .card:not(:last-child) {\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n }\\n .card-group > .card:not(:last-child) .card-header,\\n .card-group > .card:not(:last-child) .card-img-top {\\n border-top-right-radius: 0;\\n }\\n .card-group > .card:not(:last-child) .card-footer,\\n .card-group > .card:not(:last-child) .card-img-bottom {\\n border-bottom-right-radius: 0;\\n }\\n .card-group > .card:not(:first-child) {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n }\\n .card-group > .card:not(:first-child) .card-header,\\n .card-group > .card:not(:first-child) .card-img-top {\\n border-top-left-radius: 0;\\n }\\n .card-group > .card:not(:first-child) .card-footer,\\n .card-group > .card:not(:first-child) .card-img-bottom {\\n border-bottom-left-radius: 0;\\n }\\n}\\n\\n.card-columns .card {\\n margin-bottom: 0.75rem;\\n}\\n\\n@media (min-width: 576px) {\\n .card-columns {\\n -webkit-column-count: 3;\\n -moz-column-count: 3;\\n column-count: 3;\\n -webkit-column-gap: 1.25rem;\\n -moz-column-gap: 1.25rem;\\n column-gap: 1.25rem;\\n orphans: 1;\\n widows: 1;\\n }\\n .card-columns .card {\\n display: inline-block;\\n width: 100%;\\n }\\n}\\n\\n.accordion > .card {\\n overflow: hidden;\\n}\\n\\n.accordion > .card:not(:last-of-type) {\\n border-bottom: 0;\\n border-bottom-right-radius: 0;\\n border-bottom-left-radius: 0;\\n}\\n\\n.accordion > .card:not(:first-of-type) {\\n border-top-left-radius: 0;\\n border-top-right-radius: 0;\\n}\\n\\n.accordion > .card > .card-header {\\n border-radius: 0;\\n margin-bottom: -1px;\\n}\\n.form-builder-group-header {\\n padding: 0;\\n}\\n.formio .btn:hover,\\n.btn:focus {\\n background-position: 0 0 !important;\\n}\\n.mb-0,\\n.my-0 {\\n margin-bottom: 0 !important;\\n}\\n.mt-0,\\n.my-0 {\\n margin-top: 0 !important;\\n}\\n.scrolly {\\n overflow: scroll;\\n}\\n.forceOpen {\\n display: block !important;\\n}\\n.formio .btn-secondary,\\n.formio-dialog .btn-secondary {\\n color: #333;\\n}\\n.formio-dialog a,\\n.formio a {\\n opacity: 1 !important;\\n}\\n.component-settings .nav > li > a {\\n margin-bottom: -7px;\\n}\\n.formio-form .input-group {\\n display: flex;\\n}\\n.formio-form .input-group-append {\\n margin-left: -1px;\\n}\\n.formio-form .input-group-append,\\n.formio-form .input-group-prepend {\\n display: -ms-flexbox;\\n display: flex;\\n}\\n.formio-form .input-group-text {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-align: center;\\n align-items: center;\\n padding: 0.375rem 0.75rem;\\n margin-bottom: 0;\\n font-size: 1rem;\\n font-weight: 400;\\n line-height: 1.5;\\n color: #495057;\\n text-align: center;\\n white-space: nowrap;\\n background-color: #e9ecef;\\n border: 1px solid #ced4da;\\n border-radius: 0.25rem;\\n}\\n.formio-form .input-group > .input-group-append > .btn,\\n.formio-form .input-group > .input-group-append > .input-group-text,\\n.formio-form\\n .input-group\\n > .input-group-prepend:first-child\\n > .btn:not(:first-child),\\n.formio-form\\n .input-group\\n > .input-group-prepend:first-child\\n > .input-group-text:not(:first-child),\\n.formio-form .input-group > .input-group-prepend:not(:first-child) > .btn,\\n.formio-form\\n .input-group\\n > .input-group-prepend:not(:first-child)\\n > .input-group-text {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n}\\n.formio-form .nav-tabs > li {\\n margin-bottom: -8px;\\n}\\n.formio-dialog .formio-form .nav-tabs > li {\\n margin-bottom: -1px;\\n}\\n.max100 {\\n max-width: 100%;\\n}\\n.webix_qb_buttons button {\\n height: auto;\\n}\\n.no-margin {\\n margin: 0 !important;\\n}\\n.ab_amp .fa-stack {\\n font-size: 0.65em;\\n}\\n.ab_amp i {\\n vertical-align: middle;\\n}\\n.ab_amp.lightgray {\\n background: #eee;\\n}\\n.ab_amp .webixLineTree:hover {\\n cursor: pointer;\\n}\\n.ab_amp .accessLevel .fa-stack {\\n vertical-align: top;\\n margin-top: 3px;\\n}\\n.ab_amp .accessLevel:hover .fa-stack {\\n transform: scale(1.25, 1.25);\\n}\\n.ab_amp .externalLink {\\n color: #ccc;\\n float: right;\\n margin-top: 5px;\\n}\\n.ab_amp .externalLink:hover {\\n color: #666 !important;\\n}\\n.ab_amp .webix_accordionitem .webix_accordionitem_button,\\n.ab_amp .webix_accordionitem.collapsed .webix_accordionitem_button {\\n float: left !important;\\n}\\n.ab_amp .webix_accordionitem .webix_accordionitem_button {\\n transform: rotate(180deg);\\n}\\n.ab_amp .webix_accordionitem.collapsed .webix_accordionitem_button {\\n transform: rotate(-90deg);\\n}\\n.ab_amp .webix_accordionitem_header {\\n background-color: #1ca1c1 !important;\\n}\\n.ab_amp .webix_accordionitem_header.collapsed {\\n background-color: white !important;\\n}\\n.ab_amp .webix_danger_inverse button {\\n border: 1px solid #ff4938;\\n color: #ff4938;\\n background: white;\\n}\\n.ab_amp .webix_danger_inverse .webix_icon_btn {\\n color: #ff4938;\\n}\\n.ab_amp .webix_danger_inverse:hover button {\\n background-color: #ff4938;\\n color: #fff;\\n}\\n.ab_amp .webix_danger_inverse:hover .webix_icon_btn {\\n color: #fff;\\n}\\ndiv.amp {\\n font-family: \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n background: rgb(28, 161, 193, 0.4);\\n /* padding: 5px 0; */\\n display: inline-block;\\n right: 0;\\n top: 75px;\\n border-top-left-radius: 10px;\\n border-bottom-left-radius: 10px;\\n color: white;\\n font-size: 16px;\\n transition: 0.25s all;\\n position: absolute;\\n width: 40px;\\n white-space: nowrap;\\n overflow: hidden;\\n height: 32px;\\n z-index: 100;\\n display: flex;\\n}\\ndiv.amp.qtt {\\n top: 108px;\\n}\\ndiv.amp div {\\n padding: 5px 10px;\\n}\\ndiv.amp div:first-child {\\n background: rgba(255, 255, 255, 0.2);\\n border-right: 1px solid rgba(255, 255, 255, 0.4);\\n padding: 5px 10px;\\n}\\ndiv.amp:hover {\\n width: 212px !important;\\n cursor: pointer;\\n background: rgb(28, 161, 193) !important;\\n}\\ndiv.amp:hover .fa-unlock-alt {\\n display: inline-block !important;\\n}\\ndiv.amp:hover .fa-lock {\\n display: none !important;\\n}\\ndiv.amp .fa-unlock-alt,\\ndiv.amp .fa-lock,\\ndiv.amp .fa-language {\\n transform: scale(1.25, 1.25);\\n text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2);\\n}\\ndiv.amp .fa-unlock-alt {\\n display: none;\\n}\\n.ampWindow .webix_toolbar.webix_dark {\\n background: #444 !important;\\n}\\n/* .accessLevel-0::before {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n background: rgba(233, 30, 30, 0.4);\\n display: block;\\n position: absolute;\\n}\\n.accessLevel-1::before {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n background: rgba(33, 150, 243, 0.4);\\n display: block;\\n position: absolute;\\n}\\n.accessLevel-2::before {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n background: rgba(76, 175, 80, 0.4);\\n display: block;\\n position: absolute;\\n} */\\n.ab-csv-importer .row-pass {\\n background-color: #b4e8b6;\\n}\\n.ab-csv-importer .row-fail {\\n background-color: #e4b0ad;\\n}\\n.ab-csv-importer .row-warn {\\n background-color: #f9d59f;\\n}\\n.ab-csv-importer .cell-invalid {\\n background-color: #e9ab4d;\\n}\\n.transparentBG .webix_el_tabbar + .webix_multiview {\\n background: transparent !important;\\n}\\n.webix_hcell .fa {\\n opacity: 0.4;\\n}\\n.ab-widget-header .webix_template {\\n padding: 0 10px;\\n}\\n.ab-layout-header .webix_template {\\n padding: 0;\\n line-height: 30px;\\n}\\n.ab-widget-header .webix_template div {\\n line-height: 30px;\\n}\\n.ab-widget-header .webix_template div .fa,\\n.ab-layout-header .fa {\\n vertical-align: middle;\\n}\\n#offlinePrompt,\\n#connectionPrompt {\\n line-height: 30px;\\n color: white;\\n background: #f44336;\\n font-size: 14px;\\n text-align: center;\\n transition: all 1s;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);\\n overflow: hidden;\\n}\\n#connectionPrompt {\\n background: #f44336;\\n}\\n#countdown {\\n height: 20px;\\n width: 20px;\\n text-align: center;\\n display: inline-block;\\n line-height: 20px;\\n position: relative;\\n bottom: 2px;\\n font-size: 9px;\\n}\\n\\n#countdown-number {\\n color: white;\\n display: inline-block;\\n width: 20px;\\n height: 20px;\\n}\\n\\n#countdown svg {\\n width: 20px;\\n height: 20px;\\n transform: rotateY(-180deg) rotateZ(-90deg);\\n position: absolute;\\n margin-left: -20px;\\n}\\n\\n#countdown svg circle {\\n stroke-dasharray: 56px;\\n stroke-dashoffset: 0px;\\n stroke-linecap: round;\\n stroke-width: 2px;\\n stroke: white;\\n fill: none;\\n animation: countdown 30s linear infinite forwards;\\n}\\n\\n@keyframes countdown {\\n from {\\n stroke-dashoffset: 0px;\\n }\\n to {\\n stroke-dashoffset: 56px;\\n }\\n}\\n#reloadPrompt {\\n position: absolute;\\n z-index: 200000;\\n top: 0;\\n bottom: 0;\\n left: 0;\\n right: 0;\\n background: rgba(0, 0, 0, 0.7);\\n display: flex;\\n}\\n#reloadPrompt div {\\n background: #f44336;\\n width: 250px;\\n border: 3px solid white;\\n margin: auto auto;\\n padding: 20px;\\n text-align: center;\\n border-radius: 10px;\\n color: white;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);\\n}\\n.reloadPage {\\n background: rgba(0, 0, 0, 0.2);\\n border: none;\\n padding: 5px 10px;\\n border-radius: 5px;\\n margin-top: 10px;\\n}\\n.reloadPage:hover {\\n background: rgba(0, 0, 0, 0.4);\\n}\\n.webix_warn .webix_button {\\n background: #ff9800 !important;\\n color: #fff !important;\\n}\\n.webix_dark .webix_inp_bottom_label {\\n color: lightgray;\\n font-style: oblique;\\n}\\n.no-margin {\\n margin: 0;\\n}\\n.inbox_drawer.webix_toolbar.webix_dark .webix_secondary button,\\n.mainToolbar.webix_toolbar.webix_dark .webix_secondary button {\\n background-color: transparent;\\n}\\n.inbox_drawer.webix_toolbar.webix_dark .webix_secondary button:hover,\\n.mainToolbar.webix_toolbar.webix_dark .webix_secondary button:hover {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n/* Login Page */\\n.portalLogin {\\n /* opacity: 0; */\\n background: #ebedf0;\\n background: linear-gradient(\\n 0deg,\\n rgba(171, 171, 171, 1) 0%,\\n rgba(235, 237, 240, 1) 100%\\n );\\n /* -webkit-animation: 1s ease 0s normal forwards 1 fadein;\\n animation: 1s ease 0s normal forwards 1 fadein; */\\n}\\n.portalLoginForm {\\n opacity: 0;\\n -webkit-animation: 1s ease 0s normal forwards 1 fadein;\\n animation: 1s ease 0s normal forwards 1 fadein;\\n background: white;\\n border-radius: 30px;\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n position: relative;\\n top: -20px;\\n transform: scale(1.2);\\n}\\n.portalLogin .webix_view {\\n overflow: visible;\\n display: inline-block;\\n}\\n.preload-card {\\n opacity: 0;\\n animation: 1s ease 0s normal forwards 1 onlyfadein;\\n background: white;\\n border-radius: 30px;\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n position: relative;\\n\\n}\\ndiv.webix_dataview_item.webix_transparent {\\n padding: 0px;\\n}\\n@keyframes fadein {\\n 0% {\\n opacity: 0;\\n top: -20px;\\n transform: scale(1.1);\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n }\\n 100% {\\n opacity: 1;\\n top: 0;\\n transform: scale(1);\\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.4);\\n }\\n}\\n\\n@keyframes onlyfadein {\\n 0% {\\n opacity: 0;\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n }\\n 100% {\\n opacity: 1;\\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.4);\\n }\\n}\\n\\n@-webkit-keyframes fadein {\\n 0% {\\n opacity: 0;\\n }\\n 100% {\\n opacity: 1;\\n }\\n}\\n.ab-connect-add-new-link .webix_icon_btn {\\n margin-right: 0;\\n}\\n.image-data-field-icon {\\n border: 2px dashed rgba(0, 0, 0, 0.3);\\n border-radius: 10px;\\n padding: 5px;\\n display: flex;\\n flex-direction: row;\\n text-align: center;\\n justify-content: center;\\n align-items: center;\\n line-height: 12px;\\n font-size: 10px;\\n color: rgba(0, 0, 0, 0.5);\\n margin: 5px;\\n height: calc(100% - 10px);\\n overflow: hidden;\\n box-sizing: border-box;\\n}\\n.webix_cell > .ab-image-data-field {\\n margin-left: -12px;\\n}\\n.ab-delete-photo {\\n background: red;\\n color: white;\\n font-size: 10px;\\n text-align: center;\\n line-height: 20px;\\n width: 20px;\\n height: 20px;\\n border-radius: 10px;\\n top: -3px;\\n right: -3px;\\n transition: all 0.25s;\\n}\\n.ab-delete-photo:hover {\\n color: white;\\n font-size: 14px;\\n}\\n.webix_transparent .webix_button .webix_icon,\\n.webix_transparent .webix_button .webix_icon_btn {\\n color: #1ca1c1;\\n}\\n.webix_icon_btn {\\n margin-right: 0 !important;\\n vertical-align: baseline;\\n}\\n.webix_list_icon.webix_icon {\\n vertical-align: baseline;\\n}\\n.webix_list_item.menu {\\n color: inherit;\\n}\\n.ab-datacollection-list-item {\\n position: relative;\\n}\\n.ab-object-list-item {\\n position: relative;\\n}\\n.ab-object-list-edit {\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n.webix_el_label.formText .webix_el_box {\\n font-weight: normal;\\n}\\n\\n.switcheroo .webix_win_head .webix_layout_line {\\n background: #657584;\\n color: #fff;\\n}\\n.switcheroo .webix_win_head .webix_view .webix_template {\\n background: #657584;\\n color: #fff;\\n}\\n.portal_work_warning_banner {\\n background: #e64b2a;\\n color: #fff;\\n}\\n.portal_work_warning_banner .webix_el_box {\\n color: #fff;\\n}\\n.portal_work_warning_banner .webix_button {\\n color: #fff;\\n font-size: 14px;\\n}\\n.portal_work_switcheroo_user_switched {\\n background: #2196f3;\\n color: #fff;\\n}\\n.portal_work_switcheroo_user_switched .webix_el_box {\\n color: #fff;\\n}\\n/* Query Override */\\n.wbq-field-box {\\n max-width: 95% !important;\\n}\\n/* Tutorial Manager */\\n.highlightMe,\\n.findDataCy [data-cy] {\\n position: relative !important;\\n}\\n.highlightMe:before,\\n.findDataCy [data-cy]:hover:before {\\n content: \\\"\\\" !important;\\n width: 100% !important;\\n height: 100% !important;\\n border: 2px solid red !important;\\n border-style: inset !important;\\n position: absolute !important;\\n top: 0 !important;\\n left: 0 !important;\\n cursor: help !important;\\n}\\ninput.highlightMe,\\ntextarea.highlightMe,\\nbutton.highlightMe,\\n.findDataCy input[data-cy]:hover,\\n.findDataCy textarea[data-cy]:hover,\\n.findDataCy button[data-cy]:hover {\\n border: 2px solid red !important;\\n border-style: inset !important;\\n cursor: help !important;\\n}\\n.hintItem {\\n position: relative;\\n overflow: visible !important;\\n margin: 10px;\\n padding: 10px;\\n border: 1px solid #efefef;\\n border-radius: 5px;\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.hintItem:hover {\\n background: #efefef;\\n}\\n.hintItem h1 {\\n font-size: 18px;\\n padding: 0;\\n margin: 0;\\n}\\n.hintItem p {\\n margin: 0;\\n font-size: 14px;\\n line-height: 18px;\\n color: #6c757d;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n display: -webkit-box;\\n -webkit-line-clamp: 2;\\n -webkit-box-orient: vertical;\\n}\\n.deleteHint,\\n.deleteStep {\\n position: absolute;\\n right: -5px;\\n top: -5px;\\n background: red;\\n color: white;\\n width: 20px;\\n height: 20px;\\n line-height: 20px;\\n text-align: center;\\n border-radius: 10px;\\n}\\n.deleteHint:hover,\\n.deleteStep:hover {\\n transform: scale(1.1);\\n cursor: pointer;\\n}\\n.deleteStep {\\n right: 25px;\\n}\\n.active0 {\\n opacity: 0.4;\\n}\\n.highlightWin {\\n font-size: 18px;\\n text-align: center;\\n}\\n.stepPos {\\n font-size: 20px;\\n width: 35px;\\n height: 35px;\\n margin: 0 auto;\\n background: #657584;\\n line-height: 35px;\\n text-align: center;\\n color: white;\\n border-radius: 100%;\\n}\\n.wider_popup {\\n width: 250px !important;\\n}\\n.wider_popup .webix_list_item {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_hint {\\n padding-bottom: 60px !important;\\n}\\n.dontShow {\\n font-size: 12px;\\n font-weight: normal;\\n font-style: italic;\\n display: block;\\n padding: 0;\\n margin: 15px 0 0 0;\\n}\\n.dontShow input {\\n vertical-align: text-top;\\n}\\n.pdf-data-view .webix_selected {\\n background-color: #87c3d1;\\n}\\n.pdf-data-view-item {\\n display: flex;\\n flex-direction: row;\\n flex-wrap: nowrap;\\n justify-content: space-between;\\n}\\n.pdf-data-view-image {\\n position: relative;\\n}\\n.pdf-data-view-image-icon {\\n transition: .5s ease;\\n opacity: 0;\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n transform: translate(-50%, -50%);\\n -ms-transform: translate(-50%, -50%);\\n text-align: center;\\n}\\n.pdf-data-view-image:hover canvas {\\n opacity: 0.7;\\n}\\n.pdf-data-view-image:hover .pdf-data-view-image-icon {\\n opacity: 0.9;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./styles/ui.css\"],\"names\":[],\"mappings\":\"AAAA;;GAEG,2BAA2B;AAC9B;AACA;GACG,4CAA4C;GAC5C,WAAW;GACX,YAAY;GACZ,0DAA0D;GAC1D,2BAA2B;GAC3B,4BAA4B;GAC5B,2BAA2B;AAC9B;AACA;GACG,iCAAiC;GACjC,4BAA4B;GAC5B,0BAA0B;AAC7B;AACA;GACG,WAAW;GACX,qBAAqB;AACxB;AACA;GACG,cAAc;AACjB;AACA;GACG,kBAAkB;GAClB,+BAA+B;AAClC;AACA;GACG,6CAA6C;GAC7C,2CAA2C;GAC3C,gDAAgD;AACnD;AACA;GACG,gBAAgB;AACnB;AACA;GACG,gBAAgB;AACnB;AACA;GACG,qCAAqC;AACxC;AACA;;;GAGG,+BAA+B;AAClC;AACA;;GAEG,oCAAoC;GACpC,cAAc;AACjB;AACA;;;GAGG,cAAc;AACjB;AACA;GACG,oCAAoC;AACvC;AACA;GACG,6BAA6B;GAC7B,iBAAiB;GACjB,YAAY;AACf;AACA;GACG,6BAA6B;AAChC;AACA;GACG,YAAY;GACZ,eAAe;AAClB;AACA;GACG,eAAe;GACf,0CAA0C;AAC7C;AACA;GACG,YAAY;AACf;;AAEA,uCAAuC;AACvC;GACG,gBAAgB;AACnB;AACA,uBAAuB;AACvB;GACG,cAAc;GACd,YAAY;GACZ,iBAAiB;GACjB,eAAe;GACf,QAAQ;AACX;AACA,uBAAuB;AACvB;GACG,uBAAuB;AAC1B;AACA;;GAEG,gDAAgD;GAChD,6BAA6B;GAC7B,mBAAmB;GACnB,gBAAgB;GAChB,gBAAgB;GAChB,iBAAiB;GACjB,mBAAmB;GACnB,yBAAyB;AAC5B;AACA;GACG,kBAAkB;AACrB;AACA;GACG,aAAa;AAChB;AACA;GACG,iBAAiB;GACjB,iBAAiB;GACjB,YAAY;AACf;AACA;GACG,UAAU;GACV,eAAe;AAClB;AACA;GACG,aAAa;AAChB;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,qBAAqB;AACxB;AACA;GACG,gCAAgC;AACnC;AACA;GACG,aAAa;GACb,iBAAiB;AACpB;AACA;GACG,uBAAuB;GACvB,gBAAgB;GAChB,mBAAmB;AACtB;AACA;;GAEG,iBAAiB;GACjB,iBAAiB;AACpB;AACA;GACG,0BAA0B;AAC7B;AACA;GACG,aAAa;AAChB;AACA;GACG,uBAAuB;GACvB,sDAAsD;AACzD;AACA;GACG,iBAAiB;AACpB;AACA;GACG,yBAAyB;GACzB,iBAAiB;AACpB;AACA;GACG,gBAAgB;GAChB,UAAU;GACV,SAAS;GACT,SAAS;GACT,uBAAuB;GACvB,gBAAgB;GAChB,gBAAgB;AACnB;AACA;GACG,iBAAiB;GACjB,WAAW;AACd;AACA;GACG,kCAAkC;GAClC,uBAAuB;GACvB,2BAA2B;GAC3B,iBAAiB;GACjB,wBAAwB;AAC3B;AACA;GACG,SAAS;AACZ;AACA;;GAEG,8BAA8B;GAC9B,eAAe;GACf,8BAA8B;GAC9B,sBAAsB;GACtB,iBAAiB;GACjB,qBAAqB;GACrB,wBAAwB;GACxB,WAAW;GACX,+BAA+B;AAClC;AACA;;GAEG,YAAY;GACZ,iBAAiB;AACpB;AACA;GACG,WAAW;GACX,WAAW;GACX,wBAAwB;AAC3B;AACA;;GAEG,sBAAsB;AACzB;AACA;;;;GAIG,WAAW;GACX,eAAe;GACf,gCAAgC;GAChC,mBAAmB;GACnB,iBAAiB;GACjB,yBAAyB;GACzB,iBAAiB;AACpB;AACA;GACG,iBAAiB;AACpB;AACA;GACG,yBAAyB;GACzB,wBAAwB;GACxB,iBAAiB;AACpB;AACA;GACG,sBAAsB;AACzB;AACA;GACG,kCAAkC;AACrC;AACA;GACG,SAAS;AACZ;AACA;GACG,kBAAkB;GAClB,YAAY;GACZ,sBAAsB;GACtB,WAAW;GACX,gBAAgB;GAChB,kBAAkB;GAClB,iBAAiB;AACpB;AACA;GACG,WAAW;AACd;AACA;GACG,UAAU;GACV,yBAAyB;GACzB,wBAAwB;GACxB,iBAAiB;AACpB;AACA;GACG,UAAU;GACV,SAAS;AACZ;AACA;GACG,WAAW;AACd;AACA;GACG,mBAAmB;AACtB;AACA;GACG,qBAAqB;AACxB;AACA;GACG,QAAQ;GACR,WAAW;GACX,gBAAgB;AACnB;AACA;;GAEG,kBAAkB;AACrB;;AAEA;GACG,WAAW;GACX,YAAY;AACf;AACA;GACG,yBAAyB;AAC5B;AACA;;;GAGG,YAAY;GACZ,YAAY;GACZ,YAAY;AACf;AACA;;;GAGG,UAAU;AACb;AACA;GACG,iBAAiB;AACpB;AACA;GACG,iBAAiB;AACpB;AACA;GACG,YAAY;GACZ,WAAW;AACd;AACA;GACG,aAAa;AAChB;AACA;GACG,eAAe;GACf,iBAAiB;GACjB,gBAAgB;AACnB;AACA;GACG,YAAY;AACf;;AAEA;GACG,kBAAkB;AACrB;AACA;GACG,eAAe;AAClB;AACA;GACG,iBAAiB;AACpB;AACA;;GAEG,UAAU;AACb;AACA;GACG,mBAAmB;AACtB;AACA;GACG,eAAe;AAClB;AACA;GACG,0BAA0B;AAC7B;AACA;GACG,YAAY;AACf;AACA;GACG,UAAU;AACb;AACA;GACG,qBAAqB;AACxB;AACA;GACG,0BAA0B;AAC7B;AACA;GACG,iBAAiB;AACpB;AACA;GACG,iBAAiB;AACpB;AACA;GACG,kBAAkB;GAClB,QAAQ;GACR,WAAW;AACd;AACA;GACG,QAAQ;GACR,YAAY;AACf;AACA;;GAEG,WAAW;GACX,YAAY;GACZ,qBAAqB;GACrB,iBAAiB;GACjB,eAAe;GACf,kBAAkB;GAClB,4BAA4B;GAC5B,mBAAmB;GACnB,YAAY;GACZ,SAAS;GACT,kBAAkB;GAClB,gBAAgB;GAChB,YAAY;AACf;AACA;;GAEG,eAAe;AAClB;AACA;GACG,mBAAmB;AACtB;AACA;GACG,eAAe;GACf,WAAW;GACX,YAAY;GACZ,iBAAiB;AACpB;AACA;GACG,WAAW;GACX,gBAAgB;GAChB,SAAS;AACZ;AACA;GACG,gBAAgB;AACnB;AACA;GACG,eAAe;AAClB;AACA;GACG,WAAW;AACd;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,6BAA6B;AAChC;AACA;GACG,6BAA6B;GAC7B,YAAY;AACf;AACA;GACG,uBAAuB;GACvB,cAAc;AACjB;AACA;GACG,eAAe;AAClB;AACA;GACG,iBAAiB;AACpB;AACA;GACG,8BAA8B;GAC9B,YAAY;GACZ,WAAW;AACd;AACA;GACG,gBAAgB;AACnB;AACA;GACG,iBAAiB;AACpB;AACA;GACG,kBAAkB;AACrB;AACA;GACG,uBAAuB;GACvB,cAAc;GACd,iBAAiB;GACjB,UAAU;GACV,kBAAkB;AACrB;AACA;GACG,0BAA0B;AAC7B;AACA;GACG,iBAAiB;AACpB;AACA;GACG,UAAU;AACb;AACA;GACG,mBAAmB;AACtB;;AAEA;GACG,yBAAyB;AAC5B;AACA;;GAEG,8BAA8B;AACjC;AACA;GACG,kCAAkC;AACrC;AACA;GACG,gBAAgB;GAChB,kBAAkB;GAClB,oDAAoD;GACpD,kBAAkB;GAClB,iBAAiB;AACpB;AACA;GACG,uBAAuB;AAC1B;AACA;GACG,kBAAkB;GAClB,SAAS;GACT,WAAW;GACX,mBAAmB;AACtB;AACA,wBAAwB;AACxB;GACG,WAAW;GACX,YAAY;GACZ,cAAc;GACd,WAAW;GACX,kBAAkB;GAClB,mBAAmB;GACnB,YAAY;GACZ,UAAU;GACV,kBAAkB;GAClB,iBAAiB;AACpB;AACA;GACG,qBAAqB;GACrB,yBAAyB;AAC5B;AACA;GACG,qBAAqB;GACrB,WAAW;GACX,mBAAmB;GACnB,gBAAgB;GAChB,uBAAuB;AAC1B;;AAEA;GACG,sBAAsB;AACzB;AACA;GACG,YAAY;GACZ,gBAAgB;AACnB;AACA;GACG,2BAA2B;AAC9B;AACA;;GAEG,gBAAgB;GAChB,mBAAmB;GACnB,uBAAuB;AAC1B;AACA;;GAEG,2BAA2B;AAC9B;;AAEA,qBAAqB;AACrB;GACG,sBAAsB;AACzB;AACA;GACG,YAAY;GACZ,gBAAgB;AACnB;AACA;GACG,kBAAkB;GAClB,UAAU;GACV,QAAQ;GACR,UAAU;GACV,WAAW;GACX,UAAU;GACV,YAAY;GACZ,sBAAsB;GACtB,YAAY;GACZ,WAAW;AACd;AACA;GACG,YAAY;AACf;AACA;GACG,iBAAiB;GACjB,WAAW;GACX,YAAY;GACZ,kBAAkB;AACrB;AACA;GACG,cAAc;AACjB;AACA;GACG,0BAA0B;GAC1B,UAAU;AACb;AACA;GACG,UAAU;GACV,iBAAiB;AACpB;AACA;GACG,WAAW;GACX,YAAY;AACf;AACA;GACG,kBAAkB;GAClB,OAAO;GACP,yBAAyB;GACzB,wBAAwB;GACxB,uBAAuB;GACvB,qBAAqB;GACrB,WAAW;AACd;AACA;GACG,qBAAqB;GACrB,qBAAqB;GACrB,WAAW;AACd;AACA;;;GAGG,eAAe;AAClB;AACA;GACG,kBAAkB;AACrB;AACA;GACG,UAAU;AACb;;AAEA;GACG,kCAAkC;AACrC;AACA;GACG,uBAAuB;AAC1B;AACA;GACG,qBAAqB;AACxB;AACA;GACG,oBAAoB;AACvB;AACA;GACG,YAAY;AACf;AACA;GACG,eAAe;AAClB;AACA,mBAAmB;AACnB;GACG,gBAAgB;GAChB,YAAY;GACZ,6BAA6B;AAChC;AACA;GACG,gBAAgB;GAChB,4BAA4B;AAC/B;AACA;GACG,sBAAsB;GACtB,2BAA2B;GAC3B,0BAA0B;GAC1B,kBAAkB;GAClB,sBAAsB;GACtB,4BAA4B;GAC5B,2BAA2B;GAC3B,wBAAwB;AAC3B;AACA;GACG,kBAAkB;AACrB;AACA;GACG,yBAAyB;GACzB,YAAY;AACf;AACA;GACG,kBAAkB;GAClB,uBAAuB;AAC1B;AACA;GACG,sBAAsB;AACzB;AACA;GACG,uBAAuB;GACvB,UAAU;AACb;AACA;GACG,uBAAuB;AAC1B;AACA;GACG,4BAA4B;GAC5B,+BAA+B;AAClC;AACA;GACG,2BAA2B;GAC3B,8BAA8B;AACjC;AACA;GACG,gBAAgB;AACnB;AACA;GACG,2BAA2B;GAC3B,+BAA+B;GAC/B,mBAAmB;AACtB;AACA;GACG,WAAW;GACX,cAAc;GACd,YAAY;GACZ,WAAW;GACX,8BAA8B;GAC9B;;;;IAIC;GACD,kBAAkB;GAClB,UAAU;GACV,SAAS;AACZ;AACA;GACG,kBAAkB;GAClB,iBAAiB;GACjB,sBAAsB;GACtB,mBAAmB;AACtB;AACA;GACG,cAAc;AACjB;AACA;GACG,cAAc;GACd,mBAAmB;AACtB;AACA;;GAEG,YAAY;GACZ,aAAa;AAChB;AACA;GACG,mBAAmB;GACnB,kBAAkB;AACrB;AACA;GACG,+BAA+B;AAClC;AACA;;;;GAIG,YAAY;GACZ,gCAAgC;GAChC,gCAAgC;AACnC;AACA;;;;;GAKG,iDAAiD;GACjD,mBAAmB;AACtB;AACA;;;;GAIG,gBAAgB;GAChB,UAAU;AACb;AACA;GACG,gBAAgB;AACnB;AACA;GACG,gBAAgB;GAChB,UAAU;AACb;AACA;GACG,gBAAgB;AACnB;AACA;;;;GAIG,WAAW;GACX,iBAAiB;GACjB,mBAAmB;GACnB,YAAY;GACZ,WAAW;GACX,YAAY;GACZ,mBAAmB;GACnB,iBAAiB;GACjB,kBAAkB;GAClB,YAAY;AACf;AACA;GACG,YAAY;AACf;AACA;GACG,UAAU;AACb;AACA;GACG,YAAY;GACZ,kBAAkB;GAClB,iBAAiB;AACpB;AACA;;GAEG,YAAY;GACZ,2BAA2B;GAC3B,iBAAiB;AACpB;AACA;GACG,aAAa;AAChB;AACA;GACG,aAAa;AAChB;AACA;GACG,sBAAsB;AACzB;AACA;GACG,sBAAsB;AACzB;AACA;GACG,qBAAqB;AACxB;;AAEA;GACG,mBAAmB;AACtB;AACA;GACG,uBAAuB;GACvB,YAAY;AACf;AACA;GACG,8BAA8B;AACjC;AACA;GACG,YAAY;AACf;AACA;;;GAGG,cAAc;AACjB;AACA;;;;;;;;;GASG,gCAAgC;AACnC;AACA;GACG,mBAAmB;AACtB;AACA;GACG,mBAAmB;AACtB;AACA;GACG,mBAAmB;AACtB;AACA;GACG,WAAW;GACX,mBAAmB;GACnB,cAAc;GACd,kBAAkB;GAClB,OAAO;GACP,WAAW;GACX,aAAa;AAChB;AACA;GACG,uBAAuB;AAC1B;AACA;GACG,gBAAgB;AACnB;AACA;GACG,sBAAsB;AACzB;AACA;GACG,kBAAkB;GAClB,YAAY;AACf;AACA;GACG,WAAW;GACX,YAAY;GACZ,mBAAmB;AACtB;AACA;GACG,kBAAkB;GAClB,MAAM;GACN,OAAO;GACP,eAAe;GACf,YAAY;GACZ,8BAA8B;GAC9B,+BAA+B;GAC/B,WAAW;AACd;AACA;GACG,kBAAkB;GAClB,QAAQ;GACR,UAAU;GACV,eAAe;GACf,8BAA8B;GAC9B,oC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AEG,6BAA6B;GAChC;GACA;MACG,yBAAyB;MACzB,4BAA4B;GAC/B;GACA;;MAEG,yBAAyB;GAC5B;GACA;;MAEG,4BAA4B;GAC/B;AACH;;AAEA;GACG,sBAAsB;AACzB;;AAEA;GACG;MACG,uBAAuB;MACvB,oBAAoB;MACpB,eAAe;MACf,2BAA2B;MAC3B,wBAAwB;MACxB,mBAAmB;MACnB,UAAU;MACV,SAAS;GACZ;GACA;MACG,qBAAqB;MACrB,WAAW;GACd;AACH;;AAEA;GACG,gBAAgB;AACnB;;AAEA;GACG,gBAAgB;GAChB,6BAA6B;GAC7B,4BAA4B;AAC/B;;AAEA;GACG,yBAAyB;GACzB,0BAA0B;AAC7B;;AAEA;GACG,gBAAgB;GAChB,mBAAmB;AACtB;AACA;GACG,UAAU;AACb;AACA;;GAEG,mCAAmC;AACtC;AACA;;GAEG,2BAA2B;AAC9B;AACA;;GAEG,wBAAwB;AAC3B;AACA;GACG,gBAAgB;AACnB;AACA;GACG,yBAAyB;AAC5B;AACA;;GAEG,WAAW;AACd;AACA;;GAEG,qBAAqB;AACxB;AACA;GACG,mBAAmB;AACtB;AACA;GACG,aAAa;AAChB;AACA;GACG,iBAAiB;AACpB;AACA;;GAEG,oBAAoB;GACpB,aAAa;AAChB;AACA;GACG,oBAAoB;GACpB,aAAa;GACb,sBAAsB;GACtB,mBAAmB;GACnB,yBAAyB;GACzB,gBAAgB;GAChB,eAAe;GACf,gBAAgB;GAChB,gBAAgB;GAChB,cAAc;GACd,kBAAkB;GAClB,mBAAmB;GACnB,yBAAyB;GACzB,yBAAyB;GACzB,sBAAsB;AACzB;AACA;;;;;;;;;;;;;;;GAeG,yBAAyB;GACzB,4BAA4B;AAC/B;AACA;GACG,mBAAmB;AACtB;AACA;GACG,mBAAmB;AACtB;AACA;GACG,eAAe;AAClB;AACA;GACG,YAAY;AACf;AACA;GACG,oBAAoB;AACvB;AACA;GACG,iBAAiB;AACpB;AACA;GACG,sBAAsB;AACzB;AACA;GACG,gBAAgB;AACnB;AACA;GACG,eAAe;AAClB;AACA;GACG,mBAAmB;GACnB,eAAe;AAClB;AACA;GACG,4BAA4B;AAC/B;AACA;GACG,WAAW;GACX,YAAY;GACZ,eAAe;AAClB;AACA;GACG,sBAAsB;AACzB;AACA;;GAEG,sBAAsB;AACzB;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,oCAAoC;AACvC;AACA;GACG,kCAAkC;AACrC;AACA;GACG,yBAAyB;GACzB,cAAc;GACd,iBAAiB;AACpB;AACA;GACG,cAAc;AACjB;AACA;GACG,yBAAyB;GACzB,WAAW;AACd;AACA;GACG,WAAW;AACd;AACA;GACG,2DAA2D;GAC3D,kCAAkC;GAClC,oBAAoB;GACpB,qBAAqB;GACrB,QAAQ;GACR,SAAS;GACT,4BAA4B;GAC5B,+BAA+B;GAC/B,YAAY;GACZ,eAAe;GACf,qBAAqB;GACrB,kBAAkB;GAClB,WAAW;GACX,mBAAmB;GACnB,gBAAgB;GAChB,YAAY;GACZ,YAAY;GACZ,aAAa;AAChB;AACA;GACG,UAAU;AACb;AACA;GACG,iBAAiB;AACpB;AACA;GACG,oCAAoC;GACpC,gDAAgD;GAChD,iBAAiB;AACpB;AACA;GACG,uBAAuB;GACvB,eAAe;GACf,wCAAwC;AAC3C;AACA;GACG,gCAAgC;AACnC;AACA;GACG,wBAAwB;AAC3B;AACA;;;GAGG,4BAA4B;GAC5B,4CAA4C;AAC/C;AACA;GACG,aAAa;AAChB;AACA;GACG,2BAA2B;AAC9B;AACA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;GACG,yBAAyB;AAC5B;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,kCAAkC;AACrC;AACA;GACG,YAAY;AACf;AACA;GACG,eAAe;AAClB;AACA;GACG,UAAU;GACV,iBAAiB;AACpB;AACA;GACG,iBAAiB;AACpB;AACA;;GAEG,sBAAsB;AACzB;AACA;;GAEG,iBAAiB;GACjB,YAAY;GACZ,mBAAmB;GACnB,eAAe;GACf,kBAAkB;GAClB,kBAAkB;GAClB,yCAAyC;GACzC,gBAAgB;AACnB;AACA;GACG,mBAAmB;AACtB;AACA;GACG,YAAY;GACZ,WAAW;GACX,kBAAkB;GAClB,qBAAqB;GACrB,iBAAiB;GACjB,kBAAkB;GAClB,WAAW;GACX,cAAc;AACjB;;AAEA;GACG,YAAY;GACZ,qBAAqB;GACrB,WAAW;GACX,YAAY;AACf;;AAEA;GACG,WAAW;GACX,YAAY;GACZ,2CAA2C;GAC3C,kBAAkB;GAClB,kBAAkB;AACrB;;AAEA;GACG,sBAAsB;GACtB,sBAAsB;GACtB,qBAAqB;GACrB,iBAAiB;GACjB,aAAa;GACb,UAAU;GACV,iDAAiD;AACpD;;AAEA;GACG;MACG,sBAAsB;GACzB;GACA;MACG,uBAAuB;GAC1B;AACH;AACA;GACG,kBAAkB;GAClB,eAAe;GACf,MAAM;GACN,SAAS;GACT,OAAO;GACP,QAAQ;GACR,8BAA8B;GAC9B,aAAa;AAChB;AACA;GACG,mBAAmB;GACnB,YAAY;GACZ,uBAAuB;GACvB,iBAAiB;GACjB,aAAa;GACb,kBAAkB;GAClB,mBAAmB;GACnB,YAAY;GACZ,yCAAyC;AAC5C;AACA;GACG,8BAA8B;GAC9B,YAAY;GACZ,iBAAiB;GACjB,kBAAkB;GAClB,gBAAgB;AACnB;AACA;GACG,8BAA8B;AACjC;AACA;GACG,8BAA8B;GAC9B,sBAAsB;AACzB;AACA;GACG,gBAAgB;GAChB,mBAAmB;AACtB;AACA;GACG,SAAS;AACZ;AACA;;GAEG,6BAA6B;AAChC;AACA;;GAEG,oCAAoC;AACvC;AACA,eAAe;AACf;GACG,gBAAgB;GAChB,mBAAmB;GACnB;;;;IAIC;GACD;oDACiD;AACpD;AACA;GACG,UAAU;GACV,sDAAsD;GACtD,8CAA8C;GAC9C,iBAAiB;GACjB,mBAAmB;GACnB,4CAA4C;GAC5C,kBAAkB;GAClB,UAAU;GACV,qBAAqB;AACxB;AACA;GACG,iBAAiB;GACjB,qBAAqB;AACxB;AACA;GACG,UAAU;GACV,kDAAkD;GAClD,iBAAiB;GACjB,mBAAmB;GACnB,4CAA4C;GAC5C,kBAAkB;;AAErB;AACA;GACG,YAAY;AACf;AACA;GACG;MACG,UAAU;MACV,UAAU;MACV,qBAAqB;MACrB,4CAA4C;GAC/C;GACA;MACG,UAAU;MACV,MAAM;MACN,mBAAmB;MACnB,0CAA0C;GAC7C;AACH;;AAEA;GACG;MACG,UAAU;MACV,4CAA4C;GAC/C;GACA;MACG,UAAU;MACV,0CAA0C;GAC7C;AACH;;AAEA;GACG;MACG,UAAU;GACb;GACA;MACG,UAAU;GACb;AACH;AACA;GACG,eAAe;AAClB;AACA;GACG,qCAAqC;GACrC,mBAAmB;GACnB,YAAY;GACZ,aAAa;GACb,mBAAmB;GACnB,kBAAkB;GAClB,uBAAuB;GACvB,mBAAmB;GACnB,iBAAiB;GACjB,eAAe;GACf,yBAAyB;GACzB,WAAW;GACX,yBAAyB;GACzB,gBAAgB;GAChB,sBAAsB;AACzB;AACA;GACG,kBAAkB;AACrB;AACA;GACG,eAAe;GACf,YAAY;GACZ,eAAe;GACf,kBAAkB;GAClB,iBAAiB;GACjB,WAAW;GACX,YAAY;GACZ,mBAAmB;GACnB,SAAS;GACT,WAAW;GACX,qBAAqB;AACxB;AACA;GACG,YAAY;GACZ,eAAe;AAClB;AACA;;GAEG,cAAc;AACjB;AACA;GACG,0BAA0B;GAC1B,wBAAwB;AAC3B;AACA;GACG,wBAAwB;AAC3B;AACA;GACG,cAAc;AACjB;AACA;GACG,kBAAkB;AACrB;AACA;GACG,kBAAkB;AACrB;AACA;GACG,kBAAkB;GAClB,QAAQ;GACR,MAAM;AACT;AACA;GACG,mBAAmB;AACtB;;AAEA;GACG,mBAAmB;GACnB,WAAW;AACd;AACA;GACG,mBAAmB;GACnB,WAAW;AACd;AACA;GACG,mBAAmB;GACnB,WAAW;AACd;AACA;GACG,WAAW;AACd;AACA;GACG,WAAW;GACX,eAAe;AAClB;AACA;GACG,mBAAmB;GACnB,WAAW;AACd;AACA;GACG,WAAW;AACd;AACA,mBAAmB;AACnB;GACG,yBAAyB;AAC5B;AACA,qBAAqB;AACrB;;GAEG,6BAA6B;AAChC;AACA;;GAEG,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,gCAAgC;GAChC,8BAA8B;GAC9B,6BAA6B;GAC7B,iBAAiB;GACjB,kBAAkB;GAClB,uBAAuB;AAC1B;AACA;;;;;;GAMG,gCAAgC;GAChC,8BAA8B;GAC9B,uBAAuB;AAC1B;AACA;GACG,kBAAkB;GAClB,4BAA4B;GAC5B,YAAY;GACZ,aAAa;GACb,yBAAyB;GACzB,kBAAkB;GAClB,+BAA+B;AAClC;AACA;GACG,mBAAmB;AACtB;AACA;GACG,eAAe;GACf,UAAU;GACV,SAAS;AACZ;AACA;GACG,SAAS;GACT,eAAe;GACf,iBAAiB;GACjB,cAAc;GACd,gBAAgB;GAChB,uBAAuB;GACvB,oBAAoB;GACpB,qBAAqB;GACrB,4BAA4B;AAC/B;AACA;;GAEG,kBAAkB;GAClB,WAAW;GACX,SAAS;GACT,eAAe;GACf,YAAY;GACZ,WAAW;GACX,YAAY;GACZ,iBAAiB;GACjB,kBAAkB;GAClB,mBAAmB;AACtB;AACA;;GAEG,qBAAqB;GACrB,eAAe;AAClB;AACA;GACG,WAAW;AACd;AACA;GACG,YAAY;AACf;AACA;GACG,eAAe;GACf,kBAAkB;AACrB;AACA;GACG,eAAe;GACf,WAAW;GACX,YAAY;GACZ,cAAc;GACd,mBAAmB;GACnB,iBAAiB;GACjB,kBAAkB;GAClB,YAAY;GACZ,mBAAmB;AACtB;AACA;GACG,uBAAuB;AAC1B;AACA;GACG,mBAAmB;GACnB,gBAAgB;GAChB,uBAAuB;AAC1B;AACA;GACG,+BAA+B;AAClC;AACA;GACG,eAAe;GACf,mBAAmB;GACnB,kBAAkB;GAClB,cAAc;GACd,UAAU;GACV,kBAAkB;AACrB;AACA;GACG,wBAAwB;AAC3B;AACA;GACG,yBAAyB;AAC5B;AACA;GACG,aAAa;GACb,mBAAmB;GACnB,iBAAiB;GACjB,8BAA8B;AACjC;AACA;GACG,kBAAkB;AACrB;AACA;GACG,oBAAoB;GACpB,UAAU;GACV,kBAAkB;GAClB,QAAQ;GACR,SAAS;GACT,gCAAgC;GAChC,oCAAoC;GACpC,kBAAkB;AACrB;AACA;GACG,YAAY;AACf;AACA;GACG,YAAY;AACf\",\"sourcesContent\":[\".mainSidebar.webix_sidebar.webix_dark,\\n.darkScrollview {\\n background: #444 !important;\\n}\\n.appDevDesigns {\\n background-color: rgb(68, 68, 68) !important;\\n width: 100%;\\n height: 100%;\\n background-image: url(assets/images/appdev_logo_white.png);\\n background-size: auto 110px;\\n background-repeat: no-repeat;\\n background-position: center;\\n}\\n.policyLink {\\n background-color: rgb(68, 68, 68);\\n border-width: 0px !important;\\n margin-top: 0px !important;\\n}\\na.policyMenu {\\n color: #BBB;\\n text-decoration: none;\\n}\\na.policyAuth {\\n color: #475466;\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_sidebar_icon {\\n margin-right: 15px;\\n color: rgba(255, 255, 255, 0.4);\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_tree_branch_1 {\\n //border-top: 1px solid rgba(255,255,255,0.1);\\n border-bottom: 1px solid rgba(0, 0, 0, 0.4);\\n box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.1);\\n}\\n.mainToolbar .webix_icon {\\n margin-top: -2px;\\n}\\n.mainToolbar.webix_toolbar.webix_dark {\\n background: #333;\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_tree_item:hover {\\n background-color: rgba(0, 0, 0, 0.15);\\n}\\n.mainSidebar.webix_sidebar.webix_dark\\n .webix_tree_item:hover\\n .webix_sidebar_icon {\\n color: rgba(255, 255, 255, 0.8);\\n}\\n.mainSidebar.webix_sidebar.webix_dark .webix_tree_item.webix_selected,\\n.mainSidebar .webix_tree_item.webix_sidebar_selected {\\n background-color: rgba(0, 0, 0, 0.2);\\n color: #1ca1c1;\\n}\\n.mainSidebar.webix_sidebar.webix_dark\\n .webix_tree_item.webix_selected\\n .webix_icon {\\n color: #1ca1c1;\\n}\\n.webix_toolbar.webix_dark .webix_secondary.activePage button {\\n background-color: #1ca1c1 !important;\\n}\\n.webix_toolbar.webix_dark .userMenu.webix_menu-x .webix_list_item {\\n background-color: transparent;\\n padding: 3px 10px;\\n opacity: 0.7;\\n}\\n.webix_toolbar.webix_dark .inbox.webix_secondary button {\\n background-color: transparent;\\n}\\n.webix_toolbar.webix_dark .inbox.webix_secondary button .webix_icon_btn {\\n opacity: 0.7;\\n font-size: 20px;\\n}\\n.appPages .webix_button {\\n font-size: 14px;\\n color: rgba(255, 255, 255, 0.8) !important;\\n}\\n.appPages .webix_icon_btn {\\n opacity: 0.4;\\n}\\n\\n/* Styles imported from AppBuilder v1 */\\nlabel {\\n font-weight: 500;\\n}\\n/* Custom Webix Badge */\\n.webix_badge {\\n font-size: 8pt;\\n height: 18px;\\n line-height: 18px;\\n min-width: 18px;\\n right: 0;\\n}\\n/* Custom selectivity */\\n.webix_checksuggest_select_all .webix_el_box {\\n height: auto !important;\\n}\\n.webix_multicombo_tag,\\n.webix_multicombo_value {\\n box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.3);\\n border-bottom: 1px solid #fff;\\n margin: 3px 3px 1px;\\n max-height: 27px;\\n overflow: hidden;\\n line-height: 26px;\\n font-weight: normal;\\n color: #475466 !important;\\n}\\n.badgeContainer {\\n position: relative;\\n}\\n.webix_tooltip .webix_badge.selectivityBadge {\\n display: none;\\n}\\n.editConnectedPage {\\n margin-left: -5px;\\n margin-right: 5px;\\n opacity: 0.4;\\n}\\n.editConnectedPage:hover {\\n opacity: 1;\\n cursor: pointer;\\n}\\n.webix_tooltip .webix_multicombo_delete {\\n display: none;\\n}\\n.webix_multicombo_delete:hover:after {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n.webix_multicombo_delete:hover {\\n transform: scale(1.1);\\n}\\n.webix_multicombo_delete.clear-combo-value {\\n transition: all 0.2s ease-in-out;\\n}\\n.webix_multicombo_value {\\n display: flex;\\n /* width: 100%; */\\n}\\n.webix_multicombo_value .ellip {\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n}\\n.webix_cell .webix_multicombo_tag,\\n.webix_cell .webix_multicombo_value {\\n line-height: 26px;\\n margin: 4px 1.5px;\\n}\\n.webix_el_combo .webix_progress_state {\\n font-size: 35px !important;\\n}\\n.webix_list_item .editConnectedPage {\\n display: none;\\n}\\n.hascustomcolor {\\n color: white !important;\\n text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.3) !important;\\n}\\n.combowithcolors .webix_inp_static {\\n padding-left: 0px;\\n}\\n.webix_multicombo_delete:after {\\n color: rgba(0, 0, 0, 0.4);\\n text-shadow: none;\\n}\\n.hideWebixMulticomboTag .webix_multicombo_tag {\\n box-shadow: none;\\n padding: 0;\\n border: 0;\\n margin: 0;\\n background: transparent;\\n border-radius: 0;\\n max-height: none;\\n}\\n.selectivity-placeholder {\\n text-indent: 10px;\\n color: #666;\\n}\\n.selectivity-multiple-input-container {\\n background: transparent !important;\\n padding: 0px !important;\\n overflow: hidden !important;\\n max-height: unset;\\n /* border-radius: 6px; */\\n}\\n.selectivity-single-result-container {\\n left: 2px;\\n}\\n.selectivity-multiple-selected-item,\\n.selectivity-single-selected-item {\\n background: #337ab7 !important;\\n padding: 0 10px;\\n border-radius: 15px !important;\\n color: #fff !important;\\n line-height: 29px;\\n display: inline-block;\\n height: unset !important;\\n margin: 2px;\\n /*max-width: 100px !important;*/\\n}\\n.selectivity-multiple-input,\\ninput[type=\\\"text\\\"].selectivity-multiple-input {\\n height: 33px;\\n text-indent: 10px;\\n}\\n.selectivity-single-selected-item-remove {\\n color: #fff;\\n float: none;\\n padding: 7px 5px 7px 0px;\\n}\\n.selectivity-multiple-selected-item-edit,\\n.selectivity-multiple-selected-item-remove {\\n padding: 5px 0 5px 5px;\\n}\\n.selectivity-single-selected-item-edit,\\n.selectivity-multiple-selected-item-edit,\\n.selectivity-single-selected-item-edit:hover,\\n.selectivity-multiple-selected-item-edit:hover {\\n color: #fff;\\n cursor: pointer;\\n text-decoration: none !important;\\n background: #1ca1c1;\\n margin-left: -9pt;\\n padding: 5px 5px 5px 10px;\\n margin-right: 5px;\\n}\\n.customField {\\n line-height: 33px;\\n}\\n.customField .selectivity-multiple-input-container {\\n border: 1px solid #ccd7e6;\\n /* border-radius: 6px; */\\n margin-right: 4px;\\n}\\n.readonlyField {\\n background-color: #fff;\\n}\\n.selectivity-single-select {\\n background: transparent !important;\\n}\\n.webix_cell .form-entry {\\n border: 0;\\n}\\n.form-entry {\\n border-radius: 6px;\\n height: 100%;\\n border: 1px solid #ddd;\\n color: #666;\\n background: #fff;\\n border-color: #ccc;\\n margin-right: 2px;\\n}\\n.form-entry .selectivity-multiple-selected-item {\\n float: none;\\n}\\n.webix_template .selectivity-single-select {\\n padding: 0;\\n border: 1px solid #ccd7e6;\\n /* border-radius: 6px; */\\n margin-right: 4px;\\n}\\n.selectivity-single-select input {\\n padding: 0;\\n border: 0;\\n}\\n.selectivity-single-selected-item {\\n color: #666;\\n}\\n.selectivity-single-result-container {\\n top: 0em !important;\\n}\\n.selectivity-caret {\\n top: 0.4em !important;\\n}\\n.selectivityBadge {\\n top: 6px;\\n right: -5px;\\n background: #aaa;\\n}\\n.list-data-values,\\n.connect-data-values {\\n position: relative;\\n}\\n\\n.ab-app-list-info {\\n float: left;\\n height: 100%;\\n}\\n.ab-tree-ui .webix_scroll_cont .webix_tree_leaves {\\n display: block !important;\\n}\\n.ab-app-list-edit,\\n.ab-object-list-edit,\\n.ab-page-list-edit {\\n float: right;\\n height: 100%;\\n opacity: 0.6;\\n}\\n.ab-app-list-edit:hover,\\n.ab-object-list-edit:hover,\\n.ab-page-list-edit:hover {\\n opacity: 1;\\n}\\n.ab-app-list-edit .webix_list_item {\\n line-height: 50px;\\n}\\n.ab-app-list-edit .webix_icon {\\n line-height: 59px;\\n}\\n.ab-app-list-item {\\n height: 100%;\\n clear: both;\\n}\\n.ab-app-list-edit .webix_list_item {\\n padding: 10px;\\n}\\n.ab-app-list-name {\\n font-size: 20px;\\n line-height: 20px;\\n margin-top: 10px;\\n}\\n.ab-app-list-description {\\n opacity: 0.6;\\n}\\n\\n.webix_list_item .webix_icon {\\n font-size: inherit;\\n}\\n.webix_list_item .webix_icon.wxi-checkbox-marked {\\n font-size: 20px;\\n}\\n.emptypane {\\n line-height: auto;\\n}\\n.opsportal-area-site-default-appbuilder a,\\n.webix_view a {\\n opacity: 1;\\n}\\n.webix_list_item.menu.selected {\\n background: #657584;\\n}\\n.webix_icon_btn {\\n font-size: 20px;\\n}\\n.appTitle .webix_el_box {\\n font-size: 20px !important;\\n}\\n.webix_dark .webix_icon_btn {\\n opacity: 0.4;\\n}\\n.ab_amp .webix_dark .webix_icon_btn {\\n opacity: 1;\\n}\\n.webix_el_button button {\\n /* font-size: 14px; */\\n}\\n.webix_el_button button.webixtype_standard:hover {\\n text-decoration: underline;\\n}\\n.webix_menu-x .webix_list_item {\\n line-height: 31px;\\n}\\n.bg-white {\\n background: white;\\n}\\n.ab-component-tools {\\n position: absolute;\\n top: 2px;\\n right: 33px;\\n}\\n.ab-component-tools.ab-tab-tools {\\n right: 0;\\n z-index: 100;\\n}\\n.ab-component-remove,\\n.ab-component-edit {\\n width: 31px;\\n height: 31px;\\n display: inline-block;\\n margin-right: 1px;\\n font-size: 18px;\\n text-align: center;\\n line-height: 33px !important;\\n background: #4caf50;\\n color: white;\\n top: -2px;\\n position: relative;\\n overflow: hidden;\\n float: right;\\n}\\n.ab-component-remove:hover,\\n.ab-component-edit:hover {\\n cursor: pointer;\\n}\\n.ab-component-remove {\\n background: #ff3b30;\\n}\\n.panel_icon {\\n font-size: 16px;\\n width: 22px;\\n height: 24px;\\n line-height: 24px;\\n}\\n.webix_fieldset_label {\\n width: auto;\\n margin-bottom: 0;\\n border: 0;\\n}\\n.ab-widget-header {\\n background: #eee;\\n}\\n.ab-component-header .webix_el_box {\\n font-size: 24px;\\n}\\n.ab-component-description .webix_el_box {\\n color: #666;\\n}\\n.bg_gray {\\n background-color: #ebedf0;\\n}\\n.noBackground, .webix_dark .webix_sidebar {\\n background-color: transparent;\\n}\\n.webix_dark .webix_view {\\n background-color: transparent;\\n color: white;\\n}\\n.ab_amp .webix_dark .webix_view {\\n background-color: white;\\n color: inherit;\\n}\\n.webix_dark .webix_list-x .webix_list_item {\\n border-right: 0;\\n}\\n.ab-text .ab-detail-component-holder {\\n line-height: 32px;\\n}\\n.webix_tree_checkbox {\\n margin: 5px 6px 0 0 !important;\\n height: 14px;\\n width: 14px;\\n}\\n.ab-menu-left .webix_scroll_cont {\\n text-align: left;\\n}\\n.ab-menu-right .webix_scroll_cont {\\n text-align: right;\\n}\\n.ab-menu-center .webix_scroll_cont {\\n text-align: center;\\n}\\n.ab-menu-link.webix_menu-x .webix_list_item {\\n background: transparent;\\n color: #337ab7;\\n font-weight: bold;\\n padding: 0;\\n margin-right: 15px;\\n}\\n.ab-menu-link.webix_menu-x .webix_list_item:hover {\\n text-decoration: underline;\\n}\\n.ab-custom-field {\\n overflow: visible;\\n}\\n.ab-custom-field .webix_template {\\n padding: 0;\\n}\\n.ab-custom-field legend {\\n border-bottom: none;\\n}\\n\\n.ab-component-form-rule {\\n background-color: #dcdcdc;\\n}\\n.ab-main-container .webix_querybuilder_wrap .webix_layout_form,\\n.ab-main-container .ab-component-form-rules .webix_layout_form {\\n background: inherit !important;\\n}\\n.ab-component-form-rules .webix_view {\\n background: transparent !important;\\n}\\n.ab-component-form-rules {\\n background: #ddd;\\n border-radius: 5px;\\n box-shadow: inset 0px 2px 5px 0px rgba(0, 0, 0, 0.4);\\n position: relative;\\n overflow: visible;\\n}\\n.ab-component-form-rules-delete {\\n background: transparent;\\n}\\n.ab-component-form-rules-delete .ab-component-remove {\\n position: absolute;\\n top: -6px;\\n right: -8px;\\n border-radius: 100%;\\n}\\n/* Connect object data */\\n.ab-connect-add-new a.fa {\\n width: 35px;\\n height: 35px;\\n display: block;\\n float: left;\\n border-radius: 4px;\\n background: #1ca1c1;\\n color: white;\\n opacity: 1;\\n text-align: center;\\n line-height: 35px;\\n}\\n.ab-connect-add-new a.fa:hover {\\n text-decoration: none;\\n background-color: #1992af;\\n}\\n.ab-connect-data-info {\\n display: inline-block;\\n width: 90px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.ab-connect-data-disable {\\n background-color: #aaa;\\n}\\n.stop-scrolling {\\n height: 100%;\\n overflow: hidden;\\n}\\n.ab-scroll-y {\\n overflow-y: auto !important;\\n}\\n.ab-ellipses-text,\\n.ab-ellipses-text > div {\\n overflow: hidden;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n}\\n.webix_dtable .webix_ss_footer .webix_hcell:hover,\\n.webix_dtable .webix_ss_header .webix_hcell:hover {\\n border-right-color: #dadee0;\\n}\\n\\n/* Interface Editor */\\n.ab-widget-header {\\n background-color: #ddd;\\n}\\n.ab-widget-header .webix_icon_btn {\\n opacity: 0.7;\\n margin-left: 5px;\\n}\\n.ab-main-container .widget_drag {\\n position: absolute;\\n z-index: 1;\\n top: 0px;\\n right: 0px;\\n width: 33px;\\n opacity: 1;\\n cursor: move;\\n background-color: #aaa;\\n height: 31px;\\n color: #fff;\\n}\\n.ab-main-container .widget_drag:hover {\\n opacity: 0.8;\\n}\\n.ab-main-container .widget_drag .webix_icon {\\n line-height: 28px;\\n width: 33px;\\n height: 33px;\\n text-align: center;\\n}\\n.webix_el_checkbox .webix_label_right {\\n padding-top: 0;\\n}\\n.webix_cell .ab-image-data-field {\\n /* pointer-events: none; */\\n padding: 0;\\n}\\n.ab-image-holder, .ab-image-holder .webix_template {\\n padding: 0;\\n overflow: visible;\\n}\\n.ab-image-data-field {\\n width: 100%;\\n height: 100%;\\n}\\n.ab-image-data-field-download {\\n position: absolute;\\n left: 0;\\n background-color: #dcdcdc;\\n padding: 3px 1px 1px 1px;\\n opacity: 0.5 !important;\\n text-decoration: none;\\n color: #000;\\n}\\n.ab-image-data-field-download:hover {\\n opacity: 1 !important;\\n text-decoration: none;\\n color: #000;\\n}\\n.detailsView .webix_icon:hover,\\n.edit .webix_icon:hover,\\n.trash .webix_icon:hover {\\n cursor: pointer;\\n}\\n.ab-layout-header {\\n position: relative;\\n}\\n.ab-layout-header > .ab-component-tools {\\n right: 0px;\\n}\\n\\n.transparent {\\n background: transparent !important;\\n}\\n.borderless {\\n border: none !important;\\n}\\n.nopadding {\\n padding: 0 !important;\\n}\\n.nomargin {\\n margin: 0 !important;\\n}\\n.webix_modal {\\n opacity: 0.8;\\n}\\n.modal_title .webix_el_box {\\n font-size: 18px;\\n}\\n/* Loading Screen */\\n.ab-loading-screen {\\n background: #000;\\n opacity: 0.7;\\n position: absolute !important;\\n}\\n.ab-loading-body {\\n background: #000;\\n border-width: 0px !important;\\n}\\n.ab-loading-message {\\n color: #fff !important;\\n background: #000 !important;\\n font-size: 30px !important;\\n text-align: center;\\n vertical-align: middle;\\n border-width: 0px !important;\\n padding-top: 20% !important;\\n height: 100px !important;\\n}\\n.ab-loading-button {\\n text-align: center;\\n}\\n.ab-loading-button button {\\n background-color: #003b7e;\\n width: 200px;\\n}\\n.ab-loading-cancel-button {\\n text-align: center;\\n background: transparent;\\n}\\n.ab-loading-cancel-button a {\\n color: #fff !important;\\n}\\n.ab-loading-screen .webix_progress_bottom {\\n height: 40px !important;\\n opacity: 1;\\n}\\n.ab-loading-screen .webix_progress_bottom .webix_progress_state {\\n height: 40px !important;\\n}\\n.webix_menu-x .webix_list_item:last-child {\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.webix_menu-x .webix_list_item:first-child {\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n}\\n.preview_item {\\n background: #999;\\n}\\n.panel_drag_view {\\n border-width: 0 1px 1px 1px;\\n border-color: 1px solid #dadee0;\\n border-style: solid;\\n}\\n.panel_drag_view:before {\\n content: \\\"\\\";\\n display: block;\\n height: 100%;\\n width: 100%;\\n background: rgb(255, 255, 255);\\n background: linear-gradient(\\n 0deg,\\n rgba(255, 255, 255, 1) 15%,\\n rgba(255, 255, 255, 0) 80%\\n );\\n position: absolute;\\n z-index: 1;\\n top: 31px;\\n}\\n.ab-datacollection-table .ab-component-in-page {\\n text-align: center;\\n line-height: 15px;\\n vertical-align: middle;\\n display: table-cell;\\n}\\n.ab-datacollection-table .webix_dataview_item {\\n display: table;\\n}\\n.ab-datacollection-table .fa {\\n color: #337ab7;\\n margin-bottom: 10px;\\n}\\n.ab-datacollection-table.borderless .webix_dataview_item,\\n.borderless .webix_dataview_item {\\n border: none;\\n padding: 12px;\\n}\\n.ab-datacollection-table .webix_dataview_item:hover {\\n background: #edeff0;\\n border-radius: 5px;\\n}\\n.webix_list_item:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.webix_all_tabs .webix_item_tab.webix_selected,\\n.webix_all_tabs .webix_item_tab.webix_selected:hover,\\n.webix_all_tabs .webix_item_tab.webix_selected:active,\\n.webix_all_tabs .webix_item_tab.webix_selected:focus {\\n color: white;\\n background: #1ca1c199 !important;\\n box-shadow: inset 0 -3px #1ca1c1;\\n}\\n.webix_all_tabs .webix_item_tab,\\n.webix_el_tabbar .webixtype_bottom .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_icon .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_iconTop .webix_tab_more_icon,\\n.webix_el_tabbar .webixtype_image .webix_tab_more_icon {\\n box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.25);\\n background: #ebedf0;\\n}\\n.ab-tab-back:hover,\\n.ab-tab-next:hover,\\n.ab-tab-up:hover,\\n.ab-tab-down:hover {\\n cursor: e-resize;\\n opacity: 1;\\n}\\n.ab-tab-back:hover {\\n cursor: w-resize;\\n}\\n.ab-tab-up:hover {\\n cursor: n-resize;\\n opacity: 1;\\n}\\n.ab-tab-down:hover {\\n cursor: s-resize;\\n}\\n.ab-tab-back,\\n.ab-tab-next,\\n.ab-tab-up,\\n.ab-tab-down {\\n float: left;\\n margin-left: 10px;\\n background: #1ca1c1;\\n opacity: 0.8;\\n width: 20px;\\n height: 20px;\\n border-radius: 10px;\\n line-height: 18px;\\n padding-right: 2px;\\n color: white;\\n}\\n.ab-tab-edit {\\n opacity: 0.4;\\n}\\n.ab-tab-edit:hover {\\n opacity: 1;\\n}\\n.ab-tab-next {\\n float: right;\\n margin-right: 10px;\\n padding-left: 6px;\\n}\\n.ab-tab-up,\\n.ab-tab-down {\\n float: right;\\n margin: 12px -2px 12px 15px;\\n padding-left: 6px;\\n}\\n.webix_all_tabs div:nth-child(1) .ab-tab-back {\\n display: none;\\n}\\n.webix_all_tabs div:nth-last-child(1) .ab-tab-next {\\n display: none;\\n}\\n.webix_tab_filler:nth-last-child(1) {\\n width: 17px !important;\\n}\\n.ab-tabview-scrollview {\\n /* margin-top: -1px; */\\n}\\n.ab-tabIconContainer {\\n display: inline-block;\\n}\\n\\n.webix_view.webix_control.webix_el_tabbar.webix_dark {\\n background: #4a4e58;\\n}\\n.webix_el_tabbar.webix_dark .webix_all_tabs .webix_item_tab {\\n background: transparent;\\n color: white;\\n}\\n.webix_el_tabbar.webix_dark .webix_all_tabs .webix_item_tab:hover {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n.webix_sidebar.webix_dark .webix_tree_item.webix_selected span {\\n color: white;\\n}\\n.webix_sidebar.webix_dark\\n .webix_tree_item.webix_selected\\n span.webix_sidebar_icon {\\n color: inherit;\\n}\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_inp_counter_next,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_inp_counter_prev,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_menu-x .webix_list_item,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_segment_0,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_segment_1,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webix_segment_N,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webixtype_base,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webixtype_next,\\n.webix_layout_toolbar.webix_toolbar.webix_dark .webixtype_prev {\\n border-color: rgba(0, 0, 0, 0.1);\\n}\\n.webix_tree_none {\\n /* display: none; */\\n}\\n.ab-background-lightgray {\\n background: #c0c5cc;\\n}\\n.ab-background-gray {\\n background: #475466;\\n}\\n.ab-background-gray::before {\\n content: \\\"\\\";\\n background: #475466;\\n display: block;\\n position: absolute;\\n left: 0;\\n width: 100%;\\n height: 100vh;\\n}\\n.ab-background-gray .webix_view.webix_layout_form {\\n background: transparent;\\n}\\n.webix_carousel .image {\\n background: #333;\\n}\\n.webix_nav_panel .webix_nav_item {\\n box-sizing: border-box;\\n}\\n.ab-carousel-image-container {\\n position: relative;\\n height: 100%;\\n}\\n.ab-carousel-image-container img {\\n width: 100%;\\n height: 100%;\\n object-fit: contain;\\n}\\n.ab-carousel-image-title {\\n position: absolute;\\n top: 0;\\n left: 0;\\n font-size: 18px;\\n padding: 4px;\\n background: rgba(0, 0, 0, 0.4);\\n border-bottom-right-radius: 8px;\\n color: #fff;\\n}\\n.ab-carousel-image-icon {\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n font-size: 20px;\\n border-bottom-left-radius: 8px;\\n background: rgba(255, 255, 255, 0.4);\\n}\\n.ab-carousel-image-icon span {\\n opacity: 0.6;\\n margin: 6px;\\n}\\n.ab-carousel-image-icon span:hover {\\n opacity: 1;\\n cursor: pointer;\\n}\\n.webix_carousel.fullscreen .ab-carousel-fullscreen {\\n display: none;\\n}\\n.ab-detail-view .webix_accordionitem {\\n border-radius: 5px;\\n box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 2px 0px;\\n border-color: transparent;\\n}\\n.ab-detail-page.ab-detail-hover .webix_accordionitem:hover {\\n box-shadow: rgba(0, 0, 0, 0.2) 0px 3px 2px 0px;\\n}\\n.ab-detail-page .webix_accordionitem:hover .webix_accordionitem_body:after {\\n background: #1da1c14f;\\n width: 100%;\\n height: 100%;\\n display: block;\\n position: absolute;\\n cursor: pointer;\\n top: 0;\\n font-family: \\\"FontAwesome\\\";\\n content: \\\"\\\";\\n color: white;\\n text-align: center;\\n font-size: 72px;\\n vertical-align: middle;\\n}\\n.ab-edit-page .webix_accordionitem:hover {\\n position: relative;\\n}\\n.ab-edit-page .webix_accordionitem:hover .webix_accordionitem_header {\\n display: block !important;\\n position: absolute;\\n right: 0;\\n top: 0;\\n border: 0;\\n z-index: 1;\\n border-bottom-left-radius: 10px;\\n}\\n.ab-edit-page\\n .webix_accordionitem:hover\\n .webix_accordionitem_header\\n .webix_accordionitem_button:before {\\n content: \\\"\\\\f013\\\";\\n font-family: \\\"FontAwesome\\\";\\n color: #94a1b3;\\n}\\n.ab-edit-page.ab-detail-page\\n .webix_accordionitem:hover\\n .webix_accordionitem_header\\n .webix_accordionitem_button:before {\\n color: white;\\n}\\n.ab-edit-page\\n .webix_accordionitem\\n .webix_accordionitem_header:hover\\n .webix_accordionitem_button:before {\\n color: #94a1b3 !important;\\n}\\n.ab-custom-template .webix_template {\\n padding: 10px;\\n}\\n\\n.image-data-field-image {\\n position: relative;\\n border: 5px solid white;\\n background-size: contain;\\n background-position: center;\\n overflow: visible;\\n background-repeat: no-repeat;\\n background-color: #333;\\n}\\n.ab-delete-photo {\\n position: absolute;\\n top: 0;\\n right: 0;\\n}\\n.hasDataCollection {\\n color: #1ca1c1;\\n margin: 5px;\\n position: absolute;\\n right: 0;\\n background: white;\\n}\\n.sidebarCustomIcon {\\n font-family: \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n font-size: 12px !important;\\n background: #94a1b3 !important;\\n border-radius: 100%;\\n width: 20px !important;\\n height: 20px;\\n line-height: 20px;\\n color: #fff !important;\\n font-weight: bold;\\n vertical-align: unset !important;\\n}\\n.webix_dark .sidebarCustomIcon {\\n color: #4a4e58 !important;\\n}\\n.webix_dark .webix_selected .sidebarCustomIcon {\\n background: #1ca1c1 !important;\\n color: #4a4e58 !important;\\n}\\n.webix_selected .sidebarCustomIcon {\\n color: #fff !important;\\n background: #1ca1c1 !important;\\n}\\n\\n/* FormBuilder Clases */\\n.formbuilder {\\n padding: 20px;\\n}\\n.card-header .btn {\\n color: #333;\\n}\\n.card {\\n position: relative;\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-direction: column;\\n flex-direction: column;\\n min-width: 0;\\n word-wrap: break-word;\\n background-color: #fff;\\n background-clip: border-box;\\n border: 1px solid rgba(0, 0, 0, 0.125);\\n border-radius: 0.25rem;\\n}\\n\\n.card > hr {\\n margin-right: 0;\\n margin-left: 0;\\n}\\n\\n.card > .list-group:first-child .list-group-item:first-child {\\n border-top-left-radius: 0.25rem;\\n border-top-right-radius: 0.25rem;\\n}\\n\\n.card > .list-group:last-child .list-group-item:last-child {\\n border-bottom-right-radius: 0.25rem;\\n border-bottom-left-radius: 0.25rem;\\n}\\n\\n.card-body {\\n -ms-flex: 1 1 auto;\\n flex: 1 1 auto;\\n min-height: 1px;\\n padding: 1.25rem;\\n}\\n\\n.card-title {\\n margin-bottom: 0.75rem;\\n}\\n\\n.card-subtitle {\\n margin-top: -0.375rem;\\n margin-bottom: 0;\\n}\\n\\n.card-text:last-child {\\n margin-bottom: 0;\\n}\\n\\n.card-link:hover {\\n text-decoration: none;\\n}\\n\\n.card-link + .card-link {\\n margin-left: 1.25rem;\\n}\\n\\n.card-header {\\n padding: 0.75rem 1.25rem;\\n margin-bottom: 0;\\n background-color: rgba(0, 0, 0, 0.03);\\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-header:first-child {\\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\\n}\\n\\n.card-header + .list-group .list-group-item:first-child {\\n border-top: 0;\\n}\\n\\n.card-footer {\\n padding: 0.75rem 1.25rem;\\n background-color: rgba(0, 0, 0, 0.03);\\n border-top: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-footer:last-child {\\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\\n}\\n\\n.card-header-tabs {\\n margin-right: -0.625rem;\\n margin-bottom: -0.75rem;\\n margin-left: -0.625rem;\\n border-bottom: 0;\\n}\\n\\n.card-header-pills {\\n margin-right: -0.625rem;\\n margin-left: -0.625rem;\\n}\\n\\n.card-img-overlay {\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n padding: 1.25rem;\\n}\\n\\n.card-img,\\n.card-img-bottom,\\n.card-img-top {\\n -ms-flex-negative: 0;\\n flex-shrink: 0;\\n width: 100%;\\n}\\n\\n.card-img,\\n.card-img-top {\\n border-top-left-radius: calc(0.25rem - 1px);\\n border-top-right-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-img,\\n.card-img-bottom {\\n border-bottom-right-radius: calc(0.25rem - 1px);\\n border-bottom-left-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-deck .card {\\n margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n .card-deck {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-flow: row wrap;\\n flex-flow: row wrap;\\n margin-right: -15px;\\n margin-left: -15px;\\n }\\n .card-deck .card {\\n -ms-flex: 1 0 0%;\\n flex: 1 0 0%;\\n margin-right: 15px;\\n margin-bottom: 0;\\n margin-left: 15px;\\n }\\n}\\n\\n.card-group > .card {\\n margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n .card-group {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-flow: row wrap;\\n flex-flow: row wrap;\\n }\\n .card-group > .card {\\n -ms-flex: 1 0 0%;\\n flex: 1 0 0%;\\n margin-bottom: 0;\\n }\\n .card-group > .card + .card {\\n margin-left: 0;\\n border-left: 0;\\n }\\n .card-group > .card:not(:last-child) {\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n }\\n .card-group > .card:not(:last-child) .card-header,\\n .card-group > .card:not(:last-child) .card-img-top {\\n border-top-right-radius: 0;\\n }\\n .card-group > .card:not(:last-child) .card-footer,\\n .card-group > .card:not(:last-child) .card-img-bottom {\\n border-bottom-right-radius: 0;\\n }\\n .card-group > .card:not(:first-child) {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n }\\n .card-group > .card:not(:first-child) .card-header,\\n .card-group > .card:not(:first-child) .card-img-top {\\n border-top-left-radius: 0;\\n }\\n .card-group > .card:not(:first-child) .card-footer,\\n .card-group > .card:not(:first-child) .card-img-bottom {\\n border-bottom-left-radius: 0;\\n }\\n}\\n\\n.card-columns .card {\\n margin-bottom: 0.75rem;\\n}\\n\\n@media (min-width: 576px) {\\n .card-columns {\\n -webkit-column-count: 3;\\n -moz-column-count: 3;\\n column-count: 3;\\n -webkit-column-gap: 1.25rem;\\n -moz-column-gap: 1.25rem;\\n column-gap: 1.25rem;\\n orphans: 1;\\n widows: 1;\\n }\\n .card-columns .card {\\n display: inline-block;\\n width: 100%;\\n }\\n}\\n\\n.accordion > .card {\\n overflow: hidden;\\n}\\n\\n.accordion > .card:not(:last-of-type) {\\n border-bottom: 0;\\n border-bottom-right-radius: 0;\\n border-bottom-left-radius: 0;\\n}\\n\\n.accordion > .card:not(:first-of-type) {\\n border-top-left-radius: 0;\\n border-top-right-radius: 0;\\n}\\n\\n.accordion > .card > .card-header {\\n border-radius: 0;\\n margin-bottom: -1px;\\n}\\n.form-builder-group-header {\\n padding: 0;\\n}\\n.formio .btn:hover,\\n.btn:focus {\\n background-position: 0 0 !important;\\n}\\n.mb-0,\\n.my-0 {\\n margin-bottom: 0 !important;\\n}\\n.mt-0,\\n.my-0 {\\n margin-top: 0 !important;\\n}\\n.scrolly {\\n overflow: scroll;\\n}\\n.forceOpen {\\n display: block !important;\\n}\\n.formio .btn-secondary,\\n.formio-dialog .btn-secondary {\\n color: #333;\\n}\\n.formio-dialog a,\\n.formio a {\\n opacity: 1 !important;\\n}\\n.component-settings .nav > li > a {\\n margin-bottom: -7px;\\n}\\n.formio-form .input-group {\\n display: flex;\\n}\\n.formio-form .input-group-append {\\n margin-left: -1px;\\n}\\n.formio-form .input-group-append,\\n.formio-form .input-group-prepend {\\n display: -ms-flexbox;\\n display: flex;\\n}\\n.formio-form .input-group-text {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-align: center;\\n align-items: center;\\n padding: 0.375rem 0.75rem;\\n margin-bottom: 0;\\n font-size: 1rem;\\n font-weight: 400;\\n line-height: 1.5;\\n color: #495057;\\n text-align: center;\\n white-space: nowrap;\\n background-color: #e9ecef;\\n border: 1px solid #ced4da;\\n border-radius: 0.25rem;\\n}\\n.formio-form .input-group > .input-group-append > .btn,\\n.formio-form .input-group > .input-group-append > .input-group-text,\\n.formio-form\\n .input-group\\n > .input-group-prepend:first-child\\n > .btn:not(:first-child),\\n.formio-form\\n .input-group\\n > .input-group-prepend:first-child\\n > .input-group-text:not(:first-child),\\n.formio-form .input-group > .input-group-prepend:not(:first-child) > .btn,\\n.formio-form\\n .input-group\\n > .input-group-prepend:not(:first-child)\\n > .input-group-text {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n}\\n.formio-form .nav-tabs > li {\\n margin-bottom: -8px;\\n}\\n.formio-dialog .formio-form .nav-tabs > li {\\n margin-bottom: -1px;\\n}\\n.max100 {\\n max-width: 100%;\\n}\\n.webix_qb_buttons button {\\n height: auto;\\n}\\n.no-margin {\\n margin: 0 !important;\\n}\\n.ab_amp .fa-stack {\\n font-size: 0.65em;\\n}\\n.ab_amp i {\\n vertical-align: middle;\\n}\\n.ab_amp.lightgray {\\n background: #eee;\\n}\\n.ab_amp .webixLineTree:hover {\\n cursor: pointer;\\n}\\n.ab_amp .accessLevel .fa-stack {\\n vertical-align: top;\\n margin-top: 3px;\\n}\\n.ab_amp .accessLevel:hover .fa-stack {\\n transform: scale(1.25, 1.25);\\n}\\n.ab_amp .externalLink {\\n color: #ccc;\\n float: right;\\n margin-top: 5px;\\n}\\n.ab_amp .externalLink:hover {\\n color: #666 !important;\\n}\\n.ab_amp .webix_accordionitem .webix_accordionitem_button,\\n.ab_amp .webix_accordionitem.collapsed .webix_accordionitem_button {\\n float: left !important;\\n}\\n.ab_amp .webix_accordionitem .webix_accordionitem_button {\\n transform: rotate(180deg);\\n}\\n.ab_amp .webix_accordionitem.collapsed .webix_accordionitem_button {\\n transform: rotate(-90deg);\\n}\\n.ab_amp .webix_accordionitem_header {\\n background-color: #1ca1c1 !important;\\n}\\n.ab_amp .webix_accordionitem_header.collapsed {\\n background-color: white !important;\\n}\\n.ab_amp .webix_danger_inverse button {\\n border: 1px solid #ff4938;\\n color: #ff4938;\\n background: white;\\n}\\n.ab_amp .webix_danger_inverse .webix_icon_btn {\\n color: #ff4938;\\n}\\n.ab_amp .webix_danger_inverse:hover button {\\n background-color: #ff4938;\\n color: #fff;\\n}\\n.ab_amp .webix_danger_inverse:hover .webix_icon_btn {\\n color: #fff;\\n}\\ndiv.amp {\\n font-family: \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n background: rgb(28, 161, 193, 0.4);\\n /* padding: 5px 0; */\\n display: inline-block;\\n right: 0;\\n top: 75px;\\n border-top-left-radius: 10px;\\n border-bottom-left-radius: 10px;\\n color: white;\\n font-size: 16px;\\n transition: 0.25s all;\\n position: absolute;\\n width: 40px;\\n white-space: nowrap;\\n overflow: hidden;\\n height: 32px;\\n z-index: 100;\\n display: flex;\\n}\\ndiv.amp.qtt {\\n top: 108px;\\n}\\ndiv.amp div {\\n padding: 5px 10px;\\n}\\ndiv.amp div:first-child {\\n background: rgba(255, 255, 255, 0.2);\\n border-right: 1px solid rgba(255, 255, 255, 0.4);\\n padding: 5px 10px;\\n}\\ndiv.amp:hover {\\n width: 212px !important;\\n cursor: pointer;\\n background: rgb(28, 161, 193) !important;\\n}\\ndiv.amp:hover .fa-unlock-alt {\\n display: inline-block !important;\\n}\\ndiv.amp:hover .fa-lock {\\n display: none !important;\\n}\\ndiv.amp .fa-unlock-alt,\\ndiv.amp .fa-lock,\\ndiv.amp .fa-language {\\n transform: scale(1.25, 1.25);\\n text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2);\\n}\\ndiv.amp .fa-unlock-alt {\\n display: none;\\n}\\n.ampWindow .webix_toolbar.webix_dark {\\n background: #444 !important;\\n}\\n/* .accessLevel-0::before {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n background: rgba(233, 30, 30, 0.4);\\n display: block;\\n position: absolute;\\n}\\n.accessLevel-1::before {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n background: rgba(33, 150, 243, 0.4);\\n display: block;\\n position: absolute;\\n}\\n.accessLevel-2::before {\\n content: \\\"\\\";\\n width: 100%;\\n height: 100%;\\n background: rgba(76, 175, 80, 0.4);\\n display: block;\\n position: absolute;\\n} */\\n.ab-csv-importer .row-pass {\\n background-color: #b4e8b6;\\n}\\n.ab-csv-importer .row-fail {\\n background-color: #e4b0ad;\\n}\\n.ab-csv-importer .row-warn {\\n background-color: #f9d59f;\\n}\\n.ab-csv-importer .cell-invalid {\\n background-color: #e9ab4d;\\n}\\n.transparentBG .webix_el_tabbar + .webix_multiview {\\n background: transparent !important;\\n}\\n.webix_hcell .fa {\\n opacity: 0.4;\\n}\\n.ab-widget-header .webix_template {\\n padding: 0 10px;\\n}\\n.ab-layout-header .webix_template {\\n padding: 0;\\n line-height: 30px;\\n}\\n.ab-widget-header .webix_template div {\\n line-height: 30px;\\n}\\n.ab-widget-header .webix_template div .fa,\\n.ab-layout-header .fa {\\n vertical-align: middle;\\n}\\n#offlinePrompt,\\n#connectionPrompt {\\n line-height: 30px;\\n color: white;\\n background: #f44336;\\n font-size: 14px;\\n text-align: center;\\n transition: all 1s;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);\\n overflow: hidden;\\n}\\n#connectionPrompt {\\n background: #f44336;\\n}\\n#countdown {\\n height: 20px;\\n width: 20px;\\n text-align: center;\\n display: inline-block;\\n line-height: 20px;\\n position: relative;\\n bottom: 2px;\\n font-size: 9px;\\n}\\n\\n#countdown-number {\\n color: white;\\n display: inline-block;\\n width: 20px;\\n height: 20px;\\n}\\n\\n#countdown svg {\\n width: 20px;\\n height: 20px;\\n transform: rotateY(-180deg) rotateZ(-90deg);\\n position: absolute;\\n margin-left: -20px;\\n}\\n\\n#countdown svg circle {\\n stroke-dasharray: 56px;\\n stroke-dashoffset: 0px;\\n stroke-linecap: round;\\n stroke-width: 2px;\\n stroke: white;\\n fill: none;\\n animation: countdown 30s linear infinite forwards;\\n}\\n\\n@keyframes countdown {\\n from {\\n stroke-dashoffset: 0px;\\n }\\n to {\\n stroke-dashoffset: 56px;\\n }\\n}\\n#reloadPrompt {\\n position: absolute;\\n z-index: 200000;\\n top: 0;\\n bottom: 0;\\n left: 0;\\n right: 0;\\n background: rgba(0, 0, 0, 0.7);\\n display: flex;\\n}\\n#reloadPrompt div {\\n background: #f44336;\\n width: 250px;\\n border: 3px solid white;\\n margin: auto auto;\\n padding: 20px;\\n text-align: center;\\n border-radius: 10px;\\n color: white;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);\\n}\\n.reloadPage {\\n background: rgba(0, 0, 0, 0.2);\\n border: none;\\n padding: 5px 10px;\\n border-radius: 5px;\\n margin-top: 10px;\\n}\\n.reloadPage:hover {\\n background: rgba(0, 0, 0, 0.4);\\n}\\n.webix_warn .webix_button {\\n background: #ff9800 !important;\\n color: #fff !important;\\n}\\n.webix_dark .webix_inp_bottom_label {\\n color: lightgray;\\n font-style: oblique;\\n}\\n.no-margin {\\n margin: 0;\\n}\\n.inbox_drawer.webix_toolbar.webix_dark .webix_secondary button,\\n.mainToolbar.webix_toolbar.webix_dark .webix_secondary button {\\n background-color: transparent;\\n}\\n.inbox_drawer.webix_toolbar.webix_dark .webix_secondary button:hover,\\n.mainToolbar.webix_toolbar.webix_dark .webix_secondary button:hover {\\n background-color: rgba(0, 0, 0, 0.2);\\n}\\n/* Login Page */\\n.portalLogin {\\n /* opacity: 0; */\\n background: #ebedf0;\\n background: linear-gradient(\\n 0deg,\\n rgba(171, 171, 171, 1) 0%,\\n rgba(235, 237, 240, 1) 100%\\n );\\n /* -webkit-animation: 1s ease 0s normal forwards 1 fadein;\\n animation: 1s ease 0s normal forwards 1 fadein; */\\n}\\n.portalLoginForm {\\n opacity: 0;\\n -webkit-animation: 1s ease 0s normal forwards 1 fadein;\\n animation: 1s ease 0s normal forwards 1 fadein;\\n background: white;\\n border-radius: 30px;\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n position: relative;\\n top: -20px;\\n transform: scale(1.2);\\n}\\n.portalLogin .webix_view {\\n overflow: visible;\\n display: inline-block;\\n}\\n.preload-card {\\n opacity: 0;\\n animation: 1s ease 0s normal forwards 1 onlyfadein;\\n background: white;\\n border-radius: 30px;\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n position: relative;\\n\\n}\\ndiv.webix_dataview_item.webix_transparent {\\n padding: 0px;\\n}\\n@keyframes fadein {\\n 0% {\\n opacity: 0;\\n top: -20px;\\n transform: scale(1.1);\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n }\\n 100% {\\n opacity: 1;\\n top: 0;\\n transform: scale(1);\\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.4);\\n }\\n}\\n\\n@keyframes onlyfadein {\\n 0% {\\n opacity: 0;\\n box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.4);\\n }\\n 100% {\\n opacity: 1;\\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.4);\\n }\\n}\\n\\n@-webkit-keyframes fadein {\\n 0% {\\n opacity: 0;\\n }\\n 100% {\\n opacity: 1;\\n }\\n}\\n.ab-connect-add-new-link .webix_icon_btn {\\n margin-right: 0;\\n}\\n.image-data-field-icon {\\n border: 2px dashed rgba(0, 0, 0, 0.3);\\n border-radius: 10px;\\n padding: 5px;\\n display: flex;\\n flex-direction: row;\\n text-align: center;\\n justify-content: center;\\n align-items: center;\\n line-height: 12px;\\n font-size: 10px;\\n color: rgba(0, 0, 0, 0.5);\\n margin: 5px;\\n height: calc(100% - 10px);\\n overflow: hidden;\\n box-sizing: border-box;\\n}\\n.webix_cell > .ab-image-data-field {\\n margin-left: -12px;\\n}\\n.ab-delete-photo {\\n background: red;\\n color: white;\\n font-size: 10px;\\n text-align: center;\\n line-height: 20px;\\n width: 20px;\\n height: 20px;\\n border-radius: 10px;\\n top: -3px;\\n right: -3px;\\n transition: all 0.25s;\\n}\\n.ab-delete-photo:hover {\\n color: white;\\n font-size: 14px;\\n}\\n.webix_transparent .webix_button .webix_icon,\\n.webix_transparent .webix_button .webix_icon_btn {\\n color: #1ca1c1;\\n}\\n.webix_icon_btn {\\n margin-right: 0 !important;\\n vertical-align: baseline;\\n}\\n.webix_list_icon.webix_icon {\\n vertical-align: baseline;\\n}\\n.webix_list_item.menu {\\n color: inherit;\\n}\\n.ab-datacollection-list-item {\\n position: relative;\\n}\\n.ab-object-list-item {\\n position: relative;\\n}\\n.ab-object-list-edit {\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n.webix_el_label.formText .webix_el_box {\\n font-weight: normal;\\n}\\n\\n.switcheroo .webix_win_head .webix_layout_line {\\n background: #657584;\\n color: #fff;\\n}\\n.switcheroo .webix_win_head .webix_view .webix_template {\\n background: #657584;\\n color: #fff;\\n}\\n.portal_work_warning_banner {\\n background: #e64b2a;\\n color: #fff;\\n}\\n.portal_work_warning_banner .webix_el_box {\\n color: #fff;\\n}\\n.portal_work_warning_banner .webix_button {\\n color: #fff;\\n font-size: 14px;\\n}\\n.portal_work_switcheroo_user_switched {\\n background: #2196f3;\\n color: #fff;\\n}\\n.portal_work_switcheroo_user_switched .webix_el_box {\\n color: #fff;\\n}\\n/* Query Override */\\n.wbq-field-box {\\n max-width: 95% !important;\\n}\\n/* Tutorial Manager */\\n.highlightMe,\\n.findDataCy [data-cy] {\\n position: relative !important;\\n}\\n.highlightMe:before,\\n.findDataCy [data-cy]:hover:before {\\n content: \\\"\\\" !important;\\n width: 100% !important;\\n height: 100% !important;\\n border: 2px solid red !important;\\n border-style: inset !important;\\n position: absolute !important;\\n top: 0 !important;\\n left: 0 !important;\\n cursor: help !important;\\n}\\ninput.highlightMe,\\ntextarea.highlightMe,\\nbutton.highlightMe,\\n.findDataCy input[data-cy]:hover,\\n.findDataCy textarea[data-cy]:hover,\\n.findDataCy button[data-cy]:hover {\\n border: 2px solid red !important;\\n border-style: inset !important;\\n cursor: help !important;\\n}\\n.hintItem {\\n position: relative;\\n overflow: visible !important;\\n margin: 10px;\\n padding: 10px;\\n border: 1px solid #efefef;\\n border-radius: 5px;\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.hintItem:hover {\\n background: #efefef;\\n}\\n.hintItem h1 {\\n font-size: 18px;\\n padding: 0;\\n margin: 0;\\n}\\n.hintItem p {\\n margin: 0;\\n font-size: 14px;\\n line-height: 18px;\\n color: #6c757d;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n display: -webkit-box;\\n -webkit-line-clamp: 2;\\n -webkit-box-orient: vertical;\\n}\\n.deleteHint,\\n.deleteStep {\\n position: absolute;\\n right: -5px;\\n top: -5px;\\n background: red;\\n color: white;\\n width: 20px;\\n height: 20px;\\n line-height: 20px;\\n text-align: center;\\n border-radius: 10px;\\n}\\n.deleteHint:hover,\\n.deleteStep:hover {\\n transform: scale(1.1);\\n cursor: pointer;\\n}\\n.deleteStep {\\n right: 25px;\\n}\\n.active0 {\\n opacity: 0.4;\\n}\\n.highlightWin {\\n font-size: 18px;\\n text-align: center;\\n}\\n.stepPos {\\n font-size: 20px;\\n width: 35px;\\n height: 35px;\\n margin: 0 auto;\\n background: #657584;\\n line-height: 35px;\\n text-align: center;\\n color: white;\\n border-radius: 100%;\\n}\\n.wider_popup {\\n width: 250px !important;\\n}\\n.wider_popup .webix_list_item {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.webix_hint {\\n padding-bottom: 60px !important;\\n}\\n.dontShow {\\n font-size: 12px;\\n font-weight: normal;\\n font-style: italic;\\n display: block;\\n padding: 0;\\n margin: 15px 0 0 0;\\n}\\n.dontShow input {\\n vertical-align: text-top;\\n}\\n.pdf-data-view .webix_selected {\\n background-color: #87c3d1;\\n}\\n.pdf-data-view-item {\\n display: flex;\\n flex-direction: row;\\n flex-wrap: nowrap;\\n justify-content: space-between;\\n}\\n.pdf-data-view-image {\\n position: relative;\\n}\\n.pdf-data-view-image-icon {\\n transition: .5s ease;\\n opacity: 0;\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n transform: translate(-50%, -50%);\\n -ms-transform: translate(-50%, -50%);\\n text-align: center;\\n}\\n.pdf-data-view-image:hover canvas {\\n opacity: 0.7;\\n}\\n.pdf-data-view-image:hover .pdf-data-view-image-icon {\\n opacity: 0.9;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import ConfigDesktop from \"./configDesktop\";\nimport ConfigMobile from \"./configMobile\";\n\n// var EventEmitter = require(\"events\").EventEmitter;\nimport { defaultsDeep } from \"lodash\";\n\nconst settingsDefault = {\n \"appbuilder-portal-autoenter\": true,\n // {bool} autoenter\n // open up the portal as soon as we load.\n // false : just displays a link that will load the portal\n\n \"appbuilder-portal-fullscreen\": true,\n // {bool} fullscreen\n // take up the full browser window?\n // false : only take up the area the current div is\n\n \"appbuilder-tenant\": null,\n // {string} tenant\n // the tenant uuid for this AppBuilder instance.\n\n \"appbuilder-view\": \"work\",\n // {string} view\n // the default view to display to the current user.\n\n \"appbuilder-tenant-prefix\": null,\n // TESTING! Remove this\n};\n\nconst configDefaults = {\n site: {\n appbuilder: {\n networkType: \"socket\",\n // options: [\"rest\", \"relay\", \"socket\"]\n // Note: \"socket\" is required for realtime updates across devices.\n\n networkNumRetries: 3,\n // the number of times we will retry sending a network request\n // when we receive a timeout error.\n\n urlCoreServer: window.location.origin,\n // on the web client, just record the current URL by default.\n // the site config can override this if they want.\n },\n storage: {\n encrypted: false,\n // {bool} should we encrypt our data in the local browser storage?\n },\n },\n};\nclass Config {\n constructor() {\n // this.setMaxListeners(0);\n this._config = null;\n // {obj} _config\n // these are the configuration settings returned from the server. These\n // are more detailed configuration settings for the running of the site.\n\n this._configUser = null;\n // {obj} _configUser\n // the default settings for the current user of the system.\n // .user {obj} the current info for who we think is using the site\n // .userReal {obj} if switheroo'd, this is the actual user\n\n this._settings = {};\n // {obj} _settings\n // settings are the configuration parameters found on the base
    \n // these settings are the minimum needed to successfully pull up the\n // portal popup and perform the initial config request\n }\n\n config(json) {\n this._config = this._config || {};\n Object.keys(json).forEach((k) => {\n this._config[k] = json[k];\n });\n defaultsDeep(this._config, configDefaults);\n }\n\n configInbox(json) {\n this._config = this._config || {};\n this._config.inbox = json.inbox || [];\n this._config.inboxMeta = json.inboxMeta || [];\n }\n\n configUser(json) {\n this._configUser = json;\n }\n\n setting(key, value) {\n if (value) {\n this._settings[key] = value;\n return;\n }\n return this._settings[key];\n }\n\n settingsFromDiv(div) {\n Object.keys(settingsDefault).forEach((d) => {\n var val = div.getAttribute(d);\n if (!val) {\n val = settingsDefault[d];\n }\n if (val === \"false\") val = false;\n if (val === \"true\") val = true;\n\n var key = d.split(\"-\").pop();\n this.setting(key, val);\n });\n }\n\n settings(json = {}) {\n for (let key in settingsDefault) {\n const val = json[key] ?? settingsDefault[key];\n this.setting(key.split(\"-\").pop(), val);\n }\n }\n\n /**\n * definitions()\n * return the ABDefinition(s) required to manage the interface.\n * @return {obj}\n * { ABDefinition.id : {ABDefinition} } hash of definitions.\n */\n definitions() {\n return window.definitions;\n }\n\n error(/* ...args */) {\n console.error(\"Who is calling this? -> move to AB.error() instead.\");\n // this.emit(\"ab.error\", args);\n }\n\n labelConfig() {\n if (this._config && this._config.labels) {\n return this._config.labels;\n }\n console.error(\"No Label config found.\");\n return {};\n }\n\n languageConfig() {\n if (this._config && this._config.languages) {\n return this._config.languages;\n }\n console.error(\"No Language config found.\");\n return {};\n }\n\n metaConfig() {\n if (this._config && this._config.meta) {\n return this._config.meta;\n }\n console.error(\"No Meta config found.\");\n return {};\n }\n\n plugins() {\n // TODO: Pull from this._config.plugins\n return [\"ABDesigner.js\"];\n // return [];\n }\n\n inboxConfig() {\n if (this._config && this._config.inbox) {\n return this._config.inbox;\n }\n return null;\n }\n\n inboxMetaConfig() {\n if (this._config && this._config.inboxMeta) {\n return this._config.inboxMeta;\n }\n return null;\n }\n\n /**\n * @typedef SiteConfig\n * @property {Object} appbuilder\n * @property {number} appbuilder.networkNumRetries\n * @property {\"socket\"|\"rest\"|\"relay\"} appbuilder.networkType\n * @property {string} appbuilder.urlCoreServer\n * @property {boolean} [relay] whether relay is enabled on the server\n * @property {Object} [storage]\n * @property {boolean} storage.encrypted\n * @property {Array<{uuid: string, key: string}>} [tenants]\n * @property {string} [privacyPolicy]\n */\n /** @returns {SiteConfig} */\n siteConfig() {\n if (this._config && this._config.site) {\n return this._config.site;\n }\n return configDefaults.site;\n }\n\n tenantConfig() {\n if (this._config && this._config.tenant) {\n return this._config.tenant;\n }\n return null;\n }\n\n uiSettings() {\n if (window.innerWidth < 768) {\n return ConfigMobile;\n }\n return ConfigDesktop;\n }\n\n /**\n * @typedef User - based on SITE_USER\n * @property {string} email email address\n * @property {string} id\n * @property {number} isActive wether the user is active in the system\n * @property {string} languageCode\n * @property {string} username\n * ...\n */\n\n /**\n * Information about the current user\n * @returns {User|null}\n */\n userConfig() {\n return this._configUser?.user ?? null;\n }\n\n userReal() {\n return this._configUser?.userReal ?? false;\n }\n}\nexport default new Config();\n","/**\n * @class configDesktop\n *\n * Manage our configuration settings for Desktop styles.\n\n */\n\nexport default {\n // Application List\n appListRowHeight: 67,\n\n // button types\n buttonWidthLarge: 200,\n buttonWidthMedium: 150,\n buttonWidthSmall: 100,\n buttonWidthExtraSmall: 50,\n\n // tab types\n tabWidthLarge: 200,\n tabWidthMedium: 120,\n tabWidthSmall: 100,\n tabWidthExtraSmall: 50,\n\n // column types\n columnWidthXLarge: 350,\n columnWidthLarge: 250,\n columnWidthMedium: 200,\n columnWidthSmall: 150,\n columnWidthExtraSmall: 100,\n\n // spacers\n xSmallSpacer: 5,\n smallSpacer: 10,\n mediumSpacer: 25,\n largeSpacer: 50,\n xLargeSpacer: 100,\n xxLargeSpacer: 200,\n xxxLargeSpacer: 400,\n appListSpacerRowHeight: 100,\n appListSpacerColMinWidth: 100,\n appListSpacerColMaxWidth: 200,\n objectWorkspaceColWidth: 20,\n\n // labels\n labelWidthSmall: 50,\n labelWidthMedium: 80,\n labelWidthLarge: 120,\n labelWidthXLarge: 150,\n labelWidthXXLarge: 200,\n labelWidthXXXLarge: 280,\n labelWidthCheckbox: 0,\n\n // show elements on desktop\n hideMobile: false,\n};\n","/**\n * @class configMobile\n *\n * Manage our configuration settings for mobile styles.\n\n */\n\nexport default {\n // Application List\n appListRowHeight: 67,\n\n // button types\n buttonWidthLarge: 200,\n buttonWidthMedium: 150,\n buttonWidthSmall: 100,\n buttonWidthExtraSmall: 50,\n\n // tab types\n tabWidthLarge: 200,\n tabWidthMedium: 120,\n tabWidthSmall: 100,\n tabWidthExtraSmall: 50,\n\n // column types\n columnWidthLarge: 250,\n columnWidthMedium: 200,\n columnWidthSmall: 150,\n columnWidthExtraSmall: 100,\n\n // spacers\n xSmallSpacer: 1,\n smallSpacer: 1,\n mediumSpacer: 10,\n largeSpacer: 20,\n xLargeSpacer: 50,\n xxLargeSpacer: 100,\n xxxLargeSpacer: 120,\n appListSpacerRowHeight: 10,\n appListSpacerColMinWidth: 1,\n appListSpacerColMaxWidth: 1,\n objectWorkspaceColWidth: 1,\n\n // labels\n labelWidthSmall: 50,\n labelWidthMedium: 80,\n labelWidthLarge: 120,\n labelWidthXLarge: 120,\n labelWidthXXLarge: 120,\n labelWidthCheckbox: 0,\n\n // hide elements for mobile\n hideMobile: true,\n};\n","// Include all CSS here\nimport \"./styles/loader.css\";\nimport \"./js/webix/webix.css\";\nimport \"./js/webix/components/gantt/gantt.min.css\";\nimport \"./js/webix/components/reports/reports.min.css\";\nimport \"./js/webix/components/query/query.min.css\";\nimport \"./js/webix/components/scheduler/scheduler.min.css\";\nimport \"./js/webix/components/querybuilder/querybuilder.min.css\";\nimport \"./js/webix/components/hint/hint.css\";\nimport \"./styles/ui.css\";\n// NOTE: keep Font Awesome AFTER webix css so webix wont\n// override our icon stylesimport \"./styles/font-awesome.min.css\";\nimport \"./styles/font-awesome.min.css\";\n\nimport performance from \"./utils/performance\";\nperformance.init();\n\nimport Bootstrap from \"./init/Bootstrap.js\";\n// Bootstrap is responsible for initializing the platform.\n\n// Import webix dynamically so we load it before we load other files that need it\nconst webixLoading = import(\n /* webpackChunkName: \"webix\" */\n /* webpackPreload: true */\n \"./js/webix/webix.min.js\"\n).then(async (webix) => {\n // Make sure webix is global object\n window.webix = webix;\n // Now load additional webix resources\n import(\n /* webpackChunkName: \"webix.resources\" */\n /* webpackPreload: true */\n \"./js/webix/webixResources\"\n );\n});\n\n// __AB_preload should be created by our /config/preload script that gets\n// loaded on the initial page load.\nPromise.all([window.__AB_preload, window.__AB_socketReady]).then(() => {\n delete window.__AB_preload_resolve;\n delete window.__AB_socketReady_resolve;\n Bootstrap.init(webixLoading).catch((err) => {\n // This is a known error that has already been handled.\n if (err.code == \"ENODEFS\") return;\n\n var errorMSG = err.toString();\n\n Bootstrap.alert({\n type: \"alert-error\",\n title: \"Error initializing Portal:\",\n text: errorMSG,\n });\n\n Bootstrap.error(err);\n });\n});\n","/*\n * Bootstrap.js\n * This file drives the setup and preparation of the Web Platform.\n * It's main job is to prepare all the local Resources for operation as\n * well the main ABFactory object that will drive the rest of the applications.\n */\n\nimport events from \"events\";\n\nconst EventEmitter = events.EventEmitter;\n\nimport Config from \"../config/Config.js\";\n\nimport initConfig from \"../init/initConfig.js\";\nimport \"../init/initConnectListerner.js\";\nimport initDiv from \"../init/initDiv.js\";\nimport initUser from \"../init/initUser.js\";\n// import initResources from \"../init/initResources.js\";\n\n// import JSZipUtils from \"jszip-utils/dist/jszip-utils.min.js\";\n\n// import Selectivity from \"../js/selectivity/selectivity.min.js\";\n// import selectivityCSS from \"../js/selectivity/selectivity.min.css\";\n\nimport UI from \"../ui/ui.js\";\nimport ErrorNoDefsUI from \"../ui/error_noDefs.js\";\n\nimport performance from \"../utils/performance.js\";\n\nclass Bootstrap extends EventEmitter {\n constructor() {\n super();\n this.setMaxListeners(0);\n\n // Common Reference to Configuration Values\n this.Config = Config;\n\n //\n // UI Related\n //\n\n this._div = null;\n // {el} _div\n // the HTML element that is the where our initial [click] here button\n // should be displayed. Our actual portal is a popup, but the base\n //
    can be used for an embedded view.\n\n this._plugins = [];\n // {array} ._plugins\n // an array of the loaded plugins we need to register.\n\n this._ui = null;\n // {obj} ._ui\n // the Webix Object that is our UI display\n\n this.on(\"error\", (err) => {\n performance.error(err);\n });\n }\n\n /**\n * @param {Promise} webixLoading - so we know when webix is finished loading\n */\n async init(webixLoading) {\n const loadABFactory = import(\n /* webpackChunkName: \"AB\" */\n /* webpackPrefetch: true */\n \"../AppBuilder/ABFactory\"\n );\n // @const {Promise} loadABFactory Defer loading the ABFactory for a smaller\n // inital file size, allowing us to show the loading UI sooner.\n /**\n * @type {Function} preloadMessage\n * @description show a loading message\n * @param {string} message to display on the loading screen\n */\n const preloadMessage = (m) =>\n (document.getElementById(\"preload-text\").innerHTML = m);\n /**\n * @type {Function}\n * @description remove the preload ui elements\n */\n const destroyPreloadUI = () =>\n document.getElementById(\"preloader\").remove();\n\n const networkTestWorker = new Worker(\n new URL(\"../utils/networkTest.js\", import.meta.url)\n );\n let networkIsSlow = false;\n networkTestWorker.onmessage = ({ data }) => {\n if (networkIsSlow !== data) {\n networkIsSlow = data;\n const $uiWarning = document.getElementById(\n \"preload_network_warning\"\n );\n $uiWarning.hidden = !networkIsSlow;\n // Tell sentry our network speed changed\n performance.setContext(\"breadcrumb\", {\n category: \"network\",\n message: networkIsSlow\n ? \"Slow network detected\"\n : \"Network speed restored\",\n level: \"info\",\n });\n }\n };\n\n preloadMessage(\"Waiting for the API Server\");\n\n performance.mark(\"bootstrap\", { op: \"function\" });\n // on the web platform, we need to gather the appropriate configuration\n // information before we can show the UI\n // 1) Find or create the DIV element our UI is to attach to\n // this DIV element can contain settings pertainent to our setup\n performance.mark(\"initDiv\", { op: \"ui.render\" });\n await initDiv.init(this);\n performance.measure(\"initDiv\");\n\n // 2) Request the User's Configuration Information from the server.\n performance.mark(\"initConfig\", { op: \"function\" });\n preloadMessage(\"Getting Configuration Settings\");\n await initConfig.init(this);\n performance.measure(\"initConfig\");\n\n await initUser.init(this);\n const userInfo = Config.userConfig();\n\n if (userInfo) {\n // load definitions for current user\n performance.setContext(\"user\", {\n id: userInfo.id,\n });\n // redirect if has refererUrlPWA\n const refererUrlPWA = sessionStorage.getItem(\"refererUrlPWA\");\n if (refererUrlPWA) {\n sessionStorage.removeItem(\"refererUrlPWA\");\n window.location.assign(refererUrlPWA);\n }\n } else {\n let { options: tenantConfig } = Config.tenantConfig();\n tenantConfig =\n typeof tenantConfig === \"string\"\n ? JSON.parse(tenantConfig)\n : tenantConfig;\n // If no user and tenant isn't using local auth start\n // the external auth workflow:\n if (tenantConfig.authType !== \"login\") {\n window.location.assign(\"/auth/login\");\n return;\n }\n // Keep going if the tenant is using local auth\n }\n // 2.5) Load any plugins\n performance.mark(\"loadPlugins\", { op: \"function\" });\n\n // Plugins are now loaded via the Preloader and stored in\n (window.__AB_Plugins || []).forEach((p) => {\n this.addPlugin(p);\n });\n performance.measure(\"loadPlugins\");\n\n // 3) Now we have enough info, to create an instance of our\n // {ABFactory} that drives the rest of the AppBuilder objects\n performance.mark(\"createABFactory\", { op: \"function\" });\n preloadMessage(\"Starting AppBuilder\");\n\n const { default: ABFactory } = await loadABFactory;\n let definitions = Config.definitions() || null;\n\n if (definitions) {\n // NOTE: when loading up an unauthorized user,\n // definitions will be null: we can skip the plugins\n // Q: is it possible to load a plugin when unauthorized?\n this._plugins.forEach((p) => {\n definitions = definitions.concat(p.definitions());\n });\n }\n this.AB = new ABFactory(definitions);\n\n if (!window.AB) window.AB = this.AB;\n // Make our Factory Global.\n // NOTE: our tests are expecting to access our ABFactory this way.\n\n this.AB.Network.registerNetworkTestWorker(\n networkTestWorker,\n networkIsSlow\n );\n await this.AB.init();\n await webixLoading;\n // NOTE: special case: User has no Roles defined.\n // direct them to our special ErrorNoDefsUI\n if (userInfo && userInfo.roles.length == 0) {\n performance.measure(\"createABFactory\");\n ErrorNoDefsUI.init(this.AB);\n ErrorNoDefsUI.attach();\n ErrorNoDefsUI.show();\n if (Config.userReal()) {\n ErrorNoDefsUI.switcherooUser(Config.userConfig());\n }\n destroyPreloadUI();\n this.ui(ErrorNoDefsUI);\n\n let err = new Error(\"No Definitions\");\n err.code = \"ENODEFS\";\n throw err;\n }\n\n // 3.5 prepare the plugins\n this._plugins.forEach((p) => {\n p.apply(this.AB);\n const labels = p.labels(this.AB.Multilingual.currentLanguage());\n this.AB.Multilingual.pluginLoadLabels(p.key, labels);\n });\n performance.measure(\"createABFactory\");\n\n // 4) Now we can create the UI and send it the {ABFactory}\n performance.mark(\"initUI\", { op: \"ui.render\" });\n // webix recommends wrapping any webix code in the .ready()\n // function that executes after page loading.\n webix.ready(() => {\n const locales = {\n en: \"en-US\",\n \"zh-hans\": \"zh-CN\",\n th: \"th-TH\",\n };\n // locales - map ab languageCode to webix locale\n const { languageCode } = AB.Config.userConfig() ?? {};\n // save the webix locale used to set locale in ClassUIPage.renderPage()\n window.webixLocale =\n Object.prototype.hasOwnProperty.call(locales, languageCode) &&\n Object.prototype.hasOwnProperty.call(\n webix.i18n.locales,\n locales[languageCode]\n )\n ? locales[languageCode]\n : false;\n\n // webix pro offers a feature that hides scroll bars by\n // default for browsers that include them due to the user's\n // UI. The experience becomes more like a touch interface\n // with the exception that scroll bars appear when user\n // hovers over a scrollable area\n /* if (!Webix.env.touch && Webix.env.scrollSize ) */\n webix.CustomScroll.init();\n\n const div = this.div();\n\n UI.attach(div.id);\n destroyPreloadUI();\n this.ui(UI);\n this.ui()\n .init(this.AB)\n .then(() => {\n performance.measure(\"initUI\");\n performance.measure(\"bootstrap\");\n });\n // this.ui().init() routine handles the remaining\n // bootup/display process.\n });\n }\n\n addPlugin(plugin) {\n this._plugins.push(plugin);\n }\n\n alert(options) {\n webix.alert(options);\n }\n\n div(el) {\n if (el) {\n this._div = el;\n return;\n }\n return this._div;\n }\n\n error(...params) {\n console.error(...params);\n let message = params[0];\n this.emit(message);\n }\n\n ui(UI) {\n if (UI) {\n this._ui = UI;\n return;\n }\n return this._ui;\n }\n}\n\nexport default new Bootstrap();\n","export default {\n init: async (BS) => {\n // BS {Bootstrap}\n // The initial Bootstrap object found in \"./Bootstrap.js\"\n try {\n BS.Config.settings(window.__AB_Settings);\n let configData = window.__AB_Config;\n delete configData.settings;\n BS.Config.config(configData);\n } catch (err) {\n BS.error(\"initConfig: GET /config:\", err);\n // HOTFIX: (12/15/2022) If the user visits /home directly /config is\n // the first request made to sails and if we're not authenticated but\n // using OKTA or CAS, we get a CORS error when trying to authenticate.\n // Send the user to / to get authenticated correctly.\n if (err.message == \"Failed to fetch\")\n window.location.replace(window.location.origin);\n }\n },\n};\n","/*\n * initDiv.js\n * find or create an initial
    for our Appbuilder portal\n */\nexport default {\n init: (BS) => {\n // BS {Bootstrap}\n // The initial Bootstrap object found in \"./Bootstrap.js\"\n\n return new Promise((resolve, reject) => {\n // find our initial
    tag\n var div = document.querySelector(\"div[appbuilder-portal]\");\n if (!div) {\n div = document.createElement(\"Div\");\n div.setAttribute(\"appbuilder-portal-autoenter\", \"true\");\n div.setAttribute(\"appbuilder-portal-fullscreen\", \"true\");\n document.getElementsByTagName(\"body\")[0].appendChild(div);\n }\n // let loading = document.createElement(\"Div\");\n // loading.style.justifyContent = \"center\";\n // loading.style.alignItems = \"center\";\n // loading.style.display = \"flex\";\n // loading.style.height = \"100vh\";\n // loading.style.width = \"100%\";\n // loading.style.position = \"absolute\";\n // loading.style.top = \"0\";\n // loading.style.left = \"0\";\n // // loading.style.animation = \"spinning 1s ease infinite\";\n //\n // loading.innerHTML = ``;\n // document.getElementsByTagName(\"body\")[0].appendChild(loading);\n // const css = window.document.styleSheets[0];\n // css.insertRule(\n // `@keyframes spinning {\n // 0% { transform: rotate(0deg); }\n // 100% { transform: rotate(360deg); }\n // }`,\n // css.cssRules.length\n // );\n // make sure there is a div.id set:\n if (!div.id) {\n div.id = \"AppBuilder\";\n }\n BS.div(div);\n BS.Config.settingsFromDiv(div); // set the autoEnter config\n resolve();\n });\n },\n};\n","export default {\n init: async (BS) => {\n // BS {Bootstrap}\n // The initial Bootstrap object found in \"./Bootstrap.js\"\n try {\n let configData = {\n user: window.__AB_Config_User,\n userReal: window.__AB_Config_User_Real,\n };\n BS.Config.configUser(configData);\n } catch (err) {\n BS.error(\"initConfig: GET /config:\", err);\n // HOTFIX: (12/15/2022) If the user visits /home directly /config is\n // the first request made to sails and if we're not authenticated but\n // using OKTA or CAS, we get a CORS error when trying to authenticate.\n // Send the user to / to get authenticated correctly.\n if (err.message == \"Failed to fetch\")\n window.location.replace(window.location.origin);\n }\n },\n};\n","import { EventEmitter } from \"events\";\n\nclass ClassUI extends EventEmitter {\n constructor(base, ids) {\n super();\n\n this.ids = {};\n // {hash}\n // An internal reference of webix.ids that we use to reference webix\n // components.\n\n // We can be called in several ways:\n // 1) super(\"base_id\");\n // in this case we create a default this.ids.component = base_id;\n //\n // 2) super({ id1:\"id1\", id2:\"id2\", ... })\n // in this case we create a this.ids = base;\n // we look for a this.ids.base || or this.ids.component and use that\n // as our \"base\" reference.\n //\n // 3) super(base, ids);\n //\n if (base) {\n if (\"string\" == typeof base) {\n this.ids = {\n component: base,\n };\n } else {\n this.ids = base;\n base = this.ids.base ?? this.ids.component;\n }\n }\n\n // a shortcut way to enter the ids is to simply put the keys:\n // {\n // form:\"\",\n // form_button:\"\",\n // ...\n // }\n // so we need to make sure the actual values are set according to\n // `{base}_{key}` format.\n //\n if (ids) {\n Object.keys(ids).forEach((k) => {\n if (ids[k]) {\n return (this.ids[k] = ids[k]);\n }\n this.ids[k] = `${base}_${k}`;\n });\n }\n\n // verify this.ids are properly set:\n Object.keys(this.ids).forEach((k) => {\n this.ids[k] = this.ids[k] || `${base}_${k}`;\n });\n\n // and make sure there is a .component set:\n this.ids.component = this.ids.component || base;\n }\n\n /**\n * @method CYPRESS_REF()\n * Attach a cypress \"data-cy\" attribute to the given element. This is used\n * for writing E2E tests and how we directly identify a webix widget we are\n * referencing for our tests.\n * @param {webix.object|webix.node|html.element} el\n * The element we are attempting to attach the data attribute to\n * There are a number of ways we might be sending this element\n * on a onAfterRender() callback on a Webix Object\n * by gathering the nodes of a Webix object directly\n * @param {string} id\n * [optional] the value of the data-cy attribute\n */\n static CYPRESS_REF(el, id) {\n if (!el) return;\n\n id = id || el.config?.id;\n\n // is this a webix object?\n if (el.getInputNode) {\n var node = el.getInputNode();\n if (node) {\n node.setAttribute(\"data-cy\", id);\n return;\n }\n }\n\n // this element has a webix $view\n if (el.$view) {\n el.$view.setAttribute(\"data-cy\", id);\n return;\n }\n\n // this is probably a straight up DOM element:\n el.setAttribute?.(\"data-cy\", id);\n }\n\n /**\n * attach()\n * cause this UI object to attach itself to a given DIV.ID\n * of an existing HTML object.\n * @param {string} id\n * the
    value of the HTML element to display this UI\n * inside.\n * @return {Webix View}\n * returns an instance of the Webix UI object generated by our\n * .ui() description.\n */\n attach(id) {\n var ui = this.ui();\n if (ui && id) {\n ui.container = id;\n }\n\n this.el = webix.ui(ui);\n return this.el;\n }\n\n changePage(pageId) {\n this.emit(\"changePage\", pageId);\n }\n\n hide() {\n if (this.ids?.component) {\n $$(this.ids.component).hide();\n }\n }\n\n label(key, ...params) {\n if (this.AB) {\n return this.AB.Multilingual.label(key, key, ...params);\n }\n console.error(\".labels() called before .AB was set!\");\n return key;\n }\n\n /**\n * ui()\n * return a Webix user interface definition for this UI component.\n * This should be just the json description, not an active instance.\n * @return {obj}\n */\n ui() {\n console.error(\n \"ClassUI.ui(): it is expected that sub classes of ClassUI will implement their own ui() method.\"\n );\n }\n\n show() {\n if (this.ids?.component) {\n $$(this.ids.component)?.show();\n }\n }\n\n get WARNING_ICON() {\n return ``;\n }\n\n get WARNING_ICON_DARK() {\n return this.WARNING_ICON.replace(\"pulseLight\", \"pulseDark\");\n }\n}\n\nexport default ClassUI;\n","import ClassUI from \"./ClassUI\";\n\nclass ClassUIPage extends ClassUI {\n constructor(containerID, page, App, AB) {\n super();\n\n this.containerID = containerID;\n // {string}\n // the webix $$(containerID) reference to attach this UI to.\n // Typically the portal_work generates a series of container placeholders\n // and these ClassUIPage will attach themselves to them.\n\n this.page = page;\n // {ABViewPage}\n // The Root Page that this container is displaying.\n\n this.App = App;\n // {ABComponent.App}\n // The common UI Component App factory.\n\n this.AB = AB;\n // {ABFactory}\n // The common ABFactory being shared for all our ABxxx Objects.\n\n this.initialized = false;\n // {bool}\n // indicates if the User had chosen to display this page yet.\n // We prevent loading our data and building the page until the\n // User decides to show the page.\n\n this.pageStack = [];\n // {array}\n // Keep track of the {ABViewPage.id} that have been showPage()ed.\n // The last element in the stack should be the Actively Shown page.\n // If the stack is empty, then we are showing the RootPage.\n\n this.pageComponents = {};\n // {hash} { ABViewPage.id : ABViewPage.component() }\n // we keep track of all the ui.component() of our possible views to\n // prevent having to regenerate them and quickly access their values.\n\n this.changePageEventIds = {};\n // {hash} { ABViewPage.id : .on(\"changePage\") }\n // A hash of the on(\"changePage\") listeners for each page. Used to\n // prevent multiple listeners added to a Page\n }\n\n ui() {\n // NOTE: the .container === .id\n // so this REPLACES the container created by the portal_work\n var placeholder = {};\n if (this.page && this.page.isRoot()) {\n // some pages can take a while to initialize.\n // add a spinner to indicate it is busy\n placeholder = {\n type: \"clean\",\n css: { \"text-align\": \"center\" },\n template:\n '
    ',\n };\n }\n return {\n view: \"multiview\",\n // container: this.containerID,\n css: \"ab-main-container ab-generated-page\",\n borderless: true,\n id: this.containerID,\n animate: false,\n cells: [placeholder],\n on: {\n // onViewChange: (prevId, nextId) => {\n // this.resize();\n // },\n },\n };\n }\n\n init(AB, render = false, showPage = true) {\n if (AB) {\n this.AB = AB;\n }\n\n // don't redo all this if we already have!\n if (this.initialized) return Promise.resolve();\n\n var myUI = this.ui();\n webix.ui(myUI, $$(this.containerID));\n\n if (!render) {\n return Promise.resolve();\n }\n\n // .init() returns a Promise\n return new Promise((resolve /*, reject */) => {\n // 1) make sure all Application DataCollections have started\n // initialization.\n this.page.application.datacollectionsIncluded().forEach((dc) => {\n if (!dc) return;\n\n dc.init();\n });\n\n // 2) Render all our Pages\n this.renderPage(this.page);\n\n // 3) After we are rendered, we are technically initialized\n this.initialized = true;\n\n // 4) Make sure our Root Page is \"shown\"\n this.showPage();\n\n if (!showPage) {\n let parView = $$(this.containerID).getParentView();\n parView.showBatch(parView.getValue(), false);\n }\n\n resolve();\n });\n }\n\n /**\n * initEvents()\n * Setup the listeners for each page. There are 3 main events we are\n * concerned with:\n * \"changePage\" =>\n * generated by our Page / Sub Page / Sub view\n * indicates when a new page should be displayed.\n * \"ab.interface.update\" =>\n * generated by the server.\n * indicates that the Definition of our interface\n * has changed and we need to redisplay.\n * \"ab.datacollection.update\" = >\n * generated by the server.\n * indicates one of the DataCollections have been updated.\n * if it is one we are depending on, we need to redisplay\n *\n * @param {ABViewPage} page\n * The ABViewPage to establish listeners on.\n */\n initEvents(page) {\n if (page == null) return;\n\n // { pageId: eventId, ..., pageIdn: eventIdn }\n this.changePageEventIds = this.changePageEventIds || {};\n\n // prevent duplicate event registrations\n if (!this.changePageEventIds[page.id]) {\n this.changePageEventIds[page.id] = page.on(\"changePage\", (pageID) => {\n this.showPage(pageID);\n });\n }\n\n let needToReloadPage = () => {\n // clear the cache of events\n this.changePageEventIds = {};\n\n this.initialized = false;\n\n // begin the process of reloading the page\n this.init(this.AB, true, false);\n };\n\n if (!this.updatePageEventId && page.isRoot()) {\n /**\n * @event ab.interface.update\n * This event is triggered when the root page is updated\n *\n * @param data.rootPage {uuid} - id of the root page\n */\n this.updatePageEventId = this.AB.on(\n \"ab.interface.update\",\n function (data) {\n if (page.id == data.rootPageId) {\n needToReloadPage();\n }\n }\n );\n }\n\n if (!this.updateDatacollectionEventId && page.isRoot()) {\n /**\n * @event ab.datacollection.update\n * This event is triggered when the datacollection is updated\n * Make sure we only update the Display if it was a DC that was\n * included in this Page's Application.\n *\n * @param data.datacollectionId {uuid} - id of the data view\n */\n this.updateDatacollectionEventId = this.AB.on(\n \"ab.datacollection.update\",\n (data) => {\n let updatedDC = this.page.application.datacollectionsIncluded(\n (dc) => dc.id == data.datacollectionId\n )[0];\n if (updatedDC) {\n needToReloadPage();\n }\n }\n );\n }\n }\n\n /**\n * renderPage()\n * create the Webix UI for the given ABViewPage and all it's Sub Pages.\n * This routine creates the component.ui, and performs the component.init()\n * but does not perform the final component.onShow() ( that happens in the\n * showPage() method.)\n * @param {ABViewPage} page\n */\n renderPage(page) {\n if (window.webixLocale) {\n setTimeout(() => {\n webix.i18n.setLocale(window.webixLocale);\n }, 500);\n }\n var component = page.component(this.App);\n var ui = component.ui;\n\n // Keep the page component\n this.pageComponents[page.id] = component;\n\n var myContainer = $$(this.containerID);\n // {webix.ui}\n // Referencing our container. Since we seem to make numerous references\n // to this below, let's just pull it 1x.\n\n // James:\n // this is pulled in from our previous v1 code. Not sure if it is still\n // relevant.\n // TODO: review this and how this works in context of our Webix Only\n // Portal.\n // Also, notice how we are referencing the internal data of a Page object?\n // there should be an accessor method (like page.setting(\"pageWidth\"))\n // that returns the data we need.\n /*\n if (\n parseInt(page.settings.pageWidth) > 0 &&\n parseInt(page.settings.fixedPageWidth) == 1\n ) {\n var parentContainer = this.element.parent()[0];\n parentContainer.style.width = parseInt(page.settings.pageWidth) + \"px\";\n parentContainer.style.margin = \"0 auto\";\n parentContainer.classList.add(page.settings.pageBackground);\n }\n */\n\n var type = page.settings?.type ?? \"\";\n if (typeof page.type === \"function\") {\n // plugin method.\n type = page.type();\n }\n switch (type) {\n case \"popup\":\n var popupTemplate = {\n view: \"window\",\n id: page.id,\n modal: true,\n position: \"center\",\n resize: true,\n width: parseInt(page.settings.popupWidth) || 700,\n height: parseInt(page.settings.popupHeight) + 44 || 450,\n css: \"ab-main-container\",\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n view: \"label\",\n label: page.label,\n css: \"modal_title\",\n align: \"center\",\n },\n {\n view: \"button\",\n label: \"Close\",\n autowidth: true,\n align: \"center\",\n click: () => {\n this.showPage();\n // var popup = this.getTopParentView();\n // popup.hide();\n },\n on: {\n //Add data-cy attribute to the close button\n onAfterRender: () => {\n const button = $$(page.id).queryView(\"button\");\n const dataCy = `Popup Close Button ${page.name} ${page.id}`;\n button\n .getInputNode()\n .setAttribute(\"data-cy\", dataCy);\n },\n },\n },\n ],\n },\n body: {\n view: \"scrollview\",\n scroll: true,\n body: ui,\n },\n };\n\n var oldView = $$(page.id);\n if (oldView) {\n // if it is a Popup, destroy() it\n if (oldView.config.view == \"window\") {\n oldView.destructor();\n }\n // else remove the view from our multiview\n else if (myContainer) {\n myContainer.removeView(page.id);\n }\n }\n\n // Now create the New one (hidden)\n try {\n webix.ui(popupTemplate).hide();\n } catch (e) {\n console.error(\"Error creating Page:\", page);\n console.error(e);\n // debugger;\n }\n break;\n\n case \"page\":\n default:\n // Define page id to be batch id of webix.multiview\n ui.batch = page.id;\n\n // if this view already exists\n var oldPage = $$(page.id);\n if (oldPage) {\n // if the old view was a popup, but now we want it as\n // a page, we need to move it to our multiview\n if (oldPage.config.view == \"window\") {\n oldPage.destructor();\n\n myContainer.addView(ui);\n }\n // else we want to rebuild it.\n else {\n webix.ui(ui, oldPage);\n }\n }\n // else this is our first time so add it\n else if (myContainer) {\n myContainer.addView(ui);\n }\n\n break;\n }\n\n // handle events\n this.initEvents(page);\n\n // Render child pages\n (page.pages() || []).forEach((subpage) => {\n this.renderPage(subpage);\n });\n\n // Initial UI components\n component.init();\n }\n\n /**\n * show()\n * is called by the main portal_work when a menu item is selected and this\n * container should be displayed.\n */\n show() {\n var container = $$(this.containerID);\n if (container) {\n if (!this.initialized) {\n // this is our 1st time to show, so wait for our initial loading\n // container to display, before causing it to be transformed into\n // our Page.\n var eventID = container.attachEvent(\"onViewShow\", () => {\n // only 1x\n container.detachEvent(eventID);\n // give ourselves some additional space to make sure animations\n // are complete or operational before the .init() which can be\n // resource intensive.\n setTimeout(() => {\n this.init(this.AB, true);\n container.show();\n }, 50);\n });\n }\n\n container.show();\n }\n }\n\n /**\n * showPage()\n * A RootPage can have several SubPages that it wants to display during\n * it's normal operation. An embedded view component can trigger an\n * .emit(\"showPage\", pageID) that will get propagated up to our RootPage\n * and showPage(pageID) will be called.\n *\n * For example, an ABViewMenu object will have a button clicked and it will\n * signal this to show the desired Page.\n *\n * If a showPage() is called with no parameter, then we are being requested\n * to return to the previous page before the current one.\n * @param {string} pageID\n * The {ABViewPage.id} of the page to show.\n * @param {string} viewID\n * An additional ABViewxxx.id that can also be signaled to show.\n * ?? Usually on the Page we just showed, so you can specify a\n * page + view.\n */\n showPage(pageID, viewId) {\n var showPageID = null;\n // {string}\n // This is the actual pageID of the ABViewPage to display.\n\n // in any case, if the active page is not the requested page,\n // we hide it:\n var activeID = this.pageStack[this.pageStack.length - 1];\n if (activeID) {\n // if the actively displayed page is what is being asked for\n // we can just exit.\n if (activeID == pageID) {\n return; //\n }\n\n // otherwise we need to hide() any popups / pages\n var activeUI = $$(activeID);\n if (activeUI && activeUI.hide) activeUI.hide();\n }\n\n // if no pageID provided, then we are displaying a previous page:\n if (!pageID) {\n // pull the last View displayed & remove it.\n this.pageStack.pop();\n } else {\n // be sure not to add our Root Page to the stack\n if (this.page.id != pageID) {\n // add the new pageID to our stack:\n // REMEMBER: last item is what should be show()n\n this.pageStack.push(pageID);\n } else {\n // in this case: we have items in our .pageStack, but we are told\n // to return to our RootPage;\n // clear out our .pageStack and we will return to our root\n this.pageStack = [];\n }\n }\n\n // now get the ID of the page to show\n showPageID = this.pageStack[this.pageStack.length - 1];\n if (!showPageID) {\n // then we want to display the Root Page:\n showPageID = this.page.id;\n }\n\n if (!showPageID) {\n // if we get here and don't have a showPageID ... something didn't\n // go as planned:\n this.AB.error(\n new Error(`Unable to resolve showPage() with pageID[${pageID}]`)\n );\n } else {\n // make sure a popup is shown\n if ($$(showPageID)) $$(showPageID).show();\n\n // if our MultiView has this batch then show batch\n var batchExist = false;\n var childViews = $$(this.containerID).getChildViews();\n batchExist = childViews.filter(function (v) {\n return v.config.batch == showPageID;\n })[0];\n if (batchExist) $$(this.containerID).showBatch(showPageID);\n\n // now make sure the actual component's .onShow() is called\n // But perform a Timeout() so any current webix animations\n // complete beforehand:\n setTimeout(() => {\n if (\n this.pageComponents[showPageID] &&\n this.pageComponents[showPageID].onShow\n ) {\n // for (const element of document\n // .getElementById(self.containerDomID)\n // .getElementsByClassName(\"ab-loading\")) {\n // element.style.display = \"none\";\n // }\n this.pageComponents[showPageID].onShow();\n if (viewId) {\n $$(viewId)?.show();\n }\n }\n }, 60);\n }\n }\n\n /*\n removePage(pageId) {\n var pageCom = this.pageComponents[pageId];\n var pageElemId = pageCom.ui.id;\n\n // swtich the page before it will be removed\n if (this.activePageId == pageId) {\n this.showPage(this.rootPage.id);\n }\n\n // remove from .multiview\n $$(this.containerDomID).removeView(pageElemId);\n\n // destroy view's modal\n if ($$(pageElemId)) $$(pageElemId).destructor();\n }\n */\n}\n\nexport default ClassUIPage;\n","import ClassUI from \"./ClassUI.js\";\n\nimport Switcheroo from \"./portal_work_user_switcheroo.js\";\n\nclass ErrorNoDefsUI extends ClassUI {\n ui() {\n const L = (...params) => {\n return this.label(...params);\n };\n return {\n rows: [\n {\n id: \"switched\",\n height: 23,\n css: \"portal_work_switcheroo_user_switched\",\n hidden: true,\n cols: [\n {\n width: 5,\n },\n {\n id: \"switched_label\",\n view: \"label\",\n align: \"center\",\n },\n {\n view: \"button\",\n value: '
    ',\n align: \"center\",\n width: 30,\n css: \"webix_transparent\",\n on: {\n onItemClick: () => {\n Switcheroo.init(this.AB, true);\n Switcheroo.switcherooClear();\n $$(\"switched\").hide();\n },\n },\n },\n {\n width: 5,\n },\n ],\n },\n {\n id: \"error_no_defs\",\n css: \"portalLogin\",\n cols: [\n {},\n {\n rows: [\n {},\n {\n width: 360,\n height: 200,\n rows: [\n {\n css: \"portalLoginForm\",\n padding: 30,\n rows: [\n {\n id: \"error_no_defs_text\",\n template: `
    \n ${L(\n \"You don't have any Roles in the system defined. Talk to an Administrator.\"\n )}\n
    `,\n borderless: true,\n },\n ],\n },\n ],\n },\n {},\n ],\n },\n {},\n ],\n },\n ],\n };\n }\n\n async init(AB) {\n this.AB = AB;\n }\n\n switcherooUser(user) {\n const L = (...params) => {\n return this.label(...params);\n };\n $$(\"switched\").show();\n $$(\"switched_label\").setValue(\n L('*You are viewing this site as \"{0}\"*', [this.AB.Account.username()])\n );\n }\n\n preloadMessage(text) {\n $$(\"error_no_defs_text\").setValues({ text });\n }\n destroy() {\n $$(\"error_no_defs\").destructor();\n }\n}\n\nexport default new ErrorNoDefsUI();\n","import ClassUI from \"./ClassUI.js\";\nimport PortalLoading from \"./portal_loading.js\";\nimport PortalAuth from \"./portal_auth.js\";\nimport PortalWork from \"./portal_work.js\";\n\nclass Portal extends ClassUI {\n constructor() {\n super();\n\n this.ShownPortal = null;\n // {UI.Portal} ShownPortal\n // Keep track of which Portal is currently shown.\n\n this.portalWorkReady = false;\n // {bool}\n // has the PortalWork UI emitted it's \"ready\" event?\n //\n }\n\n ui() {\n return {\n view: \"popup\",\n fullscreen: true,\n modal: true,\n body: {\n id: \"portal\",\n view: \"multiview\",\n keepViews: true,\n animate: false,\n rows: [PortalLoading.ui(), PortalAuth.ui(), PortalWork.ui()],\n },\n };\n }\n\n init(AB) {\n this.AB = AB;\n\n this.AB.on(\"portal.show\", (key) => {\n this.showPortal(key);\n });\n\n var allInits = [];\n // {array} allInits\n // all the .init() {Promise}s that are being generated during our\n // init().\n\n allInits.push(PortalAuth.init(AB));\n\n // if we are authenticated, then we make sure our loading & work portals\n // are prepared.\n if (this.AB.Account.isAuthenticated) {\n // Setup our listeners BEFORE the .init()s\n this.AB.Account.on(\"logout\", (data) => {\n if (data?.redirect) {\n // if we pass a redirect link follow it\n window.document.location.href = data?.redirect;\n } else {\n // on logout show Auth Portal\n this.showAuthPortal();\n }\n });\n\n this.AB.Network.on(\"reauth\", () => {\n // on logout show Auth Portal\n this.showAuthPortal();\n });\n\n PortalWork.on(\"ready\", () => {\n this.portalWorkReady = true;\n this.showDefaultView();\n });\n\n // Now trigger our other .init()s\n allInits.push(PortalLoading.init(AB));\n allInits.push(PortalWork.init(AB));\n }\n\n return Promise.all(allInits).then(() => {\n this.showDefaultView();\n });\n }\n\n showAuthPortal(defaultView) {\n if (this.ShownPortal != PortalAuth) {\n PortalAuth.show(defaultView);\n this.ShownPortal = PortalAuth;\n }\n }\n\n showWorkPortal() {\n if (this.portalWorkReady) {\n if (this.ShownPortal != PortalWork) {\n // when loading portal is done move to Work Portal\n PortalWork.show();\n this.ShownPortal = PortalWork;\n }\n } else {\n if (!this.ShownPortal) {\n // if we haven't already shown a portal ... show the loading\n PortalLoading.show();\n }\n }\n }\n\n showDefaultView() {\n // At this point, all inits() are complete\n\n // if authenticated then show our default view:\n if (this.AB.Account.isAuthenticated) {\n // do we have a specified defaultView?\n let defaultView = this.AB.Config.setting(\"view\");\n if (defaultView) {\n // defaultView should be in form:\n // \"auth_login_form\",\n // \"auth_login_passwordReset\",\n // \"work\"\n var parts = defaultView.split(\"_\");\n this.showPortal(parts[0], defaultView);\n } else {\n // then default to our work view:\n if (this.portalWorkReady) {\n this.showWorkPortal();\n } else {\n if (!this.ShownPortal) {\n // if we haven't already shown a portal ... show the loading\n PortalLoading.show();\n }\n }\n }\n } else {\n this.showAuthPortal();\n }\n }\n\n showPortal(key, defaultView) {\n switch (key) {\n case \"auth\":\n this.showAuthPortal(defaultView);\n break;\n\n case \"work\":\n this.showWorkPortal();\n break;\n }\n }\n}\n\nexport default new Portal();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalAccessLevelManager extends ClassUI {\n constructor() {\n super();\n this.accessLevels = [\n {\n id: \"0\",\n value: \"No Access\",\n },\n {\n id: \"1\",\n value: \"Read Only\",\n },\n {\n id: \"2\",\n value: \"Full Access\",\n },\n ];\n }\n\n ui() {\n const accessLevelManagerBody = {\n view: \"scrollview\",\n css: \"lightgray ab_amp\",\n body: {\n rows: [\n {\n view: \"accordion\",\n id: \"amp_accordion\",\n roles: [],\n hidden: true,\n collapsed: true,\n css: \"webix_dark\",\n rows: [],\n },\n {\n id: \"amp_accordion_noSelection\",\n rows: [\n {},\n {\n view: \"label\",\n align: \"center\",\n height: 200,\n label: \"
    \",\n },\n {\n view: \"label\",\n align: \"center\",\n label: \"Add a role to control access.\",\n },\n {\n cols: [\n {},\n {\n view: \"button\",\n label: \"Add Role\",\n type: \"form\",\n css: \"webix_primary\",\n autowidth: true,\n click: () => {\n webix.ui(newRolePopup).show();\n\n const roles = this.roles.filter((role) => {\n return (\n $$(\"amp_accordion\").config.roles.indexOf(\n role.id\n ) == -1\n );\n });\n\n $$(\"role_popup_options\").define(\n \"options\",\n roles\n );\n $$(\"role_popup_options\").refresh();\n },\n },\n {},\n ],\n },\n {},\n ],\n },\n ],\n },\n };\n\n const newRolePopup = {\n view: \"popup\",\n id: \"role_popup\",\n position: \"center\",\n height: 250,\n width: 350,\n modal: true,\n body: {\n rows: [\n {\n view: \"toolbar\",\n id: \"myToolbarABLiveTool\",\n css: \"webix_dark\",\n cols: [\n {\n view: \"label\",\n label: \"Add Role\",\n align: \"center\",\n },\n ],\n },\n {\n view: \"form\",\n elements: [\n /* We are not managing users yet so take this out\n {\n view: \"text\",\n label: \"Create new\",\n labelWidth: 90\n },\n {\n view: \"label\",\n label: \"- or -\",\n align: \"center\"\n },*/\n {\n view: \"combo\",\n label: \"\",\n id: \"role_popup_options\",\n placeholder: \"Choose role\",\n options: [],\n },\n {\n cols: [\n {\n view: \"button\",\n value: \"Cancel\",\n click: () => {\n $$(\"role_popup\").hide();\n },\n },\n {\n view: \"button\",\n value: \"Add\",\n id: \"role_popup_options_add\",\n css: \"webix_primary\",\n click: () => {\n const role =\n $$(\"role_popup_options\").getValue();\n if ($$(`amp_accordionitem_${role}`)) {\n $$(`amp_accordionitem_${role}`).show();\n $$(\"amp_accordion\").config.roles.push(role);\n } else {\n this.buildAccessAccordion(role);\n }\n $$(\"role_popup\").hide();\n },\n },\n ],\n },\n ],\n },\n ],\n },\n };\n\n return {\n view: \"window\",\n css: \"ampWindow\",\n id: \"access_manager\",\n position: function (state) {\n state.left = state.maxWidth - 350; // fixed values\n state.top = 0;\n state.width = 350; // relative values\n state.height = state.maxHeight;\n },\n on: {\n onShow: () => {\n // collapse all the accordion items but the top one\n var index = 0;\n $$(\"amp_accordion\")\n .getChildViews()\n .forEach((a) => {\n if (index == 0) {\n $$(a).expand();\n } else {\n $$(a).collapse();\n }\n index++;\n $$(\"amp_accordion\").show();\n $$(\"amp_accordion_noSelection\").hide();\n });\n },\n },\n //modal: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n width: 15,\n },\n {\n view: \"label\",\n label: \"Access Manager\",\n autowidth: true,\n },\n {},\n {\n view: \"button\",\n label: \"Add Role\",\n width: 100,\n css: \"webix_primary\",\n click: () => {\n webix.ui(newRolePopup).show();\n\n var roles = this.roles.filter((role) => {\n return (\n $$(\"amp_accordion\").config.roles.indexOf(role.id) ==\n -1\n );\n });\n\n $$(\"role_popup_options\").define(\"options\", roles);\n $$(\"role_popup_options\").refresh();\n },\n },\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n this.hide();\n },\n },\n ],\n },\n body: accessLevelManagerBody,\n };\n }\n\n init(portal) {\n this.AB = portal.AB;\n this.portal = portal;\n this.appId = portal.AppState.lastSelectedApp;\n\n const languageCode = this.AB.Config.userConfig().languageCode;\n this.roles = this.AB.Config.metaConfig().roles.map((role) => {\n const translation = role.translations.filter(\n (t) => t.code == languageCode\n );\n const name = translation.length == 1 ? translation[0].name : role.name;\n return { id: role.id, value: name };\n });\n\n webix.ui(this.ui());\n\n // buld the tree views for already defined role access levels\n const application = this.AB.applicationByID(this.appId);\n if (application.isAccessManaged) {\n // Build the access level tree for Roles\n const existingRoles = [];\n application.pages().forEach((page) => {\n Object.keys(page.accessLevels).forEach((role) => {\n if (existingRoles.indexOf(role) == -1) {\n existingRoles.push(role);\n }\n });\n });\n existingRoles.forEach((role) => {\n this.buildAccessAccordion(role);\n });\n }\n }\n\n show() {\n $$(\"access_manager\").show();\n }\n\n hide() {\n $$(\"access_manager\").hide();\n }\n\n showPage(viewId, pageId, parent) {\n parent.application = {};\n parent.application.id = this.appId;\n this.portal.showPage(parent);\n const pageUI = this.portal.pageContainers[parent.id];\n pageUI.showPage(pageId, viewId);\n }\n\n /*\n * helper to get the current apps views\n */\n views(f) {\n return this.AB.applicationByID(this.appId).views(f);\n }\n\n buildAccessAccordion(role) {\n const L = this.AB.Label();\n const application = this.AB.applicationByID(this.appId);\n const isRoleAccessManager =\n parseInt(application.accessManagers.useRole) == 1 &&\n application.accessManagers.role.indexOf(role) > -1;\n const manageUsers = {\n rows: [\n {\n height: 10,\n },\n {\n cols: [\n {\n width: 10,\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-trash\",\n css: \"webix_danger_inverse\",\n label: \"Remove\",\n click: async () => {\n const confirmation = await webix.confirm(\n \"Remove role from app?\"\n );\n if (confirmation) {\n const tree = $$(`linetree_${role}`);\n const mainPages = this.AB.applicationByID(\n this.appId\n ).pages();\n await mainPages.forEach(async (page) => {\n const branch = tree.getItem(page.id);\n branch.access = \"0\";\n await page.updateAccessLevels(\n tree.config.role,\n \"0\"\n );\n tree.updateItem(page.id, branch);\n });\n\n $$(`amp_accordionitem_${role}`).hide();\n const itemToRemove =\n $$(\"amp_accordion\").config.roles.indexOf(role);\n if (itemToRemove > -1) {\n $$(\"amp_accordion\").config.roles.splice(\n itemToRemove,\n 1\n );\n }\n }\n },\n },\n {\n width: 10,\n },\n ],\n },\n {\n height: 10,\n },\n ],\n };\n\n $$(\"amp_accordion\").config.roles.push(role);\n\n const toggleParent = (element) => {\n if (!element.parent) return false;\n var parentElem = element.parent;\n if (!parentElem.parent) return false;\n parentElem.parent.emit(\"changeTab\", parentElem.id);\n toggleParent(parentElem.parent);\n };\n\n const getParent = (id, component) => {\n let item = $$(component).getItem(id);\n if (item.$parent == 0) return item;\n else return getParent(item.$parent, component);\n };\n\n const tree = {\n id: `linetree_${role}`,\n view: \"edittree\",\n type: \"lineTree\",\n editable: true,\n role: role,\n editor: \"combo\",\n editValue: \"access\",\n threeState: true,\n template: (obj, common) => {\n const treeOptions = $$(`linetree_${role}`).config.options;\n const option = treeOptions.find((o) => o.id === obj.access);\n let color, icon;\n switch (option.id) {\n case \"1\":\n color = \"#FFAB00\";\n icon = \"eye\";\n break;\n case \"2\":\n color = \"#00C853\";\n icon = \"pencil\";\n break;\n default:\n // Case \"0\"\n color = \"#ff4938\";\n icon = \"lock\";\n }\n\n return `\n \n \n \n \n ${common.icon(obj, common)}\n ${obj.label}\n \n `;\n },\n options: this.accessLevels,\n data: this.getAccessLevelTree(role),\n onClick: {\n externalLink: (event, branch, target) => {\n const item = $$(`linetree_${role}`).getItem(branch);\n const parent = getParent(branch, `linetree_${role}`);\n if (item.type == \"tab\") {\n this.showPage(branch, item.pageId, parent);\n\n const tabView = this.views((v) => v.id == item.id)[0];\n if (!tabView) return false;\n\n const tab = tabView.parent;\n if (!tab) return false;\n\n toggleParent(tab);\n if (!$$(tabView.id) || !$$(tabView.id).isVisible()) {\n const showIt = setInterval(() => {\n if ($$(tabView.id) && $$(tabView.id).isVisible()) {\n clearInterval(showIt);\n }\n tab.emit(\"changeTab\", tabView.id);\n }, 200);\n }\n }\n // switch page\n else {\n this.showPage(branch, item.id, parent);\n }\n\n return false;\n },\n },\n on: {\n onAfterEditStop: async (state, editor, ignoreUpdate) => {\n if (state.old == state.value) return false;\n const tree = $$(`linetree_${role}`);\n const view = this.views((v) => {\n return v.id == editor.id;\n })[0];\n await view.updateAccessLevels(tree.config.role, state.value);\n console.log(\n `Role: ${tree.config.role} set to Access Level: ${state.value} on view: ${view.id}`\n );\n },\n onDataUpdate: async (id, data, old) => {\n const tree = $$(`linetree_${role}`);\n if (data.access == \"0\") {\n // NOTE: Need to update \"No Access\" option here because It does not trigger `onAfterEditStop` event\n const view = this.views((v) => v.id == id)[0];\n await view.updateAccessLevels(tree.config.role, data.access);\n\n tree.blockEvent();\n await tree.data.eachSubItem(id, async (child) => {\n const childData = tree.getItem(child.id);\n if (childData.access != data.access) {\n childData.access = data.access;\n const view = this.views((v) => {\n return v.id == child.id;\n })[0];\n await view.updateAccessLevels(\n tree.config.role,\n data.access\n );\n console.log(\n `Role: ${tree.config.role} set to Access Level: ${data.access} on view: ${view.id}`\n );\n tree.updateItem(child.id, childData);\n }\n });\n tree.unblockEvent();\n } else {\n const parentBranch = tree.getParentId(id);\n const parentData = tree.getItem(parentBranch);\n if (parentData) {\n if (parentData.access == \"0\") {\n parentData.access = \"1\";\n const view = this.views((v) => {\n return v.id == parentBranch;\n })[0];\n await view.updateAccessLevels(\n tree.config.role,\n parentData.access\n );\n\n console.log(\n `Role: ${tree.config.role} set to Access Level: ${parentData.access} on view: ${view.id}`\n );\n tree.updateItem(parentBranch, parentData);\n }\n }\n }\n },\n },\n };\n\n const newAccordionItem = {\n view: \"accordionitem\",\n id: `amp_accordionitem_${role}`,\n header: () => {\n return `${\n this.roles?.find((r) => {\n return r.id === role;\n })?.value ?? role\n } ${\n isRoleAccessManager\n ? `${this.WARNING_ICON}`\n : \"\"\n }`;\n },\n collapsed: true,\n body: {\n type: \"clean\",\n rows: [tree, manageUsers],\n },\n };\n\n $$(\"amp_accordion\").addView(newAccordionItem, -1);\n $$(\"amp_accordion\").show();\n $$(\"amp_accordion_noSelection\").hide();\n\n if (isRoleAccessManager)\n this.AB.Webix.TooltipControl.addTooltip(\n $$(`amp_accordionitem_${role}`).$view\n );\n\n $$(`linetree_${role}`).openAll();\n }\n\n getAccessLevelTree(role) {\n const tree = new webix.TreeCollection();\n\n const addPage = (page, index, parentId, type) => {\n // add to tree collection\n const accessLevel = page.accessLevels[role] ?? \"0\";\n const branch = {\n id: page.id,\n access: accessLevel,\n label: page.label,\n pageId: parentId,\n type: type,\n };\n tree.add(branch, index, parentId);\n\n // stop at detail views\n if (page.defaults.key == \"detail\") {\n return;\n }\n\n const subPages = page.pages ? page.pages() : [];\n subPages.forEach((childPage, childIndex) => {\n addPage(childPage, childIndex, page.id, \"page\");\n });\n\n // add tabs\n page\n .views((view) => view.defaults.key == \"tab\")\n .forEach((tab, tabIndex) => {\n // tab views\n tab.views().forEach((tabView, tabViewIndex) => {\n // tab items will be below sub-page items\n const tIndex = subPages.length + tabIndex + tabViewIndex;\n addPage(tabView, tIndex, page.id, \"tab\");\n });\n });\n };\n this.AB.applicationByID(this.appId)\n .pages()\n .forEach((p, index) => {\n addPage(p, index, null, \"page\");\n });\n\n return tree;\n }\n}\n\nexport default new PortalAccessLevelManager();\n","import ClassUI from \"./ClassUI.js\";\n\n// sub pages:\nimport PortalAuthLogin from \"./portal_auth_login.js\";\n\nclass PortalAuth extends ClassUI {\n constructor() {\n super();\n\n this.ActivePortal = null;\n // {PortalAuthxxx} ActivePortal\n // the UI Portal to use for Authenticating our User for this Tenant.\n }\n\n ui() {\n var self = this;\n\n return {\n id: \"portal_auth\",\n view: \"multiview\",\n animate: false,\n cells: [PortalAuthLogin.ui()],\n };\n }\n\n init(AB) {\n this.AB = AB;\n\n // decide which Auth Portal to display:\n var authType = this.AB.Tenant.setting(\"authType\") || \"login\";\n switch (authType) {\n case \"login\":\n this.ActivePortal = PortalAuthLogin;\n break;\n\n case \"passwordless\":\n break;\n\n case \"facebook\":\n break;\n\n case \"google\":\n break;\n }\n\n return this.ActivePortal?.init(AB).then(() => {\n this.ActivePortal?.show();\n });\n }\n\n show(defaultView) {\n // We cannot properly store the session id if users navigate directly to /home\n // so when they navigate to /home and it was not a redirect we send them back to /\n if (\n window?.location?.pathname == \"/home\" &&\n !window?.performance?.navigation?.redirectCount\n )\n window.location.replace(window.location.origin);\n\n $$(\"portal_auth\").show();\n this.ActivePortal.show(defaultView);\n }\n}\n\nexport default new PortalAuth();\n","import ClassUI from \"./ClassUI.js\";\nimport PortalAuthLoginForm from \"./portal_auth_login_form.js\";\nimport PortalAuthLoginResetPassword from \"./portal_auth_login_resetPassword.js\";\nimport PortalAuthLoginResetRequest from \"./portal_auth_login_resetRequest.js\";\n\nclass PortalAuthLogin extends ClassUI {\n constructor() {\n super();\n }\n\n ui() {\n var self = this;\n\n return {\n id: \"portal_auth_login\",\n view: \"multiview\",\n animate: false,\n rows: [\n PortalAuthLoginForm.ui(),\n PortalAuthLoginResetPassword.ui(),\n PortalAuthLoginResetRequest.ui(),\n ],\n };\n }\n\n async init(AB) {\n this.AB = AB;\n\n var allInits = [];\n allInits.push(PortalAuthLoginForm.init(AB));\n PortalAuthLoginForm.on(\"request.reset\", () => {\n PortalAuthLoginResetRequest.show();\n });\n\n allInits.push(PortalAuthLoginResetRequest.init(AB));\n PortalAuthLoginResetRequest.on(\"login\", () => {\n PortalAuthLoginForm.show();\n });\n\n allInits.push(PortalAuthLoginResetPassword.init(AB));\n PortalAuthLoginResetPassword.on(\"updated\", () => {\n console.log(\">>>> Password Changed ... NOW WHAT? <<<<<<\");\n });\n\n await Promise.all(allInits);\n }\n\n show(defaultView) {\n // defaultView should be:\n // \"auth_login_form\",\n // \"auth_login_passwordReset\"\n\n if (defaultView) {\n var view = defaultView.split(\"_\").pop();\n switch (view) {\n case \"resetPassword\":\n PortalAuthLoginResetPassword.show();\n break;\n\n default:\n case \"form\":\n PortalAuthLoginForm.show();\n break;\n }\n return;\n }\n\n // Default to the LoginForm\n PortalAuthLoginForm.show();\n }\n}\n\nexport default new PortalAuthLogin();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalAuthLoginForm extends ClassUI {\n constructor() {\n super();\n }\n\n ui() {\n var self = this;\n\n if (!this.AB) {\n // we need to init() before being able to translate our UI:\n return {\n id: \"portal_auth_login_container\",\n };\n }\n\n var L = this.AB.Label();\n\n return {\n id: \"portal_auth_login_container\",\n css: \"portalLogin\",\n cols: [\n {},\n {\n rows: [\n {},\n {\n width: 360,\n rows: [\n {\n css: \"portalLoginForm\",\n padding: 30,\n rows: [\n {\n template:\n \"
    \",\n borderless: true,\n height: 190,\n type: \"clean\",\n },\n {\n id: \"portal_auth_login_form\",\n view: \"form\",\n type: \"clean\",\n css: { background: \"transparent !important\" },\n borderless: true,\n elementsConfig: {\n bottomPadding: 20,\n height: 52,\n },\n elements: [\n {\n view: \"text\",\n placeholder: L(\"Email\"),\n name: \"email\",\n id: \"email\",\n attributes: {\n \"data-cy\":\n \"portal_auth_login_form_email\",\n },\n // required: true,\n validate: webix.rules.isEmail,\n invalidMessage: L(\n \"Please enter a valid email.\"\n ),\n validateEvent: \"blur\",\n },\n {\n view: \"text\",\n type: \"password\",\n placeholder: L(\"Password\"),\n name: \"password\",\n attributes: {\n \"data-cy\":\n \"portal_auth_login_form_password\",\n },\n // required: true,\n validate: webix.rules.isNotEmpty,\n invalidMessage: L(\n \"Please enter your password.\"\n ),\n validateEvent: \"blur\",\n },\n {\n margin: 10,\n paddingX: 2,\n borderless: true,\n cols: [\n {},\n {\n view: \"button\",\n label: L(\"Login\"),\n type: \"form\",\n id: \"portal_auth_login_form_submit\",\n css: \"webix_primary\",\n width: 150,\n hotkey: \"enter\",\n click() {\n var form = $$(\n \"portal_auth_login_form\"\n );\n if (form.validate()) {\n $$(\n \"portal_auth_login_form_submit\"\n ).hide();\n $$(\n \"portal_auth_login_form_submit_wait\"\n ).show();\n\n var values =\n form.getValues();\n self.error(); // hids the error message\n\n // this.AB.Network.post()\n // can either be a Relay or Rest operation.\n // we should get the response from the\n // published JobRequest initialized in\n // the .init() routine.\n self.AB.Network.post(\n {\n url: \"/auth/login\",\n data: values,\n },\n {\n key: \"portal_auth_login\" /*, context:{} */,\n }\n ).catch((err) => {\n $$(\n \"portal_auth_login_form_submit\"\n ).show();\n $$(\n \"portal_auth_login_form_submit_wait\"\n ).hide();\n console.log(err);\n });\n }\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {\n view: \"button\",\n label: \"\",\n type: \"form\",\n id: \"portal_auth_login_form_submit_wait\",\n css: \"webix_primary\",\n width: 150,\n hidden: true,\n },\n {},\n ],\n },\n {\n margin: 10,\n paddingX: 2,\n borderless: true,\n cols: [\n {},\n {\n view: \"button\",\n label: L(\"Forgot password?\"),\n id: \"portal_auth_login_forgot\",\n css: \"webix_transparent\",\n click: () => {\n this.emit(\"request.reset\");\n // $$(\"portal_auth_login\").hide();\n // $$(\"password_reset_email\").show();\n },\n width: 150,\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {},\n ],\n },\n {\n id: \"portal_auth_login_form_errormsg\",\n view: \"template\",\n css: \"webix_control\",\n height: 32,\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n ],\n },\n ],\n },\n {},\n {\n cols: [\n { width: 20 },\n {\n id: \"auth_privacy_policy\",\n view: \"template\",\n template:\n '#pretext# #label#',\n css: \"policyLink noBackground\",\n height: 30,\n hidden: true,\n },\n { width: 20 },\n ],\n },\n ],\n },\n {},\n ],\n },\n {},\n ],\n };\n }\n\n error(message) {\n var $errMsg = $$(\"portal_auth_login_form_errormsg\");\n if (message) {\n $errMsg.setHTML(\n `
    ${message}
    `\n );\n $errMsg.show();\n } else {\n $errMsg.hide();\n }\n }\n\n /** @param {import('../AppBuilder/ABFactory.js').default} AB */\n init(AB) {\n this.AB = AB;\n\n // now replace our initial placeholder with our viewable form\n webix.ui(this.ui(), $$(\"portal_auth_login_container\"));\n\n this.error(); // hides the default error message.\n\n this.AB.Network.on(\"portal_auth_login\", (context, err, response) => {\n // Listen for our login responses:\n // console.log(\"Network.on():\", context, err, response);\n\n if (err) {\n // any http 400-500 response should show up here:\n if (err.code) {\n switch (err.code) {\n case \"EINVALIDLOGIN\":\n this.error(err.message);\n break;\n\n case \"EFAILEDATTEMPTS\":\n this.error(err.message);\n $$(\"portal_auth_login_form_submit\").hide();\n break;\n\n default:\n this.AB.error(err);\n break;\n }\n }\n return;\n }\n\n if (\n response.user ||\n (response.status == \"success\" && response.data.user)\n ) {\n // reload the page to gather all the config info:\n window.location.reload(true);\n\n // Login was successful -> rerun BootStrap.init() to load the\n // config, definitions, plugins, etc for this user\n // Bootstrap.init(this.AB).catch((err) => {\n // Bootstrap.alert({\n // type: \"alert-error\",\n // title: \"Error initializing Portal:\",\n // text: err.toString(),\n // });\n // Bootstrap.error(err);\n // });\n } else {\n if (response.status == \"error\") {\n console.log(\"what to do with this error:\");\n console.error(response);\n }\n }\n });\n const { privacyPolicy } = this.AB.Config.siteConfig();\n if (privacyPolicy) {\n const L = this.AB.Label();\n $$(\"auth_privacy_policy\").setValues({\n label: L(\"Privacy Policy\"),\n pretext: L(\"By signing in you agree to our\"),\n link: privacyPolicy,\n });\n $$(\"auth_privacy_policy\").show();\n }\n\n return Promise.resolve();\n }\n\n show() {\n $$(\"portal_auth_login_container\").show();\n }\n}\n\nexport default new PortalAuthLoginForm();\n","import ClassUI from \"./ClassUI.js\";\n\nvar L = null;\n\nclass PortalAuthLoginResetPassword extends ClassUI {\n constructor() {\n super();\n }\n\n ui() {\n var self = this;\n\n if (!this.AB) {\n // we need to init() before being able to translate our UI:\n return {\n id: \"portal_auth_login_reset_password\",\n };\n }\n\n return {\n id: \"portal_auth_login_reset_password\",\n css: \"portalLogin\",\n cols: [\n {},\n {\n rows: [\n {},\n {\n width: 360,\n rows: [\n {\n id: \"portal_auth_login_reset_password_col\",\n css: \"portalLoginForm\",\n padding: 30,\n rows: [\n {\n template:\n \"
    \",\n borderless: true,\n height: 190,\n type: \"clean\",\n },\n {\n id: \"portal_auth_login_reset_password_form\",\n view: \"form\",\n type: \"clean\",\n css: { background: \"transparent !important\" },\n borderless: true,\n elementsConfig: {\n height: 52,\n },\n elements: [\n {\n id: \"new-password-email\",\n template: ` ${this.AB.Account.email()} `,\n css: {\n background: \"transparent !important\",\n border: \"none\",\n \"font-size\": \"16px\",\n color: \"black\",\n \"text-align\": \"center\",\n },\n },\n {\n id: \"password-new\",\n view: \"text\",\n type: \"password\",\n placeholder: L(\"Enter a new Password\"),\n name: L(\"Enter a new Password\"),\n validate: (v) => {\n return v.length >= 8;\n },\n invalidMessage: L(\n \"Needs to be at least 8 characters\"\n ),\n validateEvent: \"blur\",\n bottomPadding: 20,\n attributes: {\n \"data-cy\":\n \"portal_reset_password_new\",\n },\n },\n {\n id: \"password-confirm\",\n view: \"text\",\n type: \"password\",\n placeholder: L(\"Re-enter Password\"),\n name: \"email\",\n validate: (v) => {\n return (\n v === $$(\"password-new\").getValue()\n );\n },\n invalidMessage: L(\n \"Passwords do not match\"\n ),\n validateEvent: \"blur\",\n bottomPadding: 20,\n attributes: {\n \"data-cy\":\n \"portal_reset_password_confirm\",\n },\n },\n {\n margin: 10,\n paddingX: 2,\n borderless: true,\n cols: [\n {},\n {\n view: \"button\",\n label: L(\"Save\"),\n type: \"form\",\n id: \"portal_reset_password_submit\",\n css: \"webix_primary\",\n width: 150,\n hotkey: \"enter\",\n click: () => {\n if (\n $$(\n \"portal_auth_login_reset_password_form\"\n ).validate()\n ) {\n let password =\n $$(\n \"password-new\"\n ).getValue();\n this.AB.Network.post(\n {\n url: \"/auth/password/reset\",\n data: {\n password,\n },\n },\n {\n key: \"portal_auth_password_reset\",\n context: {},\n }\n ).catch((err) => {\n console.log(err);\n });\n }\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {},\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n {},\n ],\n },\n {},\n ],\n };\n }\n\n async init(AB) {\n this.AB = AB;\n\n L = (...params) => {\n return this.AB.Multilingual.label(...params);\n };\n\n // now replace our initial placeholder with our viewable form\n webix.ui(this.ui(), $$(\"portal_auth_login_reset_password\"));\n\n this.AB.Network.on(\n \"portal_auth_password_reset\",\n (context, err, response) => {\n // Listen for our responses:\n // Show a popup for confirmation that an email was sent.\n // context.email : {string} entered email address.\n\n this.AB.emit(\"portal.show\", \"work\"); // switch to the Work Portal.\n }\n );\n }\n\n show() {\n $$(\"portal_auth_login_reset_password\").show();\n }\n}\n\nexport default new PortalAuthLoginResetPassword();\n","import ClassUI from \"./ClassUI.js\";\n\nvar L = null;\n\nclass PortalAuthLoginResetRequest extends ClassUI {\n constructor() {\n super();\n }\n\n ui() {\n var self = this;\n\n if (!this.AB) {\n // we need to init() before being able to translate our UI:\n return {\n id: \"portal_auth_login_reset_request\",\n };\n }\n\n return {\n id: \"portal_auth_login_reset_request\",\n css: \"portalLogin\",\n cols: [\n {},\n {\n rows: [\n {},\n {\n width: 360,\n rows: [\n {\n id: \"password_reset_email\",\n css: \"portalLoginForm\",\n padding: 30,\n rows: [\n {\n template:\n \"
    \",\n borderless: true,\n height: 190,\n type: \"clean\",\n },\n {\n id: \"portal_reset_password_form\",\n view: \"form\",\n type: \"clean\",\n css: { background: \"transparent !important\" },\n borderless: true,\n elementsConfig: {\n bottomPadding: 20,\n },\n elements: [\n {\n template: `

    ${L(\n \"Enter your email. We'll send a link to reset your password.\"\n )}

    `,\n autoheight: true,\n css: {\n background: \"transparent\",\n border: \"none\",\n \"font-size\": \"16px\",\n color: \"black\",\n \"text-align\": \"center\",\n },\n },\n {\n borderless: true,\n cols: [\n {\n id: \"reset_tenantList\",\n view: \"select\",\n // label: \"Tenant\",\n name: \"tenant\",\n attributes: {\n \"data-cy\": \"reset_tenantList\",\n },\n value: 1,\n options: [\n { id: 1, value: \"Master\" },\n { id: 2, value: \"Release\" },\n ],\n },\n {\n id: \"reset-email\",\n view: \"text\",\n placeholder: L(\"Email\"),\n name: \"email\",\n validate: webix.rules.isEmail,\n invalidMessage: L(\n \"Please enter a valid email.\"\n ),\n validateEvent: \"blur\",\n attributes: {\n \"data-cy\":\n \"portal_reset_request_email\",\n },\n },\n {\n rows: [\n {\n view: \"button\",\n icon: \"fa fa-paper-plane\",\n type: \"icon\",\n css: \"webix_primary\",\n id: \"portal_reset_request_send\",\n autowidth: true,\n hotkey: \"enter\",\n click() {\n var email =\n $$(\"reset-email\");\n if (email.validate()) {\n email =\n email.getValue();\n var tenant =\n $$(\n \"reset_tenantList\"\n ).getValue();\n self.AB.Network.post(\n {\n url: \"/auth/login/reset\",\n data: {\n email,\n tenant,\n url:\n window\n .location\n .origin ||\n window\n .location\n .href,\n },\n },\n {\n key: \"portal_auth_login_reset\",\n context: {\n email,\n },\n }\n ).catch((err) => {\n console.log(err);\n });\n }\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(\n this\n );\n },\n },\n },\n {},\n ],\n },\n ],\n },\n {\n view: \"button\",\n label: L(\"Back to log in\"),\n css: \"webix_transparent\",\n click() {\n self.emit(\"login\");\n },\n },\n ],\n },\n ],\n },\n ],\n },\n {},\n ],\n },\n {},\n ],\n };\n }\n\n async init(AB) {\n this.AB = AB;\n\n L = (...params) => {\n return this.AB.Multilingual.label(...params);\n };\n\n // now replace our initial placeholder with our viewable form\n webix.ui(this.ui(), $$(\"portal_auth_login_reset_request\"));\n\n var $tenant = $$(\"reset_tenantList\");\n var siteConfig = this.AB.Config.siteConfig();\n if (siteConfig?.tenants?.length) {\n // replace options in tenant list with siteConfig.tenants:\n var newOptions = [];\n siteConfig.tenants.forEach((t) => {\n var opt = {\n id: t.uuid,\n value: t.title || t.key,\n };\n newOptions.push(opt);\n });\n\n $tenant.define(\"options\", newOptions);\n }\n\n var tID = this.AB.Tenant.id();\n if (tID) {\n $tenant.define(\"value\", tID);\n\n // if the tID matches one of our options, then we can hide\n // the input.\n // eg: they entered a route [tenant].our.url\n // we simple auto select the tenant and don't show this component.\n var opt = newOptions.find((o) => o.id == tID);\n if (opt) {\n $tenant.hide();\n }\n }\n\n this.AB.Network.on(\n \"portal_auth_login_reset\",\n (context, err, response) => {\n // Listen for our responses:\n // Show a popup for confirmation that an email was sent.\n // context.email : {string} entered email address.\n\n var text = L(\n \"

    An email with instructions on how to reset your password has been sent to {0}.

    Check your spam or junk folder if you don’t see the email in your inbox.

    \",\n [context.email]\n );\n\n webix.alert({\n title: L(\"Email Sent\"),\n ok: L(\"Okay\"),\n width: 500,\n text: text,\n });\n }\n );\n }\n\n show() {\n $$(\"portal_auth_login_reset_request\").show();\n }\n}\n\nexport default new PortalAuthLoginResetRequest();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalLoading extends ClassUI {\n constructor() {\n super();\n }\n\n ui() {\n return {\n id: \"portal_loading\",\n view: \"label\",\n label: \"loading\",\n };\n }\n\n init(AB) {\n this.AB = AB;\n\n return Promise.resolve();\n }\n\n show() {\n $$(\"portal_loading\").show();\n }\n}\n\nexport default new PortalLoading();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalTranslationTool extends ClassUI {\n constructor() {\n super();\n this.containerDomID = \"domID\";\n }\n\n ui() {\n const translationToolBody = {\n view: \"scrollview\",\n css: \"lightgray ab_amp\",\n body: {\n rows: [\n {\n view: \"accordion\",\n id: `qtt_accordion_${this.containerDomID}`,\n roles: [],\n hidden: true,\n collapsed: true,\n css: \"webix_dark\",\n rows: [],\n },\n {\n id: `qtt_accordion_noSelection_${this.containerDomID}`,\n rows: [{}],\n },\n ],\n },\n };\n\n return {\n view: \"window\",\n css: \"qttWindow\",\n id: `quickTranslationTool_${this.containerDomID}`,\n position: function (state) {\n state.left = state.maxWidth - 400; // fixed values\n state.top = 0;\n state.width = 400; // relative values\n state.height = state.maxHeight;\n },\n on: {\n onShow: () => {\n // collapse all the accordion items but the top one\n var index = 0;\n $$(`qtt_accordion_${this.containerDomID}`)\n .getChildViews()\n .forEach((a) => {\n if (index == 0) {\n $$(a).expand();\n } else {\n $$(a).collapse();\n }\n index++;\n $$(`qtt_accordion_${this.containerDomID}`).show();\n $$(\n `qtt_accordion_noSelection_${this.containerDomID}`\n ).hide();\n });\n },\n },\n head: {\n rows: [\n {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n width: 15,\n },\n {\n view: \"label\",\n label: \"Translation Tool\",\n autowidth: true,\n },\n {},\n {\n view: \"button\",\n width: 38,\n css: \"webix_transparent\",\n icon: \"fa fa-cog\",\n type: \"iconTop\",\n click: function () {\n if ($$(\"translationSettings\").config.hidden) {\n $$(\"translationSettings\").show();\n } else {\n $$(\"translationSettings\").hide();\n }\n },\n },\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(\n `quickTranslationTool_${this.containerDomID}`\n ).hide();\n },\n },\n ],\n },\n {\n view: \"toolbar\",\n id: \"translationSettings\",\n hidden: true,\n css: \"webix_dark\",\n rows: [\n {\n id: `qtt_accordion_${this.containerDomID}_translateTo`,\n view: \"select\",\n labelWidth: 120,\n label: \"Translate to:\",\n labelAlign: \"right\",\n options: [],\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n this.buildTranslationAccordion(\n this.application.objectsIncluded(),\n this.application.pages(),\n this.application.hintsIncluded()\n );\n }\n },\n },\n },\n {\n id: `qtt_accordion_${this.containerDomID}_translateHint`,\n view: \"select\",\n labelWidth: 120,\n label: \"Hint language:\",\n bottomLabel: \"*Hover over label to display hint\",\n labelAlign: \"right\",\n options: [],\n on: {\n onChange: (newVal, oldVal) => {\n if (newVal != oldVal) {\n this.buildTranslationAccordion(\n this.application.objectsIncluded(),\n this.application.pages(),\n this.application.hintsIncluded()\n );\n }\n },\n },\n },\n ],\n },\n ],\n },\n body: translationToolBody,\n };\n }\n\n init(portal) {\n this.AB = portal.AB;\n this.portal = portal;\n this.appId = portal.AppState.lastSelectedApp;\n this.application = this.AB.applicationByID(this.appId);\n\n const languageCode = this.AB.Config.userConfig().languageCode;\n\n let languageList = [];\n\n try {\n this.AB.Network.get({\n // The object \"SITE_LANGUAGE\"\n url: \"/app_builder/model/d84cd351-d96c-490f-9afb-2a0b880ca0ec\",\n }).then((list) => {\n list.data.forEach((item) => {\n languageList.push({\n id: item.language_code,\n value: item.language_label,\n });\n });\n $$(`qtt_accordion_${this.containerDomID}_translateTo`).define({\n options: languageList,\n value: languageCode,\n });\n $$(`qtt_accordion_${this.containerDomID}_translateTo`).refresh();\n $$(\n `qtt_accordion_${this.containerDomID}` + \"_translateHint\"\n ).define({\n options: languageList,\n value: languageList[0].id,\n });\n $$(\n `qtt_accordion_${this.containerDomID}` + \"_translateHint\"\n ).refresh();\n this.buildTranslationAccordion(\n this.application.objectsIncluded(),\n this.application.pages(),\n this.application.hintsIncluded()\n );\n });\n\n webix.ready(function () {\n webix.protoUI(\n {\n name: \"edittree\",\n },\n webix.EditAbility,\n webix.ui.tree\n );\n });\n\n webix.ui(this.ui());\n } catch (error) {\n console.error(error);\n }\n }\n\n show() {\n $$(`quickTranslationTool_${this.containerDomID}`).show();\n }\n\n hide() {\n $$(`quickTranslationTool_${this.containerDomID}`).hide();\n }\n\n showPage(pageId) {\n let page = this.application.views((v) => {\n return v.id == pageId;\n })[0];\n\n this.portal.showPage(page);\n }\n\n /*\n * helper to get the current apps views\n */\n views(f) {\n return this.AB.applicationByID(this.appId).views(f);\n }\n\n tutorials(f) {\n return this.AB.applicationByID(this.appId).hints(f);\n }\n\n buildTranslationAccordion(objects, views, tutorials) {\n $$(`qtt_accordion_${this.containerDomID}`).removeView(\n `qtt_accordionitem_${this.containerDomID}_objects`\n );\n $$(`qtt_accordion_${this.containerDomID}`).removeView(\n `qtt_accordionitem_${this.containerDomID}_views`\n );\n $$(`qtt_accordion_${this.containerDomID}`).removeView(\n `qtt_accordionitem_${this.containerDomID}_tutorials`\n );\n\n var toggleParent = (element) => {\n if (!element.parent) return false;\n var parentElem = element.parent;\n if (!parentElem.parent) return false;\n parentElem.parent.emit(\"changeTab\", parentElem.id);\n toggleParent(parentElem.parent);\n };\n\n var objectTree = [\n {\n id: `qtt_object_progress${this.containerDomID}`,\n height: 7,\n },\n {\n id: `linetree_${this.containerDomID}_objects`,\n view: \"edittree\",\n type: \"lineTree\",\n editable: true,\n tooltip: \"#hint#\",\n // role: role,\n editor: \"text\",\n editValue: \"value\",\n template: (obj, common) => {\n let language = $$(\n `qtt_accordion_${this.containerDomID}_translateTo`\n ).getValue();\n var color = \"gray\";\n if (obj.value.indexOf(`[${language}]`) > -1) {\n color = \"#ff5c4c\";\n }\n if (!obj.icon) {\n obj.icon = \"minus\";\n }\n var icon = `\n \n \n `;\n return (\n `` +\n icon +\n common.icon(obj, common) +\n `${obj.value}`\n );\n },\n data: [],\n on: {\n onAfterLoad: (id) => {\n if (\n !$$(`qtt_object_progress${this.containerDomID}`)\n .showProgress\n ) {\n webix.extend(\n $$(`qtt_object_progress${this.containerDomID}`),\n webix.ProgressBar\n );\n }\n $$(`linetree_${this.containerDomID}_objects`).parse(\n this.getTranslationToolObjectsTree(\n objects,\n this.containerDomID\n )\n );\n $$(`linetree_${this.containerDomID}_objects`).openAll();\n },\n onAfterEditStop: (state, editor, ignoreUpdate) => {\n if (state.old == state.value) return false;\n let language = $$(\n `qtt_accordion_${this.containerDomID}_translateTo`\n ).getValue();\n let branch = $$(\n `linetree_${this.containerDomID}_objects`\n ).data.getItem(editor.id);\n let propName = branch.field;\n let objectId = branch.objectId ? branch.objectId : branch.id;\n let fieldId = branch.fieldId ? branch.fieldId : \"\";\n let obj = this.AB.objectByID(objectId);\n if (fieldId) {\n let field = obj.fields((item) => {\n return item.id == fieldId;\n })[0];\n if (branch.type == \"option\") {\n field.settings.options.forEach((option) => {\n if (option.id == branch.id) {\n if (obj.languageDefault() == language) {\n hasLang = true;\n option[propName] = state.value;\n } else {\n option.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n var trans = {};\n trans.language_code = language;\n trans[propName] = state.value;\n option.translations.push(trans);\n }\n field.save();\n }\n });\n } else {\n var hasLang = false;\n if (obj.languageDefault() == language) {\n hasLang = true;\n field[propName] = state.value;\n } else {\n field.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n var trans = {};\n trans.language_code = language;\n trans[propName] = state.value;\n field.translations.push(trans);\n }\n field.save();\n }\n } else {\n let hasLang = false;\n if (obj.languageDefault() == language) {\n hasLang = true;\n obj[propName] = state.value;\n } else {\n obj.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n let trans = {};\n trans.language_code = language;\n trans[propName] = state.value;\n obj.translations.push(trans);\n }\n obj.save();\n }\n\n let progressBar = $$(\n `qtt_object_progress${this.containerDomID}`\n );\n let total = progressBar.config.total;\n let completed = progressBar.config.completed;\n\n if (\n state.old.indexOf(`[${language}]`) == -1 &&\n state.value.indexOf(`[${language}]`) > -1\n ) {\n completed--;\n } else if (\n state.old.indexOf(`[${language}]`) > -1 &&\n state.value.indexOf(`[${language}]`) > -1\n ) {\n // no change to completed count\n } else {\n completed++;\n }\n let position = completed / total + 0.00001;\n progressBar.define({\n total: total,\n completed: completed,\n });\n progressBar.showProgress({\n type: \"top\",\n position: position,\n });\n },\n },\n },\n ];\n\n var viewTree = [\n {\n id: `qtt_view_progress${this.containerDomID}`,\n height: 7,\n },\n {\n id: `linetree_${this.containerDomID}_views`,\n view: \"edittree\",\n type: \"lineTree\",\n editable: true,\n tooltip: \"#hint#\",\n // role: role,\n editor: \"text\",\n editValue: \"value\",\n template: (obj, common) => {\n let language = $$(\n `qtt_accordion_${this.containerDomID}_translateTo`\n ).getValue();\n var color = \"gray\";\n if (obj.value.indexOf(`[${language}]`) > -1) {\n color = \"#ff5c4c\";\n }\n if (!obj.icon) {\n obj.icon = \"minus\";\n }\n var externalLink = \"\";\n if ([\"button\", \"label\", \"menu\"].indexOf(obj.type) == -1) {\n externalLink = ``;\n }\n var icon = `\n \n \n `;\n return (\n `` +\n icon +\n common.icon(obj, common) +\n `${obj.value}` +\n externalLink\n );\n },\n data: [],\n onClick: {\n externalLink: (event, branch, target) => {\n var item = $$(\n `linetree_${this.containerDomID}_views`\n ).getItem(branch);\n\n this.showPage(item.pageId || item.viewId);\n\n if (item.type == \"tab\") {\n var tabView = this.application.views(\n (v) => v.id == item.id\n )[0];\n if (!tabView) return false;\n\n var tab = tabView.parent;\n if (!tab) return false;\n\n toggleParent(tab);\n if (!$$(tabView.id) || !$$(tabView.id).isVisible()) {\n var showIt = setInterval(function () {\n if ($$(tabView.id) && $$(tabView.id).isVisible()) {\n clearInterval(showIt);\n }\n tab.emit(\"changeTab\", tabView.id);\n }, 200);\n }\n } else if (item.type == \"page\") {\n var pageView = this.application.views(\n (v) => v.id == item.id\n )[0];\n if (!pageView) return false;\n pageView.emit(\"changePage\", pageView.id);\n // this.showPage(item.pageId);\n }\n\n return false;\n },\n },\n on: {\n onAfterLoad: (id) => {\n if (\n !$$(`qtt_view_progress${this.containerDomID}`).showProgress\n ) {\n webix.extend(\n $$(`qtt_view_progress${this.containerDomID}`),\n webix.ProgressBar\n );\n }\n $$(`linetree_${this.containerDomID}_views`).parse(\n this.getTranslationToolViewsTree(\n views,\n this.containerDomID\n )\n );\n $$(`linetree_${this.containerDomID}_views`).openAll();\n },\n onAfterEditStop: (state, editor, ignoreUpdate) => {\n if (state.old == state.value) return false;\n let language = $$(\n `qtt_accordion_${this.containerDomID}_translateTo`\n ).getValue();\n let branch = $$(\n `linetree_${this.containerDomID}_views`\n ).data.getItem(editor.id);\n let propName = branch.field;\n if (branch.type == \"menu\") {\n let view = this.application.views((view) => {\n return view.id == branch.viewId;\n })[0];\n view.settings.order.forEach((button) => {\n if (button.pageId == branch.buttonId) {\n let hasLang = false;\n button.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n if (!hasLang) {\n let trans = {};\n trans.language_code = language;\n trans[propName] = state.value;\n button.translations.push(trans);\n }\n view.save();\n }\n });\n } else if (branch.type == \"button\") {\n let view = this.application.views((view) => {\n return view.id == branch.viewId;\n })[0];\n var hasLang = false;\n\n if (view.languageDefault() == language) {\n hasLang = true;\n view.settings[propName] = state.value;\n } else {\n view.settings.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n var trans = {};\n trans.language_code = language;\n trans[propName] = state.value;\n view.settings.translations.push(trans);\n }\n view.save();\n } else {\n let view = this.application.views((view) => {\n return view.id == branch.id;\n })[0];\n let hasLang = false;\n if (view.languageDefault() == language) {\n hasLang = true;\n view[propName] = state.value;\n } else {\n view.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n let trans = {};\n trans.language_code = language;\n trans[propName] = state.value;\n view.translations.push(trans);\n }\n view.save();\n }\n let progressBar = $$(\n `qtt_view_progress${this.containerDomID}`\n );\n let total = progressBar.config.total;\n let completed = progressBar.config.completed;\n if (\n state.old.indexOf(`[${language}]`) == -1 &&\n state.value.indexOf(`[${language}]`) > -1\n ) {\n completed--;\n } else if (\n state.old.indexOf(`[${language}]`) > -1 &&\n state.value.indexOf(`[${language}]`) > -1\n ) {\n // no change to completed count\n } else {\n completed++;\n }\n let position = completed / total + 0.00001;\n progressBar.define({\n total: total,\n completed: completed,\n });\n progressBar.showProgress({\n type: \"top\",\n position: position,\n });\n },\n },\n },\n ];\n\n var tutorialTree = [\n {\n id: `qtt_tutorials_progress${this.containerDomID}`,\n height: 7,\n },\n {\n id: `linetree_${this.containerDomID}_tutorials`,\n view: \"edittree\",\n type: \"lineTree\",\n editable: true,\n tooltip: \"#hint#\",\n // role: role,\n editor: \"text\",\n editValue: \"value\",\n template: (obj, common) => {\n let language = $$(\n `qtt_accordion_${this.containerDomID}_translateTo`\n ).getValue();\n var color = \"gray\";\n if (obj.value.indexOf(`[${language}]`) > -1) {\n color = \"#ff5c4c\";\n }\n if (!obj.icon) {\n obj.icon = \"minus\";\n }\n var icon = `\n \n \n `;\n return (\n `` +\n icon +\n common.icon(obj, common) +\n `${obj.value}`\n );\n },\n data: [],\n on: {\n onAfterLoad: (id) => {\n if (\n !$$(`qtt_tutorials_progress${this.containerDomID}`)\n .showProgress\n ) {\n webix.extend(\n $$(`qtt_tutorials_progress${this.containerDomID}`),\n webix.ProgressBar\n );\n }\n $$(`linetree_${this.containerDomID}_tutorials`).parse(\n this.getTranslationToolTutorialsTree(\n tutorials,\n this.containerDomID\n )\n );\n $$(`linetree_${this.containerDomID}_tutorials`).openAll();\n },\n onAfterEditStop: (state, editor, ignoreUpdate) => {\n /// need to work here next week james\n if (state.old == state.value) return false;\n let language = $$(\n `qtt_accordion_${this.containerDomID}_translateTo`\n ).getValue();\n let branch = $$(\n `linetree_${this.containerDomID}_tutorials`\n ).data.getItem(editor.id);\n let propName = branch.field;\n if (branch.type == \"tutorial\") {\n let hint = this.AB.hints((h) => {\n return h.id == branch.viewId;\n })[0];\n let hasLang = false;\n if (hint.languageDefault() == language) {\n hasLang = true;\n hint[propName] = state.value;\n } else {\n hint.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n let trans = {};\n for (const [key, value] of Object.entries(\n hint.translations[0]\n )) {\n trans[key] = `[${language}] ${value}`;\n }\n trans.language_code = language;\n trans[propName] = state.value;\n hint.translations.push(trans);\n }\n hint.save();\n } else if (branch.type == \"step\") {\n let hint = this.AB.hints((h) => {\n return h.id == branch.hintId;\n })[0];\n let step = hint._steps[branch.viewId];\n let hasLang = false;\n if (step.languageDefault() == language) {\n hasLang = true;\n step[propName] = state.value;\n } else {\n step.translations.forEach((t) => {\n if (t.language_code == language) {\n hasLang = true;\n t[propName] = state.value;\n }\n });\n }\n if (!hasLang) {\n let trans = {};\n for (const [key, value] of Object.entries(\n step.translations[0]\n )) {\n trans[key] = `[${language}] ${value}`;\n }\n trans.language_code = language;\n trans[propName] = state.value;\n step.translations.push(trans);\n }\n step.save();\n }\n let progressBar = $$(\n `qtt_tutorials_progress${this.containerDomID}`\n );\n let total = progressBar.config.total;\n let completed = progressBar.config.completed;\n if (\n state.old.indexOf(`[${language}]`) == -1 &&\n state.value.indexOf(`[${language}]`) > -1\n ) {\n completed--;\n } else if (\n state.old.indexOf(`[${language}]`) > -1 &&\n state.value.indexOf(`[${language}]`) > -1\n ) {\n // no change to completed count\n } else {\n completed++;\n }\n let position = completed / total + 0.00001;\n progressBar.define({\n total: total,\n completed: completed,\n });\n progressBar.showProgress({\n type: \"top\",\n position: position,\n });\n },\n },\n },\n ];\n\n var objectsAccordionItem = {\n view: \"accordionitem\",\n id: `qtt_accordionitem_${this.containerDomID}_objects`,\n header: \"Data Objects\",\n collapsed: true,\n body: {\n type: \"clean\",\n rows: objectTree,\n },\n };\n\n var viewsAccordionItem = {\n view: \"accordionitem\",\n id: `qtt_accordionitem_${this.containerDomID}_views`,\n header: \"Interface Items\",\n collapsed: true,\n body: {\n type: \"clean\",\n rows: viewTree,\n },\n };\n\n var hintsAccordionItem = {\n view: \"accordionitem\",\n id: `qtt_accordionitem_${this.containerDomID}_tutorials`,\n header: \"Tutorials\",\n collapsed: true,\n body: {\n type: \"clean\",\n rows: tutorialTree,\n },\n };\n\n $$(`qtt_accordion_${this.containerDomID}`).addView(\n objectsAccordionItem,\n -1\n );\n $$(`qtt_accordion_${this.containerDomID}`).addView(\n viewsAccordionItem,\n -1\n );\n $$(`qtt_accordion_${this.containerDomID}`).addView(\n hintsAccordionItem,\n -1\n );\n $$(`qtt_accordion_${this.containerDomID}`).show();\n $$(`qtt_accordionitem_${this.containerDomID}_views`).collapse();\n $$(`qtt_accordionitem_${this.containerDomID}_tutorials`).collapse();\n $$(`qtt_accordion_noSelection_${this.containerDomID}`).hide();\n\n $$(`linetree_${this.containerDomID}_objects`).openAll();\n $$(`linetree_${this.containerDomID}_views`).openAll();\n $$(`linetree_${this.containerDomID}_tutorials`).openAll();\n }\n\n getTranslations(translations, domId, field, completed, total) {\n var missingHint = false;\n var missingTranslate = false;\n var translateLang = $$(`qtt_accordion_${domId}_translateTo`).getValue();\n var value = translations.filter((item) => {\n return item.language_code == translateLang;\n })[0];\n if (!value) {\n // we didn't find the language so we are defaulting to first language\n missingTranslate = true;\n value = translations[0];\n }\n var hintLang = $$(`qtt_accordion_${domId}_translateHint`).getValue();\n var hint = translations.filter((item) => {\n return item.language_code == hintLang;\n })[0];\n if (!hint) {\n // we didn't find the language so we are defaulting to first language\n missingHint = true;\n hint = translations[0];\n }\n\n var hintLabel = \"\";\n var valueLabel = \"\";\n\n // some items store the text we need translated under \"text\"\n if (field) {\n hintLabel = hint[field];\n valueLabel = value[field];\n }\n if (!hintLabel) {\n hintLabel = hint.label;\n }\n if (!valueLabel) {\n valueLabel = value.label;\n }\n\n var hintPrefix = \"\";\n if (missingHint) {\n hintPrefix = `[${hintLang}] `;\n }\n var translatePrefix = \"\";\n if (missingTranslate) {\n translatePrefix = `[${translateLang}] `;\n }\n if (\n (valueLabel || \"\").indexOf(`[${translateLang}]`) == -1 &&\n !missingTranslate\n ) {\n completed++;\n }\n total++;\n return {\n hint: hintPrefix + hintLabel,\n value: translatePrefix + valueLabel,\n completed: completed,\n total: total,\n };\n }\n\n getTranslationToolViewsTree(views, domId) {\n var completed = 0;\n var total = 0;\n // this so it looks right/indented in a tree view:\n var tree = new webix.TreeCollection();\n\n /**\n * @method addPage\n *\n * @param {ABView} page\n * @param {integer} index\n * @param {uuid} parentId\n */\n var addPage = (page, parentId, type, field = \"label\", viewId) => {\n var translations = page.translations;\n var pageId = page.id;\n if (type == \"button\") {\n translations = page.settings.translations;\n pageId = `${page.id}_${field}`;\n }\n var labels = this.getTranslations(\n translations,\n domId,\n field,\n completed,\n total\n );\n completed = labels.completed;\n total = labels.total;\n var icon = page.tabicon ? page.tabicon : page.icon;\n\n // add to tree collection\n var branch = {\n id: pageId,\n value: labels.value,\n hint: labels.hint,\n field: field,\n viewId: viewId,\n translations: page.translations,\n pageId: parentId,\n buttonId: page.pageId,\n type: type,\n icon: icon,\n };\n tree.add(branch, null, parentId);\n\n // stop at detail views\n // if (page.defaults.key == \"detail\") {\n // return;\n // }\n\n var subPages = page.pages ? page.pages() : [];\n subPages.forEach((childPage, childIndex) => {\n addPage(childPage, page.id, \"page\");\n });\n\n // stop if there are no views to parse\n if (!page.views) return;\n // add labels\n page\n .views((v) => v.defaults.key == \"label\")\n .forEach((label, labelIndex) => {\n // label views\n // label.icon = \"th-list\";\n addPage(label, page.id, \"label\", \"text\", label.id);\n });\n // add tabs\n page\n .views((v) => v.defaults.key == \"tab\")\n .forEach((tab, tabIndex) => {\n // tab views\n tab.views().forEach((tabView, tabViewIndex) => {\n // tab items will be below sub-page items\n // tabView.icon = \"th-list\";\n addPage(tabView, page.id, \"tab\", \"label\", tab.id);\n });\n });\n // add menus\n page\n .views((v) => v.defaults.key == \"menu\")\n .forEach((menu, menuIndex) => {\n // menu buttons\n if (!menu.settings.order) return;\n menu.settings.order.forEach((menuItem, menuItemIndex) => {\n // tab items will be below sub-page items\n // menuItem.icon = \"link\";\n addPage(menuItem, page.id, \"menu\", \"aliasname\", menu.id);\n });\n });\n // add form buttons\n page\n .views((v) => v.defaults.key == \"form\")\n .forEach((form, formIndex) => {\n // form inputs\n form.views().forEach((formInput, formInputIndex) => {\n // we only need buttons\n if (formInput.key == \"button\") {\n for (const property in formInput.settings\n .translations[0]) {\n if (property != \"language_code\") {\n addPage(\n formInput,\n page.id,\n \"button\",\n property,\n formInput.id\n );\n }\n }\n }\n });\n });\n // add chart labels\n page\n .views((v) => v.defaults.key == \"chart\")\n .forEach((chart, chartIndex) => {\n // chart views\n chart.views().forEach((view, viewIndex) => {\n // we only need buttons\n if (view.key == \"label\") {\n addPage(view, page.id, \"label\", \"text\", view.id);\n }\n });\n });\n };\n views.forEach((p, index) => {\n addPage(p, null, \"page\", \"label\", p.id);\n });\n\n // there is a webix bug that will not allow you to se the value of a progress bar to 0\n let progressBar = $$(`qtt_view_progress${domId}`);\n let position = completed / total + 0.0001;\n progressBar.showProgress({\n type: \"top\",\n position: position,\n });\n progressBar.define({\n total: total,\n completed: completed,\n });\n\n return tree;\n }\n\n getTranslationToolObjectsTree(objects, domId) {\n var completed = 0;\n var total = 0;\n // this so it looks right/indented in a tree view:\n var tree = new webix.TreeCollection();\n\n /**\n * @method addBranch\n *\n * @param {ABView} page\n * @param {uuid} parentId\n * @param {string} type\n */\n var addBranch = (\n object,\n parentId,\n type,\n field = \"label\",\n fieldId,\n objectId\n ) => {\n var translations = object.translations;\n // we were missing translationson the Roles object\n if (!translations) return;\n var labels = this.getTranslations(\n translations,\n domId,\n field,\n completed,\n total\n );\n completed = labels.completed;\n total = labels.total;\n\n // add to tree collection\n var branch = {\n id: object.id,\n value: labels.value,\n hint: labels.hint,\n translations: object.translations,\n pageId: parentId,\n objectId: objectId,\n type: type,\n field: field,\n fieldId: fieldId,\n icon:\n type == \"object\" ? \"database\" : object.icon ? object.icon : \"\",\n };\n tree.add(branch, null, parentId);\n\n var fields = object.fields ? object.fields() : [];\n fields.forEach((field, fieldIndex) => {\n addBranch(field, object.id, \"field\", \"label\", field.id, object.id);\n });\n\n // add options\n if (\n object.settings &&\n object.settings.options &&\n object.settings.options.length\n ) {\n object.settings.options.forEach((option, optionIndex) => {\n addBranch(\n option,\n object.id,\n \"option\",\n \"text\",\n fieldId,\n parentId\n );\n });\n }\n };\n objects.forEach((p, index) => {\n addBranch(p, null, \"object\");\n });\n\n // there is a webix bug that will not allow you to se the value of a progress bar to 0\n let progressBar = $$(`qtt_object_progress${domId}`);\n let position = completed / total + 0.0001;\n progressBar.showProgress({\n type: \"top\",\n position: position,\n });\n progressBar.define({\n total: total,\n completed: completed,\n });\n\n return tree;\n }\n\n getTranslationToolTutorialsTree(tutorials, domId) {\n var completed = 0;\n var total = 0;\n // this so it looks right/indented in a tree view:\n var tree = new webix.TreeCollection();\n\n /**\n * @method addBranch\n *\n * @param {ABView} page\n * @param {uuid} parentId\n * @param {string} type\n */\n var addBranch = (\n object,\n parentId,\n type,\n field = [\"label\"],\n hintId = null\n ) => {\n var translations = object.translations;\n // we were missing translationson the Roles object\n if (!translations) return;\n let lastField = \"\";\n let firstField = \"\";\n field.forEach((f) => {\n if (firstField == \"\") firstField = f;\n lastField = f;\n var labels = this.getTranslations(\n translations,\n domId,\n f,\n completed,\n total\n );\n completed = labels.completed;\n total = labels.total;\n\n // add to tree collection\n var branch = {\n id: object.id + f,\n viewId: object.id,\n value: labels.value,\n hint: labels.hint,\n translations: object.translations,\n field: f,\n type: type,\n hintId: hintId,\n icon:\n type == \"tutorial\"\n ? \"info-circle\"\n : object.icon\n ? object.icon\n : \"minus-circle\",\n };\n tree.add(branch, null, parentId);\n parentId = object.id + firstField;\n });\n\n var steps = object.stepIDs || [];\n steps.forEach((step) => {\n addBranch(\n object._steps[step],\n parentId,\n \"step\",\n [\"name\", \"text\"],\n object.id\n );\n });\n };\n tutorials.forEach((p, index) => {\n addBranch(p, null, \"tutorial\", [\"name\", \"description\"]);\n });\n\n // there is a webix bug that will not allow you to se the value of a progress bar to 0\n let progressBar = $$(`qtt_tutorials_progress${domId}`);\n let position = completed / total + 0.0001;\n progressBar.showProgress({\n type: \"top\",\n position: position,\n });\n progressBar.define({\n total: total,\n completed: completed,\n });\n\n return tree;\n }\n}\n\nexport default new PortalTranslationTool();\n","import ClassUI from \"./ClassUI.js\";\n\nlet L = (...params) => AB.Multilingual.label(...params);\n\nclass PortalTutorialManager extends ClassUI {\n constructor() {\n super();\n }\n\n ui(appId) {\n // this is the modal window that opens when you click a tutorial to edit\n const tutorialStepsManager = (id) => {\n return {\n view: \"window\",\n id: \"stepManager\" + id,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n width: 15,\n },\n {\n view: \"label\",\n label: \"Tutorial Steps Manager\",\n autowidth: true,\n },\n {},\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-plus\",\n label: \"Step\",\n autowidth: true,\n css: \"webix_primary\",\n click: async () => {\n // create ABStep\n let step = await this.createStep(id);\n // save it to get an id to store on the ABHint\n await step.save();\n\n // get the current ABHint\n let hint = this.AB.hints((h) => {\n return h.id == id;\n })[0];\n // store the new ABStep id in the current ABHint\n if (hint?.stepIDs && Array.isArray(hint.stepIDs)) {\n hint.stepIDs.push(step.id);\n } else {\n hint.stepIDs = [step.id];\n }\n // store the ABStep in the ABHint (not saved in definitions)\n hint._steps[step.id] = step;\n // add the new step UI to the interface\n $$(\"hint_steps_\" + hint.id).addView(\n this.stepUI(step, hint)\n );\n },\n },\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(\"stepManager\" + id).close();\n this.show();\n },\n },\n ],\n },\n width: 800,\n height: 500,\n move: true,\n position: \"center\",\n resize: true,\n body: {\n rows: [\n {\n view: \"scrollview\",\n body: {\n rows: [\n tutorialSettings(id),\n {\n id: \"hint_steps_\" + id,\n rows: [],\n },\n ],\n },\n },\n save(id),\n ],\n },\n };\n };\n\n // ui that contains the list of current ABHints on this application\n const tutorialManagerBody = {\n view: \"scrollview\",\n css: \"lightgray ab_tutorial\",\n body: {\n rows: [\n {\n view: \"list\",\n id: \"tutorial_list\",\n template: `
    \n \n
    \n
    \n

    #name#

    \n

    #description#

    \n
    `,\n data: this._hints,\n hidden: this._hints.length == 0, // hide if we do not have any hints yet\n type: {\n css: \"hintItem\",\n height: \"auto\",\n },\n onClick: {\n deleteHint: (ev, id) => {\n // Confirm user wants to delete the hint\n webix\n .confirm({\n title: L(\"Delete Tutorial\"),\n text: L(\n \"Are you sure you want to delete this tutorial?\"\n ),\n type: \"confirm-error\",\n })\n .then((result) => {\n // get the hint that we want to delete\n let hint = this.AB.hintID(id);\n // delete the hint (steps will also be deleted)\n hint.destroy(this.application);\n // remove the hint from the ui\n $$(\"tutorial_list\").remove(id);\n // check if we have any hints if not switch views\n if ($$(\"tutorial_list\").count() == 0) {\n $$(\"tutorial_list\").hide();\n $$(\"tutorial_list_noSelection\").show();\n }\n return false; // blocks the default click behavior\n })\n .fail(() => {\n // webix.message(\"Cancel\");\n });\n return false;\n },\n hintItem: (ev, id) => {\n // open the editor for the hint\n webix.ui(tutorialStepsManager(id)).show();\n // insert the steps into the manager to edit\n this.steps(id);\n this.hide();\n },\n },\n },\n {\n id: \"tutorial_list_noSelection\",\n hidden: this._hints.length > 0,\n rows: [\n {},\n {\n view: \"label\",\n align: \"center\",\n height: 200,\n label: \"
    \",\n },\n {\n view: \"label\",\n align: \"center\",\n label: \"Add a tutorial to this page.\",\n },\n {\n cols: [\n {},\n {\n view: \"button\",\n label: \"Create Tutorial\",\n type: \"form\",\n css: \"webix_primary\",\n autowidth: true,\n click: () => {\n // open modal that helps user make a new hint\n webix.ui(newTutorialPopup).show();\n\n // populate the optiosn of the page/tab combo\n $$(\"view_popup_options\").define(\n \"options\",\n this.options\n );\n // attempt to set the values of the combo based off the\n // last visited page would be better if we could look at\n // tabs as well\n $$(\"view_popup_options\").define(\n \"value\",\n this.portal.AppState.lastPages[\n this.portal.AppState.lastSelectedApp\n ]\n );\n $$(\"view_popup_options\").refresh();\n },\n },\n {},\n ],\n },\n {},\n ],\n },\n ],\n },\n };\n\n // small modal that is displayed when user wants to create a new tutorial/hint\n const newTutorialPopup = {\n view: \"popup\",\n id: \"newTutorialPopup\",\n position: \"center\",\n height: 250,\n width: 350,\n modal: true,\n body: {\n rows: [\n {\n view: \"toolbar\",\n id: \"myToolbarABLiveTool\",\n css: \"webix_dark\",\n cols: [\n {\n view: \"label\",\n label: L(\"Create Tutorial\"),\n align: \"center\",\n },\n ],\n },\n {\n view: \"form\",\n elements: [\n {\n view: \"combo\",\n label: \"\",\n id: \"view_popup_options\",\n placeholder: L(\"Choose Page or Tab\"),\n options: [],\n },\n {\n cols: [\n {\n view: \"button\",\n value: L(\"Cancel\"),\n click: () => {\n $$(\"newTutorialPopup\").hide();\n },\n },\n {\n view: \"button\",\n value: \"Create\",\n id: \"view_popup_options_add\",\n css: \"webix_primary\",\n click: () => {\n let view = $$(\"view_popup_options\").getValue();\n let text = $$(\"view_popup_options\")\n .getText()\n .trim();\n // take values from selection to build a new hint\n this.createTutorial(view, text);\n $$(\"newTutorialPopup\").hide();\n },\n },\n ],\n },\n ],\n },\n ],\n },\n };\n\n // save the hint and step values and close the manager\n const save = (id) => {\n return {\n cols: [\n {},\n {\n view: \"button\",\n value: L(\"Cancel\"),\n width: 100,\n click: () => {\n $$(\"stepManager\" + id).close();\n this.show();\n },\n },\n {\n view: \"button\",\n value: L(\"Save\"),\n width: 100,\n css: \"webix_primary\",\n click: async (element, event) => {\n // validate form\n let valid = $$(\"stepform\" + id).validate();\n // get hint we are going to update\n let hint = this.AB.hints((h) => {\n return h.id == id;\n })[0];\n // loop through steps to get values and save\n hint.stepIDs.forEach((step) => {\n if (hint?._steps?.[step]) {\n // validate each step to ensure they are ready to save\n if (\n !$$(\"step_form\" + step).validate({\n disabled: true,\n })\n ) {\n valid = false;\n } else {\n // set values so we can save later\n let values = $$(\"step_form\" + step).getValues();\n hint._steps[step].name = values.name;\n hint._steps[step].text = values.text;\n hint._steps[step].settings.event = values.event;\n hint._steps[step].settings.el = values.el;\n // hint._steps[step].save();\n }\n }\n });\n if (!valid) return false;\n\n var values = $$(\"stepform\" + id).getValues();\n hint.name = values.name;\n hint.description = values.description;\n hint.settings.view = values.view;\n hint.settings.active = values.active;\n // save the steps data next\n // hint.stepIDs.forEach((step) => {\n // if (hint?._steps?.[step]) {\n // hint._steps[step].save();\n // }\n // });\n for (const step of hint.stepIDs) {\n if (hint?._steps?.[step]) {\n await hint._steps[step].save();\n }\n }\n await hint.save();\n $$(\"stepManager\" + id).close();\n this.show();\n },\n },\n {},\n ],\n };\n };\n\n // ui that is at the top of the tutorial manager for the global tutorial settings\n const tutorialSettings = (id) => {\n let currentTutorial = this.AB.hints((h) => {\n return h.id == id;\n })[0];\n let active = currentTutorial?.settings?.active ?? \"1\";\n return {\n view: \"form\",\n id: \"stepform\" + id,\n borderless: true,\n cols: [\n {\n id: \"step_window\",\n rows: [\n {\n view: \"text\",\n label: L(\"Title\"),\n name: \"name\",\n validate: webix.rules.isNotEmpty,\n invalidMessage: L(\"Title is required\"),\n value: currentTutorial.name,\n },\n {\n view: \"textarea\",\n label: L(\"Text\"),\n labelAlign: \"left\",\n height: 100,\n name: \"description\",\n value: currentTutorial?.description || \"\",\n },\n ],\n },\n {\n width: 300,\n rows: [\n {\n cols: [\n {\n view: \"label\",\n label: L(\"Page/Tab\"),\n align: \"left\",\n width: 100,\n },\n // {\n // view: \"button\",\n // icon: \"fa fa-crosshairs\",\n // type: \"icon\",\n // label: L(\"select\"),\n // css: \"focusPageTab webix_primary\",\n // currentTutorialID: id,\n // width: 100,\n // click: () => {\n // $$(\"stepManager\" + currentTutorial.id).hide();\n // document.addEventListener(\n // \"click\",\n // this.handlePageTabClick,\n // false\n // );\n // document.hintId = id;\n // webix.ui(this.pageTabWindow(id)).show();\n // },\n // },\n {\n view: \"combo\",\n name: \"view\",\n value: currentTutorial.settings.view,\n options: {\n view: \"suggest\",\n css: \"wider_popup\",\n body: {\n view: \"list\",\n css: \"wider_popup\",\n data: this.options,\n template: \"#value#\",\n },\n },\n },\n ],\n },\n\n {\n view: \"switch\",\n label: L(\"Active\"),\n labelWidth: 100,\n name: \"active\",\n value: active,\n },\n ],\n },\n ],\n };\n };\n\n // this is the drawer admin that lists all tutorials\n return {\n view: \"window\",\n css: \"tutorialWindow\",\n id: \"tutorial_manager\",\n position: function (state) {\n state.left = state.maxWidth - 350; // fixed values\n state.top = 0;\n state.width = 350; // relative values\n state.height = state.maxHeight;\n },\n on: {\n onShow: () => {},\n },\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n width: 15,\n },\n {\n view: \"label\",\n label: \"Tutorial Manager\",\n autowidth: true,\n },\n {},\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-plus\",\n label: \"Tutorial\",\n width: 95,\n css: \"webix_primary\",\n click: () => {\n webix.ui(newTutorialPopup).show();\n\n $$(\"view_popup_options\").define(\"options\", this.options);\n $$(\"view_popup_options\").define(\n \"value\",\n this.portal.AppState.lastPages[\n this.portal.AppState.lastSelectedApp\n ]\n );\n $$(\"view_popup_options\").refresh();\n },\n },\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n this.hide();\n },\n },\n ],\n },\n body: tutorialManagerBody,\n };\n }\n\n init(portal) {\n this.AB = portal.AB;\n this.portal = portal;\n this.appId = portal.AppState.lastSelectedApp;\n\n this.application = this.AB.applicationByID(this.appId);\n const pages = this.application.pages();\n this.options = this.getViewOptions(pages);\n // only return tutorials that are on current application\n this._hints = this.AB.hints((hint) => {\n if (this.application.hintIDs.indexOf(hint.id) > -1) {\n return true;\n } else {\n return false;\n }\n });\n webix.ui(this.ui());\n }\n\n show() {\n // this gets the latest hints and updates them to local list.\n $$(\"tutorial_manager\").show();\n this._hints = this.AB.hints((hint) => {\n if (this.application.hintIDs.indexOf(hint.id) > -1) {\n return true;\n } else {\n return false;\n }\n });\n $$(\"tutorial_list\").define(\"data\", this._hints);\n $$(\"tutorial_list\").refresh();\n }\n\n hide() {\n $$(\"tutorial_manager\").hide();\n }\n\n // small modal that gives instructions to user when selecting the page or tab to load this tutorial on\n pageTabWindow(hintID) {\n return {\n view: \"window\",\n id: \"pageTabWindow\",\n width: 160,\n height: 160,\n move: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {},\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(\"stepManager\" + hintID).show();\n $$(\"pageTabWindow\").hide();\n\n document.removeEventListener(\n \"contextmenu\",\n this.handleRightClick,\n false\n );\n },\n },\n ],\n },\n position: function (state) {\n state.left = state.maxWidth - state.width;\n state.top = state.maxHeight - state.height;\n },\n body: {\n template:\n \"
    \" +\n L(\"Click the page or tab that will start this tutorial\") +\n \"
    \",\n },\n };\n }\n\n // small modal that gives instructions to users when they are selecting the highlight element\n focusWindow(hintID) {\n return {\n view: \"window\",\n id: \"focusWindow\",\n width: 160,\n height: 160,\n move: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {},\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(\"stepManager\" + hintID).show();\n $$(\"focusWindow\").hide();\n\n document.removeEventListener(\n \"contextmenu\",\n this.handleRightClick,\n false\n );\n document.body.classList.remove(\"findDataCy\");\n },\n },\n ],\n },\n position: function (state) {\n state.left = state.maxWidth - state.width;\n state.top = state.maxHeight - state.height;\n },\n body: {\n template:\n \"
    \" +\n L(\"Right click the element you want to highlight.\") +\n \"
    \",\n },\n };\n }\n\n updateStepsUI(id) {\n const views = $$(\"hint_steps_\" + id).getChildViews();\n let viewsToRemove = [];\n views.forEach((view) => {\n viewsToRemove.push(view.config.id);\n });\n viewsToRemove.forEach((view) => {\n $$(\"hint_steps_\" + id).removeView(view);\n });\n this.steps(id);\n }\n\n addHighlightClass(event) {\n let item = $$(event.currentTarget);\n let formVals = $$(\"step_form\" + item.config.stepId).getValues();\n document.querySelector(formVals?.el).classList.add(\"highlightMe\");\n }\n removeHighlightClass(event) {\n let item = $$(event.currentTarget);\n let formVals = $$(\"step_form\" + item.config.stepId).getValues();\n document.querySelector(formVals?.el).classList.remove(\"highlightMe\");\n }\n\n // build a list of steps that are included in this hint\n steps(id) {\n let hint = this.AB.hints((h) => {\n return h.id == id;\n })[0];\n // if we do not have steps\n if (!hint?.stepIDs?.length) {\n let addStepBelow = {\n id: \"addStepBelow\",\n padding: 20,\n rows: [\n {\n css: \"ab-component-form-rules\",\n rows: [\n {},\n {\n view: \"label\",\n align: \"center\",\n height: 80,\n label: \"
    \",\n },\n {\n view: \"label\",\n align: \"center\",\n label: L(\"Add a step to this tutorial.\"),\n },\n {\n cols: [\n {},\n {\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-plus\",\n label: L(\"Step\"),\n autowidth: true,\n css: \"webix_primary\",\n click: async () => {\n // create an ABStep\n let step = await this.createStep(id);\n // save it to definitions to get id\n await step.save();\n // get the hint we are editing\n let hint = this.AB.hints((h) => {\n return h.id == id;\n })[0];\n // assign the new ABStep id to the ABHint\n if (\n hint?.stepIDs &&\n Array.isArray(hint.stepIDs)\n ) {\n hint.stepIDs.push(step.id);\n } else {\n hint.stepIDs = [step.id];\n }\n // store the ABStep on the ABHint (not stored in defs)\n hint._steps[step.id] = step;\n // remove ui that shows when ABHint does not have steps\n $$(\"hint_steps_\" + hint.id).removeView(\n \"addStepBelow\"\n );\n // add the ui to edit the new step to the ui\n $$(\"hint_steps_\" + hint.id).addView(\n this.stepUI(step, hint)\n );\n },\n },\n {},\n ],\n },\n {},\n ],\n },\n ],\n };\n // add to the ui now that we have it defined\n $$(\"hint_steps_\" + id).addView(addStepBelow);\n } else {\n // if we do have steps\n hint.stepIDs.forEach((step) => {\n $$(\"hint_steps_\" + id).addView(\n this.stepUI(hint._steps[step], hint)\n );\n });\n }\n // set up hover listeners for buttons that help user pick and show the highlight elements\n const focusElements = document.querySelectorAll(\".focusElement\");\n for (let i = 0; i < focusElements.length; i++) {\n focusElements[i].addEventListener(\n \"mouseover\",\n this.addHighlightClass,\n false\n );\n focusElements[i].addEventListener(\n \"mouseout\",\n this.removeHighlightClass,\n false\n );\n }\n }\n\n // UI for each step that will be used to rebuild steps when moved/deleted/loaded\n stepUI(step, hint) {\n // the position of the step that we display in the top left corner of the ui\n let position = $$(\"hint_steps_\" + hint.id).getChildViews().length + 1;\n return {\n view: \"form\",\n id: \"step_form\" + step.id,\n css: \"my\",\n padding: 15,\n borderless: true,\n rows: [\n {\n borderless: true,\n cols: [\n {\n width: 50,\n rows: [\n {\n view: \"label\",\n label: `

    ${position}

    `,\n align: \"center\",\n },\n {\n view: \"icon\",\n class: \"moveStepUp\",\n icon: \"fa fa-caret-up\",\n disabled: position == 1 ? true : false, // do not allow moving up if already at the top position\n align: \"center\",\n click: (id, element) => {\n // move the step up a position\n this.moveStep(step, hint, \"up\");\n },\n },\n {\n view: \"icon\",\n class: \"moveStepDown\",\n icon: \"fa fa-caret-down\",\n disabled:\n hint.stepIDs.length == position ? true : false, // do not let the last item be moved down\n align: \"center\",\n click: (id, element) => {\n // move the step down a position\n this.moveStep(step, hint, \"down\");\n },\n },\n ],\n },\n {\n css: \"ab-component-form-rules\",\n padding: 15,\n cols: [\n {\n minWidth: 300,\n rows: [\n {\n view: \"text\",\n label: L(\"Title\"),\n validate: webix.rules.isNotEmpty,\n invalidMessage: L(\"Title is required\"),\n labelWidth: 100,\n name: \"name\",\n value: step?.name || \"\",\n },\n {\n view: \"textarea\",\n label: L(\"Text\"),\n labelAlign: \"left\",\n labelWidth: 100,\n height: 150,\n name: \"text\",\n value: step?.text || \"\",\n },\n {\n cols: [\n {\n view: \"label\",\n label: L(\"Highlight\"),\n align: \"left\",\n width: 100,\n },\n {\n view: \"button\",\n icon: \"fa fa-crosshairs\",\n type: \"icon\",\n label: L(\"select\"),\n css: \"focusElement webix_primary\",\n stepId: step.id,\n width: 100,\n click: () => {\n // change the ui to support the selecting of the highlight element\n $$(\"stepManager\" + hint.id).hide();\n // adding this class will allow a css rule to highlight any element with data-cy attribute on hover\n document.body.classList.add(\n \"findDataCy\"\n );\n // when the user sees the element hovered can be a highlight element they right click to save it\n document.addEventListener(\n \"contextmenu\",\n this.handleRightClick,\n false\n );\n // store the step and hint ids to use in the handleRightClick() function\n document.stepId = step.id;\n document.hintId = hint.id;\n // show a small window in bottom right hand corner that helps user know what to do\n webix\n .ui(this.focusWindow(hint.id))\n .show();\n },\n },\n {\n view: \"text\",\n name: \"el\",\n value: step.settings.el,\n disabled: true,\n placeholder: L(\n \"Click the 'select' button to pick an element to highlight.\"\n ),\n bottomLabel: L(\n \"Hover over the 'select' button to highlight the chosen element.\"\n ),\n validate: webix.rules.isNotEmpty,\n invalidMessage: L(\n \"Please choose an item to highlight\"\n ),\n },\n ],\n },\n {\n cols: [\n {\n view: \"label\",\n label: L(\"Event\"),\n align: \"left\",\n width: 100,\n },\n {\n view: \"combo\",\n value: step.settings.event,\n name: \"event\",\n options: [\n {\n id: \"click\",\n value: L(\"Click\"),\n },\n {\n id: \"enter\",\n value: L(\"Enter\"),\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n {\n view: \"template\",\n borderless: true,\n template: `
    `,\n width: 15,\n onClick: {\n deleteStep: (ev, id) => {\n // ask user if they want to delete this step\n webix\n .confirm({\n title: L(\"Delete Step\"),\n text: L(\n \"Are you sure you want to delete this step?\"\n ),\n type: \"confirm-error\",\n })\n .then(async (result) => {\n // remove the step from the hint\n hint.stepRemove(step.id);\n await hint.save();\n // rebuild the step ui now that one has been removed\n this.updateStepsUI(hint.id);\n return false; // blocks the default click behavior\n })\n .fail(() => {\n // webix.message(\"Cancel\");\n });\n return false;\n },\n },\n },\n ],\n },\n ],\n };\n }\n\n // this function moves a step up or down a position\n async moveStep(step, hint, direction) {\n let currPosition = hint.stepIDs.indexOf(step.id);\n switch (direction) {\n case \"up\":\n hint.stepIDs.splice(\n currPosition - 1,\n 0,\n hint.stepIDs.splice(currPosition, 1)[0]\n );\n break;\n default:\n hint.stepIDs.splice(\n currPosition + 1,\n 0,\n hint.stepIDs.splice(currPosition, 1)[0]\n );\n }\n await hint.save();\n this.updateStepsUI(hint.id);\n }\n\n // this builds the list of page/tab options that a hint can be added to\n getViewOptions(views) {\n // this so it looks right/indented in a tree view:\n // var tree = new webix.TreeCollection();\n var options = [];\n\n /**\n * @method addOption\n *\n * @param {ABView} page\n * @param {uuid} parentId\n * @param {number} depth\n */\n var addOption = (object, parentId, depth) => {\n // add to tree collection\n if ([\"page\", \"tab\", \"viewcontainer\"].indexOf(object.key) != -1) {\n var indent = \"\";\n for (let i = 0; i < depth; i++) {\n indent += \"\";\n }\n let icon =\n object.icon == \"braille\" ? \"external-link-square\" : object.icon;\n var option = {\n id: object.id,\n value: `${indent} ${object.label}`,\n };\n options.push(option);\n }\n\n var pages = object.pages ? object.pages() : [];\n pages.forEach((page, pageIndex) => {\n addOption(page, object.id, depth + 1);\n });\n\n var views = object.views();\n views.forEach((view, pageIndex) => {\n addOption(view, object.id, depth + 1);\n });\n };\n views.forEach((p, index) => {\n addOption(p, null, 0);\n });\n\n return options;\n }\n\n // This creates a new hint and stores it on the application and view we want to display it on\n async createTutorial(viewID, viewLabel) {\n let hint = this.AB.hintNew({\n name: viewLabel,\n settings: { view: viewID },\n });\n await hint.save();\n if (Array.isArray(this?.application?.hintIDs)) {\n this.application.hintIDs.unshift(hint.id);\n } else {\n this.application.hintIDs = [hint.id];\n }\n this.application.save();\n let hintView = this.application.views((view) => {\n return view.id == viewID;\n })[0];\n hintView.settings.hintID = hint.id;\n hintView.save();\n $$(\"tutorial_list\").add(hint, 0);\n if (this.AB.hints().length) {\n $$(\"tutorial_list\").show();\n $$(\"tutorial_list_noSelection\").hide();\n }\n }\n\n // create a new step on a hint\n async createStep(hintID) {\n let step = this.AB.stepNew(null, hintID);\n return step;\n }\n\n // store the data-cy info on a step after right clicking an element on the page\n handleRightClick(event) {\n function getCy(element) {\n if (element?.dataset?.cy) {\n return element.dataset.cy;\n } else if (element?.parentElement) {\n return getCy(element.parentElement);\n } else {\n webix.alert({\n text: L(\"Sorry, try another element.\"),\n });\n return \"\";\n }\n }\n\n if (document?.stepId) {\n event.preventDefault();\n event.stopPropagation();\n let dataCy = getCy(event.target);\n if (!dataCy) return false;\n $$(\"step_form\" + document.stepId).setValues(\n {\n el: \"[data-cy='\" + dataCy + \"']\",\n },\n true\n );\n }\n $$(\"stepManager\" + document.hintId).show();\n $$(\"focusWindow\").hide();\n\n document.removeEventListener(\"contextmenu\", this.handleRightClick, false);\n document.body.classList.remove(\"findDataCy\");\n delete document.stepId;\n delete document.hintId;\n\n return false;\n }\n\n // handlePageTabClick(event) {\n // event.preventDefault();\n // event.stopPropagation();\n // debugger;\n // // $$(\"stepform\" + document?.hintId).setValues(\n // // {\n // // view: \"[data-cy='\" + dataCy + \"']\",\n // // },\n // // true\n // // );\n\n // $$(\"stepManager\" + document.hintId).show();\n // $$(\"pageTabWindow\").hide();\n\n // document.removeEventListener(\"click\", this.handlePageTabClick, false);\n // delete document.hintId;\n\n // return false;\n // }\n}\n\nexport default new PortalTutorialManager();\n","import ClassUI from \"./ClassUI.js\";\nimport ClassUIPage from \"./ClassUIPage.js\";\n\nimport PortalWorkInbox from \"./portal_work_inbox.js\";\nimport PortalWorkInboxTaskWindow from \"./portal_work_inbox_taskWindow.js\";\nimport PortalWorkUserProfileWindow from \"./portal_work_user_profile_window.js\";\nimport PortalWorkUserSwitcheroo from \"./portal_work_user_switcheroo.js\";\nimport PortalWorkUserQRWindow from \"./portal_work_user_qr_window.js\";\nimport PortalWorkUserMobileQR from \"./portal_work_user_mobile_qr.js\";\nimport PortalWorkTaskUserForm from \"./portal_work_task_user_form.js\";\nimport PortalAccessLevelManager from \"./portal_access_level_manager.js\";\nimport TranslationTool from \"./portal_translation_tool.js\";\nimport TutorialManager from \"./portal_tutorial_manager.js\";\n\nclass PortalWork extends ClassUI {\n constructor() {\n super();\n }\n\n ui() {\n return {\n id: \"portal_work\",\n rows: [\n {\n id: \"portal_work_network_warning\",\n height: 30,\n css: \"portal_work_warning_banner warning_custom_css\",\n hidden: true,\n cols: [\n { width: 5 },\n {\n id: \"portal_work_network_warning_label\",\n view: \"label\",\n align: \"center\",\n },\n {\n id: \"portal_work_network_warning_button\",\n view: \"button\",\n align: \"center\",\n hidden: true,\n width: 100,\n css: \"webix_transparent\",\n },\n { width: 5 },\n ],\n },\n {\n id: \"portal_work_switcheroo_user_switched\",\n height: 30,\n css: \"portal_work_switcheroo_user_switched\",\n hidden: true,\n cols: [\n {\n width: 5,\n },\n {\n id: \"portal_work_switcheroo_user_switched_label\",\n view: \"label\",\n align: \"center\",\n },\n {\n id: \"portal_work_switcheroo_user_switched_loading\",\n view: \"label\",\n hidden: true,\n align: \"center\",\n width: 30,\n label: '',\n },\n {\n view: \"button\",\n value: '
    ',\n align: \"center\",\n width: 30,\n css: \"webix_transparent\",\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(this, \"switcheroo_clear_button\");\n },\n onItemClick: async () => {\n this.busy();\n await PortalWorkUserSwitcheroo.switcherooClear();\n this.ready();\n $$(\"portal_work_switcheroo_user_switched\").hide();\n },\n },\n },\n {\n width: 5,\n },\n ],\n },\n {\n view: \"toolbar\",\n id: \"mainToolbar\",\n // borderless: true,\n css: \"webix_dark mainToolbar\",\n padding: 10,\n cols: [\n {\n id: \"portal_work_menu_sidebar\",\n view: \"button\",\n type: \"icon\",\n width: 50,\n icon: \"fa fa-bars no-margin\",\n click: () => {\n let navSideBar = $$(\"navSidebar\");\n if (navSideBar.isVisible()) {\n navSideBar.hide();\n } else {\n navSideBar.show();\n let sidebarMenu = $$(\"abSidebarMenu\");\n if (sidebarMenu.getSelectedId() == \"\") {\n sidebarMenu.blockEvent();\n const firstID = sidebarMenu.getFirstId();\n sidebarMenu.select(firstID);\n sidebarMenu.unblockEvent();\n }\n }\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {\n view: \"label\",\n autowidth: true,\n id: \"portal_work_menu_title\",\n label: \"AppBuilder\",\n align: \"left\",\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {},\n {\n id: \"portal_work_menu_pages\",\n css: \"appPages\",\n cols: [],\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {},\n {\n id: \"inbox_icon\",\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-envelope no-margin\",\n width: 40,\n // badge: 12,\n click: () => {\n PortalWorkInbox.show();\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {\n id: \"settings_icon\",\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-cog fa-lg no-margin\",\n width: 40,\n hidden: true,\n popup: \"settingsMenu\",\n /* Look at this.refreshSettingsMenu() for menu options and actions */\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n {\n id: \"user_icon\",\n view: \"button\",\n type: \"icon\",\n icon: \"fa fa-user-circle no-margin\",\n width: 40,\n popup: \"userMenu\",\n /* Look at Popup created below for menu options and actions */\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n ],\n },\n {\n cols: [\n {\n id: \"navSidebar\",\n hidden: true,\n autoheight: true,\n borderless: true,\n rows: [\n {\n id: \"abNavSidebarScrollView\",\n view: \"scrollview\",\n scroll: \"y\",\n css: \"darkScrollview\",\n body: {\n rows: [\n {\n view: \"sidebar\",\n id: \"abSidebarMenu\",\n borderless: true,\n css: \"webix_dark mainSidebar\",\n data: [],\n on: {\n onAfterRender() {\n this.data.each((a) => {\n ClassUI.CYPRESS_REF(\n this.getItemNode(a.id),\n a.id\n );\n });\n },\n onAfterSelect: (/* id */) => {\n // this.selectApplication(id);\n },\n onItemClick: (id) => {\n this.selectApplication(id);\n },\n },\n },\n ],\n },\n },\n {\n view: \"template\",\n borderless: true,\n css: \"appDevDesigns\",\n height: 110,\n },\n {\n id: \"portal_work_privacy_policy\",\n view: \"template\",\n template:\n '#label#',\n css: \"policyLink\",\n height: 30,\n hidden: true,\n },\n ],\n },\n {\n id: \"abWorkPages\",\n template: \"No Applications Have Been Loaded.\",\n }, // this is where content goes\n ],\n },\n ],\n };\n }\n\n /** @param {import('../AppBuilder/ABFactory.js').default} AB */\n async init(AB) {\n this.AB = AB;\n\n this.storageKey = \"portal_work_state\";\n\n this.pageContainers = {};\n\n const L = (...params) => {\n return this.label(...params);\n };\n\n const allInits = [];\n\n allInits.push(PortalWorkUserProfileWindow.init(this.AB));\n allInits.push(PortalWorkUserSwitcheroo.init(this.AB));\n PortalWorkTaskUserForm.init(this.AB);\n\n // {hash} { ABViewPage.id : ClassUIPage() }\n // track each of the page containers (instances of ClassUIPage) that\n // are responsible for displaying the proper state of each of our\n // Root Pages.\n\n // Get all our ABApplications and loaded Plugins in allApplications\n const allApplications = (\n this.AB.applications(\n (a) =>\n a.isWebApp &&\n a.isAccessibleForRoles(this.AB.Account.rolesAll() ?? [])\n ) || []\n ).concat(this.AB.plugins().filter((p) => p.pages) || []);\n\n // Build out our Navigation Side Bar Menu with our available\n // ABApplications\n const menu_data = [];\n\n for (let i = 0; i < allApplications.length; i++) {\n // TODO: implement Sorting on these before building UI\n menu_data.push(this.uiSideBarMenuEntry(allApplications[i]));\n }\n\n let { privacyPolicy, relay } = this.AB.Config.siteConfig();\n if (privacyPolicy) {\n $$(\"portal_work_privacy_policy\").setValues({\n label: L(\"Privacy Policy\"),\n link: privacyPolicy,\n });\n $$(\"portal_work_privacy_policy\").show();\n }\n\n $$(\"abSidebarMenu\").define(\"data\", menu_data);\n this.sidebarResize();\n\n PortalWorkUserMobileQR.init(AB);\n\n const userMenuOptions = [\n { id: \"user_profile\", label: L(\"User Profile\"), icon: \"user\" },\n { id: \"user_logout\", label: L(\"Logout\"), icon: \"ban\" },\n ];\n\n // add in any Mobile App QR Codes:\n const allMobile = this.AB.applications((a) => a.isMobile);\n allMobile.forEach((m) => {\n userMenuOptions.splice(1, 0, {\n id: m.id, // \"pwa_app\",\n label: m.label,\n icon: m.icon.replace(\"fa-\", \"\"),\n });\n });\n\n if (this.AB.Account.canSwitcheroo()) {\n userMenuOptions.splice(1, 0, {\n id: \"user_switcheroo\",\n label: L(\"Switcheroo\"),\n icon: \"user-secret\",\n });\n }\n\n if (this.AB.Account.isSwitcherood()) {\n $$(\"portal_work_switcheroo_user_switched_label\").setValue(\n `\n ${L('You are viewing this site as \"{0}\"', [\n this.AB.Account.username(),\n ])}`\n );\n $$(\"portal_work_switcheroo_user_switched\").show();\n }\n /** @type {Object.} */\n this.networkWarnings = {\n /**\n * @typedef {object} NetworkWarning - define the display & behavior of\n * a Network Warning\n * @prop {string} label - warning message to display\n * @prop {number} priority - 1 is the highest prioirity\n * @prop {Function} [click] - click hanlder function\n * @prop {string} [button] - label for the button\n * @prop {string | number} [value] - to replace in button lable\n * @prop {string} [css] - custom css to add to the warning ui\n * @prop {Boolean} [active] - is the warning currently active\n */\n no_network: {\n label: `\n ${L(\"No network detected. Work will not be saved.\")}`,\n priority: 1,\n },\n no_server: {\n label: `\n ${L(\n \"Uh oh...we cannot communicate with our servers, please wait before saving data.\"\n )}`,\n priority: 2,\n click: () => this.AB.Network._connectionCheck(),\n button: ` #value# ${L(\n \"requests\"\n )}`,\n value: 0,\n },\n slow: {\n label: `\n ${L(\"Slow Network Detected! This may affect your experience.\")}`,\n priority: 5,\n click: () => {\n this.networkWarningClear(\"slow\");\n this.networkWarnings.slow.disabled = true;\n },\n button: ` ${L(\n \"dismiss\"\n )}`,\n css: \"background: #c98025\",\n },\n };\n\n if (!navigator.onLine) this.networkWarningDisplay(\"no_network\");\n\n window.addEventListener(\"offline\", () => {\n this.networkWarningDisplay(\"no_network\");\n });\n\n window.addEventListener(\"online\", () => {\n this.networkWarningClear(\"no_network\");\n });\n\n // document.body.addEventListener(\n // \"offline\",\n // function () {\n // debugger;\n // $$(\"portal_work_no_network_detected\").show();\n // },\n // false\n // );\n // document.body.addEventListener(\n // \"online\",\n // function () {\n // debugger;\n // $$(\"portal_work_no_network_detected\").hide();\n // },\n // false\n // );\n\n // Only add the QR Code option if the relay service is enabled\n if (relay) {\n // Insert at userMenuOptions[2] so logout is still last\n userMenuOptions.splice(2, 0, {\n id: \"user_qr\",\n label: L(\"Connect Mobile App\"),\n icon: \"qrcode\",\n });\n }\n\n // This is the User popup menu that opens when you click the user icon in the main nav\n this.AB.Webix.ui({\n view: \"popup\",\n id: \"userMenu\",\n width: 150,\n body: {\n view: \"list\",\n data: userMenuOptions,\n template: \" #label#\",\n autoheight: true,\n select: true,\n on: {\n onItemClick: (id) => {\n switch (id) {\n case \"user_profile\":\n PortalWorkUserProfileWindow.show();\n break;\n case \"user_switcheroo\":\n PortalWorkUserSwitcheroo.show();\n break;\n case \"user_logout\":\n AB.Account.logout();\n break;\n case \"user_qr\":\n PortalWorkUserQRWindow.init(AB);\n PortalWorkUserQRWindow.show();\n break;\n default: {\n // was this one of our Mobile Apps?\n const mobileApp = this.AB.applicationByID(id);\n if (mobileApp) {\n PortalWorkUserMobileQR.load(mobileApp);\n PortalWorkUserMobileQR.show();\n } else {\n const item = userMenuOptions.filter(\n (o) => o.id == id\n )[0];\n this.AB.Webix.message(\n `Not yet implemented
    \n Menu item:${item.label}
    \n Menu ID:${item.id}`\n );\n }\n }\n }\n $$(\"userMenu\").hide();\n },\n\n onAfterRender() {\n this.data.each((a) => {\n ClassUI.CYPRESS_REF(this.getItemNode(a.id), a.id);\n });\n },\n },\n },\n });\n\n // Now Fill out Toolbar and Root Pages:\n //\n // Step 1: prepare the AppState so we can determine which options\n // should be pre selected.\n\n /**\n * @typedef {Object} AppState\n * @property {string} lastSelectedApp ABApplication.id of the last App selected,\n * @property {Object} lastPages a lookup of all the last selected Pages for each Application {hash} { ABApplication.id : ABPage.id }\n */\n\n // 1.1 Check for App & Page secified on the route (query params /?app=...&page=...)\n // Ref: https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams\n const queryParams = new URLSearchParams(window.location.search);\n if (queryParams.has(\"app\") && queryParams.has(\"page\")) {\n const appParam = queryParams.get(\"app\");\n // Check its a real appID to address: https://github.com/CruGlobal/ab_platform_web/security/code-scanning/630\n const app = this.AB.applicationByID(appParam);\n if (!app) {\n console.error(`Trying to Navigate to unknown app ${appParam}`);\n } else {\n this.AppState = {\n lastSelectedApp: app.id,\n lastPages: {},\n };\n this.AppState.lastPages[app.id] = queryParams.get(\"page\");\n }\n }\n\n // 1.2 Load the last app / page from storage\n this.AppState =\n this.AppState ?? (await this.AB.Storage.get(this.storageKey));\n // 1.3 Create a new AppState\n this.AppState = this.AppState ?? {\n lastSelectedApp: null,\n // {string} the ABApplication.id of the last App selected\n\n lastPages: {},\n // {hash} { ABApplication.id : ABPage.id }\n // a lookup of all the last selected Pages for each Application\n };\n\n // set default selected App if not already set\n // just choose the 1st App in the list (must have pages that we have\n // access to)\n if (!this.AppState.lastSelectedApp && menu_data.length)\n for (let i = 0; i < menu_data.length; i++)\n if (\n (\n menu_data[i].abApplication\n .pages()\n .filter((p) => p.getUserAccess?.() > 0) || []\n ).length > 0\n ) {\n this.AppState.lastSelectedApp = menu_data[i].abApplication.id;\n\n break;\n }\n\n //\n // Step 2: figure out the Default Page to be displayed.\n //\n let DefaultPage = null;\n // {ABViewPage}\n // The ABViewPage of the 1st page to display.\n\n // sidebar and NavBar are already built at this point. So we can\n // query them.\n const $sideBar = $$(\"abSidebarMenu\");\n\n if ($sideBar) {\n // search the Menu entries to see which one matches our\n // stored AppState\n let foundMenuEntry = this.sidebarMenuEntryByID(\n this.AppState.lastSelectedApp\n );\n\n if (!foundMenuEntry) {\n // if we couldn't find the entry then our .lastSelectedApp\n // must be referencing an Application we no longer have\n // access to.\n // So just pick the 1st app with pages\n for (let i = 0; i < menu_data.length; i++) {\n if ((menu_data[i].abApplication.pages() || []).length > 0) {\n foundMenuEntry =\n this.sidebarMenuEntryByID(menu_data[i].abApplication.id) ||\n null;\n\n if (foundMenuEntry) break;\n }\n }\n }\n\n if (foundMenuEntry) {\n $sideBar.select(foundMenuEntry.id);\n this.selectApplication(foundMenuEntry.id);\n\n const defaultPageID =\n this.AppState.lastPages[foundMenuEntry.abApplication.id];\n\n DefaultPage = foundMenuEntry.abApplication.pages(\n (p) => p.id === defaultPageID\n )[0];\n\n if (!DefaultPage) {\n // then just pick the first one:\n DefaultPage = foundMenuEntry.abApplication.pages()[0];\n }\n }\n }\n\n //\n // Step 3: Prime the content area with placeholders for ALL\n // Root Pages\n //\n const allPlaceholders = [];\n\n for (let i = 0; i < allApplications.length; i++) {\n const pages = allApplications[i].pages?.() || [];\n\n for (let j = 0; j < pages.length; j++) {\n if (pages[j].getUserAccess?.() === 0) continue;\n\n allPlaceholders.push({\n id: this.pageID(pages[j]),\n template: `Page: ${pages[j].label || pages[j].name}`,\n });\n }\n }\n\n if (allPlaceholders.length > 0)\n this.AB.Webix.ui(\n {\n view: \"multiview\",\n keepViews: true,\n animate: false,\n cells: allPlaceholders,\n },\n $$(\"abWorkPages\")\n );\n\n //\n // Step 4: initialize the DefaultPage\n // when it is finished we can show that page and emit \"ready\" to\n // signal we can transition to the Work Portal\n //\n if (!this.App) {\n // page.component() require a common {ABComponent.App}\n this.App = new this.AB.Class.ABComponent(\n null,\n \"portal_work\",\n this.AB\n ).App;\n }\n\n if (DefaultPage) {\n const container = new ClassUIPage(\n this.pageID(DefaultPage),\n DefaultPage,\n this.App,\n this.AB\n );\n const containerInit = async () => {\n await container.init(this.AB, true);\n this.showPage(DefaultPage);\n };\n\n this.pageContainers[DefaultPage.id] = container;\n allInits.push(containerInit());\n }\n // let pUI = DefaultPage.component(this.App);\n\n // webix.ui(pUI.ui, $$(this.pageID(DefaultPage)));\n // pUI.init();\n // pUI.onShow();\n // this.showPage(DefaultPage);\n\n //\n // Step 5: initialize the remaining Pages\n //\n for (let i = 0; i < allApplications.length; i++) {\n const pages = allApplications[i].pages?.() || [];\n\n for (let j = 0; j < pages.length; j++) {\n if (pages[j].getUserAccess?.() === 0) continue;\n\n if (!DefaultPage || pages[j].id !== DefaultPage.id) {\n const cont = new ClassUIPage(\n this.pageID(pages[j]),\n pages[j],\n this.App,\n this.AB\n );\n\n this.pageContainers[pages[j].id] = cont;\n\n allInits.push(cont.init(this.AB));\n\n // let comp = page.component(commonComp.App);\n // webix.ui(comp.ui, $$(this.pageID(page)));\n // comp.init();\n // comp.onShow();\n }\n }\n }\n\n this.refreshSettingsMenu();\n //\n // Step 6: Initialize the Inbox Items\n //\n PortalWorkInbox.on(\"updated\", () => {\n const count = PortalWorkInbox.count();\n $$(\"inbox_icon\").define({ badge: count ? count : false });\n $$(\"inbox_icon\").refresh();\n });\n\n await PortalWorkInbox.init(this.AB);\n\n //\n // Step 7: As well as the Inbox Task Window\n //\n allInits.push(PortalWorkInboxTaskWindow.init(this.AB));\n\n // Network and Queued operations Alert\n this.AB.Network.on(\"queued\", () => {\n const count = this.AB.Network.queueCount();\n if (count > 0) {\n this.networkWarningDisplay(\"no_server\", count);\n } else {\n this.networkWarningClear(\"no_server\");\n }\n });\n this.AB.Network.on(\"queue.synced\", () => {\n this.networkWarningDisplay(\"no_server\", 0);\n this.networkWarningClear(\"no_server\");\n });\n\n if (this.AB.Network.isNetworkSlow()) this.networkWarningDisplay(\"slow\");\n this.AB.Network.on(\"networkslow\", (isSlow) => {\n isSlow\n ? this.networkWarningDisplay(\"slow\")\n : this.networkWarningClear(\"slow\");\n });\n\n this.emit(\"ready\");\n\n // !!! HACK: Leave this for James to figure out why Menu Title isn't proper\n // size on initial loading.\n setTimeout(() => {\n $$(\"portal_work_menu_title\").resize();\n }, 200);\n\n // Now attempt to flush any pending network operations:\n this.AB.Network._connectionCheck();\n\n // Be sure our UI elements that don't respond to onAfterRender()\n // have their cypress references set:\n [\"portal_work_menu_pages\"].forEach((eid) => {\n ClassUI.CYPRESS_REF($$(eid));\n });\n\n await Promise.all(allInits);\n }\n\n /**\n * Display a network warning banner. Will not update if a higher priority\n * warning is already active, but will save the state in case the active\n * warning is cleared before this one. Can be called without a key to\n * update/clear exisiting warnings.\n * @param {string?} key\n */\n networkWarningDisplay(key, value) {\n if (key) this.networkWarnings[key].active = true;\n if (key && value) this.networkWarnings[key].value = value;\n\n // get the highest priority active warning\n let warning;\n for (const k in this.networkWarnings) {\n const entry = this.networkWarnings[k];\n if (!entry.active || entry.disabled) continue;\n if (!warning || warning.priority > entry.priority) {\n warning = entry;\n }\n }\n if (!warning) {\n // No active warnings so hide the banner\n $$(\"portal_work_network_warning\").hide();\n return;\n }\n $$(\"portal_work_network_warning_label\").setValue(warning.label);\n const button = $$(\"portal_work_network_warning_button\");\n if (warning.click) {\n button.define(\"click\", warning.click);\n const buttonText = (warning.button ?? \"\").replaceAll(\n \"#value#\",\n warning.value\n );\n button.define(\"label\", buttonText);\n button.refresh();\n button.show();\n } else {\n button.hide();\n }\n warning.css\n ? this.AB.Webix.html.addStyle(\n `.warning_custom_css{${warning.css}}`,\n \"warning_custom_css\"\n )\n : this.AB.Webix.html.removeStyle(\"warning_custom_css\");\n $$(\"portal_work_network_warning\").show();\n }\n /**\n * Clear a network warning\n * @param {string} key\n */\n networkWarningClear(key) {\n this.networkWarnings[key].active = false;\n // Call this.networkWarningDisplay() again in case another warning is still active\n this.networkWarningDisplay();\n }\n\n /**\n * pageID()\n * return a commone webix.id for a given ABViewPage\n * @param {ABViewPage || string} page\n * An instance of ABViewPage, OR a string of the ABViewPage.id\n * @return {string}\n */\n pageID(page) {\n return `page_${page.id || page}`;\n }\n\n selectApplication(id) {\n const row = $$(\"abSidebarMenu\").getItem(id);\n\n const pageButtons = [];\n // {array}\n // the webix menu buttons for each Page\n\n let firstPage = true;\n // {bool} firstPage\n // should we choose the 1st page as being the active page?\n\n let activePageID = null;\n // {string}\n // The ABViewPage.id of the active Page for the current Application.\n if (this.AppState.lastSelectedApp != row.abApplication.id) {\n // remember the current Application has been selected\n this.AppState.lastSelectedApp = row.abApplication.id;\n this.saveState();\n // Need to Settings Menu if different for each app\n this.refreshSettingsMenu();\n }\n\n // if the current Application already has an Active State Page marked\n // we don't want the first page:\n activePageID = this.AppState.lastPages[row.abApplication.id];\n if (activePageID) {\n firstPage = false;\n }\n\n // Build a Menu Button for each of the ABApplication Root Pages\n (row.abApplication.pages() || []).forEach((p) => {\n if (p.getUserAccess?.() == 0) return;\n // Decide if current Page button should look selected.\n let active = \"\";\n if (firstPage || p.id == activePageID) {\n active = \"activePage\";\n firstPage = false;\n\n // remember this one\n this.AppState.lastPages[row.abApplication.id] = p.id;\n }\n\n let pbLabel = p.label;\n if (\"function\" === typeof p.label) {\n pbLabel = p.label();\n }\n pageButtons.push({\n view: \"button\",\n css: active,\n type: \"icon\",\n label: pbLabel,\n autowidth: true,\n icon: `fa fa-${p.icon}`,\n abPage: p,\n click: (item) => {\n // when button is clicked, update the selected look\n const pageButton = $$(item);\n\n // Remove any other \"activePage\" entries\n $$(\"portal_work_menu_pages\")\n .queryView(\n {\n css: \"activePage\",\n },\n \"all\"\n )\n .forEach((p) => {\n if (p != pageButton) {\n p.define(\"css\", \"\");\n p.$view.classList.remove(\"activePage\");\n }\n });\n\n // make sure this one is marked\n pageButton.define(\"css\", \"activePage\");\n pageButton.$view.classList.add(\"activePage\");\n\n // now trigger the page to display:\n this.showPage(pageButton.data.abPage);\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, p.id);\n },\n },\n });\n });\n webix.ui(pageButtons, $$(\"portal_work_menu_pages\"));\n\n $$(\"portal_work_menu_title\").setValue(row.value);\n $$(\"portal_work_menu_title\").resize();\n\n // now everything is displayed\n // default initial display to current activePage:\n let selectedPage = null;\n $$(\"portal_work_menu_pages\")\n .queryView(\n {\n css: \"activePage\",\n },\n \"all\"\n )\n .forEach((p) => {\n selectedPage = p;\n });\n this.showPage(selectedPage?.data?.abPage);\n\n // hide the sidebar menu\n const sideBar = $$(\"navSidebar\");\n if (sideBar.isVisible()) {\n sideBar.hide();\n }\n }\n\n /**\n * saveState()\n * trigger a save of our current AppState.\n * NOTE: we delay this so we can catch multiple saves in a short period\n * of time.\n */\n saveState() {\n if (this._saveTimeoutID) {\n clearTimeout(this._saveTimeoutID);\n }\n this._saveTimeoutID = setTimeout(() => {\n this.AB.Storage.set(this.storageKey, this.AppState);\n }, 500);\n }\n\n show() {\n $$(\"portal_work\").show();\n }\n\n showPage(page) {\n // this could be a subpage\n const pageUI = this.pageContainers[page?.id];\n\n if (pageUI) {\n pageUI.show();\n this.AppState.lastPages[page.application.id] = page.id;\n this.saveState();\n }\n }\n\n /**\n * @method sidebarMenuEntryByID()\n * returns the sidebar menu entry that matches the given {menuID}\n * @param {string|uuid} menuID\n * @return {obj}\n */\n sidebarMenuEntryByID(menuID) {\n const $sideBar = $$(\"abSidebarMenu\");\n\n let foundMenuEntry = null;\n\n if ($sideBar) {\n // search the Menu entries to see which one matches our\n // stored AppState\n\n let id = $sideBar.getFirstId();\n while (!foundMenuEntry && id) {\n let entry = $sideBar.getItem(id);\n if (entry.abApplication.id == menuID) {\n foundMenuEntry = entry;\n }\n id = $sideBar.getNextId(id);\n }\n }\n\n return foundMenuEntry;\n }\n\n sidebarResize() {\n const sidebarMenu = $$(\"abSidebarMenu\");\n const sideBarHeight = sidebarMenu.count() * 45 + 1;\n\n sidebarMenu.define(\"height\", sideBarHeight);\n sidebarMenu.resize();\n // $$(\"abNavSidebarScrollView\").resize(true);\n }\n\n /**\n * generate the Webix definition for a menu entry given the ABApplication\n * the menu entry should represent.\n * @param {ABApplication} app\n * @return {obj} Webix.ui definition.\n */\n uiSideBarMenuEntry(app) {\n return {\n id: app.id,\n icon: `fa ${app.icon}`,\n value: app.label || app.name,\n abApplication: app,\n // This is never called:\n // on: {\n // onAfterRender() {\n // debugger;\n // ClassUI.CYPRESS_REF(this, app.id);\n // },\n // },\n };\n }\n\n refreshSettingsMenu() {\n const { uuid, roles } = this.AB.Config.userConfig();\n const application = this.AB.applicationByID(\n this.AppState.lastSelectedApp\n );\n const settingsMenuOptions = [];\n\n if (!application) return $$(\"settings_icon\").hide();\n if (application.isAccessManaged) {\n let isManager = false;\n if (\n application.accessManagers.useAccount == \"1\" &&\n application.accessManagers.account.indexOf(uuid) > -1\n ) {\n isManager = true;\n }\n if (!isManager && application.accessManagers.useRole == \"1\") {\n roles.forEach((role) => {\n if (application.accessManagers.role.indexOf(role.uuid) > -1) {\n isManager = true;\n }\n });\n }\n if (isManager) {\n settingsMenuOptions.push({\n id: \"accessLevel\",\n label: this.label(\"Access Manager\"),\n icon: \"lock\",\n });\n }\n }\n if (application.isTranslationManaged) {\n let isManager = false;\n if (\n application.translationManagers.useAccount == \"1\" &&\n application.translationManagers.account.indexOf(uuid) > -1\n ) {\n isManager = true;\n }\n if (!isManager && application.translationManagers.useRole == \"1\") {\n roles.forEach((role) => {\n if (\n application.translationManagers.role.indexOf(role.uuid) > -1\n ) {\n isManager = true;\n }\n });\n }\n if (isManager) {\n settingsMenuOptions.push({\n id: \"translation\",\n label: this.label(\"Translation Tool\"),\n icon: \"language\",\n });\n }\n }\n if (application.isTutorialManaged) {\n let isManager = false;\n if (\n application.tutorialManagers.useAccount == \"1\" &&\n application.tutorialManagers.account.indexOf(uuid) > -1\n ) {\n isManager = true;\n }\n if (!isManager && application.tutorialManagers.useRole == \"1\") {\n roles.forEach((role) => {\n if (application.tutorialManagers.role.indexOf(role.uuid) > -1) {\n isManager = true;\n }\n });\n }\n if (isManager) {\n settingsMenuOptions.push({\n id: \"tutorial\",\n label: this.label(\"Tutorial Manager\"),\n icon: \"info-circle\",\n });\n }\n }\n\n if (settingsMenuOptions.length < 1) return $$(\"settings_icon\").hide();\n\n $$(\"settings_icon\").show();\n\n webix.ui({\n view: \"popup\",\n id: \"settingsMenu\",\n width: 150,\n body: {\n view: \"list\",\n data: settingsMenuOptions,\n template: \" #label#\",\n autoheight: true,\n select: true,\n on: {\n onItemClick: (id /*, event */) => {\n switch (id) {\n case \"accessLevel\":\n PortalAccessLevelManager.init(this);\n PortalAccessLevelManager.show();\n break;\n case \"translation\":\n TranslationTool.init(this);\n TranslationTool.show();\n break;\n case \"tutorial\":\n TutorialManager.init(this);\n TutorialManager.show();\n break;\n default:\n //eslint-disable-next-line\n const item = settingsMenuOptions.filter(\n (o) => o.id == id\n )[0];\n webix.message(\n `Not yet implemented
    \n Menu item:${item.label}
    \n Menu ID:${item.id}`\n );\n }\n $$(\"settingsMenu\").hide();\n },\n\n onAfterRender() {\n this.data.each((a) => {\n ClassUI.CYPRESS_REF(this.getItemNode(a.id), a.id);\n });\n },\n },\n },\n });\n }\n\n busy() {\n $$(\"portal_work_switcheroo_user_switched_loading\")?.show();\n }\n\n ready() {\n $$(\"portal_work_switcheroo_user_switched_loading\")?.hide();\n }\n}\n\nexport default new PortalWork();\n","import ClassUI from \"./ClassUI.js\";\nimport ClassAccordionEntry from \"./portal_work_inbox_accordion.js\";\nimport PortalWorkInboxTaskWindow from \"./portal_work_inbox_taskWindow.js\";\n\nclass PortalWorkInbox extends ClassUI {\n constructor() {\n super();\n\n this.id = \"portal_work_inbox\";\n // {string}\n // the webix.id of this UI element\n\n this.entries = [];\n // {array}\n // the list of User Forms this user is able to process.\n\n this.processLookupHash = {\n /* ABProcess.id : \"Process Label\" */\n };\n\n this.appLookupHash = {\n /* ABProcess.id : \"ABApplication.id\" */\n };\n\n this.appAccordionLists = {};\n // {hash} { app.id : {accordionItemDefinition} }\n }\n\n ui() {\n var L = (...params) => {\n return this.label(...params);\n };\n\n return {\n id: this.id,\n view: \"window\",\n move: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark inbox_drawer\",\n cols: [\n { width: 7 },\n {\n view: \"label\",\n label: L(\"Inbox\"),\n },\n {\n view: \"button\",\n autowidth: true,\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(this.id).hide();\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n },\n },\n },\n ],\n },\n position: function (state) {\n state.left = state.maxWidth - 350; // fixed values\n state.top = 0;\n state.width = 350; // relative values\n state.height = state.maxHeight;\n },\n body: {\n cells: [\n {\n id: \"inboxItems\",\n view: \"scrollview\",\n scroll: \"y\",\n body: {\n view: \"accordion\",\n id: \"inbox_accordion\",\n css: {\n background: \"#dadee0 !important\",\n },\n multi: true,\n rows: [],\n },\n },\n {\n id: \"emptyInbox\",\n view: \"layout\",\n hidden: true,\n css: {\n background: \"#dadee0 !important\",\n },\n rows: [\n {},\n {\n view: \"label\",\n align: \"center\",\n height: 200,\n label: \"
    \",\n },\n {\n view: \"label\",\n align: \"center\",\n label: L(\"No tasks...you're all caught up.\"),\n },\n {},\n ],\n },\n ],\n },\n };\n }\n\n init(AB) {\n this.AB = AB;\n\n // Load the { items, meta } data structure before continuing with\n // the rest of the init process.\n this.AB.Network.get({ url: \"/config/inbox\" }).then((inboxConfig) => {\n this.AB.Config.configInbox(inboxConfig);\n\n this.initDelayed(AB);\n });\n }\n\n initDelayed(AB) {\n webix.ui(this.ui());\n\n this.allAppAccordions = {};\n // {hash} { ABApplication.id : ClassAccordionEntry }\n // A lookup of all our ClassAccordionEntry(s) by their app.id\n\n //\n // Prepare our Hashes:\n //\n this.lang = this.AB.Account.language();\n (this.AB.Config.inboxMetaConfig() || []).forEach((app) => {\n this.createAccordian(app);\n });\n\n this.entries = this.AB.Config.inboxConfig() || [];\n\n this.entries.forEach((i) => this.addItem(i));\n\n var allInits = [];\n\n for (var index in this.appAccordionLists) {\n const processes = this.getProcessList(index);\n\n const accordion = this.allAppAccordions[index]\n ? this.allAppAccordions[index].unitList()\n : null;\n if (accordion) {\n const init = async () => {\n await this.allAppAccordions[index].init(this.AB);\n accordion.parse(processes);\n accordion.show();\n };\n allInits.push(init());\n } else {\n this.AB.notify.developer(\n new Error(\n `could not find an inbox-accordion for index[${index}]`\n ),\n {\n context: \"portal_work_inbox:init(): config error\",\n inboxMeta: this.AB.Config.inboxMetaConfig(),\n inbox: this.entries,\n }\n );\n }\n }\n\n return Promise.all(allInits).then(() => {\n this.emit(\"updated\");\n\n this.AB.on(\"ab.inbox.create\", async (item) => {\n const alreadyThere = this.entries.find((e) => e.uuid == item.uuid);\n if (!alreadyThere) {\n this.entries.push(item);\n // If we can't find the app's accordion in the list then add it\n const createNew = !this.appLookupHash[item.definition];\n if (createNew) {\n const [app] = await this.AB.Network.post({\n url: \"/process/inbox/meta\",\n data: { ids: [item.definition] },\n });\n this.createAccordian(app);\n }\n const appId = this.appLookupHash[item.definition];\n const accordion = this.allAppAccordions[appId];\n this.addItem(item);\n\n if (createNew) await accordion.init(this.AB);\n\n const unitList = accordion.unitList();\n unitList.parse(this.appAccordionLists[appId][item.definition]);\n unitList.show();\n unitList.refresh();\n\n accordion.show();\n }\n this.emit(\"updated\");\n });\n\n this.AB.on(\"ab.inbox.update\", (item) => {\n const appId = this.appLookupHash[item.definition];\n const accordion = this.allAppAccordions[appId];\n\n accordion.AB.Network.emit(\"inbox.update\", {\n uuid: item.uuid,\n unitID: item.definition,\n });\n });\n\n // Now Register for RT Updates to our Inbox\n this.AB.Network.post(\n {\n url: `/process/inbox/register`,\n },\n {\n key: \"inbox.register\",\n context: {},\n }\n );\n });\n }\n\n createAccordian(app) {\n if (!app) return;\n\n // convert config info with current language labels\n this.translate(app, this.lang);\n\n const appAccordion = new ClassAccordionEntry(app);\n $$(\"inbox_accordion\").addView(appAccordion.ui());\n this.allAppAccordions[app.id] = appAccordion;\n appAccordion.on(\"showTasks\", (...params) => {\n // showTasks\n // indicates when the user has selected a group of Accordian Tasks\n // to process.\n PortalWorkInboxTaskWindow.showTasks(...params);\n });\n\n appAccordion.on(\"item.processed\", (uuid) => {\n // item.processed\n // indicates when the specified form has been updated on the server.\n PortalWorkInboxTaskWindow.clearTask(uuid);\n this.entries = this.entries.filter((e) => e.uuid != uuid);\n if (this.entries.length == 0) {\n $$(\"emptyInbox\").show();\n }\n this.emit(\"updated\");\n });\n\n (app.processes || []).forEach((p) => {\n this.translate(p, this.lang);\n this.processLookupHash[p.id] = p.label;\n this.appLookupHash[p.id] = app.id;\n });\n\n return appAccordion;\n }\n\n getProcessList(index) {\n const processes = [];\n for (const process in this.appAccordionLists[index]) {\n processes.push(this.appAccordionLists[index][process]);\n }\n return processes;\n }\n\n addItem(item) {\n // item {obj} inbox configuration item\n // .definition {uuid} the process.id that generated this form\n // .name {string} the Name of this form\n //\n item.uniteLabel =\n \"{\" + item.definition + \"}\" + this.processLookupHash[item.definition];\n // create our own .uniteLabel\n // this is used within the accordion.unitlist to group the data.\n\n // find the application.id for this form\n var appId = this.appLookupHash[item.definition];\n\n // make sure we have an appAccordionLists[appID] entry\n if (!this.appAccordionLists[appId]) this.appAccordionLists[appId] = {};\n if (!this.appAccordionLists[appId][item.definition]) {\n this.appAccordionLists[appId][item.definition] = {\n id: item.definition,\n name: item.name,\n uniteLabel: item.uniteLabel,\n items: [],\n };\n }\n\n // add this as one of our items\n this.appAccordionLists[appId][item.definition].items.push(item);\n }\n\n show() {\n if (this.entries.length == 0) {\n $$(\"emptyInbox\").show();\n } else {\n $$(\"inboxItems\").show();\n }\n $$(this.id).show();\n\n for (const appId in this.allAppAccordions) {\n this.allAppAccordions[appId]?.show();\n }\n }\n\n /**\n * @method translate()\n * given an object with a .translations property, we will fill out\n * the translations for the given language.\n * @param {obj} obj\n * @param {string} lang\n * the language_code of the translations to use.\n */\n translate(obj, lang) {\n if (obj?.translations) {\n var entry = obj.translations.find((t) => t.language_code == lang);\n if (!entry) {\n entry = obj.translations[0];\n }\n if (entry) {\n Object.keys(entry).forEach((k) => {\n if (k != \"language_code\") {\n obj[k] = entry[k];\n }\n });\n }\n }\n }\n\n count() {\n return this.entries.length;\n }\n}\n\nexport default new PortalWorkInbox();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalWorkInboxAccordion extends ClassUI {\n constructor(app) {\n super();\n\n this.app = app;\n this.id = `inbox-accordion-app-holder-${this.app.id}`;\n this.idUnitList = `inbox-accordion-app-${this.app.id}`;\n }\n\n ui() {\n const self = this;\n // for .click() handler below:\n\n return {\n header: this.app.label,\n id: this.id,\n view: \"accordionitem\",\n collapsed: true,\n css: \"stayCollapsed\",\n hidden: true,\n body: {\n view: \"unitlist\",\n id: this.idUnitList,\n uniteBy: \"#uniteLabel#\",\n autoheight: true,\n css: \"inbox_unitlist\",\n type: {\n templateHeader: function (value) {\n return (\n ' ' +\n value.replace(/{(.*?)}/, \"\")\n );\n },\n headerHeight: 35,\n },\n template: function (obj) {\n return (\n obj.name +\n \" \" +\n obj.items.length +\n \"\"\n );\n },\n select: true,\n data: [],\n click: function (id /* , ev */) {\n const list = this;\n // const parent = this.getParentView();\n const selectedItem = this.getItem(id);\n\n const cells = [];\n // {array}\n // the webix defs for the Form.io forms for this selection.\n\n // const number = 1;\n selectedItem.items.forEach(function (task) {\n if (task.data?.url) {\n cells.push({\n id: \"task-holder-\" + task.uuid,\n unitlist: list,\n view: \"layout\",\n padding: 20,\n rows: [\n {\n id: task.uuid,\n view: \"iframe\",\n src: task.data.url,\n },\n ],\n });\n } else\n cells.push({\n id: \"task-holder-\" + task.uuid,\n unitlist: list,\n view: \"layout\",\n padding: 20,\n rows: [\n {\n id: task.uuid,\n view: \"formiopreview\",\n formComponents: task.ui,\n formData: task.data,\n onButton: function (value) {\n self.processItem(id, task, value);\n },\n },\n ],\n });\n });\n\n self.emit(\"showTasks\", /*list, */ selectedItem.name, cells);\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this);\n this.data.each((a) => {\n ClassUI.CYPRESS_REF(\n this.getItemNode(a.id),\n `${self.id}_${a.id}`\n );\n });\n },\n },\n },\n // TODO: This never gets called!\n // on: {\n // onAfterRender() {\n // ClassUI.CYPRESS_REF(this);\n // },\n // },\n };\n }\n\n init(AB) {\n // prevent multiple .init() calls\n if (!this.AB) {\n this.AB = AB;\n\n this.AB.Network.on(\"inbox.update\", (context, err /* , response */) => {\n if (err && err.message) {\n webix.message(err.message);\n this.AB.notify.developer(err, {\n context:\n \"portal_work_inbox_accordion:Network[inbox.update]: error updating Inbox item\",\n info: context,\n });\n return;\n }\n\n const list = $$(this.idUnitList);\n const selectedItem = list.getItem(context.unitID);\n\n // clear out processed item from our accordion\n // prune the item from the group of similar processes in the unit list\n if (selectedItem) {\n const parent = list.getParentView();\n\n selectedItem.items = selectedItem.items.filter(function (i) {\n return i.uuid != context.uuid;\n });\n\n // refresh the unit list so we can get an update badge count\n list.refresh();\n if (selectedItem.items.length == 0) {\n // remove the item from the unit list\n list.remove(list.getSelectedId());\n // if that was the last item in the unit list remove the accordion\n if (list.count() == 0) {\n parent.hide();\n }\n }\n }\n\n this.emit(\"item.processed\", context.uuid);\n });\n }\n\n return Promise.resolve();\n }\n\n unitList() {\n return $$(this.idUnitList);\n }\n\n /**\n * @method processItem()\n * submit the current task's response back to the server.\n * @param {ABProcessForm} task\n * the current form that is being responded to.\n * @param {string} value\n * the value of the Form button returned.\n */\n processItem(unitID, task, value) {\n this.AB.Network.put(\n {\n url: `/process/inbox/${task.uuid}`,\n data: { response: value },\n },\n {\n key: \"inbox.update\",\n context: { uuid: task.uuid, unitID },\n }\n );\n\n return;\n }\n\n show() {\n $$(this.id).show();\n $$(this.id).expand();\n this.initFormIOPreview();\n }\n\n /**\n * Ensure the formio custom webix component is loaded and ready to\n * use.\n */\n initFormIOPreview() {\n this.AB.custom.formiopreview.init();\n }\n}\n\nexport default PortalWorkInboxAccordion;\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalWorkInboxTaskwindow extends ClassUI {\n constructor() {\n super();\n this.id = \"portal_work_inbox_taskwindow\";\n this.idTaskMultiview = \"taskMultiview\";\n this.idTaskTitle = \"taskTitle\";\n this.idTaskPager = \"taskPager\";\n }\n\n ui() {\n var L = (...params) => {\n return this.label(...params);\n };\n return {\n id: this.id,\n view: \"window\",\n position: function (state) {\n state.left = state.maxWidth / 2 - 800 / 2; // fixed values\n state.top = state.maxHeight / 2 - (state.maxHeight * 0.7) / 2;\n state.width = 800; // relative values\n state.height = state.maxHeight * 0.7;\n },\n modal: true,\n move: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark team-form-header\",\n cols: [\n { width: 17 },\n {\n id: this.idTaskTitle,\n view: \"label\",\n label: L(\"Your Tasks\"),\n },\n {\n view: \"button\",\n autowidth: true,\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(this.id).hide();\n // we don't want the list to look like it has still selected the item\n $$(this.idTaskMultiview)\n .getChildViews()[0]\n .config.unitlist.unselectAll();\n // reset the pager so we don't get errors when we open it next\n $$(this.idTaskPager).select(0);\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, \"inbox_taskwindow_close\");\n },\n },\n },\n ],\n },\n body: {\n rows: [\n {\n view: \"scrollview\",\n scroll: \"xy\",\n body: {\n id: this.idTaskMultiview,\n cells: [\n {\n view: \"layout\",\n padding: 20,\n rows: [\n {\n id: \"emptyTasks\",\n template: L(\"No more tasks...good job!\"),\n },\n ],\n },\n ],\n },\n },\n {\n view: \"toolbar\",\n css: \"inboxpager\",\n cols: [\n {\n id: this.idTaskPager,\n view: \"pager\",\n size: 1,\n group: 3,\n height: 45,\n master: false,\n template:\n '
    {common.first()} {common.prev()} {common.pages()} {common.next()} {common.last()}
    ',\n on: {\n onAfterRender() {\n // debugger;\n ClassUI.CYPRESS_REF(this);\n // this.data.each((a) => {\n // ClassUI.CYPRESS_REF(\n // this.getItemNode(a.id),\n // `${self.id}_${a.id}`\n // );\n // });\n },\n onBeforePageChange: (new_page /*, old_page */) => {\n var views = $$(\n this.idTaskMultiview\n ).getChildViews();\n views[parseInt(new_page)].show();\n },\n },\n },\n ],\n },\n ],\n },\n };\n }\n\n init(AB) {\n this.AB = AB;\n webix.ui(this.ui());\n\n return Promise.resolve();\n }\n\n clearTask(uuid) {\n // find out how many pages are in this multiview\n var views = $$(this.idTaskMultiview).getChildViews();\n // if there is more than one page we need to find out what the next page should be\n if (views.length > 1) {\n var taskHolder = $$(\"task-holder-\" + uuid);\n if (taskHolder) {\n // find out if we are on the last page\n if (\n $$(this.idTaskMultiview).index(taskHolder) + 1 ==\n views.length\n ) {\n // if we are on the last page we will go back to the previous page\n $$(this.idTaskMultiview).setValue(\n views[$$(this.idTaskMultiview).index(taskHolder) - 1].config\n .id\n );\n } else {\n // if we are not on the last page we will go to the next page\n $$(this.idTaskMultiview).setValue(\n views[$$(this.idTaskMultiview).index(taskHolder) + 1].config\n .id\n );\n }\n // once we move off of the page we can remove it\n $$(this.idTaskMultiview).removeView(\n views[$$(this.idTaskMultiview).index(taskHolder)]\n );\n }\n\n // // prune the item from the group of similar processes in the unit list\n // if (this.selectedItem) {\n // this.selectedItem.items = this.selectedItem.items.filter(function (\n // i\n // ) {\n // return i.uuid != uuid;\n // });\n // }\n // // refresh the unit list so we can get an update badge count\n // this.list.refresh();\n\n // now we update the pager\n // block events because we don't want it telling the multiview to change pages after we set the new value\n $$(this.idTaskPager).blockEvent();\n // set the page to the first while we rebuild the pager (or it will throw an error)\n $$(this.idTaskPager).select(0);\n // set the current number of pages to the number of views in the multiview\n $$(this.idTaskPager).define(\n \"count\",\n $$(this.idTaskMultiview).getChildViews().length\n );\n $$(this.idTaskPager).refresh();\n // set the page to the correct number because it probably changed when we removed a view above\n $$(this.idTaskPager).select(\n $$(this.idTaskMultiview).index(\n $$(this.idTaskMultiview).getActiveId()\n )\n );\n $$(this.idTaskPager).unblockEvent();\n } else {\n // no more tasks hide the modal\n $$(this.id).hide();\n // // remove the item from the unit list\n // this.list.remove(this.list.getSelectedId());\n // // if that was the last item in the unit list remove the accordion\n // if (this.list.count() == 0) {\n // parent.hide();\n // }\n }\n }\n\n hide() {\n $$(this.id).hide();\n }\n\n show() {\n $$(this.id).show();\n }\n\n showTasks(/* unitList, */ selectedItemName, cells) {\n // this.list = unitList;\n // this.selectedItem = selectedItem;\n webix.ui(\n {\n id: this.idTaskMultiview,\n cells: cells,\n },\n $$(this.idTaskMultiview)\n );\n\n $$(this.idTaskTitle).define(\"label\", selectedItemName);\n $$(this.idTaskPager).define(\"count\", cells.length);\n $$(this.idTaskPager).refresh();\n $$(this.id).show();\n }\n}\n\nexport default new PortalWorkInboxTaskwindow();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalWorkTaskUserForm extends ClassUI {\n constructor() {\n super(\"portal_work_task_user_form\", {\n formIO: \"\",\n });\n }\n\n ui() {\n const ids = this.ids;\n\n return {\n id: ids.component,\n view: \"window\",\n height: 500,\n width: 600,\n position: \"center\",\n modal: true,\n move: true,\n resize: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n {\n css: { cursor: \"move\" },\n },\n // {\n // view: \"label\",\n // label: this.label(\"\"),\n // autowidth: true,\n // },\n // {},\n {\n view: \"button\",\n width: 35,\n css: \"webix_transparent\",\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n click: () => {\n this.hide();\n },\n },\n ],\n },\n body: {\n view: \"layout\",\n padding: 10,\n rows: [this.uiFormIO()],\n },\n };\n }\n\n uiFormIO(\n processId,\n taskId,\n instanceId,\n formComponents = { components: [] },\n formData\n ) {\n const ids = this.ids;\n const _this = this;\n\n return {\n id: ids.formIO,\n view: \"formiopreview\",\n processId,\n taskId,\n instanceId,\n formComponents: formComponents,\n formData,\n onButton: function () {\n _this.submitData(this.processId, this.taskId, this.instanceId);\n },\n };\n }\n\n refreshFormIO(\n processId,\n taskId,\n instanceId,\n formComponents = { components: [] },\n formData\n ) {\n const ids = this.ids;\n const formIoDef = this.uiFormIO(\n processId,\n taskId,\n instanceId,\n formComponents,\n formData\n );\n\n this.AB.Webix.ui(formIoDef, $$(ids.formIO));\n }\n\n init(AB) {\n const ui = this.ui();\n\n this.AB = AB;\n this.AB.custom.formiopreview.init();\n this.AB.Webix.ui(ui);\n this.AB.on(\"ab.task.userform\", (data) => {\n this.refreshFormIO(\n data.processId,\n data.taskId,\n data.instanceId,\n data.formio,\n data.formData\n );\n this.show();\n });\n }\n\n show() {\n const $popup = $$(this.ids.component);\n try {\n $popup?.show();\n } catch {\n // Catch the error i.render is not function.\n }\n }\n\n hide() {\n const $popup = $$(this.ids.component);\n $popup?.hide();\n }\n\n submitData(processID, taskID, instanceID) {\n const ids = this.ids;\n const values = $$(ids.formIO)?._formio?.instance?.data ?? null;\n if (!values) return;\n\n this.AB.Network.post({\n url: `/process/userform/${processID}/${taskID}`,\n data: {\n instanceID,\n values,\n },\n });\n\n this.hide();\n }\n}\n\nexport default new PortalWorkTaskUserForm();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalWorkUserMobileQR extends ClassUI {\n constructor() {\n super(\"portal_work_user_qr_window\", {\n // taskMultiview:\"\",\n description: \"\",\n instructions: \"\",\n title: \"\",\n qrcode: \"\",\n taskPager: \"\",\n });\n }\n\n ui() {\n var L = (...params) => {\n return this.label(...params);\n };\n const ids = this.ids;\n return {\n id: ids.component,\n view: \"window\",\n position: function (state) {\n state.left = state.maxWidth / 2 - 600 / 2; // fixed values\n state.top = state.maxHeight / 2 - (state.maxHeight * 0.7) / 2;\n state.width = 500; // relative values\n state.height = 400;\n },\n modal: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n { width: 17 },\n {\n id: ids.title,\n view: \"label\",\n label: L(\"Connect Mobile App\"),\n },\n {\n view: \"button\",\n type: \"icon\",\n css: \"webix_transparent\",\n width: 40,\n icon: \"fa fa-repeat\",\n click: () => {\n $$(\"qr-code-image\").refresh();\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, \"qr_image_reload\");\n },\n },\n },\n {\n view: \"button\",\n type: \"icon\",\n css: \"webix_transparent\",\n width: 40,\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(ids.component).hide();\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, \"qr_window_close\");\n },\n },\n },\n ],\n },\n body: {\n css: { \"text-align\": \"center\" },\n rows: [\n { height: 10 },\n {\n id: ids.description,\n borderless: true,\n template: `The App's Description should go here.`,\n },\n {\n id: ids.instructions,\n borderless: true,\n template: `${L(\n \"Use your phone's camera app to scan this QR code, and it will open a webpage to the {0} mobile app. You only need to scan the code for the first time.\"\n )}`,\n },\n {\n id: ids.qrcode,\n height: 175,\n borderless: true,\n // autoheight: true,\n autowidth: true,\n template:\n \"\",\n },\n\n {},\n // {\n // borderless: true,\n // template: `
    ${L(\n // \"This code can only be used once. It will expire after 7 days.\"\n // )}
    `,\n // },\n ],\n },\n };\n }\n\n init(AB) {\n this.AB = AB;\n webix.ui(this.ui());\n\n return Promise.resolve();\n }\n\n load(App) {\n var L = (...params) => {\n return this.label(...params);\n };\n\n // change Title\n let $title = $$(this.ids.title);\n $title.define(\"label\", App.label);\n $title.refresh();\n\n // Change Description\n let $desc = $$(this.ids.description);\n $desc.define(\n \"template\",\n `${App.description}`\n );\n $desc.refresh();\n\n let $instr = $$(this.ids.instructions);\n $instr.define(\n \"template\",\n `${L(\n \"Use your phone's camera app to scan this QR code, and it will open a webpage to the {0} mobile app. You only need to scan the code for the first time.\",\n [App.label]\n )}`\n );\n\n // Change QR Image\n let $qrcode = $$(this.ids.qrcode);\n $qrcode.define(\n \"template\",\n ``\n );\n $qrcode.refresh();\n\n $$(this.ids.component)?.refresh?.();\n }\n\n hide() {\n $$(this.ids.component).hide();\n }\n\n show() {\n $$(this.ids.component).show();\n }\n}\n\nexport default new PortalWorkUserMobileQR();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalWorkUserProfileWindow extends ClassUI {\n constructor() {\n super(\"portal_work_user_profile_window\", {\n imageUser: \"\",\n uploaderImage: \"\",\n formUserInfo: \"\",\n\n dataEmail: \"\",\n editModeEmail: \"\",\n buttonEditModeEmail: \"\",\n editModeButtonsEmail: \"\",\n\n dataLanguage: \"\",\n editModeLanguage: \"\",\n buttonEditModeLanguage: \"\",\n editModeButtonsLanguage: \"\",\n\n formNewPassword: \"\",\n fieldNewPassword: \"\",\n systemNotification: \"\",\n advanceOptions: \"\",\n });\n }\n\n ui() {\n const ids = this.ids;\n const L = (...params) => {\n return this.label(...params);\n };\n\n // [fix] preventing console 404 errors when user doesn't have an Account Image:\n let acctImageID = this.AB.Account.imageID();\n let imgTemplate = ``;\n let imgErrorDiv = `
    `;\n\n if (acctImageID) {\n imgTemplate = `${imgTemplate}${imgErrorDiv}`; // show both in case value is invalid\n } else {\n imgTemplate = imgErrorDiv.replace(\"none;\", \"block;\"); // show the Div\n }\n\n return {\n id: ids.component,\n view: \"window\",\n position: \"center\",\n modal: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n { width: 7 },\n {\n view: \"label\",\n label: L(\"User Profile\"),\n },\n {\n view: \"button\",\n autowidth: true,\n type: \"icon\",\n icon: \"nomargin fa fa-times\",\n on: {\n onItemClick() {\n $$(ids.component).hide();\n },\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, \"user-profile-close\");\n },\n },\n },\n ],\n },\n // body: {\n // view: \"scrollview\",\n // minHeight: 455,\n body: {\n view: \"layout\",\n width: 460,\n rows: [\n {\n rows: [\n {\n id: ids.imageUser,\n view: \"template\",\n autoheight: true,\n borderless: true,\n css: {\n background: \"#222f3e\",\n },\n // width: 160,\n template: imgTemplate,\n },\n {\n css: {\n position: \"absolute\",\n top: \"185px\",\n },\n cols: [\n {},\n {\n id: ids.uploaderImage,\n view: \"uploader\",\n type: \"icon\",\n width: 34,\n height: 32,\n zIndex: 999,\n icon: \"fa fa-upload\",\n algin: \"center\",\n inputName: \"file\",\n apiOnly: true,\n multiple: false,\n accept:\n \"image/png, image/gif, image/jpeg, image/bmp\",\n // Image field\n upload: `/file/upload/${\n this.AB.objectUser().id\n }/6383ce19-b344-44ee-87e6-decced7361f8/1`,\n on: {\n // when upload is complete:\n onFileUpload: async (item, response) => {\n const imageID = response.data.uuid;\n\n const $uploaderImage = $$(\n ids.uploaderImage\n );\n const $imageUser = $$(ids.imageUser);\n\n $uploaderImage.disable();\n\n // await this.AB.Network.put({\n // url: `/app_builder/model/${\n // this.AB.objectUser().id\n // }/${this.AB.Account.uuid()}`,\n // data: {\n // image_id: response.data.uuid,\n // },\n // });\n await this.AB.objectUser()\n .model()\n .update(this.AB.Account.uuid(), {\n image_id: response.data.uuid,\n });\n\n this.AB.Account._config.image_id = imageID;\n\n $imageUser.setHTML(\n `
    `\n );\n $uploaderImage.enable();\n },\n\n // if an error was returned\n onFileUploadError: (item, response) => {\n const error = new Error(response);\n\n const $uploaderImage = $$(\n ids.uploaderImage\n );\n\n $uploaderImage.enable();\n\n this.AB.notify.developer(error, {\n context: \"Error uploading file\",\n });\n webix.alert(error);\n },\n },\n },\n {},\n ],\n },\n {\n id: ids.formUserInfo,\n view: \"form\",\n width: 460,\n height: 160,\n borderless: true,\n css: {\n position: \"relative\",\n top: \"15px\",\n },\n elements: [\n {\n css: {\n \"border-bottom\": \"1px solid #dee2e6\",\n \"margin-top\": \"0 !important\",\n },\n cols: [\n {\n view: \"label\",\n width: 160,\n // align: \"right\",\n label: L(\"Tenant\"),\n },\n {\n view: \"label\",\n name: \"tenant\",\n value: \"\",\n css: \"formText\",\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(\n this,\n \"user_profile_tenant\"\n );\n },\n },\n },\n ],\n },\n {\n css: {\n \"border-bottom\": \"1px solid #dee2e6\",\n \"margin-top\": \"0 !important\",\n },\n cols: [\n {\n view: \"label\",\n width: 160,\n // align: \"right\",\n label: L(\"Username\"),\n },\n {\n view: \"label\",\n name: \"username\",\n value: \"\",\n css: \"formText\",\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(\n this,\n \"user_profile_username\"\n );\n },\n },\n },\n ],\n },\n {\n css: {\n \"border-bottom\": \"1px solid #dee2e6\",\n \"margin-top\": \"0 !important\",\n },\n cols: [\n {\n view: \"label\",\n width: 160,\n // align: \"right\",\n label: L(\"Email\"),\n },\n {\n id: ids.dataEmail,\n view: \"label\",\n name: \"email\",\n value: \"\",\n css: \"formText\",\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(\n this,\n \"user_profile_email\"\n );\n },\n },\n },\n {\n id: ids.editModeEmail,\n view: \"text\",\n hidden: true,\n value: \"\",\n },\n {\n id: ids.buttonEditModeEmail,\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-pencil\",\n width: 40,\n inputWidth: 40,\n on: {\n onItemClick: () => {\n const $dataEmail = $$(ids.dataEmail);\n const $editModeEmail = $$(\n ids.editModeEmail\n );\n const $buttonEditModeEmail = $$(\n ids.buttonEditModeEmail\n );\n const $editModeButtonsEmail = $$(\n ids.editModeButtonsEmail\n );\n\n $editModeEmail.setValue(\n this.AB.Account.email()\n );\n\n $dataEmail.hide();\n $buttonEditModeEmail.hide();\n\n $editModeEmail.show();\n $editModeButtonsEmail.show();\n },\n },\n },\n {\n id: ids.editModeButtonsEmail,\n hidden: true,\n cols: [\n {\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-close\",\n width: 40,\n inputWidth: 40,\n css: \"webix_danger\",\n on: {\n onItemClick: () => {\n const $dataEmail = $$(\n ids.dataEmail\n );\n const $editModeEmail = $$(\n ids.editModeEmail\n );\n const $buttonEditModeEmail = $$(\n ids.buttonEditModeEmail\n );\n const $editModeButtonsEmail =\n $$(ids.editModeButtonsEmail);\n\n $editModeEmail.hide();\n $editModeButtonsEmail.hide();\n\n $dataEmail.show();\n $buttonEditModeEmail.show();\n },\n },\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-check\",\n width: 40,\n inputWidth: 40,\n css: \"webix_primary\",\n on: {\n onItemClick: async () => {\n const $dataEmail = $$(\n ids.dataEmail\n );\n const $editModeEmail = $$(\n ids.editModeEmail\n );\n const $buttonEditModeEmail = $$(\n ids.buttonEditModeEmail\n );\n const $editModeButtonsEmail =\n $$(ids.editModeButtonsEmail);\n\n $editModeEmail.hide();\n $editModeButtonsEmail.hide();\n\n $dataEmail.show();\n $buttonEditModeEmail.show();\n\n try {\n const email =\n $editModeEmail.getValue();\n\n $buttonEditModeEmail.disable();\n\n // await this.AB.Network.put({\n // url: `/app_builder/model/${\n // this.AB.objectUser().id\n // }/${this.AB.Account.uuid()}`,\n // data: {\n // email,\n // },\n // });\n await this.AB.objectUser()\n .model()\n .update(\n this.AB.Account.uuid(),\n { email }\n );\n\n this.AB.Account._config.email =\n email;\n } catch (error) {\n this.AB.notify.developer(\n error,\n {\n context:\n \"error updating user profile email\",\n }\n );\n } finally {\n $dataEmail.setValue(\n this.AB.Account.email()\n );\n $buttonEditModeEmail.enable();\n }\n },\n },\n },\n ],\n },\n ],\n },\n {\n css: {\n \"margin-top\": \"0 !important\",\n },\n cols: [\n {\n view: \"label\",\n width: 160,\n // align: \"right\",\n label: L(\"Language\"),\n },\n {\n id: ids.dataLanguage,\n view: \"label\",\n name: \"language\",\n value: \"\",\n css: \"formText\",\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(\n this,\n \"user_profile_language\"\n );\n },\n },\n },\n {\n id: ids.editModeLanguage,\n view: \"combo\",\n hidden: true,\n value: null,\n options: [],\n },\n {\n id: ids.buttonEditModeLanguage,\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-pencil\",\n width: 40,\n inputWidth: 40,\n on: {\n onItemClick: async () => {\n const $dataLanguage = $$(\n ids.dataLanguage\n );\n const $editModeLanguage = $$(\n ids.editModeLanguage\n );\n const $buttonEditModeLanguage = $$(\n ids.buttonEditModeLanguage\n );\n const $editModeButtonsLanguage = $$(\n ids.editModeButtonsLanguage\n );\n\n $buttonEditModeLanguage.disable();\n\n $editModeLanguage.define(\n \"options\",\n await this.getLanguages()\n );\n $editModeLanguage.refresh();\n $editModeLanguage.setValue(\n this.AB.Account.language()\n );\n\n $dataLanguage.hide();\n $buttonEditModeLanguage.hide();\n\n $editModeLanguage.show();\n $editModeButtonsLanguage.show();\n },\n },\n },\n {\n id: ids.editModeButtonsLanguage,\n hidden: true,\n cols: [\n {\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-close\",\n width: 40,\n inputWidth: 40,\n css: \"webix_danger\",\n on: {\n onItemClick: async () => {\n const $dataLanguage = $$(\n ids.dataLanguage\n );\n const $editModeLanguage = $$(\n ids.editModeLanguage\n );\n const $buttonEditModeLanguage =\n $$(\n ids.buttonEditModeLanguage\n );\n const $editModeButtonsLanguage =\n $$(\n ids.editModeButtonsLanguage\n );\n\n $editModeLanguage.hide();\n $editModeButtonsLanguage.hide();\n\n $dataLanguage.show();\n $buttonEditModeLanguage.show();\n\n try {\n $dataLanguage.setValue(\n await this.languageCodeToWord(\n this.AB.Account.language()\n )\n );\n } catch (error) {\n $dataLanguage.setValue(null);\n this.AB.notify.developer(\n error,\n {\n context:\n \"portal_work_user_profile_window: Error updating language\",\n }\n );\n } finally {\n $buttonEditModeLanguage.enable();\n }\n },\n },\n },\n {\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-check\",\n width: 40,\n inputWidth: 40,\n css: \"webix_primary\",\n on: {\n onItemClick: async () => {\n const $dataLanguage = $$(\n ids.dataLanguage\n );\n const $editModeLanguage = $$(\n ids.editModeLanguage\n );\n const $buttonEditModeLanguage =\n $$(\n ids.buttonEditModeLanguage\n );\n const $editModeButtonsLanguage =\n $$(\n ids.editModeButtonsLanguage\n );\n\n $editModeLanguage.hide();\n $editModeButtonsLanguage.hide();\n\n $dataLanguage.show();\n $buttonEditModeLanguage.show();\n\n try {\n const languageCode =\n $editModeLanguage.getValue();\n\n // await this.AB.Network.put({\n // url: `/app_builder/model/${\n // this.AB.objectUser().id\n // }/${this.AB.Account.uuid()}`,\n // data: {\n // languageCode,\n // },\n // });\n await this.AB.objectUser()\n .model()\n .update(\n this.AB.Account.uuid(),\n { languageCode }\n );\n\n this.AB.Account._config.languageCode =\n languageCode;\n } catch (error) {\n this.AB.notify.developer(\n error,\n {\n context:\n \"portal_work_user_profile_window: Error updating language Code\",\n }\n );\n } finally {\n try {\n $dataLanguage.setValue(\n await this.languageCodeToWord(\n this.AB.Account.language()\n )\n );\n } catch (error) {\n $dataLanguage.setValue(\n null\n );\n\n this.AB.notify.developer(\n error,\n {\n context:\n \"portal_work_user_profile_window: Error updating languageCodeToWord()\",\n }\n );\n }\n\n $buttonEditModeLanguage.enable();\n }\n },\n },\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n {\n rows: [\n {\n view: \"button\",\n type: \"icon\",\n icon: \"wxi-angle-down\",\n height: 40,\n css: \"webix_primary\",\n label: L(\"Advanced Options\"),\n on: {\n onItemClick: (id) => {\n const $button = $$(id);\n const $advanceOptions = $$(ids.advanceOptions);\n\n if ($advanceOptions.isVisible()) {\n $button.define(\"icon\", \"wxi-angle-down\");\n $button.refresh();\n $advanceOptions.hide();\n } else {\n $button.define(\"icon\", \"wxi-angle-up\");\n $button.refresh();\n $advanceOptions.show();\n }\n },\n },\n },\n {\n id: ids.advanceOptions,\n hidden: true,\n rows: [\n {\n view: \"form\",\n width: 460,\n borderless: true,\n elements: [\n {\n cols: [\n {\n rows: [\n {\n height: 3,\n },\n {\n view: \"label\",\n width: 160,\n // align: \"right\",\n label: L(\"New Password\"),\n },\n {},\n ],\n },\n {\n id: ids.formNewPassword,\n view: \"form\",\n borderless: true,\n width: 260,\n padding: 0,\n elements: [\n {\n id: ids.fieldNewPassword,\n view: \"text\",\n name: \"newPassword\",\n type: \"password\",\n placeholder: L(\n \"Enter a new Password (at least 8)\"\n ),\n value: \"\",\n validate: (value) => {\n return value.length >= 8;\n },\n },\n {\n view: \"text\",\n name: \"confirmPassword\",\n type: \"password\",\n placeholder:\n L(\"Confirm Password\"),\n value: \"\",\n validate: (value) => {\n const $fieldNewPassword = $$(\n ids.fieldNewPassword\n );\n\n return (\n value ===\n $fieldNewPassword.getValue()\n );\n },\n },\n {\n view: \"button\",\n type: \"form\",\n value: \"Save\",\n align: \"right\",\n height: 32,\n width: 75,\n inputWidth: 75,\n css: \"webix_primary\",\n on: {\n onItemClick: async (id) => {\n const $formNewPassword =\n $$(\n ids.formNewPassword\n );\n const $thisButton =\n $$(id);\n\n if (\n $formNewPassword.validate()\n ) {\n try {\n const $fieldNewPassword =\n $$(\n ids.fieldNewPassword\n );\n const password =\n $fieldNewPassword.getValue();\n\n $thisButton.disable();\n $formNewPassword.disable();\n\n await this.AB.Network.post(\n {\n url: \"/auth/password/reset\",\n data: {\n password,\n },\n },\n {\n key: \"portal_auth_password_reset\",\n context: {},\n }\n );\n } catch (error) {\n this.AB.notify.developer(\n error,\n {\n context:\n \"portal_work_user_profile_window:Error resetting password\",\n }\n );\n } finally {\n $formNewPassword.clear();\n $formNewPassword.enable();\n $thisButton.enable();\n }\n webix.alert(\n \"The new password is successfully updated!\"\n );\n }\n },\n },\n },\n ],\n },\n ],\n },\n {\n css: {\n \"border-top\": \"1px solid #dee2e6\",\n },\n cols: [\n {\n view: \"label\",\n width: 160,\n // align: \"right\",\n label: L(\"System Notification\"),\n },\n {\n id: ids.systemNotification,\n view: \"checkbox\",\n borderless: true,\n width: 27,\n css: {\n \"text-align\": \"center !important\",\n padding: \"0 10px\",\n },\n value: 0,\n on: {\n onItemClick: async () => {\n const $systemNotification = $$(\n ids.systemNotification\n );\n\n try {\n const sendEmailNotifications =\n $systemNotification.getValue();\n // await this.AB.Network.put({\n // url: `/app_builder/model/${\n // this.AB.objectUser().id\n // }/${this.AB.Account.uuid()}`,\n // data: {\n // sendEmailNotifications,\n // },\n // });\n\n await this.AB.objectUser()\n .model()\n .update(\n this.AB.Account.uuid(),\n {\n sendEmailNotifications,\n }\n );\n\n this.AB.Account._config.sendEmailNotifications =\n sendEmailNotifications;\n } catch (error) {\n this.AB.notify.developer(\n error,\n {\n context:\n \"portal_work_user_profile_window:Error updating email notifications\",\n }\n );\n } finally {\n $systemNotification.setValue(\n this.AB.Account.sendEmailNotifications()\n );\n }\n },\n },\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n // },\n };\n }\n\n async init(AB) {\n this.AB = AB;\n\n webix.ui(this.ui());\n }\n\n async languageCodeToWord(code) {\n if (typeof code !== \"string\")\n throw new Error('The argrument \"code\" should be a string');\n\n const languages = await this.getLanguages();\n for (let i = 0; i < languages.length; i++)\n if (languages[i].id === code) return languages[i].value;\n\n return null;\n }\n\n async getLanguages() {\n const data = [];\n\n try {\n const Language = this.AB.objectLanguage();\n const response = await Language.model().findAll();\n for (let i = 0; i < response.data.length; i++)\n data.push({\n id: response.data[i].language_code,\n value: response.data[i].language_label,\n });\n } catch (error) {\n this.AB.notify.developer(error, {\n context: \"Error getting Languages\",\n });\n }\n\n return data;\n }\n\n async populate() {\n const ids = this.ids;\n\n const $formUserInfo = $$(ids.formUserInfo);\n const $systemNotification = $$(ids.systemNotification);\n\n const populateLanguage = async () => {\n const $dataLanguage = $$(ids.dataLanguage);\n const $buttonEditModeLanguage = $$(ids.buttonEditModeLanguage);\n\n $buttonEditModeLanguage.disable();\n\n try {\n $dataLanguage.setValue(\n await this.languageCodeToWord(this.AB.Account.language())\n );\n } catch (error) {\n $dataLanguage.setValue(null);\n\n this.AB.notify.developer(error, {\n context: \"Error setting Languages\",\n });\n }\n\n $buttonEditModeLanguage.enable();\n };\n\n populateLanguage();\n $formUserInfo.setValues({\n tenant: this.AB.Tenant.id(),\n username: this.AB.Account.username(),\n email: this.AB.Account.email(),\n });\n $systemNotification.setValue(this.AB.Account.sendEmailNotifications());\n }\n\n hide() {\n const ids = this.ids;\n\n const $component = $$(ids.component);\n\n $component.hide();\n }\n\n show() {\n const ids = this.ids;\n\n const $component = $$(ids.component);\n\n $component.show();\n\n this.populate();\n }\n}\n\nexport default new PortalWorkUserProfileWindow();\n","import ClassUI from \"./ClassUI.js\";\n\nclass PortalWorkUserQRWindow extends ClassUI {\n constructor() {\n super();\n this.id = \"portal_work_user_qr_window\";\n this.idTaskMultiview = \"taskMultiview\";\n this.idTaskTitle = \"taskTitle\";\n this.idTaskPager = \"taskPager\";\n this.classQrImageDom = \"qr-code-image-dom\";\n }\n\n ui() {\n var L = (...params) => {\n return this.label(...params);\n };\n return {\n id: this.id,\n view: \"window\",\n position: function (state) {\n state.left = state.maxWidth / 2 - 600 / 2; // fixed values\n state.top = state.maxHeight / 2 - (state.maxHeight * 0.7) / 2;\n state.width = 500; // relative values\n state.height = 400;\n },\n modal: true,\n head: {\n view: \"toolbar\",\n css: \"webix_dark\",\n cols: [\n { width: 17 },\n {\n id: this.idTaskTitle,\n view: \"label\",\n label: L(\"Connect Mobile App\"),\n },\n {\n view: \"button\",\n type: \"icon\",\n css: \"webix_transparent\",\n width: 40,\n icon: \"fa fa-repeat\",\n click: () => {\n $$(\"qr-code-image\").refresh();\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, \"qr_image_reload\");\n },\n },\n },\n {\n view: \"button\",\n type: \"icon\",\n css: \"webix_transparent\",\n width: 40,\n icon: \"nomargin fa fa-times\",\n click: () => {\n $$(this.id).hide();\n },\n on: {\n onAfterRender() {\n ClassUI.CYPRESS_REF(this, \"qr_window_close\");\n },\n },\n },\n ],\n },\n body: {\n css: { \"text-align\": \"center\" },\n rows: [\n { height: 10 },\n {\n borderless: true,\n template: `${L(\n \"Use your phone's camera app to scan this QR code, and it will open a webpage to the conneXted mobile app. You only need to scan the code for the first time.\"\n )}`,\n },\n {\n id: \"qr-code-image\",\n borderless: true,\n autoheight: true,\n autowidth: true,\n template: ``,\n on: {\n onAfterRender: () => {\n const $img = $$(\n \"qr-code-image\"\n ).$view.getElementsByClassName(this.classQrImageDom)[0];\n $img.onload = () => {\n $$(\"qr-code-image\").adjust();\n };\n },\n },\n },\n\n {\n borderless: true,\n template: `
    ${L(\n \"This code can only be used once. It will expire after 7 days.\"\n )}
    `,\n },\n ],\n },\n };\n }\n\n init(AB) {\n this.AB = AB;\n webix.ui(this.ui());\n\n return Promise.resolve();\n }\n\n hide() {\n $$(this.id).hide();\n }\n\n show() {\n $$(this.id).show();\n }\n}\n\nexport default new PortalWorkUserQRWindow();\n","import ClassUI from \"./ClassUI.js\";\n\nvar myClass = null;\n// Singleton.\n// This UI gets imported several times so let's not recreate the class each time.\n\nif (!myClass) {\n myClass = class PortalWorkUserSwitcheroo extends ClassUI {\n constructor() {\n super(\"portal_work_user_switcheroo\", {\n userIcon: \"\",\n userName: \"\",\n switchBack: \"\",\n switchBackReplacer: \"\",\n list: \"\",\n });\n }\n\n ui() {\n var L = (...params) => {\n return this.label(...params);\n };\n const ids = this.ids;\n return {\n id: ids.component,\n view: \"window\",\n position: \"center\",\n hidden: true,\n close: true,\n modal: true,\n css: \"switcheroo\",\n head: L(\"Switcheroo\"),\n body: {\n padding: 10,\n rows: [\n {\n height: 30,\n cols: [\n {\n id: ids.userIcon,\n view: \"label\",\n align: \"center\",\n width: 44,\n },\n {\n id: ids.userName,\n view: \"label\",\n align: \"center\",\n },\n {\n id: ids.switchBack,\n view: \"button\",\n value: '
    ',\n align: \"center\",\n css: \"webix_transparent\",\n width: 44,\n on: {\n onItemClick: () => {\n this.switchUser();\n this.hide();\n },\n },\n },\n {\n id: ids.switchBackReplacer,\n width: 44,\n },\n ],\n },\n {\n view: \"label\",\n label: L(\"View site as:\"),\n align: \"left\",\n },\n {\n id: ids.list,\n },\n {\n cols: [\n {\n view: \"button\",\n value: L(\"Switch\"),\n css: \"webix_primary\",\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(\n this,\n \"switcheroo_switch_button\"\n );\n },\n onItemClick: () => {\n const userID = $$(ids.list).getValue();\n\n if (!userID) {\n webix.message(L(\"Please select a user.\"));\n\n return;\n }\n\n this.switchUser(userID);\n this.hide();\n },\n },\n },\n ],\n },\n ],\n },\n };\n }\n\n init(AB, headless = false) {\n this.AB = AB;\n if (!headless) {\n webix.ui(this.ui());\n this.populate();\n }\n\n return Promise.resolve();\n }\n\n hide() {\n $$(this.ids.component).hide();\n }\n\n show() {\n $$(this.ids.component).show();\n }\n\n // const clearPopupUserMenu = () => {\n // $$(\"switcheroo_list\").setValue(\"\");\n // $$(\"switcheroo\").hide();\n // $$(\"userMenu_list\").unselectAll();\n // $$(\"userMenu_list\").show();\n // };\n\n async switcherooClear() {\n return this.switchUser(null);\n }\n\n async switchUser(userID) {\n const user = (this.AB.Account.userList() || []).find(\n (e) => e.uuid === userID\n );\n\n // Save to a switched user.\n if (!user || !userID) {\n // if no user, then remove our current Switcheroo assignment\n /* let response = */ await this.AB.Network.delete({\n url: `/auth/switcheroo`,\n // data: {},\n });\n } else {\n /* let response = */ await this.AB.Network.post({\n url: `/auth/switcheroo/${user.uuid}`,\n // data: {},\n });\n }\n\n window.location.reload(true);\n }\n\n populate() {\n const ids = this.ids;\n\n const mainUserID = this.AB.Account.uuid();\n const userList = (this.AB.Account.userList() || [])\n .filter((e) => e.uuid !== mainUserID)\n .map((u) => {\n return { id: u.uuid, value: u.username };\n });\n\n let switchedUserID = null;\n if (this.AB.Account.isSwitcherood()) {\n switchedUserID = mainUserID;\n }\n webix.ui(\n {\n id: ids.list,\n view: \"combo\",\n options: {\n body: {\n template: (obj) => {\n if (obj.id === switchedUserID)\n return ` ${obj.value}`;\n return `${obj.value}`;\n },\n },\n data: userList,\n },\n on: {\n onAfterRender: function () {\n ClassUI.CYPRESS_REF(this, \"switcheroo_user_list\");\n },\n onItemClick: (id) => {\n $$(id).setValue(\"\");\n },\n },\n },\n $$(ids.list)\n );\n $$(ids.userName).setValue(this.AB.Account.username());\n\n if (this.AB.Account.isSwitcherood()) {\n $$(ids.userIcon).setValue(\n \"\"\n );\n $$(ids.switchBackReplacer)?.hide();\n $$(ids.switchBack)?.show();\n return;\n }\n\n $$(ids.userIcon).setValue(\"\");\n $$(ids.switchBack).hide();\n $$(ids.switchBackReplacer).show();\n }\n };\n}\nexport default new myClass();\n","import ClassUI from \"./ClassUI.js\";\nimport Portal from \"./portal.js\";\n\nclass UI extends ClassUI {\n constructor() {\n super();\n\n this.hiddenElements = [];\n }\n\n ui() {\n return {\n id: \"labelClickToEnter\",\n view: \"label\",\n label: \"Hello\",\n on: {\n onItemClick: (/* id, e */) => {\n this.portalShow();\n },\n },\n };\n }\n\n init(AB) {\n this.AB = AB;\n var entryLabel = this.AB.Tenant.textClickToEnter;\n if (entryLabel) {\n $$(\"labelClickToEnter\").define({\n label: entryLabel,\n });\n }\n\n // by not sending an id param, this creates it's own div.\n this.popup = Portal.attach();\n\n // AB.on(\"error\", (error) => {\n // console.error(\"ui.on(error): \", error);\n // });\n\n return Portal.init(AB).then(() => {\n if (this.AB.Config.setting(\"autoenter\")) {\n this.portalShow();\n } else {\n this.portalHide();\n }\n });\n }\n\n portalHide() {\n // show our link to enter\n this.popup.hide();\n }\n\n portalShow() {\n // show our portal\n this.popup.show();\n }\n}\n\nexport default new UI();\n","/**\n * Performance - utility to track performance of the web platform\n * Written initally for sentry, but could be extended to support others\n * tracking tools.\n * Also supports the User timing API for lighthouse / local dev\n */\n\nimport * as Sentry from \"@sentry/browser\";\n/* These come from the DefinePlugin in webpack */\nlet webpackMode = \"development\";\nlet version, dsn;\ntry {\n /* global WEBPACK_MODE SENTRY_DSN VERSION */\n webpackMode = WEBPACK_MODE;\n dsn = SENTRY_DSN;\n version = VERSION;\n} catch (err) {\n console.warn(\n \"Error reading from webpack, check the DefinePlugin is working correctly\",\n err\n );\n}\n\nconst mode = dsn\n ? \"sentry\"\n : webpackMode === \"development\"\n ? \"browser\"\n : undefined;\n\n// Following are performance tracking sources, will be accessed through the\n// PerfomanceInterface\n\n/*\n * Default - performance tracking disabled\n */\nclass Performance {\n init() {}\n error() {}\n mark() {}\n measure() {}\n notify(domain, error, info) {\n console.groupCollapsed(`Notify ${domain}: ${error?.message ?? \"\"}`);\n console.error(error);\n console.log(\"info\", info);\n console.groupEnd();\n }\n setContext() {}\n}\n\n/*\n * Sentry perfomance tracking\n */\nclass SentryPerformance extends Performance {\n constructor() {\n super();\n this.childSpans = {};\n }\n\n init() {\n Sentry.init({\n dsn,\n environment: webpackMode,\n release: version,\n integrations: [new Sentry.BrowserTracing()],\n normalizeDepth: 5,\n sampleRate: 0.05,\n tracesSampleRate: 0.05,\n });\n }\n\n error(err) {\n Sentry.captureException(err);\n }\n\n mark(key, context = {}) {\n context.name = key;\n if (!this.mainSpan) {\n this.mainSpanKey = key;\n this.mainSpan = Sentry.startTransaction(context);\n } else {\n this.childSpans[key] = this.mainSpan.startChild(context);\n }\n }\n\n measure(key) {\n if (this.mainSpanKey === key) {\n this.mainSpan.finish();\n delete this.mainSpan;\n delete this.mainSpanKey;\n this.childSpans = {};\n } else {\n this.childSpans[key]?.finish?.();\n delete this.childSpans[key];\n }\n }\n\n notify(domain, error, info) {\n const scope = new Sentry.Scope();\n // Mark builder alerts as lower level in sentry\n if (domain == \"builder\") scope.setLevel(\"warning\");\n scope.setTag(\"domain\", domain);\n scope.setContext(\"info\", info);\n Sentry.captureException(error, scope);\n // Also log to console:\n super.notify(domain, error, info);\n }\n\n setContext(key, data) {\n switch (key) {\n case \"tags\":\n Sentry.setTags(data);\n break;\n case \"user\":\n Sentry.setUser(data);\n break;\n case \"breadcrumb\":\n Sentry.addBreadcrumb(data);\n break;\n default:\n Sentry.setContext(key, data);\n break;\n }\n }\n}\n\n/*\n * Browser Performance tracking - uses the User Timing API\n */\nclass BrowserPerformnace extends Performance {\n error(err) {\n console.error(err);\n }\n\n mark(key, context) {\n if (!this.mainSpanKey) {\n this.mainSpanKey = key;\n }\n window.performance.mark(key, { detail: context });\n }\n\n measure(key) {\n try {\n const mark = window.performance.getEntriesByName(key, \"mark\")[0];\n const measure = window.performance.measure(key, {\n start: key,\n detail: mark?.detail,\n });\n if (this.mainSpanKey === key) {\n console.groupCollapsed(\n `${measure.name} finished in ${measure.duration} ms`\n );\n const entries = window.performance.getEntriesByType(\"measure\");\n if (entries.length > 1)\n console.table(entries, [\"name\", \"duration\", \"startTime\"]);\n else console.log(measure);\n console.groupEnd();\n delete this.mainSpanKey;\n window.performance.clearMarks();\n window.performance.clearMeasures();\n }\n } catch (e) {\n // console.warn(e);\n }\n }\n}\n\n/**\n * hash of performance tracking sources\n */\nconst sources = {\n sentry: SentryPerformance,\n browser: BrowserPerformnace,\n};\n\n/**\n * Performance Interface that the rest of the app uses. Routes the calls to the\n * configured performance tracking source\n */\nclass PerformanceInterface {\n constructor(mode) {\n this.mode = mode;\n this.initialized = false;\n this._source = new (sources[mode] ?? Performance)();\n }\n\n /**\n * initialize performance, should be called early in init\n */\n init() {\n if (this.initialized) return;\n this._source.init();\n // console.log(\"Performance.init() complete\", mode);\n this.initialized = true;\n }\n\n /**\n * Capture an error\n * @param {Error} error\n */\n error(err) {\n this._source.error(err);\n }\n\n /**\n * Start a performance tracking span. End by calling measure() with the same key.\n * The first mark will be consider a parent, and subsequent marks become\n * children until the initial mark is measured.\n * @param {string} key unique key to track\n * @param {object} [context] any additional context\n */\n mark(key, context) {\n this._source.mark(key, context);\n }\n\n /**\n * End a performance tracking span\n * @param {string} key should match an existing mark\n */\n measure(key) {\n this._source.measure(key);\n }\n\n /**\n * Implements AB.notify which will log differently depending on our tracking\n * option\n * @param {string} domain which group of people we are sending a notification to.\n * @param {Error} error An error object generated at the point of issue.\n * @param {json} info Additional related information concerning the issue.\n */\n notify(domain, error, info) {\n this._source.notify(domain, error, info);\n }\n\n /**\n * Set additional context to tracing/error events\n * @param {string} key type of context (tag, user, etc)\n * @pram {object} data\n */\n setContext(key, data) {\n this._source.setContext(key, data);\n }\n}\n\n// singleton\nlet performanceInterface;\n\n/**\n * Get/create the shared performance instance\n * @returns {PerformanceInterface}\n */\nfunction getPerformance() {\n if (!performanceInterface)\n performanceInterface = new PerformanceInterface(mode);\n return performanceInterface;\n}\n\nexport default getPerformance();\n","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js?url=false!./gantt.min.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js?url=false!./hint.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js?url=false!./query.min.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js?url=false!./querybuilder.min.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js?url=false!./reports.min.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js?url=false!./scheduler.min.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../node_modules/css-loader/dist/cjs.js?url=false!./webix.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../node_modules/css-loader/dist/cjs.js?url=false!./font-awesome.min.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../node_modules/css-loader/dist/cjs.js?url=false!./loader.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../node_modules/css-loader/dist/cjs.js?url=false!./ui.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","__webpack_require__.O(0, [\"app\"], () => {\n\t__webpack_require__.E(\"vendor-node_modules_atomicjs_dist_atomic_min_js-node_modules_atomicjs_dist_atomic_polyfills_m-6fe1ea\");\n\t__webpack_require__.E(\"AB\");\n}, 5);"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/assets/index.html b/assets/index.html index e39895c2..06a28d5b 100644 --- a/assets/index.html +++ b/assets/index.html @@ -93,6 +93,6 @@
    - + diff --git a/assets/runtime.f6c897177cc61c448b6a.js b/assets/runtime.6165dd87a822fe3fb1b3.js similarity index 99% rename from assets/runtime.f6c897177cc61c448b6a.js rename to assets/runtime.6165dd87a822fe3fb1b3.js index 15cca9f4..67f7e427 100644 --- a/assets/runtime.f6c897177cc61c448b6a.js +++ b/assets/runtime.6165dd87a822fe3fb1b3.js @@ -235,7 +235,7 @@ /******/ if (chunkId === "formio-init_formio_js") return "formio." + chunkId + ".c9097ab435d56220383f.js"; /******/ if (chunkId === "tinymce-js_webix_extras_tinymce_js") return "tinymce." + chunkId + ".575c9f30cafe3393cc54.js"; /******/ // return url for filenames based on template -/******/ return "" + chunkId + "." + {"webix":"675d0c1171904528d1b5","webix.resources":"dcfe334dbc54b881566b","AB":"3bf5db93c75d99b70a26","pdfjs-vendors-node_modules_pdfjs-dist_webpack_mjs":"b580ab2c22cd4b92f70f","tinymce-vendors-node_modules_tinymce_icons_default_index_js-node_modules_tinymce_plugins_link-1e1308":"9c2cfb1e795e17ea54e8","utils_networkTest_js":"a9e5c1d2262005f93788"}[chunkId] + ".js"; +/******/ return "" + chunkId + "." + {"webix":"675d0c1171904528d1b5","webix.resources":"dcfe334dbc54b881566b","AB":"b42df031aa8d5bacdbad","pdfjs-vendors-node_modules_pdfjs-dist_webpack_mjs":"b580ab2c22cd4b92f70f","tinymce-vendors-node_modules_tinymce_icons_default_index_js-node_modules_tinymce_plugins_link-1e1308":"9c2cfb1e795e17ea54e8","utils_networkTest_js":"a9e5c1d2262005f93788"}[chunkId] + ".js"; /******/ }; /******/ })(); /******/ @@ -473,4 +473,4 @@ /******/ /******/ })() ; -//# sourceMappingURL=runtime.f6c897177cc61c448b6a.js.map \ No newline at end of file +//# sourceMappingURL=runtime.6165dd87a822fe3fb1b3.js.map \ No newline at end of file diff --git a/assets/runtime.f6c897177cc61c448b6a.js.map b/assets/runtime.6165dd87a822fe3fb1b3.js.map similarity index 99% rename from assets/runtime.f6c897177cc61c448b6a.js.map rename to assets/runtime.6165dd87a822fe3fb1b3.js.map index d23704d7..ab800a31 100644 --- a/assets/runtime.f6c897177cc61c448b6a.js.map +++ b/assets/runtime.6165dd87a822fe3fb1b3.js.map @@ -1 +1 @@ -{"version":3,"file":"runtime.f6c897177cc61c448b6a.js","mappings":";;;;UAAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WC5BA;WACA;WACA;;;;;WCFA;;;;;WCAA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,IAAI;WACJ;WACA;WACA,IAAI;WACJ;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA,sGAAsG;WACtG;WACA;WACA;WACA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA,EAAE;WACF;WACA;;;;;WChEA;WACA;WACA;WACA;WACA,+BAA+B,wCAAwC;WACvE;WACA;WACA;WACA;WACA,iBAAiB,qBAAqB;WACtC;WACA;WACA,kBAAkB,qBAAqB;WACvC;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;WC3BA;WACA;WACA;WACA;WACA,EAAE;WACF;;;;;WCLA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,sDAAsD;WACtD,sCAAsC,iEAAiE;WACvG;WACA;WACA;WACA;WACA;WACA;;;;;WCzBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;;;;;WCRA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,8BAA8B,2VAA2V;WACzX;;;;;WCXA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;;;;;WCVA;;;;;WCAA;WACA;WACA;WACA;WACA,uBAAuB,4BAA4B;WACnD;WACA;WACA;WACA,iBAAiB,oBAAoB;WACrC;WACA,mGAAmG,YAAY;WAC/G;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,mEAAmE,iCAAiC;WACpG;WACA;WACA;WACA;;;;;WCzCA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;WACA;WACA;WACA;WACA;;;;;WCJA;;;;;WCAA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA,iCAAiC;;WAEjC;WACA;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM;WACN;WACA;WACA;;WAEA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;;;;;WClGA;;;;;WCAA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC","sources":["webpack://ab_platform_web/webpack/bootstrap","webpack://ab_platform_web/webpack/runtime/amd define","webpack://ab_platform_web/webpack/runtime/amd options","webpack://ab_platform_web/webpack/runtime/async module","webpack://ab_platform_web/webpack/runtime/chunk loaded","webpack://ab_platform_web/webpack/runtime/chunk prefetch function","webpack://ab_platform_web/webpack/runtime/compat get default export","webpack://ab_platform_web/webpack/runtime/create fake namespace object","webpack://ab_platform_web/webpack/runtime/define property getters","webpack://ab_platform_web/webpack/runtime/ensure chunk","webpack://ab_platform_web/webpack/runtime/get javascript chunk filename","webpack://ab_platform_web/webpack/runtime/global","webpack://ab_platform_web/webpack/runtime/harmony module decorator","webpack://ab_platform_web/webpack/runtime/hasOwnProperty shorthand","webpack://ab_platform_web/webpack/runtime/load script","webpack://ab_platform_web/webpack/runtime/make namespace object","webpack://ab_platform_web/webpack/runtime/node module decorator","webpack://ab_platform_web/webpack/runtime/publicPath","webpack://ab_platform_web/webpack/runtime/jsonp chunk loading","webpack://ab_platform_web/webpack/runtime/nonce","webpack://ab_platform_web/webpack/runtime/chunk prefetch trigger","webpack://ab_platform_web/webpack/before-startup","webpack://ab_platform_web/webpack/startup","webpack://ab_platform_web/webpack/after-startup"],"sourcesContent":["// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","var webpackQueues = typeof Symbol === \"function\" ? Symbol(\"webpack queues\") : \"__webpack_queues__\";\nvar webpackExports = typeof Symbol === \"function\" ? Symbol(\"webpack exports\") : \"__webpack_exports__\";\nvar webpackError = typeof Symbol === \"function\" ? Symbol(\"webpack error\") : \"__webpack_error__\";\nvar resolveQueue = (queue) => {\n\tif(queue && queue.d < 1) {\n\t\tqueue.d = 1;\n\t\tqueue.forEach((fn) => (fn.r--));\n\t\tqueue.forEach((fn) => (fn.r-- ? fn.r++ : fn()));\n\t}\n}\nvar wrapDeps = (deps) => (deps.map((dep) => {\n\tif(dep !== null && typeof dep === \"object\") {\n\t\tif(dep[webpackQueues]) return dep;\n\t\tif(dep.then) {\n\t\t\tvar queue = [];\n\t\t\tqueue.d = 0;\n\t\t\tdep.then((r) => {\n\t\t\t\tobj[webpackExports] = r;\n\t\t\t\tresolveQueue(queue);\n\t\t\t}, (e) => {\n\t\t\t\tobj[webpackError] = e;\n\t\t\t\tresolveQueue(queue);\n\t\t\t});\n\t\t\tvar obj = {};\n\t\t\tobj[webpackQueues] = (fn) => (fn(queue));\n\t\t\treturn obj;\n\t\t}\n\t}\n\tvar ret = {};\n\tret[webpackQueues] = x => {};\n\tret[webpackExports] = dep;\n\treturn ret;\n}));\n__webpack_require__.a = (module, body, hasAwait) => {\n\tvar queue;\n\thasAwait && ((queue = []).d = -1);\n\tvar depQueues = new Set();\n\tvar exports = module.exports;\n\tvar currentDeps;\n\tvar outerResolve;\n\tvar reject;\n\tvar promise = new Promise((resolve, rej) => {\n\t\treject = rej;\n\t\touterResolve = resolve;\n\t});\n\tpromise[webpackExports] = exports;\n\tpromise[webpackQueues] = (fn) => (queue && fn(queue), depQueues.forEach(fn), promise[\"catch\"](x => {}));\n\tmodule.exports = promise;\n\tbody((deps) => {\n\t\tcurrentDeps = wrapDeps(deps);\n\t\tvar fn;\n\t\tvar getResult = () => (currentDeps.map((d) => {\n\t\t\tif(d[webpackError]) throw d[webpackError];\n\t\t\treturn d[webpackExports];\n\t\t}))\n\t\tvar promise = new Promise((resolve) => {\n\t\t\tfn = () => (resolve(getResult));\n\t\t\tfn.r = 0;\n\t\t\tvar fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn))));\n\t\t\tcurrentDeps.map((dep) => (dep[webpackQueues](fnQueue)));\n\t\t});\n\t\treturn fn.r ? promise : getResult();\n\t}, (err) => ((err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue)));\n\tqueue && queue.d < 0 && (queue.d = 0);\n};","var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","__webpack_require__.F = {};\n__webpack_require__.E = (chunkId) => {\n\tObject.keys(__webpack_require__.F).map((key) => {\n\t\t__webpack_require__.F[key](chunkId);\n\t});\n}","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === \"vendor-node_modules_atomicjs_dist_atomic_min_js-node_modules_atomicjs_dist_atomic_polyfills_m-6fe1ea\") return \"vendor.\" + chunkId + \".a33ad26885337bc45616.js\";\n\tif (chunkId === \"vendor-vendors-node_modules_formio_bootstrap3_lib_index_js-node_modules_formio_choices_js_pub-32abf8\") return \"vendor.\" + chunkId + \".bda22bd1454b615c1ce7.js\";\n\tif (chunkId === \"pdfjs-init_pdfjs_js\") return \"pdfjs.\" + chunkId + \".1258629bc5869ee9cedc.mjs\";\n\tif (chunkId === \"pdfjs-vendors-node_modules_pdfjs-dist_build_pdf_worker_mjs\") return \"pdfjs.\" + chunkId + \".ca1345891b732f61bfda.mjs\";\n\tif (chunkId === \"formio-init_formio_js\") return \"formio.\" + chunkId + \".c9097ab435d56220383f.js\";\n\tif (chunkId === \"tinymce-js_webix_extras_tinymce_js\") return \"tinymce.\" + chunkId + \".575c9f30cafe3393cc54.js\";\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"webix\":\"675d0c1171904528d1b5\",\"webix.resources\":\"dcfe334dbc54b881566b\",\"AB\":\"3bf5db93c75d99b70a26\",\"pdfjs-vendors-node_modules_pdfjs-dist_webpack_mjs\":\"b580ab2c22cd4b92f70f\",\"tinymce-vendors-node_modules_tinymce_icons_default_index_js-node_modules_tinymce_plugins_link-1e1308\":\"9c2cfb1e795e17ea54e8\",\"utils_networkTest_js\":\"a9e5c1d2262005f93788\"}[chunkId] + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"ab_platform_web:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/assets/\";","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"runtime\": 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(\"runtime\" != chunkId) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n__webpack_require__.F.j = (chunkId) => {\n\tif((!__webpack_require__.o(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && \"runtime\" != chunkId) {\n\t\tinstalledChunks[chunkId] = null;\n\t\tvar link = document.createElement('link');\n\n\t\tif (__webpack_require__.nc) {\n\t\t\tlink.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tlink.rel = \"prefetch\";\n\t\tlink.as = \"script\";\n\t\tlink.href = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\tdocument.head.appendChild(link);\n\t}\n};\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkab_platform_web\"] = self[\"webpackChunkab_platform_web\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","var chunkToChildrenMap = {\n\t\"AB\": [\n\t\t\"formio-init_formio_js\",\n\t\t\"vendor-vendors-node_modules_formio_bootstrap3_lib_index_js-node_modules_formio_choices_js_pub-32abf8\",\n\t\t\"tinymce-vendors-node_modules_tinymce_icons_default_index_js-node_modules_tinymce_plugins_link-1e1308\",\n\t\t\"tinymce-js_webix_extras_tinymce_js\",\n\t\t\"pdfjs-vendors-node_modules_pdfjs-dist_webpack_mjs\",\n\t\t\"pdfjs-init_pdfjs_js\"\n\t]\n};\n__webpack_require__.f.prefetch = (chunkId, promises) => (Promise.all(promises).then(() => {\n\tvar chunks = chunkToChildrenMap[chunkId];\n\tArray.isArray(chunks) && chunks.map(__webpack_require__.E);\n}));","","",""],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"runtime.6165dd87a822fe3fb1b3.js","mappings":";;;;UAAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WC5BA;WACA;WACA;;;;;WCFA;;;;;WCAA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,IAAI;WACJ;WACA;WACA,IAAI;WACJ;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA,sGAAsG;WACtG;WACA;WACA;WACA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA,EAAE;WACF;WACA;;;;;WChEA;WACA;WACA;WACA;WACA,+BAA+B,wCAAwC;WACvE;WACA;WACA;WACA;WACA,iBAAiB,qBAAqB;WACtC;WACA;WACA,kBAAkB,qBAAqB;WACvC;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;WC3BA;WACA;WACA;WACA;WACA,EAAE;WACF;;;;;WCLA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,sDAAsD;WACtD,sCAAsC,iEAAiE;WACvG;WACA;WACA;WACA;WACA;WACA;;;;;WCzBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;;;;;WCRA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,8BAA8B,2VAA2V;WACzX;;;;;WCXA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;;;;;WCVA;;;;;WCAA;WACA;WACA;WACA;WACA,uBAAuB,4BAA4B;WACnD;WACA;WACA;WACA,iBAAiB,oBAAoB;WACrC;WACA,mGAAmG,YAAY;WAC/G;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,mEAAmE,iCAAiC;WACpG;WACA;WACA;WACA;;;;;WCzCA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;WACA;WACA;WACA;WACA;;;;;WCJA;;;;;WCAA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA,iCAAiC;;WAEjC;WACA;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM;WACN;WACA;WACA;;WAEA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;;;;;WClGA;;;;;WCAA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC","sources":["webpack://ab_platform_web/webpack/bootstrap","webpack://ab_platform_web/webpack/runtime/amd define","webpack://ab_platform_web/webpack/runtime/amd options","webpack://ab_platform_web/webpack/runtime/async module","webpack://ab_platform_web/webpack/runtime/chunk loaded","webpack://ab_platform_web/webpack/runtime/chunk prefetch function","webpack://ab_platform_web/webpack/runtime/compat get default export","webpack://ab_platform_web/webpack/runtime/create fake namespace object","webpack://ab_platform_web/webpack/runtime/define property getters","webpack://ab_platform_web/webpack/runtime/ensure chunk","webpack://ab_platform_web/webpack/runtime/get javascript chunk filename","webpack://ab_platform_web/webpack/runtime/global","webpack://ab_platform_web/webpack/runtime/harmony module decorator","webpack://ab_platform_web/webpack/runtime/hasOwnProperty shorthand","webpack://ab_platform_web/webpack/runtime/load script","webpack://ab_platform_web/webpack/runtime/make namespace object","webpack://ab_platform_web/webpack/runtime/node module decorator","webpack://ab_platform_web/webpack/runtime/publicPath","webpack://ab_platform_web/webpack/runtime/jsonp chunk loading","webpack://ab_platform_web/webpack/runtime/nonce","webpack://ab_platform_web/webpack/runtime/chunk prefetch trigger","webpack://ab_platform_web/webpack/before-startup","webpack://ab_platform_web/webpack/startup","webpack://ab_platform_web/webpack/after-startup"],"sourcesContent":["// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","var webpackQueues = typeof Symbol === \"function\" ? Symbol(\"webpack queues\") : \"__webpack_queues__\";\nvar webpackExports = typeof Symbol === \"function\" ? Symbol(\"webpack exports\") : \"__webpack_exports__\";\nvar webpackError = typeof Symbol === \"function\" ? Symbol(\"webpack error\") : \"__webpack_error__\";\nvar resolveQueue = (queue) => {\n\tif(queue && queue.d < 1) {\n\t\tqueue.d = 1;\n\t\tqueue.forEach((fn) => (fn.r--));\n\t\tqueue.forEach((fn) => (fn.r-- ? fn.r++ : fn()));\n\t}\n}\nvar wrapDeps = (deps) => (deps.map((dep) => {\n\tif(dep !== null && typeof dep === \"object\") {\n\t\tif(dep[webpackQueues]) return dep;\n\t\tif(dep.then) {\n\t\t\tvar queue = [];\n\t\t\tqueue.d = 0;\n\t\t\tdep.then((r) => {\n\t\t\t\tobj[webpackExports] = r;\n\t\t\t\tresolveQueue(queue);\n\t\t\t}, (e) => {\n\t\t\t\tobj[webpackError] = e;\n\t\t\t\tresolveQueue(queue);\n\t\t\t});\n\t\t\tvar obj = {};\n\t\t\tobj[webpackQueues] = (fn) => (fn(queue));\n\t\t\treturn obj;\n\t\t}\n\t}\n\tvar ret = {};\n\tret[webpackQueues] = x => {};\n\tret[webpackExports] = dep;\n\treturn ret;\n}));\n__webpack_require__.a = (module, body, hasAwait) => {\n\tvar queue;\n\thasAwait && ((queue = []).d = -1);\n\tvar depQueues = new Set();\n\tvar exports = module.exports;\n\tvar currentDeps;\n\tvar outerResolve;\n\tvar reject;\n\tvar promise = new Promise((resolve, rej) => {\n\t\treject = rej;\n\t\touterResolve = resolve;\n\t});\n\tpromise[webpackExports] = exports;\n\tpromise[webpackQueues] = (fn) => (queue && fn(queue), depQueues.forEach(fn), promise[\"catch\"](x => {}));\n\tmodule.exports = promise;\n\tbody((deps) => {\n\t\tcurrentDeps = wrapDeps(deps);\n\t\tvar fn;\n\t\tvar getResult = () => (currentDeps.map((d) => {\n\t\t\tif(d[webpackError]) throw d[webpackError];\n\t\t\treturn d[webpackExports];\n\t\t}))\n\t\tvar promise = new Promise((resolve) => {\n\t\t\tfn = () => (resolve(getResult));\n\t\t\tfn.r = 0;\n\t\t\tvar fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn))));\n\t\t\tcurrentDeps.map((dep) => (dep[webpackQueues](fnQueue)));\n\t\t});\n\t\treturn fn.r ? promise : getResult();\n\t}, (err) => ((err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue)));\n\tqueue && queue.d < 0 && (queue.d = 0);\n};","var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","__webpack_require__.F = {};\n__webpack_require__.E = (chunkId) => {\n\tObject.keys(__webpack_require__.F).map((key) => {\n\t\t__webpack_require__.F[key](chunkId);\n\t});\n}","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === \"vendor-node_modules_atomicjs_dist_atomic_min_js-node_modules_atomicjs_dist_atomic_polyfills_m-6fe1ea\") return \"vendor.\" + chunkId + \".a33ad26885337bc45616.js\";\n\tif (chunkId === \"vendor-vendors-node_modules_formio_bootstrap3_lib_index_js-node_modules_formio_choices_js_pub-32abf8\") return \"vendor.\" + chunkId + \".bda22bd1454b615c1ce7.js\";\n\tif (chunkId === \"pdfjs-init_pdfjs_js\") return \"pdfjs.\" + chunkId + \".1258629bc5869ee9cedc.mjs\";\n\tif (chunkId === \"pdfjs-vendors-node_modules_pdfjs-dist_build_pdf_worker_mjs\") return \"pdfjs.\" + chunkId + \".ca1345891b732f61bfda.mjs\";\n\tif (chunkId === \"formio-init_formio_js\") return \"formio.\" + chunkId + \".c9097ab435d56220383f.js\";\n\tif (chunkId === \"tinymce-js_webix_extras_tinymce_js\") return \"tinymce.\" + chunkId + \".575c9f30cafe3393cc54.js\";\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"webix\":\"675d0c1171904528d1b5\",\"webix.resources\":\"dcfe334dbc54b881566b\",\"AB\":\"b42df031aa8d5bacdbad\",\"pdfjs-vendors-node_modules_pdfjs-dist_webpack_mjs\":\"b580ab2c22cd4b92f70f\",\"tinymce-vendors-node_modules_tinymce_icons_default_index_js-node_modules_tinymce_plugins_link-1e1308\":\"9c2cfb1e795e17ea54e8\",\"utils_networkTest_js\":\"a9e5c1d2262005f93788\"}[chunkId] + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"ab_platform_web:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/assets/\";","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"runtime\": 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(\"runtime\" != chunkId) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n__webpack_require__.F.j = (chunkId) => {\n\tif((!__webpack_require__.o(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && \"runtime\" != chunkId) {\n\t\tinstalledChunks[chunkId] = null;\n\t\tvar link = document.createElement('link');\n\n\t\tif (__webpack_require__.nc) {\n\t\t\tlink.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tlink.rel = \"prefetch\";\n\t\tlink.as = \"script\";\n\t\tlink.href = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\tdocument.head.appendChild(link);\n\t}\n};\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkab_platform_web\"] = self[\"webpackChunkab_platform_web\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","var chunkToChildrenMap = {\n\t\"AB\": [\n\t\t\"formio-init_formio_js\",\n\t\t\"vendor-vendors-node_modules_formio_bootstrap3_lib_index_js-node_modules_formio_choices_js_pub-32abf8\",\n\t\t\"tinymce-vendors-node_modules_tinymce_icons_default_index_js-node_modules_tinymce_plugins_link-1e1308\",\n\t\t\"tinymce-js_webix_extras_tinymce_js\",\n\t\t\"pdfjs-vendors-node_modules_pdfjs-dist_webpack_mjs\",\n\t\t\"pdfjs-init_pdfjs_js\"\n\t]\n};\n__webpack_require__.f.prefetch = (chunkId, promises) => (Promise.all(promises).then(() => {\n\tvar chunks = chunkToChildrenMap[chunkId];\n\tArray.isArray(chunks) && chunks.map(__webpack_require__.E);\n}));","","",""],"names":[],"sourceRoot":""} \ No newline at end of file